diff options
| author | Harsh Shandilya <msfjarvis@gmail.com> | 2020-10-23 15:23:47 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-23 15:23:47 +0530 |
| commit | 66b31f1432a1405143323f92ca7e33d6c98ee0a2 (patch) | |
| tree | 492be417c235bc4d5c7492504cc4f5c93e78a2ac /app/src/main/java/com/zeapo/pwdstore/git/sshj | |
| parent | 4e22df02faf8dee4a160bb8b81bec1c9418e2e01 (diff) | |
| download | HardenedPass-66b31f1432a1405143323f92ca7e33d6c98ee0a2.tar.gz HardenedPass-66b31f1432a1405143323f92ca7e33d6c98ee0a2.zip | |
Workaround AndroidX lifecycle requirements in OpenKeychain auth (#1168)
* Workaround AndroidX lifecycle requirements in OpenKeychain auth
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* CHANGELOG: add OpenKeychain fix
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
Co-authored-by: Fabian Henneke <FabianHenneke@users.noreply.github.com>
Diffstat (limited to 'app/src/main/java/com/zeapo/pwdstore/git/sshj')
3 files changed, 46 insertions, 27 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/git/sshj/ContinuationContainerActivity.kt b/app/src/main/java/com/zeapo/pwdstore/git/sshj/ContinuationContainerActivity.kt new file mode 100644 index 00000000..32ee64a8 --- /dev/null +++ b/app/src/main/java/com/zeapo/pwdstore/git/sshj/ContinuationContainerActivity.kt @@ -0,0 +1,37 @@ +/* + * Copyright © 2014-2020 The Android Password Store Authors. All Rights Reserved. + * SPDX-License-Identifier: GPL-3.0-only + */ +package com.zeapo.pwdstore.git.sshj + +import android.content.Intent +import androidx.activity.result.contract.ActivityResultContracts +import androidx.annotation.LayoutRes +import androidx.appcompat.app.AppCompatActivity +import kotlin.coroutines.Continuation +import kotlin.coroutines.resume +import kotlin.coroutines.resumeWithException +import net.schmizz.sshj.common.DisconnectReason +import net.schmizz.sshj.userauth.UserAuthException + +/** + * Workaround for https://msfjarvis.dev/aps/issue/1164 + */ +open class ContinuationContainerActivity : AppCompatActivity { + + constructor() : super() + constructor(@LayoutRes layoutRes: Int) : super(layoutRes) + + var stashedCont: Continuation<Intent>? = null + + val continueAfterUserInteraction = registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result -> + stashedCont?.let { cont -> + stashedCont = null + val data = result.data + if (data != null) + cont.resume(data) + else + cont.resumeWithException(UserAuthException(DisconnectReason.AUTH_CANCELLED_BY_USER)) + } + } +} diff --git a/app/src/main/java/com/zeapo/pwdstore/git/sshj/OpenKeychainKeyProvider.kt b/app/src/main/java/com/zeapo/pwdstore/git/sshj/OpenKeychainKeyProvider.kt index cdaa0342..97774d92 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/sshj/OpenKeychainKeyProvider.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/sshj/OpenKeychainKeyProvider.kt @@ -7,18 +7,14 @@ package com.zeapo.pwdstore.git.sshj import android.app.PendingIntent import android.content.Intent import androidx.activity.result.IntentSenderRequest -import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.edit -import androidx.fragment.app.FragmentActivity import com.github.ajalt.timberkt.d import com.zeapo.pwdstore.utils.OPENPGP_PROVIDER import com.zeapo.pwdstore.utils.PreferenceKeys import com.zeapo.pwdstore.utils.sharedPrefs import java.io.Closeable import java.security.PublicKey -import kotlin.coroutines.Continuation import kotlin.coroutines.resume -import kotlin.coroutines.resumeWithException import kotlin.coroutines.suspendCoroutine import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -39,11 +35,11 @@ import org.openintents.ssh.authentication.response.Response import org.openintents.ssh.authentication.response.SigningResponse import org.openintents.ssh.authentication.response.SshPublicKeyResponse -class OpenKeychainKeyProvider private constructor(activity: FragmentActivity) : KeyProvider, Closeable { +class OpenKeychainKeyProvider private constructor(val activity: ContinuationContainerActivity) : KeyProvider, Closeable { companion object { - suspend fun prepareAndUse(activity: FragmentActivity, block: (provider: OpenKeychainKeyProvider) -> Unit) { + suspend fun prepareAndUse(activity: ContinuationContainerActivity, block: (provider: OpenKeychainKeyProvider) -> Unit) { withContext(Dispatchers.Main) { OpenKeychainKeyProvider(activity) }.prepareAndUse(block) @@ -59,21 +55,8 @@ class OpenKeychainKeyProvider private constructor(activity: FragmentActivity) : private val context = activity.applicationContext private val sshServiceConnection = SshAuthenticationConnection(context, OPENPGP_PROVIDER) private val preferences = context.sharedPrefs - private val continueAfterUserInteraction = - activity.registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { result -> - currentCont?.let { cont -> - currentCont = null - val data = result.data - if (data != null) - cont.resume(data) - else - cont.resumeWithException(UserAuthException(DisconnectReason.AUTH_CANCELLED_BY_USER)) - } - } - private lateinit var sshServiceApi: SshAuthenticationApi - private var currentCont: Continuation<Intent>? = null private var keyId get() = preferences.getString(PreferenceKeys.SSH_OPENKEYSTORE_KEYID, null) set(value) { @@ -164,8 +147,8 @@ class OpenKeychainKeyProvider private constructor(activity: FragmentActivity) : val pendingIntent: PendingIntent = result.getParcelableExtra(SshAuthenticationApi.EXTRA_PENDING_INTENT)!! val resultOfUserInteraction: Intent = withContext(Dispatchers.Main) { suspendCoroutine { cont -> - currentCont = cont - continueAfterUserInteraction.launch(IntentSenderRequest.Builder(pendingIntent).build()) + activity.stashedCont = cont + activity.continueAfterUserInteraction.launch(IntentSenderRequest.Builder(pendingIntent).build()) } } executeApiRequest(request, resultOfUserInteraction) @@ -196,7 +179,7 @@ class OpenKeychainKeyProvider private constructor(activity: FragmentActivity) : } override fun close() { - continueAfterUserInteraction.unregister() + activity.continueAfterUserInteraction.unregister() sshServiceConnection.disconnect() } diff --git a/app/src/main/java/com/zeapo/pwdstore/git/sshj/SshjSessionFactory.kt b/app/src/main/java/com/zeapo/pwdstore/git/sshj/SshjSessionFactory.kt index f064df33..c36f27b3 100644 --- a/app/src/main/java/com/zeapo/pwdstore/git/sshj/SshjSessionFactory.kt +++ b/app/src/main/java/com/zeapo/pwdstore/git/sshj/SshjSessionFactory.kt @@ -5,7 +5,6 @@ package com.zeapo.pwdstore.git.sshj import android.util.Base64 -import androidx.fragment.app.FragmentActivity import com.github.ajalt.timberkt.d import com.github.ajalt.timberkt.w import com.github.michaelbull.result.getOrElse @@ -40,10 +39,10 @@ import org.eclipse.jgit.transport.SshSessionFactory import org.eclipse.jgit.transport.URIish import org.eclipse.jgit.util.FS -sealed class SshAuthMethod(val activity: FragmentActivity) { - class Password(activity: FragmentActivity) : SshAuthMethod(activity) - class SshKey(activity: FragmentActivity) : SshAuthMethod(activity) - class OpenKeychain(activity: FragmentActivity) : SshAuthMethod(activity) +sealed class SshAuthMethod(val activity: ContinuationContainerActivity) { + class Password(activity: ContinuationContainerActivity) : SshAuthMethod(activity) + class SshKey(activity: ContinuationContainerActivity) : SshAuthMethod(activity) + class OpenKeychain(activity: ContinuationContainerActivity) : SshAuthMethod(activity) } abstract class InteractivePasswordFinder : PasswordFinder { |
