summaryrefslogtreecommitdiff
path: root/app/crypto-openpgp/src/main/java/com
diff options
context:
space:
mode:
authortest@dangofactory.cos <you@example.com>2026-08-20 16:57:18 +0000
committertest@dangofactory.cos <you@example.com>2026-08-20 16:57:18 +0000
commit50ce5d5e6cd0d720ff437d35eace545816848428 (patch)
treeb59af206a36265cf081945e434900b32b0c43edd /app/crypto-openpgp/src/main/java/com
downloadmonocles_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.java67
-rw-r--r--app/crypto-openpgp/src/main/java/com/fsck/k9/crypto/openpgp/OpenPgpEncryptionExtractor.kt30
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)
+ }
+ }
+}