Add system HTTP proxy support to libsignal-net.

Co-authored-by: Cody Henthorne <cody@signal.org>
This commit is contained in:
andrew-signal
2025-04-11 18:58:07 -05:00
committed by Cody Henthorne
parent 8e880fe117
commit 74c6e76808
8 changed files with 101 additions and 18 deletions

View File

@@ -1,6 +1,9 @@
package org.thoughtcrime.securesms.push
import android.content.Context
import android.net.ConnectivityManager
import android.os.Build
import androidx.core.content.ContextCompat
import com.google.i18n.phonenumbers.PhoneNumberUtil
import okhttp3.CipherSuite
import okhttp3.ConnectionSpec
@@ -20,6 +23,7 @@ import org.thoughtcrime.securesms.net.SequentialDns
import org.thoughtcrime.securesms.net.StandardUserAgentInterceptor
import org.thoughtcrime.securesms.net.StaticDns
import org.whispersystems.signalservice.api.push.TrustStore
import org.whispersystems.signalservice.internal.configuration.HttpProxy
import org.whispersystems.signalservice.internal.configuration.SignalCdnUrl
import org.whispersystems.signalservice.internal.configuration.SignalCdsiUrl
import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration
@@ -28,6 +32,7 @@ import org.whispersystems.signalservice.internal.configuration.SignalStorageUrl
import org.whispersystems.signalservice.internal.configuration.SignalSvr2Url
import java.io.IOException
import java.util.Optional
import android.net.Proxy as AndroidProxy
/**
* Provides a [SignalServiceConfiguration] to be used with our service layer.
@@ -133,6 +138,28 @@ class SignalServiceNetworkAccess(context: Context) {
.build()
private val APP_CONNECTION_SPEC = ConnectionSpec.MODERN_TLS
@Suppress("DEPRECATION")
private fun getSystemHttpProxy(context: Context): HttpProxy? {
return if (Build.VERSION.SDK_INT >= 23) {
val connectivityManager = ContextCompat.getSystemService(context, ConnectivityManager::class.java) ?: return null
connectivityManager
.activeNetwork
?.let { connectivityManager.getLinkProperties(it)?.httpProxy }
?.takeIf { !it.exclusionList.contains(BuildConfig.SIGNAL_URL.stripProtocol()) }
?.let { proxy -> HttpProxy(proxy.host, proxy.port) }
} else {
val host: String? = AndroidProxy.getHost(context)
val port: Int = AndroidProxy.getPort(context)
if (host != null) {
HttpProxy(host, port)
} else {
null
}
}
}
}
private val serviceTrustStore: TrustStore = SignalServiceTrustStore(context)
@@ -187,6 +214,7 @@ class SignalServiceNetworkAccess(context: Context) {
networkInterceptors = interceptors,
dns = Optional.of(DNS),
signalProxy = Optional.empty(),
systemHttpProxy = Optional.empty(),
zkGroupServerPublicParams = zkGroupServerPublicParams,
genericServerPublicParams = genericServerPublicParams,
backupServerPublicParams = backupServerPublicParams,
@@ -246,6 +274,7 @@ class SignalServiceNetworkAccess(context: Context) {
networkInterceptors = interceptors,
dns = Optional.of(DNS),
signalProxy = if (SignalStore.proxy.isProxyEnabled) Optional.ofNullable(SignalStore.proxy.proxy) else Optional.empty(),
systemHttpProxy = Optional.ofNullable(getSystemHttpProxy(context)),
zkGroupServerPublicParams = zkGroupServerPublicParams,
genericServerPublicParams = genericServerPublicParams,
backupServerPublicParams = backupServerPublicParams,
@@ -316,6 +345,7 @@ class SignalServiceNetworkAccess(context: Context) {
networkInterceptors = interceptors,
dns = Optional.of(DNS),
signalProxy = Optional.empty(),
systemHttpProxy = Optional.empty(),
zkGroupServerPublicParams = zkGroupServerPublicParams,
genericServerPublicParams = genericServerPublicParams,
backupServerPublicParams = backupServerPublicParams,