]> nmode's Git Repositories - signal-cli/commitdiff
Show information when requesting voice verification without SMS verification
authorAsamK <asamk@gmx.de>
Tue, 20 Feb 2024 16:37:31 +0000 (17:37 +0100)
committerAsamK <asamk@gmx.de>
Tue, 20 Feb 2024 16:37:31 +0000 (17:37 +0100)
Fixes #1373

lib/src/main/java/org/asamk/signal/manager/Manager.java
lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java
lib/src/main/java/org/asamk/signal/manager/api/VerificationMethoNotAvailableException.java [new file with mode: 0644]
lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java
lib/src/main/java/org/asamk/signal/manager/internal/ManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/util/NumberVerificationUtils.java
src/main/java/org/asamk/signal/commands/RegisterCommand.java
src/main/java/org/asamk/signal/commands/StartChangeNumberCommand.java
src/main/java/org/asamk/signal/dbus/DbusSignalControlImpl.java

index f4d330a4cf13afa9be4aeead4683470af1dfe218..76b6a85c2afdcca7d44772b9264ca9ddc578b2d7 100644 (file)
@@ -43,6 +43,7 @@ import org.asamk.signal.manager.api.UpdateGroup;
 import org.asamk.signal.manager.api.UpdateProfile;
 import org.asamk.signal.manager.api.UserStatus;
 import org.asamk.signal.manager.api.UsernameLinkUrl;
