From e045c6b0f501572f13876dd898fae583162764be Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 23 Oct 2020 09:55:48 +0530 Subject: [PATCH 01/10] Revert "Add option to automatically sync repository on app launch (#1137)" Fixes #1163 This reverts commit 92f1aab25da12411aa256c3b763e0cb6182e9320. Signed-off-by: Harsh Shandilya (cherry picked from commit 4905396c673dcfdf076c530a1cbb5be800e0920f) --- app/src/main/AndroidManifest.xml | 3 +- .../java/com/zeapo/pwdstore/LaunchActivity.kt | 58 ++++-------------- .../java/com/zeapo/pwdstore/UserPreference.kt | 3 - .../zeapo/pwdstore/utils/PreferenceKeys.kt | 1 - app/src/main/res/layout/activity_launch.xml | 59 ------------------- app/src/main/res/values/strings.xml | 3 - app/src/main/res/xml/preference.xml | 6 -- 7 files changed, 14 insertions(+), 119 deletions(-) delete mode 100644 app/src/main/res/layout/activity_launch.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a0a0e464..6cad066e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -42,7 +42,8 @@ + android:label="@string/app_name" + android:theme="@style/NoBackgroundTheme"> diff --git a/app/src/main/java/com/zeapo/pwdstore/LaunchActivity.kt b/app/src/main/java/com/zeapo/pwdstore/LaunchActivity.kt index 1003167f..268698e7 100644 --- a/app/src/main/java/com/zeapo/pwdstore/LaunchActivity.kt +++ b/app/src/main/java/com/zeapo/pwdstore/LaunchActivity.kt @@ -4,34 +4,20 @@ */ package com.zeapo.pwdstore -import android.content.ComponentName import android.content.Intent import android.os.Bundle import android.os.Handler +import androidx.appcompat.app.AppCompatActivity import androidx.core.content.edit -import androidx.core.view.isVisible -import androidx.lifecycle.lifecycleScope -import com.github.michaelbull.result.fold import com.zeapo.pwdstore.crypto.DecryptActivity -import com.zeapo.pwdstore.databinding.ActivityLaunchBinding -import com.zeapo.pwdstore.git.BaseGitActivity -import com.zeapo.pwdstore.git.config.AuthMode -import com.zeapo.pwdstore.git.config.GitSettings import com.zeapo.pwdstore.utils.BiometricAuthenticator -import com.zeapo.pwdstore.utils.PasswordRepository import com.zeapo.pwdstore.utils.PreferenceKeys import com.zeapo.pwdstore.utils.sharedPrefs -import com.zeapo.pwdstore.utils.viewBinding -import kotlinx.coroutines.launch -class LaunchActivity : BaseGitActivity() { - - private val binding by viewBinding(ActivityLaunchBinding::inflate) +class LaunchActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(binding.root) - supportActionBar?.hide() val prefs = sharedPrefs if (prefs.getBoolean(PreferenceKeys.BIOMETRIC_AUTH, false)) { BiometricAuthenticator.authenticate(this) { @@ -54,38 +40,18 @@ class LaunchActivity : BaseGitActivity() { } private fun startTargetActivity(noAuth: Boolean) { - if (intent.action == ACTION_DECRYPT_PASS) { - intent.component = ComponentName(this, DecryptActivity::class.java) - startPasswordStoreActivity(intent, noAuth) - } else { - val intent = Intent(this, PasswordStore::class.java) - val repo = PasswordRepository.initialize() - // if repo is null, let PasswordStore handle it. - if (repo != null && - !GitSettings.url.isNullOrEmpty() && - sharedPrefs.getBoolean(PreferenceKeys.SYNC_ON_LAUNCH, false)) { - binding.progressBar.isVisible = true - binding.sync.isVisible = true - runGitOperation { startPasswordStoreActivity(intent, noAuth) } - } else { - startPasswordStoreActivity(intent, noAuth) + val intentToStart = if (intent.action == ACTION_DECRYPT_PASS) + Intent(this, DecryptActivity::class.java).apply { + putExtra("NAME", intent.getStringExtra("NAME")) + putExtra("FILE_PATH", intent.getStringExtra("FILE_PATH")) + putExtra("REPO_PATH", intent.getStringExtra("REPO_PATH")) + putExtra("LAST_CHANGED_TIMESTAMP", intent.getLongExtra("LAST_CHANGED_TIMESTAMP", 0L)) } - } - } + else + Intent(this, PasswordStore::class.java) + startActivity(intentToStart) - private fun startPasswordStoreActivity(intent: Intent, noAuth: Boolean) { - Handler().postDelayed({ - startActivity(intent) - finish() - }, if (noAuth) 500L else 0L) - } - - private fun runGitOperation(onCompletion: () -> Unit) = lifecycleScope.launch { - val gitOp = if (GitSettings.authMode == AuthMode.None) GitOp.PULL else GitOp.SYNC - launchGitOperation(gitOp).fold( - success = { onCompletion.invoke() }, - failure = { promptOnErrorHandler(it) { onCompletion.invoke() } }, - ) + Handler().postDelayed({ finish() }, if (noAuth) 0L else 500L) } companion object { diff --git a/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt b/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt index 6edd9ceb..7f6727f2 100644 --- a/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt +++ b/app/src/main/java/com/zeapo/pwdstore/UserPreference.kt @@ -46,7 +46,6 @@ import com.zeapo.pwdstore.autofill.AutofillPreferenceActivity import com.zeapo.pwdstore.crypto.BasePgpActivity import com.zeapo.pwdstore.git.GitConfigActivity import com.zeapo.pwdstore.git.GitServerConfigActivity -import com.zeapo.pwdstore.git.config.GitSettings import com.zeapo.pwdstore.git.sshj.SshKey import com.zeapo.pwdstore.pwgenxkpwd.XkpwdDictionary import com.zeapo.pwdstore.sshkeygen.ShowSshKeyFragment @@ -425,8 +424,6 @@ class UserPreference : AppCompatActivity() { true } - findPreference(PreferenceKeys.SYNC_ON_LAUNCH)?.isVisible = !GitSettings.url.isNullOrEmpty() - val prefCustomXkpwdDictionary = findPreference(PreferenceKeys.PREF_KEY_CUSTOM_DICT) prefCustomXkpwdDictionary?.onPreferenceClickListener = ClickListener { prefsActivity.storeCustomDictionaryPath() diff --git a/app/src/main/java/com/zeapo/pwdstore/utils/PreferenceKeys.kt b/app/src/main/java/com/zeapo/pwdstore/utils/PreferenceKeys.kt index 33130f78..5ec40639 100644 --- a/app/src/main/java/com/zeapo/pwdstore/utils/PreferenceKeys.kt +++ b/app/src/main/java/com/zeapo/pwdstore/utils/PreferenceKeys.kt @@ -77,7 +77,6 @@ object PreferenceKeys { const val SSH_OPENKEYSTORE_CLEAR_KEY_ID = "ssh_openkeystore_clear_keyid" const val SSH_OPENKEYSTORE_KEYID = "ssh_openkeystore_keyid" const val SSH_SEE_KEY = "ssh_see_key" - const val SYNC_ON_LAUNCH = "sync_on_launch" @Deprecated("To be used only in Migrations.kt") const val USE_GENERATED_KEY = "use_generated_key" diff --git a/app/src/main/res/layout/activity_launch.xml b/app/src/main/res/layout/activity_launch.xml deleted file mode 100644 index df6e4f7b..00000000 --- a/app/src/main/res/layout/activity_launch.xml +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2e393994..4b4264f4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -409,9 +409,6 @@ It appears that your URL contains a custom port, but does not specify the ssh:// scheme.\nThis can cause the port to be considered a part of your path. Press OK here to fix the URL. HTTPS URL with custom port It looks like you are using a HTTPS URL with a custom port. This is not supported, and will cause problems down the line. Press OK to remove the port from your URL. - Sync on launch - Sync passwords when application is launched - Syncing… Proxy hostname diff --git a/app/src/main/res/xml/preference.xml b/app/src/main/res/xml/preference.xml index 6631133f..58a173c5 100644 --- a/app/src/main/res/xml/preference.xml +++ b/app/src/main/res/xml/preference.xml @@ -138,12 +138,6 @@ app:key="biometric_auth" app:summary="@string/biometric_auth_summary" app:title="@string/biometric_auth_title" /> - Date: Fri, 23 Oct 2020 09:57:36 +0530 Subject: [PATCH 02/10] CHANGELOG: add entry for auto sync rollback Signed-off-by: Harsh Shandilya (cherry picked from commit 491100be0f7993062b0d2c386b362ec434737d6c) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index f5c80ea5..ff618509 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Changed + +- The newly added automatic synchronisation feature has been rolled back due to multiple issues with its implementation. + ## [1.13.0] - 2020-10-22 ### Fixed From 24235fb0bf3f5f098c724428b6c30b8fac6e77d2 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 23 Oct 2020 10:21:19 +0530 Subject: [PATCH 03/10] autofill-parser: add support for multiple signatures for a single package Signed-off-by: Harsh Shandilya (cherry picked from commit 0480b759527420be754f0a2720bccf4a46d06304) --- .../FeatureAndTrustDetection.kt | 52 +++++++++---------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FeatureAndTrustDetection.kt b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FeatureAndTrustDetection.kt index b243a4c0..9c9f02e6 100644 --- a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FeatureAndTrustDetection.kt +++ b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FeatureAndTrustDetection.kt @@ -55,36 +55,36 @@ import androidx.annotation.RequiresApi * fields on the page, e.g. of those in iframes. */ private val TRUSTED_BROWSER_CERTIFICATE_HASH = mapOf( - "com.android.chrome" to "8P1sW0EPJcslw7UzRsiXL64w+O50Ed+RBICtay1g24M=", - "com.brave.browser" to "nC23BRNRX9v7vFhbPt89cSPU3GfJT/0wY2HB15u/GKw=", - "com.chrome.beta" to "2mM9NLaeY64hA7SdU84FL8X388U6q5T9wqIIvf0UJJw=", - "com.chrome.canary" to "IBnfofsj779wxbzRRDxb6rBPPy/0Nm6aweNFdjmiTPw=", - "com.chrome.dev" to "kETuX+5LvF4h3URmVDHE6x8fcaMnFqC8knvLs5Izyr8=", - "com.duckduckgo.mobile.android" to "u3uzHFc8RqHaf8XFKKas9DIQhFb+7FCBDH8zaU6z0tQ=", - "com.microsoft.emmx" to "AeGZlxCoLCdJtNUMRF3IXWcLYTYInQp2anOCfIKh6sk=", - "com.opera.mini.native" to "V6y8Ul8bLr0ZGWzW8BQ5fMkQ/RiEHgroUP68Ph5ZP/I=", - "com.opera.mini.native.beta" to "V6y8Ul8bLr0ZGWzW8BQ5fMkQ/RiEHgroUP68Ph5ZP/I=", - "com.opera.touch" to "qtjiBNJNF3k0yc0MY8xqo4779CxKaVcJfiIQ9X+qZ6o=", - "org.bromite.bromite" to "4e5c0HbXsNyEyytF+3i4bfLrOaO2xWuj3CkqXgw7lQQ=", - "org.gnu.icecat" to "wi2iuVvK/WYZUzd2g0Qzn9ef3kAisQURZ8U1WSMTkcM=", - "org.mozilla.fenix" to "UAR3kIjn+YjVvFzF+HmP6/T4zQhKGypG79TI7krq8hE=", - "org.mozilla.fenix.nightly" to "d+rEzu02r++6dheZMd1MwZWrDNVLrzVdIV57vdKOQCo=", - "org.mozilla.fennec_aurora" to "vASIg40G9Mpr8yOG2qsN2OvPPncweHRZ9i+zzRShuqo=", - "org.mozilla.fennec_fdroid" to "BmZTWO/YugW+I2pHoSywlY19dd2TnXfCsx9TmFN+vcU=", - "org.mozilla.firefox" to "p4tipRZbRJSy/q2edqKA0i2Tf+5iUa7OWZRGsuoxmwQ=", - "org.mozilla.firefox_beta" to "p4tipRZbRJSy/q2edqKA0i2Tf+5iUa7OWZRGsuoxmwQ=", - "org.mozilla.focus" to "YgOkc7421k7jf4f6UA7bx56rkwYQq5ufpMp9XB8bT/w=", - "org.mozilla.klar" to "YgOkc7421k7jf4f6UA7bx56rkwYQq5ufpMp9XB8bT/w=", - "org.torproject.torbrowser" to "IAYfBF5zfGc3XBd5TP7bQ2oDzsa6y3y5+WZCIFyizsg=", - "org.ungoogled.chromium.stable" to "29UOO5cXoxO/e/hH3hOu6bbtg1My4tK6Eik2Ym5Krtk=", - "org.ungoogled.chromium.extensions.stable" to "29UOO5cXoxO/e/hH3hOu6bbtg1My4tK6Eik2Ym5Krtk=", - "com.kiwibrowser.browser" to "wGnqlmMy6R4KDDzFd+b1Cf49ndr3AVrQxcXvj9o/hig=", + "com.android.chrome" to arrayOf("8P1sW0EPJcslw7UzRsiXL64w+O50Ed+RBICtay1g24M="), + "com.brave.browser" to arrayOf("nC23BRNRX9v7vFhbPt89cSPU3GfJT/0wY2HB15u/GKw="), + "com.chrome.beta" to arrayOf("2mM9NLaeY64hA7SdU84FL8X388U6q5T9wqIIvf0UJJw="), + "com.chrome.canary" to arrayOf("IBnfofsj779wxbzRRDxb6rBPPy/0Nm6aweNFdjmiTPw="), + "com.chrome.dev" to arrayOf("kETuX+5LvF4h3URmVDHE6x8fcaMnFqC8knvLs5Izyr8="), + "com.duckduckgo.mobile.android" to arrayOf("u3uzHFc8RqHaf8XFKKas9DIQhFb+7FCBDH8zaU6z0tQ="), + "com.microsoft.emmx" to arrayOf("AeGZlxCoLCdJtNUMRF3IXWcLYTYInQp2anOCfIKh6sk="), + "com.opera.mini.native" to arrayOf("V6y8Ul8bLr0ZGWzW8BQ5fMkQ/RiEHgroUP68Ph5ZP/I="), + "com.opera.mini.native.beta" to arrayOf("V6y8Ul8bLr0ZGWzW8BQ5fMkQ/RiEHgroUP68Ph5ZP/I="), + "com.opera.touch" to arrayOf("qtjiBNJNF3k0yc0MY8xqo4779CxKaVcJfiIQ9X+qZ6o="), + "org.bromite.bromite" to arrayOf("4e5c0HbXsNyEyytF+3i4bfLrOaO2xWuj3CkqXgw7lQQ="), + "org.gnu.icecat" to arrayOf("wi2iuVvK/WYZUzd2g0Qzn9ef3kAisQURZ8U1WSMTkcM="), + "org.mozilla.fenix" to arrayOf("UAR3kIjn+YjVvFzF+HmP6/T4zQhKGypG79TI7krq8hE="), + "org.mozilla.fenix.nightly" to arrayOf("d+rEzu02r++6dheZMd1MwZWrDNVLrzVdIV57vdKOQCo="), + "org.mozilla.fennec_aurora" to arrayOf("vASIg40G9Mpr8yOG2qsN2OvPPncweHRZ9i+zzRShuqo="), + "org.mozilla.fennec_fdroid" to arrayOf("BmZTWO/YugW+I2pHoSywlY19dd2TnXfCsx9TmFN+vcU="), + "org.mozilla.firefox" to arrayOf("p4tipRZbRJSy/q2edqKA0i2Tf+5iUa7OWZRGsuoxmwQ="), + "org.mozilla.firefox_beta" to arrayOf("p4tipRZbRJSy/q2edqKA0i2Tf+5iUa7OWZRGsuoxmwQ="), + "org.mozilla.focus" to arrayOf("YgOkc7421k7jf4f6UA7bx56rkwYQq5ufpMp9XB8bT/w="), + "org.mozilla.klar" to arrayOf("YgOkc7421k7jf4f6UA7bx56rkwYQq5ufpMp9XB8bT/w="), + "org.torproject.torbrowser" to arrayOf("IAYfBF5zfGc3XBd5TP7bQ2oDzsa6y3y5+WZCIFyizsg="), + "org.ungoogled.chromium.stable" to arrayOf("29UOO5cXoxO/e/hH3hOu6bbtg1My4tK6Eik2Ym5Krtk="), + "org.ungoogled.chromium.extensions.stable" to arrayOf("29UOO5cXoxO/e/hH3hOu6bbtg1My4tK6Eik2Ym5Krtk="), + "com.kiwibrowser.browser" to arrayOf("wGnqlmMy6R4KDDzFd+b1Cf49ndr3AVrQxcXvj9o/hig="), ) private fun isTrustedBrowser(context: Context, appPackage: String): Boolean { - val expectedCertificateHash = TRUSTED_BROWSER_CERTIFICATE_HASH[appPackage] ?: return false + val expectedCertificateHashes = TRUSTED_BROWSER_CERTIFICATE_HASH[appPackage] ?: return false val certificateHash = computeCertificatesHash(context, appPackage) - return certificateHash == expectedCertificateHash + return certificateHash in expectedCertificateHashes } enum class BrowserMultiOriginMethod { From 92678279c2400b3f94f624a529e9a02b295f5ebd Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 23 Oct 2020 10:21:33 +0530 Subject: [PATCH 04/10] autofill-parser: add DuckDuckGo's F-Droid signature Signed-off-by: Harsh Shandilya (cherry picked from commit 8eec5cc6c7dc6d4c50dadf78e6cdc948c19486a5) --- .../autofillparser/FeatureAndTrustDetection.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FeatureAndTrustDetection.kt b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FeatureAndTrustDetection.kt index 9c9f02e6..a8ed0c85 100644 --- a/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FeatureAndTrustDetection.kt +++ b/autofill-parser/src/main/java/com/github/androidpasswordstore/autofillparser/FeatureAndTrustDetection.kt @@ -60,7 +60,7 @@ private val TRUSTED_BROWSER_CERTIFICATE_HASH = mapOf( "com.chrome.beta" to arrayOf("2mM9NLaeY64hA7SdU84FL8X388U6q5T9wqIIvf0UJJw="), "com.chrome.canary" to arrayOf("IBnfofsj779wxbzRRDxb6rBPPy/0Nm6aweNFdjmiTPw="), "com.chrome.dev" to arrayOf("kETuX+5LvF4h3URmVDHE6x8fcaMnFqC8knvLs5Izyr8="), - "com.duckduckgo.mobile.android" to arrayOf("u3uzHFc8RqHaf8XFKKas9DIQhFb+7FCBDH8zaU6z0tQ="), + "com.duckduckgo.mobile.android" to arrayOf("u3uzHFc8RqHaf8XFKKas9DIQhFb+7FCBDH8zaU6z0tQ=", "8HB9AhwL8+b43MEbo/VwBCXVl9yjAaMeIQVWk067Gwo="), "com.microsoft.emmx" to arrayOf("AeGZlxCoLCdJtNUMRF3IXWcLYTYInQp2anOCfIKh6sk="), "com.opera.mini.native" to arrayOf("V6y8Ul8bLr0ZGWzW8BQ5fMkQ/RiEHgroUP68Ph5ZP/I="), "com.opera.mini.native.beta" to arrayOf("V6y8Ul8bLr0ZGWzW8BQ5fMkQ/RiEHgroUP68Ph5ZP/I="), From 41fb76d0f28458102a0ff054b1002a7d21c30f59 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 23 Oct 2020 10:27:03 +0530 Subject: [PATCH 05/10] CHANGELOG: add note about F-Droid DDG support Signed-off-by: Harsh Shandilya (cherry picked from commit e051fdf174e4ac36647f1639cc8d0a968b440709) --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff618509..619b7708 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added + +- Add support for domain-level autofill in DuckDuckGo's F-Droid builds. + ### Changed - The newly added automatic synchronisation feature has been rolled back due to multiple issues with its implementation. From 2b25171bf28fdc18f9154e24d87d8cedb90815d8 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 23 Oct 2020 15:23:47 +0530 Subject: [PATCH 06/10] Workaround AndroidX lifecycle requirements in OpenKeychain auth (#1168) * Workaround AndroidX lifecycle requirements in OpenKeychain auth Signed-off-by: Harsh Shandilya * CHANGELOG: add OpenKeychain fix Signed-off-by: Harsh Shandilya Co-authored-by: Fabian Henneke (cherry picked from commit 66b31f1432a1405143323f92ca7e33d6c98ee0a2) --- CHANGELOG.md | 4 ++ .../com/zeapo/pwdstore/git/BaseGitActivity.kt | 3 +- .../git/operation/BreakOutOfDetached.kt | 4 +- .../pwdstore/git/operation/CloneOperation.kt | 4 +- .../pwdstore/git/operation/GitOperation.kt | 10 +++-- .../pwdstore/git/operation/PullOperation.kt | 4 +- .../pwdstore/git/operation/PushOperation.kt | 4 +- .../git/operation/ResetToRemoteOperation.kt | 4 +- .../pwdstore/git/operation/SyncOperation.kt | 4 +- .../git/sshj/ContinuationContainerActivity.kt | 37 +++++++++++++++++++ .../git/sshj/OpenKeychainKeyProvider.kt | 27 +++----------- .../pwdstore/git/sshj/SshjSessionFactory.kt | 9 ++--- 12 files changed, 70 insertions(+), 44 deletions(-) create mode 100644 app/src/main/java/com/zeapo/pwdstore/git/sshj/ContinuationContainerActivity.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 619b7708..fa4b3d65 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Fixed + +- OpenKeychain authentication would fail with `LifecycleOwner com.zeapo.pwdstore.git.GitServerConfigActivity@f578da1 is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.` + ### Added - Add support for domain-level autofill in DuckDuckGo's F-Droid builds. diff --git a/app/src/main/java/com/zeapo/pwdstore/git/BaseGitActivity.kt b/app/src/main/java/com/zeapo/pwdstore/git/BaseGitActivity.kt index 36b8b6fb..b47647c1 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/BaseGitActivity.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/BaseGitActivity.kt @@ -20,6 +20,7 @@ import com.zeapo.pwdstore.git.operation.PullOperation import com.zeapo.pwdstore.git.operation.PushOperation import com.zeapo.pwdstore.git.operation.ResetToRemoteOperation import com.zeapo.pwdstore.git.operation.SyncOperation +import com.zeapo.pwdstore.git.sshj.ContinuationContainerActivity import com.zeapo.pwdstore.utils.PreferenceKeys import com.zeapo.pwdstore.utils.getEncryptedGitPrefs import com.zeapo.pwdstore.utils.sharedPrefs @@ -33,7 +34,7 @@ import net.schmizz.sshj.userauth.UserAuthException * Abstract [AppCompatActivity] that holds some information that is commonly shared across git-related * tasks and makes sense to be held here. */ -abstract class BaseGitActivity : AppCompatActivity() { +abstract class BaseGitActivity : ContinuationContainerActivity() { /** * Enum of possible Git operations than can be run through [launchGitOperation]. diff --git a/app/src/main/java/com/zeapo/pwdstore/git/operation/BreakOutOfDetached.kt b/app/src/main/java/com/zeapo/pwdstore/git/operation/BreakOutOfDetached.kt index 6c7fee3a..f7759ada 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/operation/BreakOutOfDetached.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/operation/BreakOutOfDetached.kt @@ -4,12 +4,12 @@ */ package com.zeapo.pwdstore.git.operation -import androidx.appcompat.app.AppCompatActivity import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.zeapo.pwdstore.R +import com.zeapo.pwdstore.git.sshj.ContinuationContainerActivity import org.eclipse.jgit.api.RebaseCommand -class BreakOutOfDetached(callingActivity: AppCompatActivity) : GitOperation(callingActivity) { +class BreakOutOfDetached(callingActivity: ContinuationContainerActivity) : GitOperation(callingActivity) { override val commands = arrayOf( // abort the rebase diff --git a/app/src/main/java/com/zeapo/pwdstore/git/operation/CloneOperation.kt b/app/src/main/java/com/zeapo/pwdstore/git/operation/CloneOperation.kt index 256437a8..2a94a283 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/operation/CloneOperation.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/operation/CloneOperation.kt @@ -4,7 +4,7 @@ */ package com.zeapo.pwdstore.git.operation -import androidx.appcompat.app.AppCompatActivity +import com.zeapo.pwdstore.git.sshj.ContinuationContainerActivity import org.eclipse.jgit.api.Git import org.eclipse.jgit.api.GitCommand @@ -14,7 +14,7 @@ import org.eclipse.jgit.api.GitCommand * @param uri URL to clone the repository from * @param callingActivity the calling activity */ -class CloneOperation(callingActivity: AppCompatActivity, uri: String) : GitOperation(callingActivity) { +class CloneOperation(callingActivity: ContinuationContainerActivity, uri: String) : GitOperation(callingActivity) { override val commands: Array> = arrayOf( Git.cloneRepository().setBranch(remoteBranch).setDirectory(repository.workTree).setURI(uri), diff --git a/app/src/main/java/com/zeapo/pwdstore/git/operation/GitOperation.kt b/app/src/main/java/com/zeapo/pwdstore/git/operation/GitOperation.kt index d7ff7c4c..491feaf0 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/operation/GitOperation.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/operation/GitOperation.kt @@ -19,6 +19,7 @@ import com.zeapo.pwdstore.UserPreference import com.zeapo.pwdstore.git.GitCommandExecutor import com.zeapo.pwdstore.git.config.AuthMode import com.zeapo.pwdstore.git.config.GitSettings +import com.zeapo.pwdstore.git.sshj.ContinuationContainerActivity import com.zeapo.pwdstore.git.sshj.SshAuthMethod import com.zeapo.pwdstore.git.sshj.SshKey import com.zeapo.pwdstore.git.sshj.SshjSessionFactory @@ -55,6 +56,7 @@ abstract class GitOperation(protected val callingActivity: FragmentActivity) { protected val repository = PasswordRepository.getRepository(null)!! protected val git = Git(repository) protected val remoteBranch = GitSettings.branch + private val authActivity get() = callingActivity as ContinuationContainerActivity private class HttpsCredentialsProvider(private val passwordFinder: PasswordFinder) : CredentialsProvider() { @@ -154,7 +156,7 @@ abstract class GitOperation(protected val callingActivity: FragmentActivity) { } when (result) { is BiometricAuthenticator.Result.Success -> { - registerAuthProviders(SshAuthMethod.SshKey(callingActivity)) + registerAuthProviders(SshAuthMethod.SshKey(authActivity)) } is BiometricAuthenticator.Result.Cancelled -> { return Err(SSHException(DisconnectReason.AUTH_CANCELLED_BY_USER)) @@ -172,7 +174,7 @@ abstract class GitOperation(protected val callingActivity: FragmentActivity) { } } } else { - registerAuthProviders(SshAuthMethod.SshKey(callingActivity)) + registerAuthProviders(SshAuthMethod.SshKey(authActivity)) } } else { onMissingSshKeyFile() @@ -180,10 +182,10 @@ abstract class GitOperation(protected val callingActivity: FragmentActivity) { // error, allowing users to make the SSH key selection. return Err(SSHException(DisconnectReason.AUTH_CANCELLED_BY_USER)) } - AuthMode.OpenKeychain -> registerAuthProviders(SshAuthMethod.OpenKeychain(callingActivity)) + AuthMode.OpenKeychain -> registerAuthProviders(SshAuthMethod.OpenKeychain(authActivity)) AuthMode.Password -> { val httpsCredentialProvider = HttpsCredentialsProvider(CredentialFinder(callingActivity, AuthMode.Password)) - registerAuthProviders(SshAuthMethod.Password(callingActivity), httpsCredentialProvider) + registerAuthProviders(SshAuthMethod.Password(authActivity), httpsCredentialProvider) } AuthMode.None -> { } diff --git a/app/src/main/java/com/zeapo/pwdstore/git/operation/PullOperation.kt b/app/src/main/java/com/zeapo/pwdstore/git/operation/PullOperation.kt index 8173105c..4dcc3ec4 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/operation/PullOperation.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/operation/PullOperation.kt @@ -4,10 +4,10 @@ */ package com.zeapo.pwdstore.git.operation -import androidx.appcompat.app.AppCompatActivity +import com.zeapo.pwdstore.git.sshj.ContinuationContainerActivity import org.eclipse.jgit.api.GitCommand -class PullOperation(callingActivity: AppCompatActivity) : GitOperation(callingActivity) { +class PullOperation(callingActivity: ContinuationContainerActivity) : GitOperation(callingActivity) { /** * The story of why the pull operation is committing files goes like this: Once upon a time when diff --git a/app/src/main/java/com/zeapo/pwdstore/git/operation/PushOperation.kt b/app/src/main/java/com/zeapo/pwdstore/git/operation/PushOperation.kt index d3bee209..28d7a6fa 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/operation/PushOperation.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/operation/PushOperation.kt @@ -4,10 +4,10 @@ */ package com.zeapo.pwdstore.git.operation -import androidx.appcompat.app.AppCompatActivity +import com.zeapo.pwdstore.git.sshj.ContinuationContainerActivity import org.eclipse.jgit.api.GitCommand -class PushOperation(callingActivity: AppCompatActivity) : GitOperation(callingActivity) { +class PushOperation(callingActivity: ContinuationContainerActivity) : GitOperation(callingActivity) { override val commands: Array> = arrayOf( git.push().setPushAll().setRemote("origin"), diff --git a/app/src/main/java/com/zeapo/pwdstore/git/operation/ResetToRemoteOperation.kt b/app/src/main/java/com/zeapo/pwdstore/git/operation/ResetToRemoteOperation.kt index 2df7a2b4..ad0fb823 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/operation/ResetToRemoteOperation.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/operation/ResetToRemoteOperation.kt @@ -4,10 +4,10 @@ */ package com.zeapo.pwdstore.git.operation -import androidx.appcompat.app.AppCompatActivity +import com.zeapo.pwdstore.git.sshj.ContinuationContainerActivity import org.eclipse.jgit.api.ResetCommand -class ResetToRemoteOperation(callingActivity: AppCompatActivity) : GitOperation(callingActivity) { +class ResetToRemoteOperation(callingActivity: ContinuationContainerActivity) : GitOperation(callingActivity) { override val commands = arrayOf( // Stage all files diff --git a/app/src/main/java/com/zeapo/pwdstore/git/operation/SyncOperation.kt b/app/src/main/java/com/zeapo/pwdstore/git/operation/SyncOperation.kt index a0a80fe3..8c1ec1fa 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/operation/SyncOperation.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/operation/SyncOperation.kt @@ -4,9 +4,9 @@ */ package com.zeapo.pwdstore.git.operation -import androidx.appcompat.app.AppCompatActivity +import com.zeapo.pwdstore.git.sshj.ContinuationContainerActivity -class SyncOperation(callingActivity: AppCompatActivity) : GitOperation(callingActivity) { +class SyncOperation(callingActivity: ContinuationContainerActivity) : GitOperation(callingActivity) { override val commands = arrayOf( // Stage all files diff --git a/app/src/main/java/com/zeapo/pwdstore/git/sshj/ContinuationContainerActivity.kt b/app/src/main/java/com/zeapo/pwdstore/git/sshj/ContinuationContainerActivity.kt new file mode 100644 index 00000000..32ee64a8 --- /dev/null +++ b/app/src/main/java/com/zeapo/pwdstore/git/sshj/ContinuationContainerActivity.kt @@ -0,0 +1,37 @@ +/* + * Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved. + * SPDX-License-Identifier: GPL-3.0-only + */ +package com.zeapo.pwdstore.git.sshj + +import android.content.Intent +import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.LayoutRes +import androidx.appcompat.app.AppCompatActivity +import kotlin.coroutines.Continuation +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import net.schmizz.sshj.common.DisconnectReason +import net.schmizz.sshj.userauth.UserAuthException + +/** + * Workaround for https://msfjarvis.dev/aps/issue/1164 + */ +open class ContinuationContainerActivity : AppCompatActivity { + + constructor() : super() + constructor(@LayoutRes layoutRes: Int) : super(layoutRes) + + var stashedCont: Continuation? = null + + val continueAfterUserInteraction = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result -> + stashedCont?.let { cont -> + stashedCont = null + val data = result.data + if (data != null) + cont.resume(data) + else + cont.resumeWithException(UserAuthException(DisconnectReason.AUTH_CANCELLED_BY_USER)) + } + } +} diff --git a/app/src/main/java/com/zeapo/pwdstore/git/sshj/OpenKeychainKeyProvider.kt b/app/src/main/java/com/zeapo/pwdstore/git/sshj/OpenKeychainKeyProvider.kt index cdaa0342..97774d92 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/sshj/OpenKeychainKeyProvider.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/sshj/OpenKeychainKeyProvider.kt @@ -7,18 +7,14 @@ package com.zeapo.pwdstore.git.sshj import android.app.PendingIntent import android.content.Intent import androidx.activity.result.IntentSenderRequest -import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.edit -import androidx.fragment.app.FragmentActivity import com.github.ajalt.timberkt.d import com.zeapo.pwdstore.utils.OPENPGP_PROVIDER import com.zeapo.pwdstore.utils.PreferenceKeys import com.zeapo.pwdstore.utils.sharedPrefs import java.io.Closeable import java.security.PublicKey -import kotlin.coroutines.Continuation import kotlin.coroutines.resume -import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -39,11 +35,11 @@ import org.openintents.ssh.authentication.response.Response import org.openintents.ssh.authentication.response.SigningResponse import org.openintents.ssh.authentication.response.SshPublicKeyResponse -class OpenKeychainKeyProvider private constructor(activity: FragmentActivity) : KeyProvider, Closeable { +class OpenKeychainKeyProvider private constructor(val activity: ContinuationContainerActivity) : KeyProvider, Closeable { companion object { - suspend fun prepareAndUse(activity: FragmentActivity, block: (provider: OpenKeychainKeyProvider) -> Unit) { + suspend fun prepareAndUse(activity: ContinuationContainerActivity, block: (provider: OpenKeychainKeyProvider) -> Unit) { withContext(Dispatchers.Main) { OpenKeychainKeyProvider(activity) }.prepareAndUse(block) @@ -59,21 +55,8 @@ class OpenKeychainKeyProvider private constructor(activity: FragmentActivity) : private val context = activity.applicationContext private val sshServiceConnection = SshAuthenticationConnection(context, OPENPGP_PROVIDER) private val preferences = context.sharedPrefs - private val continueAfterUserInteraction = - activity.registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result -> - currentCont?.let { cont -> - currentCont = null - val data = result.data - if (data != null) - cont.resume(data) - else - cont.resumeWithException(UserAuthException(DisconnectReason.AUTH_CANCELLED_BY_USER)) - } - } - private lateinit var sshServiceApi: SshAuthenticationApi - private var currentCont: Continuation? = null private var keyId get() = preferences.getString(PreferenceKeys.SSH_OPENKEYSTORE_KEYID, null) set(value) { @@ -164,8 +147,8 @@ class OpenKeychainKeyProvider private constructor(activity: FragmentActivity) : val pendingIntent: PendingIntent = result.getParcelableExtra(SshAuthenticationApi.EXTRA_PENDING_INTENT)!! val resultOfUserInteraction: Intent = withContext(Dispatchers.Main) { suspendCoroutine { cont -> - currentCont = cont - continueAfterUserInteraction.launch(IntentSenderRequest.Builder(pendingIntent).build()) + activity.stashedCont = cont + activity.continueAfterUserInteraction.launch(IntentSenderRequest.Builder(pendingIntent).build()) } } executeApiRequest(request, resultOfUserInteraction) @@ -196,7 +179,7 @@ class OpenKeychainKeyProvider private constructor(activity: FragmentActivity) : } override fun close() { - continueAfterUserInteraction.unregister() + activity.continueAfterUserInteraction.unregister() sshServiceConnection.disconnect() } diff --git a/app/src/main/java/com/zeapo/pwdstore/git/sshj/SshjSessionFactory.kt b/app/src/main/java/com/zeapo/pwdstore/git/sshj/SshjSessionFactory.kt index f064df33..c36f27b3 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/sshj/SshjSessionFactory.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/sshj/SshjSessionFactory.kt @@ -5,7 +5,6 @@ package com.zeapo.pwdstore.git.sshj import android.util.Base64 -import androidx.fragment.app.FragmentActivity import com.github.ajalt.timberkt.d import com.github.ajalt.timberkt.w import com.github.michaelbull.result.getOrElse @@ -40,10 +39,10 @@ import org.eclipse.jgit.transport.SshSessionFactory import org.eclipse.jgit.transport.URIish import org.eclipse.jgit.util.FS -sealed class SshAuthMethod(val activity: FragmentActivity) { - class Password(activity: FragmentActivity) : SshAuthMethod(activity) - class SshKey(activity: FragmentActivity) : SshAuthMethod(activity) - class OpenKeychain(activity: FragmentActivity) : SshAuthMethod(activity) +sealed class SshAuthMethod(val activity: ContinuationContainerActivity) { + class Password(activity: ContinuationContainerActivity) : SshAuthMethod(activity) + class SshKey(activity: ContinuationContainerActivity) : SshAuthMethod(activity) + class OpenKeychain(activity: ContinuationContainerActivity) : SshAuthMethod(activity) } abstract class InteractivePasswordFinder : PasswordFinder { From 53b9a807a19d62f11190f5fbe3405a870e16874d Mon Sep 17 00:00:00 2001 From: Joris Minjat Date: Fri, 23 Oct 2020 18:13:37 +0200 Subject: [PATCH 07/10] Minimal support for MIME secret encoding (#1170) Co-authored-by: Fabian Henneke (cherry picked from commit 38ece10e0dfdc907089b7ddc4e6c9d17e69013f3) --- .../com/zeapo/pwdstore/model/PasswordEntry.kt | 26 ++++++++++++++----- .../zeapo/pwdstore/model/PasswordEntryTest.kt | 9 +++++++ 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/zeapo/pwdstore/model/PasswordEntry.kt b/app/src/main/java/com/zeapo/pwdstore/model/PasswordEntry.kt index 556b2c87..a143fcb9 100644 --- a/app/src/main/java/com/zeapo/pwdstore/model/PasswordEntry.kt +++ b/app/src/main/java/com/zeapo/pwdstore/model/PasswordEntry.kt @@ -31,9 +31,9 @@ class PasswordEntry(content: String, private val totpFinder: TotpFinder = UriTot constructor(os: ByteArrayOutputStream) : this(os.toString("UTF-8"), UriTotpFinder()) init { - val passContent = content.split("\n".toRegex(), 2).toTypedArray() - password = if (UriTotpFinder.TOTP_FIELDS.any { passContent[0].startsWith(it) }) "" else passContent[0] - extraContent = findExtraContent(passContent) + val (foundPassword, passContent) = findAndStripPassword(content.split("\n".toRegex())) + password = foundPassword + extraContent = passContent.joinToString("\n") username = findUsername() digits = findOtpDigits(content) totpSecret = findTotpSecret(content) @@ -86,10 +86,16 @@ class PasswordEntry(content: String, private val totpFinder: TotpFinder = UriTot return null } - private fun findExtraContent(passContent: Array) = when { - password.isEmpty() && passContent[0].isNotEmpty() -> passContent[0] - passContent.size > 1 -> passContent[1] - else -> "" + private fun findAndStripPassword(passContent: List): Pair> { + if (UriTotpFinder.TOTP_FIELDS.any { passContent[0].startsWith(it) }) return Pair("", passContent) + for (line in passContent) { + for (prefix in PASSWORD_FIELDS) { + if (line.startsWith(prefix, ignoreCase = true)) { + return Pair(line.substring(prefix.length).trimStart(), passContent.minus(line)) + } + } + } + return Pair(passContent[0], passContent.minus(passContent[0])) } private fun findTotpSecret(decryptedContent: String): String? { @@ -121,5 +127,11 @@ class PasswordEntry(content: String, private val totpFinder: TotpFinder = UriTot "id:", "identity:" ) + + val PASSWORD_FIELDS = arrayOf( + "password:", + "secret:", + "pass:", + ) } } diff --git a/app/src/test/java/com/zeapo/pwdstore/model/PasswordEntryTest.kt b/app/src/test/java/com/zeapo/pwdstore/model/PasswordEntryTest.kt index 6eecfe45..04c606e8 100644 --- a/app/src/test/java/com/zeapo/pwdstore/model/PasswordEntryTest.kt +++ b/app/src/test/java/com/zeapo/pwdstore/model/PasswordEntryTest.kt @@ -28,6 +28,12 @@ class PasswordEntryTest { assertEquals("", makeEntry("\nblubb").password) assertEquals("", makeEntry("\n").password) assertEquals("", makeEntry("").password) + for (field in PasswordEntry.PASSWORD_FIELDS) { + assertEquals("fooooo", makeEntry("\n$field fooooo").password) + assertEquals("fooooo", makeEntry("\n${field.toUpperCase()} fooooo").password) + assertEquals("fooooo", makeEntry("GOPASS-SECRET-1.0\n$field fooooo").password) + assertEquals("fooooo", makeEntry("someFirstLine\nUsername: bar\n$field fooooo").password) + } } @Test fun testGetExtraContent() { @@ -37,6 +43,9 @@ class PasswordEntryTest { assertEquals("", makeEntry("fooooo").extraContent) assertEquals("blubb\n", makeEntry("\nblubb\n").extraContent) assertEquals("blubb", makeEntry("\nblubb").extraContent) + assertEquals("blubb", makeEntry("blubb\npassword: foo").extraContent) + assertEquals("blubb", makeEntry("password: foo\nblubb").extraContent) + assertEquals("blubb\nusername: bar", makeEntry("blubb\npassword: foo\nusername: bar").extraContent) assertEquals("", makeEntry("\n").extraContent) assertEquals("", makeEntry("").extraContent) } From ee63b0677ab8211bf49dfd434d03778fb0c80f58 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 23 Oct 2020 21:56:07 +0530 Subject: [PATCH 08/10] CHANGELOG: add #1170 Signed-off-by: Harsh Shandilya --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa4b3d65..5aa3546d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. ### Added - Add support for domain-level autofill in DuckDuckGo's F-Droid builds. +- Support gopass MIME secret encoding ### Changed From d029cd1f47d78987f6530f0a0459a0b636881cc7 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Fri, 23 Oct 2020 16:27:28 +0000 Subject: [PATCH 09/10] CHANGELOG: bump for 1.13.1 --- CHANGELOG.md | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5aa3546d..81cac0a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,34 +4,36 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +## [1.13.1] - 2020-10-23 + ### Fixed -- OpenKeychain authentication would fail with `LifecycleOwner com.zeapo.pwdstore.git.GitServerConfigActivity@f578da1 is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.` +- OpenKeychain authentication would fail with `LifecycleOwner com.zeapo.pwdstore.git.GitServerConfigActivity@f578da1 is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.` ### Added -- Add support for domain-level autofill in DuckDuckGo's F-Droid builds. -- Support gopass MIME secret encoding +- Add support for domain-level autofill in DuckDuckGo's F-Droid builds. +- Support gopass MIME secret encoding ### Changed -- The newly added automatic synchronisation feature has been rolled back due to multiple issues with its implementation. +- The newly added automatic synchronisation feature has been rolled back due to multiple issues with its implementation. ## [1.13.0] - 2020-10-22 ### Fixed -- Some classes of errors would be swallowed by an unhelpful 'Invalid remote: origin' message -- Repositories created within APS would contain invalid `.gpg-id` files with no ability to fix them from the app -- Button labels were invisible in Autofill phishing warning screen -- Unsupported authentication modes would appear briefly in the server config screen +- Some classes of errors would be swallowed by an unhelpful 'Invalid remote: origin' message +- Repositories created within APS would contain invalid `.gpg-id` files with no ability to fix them from the app +- Button labels were invisible in Autofill phishing warning screen +- Unsupported authentication modes would appear briefly in the server config screen ### Added -- Add GPG key selection step to onboarding flow -- Allow configuring an app-wide HTTP(S) proxy -- Add option to automatically sync repository on app launch -- Add a quickfix for invalid HTTPS URLs that contain a custom port +- Add GPG key selection step to onboarding flow +- Allow configuring an app-wide HTTP(S) proxy +- Add option to automatically sync repository on app launch +- Add a quickfix for invalid HTTPS URLs that contain a custom port ## [1.12.1] - 2020-10-13 @@ -383,7 +385,9 @@ All notable changes to this project will be documented in this file. - Fix elements overlapping. -[Unreleased]: https://github.com/android-password-store/Android-Password-Store/compare/v1.13.0...HEAD +[Unreleased]: https://github.com/android-password-store/Android-Password-Store/compare/1.13.1...HEAD + +[1.13.1]: https://github.com/android-password-store/Android-Password-Store/compare/1.13.0...1.13.1 [1.13.0]: https://github.com/android-password-store/Android-Password-Store/compare/v1.12.1...v1.13.0 From 5cfa1f165f1905cd6dbe4fa7bfca1593672a7322 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Fri, 23 Oct 2020 21:58:26 +0530 Subject: [PATCH 10/10] build: bump version Signed-off-by: Harsh Shandilya --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index aa5ac4c4..d400c737 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -35,8 +35,8 @@ android { defaultConfig { applicationId = "dev.msfjarvis.aps" - versionCode = 11300 - versionName = "1.13.0" + versionCode = 11310 + versionName = "1.13.1" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" }