diff options
| author | test@dangofactory.cos <you@example.com> | 2026-08-20 16:57:18 +0000 |
|---|---|---|
| committer | test@dangofactory.cos <you@example.com> | 2026-08-20 16:57:18 +0000 |
| commit | 50ce5d5e6cd0d720ff437d35eace545816848428 (patch) | |
| tree | b59af206a36265cf081945e434900b32b0c43edd /app/crypto-openpgp/src/main/java/com | |
| download | monocles_mail-50ce5d5e6cd0d720ff437d35eace545816848428.tar.gz monocles_mail-50ce5d5e6cd0d720ff437d35eace545816848428.tar.bz2 monocles_mail-50ce5d5e6cd0d720ff437d35eace545816848428.zip | |
Inital
Diffstat (limited to 'app/crypto-openpgp/src/main/java/com')
| -rw-r--r-- | app/crypto-openpgp/src/main/java/com/fsck/k9/crypto/openpgp/EncryptionDetector.java | 67 | ||||
| -rw-r--r-- | app/crypto-openpgp/src/main/java/com/fsck/k9/crypto/openpgp/OpenPgpEncryptionExtractor.kt | 30 |
2 files changed, 97 insertions, 0 deletions
diff --git a/app/crypto-openpgp/src/main/java/com/fsck/k9/crypto/openpgp/EncryptionDetector.java b/app/crypto-openpgp/src/main/java/com/fsck/k9/crypto/openpgp/EncryptionDetector.java new file mode 100644 index 0000000..3605b51 --- /dev/null +++ b/app/crypto-openpgp/src/main/java/com/fsck/k9/crypto/openpgp/EncryptionDetector.java @@ -0,0 +1,67 @@ +package com.fsck.k9.crypto.openpgp; + + +import androidx.annotation.NonNull; + +import com.fsck.k9.crypto.MessageCryptoStructureDetector; +import com.fsck.k9.mail.Body; +import com.fsck.k9.mail.BodyPart; +import com.fsck.k9.mail.Message; +import com.fsck.k9.mail.Multipart; +import com.fsck.k9.mail.Part; +import com.fsck.k9.message.extractors.TextPartFinder; + +import static com.fsck.k9.mail.internet.MimeUtility.isSameMimeType; + + +//FIXME: Make this only detect OpenPGP messages. Move support for S/MIME messages to separate module. +class EncryptionDetector { + private final TextPartFinder textPartFinder; + + + EncryptionDetector(TextPartFinder textPartFinder) { + this.textPartFinder = textPartFinder; + } + + public boolean isEncrypted(@NonNull Message message) { + return isPgpMimeOrSMimeEncrypted(message) || containsInlinePgpEncryptedText(message); + } + + private boolean isPgpMimeOrSMimeEncrypted(Message message) { + return containsPartWithMimeType(message, "multipart/encrypted", "application/pkcs7-mime"); + } + + private boolean containsInlinePgpEncryptedText(Message message) { + Part textPart = textPartFinder.findFirstTextPart(message); + return MessageCryptoStructureDetector.isPartPgpInlineEncrypted(textPart); + } + + private boolean containsPartWithMimeType(Part part, String... wantedMimeTypes) { + String mimeType = part.getMimeType(); + if (isMimeTypeAnyOf(mimeType, wantedMimeTypes)) { + return true; + } + + Body body = part.getBody(); + if (body instanceof Multipart) { + Multipart multipart = (Multipart) body; + for (BodyPart bodyPart : multipart.getBodyParts()) { + if (containsPartWithMimeType(bodyPart, wantedMimeTypes)) { + return true; + } + } + } + + return false; + } + + private boolean isMimeTypeAnyOf(String mimeType, String... wantedMimeTypes) { + for (String wantedMimeType : wantedMimeTypes) { + if (isSameMimeType(mimeType, wantedMimeType)) { + return true; + } + } + + return false; + } +} diff --git a/app/crypto-openpgp/src/main/java/com/fsck/k9/crypto/openpgp/OpenPgpEncryptionExtractor.kt b/app/crypto-openpgp/src/main/java/com/fsck/k9/crypto/openpgp/OpenPgpEncryptionExtractor.kt new file mode 100644 index 0000000..079114e --- /dev/null +++ b/app/crypto-openpgp/src/main/java/com/fsck/k9/crypto/openpgp/OpenPgpEncryptionExtractor.kt @@ -0,0 +1,30 @@ +package com.fsck.k9.crypto.openpgp + +import com.fsck.k9.crypto.EncryptionExtractor +import com.fsck.k9.crypto.EncryptionResult +import com.fsck.k9.mail.Message +import com.fsck.k9.message.extractors.TextPartFinder + +class OpenPgpEncryptionExtractor internal constructor( + private val encryptionDetector: EncryptionDetector +) : EncryptionExtractor { + + override fun extractEncryption(message: Message): EncryptionResult? { + return if (encryptionDetector.isEncrypted(message)) { + EncryptionResult(ENCRYPTION_TYPE, 0) + } else { + null + } + } + + companion object { + const val ENCRYPTION_TYPE = "openpgp" + + @JvmStatic + fun newInstance(): OpenPgpEncryptionExtractor { + val textPartFinder = TextPartFinder() + val encryptionDetector = EncryptionDetector(textPartFinder) + return OpenPgpEncryptionExtractor(encryptionDetector) + } + } +} |
