]> nmode's Git Repositories - signal-cli/commitdiff
Implement support for change number as linked device
authorAsamK <asamk@gmx.de>
Fri, 11 Feb 2022 17:11:13 +0000 (18:11 +0100)
committerAsamK <asamk@gmx.de>
Fri, 11 Feb 2022 20:03:54 +0000 (21:03 +0100)
graalvm-config-dir/reflect-config.json
lib/src/main/java/org/asamk/signal/manager/SignalDependencies.java
lib/src/main/java/org/asamk/signal/manager/config/ServiceConfig.java
lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java

index 158f94294645b1909076811188a2018f5285344e..18954ec8035d60caffc56e0cff5d54afc03c957f 100644 (file)
   "allDeclaredMethods":true,
   "allDeclaredConstructors":true
 },
+{
+  "name":"org.whispersystems.signalservice.api.account.ChangePhoneNumberRequest",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[
+    {"name":"getCode","parameterTypes":[] }, 
+    {"name":"getNumber","parameterTypes":[] }, 
+    {"name":"getRegistrationLock","parameterTypes":[] }
+  ]
+},
 {
   "name":"org.whispersystems.signalservice.api.groupsv2.CredentialResponse",
   "allDeclaredFields":true,
   "allDeclaredMethods":true,
   "allDeclaredConstructors":true
 },
+{
+  "name":"org.whispersystems.signalservice.internal.push.WhoAmIResponse",
+  "allDeclaredFields":true,
+  "queryAllDeclaredMethods":true,
+  "queryAllDeclaredConstructors":true,
+  "methods":[{"name":"<init>","parameterTypes":[] }]
+},
 {
   "name":"org.whispersystems.signalservice.internal.serialize.protos.AddressProto",
   "fields":[
index 90bbbdc40856a59a24462718751e4dfa04b83051..4597d5859aba86286fc3c0a1bd666ba701058975 100644 (file)
@@ -68,6 +68,11 @@ public class SignalDependencies {
         this.sessionLock = sessionLock;
     }
 
+    public void resetAfterAddressChange() {
+        this.messageSender = null;
+        this.cipher = null;
+    }
+
     public ServiceEnvironmentConfig getServiceEnvironmentConfig() {
         return serviceEnvironmentConfig;
     }
@@ -81,6 +86,16 @@ public class SignalDependencies {
                         ServiceConfig.AUTOMATIC_NETWORK_RETRY));
     }
 
+    public SignalServiceAccountManager createUnauthenticatedAccountManager(String number, String password) {
+        return new SignalServiceAccountManager(getServiceEnvironmentConfig().getSignalServiceConfiguration(),
+                null,
+                number,
+                password,
+                SignalServiceAddress.DEFAULT_DEVICE_ID,
+                userAgent,
+                ServiceConfig.AUTOMATIC_NETWORK_RETRY);
+    }
+
     public GroupsV2Api getGroupsV2Api() {
         return getOrCreate(() -> groupsV2Api, () -> groupsV2Api = getAccountManager().getGroupsV2Api());
     }
index 78decc8140bd471ab287ba9c824d978f5d3be4f8..dd85671b21a5434a0771d8b6a202479f281c8559 100644 (file)
@@ -30,7 +30,7 @@ public class ServiceConfig {
     public static final AccountAttributes.Capabilities capabilities;
 
     static {
-        capabilities = new AccountAttributes.Capabilities(false, true, false, true, true, true, false);
+        capabilities = new AccountAttributes.Capabilities(false, true, false, true, true, true, true);
 
         try {
             TrustStore contactTrustStore = new IasTrustStore();
index 2affa078d890eaaa407b049420b7790f91c87860..724c2c49da84f9fa8a30dfc418bfe29e637060df 100644 (file)
@@ -2,10 +2,14 @@ package org.asamk.signal.manager.helper;
 
 import org.asamk.signal.manager.DeviceLinkInfo;
 import org.asamk.signal.manager.SignalDependencies;
+import org.asamk.signal.manager.api.CaptchaRequiredException;
+import org.asamk.signal.manager.api.IncorrectPinException;
 import org.asamk.signal.manager.api.InvalidDeviceLinkException;
+import org.asamk.signal.manager.api.PinLockedException;
 import org.asamk.signal.manager.config.ServiceConfig;
 import org.asamk.signal.manager.storage.SignalAccount;
 import org.asamk.signal.manager.util.KeyUtils;
+import org.asamk.signal.manager.util.NumberVerificationUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.whispersystems.libsignal.InvalidKeyException;
@@ -76,10 +80,30 @@ public class AccountHelper {
         account.setNumber(number);
         account.setAci(aci);
         account.getRecipientStore().resolveSelfRecipientTrusted(account.getSelfRecipientAddress());
-        context.getAccountFileUpdater().updateAccountIdentifiers(account.getNumber(), account.getAci());
         // TODO check and update remote storage
         context.getUnidentifiedAccessHelper().rotateSenderCertificates();
+        dependencies.resetAfterAddressChange();
         dependencies.getSignalWebSocket().forceNewWebSockets();
+        context.getAccountFileUpdater().updateAccountIdentifiers(account.getNumber(), account.getAci());
+    }
+
+    public void startChangeNumber(
+            String newNumber, String captcha, boolean voiceVerification
+    ) throws IOException, CaptchaRequiredException {
+        final var accountManager = dependencies.createUnauthenticatedAccountManager(newNumber, account.getPassword());
+        NumberVerificationUtils.requestVerificationCode(accountManager, captcha, voiceVerification);
+    }
+
+    public void finishChangeNumber(
+            String newNumber, String verificationCode, String pin
+    ) throws IncorrectPinException, PinLockedException, IOException {
+        final var result = NumberVerificationUtils.verifyNumber(verificationCode,
+                pin,
+                context.getPinHelper(),
+                (verificationCode1, registrationLock) -> dependencies.getAccountManager()
+                        .changeNumber(verificationCode1, newNumber, registrationLock));
+        // TODO handle response
+        updateSelfIdentifiers(newNumber, account.getAci());
     }
 
     public void setDeviceName(String deviceName) {
index 6f136b3c6ec24839862b1a7587d7e91946fe7410..b85d0050b8ed1caa568a21ce09f6e23de7430916 100644 (file)
@@ -189,7 +189,7 @@ public class StorageHelper {
         }
 
         if (!accountRecord.getE164().equals(account.getNumber())) {
-            // TODO implement changed number handling
+            context.getAccountHelper().checkWhoAmiI();
         }
 
         account.getConfigurationStore().setReadReceipts(accountRecord.isReadReceiptsEnabled());