diff options
author | Harsh Shandilya <me@msfjarvis.dev> | 2020-12-10 22:47:18 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-10 22:47:18 +0530 |
commit | ce2e657108187a34416cfbfc0c5d2fc8bb9277f3 (patch) | |
tree | 850810300c35213d54f8acccb1cbe474002f6829 /app | |
parent | c02ad427be3652298f4a07a5f1a0d68e4ac44c45 (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>
Diffstat (limited to 'app')
5 files changed, 44 insertions, 2 deletions
diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/git/base/BaseGitActivity.kt b/app/src/main/java/dev/msfjarvis/aps/ui/git/base/BaseGitActivity.kt index 89455c90..558f60a2 100644 --- a/app/src/main/java/dev/msfjarvis/aps/ui/git/base/BaseGitActivity.kt +++ b/app/src/main/java/dev/msfjarvis/aps/ui/git/base/BaseGitActivity.kt @@ -29,6 +29,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 /** @@ -76,6 +77,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/dev/msfjarvis/aps/ui/git/config/GitServerConfigActivity.kt b/app/src/main/java/dev/msfjarvis/aps/ui/git/config/GitServerConfigActivity.kt index a0750eeb..9826593c 100644 --- a/app/src/main/java/dev/msfjarvis/aps/ui/git/config/GitServerConfigActivity.kt +++ b/app/src/main/java/dev/msfjarvis/aps/ui/git/config/GitServerConfigActivity.kt @@ -84,6 +84,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/dev/msfjarvis/aps/util/settings/GitSettings.kt b/app/src/main/java/dev/msfjarvis/aps/util/settings/GitSettings.kt index 864cbf81..82af814b 100644 --- a/app/src/main/java/dev/msfjarvis/aps/util/settings/GitSettings.kt +++ b/app/src/main/java/dev/msfjarvis/aps/util/settings/GitSettings.kt @@ -55,6 +55,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)) @@ -63,6 +64,7 @@ object GitSettings { putString(PreferenceKeys.GIT_REMOTE_AUTH, value.pref) } } + var url get() = settings.getString(PreferenceKeys.GIT_REMOTE_URL) private set(value) { @@ -78,8 +80,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) { @@ -87,6 +90,7 @@ object GitSettings { putString(PreferenceKeys.GIT_CONFIG_AUTHOR_NAME, value) } } + var authorEmail get() = settings.getString(PreferenceKeys.GIT_CONFIG_AUTHOR_EMAIL) ?: "" set(value) { @@ -94,6 +98,7 @@ object GitSettings { putString(PreferenceKeys.GIT_CONFIG_AUTHOR_EMAIL, value) } } + var branch get() = settings.getString(PreferenceKeys.GIT_BRANCH_NAME) ?: DEFAULT_BRANCH private set(value) { @@ -101,6 +106,7 @@ object GitSettings { putString(PreferenceKeys.GIT_BRANCH_NAME, value) } } + var useMultiplexing get() = settings.getBoolean(PreferenceKeys.GIT_REMOTE_USE_MULTIPLEXING, true) set(value) { @@ -178,4 +184,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() } diff --git a/app/src/main/res/layout/activity_git_clone.xml b/app/src/main/res/layout/activity_git_clone.xml index 1e59b462..04b8338c 100644 --- a/app/src/main/res/layout/activity_git_clone.xml +++ b/app/src/main/res/layout/activity_git_clone.xml @@ -11,7 +11,7 @@ android:background="?android:attr/windowBackground" android:padding="@dimen/activity_horizontal_margin" tools:background="@color/white" - tools:context="dev.msfjarvis.aps.git.GitServerConfigActivity"> + tools:context="dev.msfjarvis.aps.ui.git.config.GitServerConfigActivity"> <androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" @@ -120,5 +120,16 @@ android:text="@string/crypto_save" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toBottomOf="@id/auth_mode_group" /> + + <com.google.android.material.button.MaterialButton + android:id="@+id/clear_host_key_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:text="@string/clear_saved_host_key" + android:visibility="gone" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/auth_mode_group" + tools:visibility="visible" /> </androidx.constraintlayout.widget.ConstraintLayout> </ScrollView> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 03a1689e..a57d0454 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -398,5 +398,7 @@ <string name="pref_proxy_settings">HTTP(S) proxy settings</string> <string name="invalid_proxy_url">Invalid URL</string> <string name="oreo_autofill_password_fill_and_conditional_save_support">Fill and save passwords (saving requires that no accessibility services are enabled)</string> + <string name="clear_saved_host_key">Clear saved host key</string> + <string name="clear_saved_host_key_success">Successfully cleared saved host key!</string> </resources> |