]> nmode's Git Repositories - signal-cli/blobdiff - lib/src/main/java/org/asamk/signal/manager/internal/SignalDependencies.java
Update libsignal-service
[signal-cli] / lib / src / main / java / org / asamk / signal / manager / internal / SignalDependencies.java
index 2e2cb75f6ffaa7a99a150c3532438c4ad81b7433..90e3b1595e0ad4389b3b6c72cf04a6238a6e5c1f 100644 (file)
@@ -3,6 +3,7 @@ package org.asamk.signal.manager.internal;
 import org.asamk.signal.manager.config.ServiceConfig;
 import org.asamk.signal.manager.config.ServiceEnvironmentConfig;
 import org.signal.libsignal.metadata.certificate.CertificateValidator;
+import org.signal.libsignal.net.Network;
 import org.signal.libsignal.zkgroup.profiles.ClientZkProfileOperations;
 import org.whispersystems.signalservice.api.SignalServiceAccountManager;
 import org.whispersystems.signalservice.api.SignalServiceDataStore;
@@ -14,14 +15,23 @@ import org.whispersystems.signalservice.api.crypto.SignalServiceCipher;
 import org.whispersystems.signalservice.api.groupsv2.ClientZkOperations;
 import org.whispersystems.signalservice.api.groupsv2.GroupsV2Api;
 import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations;
+import org.whispersystems.signalservice.api.link.LinkDeviceApi;
+import org.whispersystems.signalservice.api.push.ServiceIdType;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
+import org.whispersystems.signalservice.api.registration.RegistrationApi;
 import org.whispersystems.signalservice.api.services.ProfileService;
-import org.whispersystems.signalservice.api.svr.SecureValueRecoveryV2;
+import org.whispersystems.signalservice.api.storage.StorageServiceApi;
+import org.whispersystems.signalservice.api.storage.StorageServiceRepository;
+import org.whispersystems.signalservice.api.svr.SecureValueRecovery;
 import org.whispersystems.signalservice.api.util.CredentialsProvider;
 import org.whispersystems.signalservice.api.util.UptimeSleepTimer;
 import org.whispersystems.signalservice.api.websocket.WebSocketFactory;
+import org.whispersystems.signalservice.internal.push.ProvisioningSocket;
+import org.whispersystems.signalservice.internal.push.PushServiceSocket;
+import org.whispersystems.signalservice.internal.websocket.OkHttpWebSocketConnection;
 import org.whispersystems.signalservice.internal.websocket.WebSocketConnection;
 
+import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.ExecutorService;
 import java.util.function.Supplier;
