Mangabuff: fix (#8537)

This commit is contained in:
Dr1ks 2025-04-20 08:28:14 +07:00 committed by Draff
parent 37e0aaeb75
commit b59238f938
No known key found for this signature in database
GPG Key ID: E8A89F3211677653
2 changed files with 34 additions and 30 deletions

View File

@ -1,8 +1,8 @@
ext {
extName = 'MangaBuff'
extClass = '.MangaBuff'
extVersionCode = 1
isNsfw = false
extVersionCode = 2
isNsfw = true
}
apply from: "$rootDir/common.gradle"

View File

@ -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