fix: check if passphrase is necessary before asking for it
Updates #2836
This commit is contained in:
parent
4c09adbe36
commit
d8f76b33e9
5 changed files with 33 additions and 1 deletions
|
@ -45,6 +45,10 @@ constructor(
|
||||||
out: ByteArrayOutputStream,
|
out: ByteArrayOutputStream,
|
||||||
) = withContext(dispatcherProvider.io()) { decryptPgp(password, identities, message, out) }
|
) = withContext(dispatcherProvider.io()) { decryptPgp(password, identities, message, out) }
|
||||||
|
|
||||||
|
fun isPasswordProtected(message: ByteArrayInputStream): Boolean {
|
||||||
|
return pgpCryptoHandler.isPassphraseProtected(message)
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun encrypt(
|
suspend fun encrypt(
|
||||||
identities: List<PGPIdentifier>,
|
identities: List<PGPIdentifier>,
|
||||||
content: ByteArrayInputStream,
|
content: ByteArrayInputStream,
|
||||||
|
|
|
@ -177,7 +177,7 @@ class DecryptActivity : BasePGPActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun askPassphrase(
|
private suspend fun askPassphrase(
|
||||||
isError: Boolean,
|
isError: Boolean,
|
||||||
gpgIdentifiers: List<PGPIdentifier>,
|
gpgIdentifiers: List<PGPIdentifier>,
|
||||||
authResult: Result,
|
authResult: Result,
|
||||||
|
@ -187,6 +187,14 @@ class DecryptActivity : BasePGPActivity() {
|
||||||
} else {
|
} else {
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
|
if (
|
||||||
|
!repository.isPasswordProtected(
|
||||||
|
withContext(dispatcherProvider.io()) { File(fullPath).readBytes().inputStream() }
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
decryptWithPassphrase(password = "", gpgIdentifiers = gpgIdentifiers)
|
||||||
|
return
|
||||||
|
}
|
||||||
val dialog = PasswordDialog()
|
val dialog = PasswordDialog()
|
||||||
if (isError) {
|
if (isError) {
|
||||||
dialog.setError()
|
dialog.setError()
|
||||||
|
|
|
@ -41,4 +41,10 @@ public interface CryptoHandler<Key, EncOpts : CryptoOptions, DecryptOpts : Crypt
|
||||||
|
|
||||||
/** Given a [fileName], return whether this instance can handle it. */
|
/** Given a [fileName], return whether this instance can handle it. */
|
||||||
public fun canHandle(fileName: String): Boolean
|
public fun canHandle(fileName: String): Boolean
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inspects the given encrypted [message] to notify user if a passphrase is necessary to decrypt
|
||||||
|
* it.
|
||||||
|
*/
|
||||||
|
public fun isPassphraseProtected(message: InputStream): Boolean
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,6 +139,14 @@ constructor(
|
||||||
/** @see KeyManager.getKeyById */
|
/** @see KeyManager.getKeyById */
|
||||||
override suspend fun getKeyId(key: PGPKey): PGPIdentifier? = tryGetId(key)
|
override suspend fun getKeyId(key: PGPKey): PGPIdentifier? = tryGetId(key)
|
||||||
|
|
||||||
|
public suspend fun isPasswordProtected(key: PGPKey): Boolean {
|
||||||
|
val keyring = tryParseKeyring(key)
|
||||||
|
if (keyring is PGPSecretKeyRing) {
|
||||||
|
keyring.secretKey.keyEncryptionAlgorithm
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
/** Checks if [keyDir] exists and attempts to create it if not. */
|
/** Checks if [keyDir] exists and attempts to create it if not. */
|
||||||
private fun keyDirExists(): Boolean {
|
private fun keyDirExists(): Boolean {
|
||||||
return keyDir.exists() || keyDir.mkdirs()
|
return keyDir.exists() || keyDir.mkdirs()
|
||||||
|
|
|
@ -22,6 +22,7 @@ import org.bouncycastle.openpgp.PGPSecretKeyRingCollection
|
||||||
import org.bouncycastle.util.io.Streams
|
import org.bouncycastle.util.io.Streams
|
||||||
import org.pgpainless.PGPainless
|
import org.pgpainless.PGPainless
|
||||||
import org.pgpainless.decryption_verification.ConsumerOptions
|
import org.pgpainless.decryption_verification.ConsumerOptions
|
||||||
|
import org.pgpainless.decryption_verification.MessageInspector
|
||||||
import org.pgpainless.encryption_signing.EncryptionOptions
|
import org.pgpainless.encryption_signing.EncryptionOptions
|
||||||
import org.pgpainless.encryption_signing.ProducerOptions
|
import org.pgpainless.encryption_signing.ProducerOptions
|
||||||
import org.pgpainless.exception.WrongPassphraseException
|
import org.pgpainless.exception.WrongPassphraseException
|
||||||
|
@ -136,4 +137,9 @@ public class PGPainlessCryptoHandler @Inject constructor() :
|
||||||
public override fun canHandle(fileName: String): Boolean {
|
public override fun canHandle(fileName: String): Boolean {
|
||||||
return fileName.substringAfterLast('.', "") == "gpg"
|
return fileName.substringAfterLast('.', "") == "gpg"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override fun isPassphraseProtected(message: InputStream): Boolean {
|
||||||
|
val info = MessageInspector.determineEncryptionInfoForMessage(message)
|
||||||
|
return info.isPassphraseEncrypted
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue