Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import org.signal.core.util.CoreUtilDependencies
import org.signal.core.util.billing.BillingApi
import org.signal.core.util.concurrent.DeadlockDetector
import org.signal.core.util.concurrent.LatestValueObservable
import org.signal.core.util.orNull
import org.signal.core.util.resettableLazy
import org.signal.glide.SignalGlideDependencies
import org.signal.libsignal.net.Network
Expand Down Expand Up @@ -75,7 +74,6 @@ import org.whispersystems.signalservice.api.services.ProfileService
import org.whispersystems.signalservice.api.storage.StorageServiceApi
import org.whispersystems.signalservice.api.websocket.SignalWebSocket
import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState
import org.whispersystems.signalservice.internal.configuration.HttpProxy
import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration
import org.whispersystems.signalservice.internal.push.PushServiceSocket
import java.util.function.Supplier
Expand Down Expand Up @@ -296,6 +294,10 @@ object AppDependencies {
val libsignalNetwork: Network
get() = networkModule.libsignalNetwork

@JvmStatic
val networkProxyState: NetworkProxyState
get() = networkModule.networkProxyState

@JvmStatic
val authWebSocket: SignalWebSocket.AuthenticatedWebSocket
get() = networkModule.authWebSocket
Expand Down Expand Up @@ -421,16 +423,6 @@ object AppDependencies {
networkModule.openConnections()
}

fun onSystemHttpProxyChange(systemHttpProxy: HttpProxy?): Boolean {
val currentSystemProxy = signalServiceNetworkAccess.getConfiguration().systemHttpProxy.orNull()
return if (currentSystemProxy?.host != systemHttpProxy?.host || currentSystemProxy?.port != systemHttpProxy?.port) {
resetNetwork()
true
} else {
false
}
}

interface Provider {
fun providePushServiceSocket(signalServiceConfiguration: SignalServiceConfiguration, groupsV2Operations: GroupsV2Operations): PushServiceSocket
fun provideGroupsV2Operations(signalServiceConfiguration: SignalServiceConfiguration): GroupsV2Operations
Expand Down Expand Up @@ -469,7 +461,7 @@ object AppDependencies {
fun provideClientZkReceiptOperations(signalServiceConfiguration: SignalServiceConfiguration): ClientZkReceiptOperations
fun provideScheduledMessageManager(): ScheduledMessageManager
fun providePinnedMessageManager(): PinnedMessageManager
fun provideLibsignalNetwork(config: SignalServiceConfiguration): Network
fun provideLibsignalNetwork(config: SignalServiceConfiguration, proxyState: NetworkProxyState): Network
fun provideBillingApi(): BillingApi
fun provideArchiveApi(authWebSocket: SignalWebSocket.AuthenticatedWebSocket, unauthWebSocket: SignalWebSocket.UnauthenticatedWebSocket, pushServiceSocket: PushServiceSocket): ArchiveApi
fun provideKeysApi(authWebSocket: SignalWebSocket.AuthenticatedWebSocket, unauthWebSocket: SignalWebSocket.UnauthenticatedWebSocket): KeysApi
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@
import org.thoughtcrime.securesms.megaphone.MegaphoneRepository;
import org.thoughtcrime.securesms.messages.IncomingMessageObserver;
import org.thoughtcrime.securesms.net.DeviceTransferBlockingInterceptor;
import org.thoughtcrime.securesms.net.NetworkProxyKt;
import org.thoughtcrime.securesms.net.ProxyConfig;
import org.thoughtcrime.securesms.net.SignalWebSocketHealthMonitor;
import org.thoughtcrime.securesms.net.StandardUserAgentInterceptor;
import org.thoughtcrime.securesms.notifications.MessageNotifier;
Expand Down Expand Up @@ -285,10 +287,14 @@ public ApplicationDependencyProvider(@NonNull Application context) {
}

@Override
public @NonNull Network provideLibsignalNetwork(@NonNull SignalServiceConfiguration config) {
public @NonNull Network provideLibsignalNetwork(@NonNull SignalServiceConfiguration config, @NonNull NetworkProxyState proxyState) {
Network network = new Network(BuildConfig.LIBSIGNAL_NET_ENV, StandardUserAgentInterceptor.USER_AGENT, RemoteConfig.getLibsignalConfigs(), Network.BuildVariant.PRODUCTION);
LibSignalNetworkExtensions.applyConfiguration(network, config);

ProxyConfig proxyConfig = NetworkProxyKt.resolveProxyConfig(config.getSignalProxy().orElse(null));
NetworkProxyKt.configureProxy(network, proxyConfig);
proxyState.update(proxyConfig);

return network;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,11 @@ class NetworkDependenciesModule(
}

val libsignalNetwork: Network by lazy {
provider.provideLibsignalNetwork(signalServiceNetworkAccess.getConfiguration())
provider.provideLibsignalNetwork(signalServiceNetworkAccess.getConfiguration(), networkProxyState)
}

val networkProxyState: NetworkProxyState = NetworkProxyState()

val authWebSocket: SignalWebSocket.AuthenticatedWebSocket by lazy {
provider.provideAuthWebSocket({ signalServiceNetworkAccess.getConfiguration() }, { libsignalNetwork }).also {
disposables += it.state.subscribe { s -> webSocketStateSubject.onNext(s) }
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* Copyright 2026 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/

package org.thoughtcrime.securesms.dependencies

import org.thoughtcrime.securesms.net.ProxyConfig
import java.util.concurrent.atomic.AtomicReference

/**
* Tracks the proxy configuration that has been applied to the [org.signal.libsignal.net.Network]
* instance so callers can detect changes and restart connections when needed.
*/
class NetworkProxyState {

private val current = AtomicReference<ProxyConfig>(ProxyConfig.Direct)

val currentConfig: ProxyConfig
get() = current.get()

/** Returns true if the proxy changed and connections should be restarted. */
fun update(proxyConfig: ProxyConfig): Boolean {
val prev = current.getAndUpdate { proxyConfig }
return prev != proxyConfig
}
}
Loading