--- /dev/null
+package org.asamk.signal.manager;
+
+import org.asamk.signal.manager.config.ServiceConfig;
+import org.asamk.signal.manager.config.ServiceEnvironmentConfig;
+import org.signal.libsignal.metadata.certificate.CertificateValidator;
+import org.signal.zkgroup.profiles.ClientZkProfileOperations;
+import org.whispersystems.libsignal.util.guava.Optional;
+import org.whispersystems.signalservice.api.KeyBackupService;
+import org.whispersystems.signalservice.api.SignalServiceAccountManager;
+import org.whispersystems.signalservice.api.SignalServiceDataStore;
+import org.whispersystems.signalservice.api.SignalServiceMessageReceiver;
+import org.whispersystems.signalservice.api.SignalServiceMessageSender;
+import org.whispersystems.signalservice.api.SignalSessionLock;
+import org.whispersystems.signalservice.api.SignalWebSocket;
+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.push.SignalServiceAddress;
+import org.whispersystems.signalservice.api.services.ProfileService;
+import org.whispersystems.signalservice.api.util.SleepTimer;
+import org.whispersystems.signalservice.api.util.UptimeSleepTimer;
+import org.whispersystems.signalservice.api.websocket.WebSocketFactory;
+import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider;
+import org.whispersystems.signalservice.internal.websocket.WebSocketConnection;
+
+import java.util.concurrent.ExecutorService;
+
+import static org.asamk.signal.manager.config.ServiceConfig.capabilities;
+
+public class SignalDependencies {
+
+ private final SignalServiceAccountManager accountManager;
+ private final GroupsV2Api groupsV2Api;
+ private final GroupsV2Operations groupsV2Operations;
+
+ private final SignalWebSocket signalWebSocket;
+ private final SignalServiceMessageReceiver messageReceiver;
+ private final SignalServiceMessageSender messageSender;
+
+ private final KeyBackupService keyBackupService;
+ private final ProfileService profileService;
+ private final SignalServiceCipher cipher;
+
+ public SignalDependencies(
+ final SignalServiceAddress selfAddress,
+ final ServiceEnvironmentConfig serviceEnvironmentConfig,
+ final String userAgent,
+ final DynamicCredentialsProvider credentialsProvider,
+ final SignalServiceDataStore dataStore,
+ final ExecutorService executor,
+ final SignalSessionLock sessionLock
+ ) {
+ this.groupsV2Operations = capabilities.isGv2() ? new GroupsV2Operations(ClientZkOperations.create(
+ serviceEnvironmentConfig.getSignalServiceConfiguration())) : null;
+ final SleepTimer timer = new UptimeSleepTimer();
+ this.accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.getSignalServiceConfiguration(),
+ credentialsProvider,
+ userAgent,
+ groupsV2Operations,
+ ServiceConfig.AUTOMATIC_NETWORK_RETRY);
+ this.groupsV2Api = accountManager.getGroupsV2Api();
+ this.keyBackupService = accountManager.getKeyBackupService(ServiceConfig.getIasKeyStore(),
+ serviceEnvironmentConfig.getKeyBackupConfig().getEnclaveName(),
+ serviceEnvironmentConfig.getKeyBackupConfig().getServiceId(),
+ serviceEnvironmentConfig.getKeyBackupConfig().getMrenclave(),
+ 10);
+ final ClientZkProfileOperations clientZkProfileOperations = capabilities.isGv2() ? ClientZkOperations.create(
+ serviceEnvironmentConfig.getSignalServiceConfiguration()).getProfileOperations() : null;
+ this.messageReceiver = new SignalServiceMessageReceiver(serviceEnvironmentConfig.getSignalServiceConfiguration(),
+ credentialsProvider,
+ userAgent,
+ clientZkProfileOperations,
+ ServiceConfig.AUTOMATIC_NETWORK_RETRY);
+
+ final var healthMonitor = new SignalWebSocketHealthMonitor(timer);
+ final WebSocketFactory webSocketFactory = new WebSocketFactory() {
+ @Override
+ public WebSocketConnection createWebSocket() {
+ return new WebSocketConnection("normal",
+ serviceEnvironmentConfig.getSignalServiceConfiguration(),
+ Optional.of(credentialsProvider),
+ userAgent,
+ healthMonitor);
+ }
+
+ @Override
+ public WebSocketConnection createUnidentifiedWebSocket() {
+ return new WebSocketConnection("unidentified",
+ serviceEnvironmentConfig.getSignalServiceConfiguration(),
+ Optional.absent(),
+ userAgent,
+ healthMonitor);
+ }
+ };
+ this.signalWebSocket = new SignalWebSocket(webSocketFactory);
+ healthMonitor.monitor(signalWebSocket);
+ this.profileService = new ProfileService(clientZkProfileOperations, messageReceiver, signalWebSocket);
+
+ final var certificateValidator = new CertificateValidator(serviceEnvironmentConfig.getUnidentifiedSenderTrustRoot());
+ this.cipher = new SignalServiceCipher(selfAddress, dataStore, sessionLock, certificateValidator);
+ this.messageSender = new SignalServiceMessageSender(serviceEnvironmentConfig.getSignalServiceConfiguration(),
+ credentialsProvider,
+ dataStore,
+ sessionLock,
+ userAgent,
+ signalWebSocket,
+ Optional.absent(),
+ clientZkProfileOperations,
+ executor,
+ ServiceConfig.MAX_ENVELOPE_SIZE,
+ ServiceConfig.AUTOMATIC_NETWORK_RETRY);
+ }
+
+ public SignalServiceAccountManager getAccountManager() {
+ return accountManager;
+ }
+
+ public GroupsV2Api getGroupsV2Api() {
+ return groupsV2Api;
+ }
+
+ public GroupsV2Operations getGroupsV2Operations() {
+ return groupsV2Operations;
+ }
+
+ public SignalWebSocket getSignalWebSocket() {
+ return signalWebSocket;
+ }
+
+ public SignalServiceMessageReceiver getMessageReceiver() {
+ return messageReceiver;
+ }
+
+ public SignalServiceMessageSender getMessageSender() {
+ return messageSender;
+ }
+
+ public KeyBackupService getKeyBackupService() {
+ return keyBackupService;
+ }
+
+ public ProfileService getProfileService() {
+ return profileService;
+ }
+
+ public SignalServiceCipher getCipher() {
+ return cipher;
+ }
+}