From 97e62e81dcbf05839366a52bd8282ceec741e8d4 Mon Sep 17 00:00:00 2001 From: chenjia404 Date: Thu, 29 Jun 2023 17:02:00 +0800 Subject: [PATCH 1/3] Support the use of doh update okhttp to 4.11.0 --- gradle.properties | 2 +- .../messaging/file_server/FileServerApi.kt | 17 ++++++---- .../messaging/jobs/AttachmentDownloadJob.kt | 5 +-- .../messaging/jobs/BackgroundGroupAddJob.kt | 5 +-- .../messaging/jobs/NotifyPNServerJob.kt | 3 +- .../messaging/open_groups/OpenGroup.kt | 9 ++--- .../messaging/open_groups/OpenGroupApi.kt | 11 +++--- .../notifications/PushNotificationAPI.kt | 7 ++-- .../libsession/snode/OnionRequestAPI.kt | 16 +++++---- .../snode/utilities/OKHTTPUtilities.kt | 6 ++-- .../libsession/utilities/DownloadUtilities.kt | 5 +-- .../utilities/OpenGroupUrlParser.kt | 7 ++-- libsignal/build.gradle | 1 + .../org/session/libsignal/utilities/HTTP.kt | 34 +++++++++++++++---- 14 files changed, 83 insertions(+), 45 deletions(-) diff --git a/gradle.properties b/gradle.properties index fa51fdbca..89804737a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,7 +13,7 @@ glideVersion=4.11.0 kovenantVersion=3.3.0 curve25519Version=0.6.0 protobufVersion=2.5.0 -okhttpVersion=3.12.1 +okhttpVersion=4.11.0 jacksonDatabindVersion=2.9.8 appcompatVersion=1.5.1 materialVersion=1.7.0 diff --git a/libsession/src/main/java/org/session/libsession/messaging/file_server/FileServerApi.kt b/libsession/src/main/java/org/session/libsession/messaging/file_server/FileServerApi.kt index 0e8768d53..5bffed57e 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/file_server/FileServerApi.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/file_server/FileServerApi.kt @@ -3,8 +3,11 @@ package org.session.libsession.messaging.file_server import nl.komponents.kovenant.Promise import nl.komponents.kovenant.functional.map import okhttp3.Headers +import okhttp3.Headers.Companion.toHeaders import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.MediaType +import okhttp3.MediaType.Companion.toMediaType import okhttp3.RequestBody import org.session.libsession.snode.OnionRequestAPI import org.session.libsignal.utilities.HTTP @@ -37,18 +40,18 @@ object FileServerApi { ) private fun createBody(body: ByteArray?, parameters: Any?): RequestBody? { - if (body != null) return RequestBody.create(MediaType.get("application/octet-stream"), body) + if (body != null) return RequestBody.create("application/octet-stream".toMediaType(), body) if (parameters == null) return null val parametersAsJSON = JsonUtil.toJson(parameters) - return RequestBody.create(MediaType.get("application/json"), parametersAsJSON) + return RequestBody.create("application/json".toMediaType(), parametersAsJSON) } private fun send(request: Request): Promise { - val url = HttpUrl.parse(server) ?: return Promise.ofFail(Error.InvalidURL) + val url = server.toHttpUrlOrNull() ?: return Promise.ofFail(Error.InvalidURL) val urlBuilder = HttpUrl.Builder() - .scheme(url.scheme()) - .host(url.host()) - .port(url.port()) + .scheme(url.scheme) + .host(url.host) + .port(url.port) .addPathSegments(request.endpoint) if (request.verb == HTTP.Verb.GET) { for ((key, value) in request.queryParameters) { @@ -57,7 +60,7 @@ object FileServerApi { } val requestBuilder = okhttp3.Request.Builder() .url(urlBuilder.build()) - .headers(Headers.of(request.headers)) + .headers(request.headers.toHeaders()) when (request.verb) { HTTP.Verb.GET -> requestBuilder.get() HTTP.Verb.PUT -> requestBuilder.put(createBody(request.body, request.parameters)!!) diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt index ef1d7567b..091d383bb 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/AttachmentDownloadJob.kt @@ -1,6 +1,7 @@ package org.session.libsession.messaging.jobs import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import org.session.libsession.messaging.MessagingModuleConfiguration import org.session.libsession.messaging.open_groups.OpenGroupApi import org.session.libsession.messaging.sending_receiving.attachments.AttachmentId @@ -121,8 +122,8 @@ class AttachmentDownloadJob(val attachmentID: Long, val databaseMessageID: Long) DownloadUtilities.downloadFile(tempFile, attachment.url) } else { Log.d("AttachmentDownloadJob", "downloading open group attachment") - val url = HttpUrl.parse(attachment.url)!! - val fileID = url.pathSegments().last() + val url = attachment.url.toHttpUrlOrNull()!! + val fileID = url.pathSegments.last() OpenGroupApi.download(fileID, openGroup.room, openGroup.server).get().let { tempFile.writeBytes(it) } diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/BackgroundGroupAddJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/BackgroundGroupAddJob.kt index c5ec1bc74..c01d71330 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/BackgroundGroupAddJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/BackgroundGroupAddJob.kt @@ -1,6 +1,7 @@ package org.session.libsession.messaging.jobs import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import org.session.libsession.messaging.MessagingModuleConfiguration import org.session.libsession.messaging.open_groups.OpenGroup import org.session.libsession.messaging.open_groups.OpenGroupApi @@ -23,9 +24,9 @@ class BackgroundGroupAddJob(val joinUrl: String): Job { override val maxFailureCount: Int = 1 val openGroupId: String? get() { - val url = HttpUrl.parse(joinUrl) ?: return null + val url = joinUrl.toHttpUrlOrNull() ?: return null val server = OpenGroup.getServer(joinUrl)?.toString()?.removeSuffix("/") ?: return null - val room = url.pathSegments().firstOrNull() ?: return null + val room = url.pathSegments.firstOrNull() ?: return null return "$server.$room" } diff --git a/libsession/src/main/java/org/session/libsession/messaging/jobs/NotifyPNServerJob.kt b/libsession/src/main/java/org/session/libsession/messaging/jobs/NotifyPNServerJob.kt index 25fb2194c..ef5f4f937 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/jobs/NotifyPNServerJob.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/jobs/NotifyPNServerJob.kt @@ -5,6 +5,7 @@ import com.esotericsoftware.kryo.io.Input import com.esotericsoftware.kryo.io.Output import nl.komponents.kovenant.functional.map import okhttp3.MediaType +import okhttp3.MediaType.Companion.toMediaType import okhttp3.Request import okhttp3.RequestBody import org.session.libsession.messaging.jobs.Job.Companion.MAX_BUFFER_SIZE @@ -36,7 +37,7 @@ class NotifyPNServerJob(val message: SnodeMessage) : Job { val server = PushNotificationAPI.server val parameters = mapOf( "data" to message.data, "send_to" to message.recipient ) val url = "${server}/notify" - val body = RequestBody.create(MediaType.get("application/json"), JsonUtil.toJson(parameters)) + val body = RequestBody.create("application/json".toMediaType(), JsonUtil.toJson(parameters)) val request = Request.Builder().url(url).post(body) retryIfNeeded(4) { OnionRequestAPI.sendOnionRequest(request.build(), server, PushNotificationAPI.serverPublicKey, Version.V2).map { response -> diff --git a/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroup.kt b/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroup.kt index 80a9a1e50..7743cd817 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroup.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroup.kt @@ -1,6 +1,7 @@ package org.session.libsession.messaging.open_groups import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import org.session.libsignal.utilities.JsonUtil import org.session.libsignal.utilities.Log import java.util.Locale @@ -47,11 +48,11 @@ data class OpenGroup( } fun getServer(urlAsString: String): HttpUrl? { - val url = HttpUrl.parse(urlAsString) ?: return null - val builder = HttpUrl.Builder().scheme(url.scheme()).host(url.host()) - if (url.port() != 80 || url.port() != 443) { + val url = urlAsString.toHttpUrlOrNull() ?: return null + val builder = HttpUrl.Builder().scheme(url.scheme).host(url.host) + if (url.port != 80 || url.port != 443) { // Non-standard port; add to server - builder.port(url.port()) + builder.port(url.port) } return builder.build() } diff --git a/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupApi.kt b/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupApi.kt index dc6d1475f..ffac741c1 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupApi.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/open_groups/OpenGroupApi.kt @@ -14,8 +14,11 @@ import kotlinx.coroutines.flow.MutableSharedFlow import nl.komponents.kovenant.Promise import nl.komponents.kovenant.functional.map import okhttp3.Headers +import okhttp3.Headers.Companion.toHeaders import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.MediaType +import okhttp3.MediaType.Companion.toMediaType import okhttp3.RequestBody import org.session.libsession.messaging.MessagingModuleConfiguration import org.session.libsession.messaging.sending_receiving.pollers.OpenGroupPoller.Companion.maxInactivityPeriod @@ -283,10 +286,10 @@ object OpenGroupApi { ) private fun createBody(body: ByteArray?, parameters: Any?): RequestBody? { - if (body != null) return RequestBody.create(MediaType.get("application/octet-stream"), body) + if (body != null) return RequestBody.create("application/octet-stream".toMediaType(), body) if (parameters == null) return null val parametersAsJSON = JsonUtil.toJson(parameters) - return RequestBody.create(MediaType.get("application/json"), parametersAsJSON) + return RequestBody.create("application/json".toMediaType(), parametersAsJSON) } private fun getResponseBody(request: Request): Promise { @@ -302,7 +305,7 @@ object OpenGroupApi { } private fun send(request: Request): Promise { - HttpUrl.parse(request.server) ?: return Promise.ofFail(Error.InvalidURL) + request.server.toHttpUrlOrNull() ?: return Promise.ofFail(Error.InvalidURL) val urlBuilder = StringBuilder("${request.server}/${request.endpoint.value}") if (request.verb == GET && request.queryParameters.isNotEmpty()) { urlBuilder.append("?") @@ -389,7 +392,7 @@ object OpenGroupApi { val requestBuilder = okhttp3.Request.Builder() .url(urlRequest) - .headers(Headers.of(headers)) + .headers(headers.toHeaders()) when (request.verb) { GET -> requestBuilder.get() PUT -> requestBuilder.put(createBody(request.body, request.parameters)!!) diff --git a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/notifications/PushNotificationAPI.kt b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/notifications/PushNotificationAPI.kt index f793cd6e4..33add59e8 100644 --- a/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/notifications/PushNotificationAPI.kt +++ b/libsession/src/main/java/org/session/libsession/messaging/sending_receiving/notifications/PushNotificationAPI.kt @@ -3,6 +3,7 @@ package org.session.libsession.messaging.sending_receiving.notifications import android.annotation.SuppressLint import nl.komponents.kovenant.functional.map import okhttp3.MediaType +import okhttp3.MediaType.Companion.toMediaType import okhttp3.Request import okhttp3.RequestBody import org.session.libsession.messaging.MessagingModuleConfiguration @@ -36,7 +37,7 @@ object PushNotificationAPI { fun unregister(token: String) { val parameters = mapOf( "token" to token ) val url = "$server/unregister" - val body = RequestBody.create(MediaType.get("application/json"), JsonUtil.toJson(parameters)) + val body = RequestBody.create("application/json".toMediaType(), JsonUtil.toJson(parameters)) val request = Request.Builder().url(url).post(body) retryIfNeeded(maxRetryCount) { OnionRequestAPI.sendOnionRequest(request.build(), server, serverPublicKey, Version.V2).map { response -> @@ -64,7 +65,7 @@ object PushNotificationAPI { if (!force && token == oldToken && System.currentTimeMillis() - lastUploadDate < tokenExpirationInterval) { return } val parameters = mapOf( "token" to token, "pubKey" to publicKey ) val url = "$server/register" - val body = RequestBody.create(MediaType.get("application/json"), JsonUtil.toJson(parameters)) + val body = RequestBody.create("application/json".toMediaType(), JsonUtil.toJson(parameters)) val request = Request.Builder().url(url).post(body) retryIfNeeded(maxRetryCount) { OnionRequestAPI.sendOnionRequest(request.build(), server, serverPublicKey, Version.V2).map { response -> @@ -91,7 +92,7 @@ object PushNotificationAPI { if (!TextSecurePreferences.isUsingFCM(context)) { return } val parameters = mapOf( "closedGroupPublicKey" to closedGroupPublicKey, "pubKey" to publicKey ) val url = "$server/${operation.rawValue}" - val body = RequestBody.create(MediaType.get("application/json"), JsonUtil.toJson(parameters)) + val body = RequestBody.create("application/json".toMediaType(), JsonUtil.toJson(parameters)) val request = Request.Builder().url(url).post(body) retryIfNeeded(maxRetryCount) { OnionRequestAPI.sendOnionRequest(request.build(), server, serverPublicKey, Version.V2).map { response -> diff --git a/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt b/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt index 087c8e29d..0ee34020d 100644 --- a/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt +++ b/libsession/src/main/java/org/session/libsession/snode/OnionRequestAPI.kt @@ -466,9 +466,11 @@ object OnionRequestAPI { x25519PublicKey: String, version: Version = Version.V4 ): Promise { - val url = request.url() + val url = request.url val payload = generatePayload(request, server, version) - val destination = Destination.Server(url.host(), version.value, x25519PublicKey, url.scheme(), url.port()) + val destination = Destination.Server(url.host, version.value, x25519PublicKey, + url.scheme, url.port + ) return sendOnionRequest(destination, payload, version).recover { exception -> Log.d("Loki", "Couldn't reach server: $url due to error: $exception.") throw exception @@ -477,7 +479,7 @@ object OnionRequestAPI { private fun generatePayload(request: Request, server: String, version: Version): ByteArray { val headers = request.getHeadersForOnionRequest().toMutableMap() - val url = request.url() + val url = request.url val urlAsString = url.toString() val body = request.getBodyForOnionRequest() ?: "null" val endpoint = when { @@ -485,19 +487,19 @@ object OnionRequestAPI { else -> "" } return if (version == Version.V4) { - if (request.body() != null && + if (request.body != null && headers.keys.find { it.equals("Content-Type", true) } == null) { headers["Content-Type"] = "application/json" } val requestPayload = mapOf( "endpoint" to endpoint, - "method" to request.method(), + "method" to request.method, "headers" to headers ) val requestData = JsonUtil.toJson(requestPayload).toByteArray() val prefixData = "l${requestData.size}:".toByteArray(Charsets.US_ASCII) val suffixData = "e".toByteArray(Charsets.US_ASCII) - if (request.body() != null) { + if (request.body != null) { val bodyData = if (body is ByteArray) body else body.toString().toByteArray() val bodyLengthData = "${bodyData.size}:".toByteArray(Charsets.US_ASCII) prefixData + requestData + bodyLengthData + bodyData + suffixData @@ -508,7 +510,7 @@ object OnionRequestAPI { val payload = mapOf( "body" to body, "endpoint" to endpoint.removePrefix("/"), - "method" to request.method(), + "method" to request.method, "headers" to headers ) JsonUtil.toJson(payload).toByteArray() diff --git a/libsession/src/main/java/org/session/libsession/snode/utilities/OKHTTPUtilities.kt b/libsession/src/main/java/org/session/libsession/snode/utilities/OKHTTPUtilities.kt index 4c08c4791..9d86d3555 100644 --- a/libsession/src/main/java/org/session/libsession/snode/utilities/OKHTTPUtilities.kt +++ b/libsession/src/main/java/org/session/libsession/snode/utilities/OKHTTPUtilities.kt @@ -9,11 +9,11 @@ import java.util.Locale internal fun Request.getHeadersForOnionRequest(): Map { val result = mutableMapOf() - val contentType = body()?.contentType() + val contentType = body?.contentType() if (contentType != null) { result["content-type"] = contentType.toString() } - val headers = headers() + val headers = headers for (name in headers.names()) { val value = headers.get(name) if (value != null) { @@ -33,7 +33,7 @@ internal fun Request.getBodyForOnionRequest(): Any? { try { val copyOfThis = newBuilder().build() val buffer = Buffer() - val body = copyOfThis.body() ?: return null + val body = copyOfThis.body ?: return null body.writeTo(buffer) val bodyAsData = buffer.readByteArray() if (body is MultipartBody) { diff --git a/libsession/src/main/java/org/session/libsession/utilities/DownloadUtilities.kt b/libsession/src/main/java/org/session/libsession/utilities/DownloadUtilities.kt index b850baa25..44ce82802 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/DownloadUtilities.kt +++ b/libsession/src/main/java/org/session/libsession/utilities/DownloadUtilities.kt @@ -1,6 +1,7 @@ package org.session.libsession.utilities import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import org.session.libsession.messaging.file_server.FileServerApi import org.session.libsignal.utilities.HTTP import org.session.libsignal.utilities.Log @@ -34,8 +35,8 @@ object DownloadUtilities { */ @JvmStatic fun downloadFile(outputStream: OutputStream, urlAsString: String) { - val url = HttpUrl.parse(urlAsString)!! - val fileID = url.pathSegments().last() + val url = urlAsString.toHttpUrlOrNull()!! + val fileID = url.pathSegments.last() try { FileServerApi.download(fileID).get().let { outputStream.write(it) diff --git a/libsession/src/main/java/org/session/libsession/utilities/OpenGroupUrlParser.kt b/libsession/src/main/java/org/session/libsession/utilities/OpenGroupUrlParser.kt index d39128d5d..32df359c4 100644 --- a/libsession/src/main/java/org/session/libsession/utilities/OpenGroupUrlParser.kt +++ b/libsession/src/main/java/org/session/libsession/utilities/OpenGroupUrlParser.kt @@ -1,6 +1,7 @@ package org.session.libsession.utilities import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import org.session.libsession.messaging.open_groups.migrateLegacyServerUrl object OpenGroupUrlParser { @@ -19,10 +20,10 @@ object OpenGroupUrlParser { // URL has to start with 'http://' val urlWithPrefix = if (!string.startsWith("http")) "http://$string" else string // If the URL is malformed, throw an exception - val url = HttpUrl.parse(urlWithPrefix) ?: throw Error.MalformedURL + val url = urlWithPrefix.toHttpUrlOrNull() ?: throw Error.MalformedURL // Parse components - val server = HttpUrl.Builder().scheme(url.scheme()).host(url.host()).port(url.port()).build().toString().removeSuffix(suffix).migrateLegacyServerUrl() - val room = url.pathSegments().firstOrNull { !it.isNullOrEmpty() } ?: throw Error.NoRoom + val server = HttpUrl.Builder().scheme(url.scheme).host(url.host).port(url.port).build().toString().removeSuffix(suffix).migrateLegacyServerUrl() + val room = url.pathSegments.firstOrNull { !it.isNullOrEmpty() } ?: throw Error.NoRoom val publicKey = url.queryParameter(queryPrefix) ?: throw Error.NoPublicKey if (publicKey.length != 64) throw Error.InvalidPublicKey // Return diff --git a/libsignal/build.gradle b/libsignal/build.gradle index 1ea5f2de0..1b6c818ed 100644 --- a/libsignal/build.gradle +++ b/libsignal/build.gradle @@ -20,6 +20,7 @@ dependencies { implementation "com.fasterxml.jackson.core:jackson-databind:$jacksonDatabindVersion" implementation "com.github.oxen-io.session-android-curve-25519:curve25519-java:$curve25519Version" implementation "com.squareup.okhttp3:okhttp:$okhttpVersion" + implementation "com.squareup.okhttp3:okhttp-dnsoverhttps:$okhttpVersion" implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion" implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlinVersion" implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:$coroutinesVersion" diff --git a/libsignal/src/main/java/org/session/libsignal/utilities/HTTP.kt b/libsignal/src/main/java/org/session/libsignal/utilities/HTTP.kt index 5eac7cecd..7474f47f8 100644 --- a/libsignal/src/main/java/org/session/libsignal/utilities/HTTP.kt +++ b/libsignal/src/main/java/org/session/libsignal/utilities/HTTP.kt @@ -1,10 +1,14 @@ package org.session.libsignal.utilities +import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.MediaType +import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.RequestBody import okhttp3.Response +import okhttp3.dnsoverhttps.DnsOverHttps +import java.net.InetAddress import java.security.SecureRandom import java.security.cert.X509Certificate import java.util.concurrent.TimeUnit @@ -15,7 +19,13 @@ object HTTP { var isConnectedToNetwork: (() -> Boolean) = { false } private val seedNodeConnection by lazy { - OkHttpClient().newBuilder() + val bootstrapClient = OkHttpClient.Builder().build() + val dns =DnsOverHttps.Builder().client(bootstrapClient) + .url("https://1.1.1.1/dns-query".toHttpUrl()) + .bootstrapDnsHosts(InetAddress.getByName("8.8.4.4"), InetAddress.getByName("8.8.8.8")) + .build() + bootstrapClient.newBuilder() + .dns(dns) .callTimeout(timeout, TimeUnit.SECONDS) .connectTimeout(timeout, TimeUnit.SECONDS) .readTimeout(timeout, TimeUnit.SECONDS) @@ -33,7 +43,13 @@ object HTTP { } val sslContext = SSLContext.getInstance("SSL") sslContext.init(null, arrayOf( trustManager ), SecureRandom()) - OkHttpClient().newBuilder() + val bootstrapClient = OkHttpClient.Builder().build() + val dns = DnsOverHttps.Builder().client(bootstrapClient) + .url("https://1.1.1.1/dns-query".toHttpUrl()) + .bootstrapDnsHosts(InetAddress.getByName("8.8.4.4"), InetAddress.getByName("8.8.8.8")) + .build() + bootstrapClient.newBuilder() + .dns(dns) .sslSocketFactory(sslContext.socketFactory, trustManager) .hostnameVerifier { _, _ -> true } .callTimeout(timeout, TimeUnit.SECONDS) @@ -53,7 +69,13 @@ object HTTP { } val sslContext = SSLContext.getInstance("SSL") sslContext.init(null, arrayOf( trustManager ), SecureRandom()) - return OkHttpClient().newBuilder() + val bootstrapClient = OkHttpClient.Builder().build() + val dns =DnsOverHttps.Builder().client(bootstrapClient) + .url("https://1.1.1.1/dns-query".toHttpUrl()) + .bootstrapDnsHosts(InetAddress.getByName("8.8.4.4"), InetAddress.getByName("8.8.8.8")) + .build() + return bootstrapClient.newBuilder() + .dns(dns) .sslSocketFactory(sslContext.socketFactory, trustManager) .hostnameVerifier { _, _ -> true } .callTimeout(timeout, TimeUnit.SECONDS) @@ -106,7 +128,7 @@ object HTTP { Verb.GET -> request.get() Verb.PUT, Verb.POST -> { if (body == null) { throw Exception("Invalid request body.") } - val contentType = MediaType.get("application/json; charset=utf-8") + val contentType = "application/json; charset=utf-8".toMediaType() @Suppress("NAME_SHADOWING") val body = RequestBody.create(contentType, body) if (verb == Verb.PUT) request.put(body) else request.post(body) } @@ -131,9 +153,9 @@ object HTTP { // Override the actual error so that we can correctly catch failed requests in OnionRequestAPI throw HTTPRequestFailedException(0, null, "HTTP request failed due to: ${exception.message}") } - return when (val statusCode = response.code()) { + return when (val statusCode = response.code) { 200 -> { - response.body()?.bytes() ?: throw Exception("An error occurred.") + response.body?.bytes() ?: throw Exception("An error occurred.") } else -> { Log.d("Loki", "${verb.rawValue} request to $url failed with status code: $statusCode.") From e21bef902baea9725a201b63b0e60185f67ac795 Mon Sep 17 00:00:00 2001 From: chenjia404 Date: Thu, 29 Jun 2023 17:09:41 +0800 Subject: [PATCH 2/3] Compatible with okhttp4 --- .../conversation/v2/messages/VisibleMessageContentView.kt | 3 ++- .../org/thoughtcrime/securesms/groups/OpenGroupManager.kt | 5 +++-- .../notifications/LokiPushNotificationManager.kt | 8 +++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt index 75a3c5875..9645148e0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/messages/VisibleMessageContentView.kt @@ -25,6 +25,7 @@ import androidx.core.view.isVisible import network.loki.messenger.R import network.loki.messenger.databinding.ViewVisibleMessageContentBinding import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import org.session.libsession.messaging.MessagingModuleConfiguration import org.session.libsession.messaging.sending_receiving.attachments.AttachmentTransferProgress import org.session.libsession.messaging.sending_receiving.attachments.DatabaseAttachment @@ -284,7 +285,7 @@ class VisibleMessageContentView : ConstraintLayout { // replace URLSpans with ModalURLSpans body.getSpans(0, body.length).toList().forEach { urlSpan -> - val updatedUrl = urlSpan.url.let { HttpUrl.parse(it).toString() } + val updatedUrl = urlSpan.url.let { it.toHttpUrlOrNull().toString() } val replacementSpan = ModalURLSpan(updatedUrl) { url -> val activity = context as AppCompatActivity ModalUrlBottomSheet(url).show(activity.supportFragmentManager, "Open URL Dialog") diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/OpenGroupManager.kt b/app/src/main/java/org/thoughtcrime/securesms/groups/OpenGroupManager.kt index dbdf2615a..d74dd3be4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/OpenGroupManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/OpenGroupManager.kt @@ -3,6 +3,7 @@ package org.thoughtcrime.securesms.groups import android.content.Context import androidx.annotation.WorkerThread import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import org.session.libsession.messaging.MessagingModuleConfiguration import org.session.libsession.messaging.open_groups.GroupMemberRole import org.session.libsession.messaging.open_groups.OpenGroup @@ -133,9 +134,9 @@ object OpenGroupManager { } fun addOpenGroup(urlAsString: String, context: Context): OpenGroupApi.RoomInfo? { - val url = HttpUrl.parse(urlAsString) ?: return null + val url = urlAsString.toHttpUrlOrNull() ?: return null val server = OpenGroup.getServer(urlAsString) - val room = url.pathSegments().firstOrNull() ?: return null + val room = url.pathSegments.firstOrNull() ?: return null val publicKey = url.queryParameter("public_key") ?: return null return add(server.toString().removeSuffix("/"), room, publicKey, context) // assume migrated from calling function diff --git a/app/src/main/java/org/thoughtcrime/securesms/notifications/LokiPushNotificationManager.kt b/app/src/main/java/org/thoughtcrime/securesms/notifications/LokiPushNotificationManager.kt index adaec0e17..8b8efa670 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/notifications/LokiPushNotificationManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/notifications/LokiPushNotificationManager.kt @@ -4,8 +4,10 @@ import android.content.Context import nl.komponents.kovenant.Promise import nl.komponents.kovenant.functional.map import okhttp3.MediaType +import okhttp3.MediaType.Companion.toMediaType import okhttp3.Request import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody import org.session.libsession.messaging.sending_receiving.notifications.PushNotificationAPI import org.session.libsession.snode.OnionRequestAPI import org.session.libsession.snode.Version @@ -42,7 +44,7 @@ object LokiPushNotificationManager { fun unregister(token: String, context: Context) { val parameters = mapOf( "token" to token ) val url = "$server/unregister" - val body = RequestBody.create(MediaType.get("application/json"), JsonUtil.toJson(parameters)) + val body = RequestBody.create("application/json".toMediaType(), JsonUtil.toJson(parameters)) val request = Request.Builder().url(url).post(body) retryIfNeeded(maxRetryCount) { getResponseBody(request.build()).map { json -> @@ -71,7 +73,7 @@ object LokiPushNotificationManager { if (!force && token == oldToken && System.currentTimeMillis() - lastUploadDate < tokenExpirationInterval) { return } val parameters = mapOf( "token" to token, "pubKey" to publicKey ) val url = "$server/register" - val body = RequestBody.create(MediaType.get("application/json"), JsonUtil.toJson(parameters)) + val body = JsonUtil.toJson(parameters).toRequestBody("application/json".toMediaType()) val request = Request.Builder().url(url).post(body) retryIfNeeded(maxRetryCount) { getResponseBody(request.build()).map { json -> @@ -99,7 +101,7 @@ object LokiPushNotificationManager { if (!TextSecurePreferences.isUsingFCM(context)) { return } val parameters = mapOf( "closedGroupPublicKey" to closedGroupPublicKey, "pubKey" to publicKey ) val url = "$server/${operation.rawValue}" - val body = RequestBody.create(MediaType.get("application/json"), JsonUtil.toJson(parameters)) + val body = RequestBody.create("application/json".toMediaType(), JsonUtil.toJson(parameters)) val request = Request.Builder().url(url).post(body) retryIfNeeded(maxRetryCount) { getResponseBody(request.build()).map { json -> From fbe29a558aeca78569bccb26bfe0a619a5b2cb06 Mon Sep 17 00:00:00 2001 From: chenjia404 Date: Thu, 29 Jun 2023 17:46:35 +0800 Subject: [PATCH 3/3] chenge to quad9 --- .../src/main/java/org/session/libsignal/utilities/HTTP.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libsignal/src/main/java/org/session/libsignal/utilities/HTTP.kt b/libsignal/src/main/java/org/session/libsignal/utilities/HTTP.kt index 7474f47f8..621f92ff5 100644 --- a/libsignal/src/main/java/org/session/libsignal/utilities/HTTP.kt +++ b/libsignal/src/main/java/org/session/libsignal/utilities/HTTP.kt @@ -21,7 +21,7 @@ object HTTP { private val seedNodeConnection by lazy { val bootstrapClient = OkHttpClient.Builder().build() val dns =DnsOverHttps.Builder().client(bootstrapClient) - .url("https://1.1.1.1/dns-query".toHttpUrl()) + .url("https://dns.quad9.net/dns-query".toHttpUrl()) .bootstrapDnsHosts(InetAddress.getByName("8.8.4.4"), InetAddress.getByName("8.8.8.8")) .build() bootstrapClient.newBuilder() @@ -45,7 +45,7 @@ object HTTP { sslContext.init(null, arrayOf( trustManager ), SecureRandom()) val bootstrapClient = OkHttpClient.Builder().build() val dns = DnsOverHttps.Builder().client(bootstrapClient) - .url("https://1.1.1.1/dns-query".toHttpUrl()) + .url("https://dns.quad9.net/dns-query".toHttpUrl()) .bootstrapDnsHosts(InetAddress.getByName("8.8.4.4"), InetAddress.getByName("8.8.8.8")) .build() bootstrapClient.newBuilder() @@ -71,7 +71,7 @@ object HTTP { sslContext.init(null, arrayOf( trustManager ), SecureRandom()) val bootstrapClient = OkHttpClient.Builder().build() val dns =DnsOverHttps.Builder().client(bootstrapClient) - .url("https://1.1.1.1/dns-query".toHttpUrl()) + .url("https://dns.quad9.net/dns-query".toHttpUrl()) .bootstrapDnsHosts(InetAddress.getByName("8.8.4.4"), InetAddress.getByName("8.8.8.8")) .build() return bootstrapClient.newBuilder()