From 3c2ebe6f49212044964d9a85dac657068677454d Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 27 Feb 2024 10:39:24 -0300 Subject: [PATCH] Don't crash on non-hierarchical URIs in RepoUriGetter --- .../src/main/java/org/fdroid/repo/RepoUriGetter.kt | 14 +++++++++++--- .../test/java/org/fdroid/repo/RepoUriGetterTest.kt | 8 ++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/libs/database/src/main/java/org/fdroid/repo/RepoUriGetter.kt b/libs/database/src/main/java/org/fdroid/repo/RepoUriGetter.kt index ed8b1854a..d36afb8c9 100644 --- a/libs/database/src/main/java/org/fdroid/repo/RepoUriGetter.kt +++ b/libs/database/src/main/java/org/fdroid/repo/RepoUriGetter.kt @@ -26,8 +26,8 @@ internal object RepoUriGetter { else -> it } } - val fingerprint = uri.getQueryParameter("fingerprint")?.lowercase()?.trimEnd() - ?: uri.getQueryParameter("FINGERPRINT")?.lowercase()?.trimEnd() + val fingerprint = uri.getQueryParameterOrNull("fingerprint")?.lowercase()?.trimEnd() + ?: uri.getQueryParameterOrNull("FINGERPRINT")?.lowercase()?.trimEnd() val pathSegments = uri.pathSegments var username: String? = null @@ -78,7 +78,7 @@ internal object RepoUriGetter { } fun isSwapUri(uri: Uri): Boolean { - val swap = uri.getQueryParameter("swap") ?: uri.getQueryParameter("SWAP") + val swap = uri.getQueryParameterOrNull("swap") ?: uri.getQueryParameterOrNull("SWAP") return swap != null && uri.scheme?.lowercase() == "http" } @@ -86,6 +86,14 @@ internal object RepoUriGetter { return Uri.parse(uri.encodedFragment) } + private fun Uri.getQueryParameterOrNull(key: String): String? { + return try { + getQueryParameter(key) + } catch (e: Exception) { + return null + } + } + /** * A class for normalizing the [Repository] URI and holding an optional fingerprint * as well as username/password for basic authentication. diff --git a/libs/database/src/test/java/org/fdroid/repo/RepoUriGetterTest.kt b/libs/database/src/test/java/org/fdroid/repo/RepoUriGetterTest.kt index 80cfdaf73..5eba87ff4 100644 --- a/libs/database/src/test/java/org/fdroid/repo/RepoUriGetterTest.kt +++ b/libs/database/src/test/java/org/fdroid/repo/RepoUriGetterTest.kt @@ -172,6 +172,11 @@ internal class RepoUriGetterTest { RepoUriGetter.getUri("") } + @Test + fun testNonHierarchicalUri() { + RepoUriGetter.getUri("mailto:nobody@google.com") // should not crash + } + @Test fun testSwapUri() { val uri = @@ -204,5 +209,8 @@ internal class RepoUriGetterTest { val uri3 = Uri.parse("http://192.168.3.159:8888/fdroid/repo?BSSID=44:FE:3B:7F:7F:EE") assertFalse(RepoUriGetter.isSwapUri(uri3)) + + val uri4 = Uri.parse("mailto:nobody@google.com") + assertFalse(RepoUriGetter.isSwapUri(uri4)) } }