diff --git a/android/app/src/main/java/chat/rocket/reactnative/networking/SSLPinningTurboModule.java b/android/app/src/main/java/chat/rocket/reactnative/networking/SSLPinningTurboModule.java index e89c8b5fdc1..77a0ebc2148 100644 --- a/android/app/src/main/java/chat/rocket/reactnative/networking/SSLPinningTurboModule.java +++ b/android/app/src/main/java/chat/rocket/reactnative/networking/SSLPinningTurboModule.java @@ -41,6 +41,30 @@ public class SSLPinningTurboModule extends NativeSSLPinningSpec implements KeyCh private Promise promise; private static String alias; private static ReactApplicationContext reactContext; + private static OkHttpClient sharedClient; + + public static OkHttpClient getSharedOkHttpClient() { + if (sharedClient != null) { + return sharedClient; + } + if (alias != null) { + OkHttpClient.Builder builder = new OkHttpClient.Builder() + .connectTimeout(0, TimeUnit.MILLISECONDS) + .readTimeout(0, TimeUnit.MILLISECONDS) + .writeTimeout(0, TimeUnit.MILLISECONDS) + .cookieJar(new ReactCookieJarContainer()); + + SSLSocketFactory sslSocketFactory = getSSLFactory(alias); + X509TrustManager trustManager = getTrustManagerFactory(); + if (sslSocketFactory != null) { + builder.sslSocketFactory(sslSocketFactory, trustManager); + } + + sharedClient = builder.build(); + return sharedClient; + } + return null; + } public SSLPinningTurboModule(ReactApplicationContext reactContext) { super(reactContext); @@ -61,6 +85,10 @@ public void apply(OkHttpClient.Builder builder) { } protected OkHttpClient getOkHttpClient() { + OkHttpClient shared = getSharedOkHttpClient(); + if (shared != null) { + return shared; + } OkHttpClient.Builder builder = new OkHttpClient.Builder() .connectTimeout(0, TimeUnit.MILLISECONDS) .readTimeout(0, TimeUnit.MILLISECONDS) diff --git a/android/app/src/main/java/chat/rocket/reactnative/voip/DDPClient.kt b/android/app/src/main/java/chat/rocket/reactnative/voip/DDPClient.kt index 5ee257ce477..a3207e3fd7d 100644 --- a/android/app/src/main/java/chat/rocket/reactnative/voip/DDPClient.kt +++ b/android/app/src/main/java/chat/rocket/reactnative/voip/DDPClient.kt @@ -10,6 +10,7 @@ import okhttp3.WebSocket import okhttp3.WebSocketListener import org.json.JSONArray import org.json.JSONObject +import chat.rocket.reactnative.networking.SSLPinningTurboModule import java.util.concurrent.TimeUnit import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicInteger @@ -23,9 +24,11 @@ class DDPClient { companion object { private const val TAG = "RocketChat.DDPClient" - private val sharedClient = OkHttpClient.Builder() - .pingInterval(30, TimeUnit.SECONDS) - .build() + private val sharedClient: OkHttpClient by lazy { + SSLPinningTurboModule.getSharedOkHttpClient() ?: OkHttpClient.Builder() + .pingInterval(30, TimeUnit.SECONDS) + .build() + } } private var webSocket: WebSocket? = null @@ -342,8 +345,7 @@ class DDPClient { normalizedHost = normalizedHost.removePrefix("https://") } normalizedHost.startsWith("http://") -> { - useSsl = false - normalizedHost = normalizedHost.removePrefix("http://") + throw IllegalStateException("DDPClient does not support plaintext http:// servers — use https://") } else -> { useSsl = true diff --git a/android/app/src/main/java/chat/rocket/reactnative/voip/MediaCallsAnswerRequest.kt b/android/app/src/main/java/chat/rocket/reactnative/voip/MediaCallsAnswerRequest.kt index cf3e89674c5..8beca054671 100644 --- a/android/app/src/main/java/chat/rocket/reactnative/voip/MediaCallsAnswerRequest.kt +++ b/android/app/src/main/java/chat/rocket/reactnative/voip/MediaCallsAnswerRequest.kt @@ -12,6 +12,7 @@ import okhttp3.Request import okhttp3.RequestBody.Companion.toRequestBody import org.json.JSONArray import org.json.JSONObject +import chat.rocket.reactnative.networking.SSLPinningTurboModule import java.io.IOException /** @@ -40,7 +41,9 @@ class MediaCallsAnswerRequest( companion object { private const val TAG = "RocketChat.MediaCallsAnswerRequest" private val JSON_MEDIA_TYPE = "application/json; charset=utf-8".toMediaType() - private val httpClient = OkHttpClient() + private val httpClient: OkHttpClient by lazy { + SSLPinningTurboModule.getSharedOkHttpClient() ?: OkHttpClient() + } private val mainHandler = Handler(Looper.getMainLooper()) @JvmStatic