Skip to content

Commit a0d5744

Browse files
committed
Improve behavior when pin data doesn't exist on the server
1 parent 6b60a6d commit a0d5744

File tree

11 files changed

+31
-9
lines changed

11 files changed

+31
-9
lines changed

lib/src/main/java/org/asamk/signal/manager/Manager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.asamk.signal.manager.api.NotPrimaryDeviceException;
3131
import org.asamk.signal.manager.api.Pair;
3232
import org.asamk.signal.manager.api.PendingAdminApprovalException;
33+
import org.asamk.signal.manager.api.PinLockMissingException;
3334
import org.asamk.signal.manager.api.PinLockedException;
3435
import org.asamk.signal.manager.api.RateLimitException;
3536
import org.asamk.signal.manager.api.ReceiveConfig;
@@ -140,7 +141,7 @@ void finishChangeNumber(
140141
String newNumber,
141142
String verificationCode,
142143
String pin
143-
) throws IncorrectPinException, PinLockedException, IOException, NotPrimaryDeviceException;
144+
) throws IncorrectPinException, PinLockedException, IOException, NotPrimaryDeviceException, PinLockMissingException;
144145

145146
void unregister() throws IOException;
146147

lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.asamk.signal.manager.api.CaptchaRequiredException;
44
import org.asamk.signal.manager.api.IncorrectPinException;
55
import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
6+
import org.asamk.signal.manager.api.PinLockMissingException;
67
import org.asamk.signal.manager.api.PinLockedException;
78
import org.asamk.signal.manager.api.RateLimitException;
89
import org.asamk.signal.manager.api.VerificationMethodNotAvailableException;
@@ -21,7 +22,7 @@ void register(
2122
void verifyAccount(
2223
String verificationCode,
2324
String pin
24-
) throws IOException, PinLockedException, IncorrectPinException;
25+
) throws IOException, PinLockedException, IncorrectPinException, PinLockMissingException;
2526

2627
void deleteLocalAccountData() throws IOException;
2728

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package org.asamk.signal.manager.api;
2+
3+
public class PinLockMissingException extends Exception {}

lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.asamk.signal.manager.api.DeviceLinkUrl;
55
import org.asamk.signal.manager.api.IncorrectPinException;
66
import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
7+
import org.asamk.signal.manager.api.PinLockMissingException;
78
import org.asamk.signal.manager.api.PinLockedException;
89
import org.asamk.signal.manager.api.RateLimitException;
910
import org.asamk.signal.manager.api.VerificationMethodNotAvailableException;
@@ -185,7 +186,7 @@ public void finishChangeNumber(
185186
String newNumber,
186187
String verificationCode,
187188
String pin
188-
) throws IncorrectPinException, PinLockedException, IOException {
189+
) throws IncorrectPinException, PinLockedException, IOException, PinLockMissingException {
189190
for (var attempts = 0; attempts < 5; attempts++) {
190191
try {
191192
finishChangeNumberInternal(newNumber, verificationCode, pin);
@@ -205,7 +206,7 @@ private void finishChangeNumberInternal(
205206
String newNumber,
206207
String verificationCode,
207208
String pin
208-
) throws IncorrectPinException, PinLockedException, IOException {
209+
) throws IncorrectPinException, PinLockedException, IOException, PinLockMissingException {
209210
final var pniIdentity = KeyUtils.generateIdentityKeyPair();
210211
final var encryptedDeviceMessages = new ArrayList<OutgoingPushMessage>();
211212
final var devicePniSignedPreKeys = new HashMap<Integer, SignedPreKeyEntity>();

lib/src/main/java/org/asamk/signal/manager/helper/PinHelper.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,11 @@ public SecureValueRecovery.RestoreResponse.Success getRegistrationLockData(
8888
IOException exception = null;
8989
for (final var secureValueRecovery : secureValueRecoveries) {
9090
try {
91-
return getRegistrationLockData(secureValueRecovery, svr2Credentials, pin);
91+
final var lockData = getRegistrationLockData(secureValueRecovery, svr2Credentials, pin);
92+
if (lockData == null) {
93+
continue;
94+
}
95+
return lockData;
9296
} catch (IOException e) {
9397
exception = e;
9498
}

lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import org.asamk.signal.manager.api.Pair;
4949
import org.asamk.signal.manager.api.PendingAdminApprovalException;
5050
import org.asamk.signal.manager.api.PhoneNumberSharingMode;
51+
import org.asamk.signal.manager.api.PinLockMissingException;
5152
import org.asamk.signal.manager.api.PinLockedException;
5253
import org.asamk.signal.manager.api.Profile;
5354
import org.asamk.signal.manager.api.RateLimitException;
@@ -428,7 +429,7 @@ public void finishChangeNumber(
428429
String newNumber,
429430
String verificationCode,
430431
String pin
431-
) throws IncorrectPinException, PinLockedException, IOException, NotPrimaryDeviceException {
432+
) throws IncorrectPinException, PinLockedException, IOException, NotPrimaryDeviceException, PinLockMissingException {
432433
if (!account.isPrimaryDevice()) {
433434
throw new NotPrimaryDeviceException();
434435
}

lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.asamk.signal.manager.api.CaptchaRequiredException;
2222
import org.asamk.signal.manager.api.IncorrectPinException;
2323
import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
24+
import org.asamk.signal.manager.api.PinLockMissingException;
2425
import org.asamk.signal.manager.api.PinLockedException;
2526
import org.asamk.signal.manager.api.RateLimitException;
2627
import org.asamk.signal.manager.api.UpdateProfile;
@@ -149,7 +150,7 @@ public void register(
149150
public void verifyAccount(
150151
String verificationCode,
151152
String pin
152-
) throws IOException, PinLockedException, IncorrectPinException {
153+
) throws IOException, PinLockedException, IncorrectPinException, PinLockMissingException {
153154
if (account.isRegistered()) {
154155
throw new IOException("Account is already registered");
155156
}

lib/src/main/java/org/asamk/signal/manager/util/NumberVerificationUtils.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.asamk.signal.manager.api.IncorrectPinException;
55
import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
66
import org.asamk.signal.manager.api.Pair;
7+
import org.asamk.signal.manager.api.PinLockMissingException;
78
import org.asamk.signal.manager.api.PinLockedException;
89
import org.asamk.signal.manager.api.RateLimitException;
910
import org.asamk.signal.manager.api.VerificationMethodNotAvailableException;
@@ -114,7 +115,7 @@ public static Pair<VerifyAccountResponse, MasterKey> verifyNumber(
114115
String pin,
115116
PinHelper pinHelper,
116117
Verifier verifier
117-
) throws IOException, PinLockedException, IncorrectPinException {
118+
) throws IOException, PinLockedException, IncorrectPinException, PinLockMissingException {
118119
verificationCode = verificationCode.replace("-", "");
119120
try {
120121
final var response = verifier.verify(sessionId, verificationCode, null);
@@ -127,7 +128,7 @@ public static Pair<VerifyAccountResponse, MasterKey> verifyNumber(
127128

128129
final var registrationLockData = pinHelper.getRegistrationLockData(pin, e);
129130
if (registrationLockData == null) {
130-
throw e;
131+
throw new PinLockMissingException();
131132
}
132133

133134
var registrationLock = registrationLockData.getMasterKey().deriveRegistrationLock();

src/main/java/org/asamk/signal/commands/FinishChangeNumberCommand.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.asamk.signal.manager.Manager;
1010
import org.asamk.signal.manager.api.IncorrectPinException;
1111
import org.asamk.signal.manager.api.NotPrimaryDeviceException;
12+
import org.asamk.signal.manager.api.PinLockMissingException;
1213
import org.asamk.signal.manager.api.PinLockedException;
1314
import org.asamk.signal.output.OutputWriter;
1415

@@ -50,6 +51,8 @@ public void handleCommand(
5051
+ "\nUse '--pin PIN_CODE' to specify the registration lock PIN");
5152
} catch (IncorrectPinException e) {
5253
throw new UserErrorException("Verification failed! Invalid pin, tries remaining: " + e.getTriesRemaining());
54+
} catch (PinLockMissingException e) {
55+
throw new UserErrorException("Account is pin locked, but pin data has been deleted on the server.");
5356
} catch (NotPrimaryDeviceException e) {
5457
throw new UserErrorException("This command doesn't work on linked devices.");
5558
} catch (IOException e) {

src/main/java/org/asamk/signal/commands/VerifyCommand.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.asamk.signal.commands.exceptions.UserErrorException;
1212
import org.asamk.signal.manager.RegistrationManager;
1313
import org.asamk.signal.manager.api.IncorrectPinException;
14+
import org.asamk.signal.manager.api.PinLockMissingException;
1415
import org.asamk.signal.manager.api.PinLockedException;
1516
import org.asamk.signal.output.JsonWriter;
1617
import org.slf4j.Logger;
@@ -76,6 +77,8 @@ private void verify(
7677
+ "\nUse '--pin PIN_CODE' to specify the registration lock PIN");
7778
} catch (IncorrectPinException e) {
7879
throw new UserErrorException("Verification failed! Invalid pin, tries remaining: " + e.getTriesRemaining());
80+
} catch (PinLockMissingException e) {
81+
throw new UserErrorException("Account is pin locked, but pin data has been deleted on the server.");
7982
} catch (IOException e) {
8083
throw new IOErrorException("Verify error: " + e.getMessage(), e);
8184
}

0 commit comments

Comments
 (0)