diff --git a/src/en/animepahe/build.gradle b/src/en/animepahe/build.gradle index 3fbfffea2..10eb74d81 100644 --- a/src/en/animepahe/build.gradle +++ b/src/en/animepahe/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'AnimePahe' extClass = '.AnimePahe' - extVersionCode = 26 + extVersionCode = 27 } apply from: "$rootDir/common.gradle" diff --git a/src/en/animepahe/src/eu/kanade/tachiyomi/animeextension/en/animepahe/AnimePahe.kt b/src/en/animepahe/src/eu/kanade/tachiyomi/animeextension/en/animepahe/AnimePahe.kt index 1c71fc577..f13f32279 100644 --- a/src/en/animepahe/src/eu/kanade/tachiyomi/animeextension/en/animepahe/AnimePahe.kt +++ b/src/en/animepahe/src/eu/kanade/tachiyomi/animeextension/en/animepahe/AnimePahe.kt @@ -39,6 +39,12 @@ class AnimePahe : ConfigurableAnimeSource, AnimeHttpSource() { Injekt.get().getSharedPreferences("source_$id", 0x0000) } + private val interceptor = DdosGuardInterceptor(network.client) + + override val client = network.client.newBuilder() + .addInterceptor(interceptor) + .build() + override val name = "AnimePahe" override val baseUrl by lazy { diff --git a/src/en/animepahe/src/eu/kanade/tachiyomi/animeextension/en/animepahe/DdosGuardInterceptor.kt b/src/en/animepahe/src/eu/kanade/tachiyomi/animeextension/en/animepahe/DdosGuardInterceptor.kt new file mode 100644 index 000000000..d19931e75 --- /dev/null +++ b/src/en/animepahe/src/eu/kanade/tachiyomi/animeextension/en/animepahe/DdosGuardInterceptor.kt @@ -0,0 +1,69 @@ +package eu.kanade.tachiyomi.animeextension.en.animepahe + +import android.webkit.CookieManager +import eu.kanade.tachiyomi.network.GET +import okhttp3.Cookie +import okhttp3.HttpUrl +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.Response + +class DdosGuardInterceptor(private val client: OkHttpClient) : Interceptor { + + private val cookieManager by lazy { CookieManager.getInstance() } + + override fun intercept(chain: Interceptor.Chain): Response { + val originalRequest = chain.request() + val response = chain.proceed(originalRequest) + + // Check if DDos-GUARD is on + if (response.code !in ERROR_CODES || response.header("Server") !in SERVER_CHECK) { + return response + } + + response.close() + val cookies = cookieManager.getCookie(originalRequest.url.toString()) + val oldCookie = if (cookies != null && cookies.isNotEmpty()) { + cookies.split(";").mapNotNull { Cookie.parse(originalRequest.url, it) } + } else { + emptyList() + } + val ddg2Cookie = oldCookie.firstOrNull { it.name == "__ddg2_" } + if (!ddg2Cookie?.value.isNullOrEmpty()) { + return chain.proceed(originalRequest) + } + + val newCookie = getNewCookie(originalRequest.url) ?: return chain.proceed(originalRequest) + val newCookieHeader = (oldCookie + newCookie).joinToString("; ") { + "${it.name}=${it.value}" + } + + return chain.proceed(originalRequest.newBuilder().addHeader("cookie", newCookieHeader).build()) + } + + fun getNewCookie(url: HttpUrl): Cookie? { + val cookies = cookieManager.getCookie(url.toString()) + val oldCookie = if (cookies != null && cookies.isNotEmpty()) { + cookies.split(";").mapNotNull { Cookie.parse(url, it) } + } else { + emptyList() + } + val ddg2Cookie = oldCookie.firstOrNull { it.name == "__ddg2_" } + if (!ddg2Cookie?.value.isNullOrEmpty()) { + return ddg2Cookie + } + val wellKnown = client.newCall(GET("https://check.ddos-guard.net/check.js")) + .execute().body.string() + .substringAfter("'", "") + .substringBefore("'", "") + val checkUrl = "${url.scheme}://${url.host + wellKnown}" + return client.newCall(GET(checkUrl)).execute().header("set-cookie")?.let { + Cookie.parse(url, it) + } + } + + companion object { + private val ERROR_CODES = listOf(403) + private val SERVER_CHECK = listOf("ddos-guard") + } +}