Manually resolve Cloudflare challenge if failed to bypass

This commit is contained in:
FooIbar authored and tarsin committed 2023-08-05 17:14:06 +08:00
1 parent 59a9448d70
commit a2af3a4652
13 files changed
+104 -9

No files matched your search

@@ -1,3 +1,5 @@
package com.hippo.ehviewer.client.exception
class CloudflareBypassException : EhException("Failed to bypass Cloudflare")
import com.hippo.ehviewer.R
class CloudflareBypassException : EhException(R.string.cloudflare_bypass_failed)
@@ -19,7 +19,7 @@ import com.hippo.ehviewer.client.EhCookieStore
import com.hippo.ehviewer.ui.login.CookieSignInScene
import com.hippo.ehviewer.ui.login.SelectSiteScreen
import com.hippo.ehviewer.ui.login.SignInScreen
import com.hippo.ehviewer.ui.login.WebviewSignInScreen
import com.hippo.ehviewer.ui.login.WebViewSignInScreen
import com.hippo.ehviewer.ui.settings.AboutScreen
import com.hippo.ehviewer.ui.settings.AdvancedScreen
import com.hippo.ehviewer.ui.settings.BaseScreen
@@ -55,7 +55,7 @@ class ConfigureActivity : EhActivity() {
SignInScreen(windowSizeClass)
}
composable(WEBVIEW_SIGN_IN_ROUTE_NAME) {
WebviewSignInScreen()
WebViewSignInScreen()
}
composable(COOKIE_SIGN_IN_ROUTE_NAME) {
CookieSignInScene(windowSizeClass)
@@ -0,0 +1,18 @@
package com.hippo.ehviewer.ui
import android.os.Bundle
import com.hippo.ehviewer.ui.webview.WebViewScreen
class WebViewActivity : EhActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val url = intent.extras?.getString(KEY_URL) ?: return
setMD3Content {
WebViewScreen(url = url) { finish() }
}
}
companion object {
const val KEY_URL = "url"
}
}
@@ -24,7 +24,7 @@ import eu.kanade.tachiyomi.util.lang.withUIContext
import okhttp3.HttpUrl.Companion.toHttpUrl
@Composable
fun WebviewSignInScreen() {
fun WebViewSignInScreen() {
val navController = LocalNavController.current
val coroutineScope = rememberCoroutineScope()
val state = rememberWebViewState(url = EhUrl.URL_SIGN_IN)
@@ -28,7 +28,9 @@ import android.view.ViewGroup
import android.view.ViewPropertyAnimator
import android.widget.TextView
import androidx.activity.OnBackPressedCallback
import androidx.compose.material3.Text
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.res.stringResource
import androidx.core.content.ContextCompat
import androidx.core.os.bundleOf
import androidx.core.view.GravityCompat
@@ -60,6 +62,7 @@ import com.hippo.ehviewer.R
import com.hippo.ehviewer.Settings
import com.hippo.ehviewer.client.EhEngine
import com.hippo.ehviewer.client.EhTagDatabase
import com.hippo.ehviewer.client.EhUrl
import com.hippo.ehviewer.client.EhUtils
import com.hippo.ehviewer.client.data.BaseGalleryInfo
import com.hippo.ehviewer.client.data.ListUrlBuilder
@@ -68,6 +71,7 @@ import com.hippo.ehviewer.client.data.ListUrlBuilder.Companion.MODE_SUBSCRIPTION
import com.hippo.ehviewer.client.data.ListUrlBuilder.Companion.MODE_TAG
import com.hippo.ehviewer.client.data.ListUrlBuilder.Companion.MODE_TOPLIST
import com.hippo.ehviewer.client.data.ListUrlBuilder.Companion.MODE_WHATS_HOT
import com.hippo.ehviewer.client.exception.CloudflareBypassException
import com.hippo.ehviewer.client.exception.EhException
import com.hippo.ehviewer.client.parser.GalleryDetailUrlParser
import com.hippo.ehviewer.client.parser.GalleryPageUrlParser
@@ -75,6 +79,7 @@ import com.hippo.ehviewer.dao.QuickSearch
import com.hippo.ehviewer.databinding.DrawerListRvBinding
import com.hippo.ehviewer.databinding.ItemDrawerListBinding
import com.hippo.ehviewer.databinding.SceneGalleryListBinding
import com.hippo.ehviewer.ui.WebViewActivity
import com.hippo.ehviewer.ui.doGalleryInfoAction
import com.hippo.ehviewer.ui.legacy.AddDeleteDrawable
import com.hippo.ehviewer.ui.legacy.BaseDialogBuilder
@@ -372,6 +377,16 @@ class GalleryListScene : SearchBarScene() {
is LoadState.Error -> {
binding.tip.text = ExceptionUtils.getReadableString(state.error)
transition.showView(2)
if (state.error.cause is CloudflareBypassException) {
dialogState.awaitPermissionOrCancel(
android.R.string.ok,
android.R.string.cancel,
R.string.cloudflare_bypass_failed,
) {
Text(text = stringResource(id = R.string.open_in_webview))
}
navAnimated(R.id.webView, bundleOf(WebViewActivity.KEY_URL to EhUrl.host))
}
}
is LoadState.NotLoading -> {
delay(500)
@@ -0,0 +1,46 @@
package com.hippo.ehviewer.ui.webview
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Close
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect
import androidx.compose.ui.Modifier
import com.google.accompanist.web.WebView
import com.google.accompanist.web.rememberWebViewState
import com.hippo.ehviewer.client.EhCookieStore
import com.hippo.ehviewer.util.setDefaultSettings
@Composable
fun WebViewScreen(url: String, onNavigateUp: () -> Unit) {
val state = rememberWebViewState(url = url)
Scaffold(
topBar = {
TopAppBar(
title = { Text(text = state.pageTitle ?: url) },
navigationIcon = {
IconButton(onClick = onNavigateUp) {
Icon(imageVector = Icons.Default.Close, contentDescription = null)
}
},
)
},
) { paddingValues ->
WebView(
state = state,
modifier = Modifier.padding(top = paddingValues.calculateTopPadding()).fillMaxSize(),
onCreated = { it.setDefaultSettings() },
)
DisposableEffect(Unit) {
onDispose {
EhCookieStore.flush()
}
}
}
}
@@ -2,10 +2,12 @@ package com.hippo.ehviewer.util
import android.annotation.SuppressLint
import android.webkit.WebView
import com.hippo.ehviewer.client.CHROME_USER_AGENT
@SuppressLint("SetJavaScriptEnabled")
fun WebView.setDefaultSettings() = settings.run {
builtInZoomControls = true
displayZoomControls = false
javaScriptEnabled = true
userAgentString = CHROME_USER_AGENT
}