summaryrefslogtreecommitdiff
path: root/app/src/main/java
diff options
context:
space:
mode:
authorHarsh Shandilya <me@msfjarvis.dev>2020-12-10 22:47:18 +0530
committerHarsh Shandilya <me@msfjarvis.dev>2020-12-21 20:31:28 +0530
commit96b51e73ec48b95909ed039e8faefadc72c9eeff (patch)
treed082cd52d2f5272cbcf1a7c39e766d4822ad9ebe /app/src/main/java
parent31ec316b8b5a77781b32ebde79a09045fb3f300e (diff)
Better guidance for users to deal with host key changes (#1242)
* Provide actionable guidance for host key mismatches Signed-off-by: Harsh Shandilya <me@msfjarvis.dev> * Update changelog Signed-off-by: Harsh Shandilya <me@msfjarvis.dev> * Hide host key clear button after use Signed-off-by: Harsh Shandilya <me@msfjarvis.dev> (cherry picked from commit ce2e657108187a34416cfbfc0c5d2fc8bb9277f3) Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/BaseGitActivity.kt5
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/GitServerConfigActivity.kt6
-rw-r--r--app/src/main/java/com/zeapo/pwdstore/git/config/GitSettings.kt20
3 files changed, 30 insertions, 1 deletions
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()
}