diff options
Diffstat (limited to 'app/src/main/java')
| -rw-r--r-- | app/src/main/java/app/passwordstore/data/crypto/CryptoRepository.kt | 11 | ||||
| -rw-r--r-- | app/src/main/java/app/passwordstore/ui/crypto/PasswordCreationActivity.kt | 19 |
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 |
