Zaimanhua: fix authIntercept bug (#10533)

When the request header changes, the new request should not use outdate cache.

Also, clear the token in `apiHeaders` when username or password changed.
This commit is contained in:
zhongfly 2025-09-19 14:51:17 +08:00 committed by Draff
parent a7408115ed
commit 128c4a4194
Signed by: Draff
GPG Key ID: E8A89F3211677653
2 changed files with 14 additions and 9 deletions

View File

@ -1,7 +1,7 @@
ext {
extName = 'Zaimanhua'
extClass = '.Zaimanhua'
extVersionCode = 13
extVersionCode = 14
isNsfw = false
}

View File

@ -63,18 +63,18 @@ class Zaimanhua : HttpSource(), ConfigurableSource {
private fun authIntercept(chain: Interceptor.Chain): Response {
val request = chain.request()
if (request.url.host != "v4api.zaimanhua.com" ||
(!request.headers["authorization"].isNullOrBlank() && !request.url.toString().contains(checkTokenRegex))
) {
return chain.proceed(request)
}
val response = chain.proceed(request)
if (!request.headers["authorization"].isNullOrBlank() && response.peekBody(Long.MAX_VALUE).string().parseAs<ResponseDto<DataWrapperDto<CanReadDto>>>().data.data?.canRead != false) {
// Only intercept chapter api requests that need token
if (!request.url.toString().contains(checkTokenRegex)) return response
// If chapter can read, return directly
if (response.peekBody(Long.MAX_VALUE).string().parseAs<ResponseDto<DataWrapperDto<CanReadDto>>>().data.data?.canRead != false) {
return response
}
// If can not read, need login or user permission is not enough
var token: String = preferences.getString(TOKEN_PREF, "")!!
if (!isValid(token)) {
// Token is invalid, need login
val username = preferences.getString(USERNAME_PREF, "")!!
val password = preferences.getString(PASSWORD_PREF, "")!!
token = getToken(username, password)
@ -87,12 +87,15 @@ class Zaimanhua : HttpSource(), ConfigurableSource {
preferences.edit().putString(TOKEN_PREF, token).apply()
apiHeaders = apiHeaders.newBuilder().setToken(token).build()
}
} else if (!request.headers["authorization"].isNullOrBlank() && request.headers["authorization"] == "Bearer $token") {
} else if (request.header("authorization") == "Bearer $token") {
// The request has already used a valid token, return directly
return response
}
response.close()
val authRequest = request.newBuilder().apply {
header("authorization", "Bearer $token")
cacheControl(CacheControl.FORCE_NETWORK)
}.build()
return chain.proceed(authRequest)
}
@ -334,6 +337,7 @@ class Zaimanhua : HttpSource(), ConfigurableSource {
setOnPreferenceChangeListener { _, _ ->
// clean token after username/password changed
preferences.edit().putString(TOKEN_PREF, "").apply()
apiHeaders = apiHeaders.newBuilder().setToken("").build()
true
}
}.let(screen::addPreference)
@ -345,6 +349,7 @@ class Zaimanhua : HttpSource(), ConfigurableSource {
setOnPreferenceChangeListener { _, _ ->
// clean token after username/password changed
preferences.edit().putString(TOKEN_PREF, "").apply()
apiHeaders = apiHeaders.newBuilder().setToken("").build()
true
}
}.let(screen::addPreference)