diff --git a/service/src/main/kotlin/org/microg/nlp/service/AbstractBackendHelper.kt b/service/src/main/kotlin/org/microg/nlp/service/AbstractBackendHelper.kt index 5e4646a..ad00475 100644 --- a/service/src/main/kotlin/org/microg/nlp/service/AbstractBackendHelper.kt +++ b/service/src/main/kotlin/org/microg/nlp/service/AbstractBackendHelper.kt @@ -67,7 +67,7 @@ abstract class AbstractBackendHelper(private val TAG: String, private val contex Log.w(TAG, "Intent is not properly resolved, can't verify signature. Aborting.") return } - val computedDigest = firstSignatureDigest(context, serviceIntent.getPackage(), if (signatureDigest?.length == 40) "SHA-1" else "SHA-256") + val computedDigest = firstSignatureDigest(context, serviceIntent.getPackage(), "SHA-256") if (signatureDigest != null && signatureDigest != computedDigest) { Log.w(TAG, "Target signature does not match selected package ($signatureDigest != $computedDigest). Aborting.") return diff --git a/service/src/main/kotlin/org/microg/nlp/service/Preferences.kt b/service/src/main/kotlin/org/microg/nlp/service/Preferences.kt index 9217220..15733ab 100644 --- a/service/src/main/kotlin/org/microg/nlp/service/Preferences.kt +++ b/service/src/main/kotlin/org/microg/nlp/service/Preferences.kt @@ -53,13 +53,42 @@ class Preferences(private val context: Context) { } private fun getStringSetFromAny(key: String): Set? { + migratePreference(key) val fromNewSettings = preferences.getStringSetCompat(key) if (fromNewSettings != null) return fromNewSettings - val fromOldSettings = oldPreferences.getStringSetCompat(key) - if (fromOldSettings != null) return fromOldSettings return systemDefaultPreferences?.getStringSetCompat(key) } + private fun migratePreference(key: String): Set? { + val fromOldSettings = oldPreferences.getStringSetCompat(key) + if (fromOldSettings != null) { + var newSettings: MutableSet = mutableSetOf() + for (oldBackend in fromOldSettings) { + // Get package name and sha1 + val parts = oldBackend.split("/".toRegex()).dropLastWhile(String::isEmpty).toTypedArray() + if (parts.size < 3) continue // skip unsigned + val pkgName = parts[0] + val component = parts[1] + val oldSig = parts[2] + if (oldSig?.length != 40) continue // skip if not sha1 + // Get matching sha256 + val sha1 = AbstractBackendHelper.firstSignatureDigest(context, pkgName, "SHA-1") + val sha256 = AbstractBackendHelper.firstSignatureDigest(context, pkgName, "SHA-256") + // If the system sha1 matches what we had stored + if (oldSig == sha1) { + // Replace it with the sha256 + val newBackend = "${pkgName}/${component}/${sha256}" + newSettings.add(newBackend) + } + } + if (preferences.edit().putStringSetCompat(key, newSettings.toSet()).commit()) { + // Only delete the old preference once committed. + oldPreferences.edit().remove(key).apply() + } + } + return null + } + var locationBackends: Set get() = getStringSetFromAny(PREF_LOCATION_BACKENDS) ?: emptySet() set(backends) {