Support fido:/ URIs

Recognize spec-style fido:/ URIs and open them with ACTION_VIEW.

Note that FIDO:// URIs already worked before this just fine.
This commit is contained in:
Markus Fisch
2026-05-31 21:46:56 +02:00
parent 1ef9f39978
commit 4fab21c88d
30 changed files with 89 additions and 27 deletions
@@ -1,5 +1,6 @@
package de.markusfisch.android.binaryeye.actions
import de.markusfisch.android.binaryeye.actions.fido.FidoAction
import de.markusfisch.android.binaryeye.actions.mail.MailAction
import de.markusfisch.android.binaryeye.actions.mail.MatMsgAction
import de.markusfisch.android.binaryeye.actions.otpauth.OtpauthAction
@@ -17,6 +18,7 @@ object ActionRegistry {
private val REGISTRY: Set<Action> = setOf(
MailAction,
MatMsgAction,
FidoAction,
OtpauthAction,
SmsAction,
TelAction,
@@ -0,0 +1,23 @@
package de.markusfisch.android.binaryeye.actions.fido
import android.content.Context
import de.markusfisch.android.binaryeye.R
import de.markusfisch.android.binaryeye.actions.Action
import de.markusfisch.android.binaryeye.content.openUrl
object FidoAction : Action() {
private val fidoUriRegex = "^fido:/[0-9]+$".toRegex(
RegexOption.IGNORE_CASE
)
override val iconResId: Int = R.drawable.ic_action_open
override val titleResId: Int = R.string.open_url
override fun canExecuteOn(data: ByteArray): Boolean {
return String(data).trim().matches(fidoUriRegex)
}
override suspend fun execute(context: Context, data: ByteArray) {
executed = context.openUrl(String(data).trim())
}
}
@@ -924,7 +924,7 @@ class Preferences {
private const val PREVIEW_SCALE = "preview_scale"
private const val AUTOMATED_ACTIONS = "automated_actions"
private const val DYNAMIC_COLORS = "dynamic_colors"
private const val DEFAULT_IGNORE_CODE_PATTERN = "^FIDO://.*"
private const val DEFAULT_IGNORE_CODE_PATTERN = "(?i)^fido:/.*"
}
}
+1 -1
View File
@@ -144,7 +144,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -136,7 +136,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -136,7 +136,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -140,7 +140,7 @@
</plurals>
<string name="ignore_code_add">Přidat kód</string>
<string name="ignore_code_edit">Upravit kód</string>
<string name="ignore_code_regex_hint">např. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">např. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Vyžadován regulární výraz</string>
<string name="ignore_code_regex_invalid">Neplatný regulární výraz</string>
<string name="ignore_code_remove_confirm">Odstranit tento ignorovaný kód?</string>
+1 -1
View File
@@ -136,7 +136,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -136,7 +136,7 @@
</plurals>
<string name="ignore_code_add">Code hinzufügen</string>
<string name="ignore_code_edit">Code bearbeiten</string>
<string name="ignore_code_regex_hint">z.B. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">z.B. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex erforderlich</string>
<string name="ignore_code_regex_invalid">Ungültiger Regex</string>
<string name="ignore_code_remove_confirm">Diesen ignorierten Code entfernen?</string>
+1 -1
View File
@@ -137,7 +137,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -136,7 +136,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -137,7 +137,7 @@
</plurals>
<string name="ignore_code_add">Ajouter un code</string>
<string name="ignore_code_edit">Modifier le code</string>
<string name="ignore_code_regex_hint">p. ex. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">p. ex. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Expression régulière requise</string>
<string name="ignore_code_regex_invalid">Expression régulière invalide</string>
<string name="ignore_code_remove_confirm">Supprimer ce code ignoré ?</string>
+1 -1
View File
@@ -136,7 +136,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -135,7 +135,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -144,7 +144,7 @@
</plurals>
<string name="ignore_code_add">Aggiungi codice</string>
<string name="ignore_code_edit">Modifica codice</string>
<string name="ignore_code_regex_hint">es. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">es. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Richeisto regex</string>
<string name="ignore_code_regex_invalid">Regex non valido</string>
<string name="ignore_code_remove_confirm">Vuoi rimuovere questo codice ignorato?</string>
+1 -1
View File
@@ -135,7 +135,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -136,7 +136,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -135,7 +135,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -38,7 +38,7 @@
<string name="profile_current">Pašreizējais profils</string>
<string name="current_profile">Profils: %s</string>
<string name="barcode_formats">Svītrkoda formāti</string>
<string name="ignore_code_regex_hint">piem. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">piem. (?i)^fido:/.*</string>
<string name="open_immediately">Nekavējoties atvērt saturu</string>
<string name="show_meta_data">Rādīt metadatus</string>
<string name="show_checksum">Rādīt kontrolsummu</string>
+1 -1
View File
@@ -136,7 +136,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -170,7 +170,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -136,7 +136,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -140,7 +140,7 @@
</plurals>
<string name="ignore_code_add">Добавить код</string>
<string name="ignore_code_edit">Изменить код</string>
<string name="ignore_code_regex_hint">например ^FIDO://.*</string>
<string name="ignore_code_regex_hint">например (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Требуется регулярное выражение</string>
<string name="ignore_code_regex_invalid">Недействительное регулярное выражение</string>
<string name="ignore_code_remove_confirm">Удалить этот игнорируемый код?</string>
+1 -1
View File
@@ -136,7 +136,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -140,7 +140,7 @@
</plurals>
<string name="ignore_code_add">Додати код</string>
<string name="ignore_code_edit">Редагувати код</string>
<string name="ignore_code_regex_hint">наприклад ^FIDO://.*</string>
<string name="ignore_code_regex_hint">наприклад (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Потрібен регулярний вираз</string>
<string name="ignore_code_regex_invalid">Недійсний регулярний вираз</string>
<string name="ignore_code_remove_confirm">Видалити цей проігнорований код?</string>
+1 -1
View File
@@ -135,7 +135,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -135,7 +135,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -135,7 +135,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
+1 -1
View File
@@ -144,7 +144,7 @@
</plurals>
<string name="ignore_code_add">Add code</string>
<string name="ignore_code_edit">Edit code</string>
<string name="ignore_code_regex_hint">e.g. ^FIDO://.*</string>
<string name="ignore_code_regex_hint">e.g. (?i)^fido:/.*</string>
<string name="ignore_code_regex_required">Regex required</string>
<string name="ignore_code_regex_invalid">Invalid regex</string>
<string name="ignore_code_remove_confirm">Remove this ignored code?</string>
@@ -0,0 +1,37 @@
package de.markusfisch.android.binaryeye.actions.fido
import junit.framework.TestCase.assertEquals
import org.junit.Test
class FidoTest {
@Test
fun correct() {
val urls = listOf(
"fido:/1234567890",
"FIDO:/1234567890",
)
for (url in urls) {
assertEquals(url, resolve(url))
}
}
@Test
fun incorrect() {
val urls = listOf(
"",
"fido:",
"fido:/",
"fido://1234567890",
"fido:/abc",
"fido:/123abc",
"https://example.com",
)
for (url in urls) {
assertEquals(null, resolve(url))
}
}
}
private fun resolve(s: String) = if (
FidoAction.canExecuteOn(s.toByteArray())
) s else null