fix(pt/betteranime): Fix crashes + fix auto-login (#3270)

This commit is contained in:
Claudemirovsky 2024-05-28 10:14:47 +00:00 committed by GitHub
parent d0b60afd47
commit c3f60e04d5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 28 additions and 5 deletions

View File

@ -1,7 +1,7 @@
ext { ext {
extName = 'Better Anime' extName = 'Better Anime'
extClass = '.BetterAnime' extClass = '.BetterAnime'
extVersionCode = 9 extVersionCode = 10
} }
apply from: "$rootDir/common.gradle" apply from: "$rootDir/common.gradle"

View File

@ -11,6 +11,7 @@ import android.webkit.WebView
import android.webkit.WebViewClient import android.webkit.WebViewClient
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.io.ByteArrayInputStream import java.io.ByteArrayInputStream
@ -60,14 +61,25 @@ internal class RecaptchaV3Bypasser(private val client: OkHttpClient, private val
} }
} }
override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
if (url != null) {
if (url.startsWith("data:")) return false
if (url.startsWith("intent:")) return true
val domain = url.toHttpUrl().host
return !ALLOWED_HOSTS.contains(domain)
}
return true
}
override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? { override fun shouldInterceptRequest(view: WebView?, request: WebResourceRequest?): WebResourceResponse? {
val url = request?.url.toString() val url = request?.url.toString()
val reqHeaders = request?.requestHeaders.orEmpty() val reqHeaders = request?.requestHeaders.orEmpty()
// Our beloved token // Our beloved token
if (url.contains("/recaptcha/api2/anchor")) { if (url.contains("/recaptcha/api2/anchor") || url.contains("/recaptcha/api2/bframe")) {
// Injects the script to click on the captcha box // Injects the script to click on the captcha box
return injectScripts(url, reqHeaders, CLICK_BOX_SCRIPT, INTERCEPTOR_SCRIPT) return injectScripts(url, reqHeaders, CLICK_BOX_SCRIPT, INTERCEPTOR_SCRIPT)
} else if (reqHeaders.get("Accept").orEmpty().contains("text/html")) { } else if (reqHeaders.get("Accept").orEmpty().contains("text/html") && !url.startsWith("intent")) {
// Injects the XMLHttpRequest hack // Injects the XMLHttpRequest hack
return injectScripts(url, reqHeaders, INTERCEPTOR_SCRIPT) return injectScripts(url, reqHeaders, INTERCEPTOR_SCRIPT)
} }
@ -94,9 +106,11 @@ internal class RecaptchaV3Bypasser(private val client: OkHttpClient, private val
.mapValues { it.value.getOrNull(0) ?: "" } .mapValues { it.value.getOrNull(0) ?: "" }
.toMutableMap() .toMutableMap()
.apply { .apply {
remove("cross-origin-embedder-policy")
remove("content-security-policy") remove("content-security-policy")
remove("cross-origin-embedder-policy")
remove("cross-origin-resource-policy")
remove("report-to") remove("report-to")
remove("x-xss-protection")
} }
private fun injectScripts( private fun injectScripts(
@ -149,7 +163,16 @@ window.XMLHttpRequest.prototype.open = function(_unused_method, url, _unused_arg
private const val CLICK_BOX_SCRIPT = """ private const val CLICK_BOX_SCRIPT = """
<script type="text/javascript"> <script type="text/javascript">
setInterval(async () => { setInterval(async () => {
const items = document.querySelectorAll("#recaptcha-anchor, .recaptcha-checkbox, #rc-anchor-container span[role=checkbox]") const items = document.querySelectorAll(".recaptcha-checkbox-checkmark, #recaptcha-anchor, .recaptcha-checkbox, #rc-anchor-container span[role=checkbox]")
items.forEach(x => {try { x.click() } catch (e) {} }) items.forEach(x => {try { x.click() } catch (e) {} })
}, 500) }, 500)
</script>""" </script>"""
private val ALLOWED_HOSTS = listOf(
"www.google.com",
"betteranime.net",
"fonts.googleapis.com",
"cdnjs.cloudflare.com",
"cdn.jsdelivr.net",
"www.gstatic.com",
)