@@ -51,15 +51,21 @@ abstract class GitOperation(gitDir: File, internal val callingActivity: Fragment
5151 protected val git = Git (repository)
5252 protected val remoteBranch = GitSettings .branch
5353
54- private class PasswordFinderCredentialsProvider (private val passwordFinder : PasswordFinder ) : CredentialsProvider() {
54+ private class HttpsCredentialsProvider (private val passwordFinder : PasswordFinder ) : CredentialsProvider() {
55+
56+ private var cachedPassword: CharArray? = null
5557
5658 override fun isInteractive () = true
5759
5860 override fun get (uri : URIish ? , vararg items : CredentialItem ): Boolean {
5961 for (item in items) {
6062 when (item) {
6163 is CredentialItem .Username -> item.value = uri?.user
62- is CredentialItem .Password -> item.value = passwordFinder.reqPassword(null )
64+ is CredentialItem .Password -> {
65+ item.value = cachedPassword?.clone() ? : passwordFinder.reqPassword(null ).also {
66+ cachedPassword = it.clone()
67+ }
68+ }
6369 else -> UnsupportedCredentialItem (uri, item.javaClass.name)
6470 }
6571 }
@@ -69,12 +75,17 @@ abstract class GitOperation(gitDir: File, internal val callingActivity: Fragment
6975 override fun supports (vararg items : CredentialItem ) = items.all {
7076 it is CredentialItem .Username || it is CredentialItem .Password
7177 }
78+
79+ override fun reset (uri : URIish ? ) {
80+ cachedPassword?.fill(0 .toChar())
81+ cachedPassword = null
82+ }
7283 }
7384
7485 private fun withPasswordAuthentication (passwordFinder : InteractivePasswordFinder ): GitOperation {
7586 val sessionFactory = SshjSessionFactory (SshAuthData .Password (passwordFinder), hostKeyFile)
7687 SshSessionFactory .setInstance(sessionFactory)
77- this .provider = PasswordFinderCredentialsProvider (passwordFinder)
88+ this .provider = HttpsCredentialsProvider (passwordFinder)
7889 return this
7990 }
8091
0 commit comments