]> nmode's Git Repositories - signal-cli/blob - lib/src/main/java/org/asamk/signal/manager/helper/PinHelper.java
Implement username links
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / helper / PinHelper.java
1 package org.asamk.signal.manager.helper;
2
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;
11
12 import java.io.IOException;
13
14 public class PinHelper {
15
16 private static final Logger logger = LoggerFactory.getLogger(PinHelper.class);
17
18 private final SecureValueRecoveryV2 secureValueRecoveryV2;
19
20 public PinHelper(final SecureValueRecoveryV2 secureValueRecoveryV2) {
21 this.secureValueRecoveryV2 = secureValueRecoveryV2;
22 }
23
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 -> {
30 }
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");
41 }
42 }
43
44 public void migrateRegistrationLockPin(String pin, MasterKey masterKey) throws IOException {
45 setRegistrationLockPin(pin, masterKey);
46 }
47
48 public void removeRegistrationLockPin() throws IOException {
49 final var deleteResponse = secureValueRecoveryV2.deleteData();
50 switch (deleteResponse) {
51 case SecureValueRecovery.DeleteResponse.Success success -> {
52 }
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");
61 }
62 }
63
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);
70 }
71
72 return null;
73 }
74
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);
79
80 switch (restoreResponse) {
81 case SecureValueRecovery.RestoreResponse.Success s -> {
82 return s;
83 }
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.");
91 return null;
92 }
93 case null, default ->
94 throw new AssertionError("Unexpected response: " + restoreResponse.getClass().getSimpleName());
95 }
96 }
97 }