Skip to content
This repository was archived by the owner on Oct 15, 2024. It is now read-only.

Commit ced2008

Browse files
committed
Revert "Refactor SSHKey into a separate module (#2450)"
This reverts commit 97b3577.
1 parent 4d5b32d commit ced2008

31 files changed

+55
-865
lines changed

app/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ dependencies {
4747
implementation(projects.format.common)
4848
implementation(projects.passgen.diceware)
4949
implementation(projects.passgen.random)
50-
implementation(projects.ssh)
5150
implementation(projects.ui.compose)
5251
implementation(libs.androidx.activity.ktx)
5352
implementation(libs.androidx.activity.compose)

app/src/main/java/app/passwordstore/injection/ssh/SSHKeyManagerModule.kt

Lines changed: 0 additions & 21 deletions
This file was deleted.

app/src/main/java/app/passwordstore/ui/settings/RepositorySettings.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ import androidx.fragment.app.FragmentActivity
1515
import app.passwordstore.R
1616
import app.passwordstore.data.repo.PasswordRepository
1717
import app.passwordstore.injection.prefs.GitPreferences
18-
import app.passwordstore.ssh.SSHKeyManager
1918
import app.passwordstore.ui.git.config.GitConfigActivity
2019
import app.passwordstore.ui.git.config.GitServerConfigActivity
2120
import app.passwordstore.ui.proxy.ProxySelectorActivity
@@ -27,6 +26,7 @@ import app.passwordstore.util.extensions.launchActivity
2726
import app.passwordstore.util.extensions.sharedPrefs
2827
import app.passwordstore.util.extensions.snackbar
2928
import app.passwordstore.util.extensions.unsafeLazy
29+
import app.passwordstore.util.git.sshj.SshKey
3030
import app.passwordstore.util.settings.GitSettings
3131
import app.passwordstore.util.settings.PreferenceKeys
3232
import com.github.michaelbull.result.onFailure
@@ -42,13 +42,11 @@ import de.Maxr1998.modernpreferences.helpers.onClick
4242
import de.Maxr1998.modernpreferences.helpers.pref
4343
import de.Maxr1998.modernpreferences.helpers.switch
4444

45-
class RepositorySettings(
46-
private val activity: FragmentActivity,
47-
private val sshKeyManager: SSHKeyManager,
48-
) : SettingsProvider {
45+
class RepositorySettings(private val activity: FragmentActivity) : SettingsProvider {
46+
4947
private val generateSshKey =
5048
activity.registerForActivityResult(StartActivityForResult()) {
51-
showSshKeyPref?.visible = sshKeyManager.canShowPublicKey()
49+
showSshKeyPref?.visible = SshKey.canShowSshPublicKey
5250
}
5351

5452
private val hiltEntryPoint by unsafeLazy {
@@ -113,7 +111,7 @@ class RepositorySettings(
113111
showSshKeyPref =
114112
pref(PreferenceKeys.SSH_SEE_KEY) {
115113
titleRes = R.string.pref_ssh_see_key_title
116-
visible = PasswordRepository.isGitRepo() && sshKeyManager.canShowPublicKey()
114+
visible = PasswordRepository.isGitRepo() && SshKey.canShowSshPublicKey
117115
onClick {
118116
ShowSshKeyFragment().show(activity.supportFragmentManager, "public_key")
119117
true

app/src/main/java/app/passwordstore/ui/settings/SettingsActivity.kt

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,19 @@ import androidx.appcompat.app.AppCompatActivity
1111
import androidx.core.os.BundleCompat
1212
import app.passwordstore.R
1313
import app.passwordstore.databinding.ActivityPreferenceRecyclerviewBinding
14-
import app.passwordstore.ssh.SSHKeyManager
1514
import app.passwordstore.util.extensions.viewBinding
1615
import com.google.android.material.dialog.MaterialAlertDialogBuilder
17-
import dagger.hilt.android.AndroidEntryPoint
1816
import de.Maxr1998.modernpreferences.Preference
1917
import de.Maxr1998.modernpreferences.PreferencesAdapter
2018
import de.Maxr1998.modernpreferences.helpers.screen
2119
import de.Maxr1998.modernpreferences.helpers.subScreen
22-
import javax.inject.Inject
2320

24-
@AndroidEntryPoint
2521
class SettingsActivity : AppCompatActivity() {
2622

27-
@Inject lateinit var sshKeyManager: SSHKeyManager
28-
private lateinit var repositorySettings: RepositorySettings
2923
private val miscSettings = MiscSettings(this)
3024
private val autofillSettings = AutofillSettings(this)
3125
private val passwordSettings = PasswordSettings(this)
26+
private val repositorySettings = RepositorySettings(this)
3227
private val generalSettings = GeneralSettings(this)
3328
private val pgpSettings = PGPSettings(this)
3429

@@ -40,7 +35,6 @@ class SettingsActivity : AppCompatActivity() {
4035
super.onCreate(savedInstanceState)
4136
setContentView(binding.root)
4237
Preference.Config.dialogBuilderFactory = { context -> MaterialAlertDialogBuilder(context) }
43-
repositorySettings = RepositorySettings(this, sshKeyManager)
4438
val screen =
4539
screen(this) {
4640
subScreen {

app/src/main/java/app/passwordstore/ui/sshkeygen/ShowSshKeyFragment.kt

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,14 @@ import android.content.Intent
99
import android.os.Bundle
1010
import androidx.fragment.app.DialogFragment
1111
import app.passwordstore.R
12-
import app.passwordstore.ssh.SSHKeyManager
12+
import app.passwordstore.util.git.sshj.SshKey
1313
import com.google.android.material.dialog.MaterialAlertDialogBuilder
14-
import dagger.hilt.android.AndroidEntryPoint
15-
import javax.inject.Inject
1614

17-
@AndroidEntryPoint
1815
class ShowSshKeyFragment : DialogFragment() {
1916

20-
@Inject lateinit var sshKeyManager: SSHKeyManager
21-
2217
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
2318
val activity = requireActivity()
24-
val publicKey = sshKeyManager.publicKey()
19+
val publicKey = SshKey.sshPublicKey
2520
return MaterialAlertDialogBuilder(requireActivity()).run {
2621
setMessage(getString(R.string.ssh_keygen_message, publicKey))
2722
setTitle(R.string.your_public_key)

app/src/main/java/app/passwordstore/ui/sshkeygen/SshKeyGenActivity.kt

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,12 @@ import androidx.lifecycle.lifecycleScope
1717
import app.passwordstore.R
1818
import app.passwordstore.databinding.ActivitySshKeygenBinding
1919
import app.passwordstore.injection.prefs.GitPreferences
20-
import app.passwordstore.ssh.SSHKeyAlgorithm
21-
import app.passwordstore.ssh.SSHKeyManager
2220
import app.passwordstore.util.auth.BiometricAuthenticator
2321
import app.passwordstore.util.auth.BiometricAuthenticator.Result
2422
import app.passwordstore.util.coroutines.DispatcherProvider
2523
import app.passwordstore.util.extensions.keyguardManager
2624
import app.passwordstore.util.extensions.viewBinding
25+
import app.passwordstore.util.git.sshj.SshKey
2726
import com.github.michaelbull.result.fold
2827
import com.github.michaelbull.result.runCatching
2928
import com.google.android.material.dialog.MaterialAlertDialogBuilder
@@ -34,13 +33,24 @@ import kotlin.coroutines.suspendCoroutine
3433
import kotlinx.coroutines.launch
3534
import kotlinx.coroutines.withContext
3635

36+
private enum class KeyGenType(val generateKey: suspend (requireAuthentication: Boolean) -> Unit) {
37+
Rsa({ requireAuthentication ->
38+
SshKey.generateKeystoreNativeKey(SshKey.Algorithm.Rsa, requireAuthentication)
39+
}),
40+
Ecdsa({ requireAuthentication ->
41+
SshKey.generateKeystoreNativeKey(SshKey.Algorithm.Ecdsa, requireAuthentication)
42+
}),
43+
Ed25519({ requireAuthentication ->
44+
SshKey.generateKeystoreWrappedEd25519Key(requireAuthentication)
45+
}),
46+
}
47+
3748
@AndroidEntryPoint
3849
class SshKeyGenActivity : AppCompatActivity() {
3950

40-
private var sshKeyAlgorithm = SSHKeyAlgorithm.ECDSA
51+
private var keyGenType = KeyGenType.Ecdsa
4152
private val binding by viewBinding(ActivitySshKeygenBinding::inflate)
4253
@GitPreferences @Inject lateinit var gitPrefs: SharedPreferences
43-
@Inject lateinit var sshKeyManager: SSHKeyManager
4454
@Inject lateinit var dispatcherProvider: DispatcherProvider
4555

4656
override fun onCreate(savedInstanceState: Bundle?) {
@@ -49,7 +59,7 @@ class SshKeyGenActivity : AppCompatActivity() {
4959
supportActionBar?.setDisplayHomeAsUpEnabled(true)
5060
with(binding) {
5161
generate.setOnClickListener {
52-
if (sshKeyManager.keyExists()) {
62+
if (SshKey.exists) {
5363
MaterialAlertDialogBuilder(this@SshKeyGenActivity).run {
5464
setTitle(R.string.ssh_keygen_existing_title)
5565
setMessage(R.string.ssh_keygen_existing_message)
@@ -70,18 +80,18 @@ class SshKeyGenActivity : AppCompatActivity() {
7080
keyTypeExplanation.setText(R.string.ssh_keygen_explanation_ecdsa)
7181
keyTypeGroup.addOnButtonCheckedListener { _, checkedId, isChecked ->
7282
if (isChecked) {
73-
sshKeyAlgorithm =
83+
keyGenType =
7484
when (checkedId) {
75-
R.id.key_type_ed25519 -> SSHKeyAlgorithm.ED25519
76-
R.id.key_type_ecdsa -> SSHKeyAlgorithm.ECDSA
77-
R.id.key_type_rsa -> SSHKeyAlgorithm.RSA
85+
R.id.key_type_ed25519 -> KeyGenType.Ed25519
86+
R.id.key_type_ecdsa -> KeyGenType.Ecdsa
87+
R.id.key_type_rsa -> KeyGenType.Rsa
7888
else -> throw IllegalStateException("Impossible key type selection")
7989
}
8090
keyTypeExplanation.setText(
81-
when (sshKeyAlgorithm) {
82-
SSHKeyAlgorithm.ED25519 -> R.string.ssh_keygen_explanation_ed25519
83-
SSHKeyAlgorithm.ECDSA -> R.string.ssh_keygen_explanation_ecdsa
84-
SSHKeyAlgorithm.RSA -> R.string.ssh_keygen_explanation_rsa
91+
when (keyGenType) {
92+
KeyGenType.Ed25519 -> R.string.ssh_keygen_explanation_ed25519
93+
KeyGenType.Ecdsa -> R.string.ssh_keygen_explanation_ecdsa
94+
KeyGenType.Rsa -> R.string.ssh_keygen_explanation_rsa
8595
}
8696
)
8797
}
@@ -127,10 +137,9 @@ class SshKeyGenActivity : AppCompatActivity() {
127137
if (result !is Result.Success)
128138
throw UserNotAuthenticatedException(getString(R.string.biometric_auth_generic_failure))
129139
}
130-
sshKeyManager.generateKey(sshKeyAlgorithm, requireAuthentication)
140+
keyGenType.generateKey(requireAuthentication)
131141
}
132142
}
133-
// Check if we still need this
134143
gitPrefs.edit { remove("ssh_key_local_passphrase") }
135144
binding.generate.apply {
136145
text = getString(R.string.ssh_keygen_generate)

app/src/main/java/app/passwordstore/ui/sshkeygen/SshKeyImportActivity.kt

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,39 +10,30 @@ import android.os.Bundle
1010
import android.widget.Toast
1111
import androidx.activity.result.contract.ActivityResultContracts
1212
import androidx.appcompat.app.AppCompatActivity
13-
import androidx.lifecycle.lifecycleScope
1413
import app.passwordstore.R
15-
import app.passwordstore.ssh.SSHKeyManager
14+
import app.passwordstore.util.git.sshj.SshKey
1615
import com.github.michaelbull.result.onFailure
1716
import com.github.michaelbull.result.runCatching
1817
import com.google.android.material.dialog.MaterialAlertDialogBuilder
19-
import dagger.hilt.android.AndroidEntryPoint
20-
import javax.inject.Inject
21-
import kotlinx.coroutines.launch
2218

23-
@AndroidEntryPoint
2419
class SshKeyImportActivity : AppCompatActivity() {
2520

26-
@Inject lateinit var sshKeyManager: SSHKeyManager
27-
2821
private val sshKeyImportAction =
2922
registerForActivityResult(ActivityResultContracts.OpenDocument()) { uri: Uri? ->
3023
if (uri == null) {
3124
finish()
3225
return@registerForActivityResult
3326
}
3427
runCatching {
35-
lifecycleScope.launch {
36-
sshKeyManager.importKey(uri)
37-
Toast.makeText(
38-
this@SshKeyImportActivity,
39-
resources.getString(R.string.ssh_key_success_dialog_title),
40-
Toast.LENGTH_LONG
41-
)
42-
.show()
43-
setResult(RESULT_OK)
44-
finish()
45-
}
28+
SshKey.import(uri)
29+
Toast.makeText(
30+
this,
31+
resources.getString(R.string.ssh_key_success_dialog_title),
32+
Toast.LENGTH_LONG
33+
)
34+
.show()
35+
setResult(RESULT_OK)
36+
finish()
4637
}
4738
.onFailure { e ->
4839
MaterialAlertDialogBuilder(this)
@@ -55,8 +46,8 @@ class SshKeyImportActivity : AppCompatActivity() {
5546

5647
override fun onCreate(savedInstanceState: Bundle?) {
5748
super.onCreate(savedInstanceState)
58-
if (sshKeyManager.keyExists()) {
59-
MaterialAlertDialogBuilder(this@SshKeyImportActivity).run {
49+
if (SshKey.exists) {
50+
MaterialAlertDialogBuilder(this).run {
6051
setTitle(R.string.ssh_keygen_existing_title)
6152
setMessage(R.string.ssh_keygen_existing_message)
6253
setPositiveButton(R.string.ssh_keygen_existing_replace) { _, _ -> importSshKey() }

app/src/main/java/app/passwordstore/util/git/operation/GitOperation.kt

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import androidx.appcompat.app.AppCompatActivity
99
import androidx.fragment.app.FragmentActivity
1010
import app.passwordstore.R
1111
import app.passwordstore.data.repo.PasswordRepository
12-
import app.passwordstore.ssh.SSHKeyManager
1312
import app.passwordstore.ui.sshkeygen.SshKeyGenActivity
1413
import app.passwordstore.ui.sshkeygen.SshKeyImportActivity
1514
import app.passwordstore.util.auth.BiometricAuthenticator
@@ -21,6 +20,7 @@ import app.passwordstore.util.coroutines.DispatcherProvider
2120
import app.passwordstore.util.extensions.launchActivity
2221
import app.passwordstore.util.git.GitCommandExecutor
2322
import app.passwordstore.util.git.sshj.SshAuthMethod
23+
import app.passwordstore.util.git.sshj.SshKey
2424
import app.passwordstore.util.git.sshj.SshjSessionFactory
2525
import app.passwordstore.util.settings.AuthMode
2626
import com.github.michaelbull.result.Err
@@ -67,11 +67,7 @@ abstract class GitOperation(protected val callingActivity: FragmentActivity) {
6767
private val hostKeyFile = callingActivity.filesDir.resolve(".host_key")
6868
private var sshSessionFactory: SshjSessionFactory? = null
6969
private val hiltEntryPoint =
70-
EntryPointAccessors.fromApplication(
71-
callingActivity.applicationContext,
72-
GitOperationEntryPoint::class.java
73-
)
74-
private val sshKeyManager = hiltEntryPoint.sshKeyManager()
70+
EntryPointAccessors.fromApplication<GitOperationEntryPoint>(callingActivity)
7571
protected val repository = PasswordRepository.repository!!
7672
protected val git = Git(repository)
7773
private val authActivity
@@ -121,7 +117,8 @@ abstract class GitOperation(protected val callingActivity: FragmentActivity) {
121117
authMethod: SshAuthMethod,
122118
credentialsProvider: CredentialsProvider? = null
123119
) {
124-
sshSessionFactory = SshjSessionFactory(authMethod, hostKeyFile, sshKeyManager, hiltEntryPoint.dispatcherProvider())
120+
sshSessionFactory =
121+
SshjSessionFactory(authMethod, hostKeyFile, hiltEntryPoint.dispatcherProvider())
125122
commands.filterIsInstance<TransportCommand<*, *>>().forEach { command ->
126123
command.setTransportConfigCallback { transport: Transport ->
127124
(transport as? SshTransport)?.sshSessionFactory = sshSessionFactory
@@ -169,8 +166,8 @@ abstract class GitOperation(protected val callingActivity: FragmentActivity) {
169166
suspend fun executeAfterAuthentication(authMode: AuthMode): Result<Unit, Throwable> {
170167
when (authMode) {
171168
AuthMode.SshKey ->
172-
if (sshKeyManager.keyExists()) {
173-
if (sshKeyManager.needsAuthentication()) {
169+
if (SshKey.exists) {
170+
if (SshKey.mustAuthenticate) {
174171
val result =
175172
withContext(hiltEntryPoint.dispatcherProvider().main()) {
176173
suspendCoroutine { cont ->
@@ -247,8 +244,6 @@ abstract class GitOperation(protected val callingActivity: FragmentActivity) {
247244
@EntryPoint
248245
@InstallIn(SingletonComponent::class)
249246
interface GitOperationEntryPoint {
250-
fun sshKeyManager(): SSHKeyManager
251-
252247
fun dispatcherProvider(): DispatcherProvider
253248
}
254249
}

app/src/main/java/app/passwordstore/util/git/sshj/SshjSessionFactory.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ package app.passwordstore.util.git.sshj
66

77
import android.util.Base64
88
import androidx.appcompat.app.AppCompatActivity
9-
import app.passwordstore.ssh.SSHKeyManager
109
import app.passwordstore.util.coroutines.DispatcherProvider
1110
import app.passwordstore.util.git.operation.CredentialFinder
1211
import app.passwordstore.util.settings.AuthMode
@@ -71,7 +70,6 @@ abstract class InteractivePasswordFinder(private val dispatcherProvider: Dispatc
7170
class SshjSessionFactory(
7271
private val authMethod: SshAuthMethod,
7372
private val hostKeyFile: File,
74-
private val sshKeyManager: SSHKeyManager,
7573
private val dispatcherProvider: DispatcherProvider,
7674
) : SshSessionFactory() {
7775

@@ -84,7 +82,7 @@ class SshjSessionFactory(
8482
tms: Int
8583
): RemoteSession {
8684
return currentSession
87-
?: SshjSession(uri, uri.user, authMethod, hostKeyFile, dispatcherProvider, sshKeyManager).connect().also {
85+
?: SshjSession(uri, uri.user, authMethod, hostKeyFile, dispatcherProvider).connect().also {
8886
logcat { "New SSH connection created" }
8987
currentSession = it
9088
}
@@ -129,7 +127,6 @@ private class SshjSession(
129127
private val authMethod: SshAuthMethod,
130128
private val hostKeyFile: File,
131129
private val dispatcherProvider: DispatcherProvider,
132-
private val sshKeyManager: SSHKeyManager,
133130
) : RemoteSession {
134131

135132
private lateinit var ssh: SSHClient
@@ -165,7 +162,10 @@ private class SshjSession(
165162
is SshAuthMethod.SshKey -> {
166163
val pubkeyAuth =
167164
AuthPublickey(
168-
sshKeyManager.keyProvider(ssh, CredentialFinder(authMethod.activity, AuthMode.SshKey, dispatcherProvider))
165+
SshKey.provide(
166+
ssh,
167+
CredentialFinder(authMethod.activity, AuthMode.SshKey, dispatcherProvider)
168+
)
169169
)
170170
ssh.auth(username, pubkeyAuth, passwordAuth)
171171
}

settings.gradle.kts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,5 +194,3 @@ include("passgen:random")
194194
include("sentry-stub")
195195

196196
include("ui:compose")
197-
198-
include("ssh")

0 commit comments

Comments
 (0)