diff --git a/CHANGELOG.md b/CHANGELOG.md index acfd540b6..b0494bb93 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ The format is a modified version of [Keep a Changelog](https://keepachangelog.co - Fix Pill not following the local text style ([@AntsyLich](https://github.com/AntsyLich)) ([`f8cb506`](https://github.com/mihonapp/mihon/commit/f8cb506)) - Fix downloader stopping after failing to create download directory of a manga ([@AntsyLich](https://github.com/AntsyLich)) ([#2068](https://github.com/mihonapp/mihon/pull/2068)) - Fix pressing `Enter` while searching also triggering navigation back on physical keyboards ([@AwkwardPeak7](https://github.com/AwkwardPeak7)) ([#2077](https://github.com/mihonapp/mihon/pull/2077)) +- Ensure app waits for Cloudflare challenge to complete before continuing ([@AwkwardPeak7](https://github.com/AwkwardPeak7)) ([#2200](https://github.com/mihonapp/mihon/pull/2200)) ### Removed - Remove Okhttp networking from WebView Screen ([@AwkwardPeak7](https://github.com/AwkwardPeak7)) ([#2020](https://github.com/mihonapp/mihon/pull/2020)) diff --git a/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt index 3522dea4f..e978a52cf 100644 --- a/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt +++ b/core/common/src/main/kotlin/eu/kanade/tachiyomi/network/interceptor/CloudflareInterceptor.kt @@ -2,8 +2,8 @@ package eu.kanade.tachiyomi.network.interceptor import android.annotation.SuppressLint import android.content.Context -import android.webkit.WebResourceError import android.webkit.WebResourceRequest +import android.webkit.WebResourceResponse import android.webkit.WebView import android.webkit.WebViewClient import android.widget.Toast @@ -16,6 +16,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Interceptor import okhttp3.Request import okhttp3.Response +import org.jsoup.Jsoup import tachiyomi.core.common.i18n.stringResource import tachiyomi.i18n.MR import java.io.IOException @@ -31,7 +32,18 @@ class CloudflareInterceptor( override fun shouldIntercept(response: Response): Boolean { // Check if Cloudflare anti-bot is on - return response.code in ERROR_CODES && response.header("Server") in SERVER_CHECK + return if (response.code in ERROR_CODES && response.header("Server") in SERVER_CHECK) { + val document = Jsoup.parse( + response.peekBody(Long.MAX_VALUE).string(), + response.request.url.toString(), + ) + + // solve with webview only on captcha, not on geo block + document.getElementById("challenge-error-title") != null || + document.getElementById("challenge-error-text") != null + } else { + false + } } override fun intercept( @@ -94,9 +106,13 @@ class CloudflareInterceptor( } } - override fun onReceivedError(view: WebView, request: WebResourceRequest, error: WebResourceError) { - if (request.isForMainFrame) { - if (error.errorCode in ERROR_CODES) { + override fun onReceivedHttpError( + view: WebView?, + request: WebResourceRequest?, + errorResponse: WebResourceResponse?, + ) { + if (request?.isForMainFrame == true) { + if (errorResponse?.statusCode in ERROR_CODES) { // Found the Cloudflare challenge page. challengeFound = true } else {