"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":[
this.sessionLock = sessionLock;
}
+ public void resetAfterAddressChange() {
+ this.messageSender = null;
+ this.cipher = null;
+ }
+
public ServiceEnvironmentConfig getServiceEnvironmentConfig() {
return serviceEnvironmentConfig;
}
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());
}
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();
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;
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) {
}
if (!accountRecord.getE164().equals(account.getNumber())) {
- // TODO implement changed number handling
+ context.getAccountHelper().checkWhoAmiI();
}
account.getConfigurationStore().setReadReceipts(accountRecord.isReadReceiptsEnabled());