Improve WebView spoofing (#3678)
- Spoof `Sec-CH-UA` client hints to match the user agent - Fix `X-Requested-With` spoofing leaking to unrelated callers - Update default user agent to Chrome 149
This commit is contained in:
@@ -51,6 +51,7 @@ import eu.kanade.tachiyomi.BuildConfig
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.util.system.getHtml
|
||||
import eu.kanade.tachiyomi.util.system.setDefaultSettings
|
||||
import eu.kanade.tachiyomi.util.system.setUserAgent
|
||||
import kotlinx.coroutines.launch
|
||||
import tachiyomi.i18n.MR
|
||||
import tachiyomi.presentation.core.components.material.Scaffold
|
||||
@@ -72,6 +73,7 @@ fun WebViewScreenContent(
|
||||
onNavigateUp: () -> Unit,
|
||||
initialTitle: String?,
|
||||
url: String,
|
||||
defaultUserAgentProvider: () -> String,
|
||||
onShare: (String) -> Unit,
|
||||
onOpenInBrowser: (String) -> Unit,
|
||||
onClearCookies: (String) -> Unit,
|
||||
@@ -340,9 +342,7 @@ fun WebViewScreenContent(
|
||||
WebView.setWebContentsDebuggingEnabled(true)
|
||||
}
|
||||
|
||||
headers["user-agent"]?.let {
|
||||
webView.settings.userAgentString = it
|
||||
}
|
||||
webView.setUserAgent(headers["user-agent"] ?: defaultUserAgentProvider())
|
||||
},
|
||||
onDispose = { webView ->
|
||||
val window = windowStack.items.find { it.webView == webView }
|
||||
|
||||
@@ -8,7 +8,6 @@ import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.IntentFilter
|
||||
import android.os.Build
|
||||
import android.os.Looper
|
||||
import android.webkit.WebView
|
||||
import androidx.core.content.ContextCompat
|
||||
import androidx.lifecycle.DefaultLifecycleObserver
|
||||
@@ -231,7 +230,7 @@ class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factor
|
||||
override fun getPackageName(): String {
|
||||
try {
|
||||
// Override the value passed as X-Requested-With in WebView requests
|
||||
val stackTrace = Looper.getMainLooper().thread.stackTrace
|
||||
val stackTrace = Thread.currentThread().stackTrace
|
||||
val isChromiumCall = stackTrace.any { trace ->
|
||||
trace.className.lowercase() in setOf("org.chromium.base.buildinfo", "org.chromium.base.apkinfo") &&
|
||||
trace.methodName.lowercase() in setOf("getall", "getpackagename", "<init>")
|
||||
|
||||
@@ -72,6 +72,7 @@ class WebViewActivity : BaseActivity() {
|
||||
initialTitle = intent.extras?.getString(TITLE_KEY),
|
||||
url = url,
|
||||
headers = headers,
|
||||
defaultUserAgentProvider = network::defaultUserAgentProvider,
|
||||
onUrlChange = { assistUrl = it },
|
||||
onShare = this::shareWebpage,
|
||||
onOpenInBrowser = this::openInBrowser,
|
||||
|
||||
@@ -36,6 +36,7 @@ class WebViewScreen(
|
||||
initialTitle = initialTitle,
|
||||
url = url,
|
||||
headers = viewModel.headers,
|
||||
defaultUserAgentProvider = viewModel::defaultUserAgentProvider,
|
||||
onUrlChange = { assistUrl = it },
|
||||
onShare = { viewModel.shareWebpage(context, it) },
|
||||
onOpenInBrowser = { viewModel.openInBrowser(context, it) },
|
||||
|
||||
@@ -67,4 +67,6 @@ class WebViewViewModel(
|
||||
logcat { "Cleared $cleared cookies for: $url" }
|
||||
}
|
||||
}
|
||||
|
||||
fun defaultUserAgentProvider() = network.defaultUserAgentProvider()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user