diff options
Diffstat (limited to 'app/src/main/java/dev/msfjarvis/aps/ui/crypto')
3 files changed, 63 insertions, 26 deletions
diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivityV2.kt b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivityV2.kt index 799ca32d..33ecdc2b 100644 --- a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivityV2.kt +++ b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/DecryptActivityV2.kt @@ -12,11 +12,10 @@ import android.view.MenuItem import androidx.lifecycle.lifecycleScope import dagger.hilt.android.AndroidEntryPoint import dev.msfjarvis.aps.R -import dev.msfjarvis.aps.crypto.Key +import dev.msfjarvis.aps.data.crypto.CryptoRepository import dev.msfjarvis.aps.data.passfile.PasswordEntry import dev.msfjarvis.aps.data.password.FieldItem import dev.msfjarvis.aps.databinding.DecryptLayoutBinding -import dev.msfjarvis.aps.injection.crypto.CryptoSet import dev.msfjarvis.aps.ui.adapters.FieldItemAdapter import dev.msfjarvis.aps.util.extensions.unsafeLazy import dev.msfjarvis.aps.util.extensions.viewBinding @@ -29,6 +28,7 @@ import kotlin.time.ExperimentalTime import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.collect +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -38,7 +38,7 @@ class DecryptActivityV2 : BasePgpActivity() { private val binding by viewBinding(DecryptLayoutBinding::inflate) @Inject lateinit var passwordEntryFactory: PasswordEntry.Factory - @Inject lateinit var cryptos: CryptoSet + @Inject lateinit var repository: CryptoRepository private val relativeParentPath by unsafeLazy { getParentPath(fullPath, repoPath) } private var passwordEntry: PasswordEntry? = null @@ -127,16 +127,25 @@ class DecryptActivityV2 : BasePgpActivity() { } private fun decrypt() { + val dialog = PasswordDialog() + lifecycleScope.launch(Dispatchers.Main) { + dialog.password.collectLatest { value -> + if (value != null) { + decrypt(value) + } + } + } + dialog.show(supportFragmentManager, "PASSWORD_DIALOG") + } + + private fun decrypt(password: String) { lifecycleScope.launch { - // TODO(msfjarvis): native methods are fallible, add error handling once out of testing - val message = withContext(Dispatchers.IO) { File(fullPath).inputStream() } + val message = withContext(Dispatchers.IO) { File(fullPath).readBytes().inputStream() } val result = withContext(Dispatchers.IO) { - val crypto = cryptos.first { it.canHandle(fullPath) } val outputStream = ByteArrayOutputStream() - crypto.decrypt( - Key(PRIV_KEY.encodeToByteArray()), - PASS, + repository.decrypt( + password, message, outputStream, ) @@ -179,10 +188,4 @@ class DecryptActivityV2 : BasePgpActivity() { } } } - - companion object { - // TODO(msfjarvis): source these from storage and user input - const val PRIV_KEY = "" - const val PASS = "" - } } diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivityV2.kt b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivityV2.kt index ab5b6371..a191ba61 100644 --- a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivityV2.kt +++ b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordCreationActivityV2.kt @@ -36,10 +36,9 @@ import com.google.zxing.integration.android.IntentIntegrator.QR_CODE import com.google.zxing.qrcode.QRCodeReader import dagger.hilt.android.AndroidEntryPoint import dev.msfjarvis.aps.R -import dev.msfjarvis.aps.crypto.Key +import dev.msfjarvis.aps.data.crypto.CryptoRepository import dev.msfjarvis.aps.data.passfile.PasswordEntry import dev.msfjarvis.aps.databinding.PasswordCreationActivityBinding -import dev.msfjarvis.aps.injection.crypto.CryptoSet import dev.msfjarvis.aps.ui.dialogs.DicewarePasswordGeneratorDialogFragment import dev.msfjarvis.aps.ui.dialogs.OtpImportDialogFragment import dev.msfjarvis.aps.ui.dialogs.PasswordGeneratorDialogFragment @@ -70,7 +69,7 @@ class PasswordCreationActivityV2 : BasePgpActivity() { private val binding by viewBinding(PasswordCreationActivityBinding::inflate) @Inject lateinit var passwordEntryFactory: PasswordEntry.Factory - @Inject lateinit var cryptos: CryptoSet + @Inject lateinit var repository: CryptoRepository private val suggestedName by unsafeLazy { intent.getStringExtra(EXTRA_FILE_NAME) } private val suggestedPass by unsafeLazy { intent.getStringExtra(EXTRA_PASSWORD) } @@ -364,15 +363,10 @@ class PasswordCreationActivityV2 : BasePgpActivity() { lifecycleScope.launch(Dispatchers.Main) { runCatching { - val crypto = cryptos.first { it.canHandle(path) } val result = withContext(Dispatchers.IO) { val outputStream = ByteArrayOutputStream() - crypto.encrypt( - listOf(Key(PUB_KEY.encodeToByteArray())), - content.byteInputStream(), - outputStream, - ) + repository.encrypt(content.byteInputStream(), outputStream) outputStream } val file = File(path) @@ -484,7 +478,5 @@ class PasswordCreationActivityV2 : BasePgpActivity() { const val EXTRA_EXTRA_CONTENT = "EXTRA_CONTENT" const val EXTRA_GENERATE_PASSWORD = "GENERATE_PASSWORD" const val EXTRA_EDITING = "EDITING" - // TODO(msfjarvis): source this from storage - const val PUB_KEY = "" } } diff --git a/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordDialog.kt b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordDialog.kt new file mode 100644 index 00000000..3542422a --- /dev/null +++ b/app/src/main/java/dev/msfjarvis/aps/ui/crypto/PasswordDialog.kt @@ -0,0 +1,42 @@ +/* + * Copyright © 2014-2022 The Android Password Store Authors. All Rights Reserved. + * SPDX-License-Identifier: GPL-3.0-only + */ + +package dev.msfjarvis.aps.ui.crypto + +import android.app.Dialog +import android.content.DialogInterface +import android.os.Bundle +import androidx.fragment.app.DialogFragment +import com.google.android.material.dialog.MaterialAlertDialogBuilder +import dev.msfjarvis.aps.R +import dev.msfjarvis.aps.databinding.DialogPasswordEntryBinding +import dev.msfjarvis.aps.util.extensions.finish +import dev.msfjarvis.aps.util.extensions.unsafeLazy +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow + +/** [DialogFragment] to request a password from the user and forward it along. */ +class PasswordDialog : DialogFragment() { + + private val binding by unsafeLazy { DialogPasswordEntryBinding.inflate(layoutInflater) } + private val _password = MutableStateFlow<String?>(null) + val password = _password.asStateFlow() + + override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { + val builder = MaterialAlertDialogBuilder(requireContext()) + builder.setView(binding.root) + builder.setTitle(R.string.password) + builder.setPositiveButton(android.R.string.ok) { _, _ -> + do {} while (!_password.tryEmit(binding.passwordEditText.text.toString())) + dismiss() + } + return builder.create() + } + + override fun onCancel(dialog: DialogInterface) { + super.onCancel(dialog) + finish() + } +} |
