diff options
| author | Harsh Shandilya <msfjarvis@gmail.com> | 2020-06-29 12:50:05 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-06-29 12:50:05 +0530 |
| commit | ac6220eed31f1aab0f73403b3befe77c57f0c9a1 (patch) | |
| tree | 5950bb69dcfc1f10170af563151d4b52b1b055bc /app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenActivity.kt | |
| parent | 063c1a1144bb50845ecfb7d56eea16e4db4540e4 (diff) | |
| download | HardenedPass-ac6220eed31f1aab0f73403b3befe77c57f0c9a1.tar.gz HardenedPass-ac6220eed31f1aab0f73403b3befe77c57f0c9a1.zip | |
Merge SshKeyGenFragment into its activity (#897)
* Merge SshKeyGenFragment into its activity
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* Drop neutral button discouraged by material specs
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
* Address review comments
Signed-off-by: Harsh Shandilya <me@msfjarvis.dev>
Diffstat (limited to 'app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenActivity.kt')
| -rw-r--r-- | app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenActivity.kt | 94 |
1 files changed, 88 insertions, 6 deletions
diff --git a/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenActivity.kt b/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenActivity.kt index 2bb04e20..0f844b31 100644 --- a/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenActivity.kt +++ b/app/src/main/java/com/zeapo/pwdstore/sshkeygen/SshKeyGenActivity.kt @@ -6,18 +6,48 @@ package com.zeapo.pwdstore.sshkeygen import android.os.Bundle import android.view.MenuItem +import android.view.View +import android.view.inputmethod.InputMethodManager import androidx.appcompat.app.AppCompatActivity +import androidx.core.content.edit +import androidx.core.content.getSystemService +import androidx.lifecycle.lifecycleScope +import androidx.preference.PreferenceManager +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.jcraft.jsch.JSch +import com.jcraft.jsch.KeyPair +import com.zeapo.pwdstore.R +import com.zeapo.pwdstore.databinding.ActivitySshKeygenBinding +import com.zeapo.pwdstore.utils.getEncryptedPrefs +import com.zeapo.pwdstore.utils.viewBinding +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import java.io.File +import java.io.FileOutputStream class SshKeyGenActivity : AppCompatActivity() { - public override fun onCreate(savedInstanceState: Bundle?) { + private var keyLength = 4096 + private val binding by viewBinding(ActivitySshKeygenBinding::inflate) + + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + setContentView(binding.root) supportActionBar?.setDisplayHomeAsUpEnabled(true) - if (savedInstanceState == null) { - supportFragmentManager - .beginTransaction() - .replace(android.R.id.content, SshKeyGenFragment()) - .commit() + with(binding) { + generate.setOnClickListener { + lifecycleScope.launch { generate(passphrase.text.toString(), comment.text.toString()) } + } + keyLengthGroup.check(R.id.key_length_4096) + keyLengthGroup.addOnButtonCheckedListener { _, checkedId, isChecked -> + if (isChecked) { + when (checkedId) { + R.id.key_length_2048 -> keyLength = 2048 + R.id.key_length_4096 -> keyLength = 4096 + } + } + } } } @@ -31,4 +61,56 @@ class SshKeyGenActivity : AppCompatActivity() { else -> super.onOptionsItemSelected(item) } } + + private suspend fun generate(passphrase: String, comment: String) { + binding.generate.text = getString(R.string.ssh_key_gen_generating_progress) + val e = try { + withContext(Dispatchers.IO) { + val kp = KeyPair.genKeyPair(JSch(), KeyPair.RSA, keyLength) + var file = File(filesDir, ".ssh_key") + var out = FileOutputStream(file, false) + if (passphrase.isNotEmpty()) { + kp?.writePrivateKey(out, passphrase.toByteArray()) + } else { + kp?.writePrivateKey(out) + } + file = File(filesDir, ".ssh_key.pub") + out = FileOutputStream(file, false) + kp?.writePublicKey(out, comment) + } + null + } catch (e: Exception) { + e.printStackTrace() + e + } finally { + getEncryptedPrefs("git_operation").edit { + remove("ssh_key_local_passphrase") + } + } + binding.generate.text = getString(R.string.ssh_keygen_generating_done) + if (e == null) { + val df = ShowSshKeyFragment() + df.show(supportFragmentManager, "public_key") + val prefs = PreferenceManager.getDefaultSharedPreferences(this) + prefs.edit { putBoolean("use_generated_key", true) } + } else { + MaterialAlertDialogBuilder(this) + .setTitle(getString(R.string.error_generate_ssh_key)) + .setMessage(getString(R.string.ssh_key_error_dialog_text) + e.message) + .setPositiveButton(getString(R.string.dialog_ok)) { _, _ -> + finish() + } + .show() + } + hideKeyboard() + } + + private fun hideKeyboard() { + val imm = getSystemService<InputMethodManager>() ?: return + var view = currentFocus + if (view == null) { + view = View(this) + } + imm.hideSoftInputFromWindow(view.windowToken, 0) + } } |
