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 static final 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 switch (backupResponse
) {
29 case SecureValueRecovery
.BackupResponse
.Success success
-> {
31 case SecureValueRecovery
.BackupResponse
.ServerRejected serverRejected
->
32 logger
.warn("Backup svr2 failed: ServerRejected");
33 case SecureValueRecovery
.BackupResponse
.EnclaveNotFound enclaveNotFound
->
34 logger
.warn("Backup svr2 failed: EnclaveNotFound");
35 case SecureValueRecovery
.BackupResponse
.ExposeFailure exposeFailure
->
36 logger
.warn("Backup svr2 failed: ExposeFailure");
37 case SecureValueRecovery
.BackupResponse
.ApplicationError error
->
38 throw new IOException(error
.getException());
39 case SecureValueRecovery
.BackupResponse
.NetworkError error
-> throw error
.getException();
40 case null, default -> 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 switch (deleteResponse
) {
51 case SecureValueRecovery
.DeleteResponse
.Success success
-> {
53 case SecureValueRecovery
.DeleteResponse
.ServerRejected serverRejected
->
54 logger
.warn("Delete svr2 failed: ServerRejected");
55 case SecureValueRecovery
.DeleteResponse
.EnclaveNotFound enclaveNotFound
->
56 logger
.warn("Delete svr2 failed: EnclaveNotFound");
57 case SecureValueRecovery
.DeleteResponse
.ApplicationError error
->
58 throw new IOException(error
.getException());
59 case SecureValueRecovery
.DeleteResponse
.NetworkError error
-> throw error
.getException();
60 case null, default -> 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 switch (restoreResponse
) {
81 case SecureValueRecovery
.RestoreResponse
.Success s
-> {
84 case SecureValueRecovery
.RestoreResponse
.PinMismatch pinMismatch
->
85 throw new IncorrectPinException(pinMismatch
.getTriesRemaining());
86 case SecureValueRecovery
.RestoreResponse
.ApplicationError error
->
87 throw new IOException(error
.getException());
88 case SecureValueRecovery
.RestoreResponse
.NetworkError error
-> throw error
.getException();
89 case SecureValueRecovery
.RestoreResponse
.Missing missing
-> {
90 logger
.debug("No SVR data stored for the given credentials.");
94 throw new AssertionError("Unexpected response: " + restoreResponse
.getClass().getSimpleName());