diff --git a/libs/database/src/main/java/org/fdroid/index/RepoManager.kt b/libs/database/src/main/java/org/fdroid/index/RepoManager.kt index f6f6b0513..b0b43150a 100644 --- a/libs/database/src/main/java/org/fdroid/index/RepoManager.kt +++ b/libs/database/src/main/java/org/fdroid/index/RepoManager.kt @@ -1,6 +1,7 @@ package org.fdroid.index import android.content.Context +import android.net.Uri import androidx.annotation.AnyThread import androidx.annotation.UiThread import androidx.annotation.WorkerThread @@ -20,6 +21,7 @@ import org.fdroid.download.DownloaderFactory import org.fdroid.download.HttpManager import org.fdroid.repo.AddRepoState import org.fdroid.repo.RepoAdder +import org.fdroid.repo.RepoUriGetter import java.io.File import java.net.Proxy import java.util.concurrent.CountDownLatch @@ -155,4 +157,12 @@ public class RepoManager @JvmOverloads constructor( repoAdder.abortAddingRepo() } + /** + * Returns true if the given [uri] belongs to a swap repo. + */ + @UiThread + public fun isSwapUri(uri: Uri?): Boolean { + return uri != null && RepoUriGetter.isSwapUri(uri) + } + } 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 7cc20dcb5..a0155c7b3 100644 --- a/libs/database/src/main/java/org/fdroid/repo/RepoUriGetter.kt +++ b/libs/database/src/main/java/org/fdroid/repo/RepoUriGetter.kt @@ -21,6 +21,7 @@ internal object RepoUriGetter { } } val fingerprint = uri.getQueryParameter("fingerprint")?.lowercase() + ?: uri.getQueryParameter("FINGERPRINT")?.lowercase() val pathSegments = uri.pathSegments val normalizedUri = uri.buildUpon().apply { @@ -53,6 +54,11 @@ internal object RepoUriGetter { return NormalizedUri(normalizedUri, fingerprint) } + fun isSwapUri(uri: Uri): Boolean { + val swap = uri.getQueryParameter("swap") ?: uri.getQueryParameter("SWAP") + return swap != null && uri.scheme?.lowercase() == "http" + } + private fun getFdroidLinkUri(uri: Uri): Uri { val tmpUri = uri.buildUpon().encodedQuery(uri.encodedFragment).build() return Uri.parse(tmpUri.getQueryParameter("repo")) 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 fe82236e7..1f0c96558 100644 --- a/libs/database/src/test/java/org/fdroid/repo/RepoUriGetterTest.kt +++ b/libs/database/src/test/java/org/fdroid/repo/RepoUriGetterTest.kt @@ -1,10 +1,13 @@ package org.fdroid.repo +import android.net.Uri import androidx.test.ext.junit.runners.AndroidJUnit4 import org.junit.Test import org.junit.runner.RunWith import kotlin.test.assertEquals +import kotlin.test.assertFalse import kotlin.test.assertNull +import kotlin.test.assertTrue @RunWith(AndroidJUnit4::class) internal class RepoUriGetterTest { @@ -105,4 +108,36 @@ internal class RepoUriGetterTest { assertEquals("http://grobox.de/fdroid/repo", uri4.uri.toString()) assertNull(uri4.fingerprint) } + + @Test + fun testSwapUri() { + val uri = + RepoUriGetter.getUri( + "http://192.168.3.159:8888/fdroid/repo?FINGERPRINT=" + + "BA29D02E303B2604D00C91189600E868B26FA0B248DC39D75C5C0F4349CA5FA9" + + "&SWAP=1&BSSID=44:FE:3B:7F:7F:EE" + ) + assertEquals("http://192.168.3.159:8888/fdroid/repo", uri.uri.toString()) + assertEquals( + "ba29d02e303b2604d00c91189600e868b26fa0b248dc39d75c5c0f4349ca5fa9", + uri.fingerprint, + ) + } + + @Test + fun testIsSwapUri() { + val uri1 = Uri.parse( + "http://192.168.3.159:8888/fdroid/repo?FINGERPRINT=" + + "BA29D02E303B2604D00C91189600E868B26FA0B248DC39D75C5C0F4349CA5FA9" + + "&SWAP=1&BSSID=44:FE:3B:7F:7F:EE" + ) + assertTrue(RepoUriGetter.isSwapUri(uri1)) + + val uri2 = Uri.parse("http://192.168.3.159:8888/fdroid/repo?" + + "swap=1&BSSID=44:FE:3B:7F:7F:EE") + assertTrue(RepoUriGetter.isSwapUri(uri2)) + + val uri3 = Uri.parse("http://192.168.3.159:8888/fdroid/repo?BSSID=44:FE:3B:7F:7F:EE") + assertFalse(RepoUriGetter.isSwapUri(uri3)) + } }