+import org.asamk.signal.manager.api.VerificationMethoNotAvailableException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
@@ -125,7 +126,7 @@ public interface Manager extends Closeable {
 
     void startChangeNumber(
             String newNumber, boolean voiceVerification, String captcha
-    ) throws RateLimitException, IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, NotPrimaryDeviceException;
+    ) throws RateLimitException, IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, NotPrimaryDeviceException, VerificationMethoNotAvailableException;
 
     void finishChangeNumber(
             String newNumber, String verificationCode, String pin
index 8ba2bf70db0b288d4dbcca94180aeddd742f4d1b..365dd3996133fe346d64695f2a1526df70adf52f 100644 (file)
@@ -5,6 +5,7 @@ import org.asamk.signal.manager.api.IncorrectPinException;
 import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
 import org.asamk.signal.manager.api.PinLockedException;
 import org.asamk.signal.manager.api.RateLimitException;
+import org.asamk.signal.manager.api.VerificationMethoNotAvailableException;
 
 import java.io.Closeable;
 import java.io.IOException;
@@ -13,7 +14,7 @@ public interface RegistrationManager extends Closeable {
 
     void register(
             boolean voiceVerification, String captcha
-    ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, RateLimitException;
+    ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, RateLimitException, VerificationMethoNotAvailableException;
 
     void verifyAccount(
             String verificationCode, String pin
diff --git a/lib/src/main/java/org/asamk/signal/manager/api/VerificationMethoNotAvailableException.java b/lib/src/main/java/org/asamk/signal/manager/api/VerificationMethoNotAvailableException.java
new file mode 100644 (file)
index 0000000..172e44e
--- /dev/null
@@ -0,0 +1,8 @@
+package org.asamk.signal.manager.api;
+
+public class VerificationMethoNotAvailableException extends Exception {
+
+    public VerificationMethoNotAvailableException() {
+        super("Invalid verification method");
+    }
+}
index 1f44e2a36fe46f72f05974b1c41e5568cae1c80d..06b1fe80fb700a5f347943cbf532027731fd93fe 100644 (file)
@@ -7,6 +7,7 @@ import org.asamk.signal.manager.api.InvalidDeviceLinkException;
 import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
 import org.asamk.signal.manager.api.PinLockedException;
 import org.asamk.signal.manager.api.RateLimitException;
+import org.asamk.signal.manager.api.VerificationMethoNotAvailableException;
 import org.asamk.signal.manager.internal.SignalDependencies;
 import org.asamk.signal.manager.jobs.SyncStorageJob;
 import org.asamk.signal.manager.storage.SignalAccount;
@@ -164,7 +165,7 @@ public class AccountHelper {
 
     public void startChangeNumber(
             String newNumber, boolean voiceVerification, String captcha
-    ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, RateLimitException {
+    ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, RateLimitException, VerificationMethoNotAvailableException {
         final var accountManager = dependencies.createUnauthenticatedAccountManager(newNumber, account.getPassword());
         String sessionId = NumberVerificationUtils.handleVerificationSession(accountManager,
                 account.getSessionId(newNumber),
index a25c92c03a2e02971743e8aa13148d441deee4b2..2caffc3842d597f6e5599beb0b9a843fb924c9fb 100644 (file)
@@ -64,6 +64,7 @@ import org.asamk.signal.manager.api.UpdateGroup;
 import org.asamk.signal.manager.api.UpdateProfile;
 import org.asamk.signal.manager.api.UserStatus;
 import org.asamk.signal.manager.api.UsernameLinkUrl;
+import org.asamk.signal.manager.api.VerificationMethoNotAvailableException;
 import org.asamk.signal.manager.config.ServiceEnvironmentConfig;
 import org.asamk.signal.manager.helper.AccountFileUpdater;
 import org.asamk.signal.manager.helper.Context;
@@ -374,7 +375,7 @@ public class ManagerImpl implements Manager {
     @Override
     public void startChangeNumber(
             String newNumber, boolean voiceVerification, String captcha
-    ) throws RateLimitException, IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, NotPrimaryDeviceException {
+    ) throws RateLimitException, IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, NotPrimaryDeviceException, VerificationMethoNotAvailableException {
         if (!account.isPrimaryDevice()) {
             throw new NotPrimaryDeviceException();
         }
index 4518fb01c86efc1c4f0113ac6f8a92fdc50080f7..2df7ff4bad669b0421dc13d2ea491e380699ea91 100644 (file)
@@ -24,6 +24,7 @@ import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
 import org.asamk.signal.manager.api.PinLockedException;
 import org.asamk.signal.manager.api.RateLimitException;
 import org.asamk.signal.manager.api.UpdateProfile;
+import org.asamk.signal.manager.api.VerificationMethoNotAvailableException;
 import org.asamk.signal.manager.config.ServiceConfig;
 import org.asamk.signal.manager.config.ServiceEnvironmentConfig;
 import org.asamk.signal.manager.helper.AccountFileUpdater;
@@ -104,7 +105,7 @@ public class RegistrationManagerImpl implements RegistrationManager {
     @Override
     public void register(
             boolean voiceVerification, String captcha
-    ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, RateLimitException {
+    ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, RateLimitException, VerificationMethoNotAvailableException {
         if (account.isRegistered()
                 && account.getServiceEnvironment() != null
                 && account.getServiceEnvironment() != serviceEnvironmentConfig.type()) {
index a5c91f5b3b85565952726065e2301668f5777dc5..9eb01cdbdbdcf3d859a37639d11c05aff8d4325f 100644 (file)
@@ -6,6 +6,7 @@ import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
 import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.PinLockedException;
 import org.asamk.signal.manager.api.RateLimitException;
+import org.asamk.signal.manager.api.VerificationMethoNotAvailableException;
 import org.asamk.signal.manager.helper.PinHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,7 +35,7 @@ public class NumberVerificationUtils {
             Consumer<String> sessionIdSaver,
             boolean voiceVerification,
             String captcha
-    ) throws CaptchaRequiredException, IOException, RateLimitException {
+    ) throws CaptchaRequiredException, IOException, RateLimitException, VerificationMethoNotAvailableException {
         RegistrationSessionMetadataResponse sessionResponse;
         try {
             sessionResponse = getValidSession(accountManager, sessionId);
@@ -61,7 +62,9 @@ public class NumberVerificationUtils {
         final var nextAttempt = voiceVerification
                 ? sessionResponse.getBody().getNextCall()
                 : sessionResponse.getBody().getNextSms();
-        if (nextAttempt != null && nextAttempt > 0) {
+        if (nextAttempt == null) {
+            throw new VerificationMethoNotAvailableException();
+        } else if (nextAttempt > 0) {
             final var timestamp = sessionResponse.getHeaders().getTimestamp() + nextAttempt * 1000;
             throw new RateLimitException(timestamp);
         }
index 876d1a8a9954d03f3e098ec2a3e87b4463fbf1f7..4776ac6e2e0359de197a45b7935ea1ca6f654207 100644 (file)
@@ -15,6 +15,7 @@ import org.asamk.signal.manager.RegistrationManager;
 import org.asamk.signal.manager.api.CaptchaRequiredException;
 import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
 import org.asamk.signal.manager.api.RateLimitException;
+import org.asamk.signal.manager.api.VerificationMethoNotAvailableException;
 import org.asamk.signal.output.JsonWriter;
 import org.asamk.signal.util.CommandUtil;
 
@@ -79,6 +80,12 @@ public class RegisterCommand implements RegistrationCommand, JsonRpcRegistration
         } catch (IOException e) {
             throw new IOErrorException("Failed to register: %s (%s)".formatted(e.getMessage(),
                     e.getClass().getSimpleName()), e);
+        } catch (VerificationMethoNotAvailableException e) {
+            throw new UserErrorException("Failed to register: " + e.getMessage() + (
+                    voiceVerification
+                            ? ": Before requesting voice verification you need to request SMS verification and wait a minute."
+                            : ""
+            ), e);
         }
     }
 
index 7b18dbf0953267c49b07523ac6922dea10aaf2e9..823a0c92898ec6482e93aac51a03f985ae212a27 100644 (file)
@@ -13,6 +13,7 @@ import org.asamk.signal.manager.api.CaptchaRequiredException;
 import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
 import org.asamk.signal.manager.api.NotPrimaryDeviceException;
 import org.asamk.signal.manager.api.RateLimitException;
+import org.asamk.signal.manager.api.VerificationMethoNotAvailableException;
 import org.asamk.signal.output.OutputWriter;
 import org.asamk.signal.util.CommandUtil;
 
@@ -59,6 +60,12 @@ public class StartChangeNumberCommand implements JsonRpcLocalCommand {
         } catch (IOException e) {
             throw new IOErrorException("Failed to change number: %s (%s)".formatted(e.getMessage(),
                     e.getClass().getSimpleName()), e);
+        } catch (VerificationMethoNotAvailableException e) {
+            throw new UserErrorException("Failed to register: " + e.getMessage() + (
+                    voiceVerification
+                            ? ": Before requesting voice verification you need to request SMS verification and wait a minute."
+                            : ""
+            ), e);
         }
     }
 }
index f21dd40d7e44555d193cd923d31d2778a11a456f..d8465d2678acb227493e1054b5f8af8b146c8380 100644 (file)
@@ -13,6 +13,7 @@ import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
 import org.asamk.signal.manager.api.PinLockedException;
 import org.asamk.signal.manager.api.RateLimitException;
 import org.asamk.signal.manager.api.UserAlreadyExistsException;
+import org.asamk.signal.manager.api.VerificationMethoNotAvailableException;
 import org.freedesktop.dbus.DBusPath;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -73,7 +74,7 @@ public class DbusSignalControlImpl implements org.asamk.SignalControl {
             throw new Error.InvalidNumber(e.getMessage());
         } catch (OverlappingFileLockException e) {
             throw new SignalControl.Error.Failure("Account is already in use");
-        } catch (IOException e) {
+        } catch (IOException | VerificationMethoNotAvailableException e) {
             throw new SignalControl.Error.Failure(e.getClass().getSimpleName() + " " + e.getMessage());
         }
     }