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