From c4127cfbdd4301cbce22612def9fa7282cefe8af Mon Sep 17 00:00:00 2001 From: ZhendongWu Date: Mon, 21 Oct 2024 18:04:34 +0800 Subject: [PATCH] xfani: add preference to ignore ssl verify issue. --- .../animeextension/zh/xfani/Xfani.kt | 60 ++++++++++++++----- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/src/zh/xfani/src/eu/kanade/tachiyomi/animeextension/zh/xfani/Xfani.kt b/src/zh/xfani/src/eu/kanade/tachiyomi/animeextension/zh/xfani/Xfani.kt index 59578ddc..77a1e455 100644 --- a/src/zh/xfani/src/eu/kanade/tachiyomi/animeextension/zh/xfani/Xfani.kt +++ b/src/zh/xfani/src/eu/kanade/tachiyomi/animeextension/zh/xfani/Xfani.kt @@ -3,8 +3,10 @@ package eu.kanade.tachiyomi.animeextension.zh.xfani import android.annotation.SuppressLint import android.app.Application import android.content.SharedPreferences +import android.widget.Toast import androidx.preference.ListPreference import androidx.preference.PreferenceScreen +import androidx.preference.SwitchPreferenceCompat import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.model.AnimeFilter import eu.kanade.tachiyomi.animesource.model.AnimeFilterList @@ -20,6 +22,7 @@ import kotlinx.serialization.json.Json import kotlinx.serialization.json.jsonObject import kotlinx.serialization.json.jsonPrimitive import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Interceptor import okhttp3.MultipartBody import okhttp3.OkHttpClient import okhttp3.Request @@ -30,6 +33,7 @@ import uy.kohesive.injekt.injectLazy import java.security.SecureRandom import java.security.cert.X509Certificate import javax.net.ssl.SSLContext +import javax.net.ssl.SSLHandshakeException import javax.net.ssl.TrustManager import javax.net.ssl.X509TrustManager @@ -71,11 +75,23 @@ class Xfani : AnimeHttpSource(), ConfigurableAnimeSource { } override val client: OkHttpClient - get() = network.client.newBuilder().ignoreAllSSLErrors().build() + get() = if (preferences.getBoolean(PREF_KEY_IGNORE_SSL_ERROR, false)) { + network.client.newBuilder().ignoreAllSSLErrors().build() + } else { + network.client.newBuilder().addInterceptor(::checkSSLErrorInterceptor).build() + } private val selectedVideoSource get() = preferences.getString(PREF_KEY_VIDEO_SOURCE, DEFAULT_VIDEO_SOURCE)!!.toInt() + private fun checkSSLErrorInterceptor(chain: Interceptor.Chain): Response { + try { + return chain.proceed(chain.request()) + } catch (e: SSLHandshakeException) { + throw SSLHandshakeException("SSL证书验证异常,可以尝试在设置中忽略SSL验证问题。") + } + } + override fun animeDetailsParse(response: Response): SAnime { val jsoup = response.asJsoup() return SAnime.create().apply { @@ -221,24 +237,38 @@ class Xfani : AnimeHttpSource(), ConfigurableAnimeSource { } override fun setupPreferenceScreen(screen: PreferenceScreen) { - screen.addPreference( - ListPreference(screen.context).apply { - key = PREF_KEY_VIDEO_SOURCE - title = "请设置首选视频源线路" - entries = arrayOf("主线-1", "主线-2", "备用-1") - entryValues = arrayOf("0", "1", "2") - setDefaultValue(DEFAULT_VIDEO_SOURCE) - summary = "当前选择:${entries[selectedVideoSource]}" - setOnPreferenceChangeListener { _, newValue -> - summary = "当前选择 ${entries[(newValue as String).toInt()]}" - true - } - }, - ) + screen.apply { + addPreference( + ListPreference(screen.context).apply { + key = PREF_KEY_VIDEO_SOURCE + title = "请设置首选视频源线路" + entries = arrayOf("主线-1", "主线-2", "备用-1") + entryValues = arrayOf("0", "1", "2") + setDefaultValue(DEFAULT_VIDEO_SOURCE) + summary = "当前选择:${entries[selectedVideoSource]}" + setOnPreferenceChangeListener { _, newValue -> + summary = "当前选择 ${entries[(newValue as String).toInt()]}" + true + } + }, + ) + addPreference( + SwitchPreferenceCompat(screen.context).apply { + key = PREF_KEY_IGNORE_SSL_ERROR + title = "忽略SSL证书校验" + setDefaultValue(false) + setOnPreferenceChangeListener { _, _ -> + Toast.makeText(screen.context, "重启应用后生效", Toast.LENGTH_SHORT).show() + true + } + }, + ) + } } companion object { const val PREF_KEY_VIDEO_SOURCE = "PREF_KEY_VIDEO_SOURCE" + const val PREF_KEY_IGNORE_SSL_ERROR = "PREF_KEY_IGNORE_SSL_ERROR" const val DEFAULT_VIDEO_SOURCE = "0"