From 38b32cf110f1bc5d769544db5175565eaa8816ff Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Wed, 4 Dec 2019 11:50:20 -0500 Subject: [PATCH 01/15] Add cleartext traffic check --- .../scarlet/websocket/okhttp/OkHttpClientUtils.kt | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt index c28d7c8a..b94fa4cf 100644 --- a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt +++ b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt @@ -10,11 +10,23 @@ import com.tinder.scarlet.WebSocket import com.tinder.scarlet.websocket.okhttp.request.RequestFactory import com.tinder.scarlet.websocket.okhttp.request.StaticUrlRequestFactory import okhttp3.OkHttpClient +import java.lang.RuntimeException fun OkHttpClient.newWebSocketFactory(requestFactory: RequestFactory): WebSocket.Factory { return OkHttpWebSocket.Factory(OkHttpClientWebSocketConnectionEstablisher(this, requestFactory)) } fun OkHttpClient.newWebSocketFactory(url: String): WebSocket.Factory { + if (url.startsWith("ws://")) { + try { + if (android.os.Build.VERSION.SDK_INT >= 23 && + !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()) { + throw RuntimeException("Android configuration does not permit cleartext traffic.") + } + } catch (_: ClassNotFoundException) { + // Not running on Android + } + } + return newWebSocketFactory(StaticUrlRequestFactory(url)) } From 94bde418b9ec5b7ca1099aaf0bf5f50870890545 Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Wed, 4 Dec 2019 12:04:51 -0500 Subject: [PATCH 02/15] Update OkHttpClientUtils.kt --- .../com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt | 1 - 1 file changed, 1 deletion(-) diff --git a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt index b94fa4cf..1dc608ce 100644 --- a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt +++ b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt @@ -10,7 +10,6 @@ import com.tinder.scarlet.WebSocket import com.tinder.scarlet.websocket.okhttp.request.RequestFactory import com.tinder.scarlet.websocket.okhttp.request.StaticUrlRequestFactory import okhttp3.OkHttpClient -import java.lang.RuntimeException fun OkHttpClient.newWebSocketFactory(requestFactory: RequestFactory): WebSocket.Factory { return OkHttpWebSocket.Factory(OkHttpClientWebSocketConnectionEstablisher(this, requestFactory)) From d62d286b2014cab4d24c089bd2d85cbf083df5f1 Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Wed, 4 Dec 2019 12:47:54 -0500 Subject: [PATCH 03/15] Update build.gradle --- scarlet-websocket-okhttp/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/scarlet-websocket-okhttp/build.gradle b/scarlet-websocket-okhttp/build.gradle index 28863d99..285b24f6 100644 --- a/scarlet-websocket-okhttp/build.gradle +++ b/scarlet-websocket-okhttp/build.gradle @@ -9,6 +9,7 @@ dependencies { implementation project(':scarlet-core-internal') implementation rootProject.ext.rxJava implementation rootProject.ext.kotlinStdlib + compileOnly "org.robolectric:android-all:9-robolectric-4913185-2" testImplementation project(':scarlet') testImplementation project(':scarlet-websocket-mockwebserver') From b19a3539049ba1f79ac09171db4e80406ce92f21 Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Wed, 4 Dec 2019 12:51:13 -0500 Subject: [PATCH 04/15] Update OkHttpClientUtils.kt --- .../com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt index 1dc608ce..83e6cd86 100644 --- a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt +++ b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt @@ -6,6 +6,8 @@ package com.tinder.scarlet.websocket.okhttp +import android.os.Build +import android.security.NetworkSecurityPolicy import com.tinder.scarlet.WebSocket import com.tinder.scarlet.websocket.okhttp.request.RequestFactory import com.tinder.scarlet.websocket.okhttp.request.StaticUrlRequestFactory @@ -18,7 +20,7 @@ fun OkHttpClient.newWebSocketFactory(requestFactory: RequestFactory): WebSocket. fun OkHttpClient.newWebSocketFactory(url: String): WebSocket.Factory { if (url.startsWith("ws://")) { try { - if (android.os.Build.VERSION.SDK_INT >= 23 && + if (Build.VERSION.SDK_INT >= 23 && !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()) { throw RuntimeException("Android configuration does not permit cleartext traffic.") } From 378f5dd7ddddd80404ce807015ef1a26888a1d9f Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Wed, 4 Dec 2019 14:14:49 -0500 Subject: [PATCH 05/15] Fixed dependency --- dependencies.gradle | 2 ++ scarlet-websocket-okhttp/build.gradle | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 53e0ef03..c7237a4a 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -5,6 +5,8 @@ ext { compileSdkVersion = 28 buildToolsVersion = '28.0.3' + android = 'org.robolectric:android-all:9-robolectric-4913185-2' + appCompat = 'androidx.appcompat:appcompat:1.0.0' material = 'com.google.android.material:material:1.0.0' multiDex = 'androidx.multidex:multidex:2.0.0' diff --git a/scarlet-websocket-okhttp/build.gradle b/scarlet-websocket-okhttp/build.gradle index 285b24f6..c1306c34 100644 --- a/scarlet-websocket-okhttp/build.gradle +++ b/scarlet-websocket-okhttp/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation project(':scarlet-core-internal') implementation rootProject.ext.rxJava implementation rootProject.ext.kotlinStdlib - compileOnly "org.robolectric:android-all:9-robolectric-4913185-2" + compileOnly rootProject.ext.android testImplementation project(':scarlet') testImplementation project(':scarlet-websocket-mockwebserver') From 553e0d3781105d591948aca9b69c4d07a3f7194e Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Tue, 17 Dec 2019 17:30:14 -0500 Subject: [PATCH 06/15] Requested changes --- .../scarlet/websocket/okhttp/OkHttpClientUtils.kt | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt index 83e6cd86..b8cfdd5c 100644 --- a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt +++ b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt @@ -12,17 +12,22 @@ import com.tinder.scarlet.WebSocket import com.tinder.scarlet.websocket.okhttp.request.RequestFactory import com.tinder.scarlet.websocket.okhttp.request.StaticUrlRequestFactory import okhttp3.OkHttpClient +import java.net.UnknownServiceException fun OkHttpClient.newWebSocketFactory(requestFactory: RequestFactory): WebSocket.Factory { return OkHttpWebSocket.Factory(OkHttpClientWebSocketConnectionEstablisher(this, requestFactory)) } fun OkHttpClient.newWebSocketFactory(url: String): WebSocket.Factory { - if (url.startsWith("ws://")) { + if (url.startsWith("ws://", ignoreCase = true)) { try { - if (Build.VERSION.SDK_INT >= 23 && - !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted()) { - throw RuntimeException("Android configuration does not permit cleartext traffic.") + if ((Build.VERSION.SDK_INT == 23 && + !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted) + || (Build.VERSION.SDK_INT > 23 && + !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted( + url))) { + throw UnknownServiceException( + "CLEARTEXT communication to $url not permitted by network security policy") } } catch (_: ClassNotFoundException) { // Not running on Android From ba1b350ace7f9946a646091916aa5434bb95e227 Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Tue, 17 Dec 2019 17:32:02 -0500 Subject: [PATCH 07/15] Change substring check --- .../com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt index b8cfdd5c..41016022 100644 --- a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt +++ b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt @@ -19,7 +19,7 @@ fun OkHttpClient.newWebSocketFactory(requestFactory: RequestFactory): WebSocket. } fun OkHttpClient.newWebSocketFactory(url: String): WebSocket.Factory { - if (url.startsWith("ws://", ignoreCase = true)) { + if (url.startsWith("ws:", ignoreCase = true)) { try { if ((Build.VERSION.SDK_INT == 23 && !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted) From 07d43d7780f0d97bf528bfa268f3fc315ef5757b Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Wed, 18 Dec 2019 11:36:25 -0500 Subject: [PATCH 08/15] Fix hostname --- .../tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt index 41016022..47a9d050 100644 --- a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt +++ b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt @@ -12,6 +12,7 @@ import com.tinder.scarlet.WebSocket import com.tinder.scarlet.websocket.okhttp.request.RequestFactory import com.tinder.scarlet.websocket.okhttp.request.StaticUrlRequestFactory import okhttp3.OkHttpClient +import java.net.URL import java.net.UnknownServiceException fun OkHttpClient.newWebSocketFactory(requestFactory: RequestFactory): WebSocket.Factory { @@ -21,11 +22,11 @@ fun OkHttpClient.newWebSocketFactory(requestFactory: RequestFactory): WebSocket. fun OkHttpClient.newWebSocketFactory(url: String): WebSocket.Factory { if (url.startsWith("ws:", ignoreCase = true)) { try { - if ((Build.VERSION.SDK_INT == 23 && - !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted) - || (Build.VERSION.SDK_INT > 23 && + if ((Build.VERSION.SDK_INT > 23 && !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted( - url))) { + URL(url).host)) || + (Build.VERSION.SDK_INT == 23 && + !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted)) { throw UnknownServiceException( "CLEARTEXT communication to $url not permitted by network security policy") } From ae20e77cf6ffbe47084975dab25e7a1d3e516050 Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Wed, 18 Dec 2019 12:29:00 -0500 Subject: [PATCH 09/15] Change url passed to java.net.URL to start with `http:`. It throws an exception when the URL starts with `ws:. --- .../com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt index 47a9d050..7388e061 100644 --- a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt +++ b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt @@ -24,7 +24,7 @@ fun OkHttpClient.newWebSocketFactory(url: String): WebSocket.Factory { try { if ((Build.VERSION.SDK_INT > 23 && !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted( - URL(url).host)) || + URL("http:${url.substring(3)}").host)) || (Build.VERSION.SDK_INT == 23 && !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted)) { throw UnknownServiceException( From 43fc467c8a2b85e70a77daf85babb0042a794696 Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Wed, 18 Dec 2019 12:43:34 -0500 Subject: [PATCH 10/15] Use okhttp3.HttpUrl instead of java.net.URL --- .../com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt index 7388e061..a7ce4d87 100644 --- a/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt +++ b/scarlet-websocket-okhttp/src/main/java/com/tinder/scarlet/websocket/okhttp/OkHttpClientUtils.kt @@ -11,8 +11,8 @@ import android.security.NetworkSecurityPolicy import com.tinder.scarlet.WebSocket import com.tinder.scarlet.websocket.okhttp.request.RequestFactory import com.tinder.scarlet.websocket.okhttp.request.StaticUrlRequestFactory +import okhttp3.HttpUrl import okhttp3.OkHttpClient -import java.net.URL import java.net.UnknownServiceException fun OkHttpClient.newWebSocketFactory(requestFactory: RequestFactory): WebSocket.Factory { @@ -24,7 +24,7 @@ fun OkHttpClient.newWebSocketFactory(url: String): WebSocket.Factory { try { if ((Build.VERSION.SDK_INT > 23 && !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted( - URL("http:${url.substring(3)}").host)) || + HttpUrl.parse("http:${url.substring(3)}")?.host())) || (Build.VERSION.SDK_INT == 23 && !NetworkSecurityPolicy.getInstance().isCleartextTrafficPermitted)) { throw UnknownServiceException( From eb1ba0787c23d6e740c6d71d796926691b2acb60 Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Fri, 8 May 2020 12:23:20 -0400 Subject: [PATCH 11/15] Update dependencies.gradle --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 2507e832..2b23de78 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -5,7 +5,7 @@ ext.versions = [ compileSdkVersion: 28, buildToolsVersion: "28.0.3", - android = 'org.robolectric:android-all:9-robolectric-4913185-2' + android = 'org.robolectric:android-all:9-robolectric-4913185-2', appCompat: '1.0.0', material: '1.0.0', @@ -113,4 +113,4 @@ ext.libs = [ ], stateMachine: "com.tinder.statemachine:statemachine:$versions.stateMachine" -] \ No newline at end of file +] From adffa2d7d00be01b386833338e07aa1484f52468 Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Fri, 8 May 2020 12:27:27 -0400 Subject: [PATCH 12/15] Update dependencies.gradle --- dependencies.gradle | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 2b23de78..16f51b6a 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -5,7 +5,7 @@ ext.versions = [ compileSdkVersion: 28, buildToolsVersion: "28.0.3", - android = 'org.robolectric:android-all:9-robolectric-4913185-2', + android: '9-robolectric-4913185-2', appCompat: '1.0.0', material: '1.0.0', @@ -53,6 +53,8 @@ ext.versions = [ ] ext.libs = [ + android = "org.robolectric:android-all:$versions.android", + appCompat: "androidx.appcompat:appcompat:$versions.appCompat", material: "com.google.android.material:material:$versions.material", multiDex: "androidx.multidex:multidex:$versions.multiDex", From 19ee487aa0db473b07520397b09c81ccdb2141f8 Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Fri, 8 May 2020 12:31:13 -0400 Subject: [PATCH 13/15] Update dependencies.gradle --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 16f51b6a..3fa95e85 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -53,7 +53,7 @@ ext.versions = [ ] ext.libs = [ - android = "org.robolectric:android-all:$versions.android", + android: "org.robolectric:android-all:$versions.android", appCompat: "androidx.appcompat:appcompat:$versions.appCompat", material: "com.google.android.material:material:$versions.material", From 686c97768c380f5b7b1c5fa3aa0d50ae4a9662bf Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Fri, 8 May 2020 12:39:22 -0400 Subject: [PATCH 14/15] Update build.gradle --- scarlet-websocket-okhttp/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scarlet-websocket-okhttp/build.gradle b/scarlet-websocket-okhttp/build.gradle index 16886dd7..1704c09b 100644 --- a/scarlet-websocket-okhttp/build.gradle +++ b/scarlet-websocket-okhttp/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation project(':scarlet-core-internal') implementation libs.rxJava implementation libs.kotlin.stdlib - compileOnly rootProject.ext.android + compileOnly libs.android testImplementation project(':scarlet') testImplementation project(':scarlet-websocket-mockwebserver') From c64c970de384ed412aec4d016cfbc17e7df26f92 Mon Sep 17 00:00:00 2001 From: Roger Iyengar Date: Fri, 8 May 2020 18:05:08 -0400 Subject: [PATCH 15/15] Fix Android dependency. It looks like the version of this cannot be specified separately OkHttp specifies this in a single string. See here: https://github.com/square/okhttp/blob/68241851c197a67cdcdd0e150e239f55d1e556f4/build.gradle#L28 --- dependencies.gradle | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 3fa95e85..1b42169f 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -5,8 +5,6 @@ ext.versions = [ compileSdkVersion: 28, buildToolsVersion: "28.0.3", - android: '9-robolectric-4913185-2', - appCompat: '1.0.0', material: '1.0.0', multiDex: '2.0.0', @@ -53,7 +51,7 @@ ext.versions = [ ] ext.libs = [ - android: "org.robolectric:android-all:$versions.android", + android: "org.robolectric:android-all:10-robolectric-5803371", appCompat: "androidx.appcompat:appcompat:$versions.appCompat", material: "com.google.android.material:material:$versions.material",