From 2f05931a4868a5a18fcb5eb2075528979cb2b91d Mon Sep 17 00:00:00 2001 From: Bernhard Rauch Date: Sat, 26 Feb 2022 16:22:27 +0100 Subject: [PATCH 1/7] Bugfix: changedCharAccept initial state --- .../main/java/de/mathfactory/mooltifill/MooltipassDevice.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/de/mathfactory/mooltifill/MooltipassDevice.kt b/app/src/main/java/de/mathfactory/mooltifill/MooltipassDevice.kt index ecec271..6125187 100644 --- a/app/src/main/java/de/mathfactory/mooltifill/MooltipassDevice.kt +++ b/app/src/main/java/de/mathfactory/mooltifill/MooltipassDevice.kt @@ -73,7 +73,7 @@ class MooltipassDevice(private val device: BluetoothDevice, private var debug: I private var mpGatt = CompletableDeferred() private val commFlow: MutableStateFlow = MutableStateFlow(CommOp.Disconnected) private val idleMutex = Mutex() - private var changedCharAccept = CompletableDeferred().also { it.complete(Unit) } + private var changedCharAccept = CompletableDeferred() fun ByteArray.toHexString(): String = this.joinToString("") { java.lang.String.format("%02x", it) @@ -97,6 +97,7 @@ class MooltipassDevice(private val device: BluetoothDevice, private var debug: I private suspend fun readNotified(predicate: (CommOp) -> Boolean = { true }): CommOp.ChangedChar? { if (mIsDisconnected) Log.e("Mooltifill", "readNotified() with mIsDisconnected == true") + // signal to accept CommOp.ChangedChar changedCharAccept.complete(Unit) return awaitCommFlowType(READ_TIMEOUT, predicate) } From 0f10b07a1b30b882a44c701dae10607dba58d72e Mon Sep 17 00:00:00 2001 From: Bernhard Rauch Date: Sat, 26 Feb 2022 16:23:00 +0100 Subject: [PATCH 2/7] service mapping for app/package names --- .../mooltifill/MooltifillActivity.kt | 3 +- .../mooltifill/MooltifillService.kt | 13 ++++--- .../mooltifill/SettingsActivity.kt | 38 +++++++++++-------- .../mooltifill/SubstitutionPolicy.kt | 7 ++++ app/src/main/res/xml/root_preferences.xml | 26 +++++++++++-- 5 files changed, 61 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/de/mathfactory/mooltifill/MooltifillActivity.kt b/app/src/main/java/de/mathfactory/mooltifill/MooltifillActivity.kt index 79734d8..04b6a05 100644 --- a/app/src/main/java/de/mathfactory/mooltifill/MooltifillActivity.kt +++ b/app/src/main/java/de/mathfactory/mooltifill/MooltifillActivity.kt @@ -155,8 +155,7 @@ class MooltifillActivity : Activity() { } else /* query */ { findViewById(R.id.txt_query)?.text = query CoroutineScope(Dispatchers.IO).launch { - val substitution = if(isWebRq) { SettingsActivity.getUrlSubstitutionPolicy(this@MooltifillActivity) } - else { SettingsActivity.getPackageSubstitutionPolicy(this@MooltifillActivity) } + val substitution = SettingsActivity.getSubstitutionPolicy(this@MooltifillActivity, isWebRq) val reply = getCredentialsWithSubstitution(applicationContext, query, substitution, object :RequestCallback { override suspend fun onQueryChanged(original: String, substituted: String) = withContext(Dispatchers.Main) { findViewById(R.id.txt_query)?.text = substituted diff --git a/app/src/main/java/de/mathfactory/mooltifill/MooltifillService.kt b/app/src/main/java/de/mathfactory/mooltifill/MooltifillService.kt index 592954f..0e2b341 100644 --- a/app/src/main/java/de/mathfactory/mooltifill/MooltifillService.kt +++ b/app/src/main/java/de/mathfactory/mooltifill/MooltifillService.kt @@ -59,7 +59,9 @@ class MooltifillService : AutofillService() { val clientPackage = structure.activityComponent.packageName // app package val isWebDomain = webDomain.isNotEmpty() - val query = if(isWebDomain) {webDomain.toString()} else {clientPackage} + val substitution = SettingsActivity.getSubstitutionPolicy(this, isWebDomain) + // substitute the webDomain or clientPacakge according to configured policies + val query = if(isWebDomain) {webDomain.toString()} else {clientPackage}.let(substitution::policies).first() return AutofillInfo(query, autofillIds, isWebDomain) } @@ -83,10 +85,9 @@ class MooltifillService : AutofillService() { val response = FillResponse.Builder() val dataset = Dataset.Builder() - val query = info.query.take(31) - val presentation = remoteViews(packageName, "Mooltipass", query) + val presentation = remoteViews(packageName, "Mooltipass", info.query) val intent = Intent(applicationContext, MooltifillActivity::class.java) - intent.putExtra(MooltifillActivity.EXTRA_QUERY, query) + intent.putExtra(MooltifillActivity.EXTRA_QUERY, info.query) intent.putExtra(MooltifillActivity.EXTRA_IS_WEB_REQUEST, info.isWebRequest) intent.putExtra(MooltifillActivity.EXTRA_USERNAME, username) intent.putExtra(MooltifillActivity.EXTRA_PASSWORD, password) @@ -96,7 +97,7 @@ class MooltifillService : AutofillService() { PendingIntent.FLAG_UPDATE_CURRENT } // reuse pending intent only if query is the same (through hashCode()) - val pi = PendingIntent.getActivity(applicationContext, query.hashCode(), intent, flags) + val pi = PendingIntent.getActivity(applicationContext, info.query.hashCode(), intent, flags) dataset.setAuthentication(pi.intentSender) dataset.setValue(username, null, presentation) response.addDataset(dataset.build()) @@ -123,7 +124,7 @@ class MooltifillService : AutofillService() { } val context = applicationContext CoroutineScope(Dispatchers.IO).launch { - if(MooltifillActivity.setCredentials(context, info.query.take(31), username.textValue.toString(), password.textValue.toString())) { + if(MooltifillActivity.setCredentials(context, info.query, username.textValue.toString(), password.textValue.toString())) { callback.onSuccess() } else { callback.onFailure("Mooltifill save failed") diff --git a/app/src/main/java/de/mathfactory/mooltifill/SettingsActivity.kt b/app/src/main/java/de/mathfactory/mooltifill/SettingsActivity.kt index 52fa1d9..9c72f48 100644 --- a/app/src/main/java/de/mathfactory/mooltifill/SettingsActivity.kt +++ b/app/src/main/java/de/mathfactory/mooltifill/SettingsActivity.kt @@ -40,15 +40,14 @@ import kotlinx.coroutines.* enum class UrlSubstitutionPolicies : SubstitutionPolicy { Nochange, PreferWww, PreferNowww, AddWww, RemoveWww; - override fun policies(query: String): List { - return when(this) { + override fun policies(query: String): List = + when(this) { Nochange -> listOf(query) PreferWww -> listOf(withWww(query), withoutWww(query)) PreferNowww -> listOf(withoutWww(query), withWww(query)) AddWww -> listOf(withWww(query)) RemoveWww -> listOf(withoutWww(query)) - } - } + }.map(SubstitutionPolicy::transform) private fun withWww(query: String): String { if(query.startsWith("www.")) return query @@ -61,14 +60,18 @@ enum class UrlSubstitutionPolicies : SubstitutionPolicy { } } -enum class PkgSubstitutionPolicies : SubstitutionPolicy { - Nochange; +class PkgSubstitutionPolicies(private val reverse: Boolean, private val maxComponentCount: Int) : SubstitutionPolicy { + override fun policies(query: String): List = + listOf(query + // truncate components + .let(this::truncated) + // reverse components + .let { if (reverse) reversed(it) else it } + // base transform + .let(SubstitutionPolicy::transform)) - override fun policies(query: String): List { - return when(this) { - Nochange -> listOf(query) - } - } + private fun reversed(query: String): String = query.split(".").reversed().joinToString(".") + private fun truncated(query: String): String = query.split(".").take(maxComponentCount).joinToString(".") } class SettingsActivity : AppCompatActivity() { @@ -78,12 +81,17 @@ class SettingsActivity : AppCompatActivity() { fun isDebugEnabled(context: Context): Boolean = parsedIntSetting(context, "debug_level", 0) > 0 fun isDebugVerbose(context: Context): Boolean = parsedIntSetting(context, "debug_level", 0) > 1 fun isAwarenessEnabled(context: Context): Boolean = booleanSetting(context, "awareness", true) - fun getUrlSubstitutionPolicy(context: Context): SubstitutionPolicy = stringSetting(context, "www_substitution", null) + + fun getSubstitutionPolicy(context: Context, isWebRq: Boolean): SubstitutionPolicy = + if(isWebRq) { getUrlSubstitutionPolicy(context) } else { getPackageSubstitutionPolicy(context) } + + private fun getUrlSubstitutionPolicy(context: Context): SubstitutionPolicy = stringSetting(context, "www_substitution", null) ?.let { UrlSubstitutionPolicies.valueOf(it) } ?: UrlSubstitutionPolicies.Nochange - fun getPackageSubstitutionPolicy(context: Context): SubstitutionPolicy = stringSetting(context, "pkg_substitution", null) - ?.let { PkgSubstitutionPolicies.valueOf(it) } - ?: PkgSubstitutionPolicies.Nochange + private fun getPackageSubstitutionPolicy(context: Context): SubstitutionPolicy = + PkgSubstitutionPolicies( + booleanSetting(context, "pkg_substitution_reverse", false), + intSetting(context, "pkg_substitution_max_components", 15)) private fun castChecked(block: () -> T): T? = try { block() } catch(e: ClassCastException) { null } diff --git a/app/src/main/java/de/mathfactory/mooltifill/SubstitutionPolicy.kt b/app/src/main/java/de/mathfactory/mooltifill/SubstitutionPolicy.kt index b47433b..0f5aa1f 100644 --- a/app/src/main/java/de/mathfactory/mooltifill/SubstitutionPolicy.kt +++ b/app/src/main/java/de/mathfactory/mooltifill/SubstitutionPolicy.kt @@ -1,6 +1,13 @@ package de.mathfactory.mooltifill interface SubstitutionPolicy { + companion object { + private const val LENGTH_LIMIT = 31 + fun transform(query: String) = query.take(LENGTH_LIMIT) + } fun policies(query: String): List +} +class DefaultSubstitutionPolicy : SubstitutionPolicy { + override fun policies(query: String): List = listOf(SubstitutionPolicy.transform(query)) } diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index b285dcc..5904e63 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -1,5 +1,6 @@ + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:android="http://schemas.android.com/apk/res/android"> @@ -33,9 +34,10 @@ app:entryValues="@array/debug_level_values" app:defaultValue="0" app:useSimpleSummaryProvider="true" /> - - + + + + + + + + \ No newline at end of file From 33b484aa7582d254bd1348141f3234bf21bd554b Mon Sep 17 00:00:00 2001 From: Bernhard Rauch Date: Sun, 6 Mar 2022 19:47:57 +0100 Subject: [PATCH 3/7] www substitution default to RemoveWww --- app/src/main/res/values/arrays.xml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 3a28f24..0dcadfc 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -22,17 +22,17 @@ 2 - Do not change subdomain part - Try with www. subdomain first, then without - Try without www. subdomain first, then with - Always add www. subdomain Always remove www. subdomain + Try without www. subdomain first + Try with www. subdomain first + Always add www. subdomain + Do not change subdomain part - Nochange - PreferWww + RemoveWww PreferNowww + PreferWww AddWww - RemoveWww + Nochange \ No newline at end of file From c342f011c4ff64097252cbc3908e59a336560d49 Mon Sep 17 00:00:00 2001 From: Bernhard Rauch Date: Sun, 6 Mar 2022 19:48:53 +0100 Subject: [PATCH 4/7] removed unused paranoia option --- app/src/main/res/values/arrays.xml | 11 ----------- app/src/main/res/values/strings.xml | 1 - app/src/main/res/xml/root_preferences.xml | 8 -------- 3 files changed, 20 deletions(-) diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 0dcadfc..afa86fb 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -1,15 +1,4 @@ - - - High - Low - - - - high - low - - Off On diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6236a96..41150e7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -6,7 +6,6 @@ Settings - Paranoia level Mooltipass Device Status Disconnected diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 5904e63..6a0ffc6 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -19,14 +19,6 @@ app:key="test_ping" app:title="Test Mooltipass Device Connection" app:summary="Please enable Bluetooth and be sure to have the ble device paired before testing the connection." /> - Date: Sun, 6 Mar 2022 19:50:22 +0100 Subject: [PATCH 5/7] Main Settings as header title --- app/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 41150e7..dc93fde 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -4,7 +4,7 @@ Settings - Settings + Main Settings Mooltipass Device Status Disconnected From ddd6733bfe52cc52e80d77ac952a327a2417add7 Mon Sep 17 00:00:00 2001 From: Bernhard Rauch Date: Sun, 6 Mar 2022 19:56:21 +0100 Subject: [PATCH 6/7] some options reworded --- app/src/main/res/xml/root_preferences.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 6a0ffc6..3b57308 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -40,11 +40,11 @@ + app:title="Service Mapping (apps)"> From 6c64487bc2d34553c08da6095045213c20da1f09 Mon Sep 17 00:00:00 2001 From: Bernhard Rauch Date: Sun, 6 Mar 2022 19:57:25 +0100 Subject: [PATCH 7/7] www substitution default to RemoveWww (2) --- app/src/main/java/de/mathfactory/mooltifill/SettingsActivity.kt | 2 +- app/src/main/res/xml/root_preferences.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/de/mathfactory/mooltifill/SettingsActivity.kt b/app/src/main/java/de/mathfactory/mooltifill/SettingsActivity.kt index 9c72f48..ca1025b 100644 --- a/app/src/main/java/de/mathfactory/mooltifill/SettingsActivity.kt +++ b/app/src/main/java/de/mathfactory/mooltifill/SettingsActivity.kt @@ -87,7 +87,7 @@ class SettingsActivity : AppCompatActivity() { private fun getUrlSubstitutionPolicy(context: Context): SubstitutionPolicy = stringSetting(context, "www_substitution", null) ?.let { UrlSubstitutionPolicies.valueOf(it) } - ?: UrlSubstitutionPolicies.Nochange + ?: UrlSubstitutionPolicies.RemoveWww private fun getPackageSubstitutionPolicy(context: Context): SubstitutionPolicy = PkgSubstitutionPolicies( booleanSetting(context, "pkg_substitution_reverse", false), diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 3b57308..d7e2b58 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -35,7 +35,7 @@ app:title="Substitution of www. subdomain part from browser urls" app:entries="@array/www_substitution_entries" app:entryValues="@array/www_substitution_values" - app:defaultValue="Nochange" + app:defaultValue="RemoveWww" app:useSimpleSummaryProvider="true" />