aboutsummaryrefslogtreecommitdiffstats
path: root/app/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/app/passwordstore/data/crypto/CryptoRepository.kt11
-rw-r--r--app/src/main/java/app/passwordstore/ui/crypto/PasswordCreationActivity.kt19
2 files changed, 24 insertions, 6 deletions
diff --git a/app/src/main/java/app/passwordstore/data/crypto/CryptoRepository.kt b/app/src/main/java/app/passwordstore/data/crypto/CryptoRepository.kt
index eb858006..61b63ea7 100644
--- a/app/src/main/java/app/passwordstore/data/crypto/CryptoRepository.kt
+++ b/app/src/main/java/app/passwordstore/data/crypto/CryptoRepository.kt
@@ -14,6 +14,8 @@ import app.passwordstore.crypto.PGPainlessCryptoHandler
import app.passwordstore.injection.prefs.SettingsPreferences
import app.passwordstore.util.coroutines.DispatcherProvider
import app.passwordstore.util.settings.PreferenceKeys
+import com.github.michaelbull.result.andThen
+import com.github.michaelbull.result.combine
import com.github.michaelbull.result.filterValues
import com.github.michaelbull.result.map
import com.github.michaelbull.result.mapBoth
@@ -64,7 +66,12 @@ constructor(
PGPEncryptOptions.Builder()
.withAsciiArmor(settings.getBoolean(PreferenceKeys.ASCII_ARMOR, false))
.build()
- val keys = identities.map { id -> pgpKeyManager.getKeyById(id) }.filterValues()
- pgpCryptoHandler.encrypt(keys, content, out, encryptionOptions).map { out }
+ // Every recipient in .gpg-id must be present: silently dropping one would write an entry
+ // that the missing key's owner can no longer decrypt.
+ identities
+ .map { id -> pgpKeyManager.getKeyById(id) }
+ .combine()
+ .andThen { keys -> pgpCryptoHandler.encrypt(keys, content, out, encryptionOptions) }
+ .map { out }
}
}
diff --git a/app/src/main/java/app/passwordstore/ui/crypto/PasswordCreationActivity.kt b/app/src/main/java/app/passwordstore/ui/crypto/PasswordCreationActivity.kt
index b4fd21e5..6971c2e3 100644
--- a/app/src/main/java/app/passwordstore/ui/crypto/PasswordCreationActivity.kt
+++ b/app/src/main/java/app/passwordstore/ui/crypto/PasswordCreationActivity.kt
@@ -40,6 +40,7 @@ import app.passwordstore.util.extensions.unsafeLazy
import app.passwordstore.util.extensions.viewBinding
import app.passwordstore.util.settings.DirectoryStructure
import app.passwordstore.util.settings.PreferenceKeys
+import com.github.michaelbull.result.getOrElse
import com.github.michaelbull.result.onFailure
import com.github.michaelbull.result.onSuccess
import com.github.michaelbull.result.runCatching
@@ -378,10 +379,20 @@ class PasswordCreationActivity : BasePGPActivity() {
runCatching {
val result =
withContext(dispatcherProvider.io()) {
- val outputStream = ByteArrayOutputStream()
- repository.encrypt(gpgIdentifiers, content.byteInputStream(), outputStream)
- outputStream
- }
+ val outputStream = ByteArrayOutputStream()
+ repository.encrypt(gpgIdentifiers, content.byteInputStream(), outputStream)
+ }
+ .getOrElse { e ->
+ logcat(ERROR) { e.asLog("Failed to encrypt password file") }
+ MaterialAlertDialogBuilder(this@PasswordCreationActivity)
+ .setTitle(R.string.password_creation_file_fail_title)
+ .setMessage(
+ getString(R.string.password_creation_encrypt_fail_message, e.message)
+ )
+ .setPositiveButton(android.R.string.ok, null)
+ .show()
+ return@runCatching
+ }
val passwordFile = Paths.get(path)
// If we're not editing, this file should not already exist!
// Additionally, if we were editing and the incoming and outgoing