1 package org
.asamk
.signal
.manager
.helper
;
3 import org
.asamk
.signal
.manager
.api
.IncorrectPinException
;
4 import org
.slf4j
.Logger
;
5 import org
.slf4j
.LoggerFactory
;
6 import org
.whispersystems
.signalservice
.api
.kbs
.MasterKey
;
7 import org
.whispersystems
.signalservice
.api
.svr
.SecureValueRecovery
;
8 import org
.whispersystems
.signalservice
.api
.svr
.SecureValueRecoveryV2
;
9 import org
.whispersystems
.signalservice
.internal
.push
.AuthCredentials
;
10 import org
.whispersystems
.signalservice
.internal
.push
.LockedException
;
12 import java
.io
.IOException
;
14 public class PinHelper
{
16 private final static Logger logger
= LoggerFactory
.getLogger(PinHelper
.class);
18 private final SecureValueRecoveryV2 secureValueRecoveryV2
;
20 public PinHelper(final SecureValueRecoveryV2 secureValueRecoveryV2
) {
21 this.secureValueRecoveryV2
= secureValueRecoveryV2
;
24 public void setRegistrationLockPin(
25 String pin
, MasterKey masterKey
26 ) throws IOException
{
27 final var backupResponse
= secureValueRecoveryV2
.setPin(pin
, masterKey
).execute();
28 if (backupResponse
instanceof SecureValueRecovery
.BackupResponse
.Success
) {
29 } else if (backupResponse
instanceof SecureValueRecovery
.BackupResponse
.ServerRejected
) {
30 logger
.warn("Backup svr2 failed: ServerRejected");
31 } else if (backupResponse
instanceof SecureValueRecovery
.BackupResponse
.EnclaveNotFound
) {
32 logger
.warn("Backup svr2 failed: EnclaveNotFound");
33 } else if (backupResponse
instanceof SecureValueRecovery
.BackupResponse
.ExposeFailure
) {
34 logger
.warn("Backup svr2 failed: ExposeFailure");
35 } else if (backupResponse
instanceof SecureValueRecovery
.BackupResponse
.ApplicationError error
) {
36 throw new IOException(error
.getException());
37 } else if (backupResponse
instanceof SecureValueRecovery
.BackupResponse
.NetworkError error
) {
38 throw error
.getException();
40 throw new AssertionError("Unexpected response");
44 public void migrateRegistrationLockPin(String pin
, MasterKey masterKey
) throws IOException
{
45 setRegistrationLockPin(pin
, masterKey
);
48 public void removeRegistrationLockPin() throws IOException
{
49 final var deleteResponse
= secureValueRecoveryV2
.deleteData();
50 if (deleteResponse
instanceof SecureValueRecovery
.DeleteResponse
.Success
) {
51 } else if (deleteResponse
instanceof SecureValueRecovery
.DeleteResponse
.ServerRejected
) {
52 logger
.warn("Delete svr2 failed: ServerRejected");
53 } else if (deleteResponse
instanceof SecureValueRecovery
.DeleteResponse
.EnclaveNotFound
) {
54 logger
.warn("Delete svr2 failed: EnclaveNotFound");
55 } else if (deleteResponse
instanceof SecureValueRecovery
.DeleteResponse
.ApplicationError error
) {
56 throw new IOException(error
.getException());
57 } else if (deleteResponse
instanceof SecureValueRecovery
.DeleteResponse
.NetworkError error
) {
58 throw error
.getException();
60 throw new AssertionError("Unexpected response");
64 public SecureValueRecovery
.RestoreResponse
.Success
getRegistrationLockData(
65 String pin
, LockedException e
66 ) throws IOException
, IncorrectPinException
{
67 var svr2Credentials
= e
.getSvr2Credentials();
68 if (svr2Credentials
!= null) {
69 return getRegistrationLockData(secureValueRecoveryV2
, svr2Credentials
, pin
);
75 public SecureValueRecovery
.RestoreResponse
.Success
getRegistrationLockData(
76 SecureValueRecovery secureValueRecovery
, AuthCredentials authCredentials
, String pin
77 ) throws IOException
, IncorrectPinException
{
78 final var restoreResponse
= secureValueRecovery
.restoreDataPreRegistration(authCredentials
, pin
);
80 if (restoreResponse
instanceof SecureValueRecovery
.RestoreResponse
.Success s
) {
82 } else if (restoreResponse
instanceof SecureValueRecovery
.RestoreResponse
.PinMismatch pinMismatch
) {
83 throw new IncorrectPinException(pinMismatch
.getTriesRemaining());
84 } else if (restoreResponse
instanceof SecureValueRecovery
.RestoreResponse
.ApplicationError error
) {
85 throw new IOException(error
.getException());
86 } else if (restoreResponse
instanceof SecureValueRecovery
.RestoreResponse
.NetworkError error
) {
87 throw error
.getException();
88 } else if (restoreResponse
instanceof SecureValueRecovery
.RestoreResponse
.Missing
) {
89 logger
.debug("No SVR data stored for the given credentials.");
92 throw new AssertionError("Unexpected response: " + restoreResponse
.getClass().getSimpleName());