diff options
author | Fabian Henneke <FabianHenneke@users.noreply.github.com> | 2020-07-02 13:21:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-02 16:51:59 +0530 |
commit | c702d4aa9ea09ae27e613d85440a207b37995e86 (patch) | |
tree | 2e25bef86c245afd5960c59598921a561592b5ba | |
parent | 5b7d8b4d6207290c3a6899b082e9c3817d345e68 (diff) |
Fix up URIish instances with @ in user name (#913)
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/git/config/SshjSessionFactory.kt | 15 |
2 files changed, 15 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 17de770b..2bc258b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Folder names that were very long did not look right - Error message for wrong SSH/HTTPS password now looks cleaner +- Fix authentication failure with usernames that contain the `@` character ### Added diff --git a/app/src/main/java/com/zeapo/pwdstore/git/config/SshjSessionFactory.kt b/app/src/main/java/com/zeapo/pwdstore/git/config/SshjSessionFactory.kt index 45e7fe3e..3359d42c 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/config/SshjSessionFactory.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/config/SshjSessionFactory.kt @@ -126,11 +126,24 @@ private fun makeTofuHostKeyVerifier(hostKeyFile: File): HostKeyVerifier { } } -private class SshjSession(private val uri: URIish, private val username: String, private val authData: SshAuthData, private val hostKeyFile: File) : RemoteSession { +private class SshjSession(uri: URIish, private val username: String, private val authData: SshAuthData, private val hostKeyFile: File) : RemoteSession { private lateinit var ssh: SSHClient private var currentCommand: Session? = null + private val uri = if (uri.host.contains('@')) { + // URIish's String constructor cannot handle '@' in the user part of the URI and the URL + // constructor can't be used since Java's URL does not recognize the ssh scheme. We thus + // need to patch everything up ourselves. + d { "Before fixup: user=${uri.user}, host=${uri.host}" } + val userPlusHost = "${uri.user}@${uri.host}" + val realUser = userPlusHost.substringBeforeLast('@') + val realHost = userPlusHost.substringAfterLast('@') + uri.setUser(realUser).setHost(realHost).also { d { "After fixup: user=${it.user}, host=${it.host}" } } + } else { + uri + } + fun connect(): SshjSession { ssh = SSHClient(SshjConfig()) ssh.addHostKeyVerifier(makeTofuHostKeyVerifier(hostKeyFile)) |