From b33f90f9d7719abe704212ebcc61a10f00c0395f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 16 Mar 2026 14:56:15 +0000
Subject: [PATCH 1/2] Initial plan
From f7abb0c32169709dba70f021aeefd92f64aa1287 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Mon, 16 Mar 2026 15:07:53 +0000
Subject: [PATCH 2/2] Security fixes: WebView URL validation, redirect race
condition, and file:// scheme removal
Co-authored-by: sirambd <28200274+sirambd@users.noreply.github.com>
---
app/src/main/AndroidManifest.xml | 1 -
.../infomaniak/drive/ui/OnlyOfficeActivity.kt | 21 +++++++++++++++++--
2 files changed, 19 insertions(+), 3 deletions(-)
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index a76f5686fa..af8a3188bb 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -135,7 +135,6 @@
-
diff --git a/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt b/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt
index 05a891d6a5..d45061600d 100644
--- a/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt
+++ b/app/src/main/java/com/infomaniak/drive/ui/OnlyOfficeActivity.kt
@@ -83,6 +83,12 @@ class OnlyOfficeActivity : AppCompatActivity() {
val url = intent.getStringExtra(ONLYOFFICE_URL_TAG)!!
val filename = intent.getStringExtra(ONLYOFFICE_FILENAME_TAG)!!
+
+ if (!isUrlFromTrustedDomain(url)) {
+ finish()
+ return@with
+ }
+
val headers = mapOf("Authorization" to "Bearer ${AccountUtils.currentUser?.apiToken?.accessToken}")
CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true)
@@ -96,8 +102,9 @@ class OnlyOfficeActivity : AppCompatActivity() {
webViewClient = object : WebViewClientCompat() {
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
- popBackIfNeeded(request.url.toString())
- view.loadUrl(request.url.toString())
+ val redirectUrl = request.url.toString()
+ popBackIfNeeded(redirectUrl)
+ if (!isFinishing) view.loadUrl(redirectUrl)
return true
}
}
@@ -211,6 +218,16 @@ class OnlyOfficeActivity : AppCompatActivity() {
if (popBackNeeded) finish()
}
+ private fun isUrlFromTrustedDomain(url: String): Boolean {
+ return try {
+ val uri = Uri.parse(url)
+ val host = uri.host ?: return false
+ uri.scheme == "https" && (host.endsWith(".infomaniak.com") || host == "infomaniak.com")
+ } catch (e: Exception) {
+ false
+ }
+ }
+
private inner class OnlyOfficeWebChromeClient : WebChromeClient() {
override fun onProgressChanged(view: WebView, newProgress: Int) = with(binding) {
progressBar.progress = newProgress