From e15934bdc62fe0b7251bda8c1f9524de0c2420dd Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 2 Mar 2023 18:36:46 +0200 Subject: [PATCH] Option to inore SSL errors --- .../org/koitharu/kotatsu/core/AppModule.kt | 3 ++ .../kotatsu/core/network/SSLBypass.kt | 30 +++++++++++++++++++ .../kotatsu/core/prefs/AppSettings.kt | 4 +++ .../settings/ContentSettingsFragment.kt | 5 ++++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_content.xml | 17 +++++++---- 6 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/core/network/SSLBypass.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt index 565f5f653..a02e42b42 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/AppModule.kt @@ -96,6 +96,9 @@ interface AppModule { writeTimeout(20, TimeUnit.SECONDS) cookieJar(cookieJar) dns(DoHManager(cache, settings)) + if (settings.isSSLBypassEnabled) { + bypassSSLErrors() + } cache(cache) addInterceptor(GZipInterceptor()) addInterceptor(commonHeadersInterceptor) diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/SSLBypass.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/SSLBypass.kt new file mode 100644 index 000000000..ed1221613 --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/SSLBypass.kt @@ -0,0 +1,30 @@ +package org.koitharu.kotatsu.core.network + +import android.annotation.SuppressLint +import okhttp3.OkHttpClient +import org.koitharu.kotatsu.utils.ext.printStackTraceDebug +import java.security.SecureRandom +import java.security.cert.X509Certificate +import javax.net.ssl.SSLContext +import javax.net.ssl.SSLSocketFactory +import javax.net.ssl.X509TrustManager + +@SuppressLint("CustomX509TrustManager") +fun OkHttpClient.Builder.bypassSSLErrors() = also { builder -> + runCatching { + val trustAllCerts = object : X509TrustManager { + override fun checkClientTrusted(chain: Array, authType: String) = Unit + + override fun checkServerTrusted(chain: Array, authType: String) = Unit + + override fun getAcceptedIssuers(): Array = emptyArray() + } + val sslContext = SSLContext.getInstance("SSL") + sslContext.init(null, arrayOf(trustAllCerts), SecureRandom()) + val sslSocketFactory: SSLSocketFactory = sslContext.socketFactory + builder.sslSocketFactory(sslSocketFactory, trustAllCerts) + builder.hostnameVerifier { _, _ -> true } + }.onFailure { + it.printStackTraceDebug() + } +} diff --git a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt index c63db4e66..2964b75ff 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -255,6 +255,9 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { val dnsOverHttps: DoHProvider get() = prefs.getEnumValue(KEY_DOH, DoHProvider.NONE) + val isSSLBypassEnabled: Boolean + get() = prefs.getBoolean(KEY_SSL_BYPASS, false) + var localListOrder: SortOrder get() = prefs.getEnumValue(KEY_LOCAL_LIST_ORDER, SortOrder.NEWEST) set(value) = prefs.edit { putEnumValue(KEY_LOCAL_LIST_ORDER, value) } @@ -380,6 +383,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { const val KEY_LOGS_SHARE = "logs_share" const val KEY_SOURCES_GRID = "sources_grid" const val KEY_UPDATES_UNSTABLE = "updates_unstable" + const val KEY_SSL_BYPASS = "ssl_bypass" // About const val KEY_APP_UPDATE = "app_update" diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt index 61da14d36..872caac79 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/ContentSettingsFragment.kt @@ -5,6 +5,7 @@ import android.os.Bundle import android.view.View import androidx.preference.ListPreference import androidx.preference.Preference +import com.google.android.material.snackbar.Snackbar import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.koitharu.kotatsu.R @@ -85,6 +86,10 @@ class ContentSettingsFragment : AppSettings.KEY_SOURCES_HIDDEN -> { bindRemoteSourcesSummary() } + + AppSettings.KEY_SSL_BYPASS -> { + Snackbar.make(listView, R.string.settings_apply_restart_required, Snackbar.LENGTH_INDEFINITE).show() + } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8f4f5e1ee..3c5494892 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -425,4 +425,5 @@ Propose updates to beta versions of the app Download started UserAgent header + Please restart the application to apply these changes diff --git a/app/src/main/res/xml/pref_content.xml b/app/src/main/res/xml/pref_content.xml index bf617ab66..cc679251b 100644 --- a/app/src/main/res/xml/pref_content.xml +++ b/app/src/main/res/xml/pref_content.xml @@ -20,12 +20,6 @@ android:title="@string/suggestions" app:allowDividerAbove="true" /> - - + + + +