From 4d1f5e22d317b45c05948cefeb60e26ed18f7d05 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 11 Apr 2021 11:33:04 +0300 Subject: [PATCH] #21 Fix cloudflare passing --- app/build.gradle | 4 ++-- .../browser/cloudflare/CloudFlareClient.kt | 17 +++++++++-------- .../{AndroidCookieJar.kt => CookieJar.kt} | 11 +---------- .../kotatsu/core/network/NetworkModule.kt | 2 +- .../kotatsu/settings/HistorySettingsFragment.kt | 4 ++-- 5 files changed, 15 insertions(+), 23 deletions(-) rename app/src/main/java/org/koitharu/kotatsu/core/network/{AndroidCookieJar.kt => CookieJar.kt} (74%) diff --git a/app/build.gradle b/app/build.gradle index bc7924a1a..09f7af504 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -74,7 +74,7 @@ dependencies { implementation 'androidx.lifecycle:lifecycle-process:2.3.1' implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' - implementation 'androidx.recyclerview:recyclerview:1.2.0-rc01' + implementation 'androidx.recyclerview:recyclerview:1.2.0' implementation 'androidx.viewpager2:viewpager2:1.1.0-alpha01' implementation 'androidx.preference:preference-ktx:1.1.1' implementation 'androidx.work:work-runtime-ktx:2.5.0' @@ -99,7 +99,7 @@ dependencies { implementation 'com.davemorrissey.labs:subsampling-scale-image-view-androidx:3.10.0' implementation 'com.github.solkin:disk-lru-cache:1.2' - debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.6' + debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7' testImplementation 'junit:junit:4.13.2' testImplementation 'org.json:json:20201115' diff --git a/app/src/main/java/org/koitharu/kotatsu/browser/cloudflare/CloudFlareClient.kt b/app/src/main/java/org/koitharu/kotatsu/browser/cloudflare/CloudFlareClient.kt index 287c32c14..ba9ab7851 100644 --- a/app/src/main/java/org/koitharu/kotatsu/browser/cloudflare/CloudFlareClient.kt +++ b/app/src/main/java/org/koitharu/kotatsu/browser/cloudflare/CloudFlareClient.kt @@ -3,18 +3,16 @@ package org.koitharu.kotatsu.browser.cloudflare import android.graphics.Bitmap import android.webkit.WebView import okhttp3.HttpUrl.Companion.toHttpUrl -import org.koitharu.kotatsu.core.network.AndroidCookieJar +import org.koitharu.kotatsu.core.network.CookieJar import org.koitharu.kotatsu.core.network.WebViewClientCompat class CloudFlareClient( - private val cookieJar: AndroidCookieJar, + private val cookieJar: CookieJar, private val callback: CloudFlareCallback, private val targetUrl: String ) : WebViewClientCompat() { - init { - cookieJar.remove(targetUrl, CF_UID, CF_CLEARANCE) - } + private val oldClearance = getCookieValue(CF_CLEARANCE) override fun onPageStarted(view: WebView, url: String?, favicon: Bitmap?) { super.onPageStarted(view, url, favicon) @@ -32,16 +30,19 @@ class CloudFlareClient( } private fun checkClearance() { - val cookies = cookieJar.loadForRequest(targetUrl.toHttpUrl()) - if (cookies.any { it.name == CF_CLEARANCE }) { + val clearance = getCookieValue(CF_CLEARANCE) + if (clearance != null && clearance != oldClearance) { callback.onCheckPassed() } + } + private fun getCookieValue(name: String): String? { + return cookieJar.loadForRequest(targetUrl.toHttpUrl()) + .find { it.name == name }?.value } private companion object { - const val CF_UID = "__cfduid" const val CF_CLEARANCE = "cf_clearance" } } \ No newline at end of file diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/AndroidCookieJar.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/CookieJar.kt similarity index 74% rename from app/src/main/java/org/koitharu/kotatsu/core/network/AndroidCookieJar.kt rename to app/src/main/java/org/koitharu/kotatsu/core/network/CookieJar.kt index b8bfaada5..4740e8b13 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/network/AndroidCookieJar.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/CookieJar.kt @@ -7,7 +7,7 @@ import okhttp3.HttpUrl import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine -class AndroidCookieJar : CookieJar { +class CookieJar : CookieJar { private val cookieManager = CookieManager.getInstance() @@ -28,15 +28,6 @@ class AndroidCookieJar : CookieJar { } } - fun remove(url: String, vararg names: String) { - val cookies = cookieManager.getCookie(url) ?: return - val newCookies = cookies.split(";") - .filterNot { cookie -> - names.any { cookie.startsWith("$it=") } - }.joinToString(";") - cookieManager.setCookie(url, newCookies) - } - fun clearAsync() { cookieManager.removeAllCookies(null) } diff --git a/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt b/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt index 0eb68df3e..6691dd50c 100644 --- a/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt +++ b/app/src/main/java/org/koitharu/kotatsu/core/network/NetworkModule.kt @@ -11,7 +11,7 @@ import java.util.concurrent.TimeUnit val networkModule get() = module { - single { AndroidCookieJar() } bind CookieJar::class + single { CookieJar() } bind CookieJar::class single(named(CacheUtils.QUALIFIER_HTTP)) { CacheUtils.createHttpCache(androidContext()) } single { OkHttpClient.Builder().apply { diff --git a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt index 96f34a27a..13d142fc1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/settings/HistorySettingsFragment.kt @@ -11,7 +11,7 @@ import org.koin.android.ext.android.get import org.koin.android.ext.android.inject import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BasePreferenceFragment -import org.koitharu.kotatsu.core.network.AndroidCookieJar +import org.koitharu.kotatsu.core.network.CookieJar import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.local.data.Cache import org.koitharu.kotatsu.search.ui.MangaSuggestionsProvider @@ -75,7 +75,7 @@ class HistorySettingsFragment : BasePreferenceFragment(R.string.history_and_cach } AppSettings.KEY_COOKIES_CLEAR -> { viewLifecycleScope.launch { - val cookieJar = get() + val cookieJar = get() cookieJar.clear() Snackbar.make( listView ?: return@launch,