From: AsamK Date: Tue, 27 Feb 2024 17:12:43 +0000 (+0100) Subject: Add register parameter to force reregistration X-Git-Tag: v0.13.1~1 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/2424fc1f531e968da95d18b3954215c897cc2452?ds=sidebyside Add register parameter to force reregistration --- diff --git a/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java b/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java index 365dd399..75a91dc9 100644 --- a/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java +++ b/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java @@ -13,7 +13,7 @@ import java.io.IOException; public interface RegistrationManager extends Closeable { void register( - boolean voiceVerification, String captcha + boolean voiceVerification, String captcha, final boolean forceRegister ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, RateLimitException, VerificationMethoNotAvailableException; void verifyAccount( diff --git a/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java b/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java index 2df7ff4b..b0725cbd 100644 --- a/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java +++ b/lib/src/main/java/org/asamk/signal/manager/internal/RegistrationManagerImpl.java @@ -104,7 +104,7 @@ public class RegistrationManagerImpl implements RegistrationManager { @Override public void register( - boolean voiceVerification, String captcha + boolean voiceVerification, String captcha, final boolean forceRegister ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException, RateLimitException, VerificationMethoNotAvailableException { if (account.isRegistered() && account.getServiceEnvironment() != null @@ -113,12 +113,18 @@ public class RegistrationManagerImpl implements RegistrationManager { } try { - final var recoveryPassword = account.getRecoveryPassword(); - if (recoveryPassword != null && account.isPrimaryDevice() && attemptReregisterAccount(recoveryPassword)) { - return; + if (!forceRegister) { + if (account.isRegistered()) { + throw new IOException("Account is already registered"); + } + + if (account.getAci() != null && attemptReactivateAccount()) { + return; + } } - if (account.getAci() != null && attemptReactivateAccount()) { + final var recoveryPassword = account.getRecoveryPassword(); + if (recoveryPassword != null && account.isPrimaryDevice() && attemptReregisterAccount(recoveryPassword)) { return; } @@ -128,6 +134,7 @@ public class RegistrationManagerImpl implements RegistrationManager { voiceVerification, captcha); NumberVerificationUtils.requestVerificationCode(accountManager, sessionId, voiceVerification); + account.setRegistered(false); } catch (DeprecatedVersionException e) { logger.debug("Signal-Server returned deprecated version exception", e); throw e; diff --git a/man/signal-cli.1.adoc b/man/signal-cli.1.adoc index 4b59c754..80d4c37e 100644 --- a/man/signal-cli.1.adoc +++ b/man/signal-cli.1.adoc @@ -102,12 +102,15 @@ If the account was deleted (with --delete-account) it cannot be reactivated. The verification should be done over voice, not SMS. Voice verification only works if an SMS verification has been attempted before. -*--captcha*:: +*--captcha* CAPTCHA:: The captcha token, required if registration failed with a captcha required error. To get the token, go to https://signalcaptchas.org/registration/generate.html For the staging environment, use: https://signalcaptchas.org/staging/registration/generate.html After solving the captcha, right-click on the "Open Signal" link and copy the link. +*--reregister*:: +Register even if account is already registered. + === verify Verify the number using the code received via SMS or voice. diff --git a/src/main/java/org/asamk/signal/commands/RegisterCommand.java b/src/main/java/org/asamk/signal/commands/RegisterCommand.java index 4776ac6e..2f03cbb3 100644 --- a/src/main/java/org/asamk/signal/commands/RegisterCommand.java +++ b/src/main/java/org/asamk/signal/commands/RegisterCommand.java @@ -37,14 +37,18 @@ public class RegisterCommand implements RegistrationCommand, JsonRpcRegistration .action(Arguments.storeTrue()); subparser.addArgument("--captcha") .help("The captcha token, required if registration failed with a captcha required error."); + subparser.addArgument("--reregister") + .action(Arguments.storeTrue()) + .help("Register even if account is already registered"); } @Override public void handleCommand(final Namespace ns, final RegistrationManager m) throws CommandException { final boolean voiceVerification = Boolean.TRUE.equals(ns.getBoolean("voice")); final var captcha = ns.getString("captcha"); + final var reregister = Boolean.TRUE.equals(ns.getBoolean("reregister")); - register(m, voiceVerification, captcha); + register(m, voiceVerification, captcha, reregister); } @Override @@ -61,14 +65,14 @@ public class RegisterCommand implements RegistrationCommand, JsonRpcRegistration public void handleCommand( final RegistrationParams request, final RegistrationManager m, final JsonWriter jsonWriter ) throws CommandException { - register(m, Boolean.TRUE.equals(request.voice()), request.captcha()); + register(m, Boolean.TRUE.equals(request.voice()), request.captcha(), Boolean.TRUE.equals(request.reregister())); } private void register( - final RegistrationManager m, final boolean voiceVerification, final String captcha + final RegistrationManager m, final boolean voiceVerification, final String captcha, final boolean reregister ) throws CommandException { try { - m.register(voiceVerification, captcha); + m.register(voiceVerification, captcha, reregister); } catch (RateLimitException e) { final var message = CommandUtil.getRateLimitMessage(e); throw new RateLimitErrorException(message, e); @@ -89,5 +93,5 @@ public class RegisterCommand implements RegistrationCommand, JsonRpcRegistration } } - public record RegistrationParams(Boolean voice, String captcha) {} + public record RegistrationParams(Boolean voice, String captcha, Boolean reregister) {} } diff --git a/src/main/java/org/asamk/signal/dbus/DbusRegistrationManagerImpl.java b/src/main/java/org/asamk/signal/dbus/DbusRegistrationManagerImpl.java index 4d43b98c..788e0c91 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusRegistrationManagerImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusRegistrationManagerImpl.java @@ -27,8 +27,11 @@ public class DbusRegistrationManagerImpl implements RegistrationManager { @Override public void register( - final boolean voiceVerification, final String captcha + final boolean voiceVerification, final String captcha, final boolean forceRegister ) throws IOException, CaptchaRequiredException { + if (forceRegister) { + throw new UnsupportedOperationException(); + } if (captcha == null) { signalControl.register(number, voiceVerification); } else { diff --git a/src/main/java/org/asamk/signal/dbus/DbusSignalControlImpl.java b/src/main/java/org/asamk/signal/dbus/DbusSignalControlImpl.java index d8465d26..ddf25cd1 100644 --- a/src/main/java/org/asamk/signal/dbus/DbusSignalControlImpl.java +++ b/src/main/java/org/asamk/signal/dbus/DbusSignalControlImpl.java @@ -63,7 +63,7 @@ public class DbusSignalControlImpl implements org.asamk.SignalControl { "Invalid account (phone number), make sure you include the country code."); } try (final RegistrationManager registrationManager = c.getNewRegistrationManager(number)) { - registrationManager.register(voiceVerification, captcha); + registrationManager.register(voiceVerification, captcha, false); } catch (RateLimitException e) { String message = "Rate limit reached"; throw new SignalControl.Error.Failure(message);