@@ -41,16 +51,21 @@ public class SignalDependencies {
 
     private SignalServiceAccountManager accountManager;
     private GroupsV2Api groupsV2Api;
+    private RegistrationApi registrationApi;
+    private LinkDeviceApi linkDeviceApi;
+    private StorageServiceApi storageServiceApi;
     private GroupsV2Operations groupsV2Operations;
     private ClientZkOperations clientZkOperations;
 
+    private PushServiceSocket pushServiceSocket;
+    private ProvisioningSocket provisioningSocket;
+    private Network libSignalNetwork;
     private SignalWebSocket signalWebSocket;
     private SignalServiceMessageReceiver messageReceiver;
     private SignalServiceMessageSender messageSender;
 
-    private SecureValueRecoveryV2 secureValueRecoveryV2;
+    private List<SecureValueRecovery> secureValueRecovery;
     private ProfileService profileService;
-    private SignalServiceCipher cipher;
 
     SignalDependencies(
             final ServiceEnvironmentConfig serviceEnvironmentConfig,
@@ -69,8 +84,17 @@ public class SignalDependencies {
     }
 
     public void resetAfterAddressChange() {
-        this.messageSender = null;
-        this.cipher = null;
+        if (this.pushServiceSocket != null) {
+            this.pushServiceSocket.close();
+            this.pushServiceSocket = null;
+            this.accountManager = null;
+            this.messageReceiver = null;
+            this.messageSender = null;
+            this.profileService = null;
+            this.groupsV2Api = null;
+            this.registrationApi = null;
+            this.secureValueRecovery = null;
+        }
         getSignalWebSocket().forceNewWebSockets();
     }
 
@@ -89,17 +113,35 @@ public class SignalDependencies {
         return sessionLock;
     }
 
-    public SignalServiceAccountManager getAccountManager() {
-        return getOrCreate(() -> accountManager,
-                () -> accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.signalServiceConfiguration(),
+    public PushServiceSocket getPushServiceSocket() {
+        return getOrCreate(() -> pushServiceSocket,
+                () -> pushServiceSocket = new PushServiceSocket(serviceEnvironmentConfig.signalServiceConfiguration(),
                         credentialsProvider,
                         userAgent,
-                        getGroupsV2Operations(),
+                        getClientZkProfileOperations(),
                         ServiceConfig.AUTOMATIC_NETWORK_RETRY));
     }
 
+    public ProvisioningSocket getProvisioningSocket() {
+        return getOrCreate(() -> provisioningSocket,
+                () -> provisioningSocket = new ProvisioningSocket(getServiceEnvironmentConfig().signalServiceConfiguration(),
+                        userAgent));
+    }
+
+    public Network getLibSignalNetwork() {
+        return getOrCreate(() -> libSignalNetwork,
+                () -> libSignalNetwork = new Network(serviceEnvironmentConfig.netEnvironment(), userAgent));
+    }
+
+    public SignalServiceAccountManager getAccountManager() {
+        return getOrCreate(() -> accountManager,
+                () -> accountManager = new SignalServiceAccountManager(getPushServiceSocket(),
+                        getProvisioningSocket(),
+                        getGroupsV2Operations()));
+    }
+
     public SignalServiceAccountManager createUnauthenticatedAccountManager(String number, String password) {
-        return new SignalServiceAccountManager(getServiceEnvironmentConfig().signalServiceConfiguration(),
+        return SignalServiceAccountManager.createWithStaticCredentials(getServiceEnvironmentConfig().signalServiceConfiguration(),
                 null,
                 null,
                 number,
@@ -114,6 +156,23 @@ public class SignalDependencies {
         return getOrCreate(() -> groupsV2Api, () -> groupsV2Api = getAccountManager().getGroupsV2Api());
     }
 
+    public RegistrationApi getRegistrationApi() {
+        return getOrCreate(() -> registrationApi, () -> registrationApi = getAccountManager().getRegistrationApi());
+    }
+
+    public LinkDeviceApi getLinkDeviceApi() {
+        return getOrCreate(() -> linkDeviceApi, () -> linkDeviceApi = new LinkDeviceApi(getPushServiceSocket()));
+    }
+
+    private StorageServiceApi getStorageServiceApi() {
+        return getOrCreate(() -> storageServiceApi,
+                () -> storageServiceApi = new StorageServiceApi(getPushServiceSocket()));
+    }
+
+    public StorageServiceRepository getStorageServiceRepository() {
+        return new StorageServiceRepository(getStorageServiceApi());
+    }
+
     public GroupsV2Operations getGroupsV2Operations() {
         return getOrCreate(() -> groupsV2Operations,
                 () -> groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.signalServiceConfiguration()),
@@ -127,7 +186,7 @@ public class SignalDependencies {
 
     private ClientZkProfileOperations getClientZkProfileOperations() {
         final var clientZkOperations = getClientZkOperations();
-        return clientZkOperations == null ? null : clientZkOperations.getProfileOperations();
+        return clientZkOperations.getProfileOperations();
     }
 
     public SignalWebSocket getSignalWebSocket() {
@@ -137,7 +196,7 @@ public class SignalDependencies {
             final var webSocketFactory = new WebSocketFactory() {
                 @Override
                 public WebSocketConnection createWebSocket() {
-                    return new WebSocketConnection("normal",
+                    return new OkHttpWebSocketConnection("normal",
                             serviceEnvironmentConfig.signalServiceConfiguration(),
                             Optional.of(credentialsProvider),
                             userAgent,
@@ -147,7 +206,7 @@ public class SignalDependencies {
 
                 @Override
                 public WebSocketConnection createUnidentifiedWebSocket() {
-                    return new WebSocketConnection("unidentified",
+                    return new OkHttpWebSocketConnection("unidentified",
                             serviceEnvironmentConfig.signalServiceConfiguration(),
                             Optional.empty(),
                             userAgent,
@@ -162,31 +221,26 @@ public class SignalDependencies {
 
     public SignalServiceMessageReceiver getMessageReceiver() {
         return getOrCreate(() -> messageReceiver,
-                () -> messageReceiver = new SignalServiceMessageReceiver(serviceEnvironmentConfig.signalServiceConfiguration(),
-                        credentialsProvider,
-                        userAgent,
-                        getClientZkProfileOperations(),
-                        ServiceConfig.AUTOMATIC_NETWORK_RETRY));
+                () -> messageReceiver = new SignalServiceMessageReceiver(getPushServiceSocket()));
     }
 
     public SignalServiceMessageSender getMessageSender() {
         return getOrCreate(() -> messageSender,
-                () -> messageSender = new SignalServiceMessageSender(serviceEnvironmentConfig.signalServiceConfiguration(),
-                        credentialsProvider,
+                () -> messageSender = new SignalServiceMessageSender(getPushServiceSocket(),
                         dataStore,
                         sessionLock,
-                        userAgent,
                         getSignalWebSocket(),
                         Optional.empty(),
-                        getClientZkProfileOperations(),
                         executor,
-                        ServiceConfig.MAX_ENVELOPE_SIZE,
-                        ServiceConfig.AUTOMATIC_NETWORK_RETRY));
+                        ServiceConfig.MAX_ENVELOPE_SIZE));
     }
 
-    public SecureValueRecoveryV2 getSecureValueRecoveryV2() {
-        return getOrCreate(() -> secureValueRecoveryV2,
-                () -> secureValueRecoveryV2 = getAccountManager().getSecureValueRecoveryV2(serviceEnvironmentConfig.svr2Mrenclave()));
+    public List<SecureValueRecovery> getSecureValueRecovery() {
+        return getOrCreate(() -> secureValueRecovery,
+                () -> secureValueRecovery = serviceEnvironmentConfig.svr2Mrenclaves()
+                        .stream()
+                        .map(mr -> (SecureValueRecovery) getAccountManager().getSecureValueRecoveryV2(mr))
+                        .toList());
     }
 
     public ProfileService getProfileService() {
@@ -196,13 +250,15 @@ public class SignalDependencies {
                         getSignalWebSocket()));
     }
 
-    public SignalServiceCipher getCipher() {
-        return getOrCreate(() -> cipher, () -> {
-            final var certificateValidator = new CertificateValidator(serviceEnvironmentConfig.unidentifiedSenderTrustRoot());
-            final var address = new SignalServiceAddress(credentialsProvider.getAci(), credentialsProvider.getE164());
-            final var deviceId = credentialsProvider.getDeviceId();
-            cipher = new SignalServiceCipher(address, deviceId, dataStore.aci(), sessionLock, certificateValidator);
-        });
+    public SignalServiceCipher getCipher(ServiceIdType serviceIdType) {
+        final var certificateValidator = new CertificateValidator(serviceEnvironmentConfig.unidentifiedSenderTrustRoot());
+        final var address = new SignalServiceAddress(credentialsProvider.getAci(), credentialsProvider.getE164());
+        final var deviceId = credentialsProvider.getDeviceId();
+        return new SignalServiceCipher(address,
+                deviceId,
+                serviceIdType == ServiceIdType.ACI ? dataStore.aci() : dataStore.pni(),
+                sessionLock,
+                certificateValidator);
     }
 
     private <T> T getOrCreate(Supplier<T> supplier, Callable creator) {