Fix the problem that the GSON dependency brought by the JWT library causes the APP to crash in picacomic extension (#19400)
* Update build.gradle remove jwt lib * Update Picacomic.kt Remove the effect of jwt library to fix the conflict from GSON * Update Picacomic.kt remove redundant code * Update build.gradle bump extension version * Make it more prescriptive * Improved compatibility with older versions * 1.switch to android.util.Base64 API to improved compatibility with older versions 2.Convert the literal constant named leeway from a method parameter to a private member constant, this will improve performance a bit...
This commit is contained in:
parent
a141b63420
commit
f9fd34a4d2
|
@ -6,12 +6,8 @@ ext {
|
|||
extName = 'Picacomic'
|
||||
pkgNameSuffix = 'zh.picacomic'
|
||||
extClass = '.Picacomic'
|
||||
extVersionCode = 2
|
||||
extVersionCode = 3
|
||||
isNsfw = true
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'com.auth0.android:jwtdecode:2.0.0'
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
||||
|
|
|
@ -2,10 +2,10 @@ package eu.kanade.tachiyomi.extension.zh.picacomic
|
|||
|
||||
import android.app.Application
|
||||
import android.content.SharedPreferences
|
||||
import android.util.Base64
|
||||
import androidx.preference.EditTextPreference
|
||||
import androidx.preference.ListPreference
|
||||
import androidx.preference.PreferenceScreen
|
||||
import com.auth0.android.jwt.JWT
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.network.POST
|
||||
import eu.kanade.tachiyomi.source.ConfigurableSource
|
||||
|
@ -26,17 +26,21 @@ import okhttp3.MediaType.Companion.toMediaType
|
|||
import okhttp3.Request
|
||||
import okhttp3.RequestBody.Companion.toRequestBody
|
||||
import okhttp3.Response
|
||||
import org.json.JSONObject
|
||||
import uy.kohesive.injekt.Injekt
|
||||
import uy.kohesive.injekt.api.get
|
||||
import java.net.URLEncoder
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Date
|
||||
import java.util.Locale
|
||||
import kotlin.math.floor
|
||||
|
||||
class Picacomic : HttpSource(), ConfigurableSource {
|
||||
override val lang = "zh"
|
||||
override val supportsLatest = true
|
||||
override val name = "哔咔漫画"
|
||||
override val baseUrl = "https://picaapi.picacomic.com"
|
||||
private val leeway: Long = 10
|
||||
|
||||
private val preferences: SharedPreferences =
|
||||
Injekt.get<Application>().getSharedPreferences("source_$id", 0x0000)
|
||||
|
@ -67,7 +71,7 @@ class Picacomic : HttpSource(), ConfigurableSource {
|
|||
|
||||
private val token: String by lazy {
|
||||
var t: String = preferences.getString("TOKEN", "")!!
|
||||
if (t.isEmpty() || JWT(t).isExpired(10)) {
|
||||
if (t.isEmpty() || isExpired(t)) {
|
||||
val username = preferences.getString("USERNAME", "")!!
|
||||
val password = preferences.getString("PASSWORD", "")!!
|
||||
if (username.isEmpty() || password.isEmpty()) {
|
||||
|
@ -80,6 +84,39 @@ class Picacomic : HttpSource(), ConfigurableSource {
|
|||
t
|
||||
}
|
||||
|
||||
private fun isExpired(token: String): Boolean {
|
||||
var parts: Array<String?> =
|
||||
token.split("\\.".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
|
||||
|
||||
if (parts.size == 2 && token.endsWith(".")) {
|
||||
parts = arrayOf(parts[0], parts[1], "")
|
||||
}
|
||||
if (parts.size != 3) {
|
||||
throw Exception(
|
||||
String.format(
|
||||
"token should have 3 parts, but now there's %s.",
|
||||
parts.size,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
val payload = parts[1]?.let { JSONObject(String(Base64.decode(it, Base64.DEFAULT))) }
|
||||
|
||||
val exp = payload?.getLong("exp")?.let {
|
||||
Date(it * 1000)
|
||||
}
|
||||
val iat = payload?.getLong("iat")?.let {
|
||||
Date(it * 1000)
|
||||
}
|
||||
|
||||
val todayTime = (floor((Date().time / 1000).toDouble()) * 1000).toLong() // truncate millis
|
||||
val futureToday = Date(todayTime + leeway * 1000)
|
||||
val pastToday = Date(todayTime - leeway * 1000)
|
||||
val expValid = exp == null || !pastToday.after(exp)
|
||||
val iatValid = iat == null || !futureToday.before(iat)
|
||||
return !expValid || !iatValid
|
||||
}
|
||||
|
||||
private fun picaHeaders(url: String, method: String = "GET"): Headers {
|
||||
val time = System.currentTimeMillis() / 1000
|
||||
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
|
||||
|
@ -193,7 +230,7 @@ class Picacomic : HttpSource(), ConfigurableSource {
|
|||
}
|
||||
|
||||
private fun hitBlocklist(comic: PicaSearchComic): Boolean {
|
||||
return (comic.tags ?: emptyList<String>() + comic.categories)
|
||||
return ((comic.tags ?: (emptyList<String>() + comic.categories)))
|
||||
.map(String::trim)
|
||||
.any { it in blocklist }
|
||||
}
|
||||
|
@ -235,7 +272,7 @@ class Picacomic : HttpSource(), ConfigurableSource {
|
|||
author = comic.author
|
||||
description = comic.description
|
||||
artist = comic.artist
|
||||
genre = (comic.tags ?: emptyList<String>() + comic.categories)
|
||||
genre = ((comic.tags ?: (emptyList<String>() + comic.categories)))
|
||||
.map(String::trim)
|
||||
.distinct()
|
||||
.joinToString(", ")
|
||||
|
|
Loading…
Reference in New Issue