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
.internal
.push
.AuthCredentials
;
9 import org
.whispersystems
.signalservice
.internal
.push
.LockedException
;
11 import java
.io
.IOException
;
12 import java
.util
.List
;
14 public class PinHelper
{
16 private static final Logger logger
= LoggerFactory
.getLogger(PinHelper
.class);
18 private final List
<SecureValueRecovery
> secureValueRecoveries
;
20 public PinHelper(final List
<SecureValueRecovery
> secureValueRecoveries
) {
21 this.secureValueRecoveries
= secureValueRecoveries
;
24 public void setRegistrationLockPin(String pin
, MasterKey masterKey
) throws IOException
{
25 IOException exception
= null;
26 for (final var secureValueRecovery
: secureValueRecoveries
) {
28 final var backupResponse
= secureValueRecovery
.setPin(pin
, masterKey
).execute();
29 switch (backupResponse
) {
30 case SecureValueRecovery
.BackupResponse
.Success success
-> {
32 case SecureValueRecovery
.BackupResponse
.ServerRejected serverRejected
->
33 logger
.warn("Backup svr failed: ServerRejected");
34 case SecureValueRecovery
.BackupResponse
.EnclaveNotFound enclaveNotFound
->
35 logger
.warn("Backup svr failed: EnclaveNotFound");
36 case SecureValueRecovery
.BackupResponse
.ExposeFailure exposeFailure
->
37 logger
.warn("Backup svr failed: ExposeFailure");
38 case SecureValueRecovery
.BackupResponse
.ApplicationError error
->
39 throw new IOException(error
.getException());
40 case SecureValueRecovery
.BackupResponse
.NetworkError error
-> throw error
.getException();
41 case null, default -> throw new AssertionError("Unexpected response");
43 } catch (IOException e
) {
47 if (exception
!= null) {
52 public void migrateRegistrationLockPin(String pin
, MasterKey masterKey
) throws IOException
{
53 setRegistrationLockPin(pin
, masterKey
);
56 public void removeRegistrationLockPin() throws IOException
{
57 IOException exception
= null;
58 for (final var secureValueRecovery
: secureValueRecoveries
) {
60 final var deleteResponse
= secureValueRecovery
.deleteData();
61 switch (deleteResponse
) {
62 case SecureValueRecovery
.DeleteResponse
.Success success
-> {
64 case SecureValueRecovery
.DeleteResponse
.ServerRejected serverRejected
->
65 logger
.warn("Delete svr2 failed: ServerRejected");
66 case SecureValueRecovery
.DeleteResponse
.EnclaveNotFound enclaveNotFound
->
67 logger
.warn("Delete svr2 failed: EnclaveNotFound");
68 case SecureValueRecovery
.DeleteResponse
.ApplicationError error
->
69 throw new IOException(error
.getException());
70 case SecureValueRecovery
.DeleteResponse
.NetworkError error
-> throw error
.getException();
71 case null, default -> throw new AssertionError("Unexpected response");
73 } catch (IOException e
) {
77 if (exception
!= null) {
82 public SecureValueRecovery
.RestoreResponse
.Success
getRegistrationLockData(
84 LockedException lockedException
85 ) throws IOException
, IncorrectPinException
{
86 var svr2Credentials
= lockedException
.getSvr2Credentials();
87 if (svr2Credentials
!= null) {
88 IOException exception
= null;
89 for (final var secureValueRecovery
: secureValueRecoveries
) {
91 final var lockData
= getRegistrationLockData(secureValueRecovery
, svr2Credentials
, pin
);
92 if (lockData
== null) {
96 } catch (IOException e
) {
100 if (exception
!= null) {
108 public SecureValueRecovery
.RestoreResponse
.Success
getRegistrationLockData(
109 SecureValueRecovery secureValueRecovery
,
110 AuthCredentials authCredentials
,
112 ) throws IOException
, IncorrectPinException
{
113 final var restoreResponse
= secureValueRecovery
.restoreDataPreRegistration(authCredentials
, null, pin
);
115 switch (restoreResponse
) {
116 case SecureValueRecovery
.RestoreResponse
.Success s
-> {
119 case SecureValueRecovery
.RestoreResponse
.PinMismatch pinMismatch
->
120 throw new IncorrectPinException(pinMismatch
.getTriesRemaining());
121 case SecureValueRecovery
.RestoreResponse
.ApplicationError error
->
122 throw new IOException(error
.getException());
123 case SecureValueRecovery
.RestoreResponse
.NetworkError error
-> throw error
.getException();
124 case SecureValueRecovery
.RestoreResponse
.Missing missing
-> {
125 logger
.debug("No SVR data stored for the given credentials.");
128 case null, default ->
129 throw new AssertionError("Unexpected response: " + restoreResponse
.getClass().getSimpleName());