From b59238f9383f570890dad6de26db009176683849 Mon Sep 17 00:00:00 2001 From: Dr1ks Date: Sun, 20 Apr 2025 08:28:14 +0700 Subject: [PATCH] Mangabuff: fix (#8537) --- src/ru/mangabuff/build.gradle | 4 +- .../extension/ru/mangabuff/MangaBuff.kt | 60 ++++++++++--------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/src/ru/mangabuff/build.gradle b/src/ru/mangabuff/build.gradle index 7d7449c6d..ecc1b915a 100644 --- a/src/ru/mangabuff/build.gradle +++ b/src/ru/mangabuff/build.gradle @@ -1,8 +1,8 @@ ext { extName = 'MangaBuff' extClass = '.MangaBuff' - extVersionCode = 1 - isNsfw = false + extVersionCode = 2 + isNsfw = true } apply from: "$rootDir/common.gradle" diff --git a/src/ru/mangabuff/src/eu/kanade/tachiyomi/extension/ru/mangabuff/MangaBuff.kt b/src/ru/mangabuff/src/eu/kanade/tachiyomi/extension/ru/mangabuff/MangaBuff.kt index 4d58f0366..aff8abb7e 100644 --- a/src/ru/mangabuff/src/eu/kanade/tachiyomi/extension/ru/mangabuff/MangaBuff.kt +++ b/src/ru/mangabuff/src/eu/kanade/tachiyomi/extension/ru/mangabuff/MangaBuff.kt @@ -10,6 +10,7 @@ import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.online.ParsedHttpSource +import eu.kanade.tachiyomi.util.asJsoup import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json @@ -23,6 +24,7 @@ import org.jsoup.nodes.Document import org.jsoup.nodes.Element import rx.Observable import uy.kohesive.injekt.injectLazy +import java.io.IOException import java.text.SimpleDateFormat import java.util.Locale @@ -45,47 +47,49 @@ class MangaBuff : ParsedHttpSource() { val request = chain.request() if (request.method == "POST" && request.header("X-CSRF-TOKEN") == null) { - val newRequest = request.newBuilder() val token = getToken() - val response = chain.proceed( - newRequest - .addHeader("X-CSRF-TOKEN", token) - .build(), - ) + val newRequest = request.newBuilder() + .header("X-Requested-With", "XMLHttpRequest") + .header("X-CSRF-TOKEN", token) + .build() + + val response = chain.proceed(newRequest) if (response.code == 419) { response.close() - storedToken = null // reset the token - val newToken = getToken() - return chain.proceed( - newRequest - .addHeader("X-CSRF-TOKEN", newToken) - .build(), - ) + storedToken = null + val retryToken = getToken() + val retryRequest = request.newBuilder() + .header("X-Requested-With", "XMLHttpRequest") + .header("X-CSRF-TOKEN", retryToken) + .build() + return chain.proceed(retryRequest) } return response } - val response = chain.proceed(request) - - if (response.header("Content-Type")?.contains("text/html") != true) { - return response - } - - storedToken = Jsoup.parse(response.peekBody(Long.MAX_VALUE).string()) - .selectFirst("head meta[name*=csrf-token]") - ?.attr("content") - - return response + return chain.proceed(request) } private fun getToken(): String { - if (storedToken.isNullOrEmpty()) { - val request = GET(baseUrl, headers) - client.newCall(request).execute().close() // updates token in interceptor + storedToken?.let { return it } + + val request = GET(baseUrl, headers) + val response = client.newCall(request).execute() + + response.use { + val document = it.asJsoup() + val token = document.select("head meta[name*=csrf-token]") + .attr("content") + + if (token.isEmpty()) { + throw IOException("Unable to find CSRF token") + } + + storedToken = token + return token } - return storedToken!! } // Popular