diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java index d067d7f088..4f3e7c37d8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencies.java @@ -8,7 +8,6 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import org.signal.core.util.concurrent.DeadlockDetector; -import org.signal.libsignal.net.Network; import org.signal.libsignal.zkgroup.profiles.ClientZkProfileOperations; import org.signal.libsignal.zkgroup.receipts.ClientZkReceiptOperations; import org.thoughtcrime.securesms.components.TypingStatusRepository; @@ -59,6 +58,7 @@ import org.whispersystems.signalservice.api.util.Tls12SocketFactory; import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration; import org.whispersystems.signalservice.internal.util.BlacklistingTrustManager; import org.whispersystems.signalservice.internal.util.Util; +import org.whispersystems.signalservice.internal.websocket.LibSignalNetwork; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; @@ -131,7 +131,7 @@ public class ApplicationDependencies { private static volatile DeadlockDetector deadlockDetector; private static volatile ClientZkReceiptOperations clientZkReceiptOperations; private static volatile ScheduledMessageManager scheduledMessagesManager; - private static volatile Network libsignalNetwork; + private static volatile LibSignalNetwork libsignalNetwork; @MainThread public static void init(@NonNull Application application, @NonNull Provider provider) { @@ -260,6 +260,9 @@ public class ApplicationDependencies { public static void resetAllNetworkConnections() { synchronized (LOCK) { closeConnections(); + if (libsignalNetwork != null) { + libsignalNetwork.resetSettings(getSignalServiceNetworkAccess().getConfiguration()); + } if (signalWebSocket != null) { signalWebSocket.forceNewWebSockets(); } @@ -688,11 +691,11 @@ public class ApplicationDependencies { return deadlockDetector; } - public static @NonNull Network getLibsignalNetwork() { + public static @NonNull LibSignalNetwork getLibsignalNetwork() { if (libsignalNetwork == null) { synchronized (LIBSIGNAL_NETWORK_LOCK) { if (libsignalNetwork == null) { - libsignalNetwork = provider.provideLibsignalNetwork(); + libsignalNetwork = provider.provideLibsignalNetwork(getSignalServiceNetworkAccess().getConfiguration()); } } } @@ -726,7 +729,7 @@ public class ApplicationDependencies { @NonNull SignalCallManager provideSignalCallManager(); @NonNull PendingRetryReceiptManager providePendingRetryReceiptManager(); @NonNull PendingRetryReceiptCache providePendingRetryReceiptCache(); - @NonNull SignalWebSocket provideSignalWebSocket(@NonNull Supplier signalServiceConfigurationSupplier, @NonNull Supplier libSignalNetworkSupplier); + @NonNull SignalWebSocket provideSignalWebSocket(@NonNull Supplier signalServiceConfigurationSupplier, @NonNull Supplier libSignalNetworkSupplier); @NonNull SignalServiceDataStoreImpl provideProtocolStore(); @NonNull GiphyMp4Cache provideGiphyMp4Cache(); @NonNull SimpleExoPlayerPool provideExoPlayerPool(); @@ -737,6 +740,6 @@ public class ApplicationDependencies { @NonNull DeadlockDetector provideDeadlockDetector(); @NonNull ClientZkReceiptOperations provideClientZkReceiptOperations(@NonNull SignalServiceConfiguration signalServiceConfiguration); @NonNull ScheduledMessageManager provideScheduledMessageManager(); - @NonNull Network provideLibsignalNetwork(); + @NonNull LibSignalNetwork provideLibsignalNetwork(@NonNull SignalServiceConfiguration config); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java index 2bb2f43273..0ec99876a4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java +++ b/app/src/main/java/org/thoughtcrime/securesms/dependencies/ApplicationDependencyProvider.java @@ -233,8 +233,8 @@ public class ApplicationDependencyProvider implements ApplicationDependencies.Pr } @Override - public @NonNull Network provideLibsignalNetwork() { - return new Network(BuildConfig.LIBSIGNAL_NET_ENV); + public @NonNull LibSignalNetwork provideLibsignalNetwork(@NonNull SignalServiceConfiguration config) { + return new LibSignalNetwork(new Network(BuildConfig.LIBSIGNAL_NET_ENV), config); } @Override @@ -290,7 +290,7 @@ public class ApplicationDependencyProvider implements ApplicationDependencies.Pr } @Override - public @NonNull SignalWebSocket provideSignalWebSocket(@NonNull Supplier signalServiceConfigurationSupplier, @NonNull Supplier libSignalNetworkSupplier) { + public @NonNull SignalWebSocket provideSignalWebSocket(@NonNull Supplier signalServiceConfigurationSupplier, @NonNull Supplier libSignalNetworkSupplier) { SleepTimer sleepTimer = !SignalStore.account().isFcmEnabled() || SignalStore.internalValues().isWebsocketModeForced() ? new AlarmSleepTimer(context) : new UptimeSleepTimer() ; SignalWebSocketHealthMonitor healthMonitor = new SignalWebSocketHealthMonitor(context, sleepTimer); SignalWebSocket signalWebSocket = new SignalWebSocket(provideWebSocketFactory(signalServiceConfigurationSupplier, healthMonitor, libSignalNetworkSupplier)); @@ -400,7 +400,7 @@ public class ApplicationDependencyProvider implements ApplicationDependencies.Pr return provideClientZkOperations(signalServiceConfiguration).getReceiptOperations(); } - @NonNull WebSocketFactory provideWebSocketFactory(@NonNull Supplier signalServiceConfigurationSupplier, @NonNull SignalWebSocketHealthMonitor healthMonitor, @NonNull Supplier libSignalNetworkSupplier) { + @NonNull WebSocketFactory provideWebSocketFactory(@NonNull Supplier signalServiceConfigurationSupplier, @NonNull SignalWebSocketHealthMonitor healthMonitor, @NonNull Supplier libSignalNetworkSupplier) { return new WebSocketFactory() { @Override public WebSocketConnection createWebSocket() { @@ -415,7 +415,7 @@ public class ApplicationDependencyProvider implements ApplicationDependencies.Pr @Override public WebSocketConnection createUnidentifiedWebSocket() { if (FeatureFlags.libSignalWebSocketEnabled()) { - var network = new LibSignalNetwork(libSignalNetworkSupplier.get()); + LibSignalNetwork network = libSignalNetworkSupplier.get(); return new LibSignalChatConnection( "libsignal-unauth", network.createChatService(null), diff --git a/app/src/test/java/org/thoughtcrime/securesms/dependencies/MockApplicationDependencyProvider.java b/app/src/test/java/org/thoughtcrime/securesms/dependencies/MockApplicationDependencyProvider.java index 88df57b100..a166f99256 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/dependencies/MockApplicationDependencyProvider.java +++ b/app/src/test/java/org/thoughtcrime/securesms/dependencies/MockApplicationDependencyProvider.java @@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.dependencies; import androidx.annotation.NonNull; import org.signal.core.util.concurrent.DeadlockDetector; -import org.signal.libsignal.net.Network; import org.signal.libsignal.zkgroup.profiles.ClientZkProfileOperations; import org.signal.libsignal.zkgroup.receipts.ClientZkReceiptOperations; import org.thoughtcrime.securesms.components.TypingStatusRepository; @@ -43,6 +42,7 @@ import org.whispersystems.signalservice.api.services.CallLinksService; import org.whispersystems.signalservice.api.services.DonationsService; import org.whispersystems.signalservice.api.services.ProfileService; import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration; +import org.whispersystems.signalservice.internal.websocket.LibSignalNetwork; import java.util.function.Supplier; @@ -181,7 +181,7 @@ public class MockApplicationDependencyProvider implements ApplicationDependencie } @Override - public @NonNull SignalWebSocket provideSignalWebSocket(@NonNull Supplier signalServiceConfigurationSupplier, @NonNull Supplier libSignalNetworkSupplier) { + public @NonNull SignalWebSocket provideSignalWebSocket(@NonNull Supplier signalServiceConfigurationSupplier, @NonNull Supplier libSignalNetworkSupplier) { return null; } @@ -235,7 +235,7 @@ public class MockApplicationDependencyProvider implements ApplicationDependencie } @Override - public @NonNull Network provideLibsignalNetwork() { + public @NonNull LibSignalNetwork provideLibsignalNetwork(@NonNull SignalServiceConfiguration config) { return null; } } diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java index 801615e3d5..7c271cbc89 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java @@ -87,6 +87,7 @@ import org.whispersystems.signalservice.internal.util.StaticCredentialsProvider; import org.whispersystems.signalservice.internal.util.Util; import org.whispersystems.signalservice.internal.websocket.DefaultResponseMapper; import org.signal.core.util.Base64; +import org.whispersystems.signalservice.internal.websocket.LibSignalNetwork; import java.io.IOException; import java.security.MessageDigest; @@ -369,7 +370,7 @@ public class SignalServiceAccountManager { Optional token, String mrEnclave, Long timeoutMs, - @Nullable Network libsignalNetwork, + @Nullable LibSignalNetwork libsignalNetwork, Consumer tokenSaver) throws IOException { diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java index 2549af2157..40d1bbc0e8 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java @@ -19,6 +19,7 @@ import org.whispersystems.signalservice.api.push.exceptions.NonSuccessfulRespons import org.whispersystems.signalservice.api.util.UuidUtil; import org.whispersystems.signalservice.internal.ServiceResponse; import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration; +import org.whispersystems.signalservice.internal.websocket.LibSignalNetwork; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -55,7 +56,7 @@ public final class CdsiV2Service { private final CdsiRequestHandler cdsiRequestHandler; - public CdsiV2Service(SignalServiceConfiguration configuration, String mrEnclave, @Nullable Network network) { + public CdsiV2Service(SignalServiceConfiguration configuration, String mrEnclave, @Nullable LibSignalNetwork network) { if (network != null) { this.cdsiRequestHandler = (username, password, request, tokenSaver) -> { diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/LibSignalNetwork.kt b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/LibSignalNetwork.kt index 625ad2f44c..6d2134ea3c 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/LibSignalNetwork.kt +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/internal/websocket/LibSignalNetwork.kt @@ -5,14 +5,27 @@ package org.whispersystems.signalservice.internal.websocket +import org.signal.core.util.orNull +import org.signal.libsignal.internal.CompletableFuture +import org.signal.libsignal.net.CdsiLookupRequest +import org.signal.libsignal.net.CdsiLookupResponse import org.signal.libsignal.net.ChatService import org.signal.libsignal.net.Network import org.whispersystems.signalservice.api.util.CredentialsProvider +import org.whispersystems.signalservice.internal.configuration.SignalProxy +import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration +import java.io.IOException +import java.util.concurrent.ExecutionException +import java.util.function.Consumer /** * Makes Network API more ergonomic to use with Android client types */ -class LibSignalNetwork(private val inner: Network) { +class LibSignalNetwork(private val inner: Network, config: SignalServiceConfiguration) { + init { + resetSettings(config) + } + fun createChatService( credentialsProvider: CredentialsProvider? = null ): ChatService { @@ -20,4 +33,27 @@ class LibSignalNetwork(private val inner: Network) { val password = credentialsProvider?.password ?: "" return inner.createChatService(username, password) } + + fun resetSettings(config: SignalServiceConfiguration) { + resetProxy(config.signalProxy.orNull()) + } + + private fun resetProxy(proxy: SignalProxy?) { + if (proxy == null) { + inner.clearProxy() + } else { + inner.setProxy(proxy.host, proxy.port) + } + } + + // Delegates + @Throws(IOException::class, InterruptedException::class, ExecutionException::class) + fun cdsiLookup( + username: String?, + password: String?, + request: CdsiLookupRequest?, + tokenConsumer: Consumer + ): CompletableFuture? { + return inner.cdsiLookup(username, password, request, tokenConsumer) + } }