package com.fsck.k9.message.extractors; import android.support.annotation.NonNull; import com.fsck.k9.crypto.MessageDecryptVerifier; 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 static com.fsck.k9.mail.internet.MimeUtility.isSameMimeType; 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 MessageDecryptVerifier.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; } }