From: AsamK Date: Fri, 11 Feb 2022 17:11:13 +0000 (+0100) Subject: Implement support for change number as linked device X-Git-Tag: v0.10.4~16 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/d690b35ed943b0210e3f483528b8c033fe2d667f Implement support for change number as linked device --- diff --git a/graalvm-config-dir/reflect-config.json b/graalvm-config-dir/reflect-config.json index 158f9429..18954ec8 100644 --- a/graalvm-config-dir/reflect-config.json +++ b/graalvm-config-dir/reflect-config.json @@ -1931,6 +1931,17 @@ "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, @@ -2937,6 +2948,13 @@ "allDeclaredMethods":true, "allDeclaredConstructors":true }, +{ + "name":"org.whispersystems.signalservice.internal.push.WhoAmIResponse", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":[] }] +}, { "name":"org.whispersystems.signalservice.internal.serialize.protos.AddressProto", "fields":[ diff --git a/lib/src/main/java/org/asamk/signal/manager/SignalDependencies.java b/lib/src/main/java/org/asamk/signal/manager/SignalDependencies.java index 90bbbdc4..4597d585 100644 --- a/lib/src/main/java/org/asamk/signal/manager/SignalDependencies.java +++ b/lib/src/main/java/org/asamk/signal/manager/SignalDependencies.java @@ -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()); } diff --git a/lib/src/main/java/org/asamk/signal/manager/config/ServiceConfig.java b/lib/src/main/java/org/asamk/signal/manager/config/ServiceConfig.java index 78decc81..dd85671b 100644 --- a/lib/src/main/java/org/asamk/signal/manager/config/ServiceConfig.java +++ b/lib/src/main/java/org/asamk/signal/manager/config/ServiceConfig.java @@ -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(); diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java index 2affa078..724c2c49 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/AccountHelper.java @@ -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) { diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java index 6f136b3c..b85d0050 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java @@ -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());