From 96b51e73ec48b95909ed039e8faefadc72c9eeff Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Thu, 10 Dec 2020 22:47:18 +0530 Subject: Better guidance for users to deal with host key changes (#1242) * Provide actionable guidance for host key mismatches Signed-off-by: Harsh Shandilya * Update changelog Signed-off-by: Harsh Shandilya * Hide host key clear button after use Signed-off-by: Harsh Shandilya (cherry picked from commit ce2e657108187a34416cfbfc0c5d2fc8bb9277f3) Signed-off-by: Harsh Shandilya --- .../java/com/zeapo/pwdstore/git/BaseGitActivity.kt | 5 +++++ .../zeapo/pwdstore/git/GitServerConfigActivity.kt | 6 ++++++ .../com/zeapo/pwdstore/git/config/GitSettings.kt | 20 +++++++++++++++++++- 3 files changed, 30 insertions(+), 1 deletion(-) (limited to 'app/src/main/java') 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 b47647c1..5248d259 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/BaseGitActivity.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/BaseGitActivity.kt @@ -28,6 +28,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import net.schmizz.sshj.common.DisconnectReason import net.schmizz.sshj.common.SSHException +import net.schmizz.sshj.transport.TransportException import net.schmizz.sshj.userauth.UserAuthException /** @@ -74,6 +75,10 @@ abstract class BaseGitActivity : ContinuationContainerActivity() { if (err.message?.contains("cannot open additional channels") == true) { GitSettings.useMultiplexing = false SSHException(DisconnectReason.TOO_MANY_CONNECTIONS, "The server does not support multiple Git operations per SSH session. Please try again, a slower fallback mode will be used.") + } else if (err is TransportException && err.disconnectReason == DisconnectReason.HOST_KEY_NOT_VERIFIABLE) { + SSHException(DisconnectReason.HOST_KEY_NOT_VERIFIABLE, + "WARNING: The remote host key has changed. If this is expected, please go to Git server settings and clear the saved host key." + ) } else { err } diff --git a/app/src/main/java/com/zeapo/pwdstore/git/GitServerConfigActivity.kt b/app/src/main/java/com/zeapo/pwdstore/git/GitServerConfigActivity.kt index 235af58b..4d330cf8 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/GitServerConfigActivity.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/GitServerConfigActivity.kt @@ -82,6 +82,12 @@ class GitServerConfigActivity : BaseGitActivity() { setAuthModes(text.startsWith("http://") || text.startsWith("https://")) } + binding.clearHostKeyButton.isVisible = GitSettings.hasSavedHostKey() + binding.clearHostKeyButton.setOnClickListener { + GitSettings.clearSavedHostKey() + Snackbar.make(binding.root, getString(R.string.clear_saved_host_key_success), Snackbar.LENGTH_LONG).show() + it.isVisible = false + } binding.saveButton.setOnClickListener { val newUrl = binding.serverUrl.text.toString().trim() // If url is of type john_doe@example.org:12435/path/to/repo, then not adding `ssh://` diff --git a/app/src/main/java/com/zeapo/pwdstore/git/config/GitSettings.kt b/app/src/main/java/com/zeapo/pwdstore/git/config/GitSettings.kt index 27ceb5cb..a4d96292 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/config/GitSettings.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/config/GitSettings.kt @@ -56,6 +56,7 @@ object GitSettings { private val settings by lazy(LazyThreadSafetyMode.PUBLICATION) { Application.instance.sharedPrefs } private val encryptedSettings by lazy(LazyThreadSafetyMode.PUBLICATION) { Application.instance.getEncryptedGitPrefs() } private val proxySettings by lazy(LazyThreadSafetyMode.PUBLICATION) { Application.instance.getEncryptedProxyPrefs() } + private val hostKeyPath by lazy(LazyThreadSafetyMode.NONE) { "${Application.instance.filesDir}/.host_key" } var authMode get() = AuthMode.fromString(settings.getString(PreferenceKeys.GIT_REMOTE_AUTH)) @@ -64,6 +65,7 @@ object GitSettings { putString(PreferenceKeys.GIT_REMOTE_AUTH, value.pref) } } + var url get() = settings.getString(PreferenceKeys.GIT_REMOTE_URL) private set(value) { @@ -79,8 +81,9 @@ object GitSettings { // should be deleted/reset. useMultiplexing = true encryptedSettings.edit { remove(PreferenceKeys.HTTPS_PASSWORD) } - File("${Application.instance.filesDir}/.host_key").delete() + clearSavedHostKey() } + var authorName get() = settings.getString(PreferenceKeys.GIT_CONFIG_AUTHOR_NAME) ?: "" set(value) { @@ -88,6 +91,7 @@ object GitSettings { putString(PreferenceKeys.GIT_CONFIG_AUTHOR_NAME, value) } } + var authorEmail get() = settings.getString(PreferenceKeys.GIT_CONFIG_AUTHOR_EMAIL) ?: "" set(value) { @@ -95,6 +99,7 @@ object GitSettings { putString(PreferenceKeys.GIT_CONFIG_AUTHOR_EMAIL, value) } } + var branch get() = settings.getString(PreferenceKeys.GIT_BRANCH_NAME) ?: DEFAULT_BRANCH private set(value) { @@ -102,6 +107,7 @@ object GitSettings { putString(PreferenceKeys.GIT_BRANCH_NAME, value) } } + var useMultiplexing get() = settings.getBoolean(PreferenceKeys.GIT_REMOTE_USE_MULTIPLEXING, true) set(value) { @@ -179,4 +185,16 @@ object GitSettings { branch = newBranch return UpdateConnectionSettingsResult.Valid } + + /** + * Deletes a previously saved SSH host key + */ + fun clearSavedHostKey() { + File(hostKeyPath).delete() + } + + /** + * Returns true if a host key was previously saved + */ + fun hasSavedHostKey(): Boolean = File(hostKeyPath).exists() } -- cgit v1.2.3