Support proxy in connections managed by libsignal.

This commit is contained in:
moiseev-signal
2024-04-29 14:57:01 -07:00
committed by Greyson Parrelli
parent d20f588802
commit f9a8f447d2
6 changed files with 58 additions and 17 deletions

View File

@@ -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<SignalServiceConfiguration> signalServiceConfigurationSupplier, @NonNull Supplier<Network> libSignalNetworkSupplier);
@NonNull SignalWebSocket provideSignalWebSocket(@NonNull Supplier<SignalServiceConfiguration> signalServiceConfigurationSupplier, @NonNull Supplier<LibSignalNetwork> 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);
}
}

View File

@@ -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<SignalServiceConfiguration> signalServiceConfigurationSupplier, @NonNull Supplier<Network> libSignalNetworkSupplier) {
public @NonNull SignalWebSocket provideSignalWebSocket(@NonNull Supplier<SignalServiceConfiguration> signalServiceConfigurationSupplier, @NonNull Supplier<LibSignalNetwork> 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<SignalServiceConfiguration> signalServiceConfigurationSupplier, @NonNull SignalWebSocketHealthMonitor healthMonitor, @NonNull Supplier<Network> libSignalNetworkSupplier) {
@NonNull WebSocketFactory provideWebSocketFactory(@NonNull Supplier<SignalServiceConfiguration> signalServiceConfigurationSupplier, @NonNull SignalWebSocketHealthMonitor healthMonitor, @NonNull Supplier<LibSignalNetwork> 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),