X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/de273586b4106171a3940ce5ec2c2b3712430c8c..b810e303ec9d0fcc3ba948b7e65d57f85bffe437:/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java 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 6ded4d0b..653f9cb4 100644 --- a/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java +++ b/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java @@ -22,6 +22,8 @@ import org.asamk.signal.manager.config.ServiceEnvironmentConfig; import org.asamk.signal.manager.helper.PinHelper; import org.asamk.signal.manager.storage.SignalAccount; import org.asamk.signal.manager.util.KeyUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.whispersystems.libsignal.util.KeyHelper; import org.whispersystems.libsignal.util.guava.Optional; import org.whispersystems.signalservice.api.KeyBackupServicePinException; @@ -29,9 +31,8 @@ import org.whispersystems.signalservice.api.KeyBackupSystemNoDataException; import org.whispersystems.signalservice.api.SignalServiceAccountManager; import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations; import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations; +import org.whispersystems.signalservice.api.kbs.MasterKey; import org.whispersystems.signalservice.api.push.SignalServiceAddress; -import org.whispersystems.signalservice.api.util.SleepTimer; -import org.whispersystems.signalservice.api.util.UptimeSleepTimer; import org.whispersystems.signalservice.api.util.UuidUtil; import org.whispersystems.signalservice.internal.push.LockedException; import org.whispersystems.signalservice.internal.push.VerifyAccountResponse; @@ -44,6 +45,8 @@ import java.util.Locale; public class RegistrationManager implements Closeable { + private final static Logger logger = LoggerFactory.getLogger(RegistrationManager.class); + private SignalAccount account; private final PathConfig pathConfig; private final ServiceEnvironmentConfig serviceEnvironmentConfig; @@ -63,7 +66,6 @@ public class RegistrationManager implements Closeable { this.serviceEnvironmentConfig = serviceEnvironmentConfig; this.userAgent = userAgent; - final SleepTimer timer = new UptimeSleepTimer(); GroupsV2Operations groupsV2Operations; try { groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.getSignalServiceConfiguration())); @@ -76,8 +78,7 @@ public class RegistrationManager implements Closeable { null, account.getUsername(), account.getPassword(), SignalServiceAddress.DEFAULT_DEVICE_ID), userAgent, groupsV2Operations, - ServiceConfig.AUTOMATIC_NETWORK_RETRY, - timer); + ServiceConfig.AUTOMATIC_NETWORK_RETRY); final var keyBackupService = accountManager.getKeyBackupService(ServiceConfig.getIasKeyStore(), serviceEnvironmentConfig.getKeyBackupConfig().getEnclaveName(), serviceEnvironmentConfig.getKeyBackupConfig().getServiceId(), @@ -102,40 +103,48 @@ public class RegistrationManager implements Closeable { identityKey, registrationId, profileKey); - account.save(); return new RegistrationManager(account, pathConfig, serviceConfiguration, userAgent); } - var account = SignalAccount.load(pathConfig.getDataPath(), username); + var account = SignalAccount.load(pathConfig.getDataPath(), username, true); return new RegistrationManager(account, pathConfig, serviceConfiguration, userAgent); } public void register(boolean voiceVerification, String captcha) throws IOException { - if (account.getPassword() == null) { - account.setPassword(KeyUtils.createPassword()); - } - if (voiceVerification) { - accountManager.requestVoiceVerificationCode(Locale.getDefault(), + accountManager.requestVoiceVerificationCode(getDefaultLocale(), Optional.fromNullable(captcha), Optional.absent()); } else { accountManager.requestSmsVerificationCode(false, Optional.fromNullable(captcha), Optional.absent()); } + } - account.save(); + private Locale getDefaultLocale() { + final var locale = Locale.getDefault(); + try { + Locale.LanguageRange.parse(locale.getLanguage() + "-" + locale.getCountry()); + } catch (IllegalArgumentException e) { + logger.debug("Invalid locale, ignoring: {}", locale); + return null; + } + + return locale; } - public void verifyAccount( + public Manager verifyAccount( String verificationCode, String pin - ) throws IOException, KeyBackupSystemNoDataException, KeyBackupServicePinException { + ) throws IOException, LockedException, KeyBackupSystemNoDataException, KeyBackupServicePinException { verificationCode = verificationCode.replace("-", ""); VerifyAccountResponse response; + MasterKey masterKey; try { - response = verifyAccountWithCode(verificationCode, pin, null); - account.setPinMasterKey(null); + response = verifyAccountWithCode(verificationCode, null, null); + + masterKey = null; + pin = null; } catch (LockedException e) { if (pin == null) { throw e; @@ -143,40 +152,41 @@ public class RegistrationManager implements Closeable { var registrationLockData = pinHelper.getRegistrationLockData(pin, e); if (registrationLockData == null) { - throw e; + response = verifyAccountWithCode(verificationCode, pin, null); + masterKey = null; + } else { + var registrationLock = registrationLockData.getMasterKey().deriveRegistrationLock(); + try { + response = verifyAccountWithCode(verificationCode, null, registrationLock); + } catch (LockedException _e) { + throw new AssertionError("KBS Pin appeared to matched but reg lock still failed!"); + } + masterKey = registrationLockData.getMasterKey(); } - - var registrationLock = registrationLockData.getMasterKey().deriveRegistrationLock(); - try { - response = verifyAccountWithCode(verificationCode, null, registrationLock); - } catch (LockedException _e) { - throw new AssertionError("KBS Pin appeared to matched but reg lock still failed!"); - } - account.setPinMasterKey(registrationLockData.getMasterKey()); } // TODO response.isStorageCapable() //accountManager.setGcmId(Optional.of(GoogleCloudMessaging.getInstance(this).register(REGISTRATION_ID))); + account.finishRegistration(UuidUtil.parseOrNull(response.getUuid()), masterKey, pin); - account.setDeviceId(SignalServiceAddress.DEFAULT_DEVICE_ID); - account.setMultiDevice(false); - account.setRegistered(true); - account.setUuid(UuidUtil.parseOrNull(response.getUuid())); - account.setRegistrationLockPin(pin); - account.getSignalProtocolStore().archiveAllSessions(); - account.getSignalProtocolStore() - .saveIdentity(account.getSelfAddress(), - account.getSignalProtocolStore().getIdentityKeyPair().getPublicKey(), - TrustLevel.TRUSTED_VERIFIED); - - try (var m = new Manager(account, pathConfig, serviceEnvironmentConfig, userAgent)) { + Manager m = null; + try { + m = new Manager(account, pathConfig, serviceEnvironmentConfig, userAgent); + account = null; m.refreshPreKeys(); + // Set an initial empty profile so user can be added to groups + m.setProfile(null, null, null, null, null); - m.close(false); - } + final var result = m; + m = null; - account.save(); + return result; + } finally { + if (m != null) { + m.close(); + } + } } private VerifyAccountResponse verifyAccountWithCode( @@ -184,7 +194,7 @@ public class RegistrationManager implements Closeable { ) throws IOException { return accountManager.verifyAccountWithCode(verificationCode, null, - account.getSignalProtocolStore().getLocalRegistrationId(), + account.getLocalRegistrationId(), true, legacyPin, registrationLock,