fix: check if passphrase is necessary before asking for it

Updates #2836
This commit is contained in:
Harsh Shandilya 2023-12-25 15:36:01 +05:30
parent 4c09adbe36
commit d8f76b33e9
5 changed files with 33 additions and 1 deletions

View file

@ -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,

View file

@ -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()

View file

@ -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
} }

View file

@ -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()

View file

@ -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
}
} }