This commit is contained in:
Koitharu
2020-12-22 07:48:34 +02:00
parent 9a0b7c4700
commit 7fd71c13f3
36 changed files with 274 additions and 113 deletions

View File

@@ -7,15 +7,13 @@ import android.webkit.WebViewClient
import okhttp3.Cookie
import okhttp3.CookieJar
import okhttp3.HttpUrl.Companion.toHttpUrl
import org.koin.core.component.KoinComponent
import org.koin.core.component.get
class CloudFlareClient(
private val cookieJar: CookieJar,
private val callback: CloudFlareCallback,
private val targetUrl: String
) : WebViewClient(), KoinComponent {
) : WebViewClient() {
private val cookieJar = get<CookieJar>()
private val cookieManager = CookieManager.getInstance()
init {
@@ -39,7 +37,8 @@ class CloudFlareClient(
private fun checkClearance() {
val httpUrl = targetUrl.toHttpUrl()
val cookies = cookieManager.getCookie(targetUrl).split(';').mapNotNull {
val rawCookie = cookieManager.getCookie(targetUrl) ?: return
val cookies = rawCookie.split(';').mapNotNull {
Cookie.parse(httpUrl, it)
}
if (cookies.none { it.name == CF_CLEARANCE }) {

View File

@@ -1,6 +1,7 @@
package org.koitharu.kotatsu.browser.cloudflare
import android.annotation.SuppressLint
import android.content.DialogInterface
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
@@ -9,7 +10,8 @@ import android.webkit.CookieManager
import android.webkit.WebSettings
import androidx.appcompat.app.AlertDialog
import androidx.core.view.isInvisible
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import androidx.fragment.app.setFragmentResult
import org.koin.android.ext.android.get
import org.koitharu.kotatsu.base.ui.AlertDialogFragment
import org.koitharu.kotatsu.core.network.UserAgentInterceptor
import org.koitharu.kotatsu.databinding.FragmentCloudflareBinding
@@ -19,6 +21,7 @@ import org.koitharu.kotatsu.utils.ext.withArgs
class CloudFlareDialog : AlertDialogFragment<FragmentCloudflareBinding>(), CloudFlareCallback {
private val url by stringArgument(ARG_URL)
private val pendingResult = Bundle(1)
override fun onInflateView(
inflater: LayoutInflater,
@@ -35,7 +38,7 @@ class CloudFlareDialog : AlertDialogFragment<FragmentCloudflareBinding>(), Cloud
databaseEnabled = true
userAgentString = UserAgentInterceptor.userAgent
}
binding.webView.webViewClient = CloudFlareClient(this, url.orEmpty())
binding.webView.webViewClient = CloudFlareClient(get(), this, url.orEmpty())
CookieManager.getInstance().setAcceptThirdPartyCookies(binding.webView, true)
if (url.isNullOrEmpty()) {
dismissAllowingStateLoss()
@@ -63,18 +66,24 @@ class CloudFlareDialog : AlertDialogFragment<FragmentCloudflareBinding>(), Cloud
super.onPause()
}
override fun onDismiss(dialog: DialogInterface) {
setFragmentResult(TAG, pendingResult)
super.onDismiss(dialog)
}
override fun onPageLoaded() {
binding.progressBar.isInvisible = true
bindingOrNull()?.progressBar?.isInvisible = true
}
override fun onCheckPassed() {
((parentFragment ?: activity) as? SwipeRefreshLayout.OnRefreshListener)?.onRefresh()
pendingResult.putBoolean(EXTRA_RESULT, true)
dismiss()
}
companion object {
const val TAG = "CloudFlareDialog"
const val EXTRA_RESULT = "result"
private const val ARG_URL = "url"
fun newInstance(url: String) = CloudFlareDialog().withArgs(1) {