]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/RegistrationManagerImpl.java
Add PNI to recipients
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / RegistrationManagerImpl.java
index 599c55a4652d9202556183956e985adda382cef1..4b7c836201525532c482e605bba11133a66de36d 100644 (file)
@@ -18,7 +18,9 @@ package org.asamk.signal.manager;
 
 import org.asamk.signal.manager.api.CaptchaRequiredException;
 import org.asamk.signal.manager.api.IncorrectPinException;
+import org.asamk.signal.manager.api.NonNormalizedPhoneNumberException;
 import org.asamk.signal.manager.api.PinLockedException;
+import org.asamk.signal.manager.api.UpdateProfile;
 import org.asamk.signal.manager.config.ServiceConfig;
 import org.asamk.signal.manager.config.ServiceEnvironmentConfig;
 import org.asamk.signal.manager.helper.AccountFileUpdater;
@@ -31,6 +33,7 @@ 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.push.ACI;
+import org.whispersystems.signalservice.api.push.PNI;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.internal.ServiceResponse;
 import org.whispersystems.signalservice.internal.push.VerifyAccountResponse;
@@ -72,14 +75,15 @@ class RegistrationManagerImpl implements RegistrationManager {
 
         GroupsV2Operations groupsV2Operations;
         try {
-            groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.getSignalServiceConfiguration()));
+            groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.getSignalServiceConfiguration()),
+                    ServiceConfig.GROUP_MAX_SIZE);
         } catch (Throwable ignored) {
             groupsV2Operations = null;
         }
         this.accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.getSignalServiceConfiguration(),
                 new DynamicCredentialsProvider(
                         // Using empty UUID, because registering doesn't work otherwise
-                        null, account.getNumber(), account.getPassword(), SignalServiceAddress.DEFAULT_DEVICE_ID),
+                        null, null, account.getNumber(), account.getPassword(), SignalServiceAddress.DEFAULT_DEVICE_ID),
                 userAgent,
                 groupsV2Operations,
                 ServiceConfig.AUTOMATIC_NETWORK_RETRY);
@@ -88,11 +92,27 @@ class RegistrationManagerImpl implements RegistrationManager {
                 serviceEnvironmentConfig.getKeyBackupConfig().getServiceId(),
                 serviceEnvironmentConfig.getKeyBackupConfig().getMrenclave(),
                 10);
-        this.pinHelper = new PinHelper(keyBackupService);
+        final var fallbackKeyBackupServices = serviceEnvironmentConfig.getFallbackKeyBackupConfigs()
+                .stream()
+                .map(config -> accountManager.getKeyBackupService(ServiceConfig.getIasKeyStore(),
+                        config.getEnclaveName(),
+                        config.getServiceId(),
+                        config.getMrenclave(),
+                        10))
+                .toList();
+        this.pinHelper = new PinHelper(keyBackupService, fallbackKeyBackupServices);
     }
 
     @Override
-    public void register(boolean voiceVerification, String captcha) throws IOException, CaptchaRequiredException {
+    public void register(
+            boolean voiceVerification, String captcha
+    ) throws IOException, CaptchaRequiredException, NonNormalizedPhoneNumberException {
+        if (account.isRegistered()
+                && account.getServiceEnvironment() != null
+                && account.getServiceEnvironment() != serviceEnvironmentConfig.getType()) {
+            throw new IOException("Account is registered in another environment: " + account.getServiceEnvironment());
+        }
+
         if (account.getAci() != null && attemptReactivateAccount()) {
             return;
         }
@@ -116,7 +136,8 @@ class RegistrationManagerImpl implements RegistrationManager {
 
         //accountManager.setGcmId(Optional.of(GoogleCloudMessaging.getInstance(this).register(REGISTRATION_ID)));
         final var aci = ACI.parseOrNull(response.getUuid());
-        account.finishRegistration(aci, masterKey, pin);
+        final var pni = PNI.parseOrNull(response.getPni());
+        account.finishRegistration(aci, pni, masterKey, pin);
         accountFileUpdater.updateAccountIdentifiers(account.getNumber(), aci);
 
         ManagerImpl m = null;
@@ -130,7 +151,7 @@ class RegistrationManagerImpl implements RegistrationManager {
             }
             // Set an initial empty profile so user can be added to groups
             try {
-                m.setProfile(null, null, null, null, null);
+                m.updateProfile(UpdateProfile.newBuilder().build());
             } catch (NoClassDefFoundError e) {
                 logger.warn("Failed to set default profile: {}", e.getMessage());
             }
@@ -146,6 +167,18 @@ class RegistrationManagerImpl implements RegistrationManager {
         }
     }
 
+    @Override
+    public void deleteLocalAccountData() throws IOException {
+        account.deleteAccountData();
+        accountFileUpdater.removeAccount();
+        account = null;
+    }
+
+    @Override
+    public boolean isRegistered() {
+        return account.isRegistered();
+    }
+
     private boolean attemptReactivateAccount() {
         try {
             final var accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.getSignalServiceConfiguration(),
@@ -157,12 +190,13 @@ class RegistrationManagerImpl implements RegistrationManager {
                     account.getLocalRegistrationId(),
                     true,
                     null,
-                    account.getPinMasterKey() == null ? null : account.getPinMasterKey().deriveRegistrationLock(),
+                    account.getRegistrationLock(),
                     account.getSelfUnidentifiedAccessKey(),
                     account.isUnrestrictedUnidentifiedAccess(),
                     capabilities,
                     account.isDiscoverableByPhoneNumber(),
-                    account.getEncryptedDeviceName());
+                    account.getEncryptedDeviceName(),
+                    account.getLocalPniRegistrationId());
             account.setRegistered(true);
             logger.info("Reactivated existing account, verify is not necessary.");
             if (newManagerListener != null) {
@@ -191,7 +225,8 @@ class RegistrationManagerImpl implements RegistrationManager {
                     account.getSelfUnidentifiedAccessKey(),
                     account.isUnrestrictedUnidentifiedAccess(),
                     ServiceConfig.capabilities,
-                    account.isDiscoverableByPhoneNumber());
+                    account.isDiscoverableByPhoneNumber(),
+                    account.getLocalPniRegistrationId());
         } else {
             return accountManager.verifyAccountWithRegistrationLockPin(verificationCode,
                     account.getLocalRegistrationId(),
@@ -200,7 +235,8 @@ class RegistrationManagerImpl implements RegistrationManager {
                     account.getSelfUnidentifiedAccessKey(),
                     account.isUnrestrictedUnidentifiedAccess(),
                     ServiceConfig.capabilities,
-                    account.isDiscoverableByPhoneNumber());
+                    account.isDiscoverableByPhoneNumber(),
+                    account.getLocalPniRegistrationId());
         }
     }