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 77a0ebc2148..57c86cae27c 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 @@ -24,6 +24,8 @@ import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Interceptor; import android.app.Activity; import javax.net.ssl.KeyManager; import android.security.KeyChain; @@ -35,6 +37,7 @@ import com.reactnativecommunity.webview.RNCWebViewManager; import expo.modules.filesystem.legacy.FileSystemLegacyModule; import chat.rocket.reactnative.networking.ExpoImageClient; +import chat.rocket.reactnative.notification.NotificationHelper; public class SSLPinningTurboModule extends NativeSSLPinningSpec implements KeyChainAliasCallback { @@ -43,16 +46,32 @@ public class SSLPinningTurboModule extends NativeSSLPinningSpec implements KeyCh private static ReactApplicationContext reactContext; private static OkHttpClient sharedClient; + private static final Interceptor USER_AGENT_INTERCEPTOR = chain -> { + Request original = chain.request(); + if (original.header("User-Agent") != null) { + return chain.proceed(original); + } + Request request = original.newBuilder() + .header("User-Agent", NotificationHelper.getUserAgent()) + .build(); + return chain.proceed(request); + }; + + public static OkHttpClient.Builder getOkHttpClientBuilder() { + return new OkHttpClient.Builder() + .addInterceptor(USER_AGENT_INTERCEPTOR) + .connectTimeout(0, TimeUnit.MILLISECONDS) + .readTimeout(0, TimeUnit.MILLISECONDS) + .writeTimeout(0, TimeUnit.MILLISECONDS) + .cookieJar(new ReactCookieJarContainer()); + } + 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()); + OkHttpClient.Builder builder = getOkHttpClientBuilder(); SSLSocketFactory sslSocketFactory = getSSLFactory(alias); X509TrustManager trustManager = getTrustManagerFactory(); @@ -89,11 +108,7 @@ protected OkHttpClient getOkHttpClient() { if (shared != null) { return shared; } - OkHttpClient.Builder builder = new OkHttpClient.Builder() - .connectTimeout(0, TimeUnit.MILLISECONDS) - .readTimeout(0, TimeUnit.MILLISECONDS) - .writeTimeout(0, TimeUnit.MILLISECONDS) - .cookieJar(new ReactCookieJarContainer()); + OkHttpClient.Builder builder = getOkHttpClientBuilder(); if (alias != null) { SSLSocketFactory sslSocketFactory = getSSLFactory(alias); 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 62115327773..49e90b60d11 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 @@ -20,7 +20,7 @@ class DDPClient { companion object { private const val TAG = "RocketChat.DDPClient" private val sharedClient: OkHttpClient by lazy { - SSLPinningTurboModule.getSharedOkHttpClient() ?: OkHttpClient.Builder() + SSLPinningTurboModule.getSharedOkHttpClient() ?: SSLPinningTurboModule.getOkHttpClientBuilder() .pingInterval(30, TimeUnit.SECONDS) .build() } 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 4e7167030b5..f7ba33ceaca 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 @@ -43,7 +43,7 @@ class MediaCallsAnswerRequest( private const val TAG = "RocketChat.MediaCallsAnswerRequest" private val JSON_MEDIA_TYPE = "application/json; charset=utf-8".toMediaType() private val httpClient: OkHttpClient by lazy { - val base = SSLPinningTurboModule.getSharedOkHttpClient() ?: OkHttpClient() + val base = SSLPinningTurboModule.getSharedOkHttpClient() ?: SSLPinningTurboModule.getOkHttpClientBuilder().build() base.newBuilder() .callTimeout(10, TimeUnit.SECONDS) .connectTimeout(5, TimeUnit.SECONDS)