From 8f7f65635559fa3e2e1aae62ad3a6790225cfe81 Mon Sep 17 00:00:00 2001 From: cketti Date: Mon, 26 Jan 2015 20:25:43 +0100 Subject: [PATCH] Add method to find multipart/encrypted parts --- .../main/java/com/fsck/k9/mail/Message.java | 3 - .../src/main/java/com/fsck/k9/mail/Part.java | 4 +- .../fsck/k9/mail/internet/MimeBodyPart.java | 4 +- .../fsck/k9/mail/internet/MimeMessage.java | 6 +- .../fsck/k9/crypto/MessageDecryptorTest.java | 78 +++++++++++++++++++ .../com/fsck/k9/crypto/MessageDecryptor.java | 41 ++++++++++ 6 files changed, 127 insertions(+), 9 deletions(-) create mode 100644 k9mail/src/androidTest/java/com/fsck/k9/crypto/MessageDecryptorTest.java create mode 100644 k9mail/src/main/java/com/fsck/k9/crypto/MessageDecryptor.java diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Message.java b/k9mail-library/src/main/java/com/fsck/k9/mail/Message.java index 3f6e5515e..67ba3a244 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Message.java +++ b/k9mail-library/src/main/java/com/fsck/k9/mail/Message.java @@ -120,9 +120,6 @@ public abstract class Message implements Part, CompositeBody { @Override public abstract Body getBody(); - @Override - public abstract String getContentType() throws MessagingException; - @Override public abstract void addHeader(String name, String value) throws MessagingException; diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/Part.java b/k9mail-library/src/main/java/com/fsck/k9/mail/Part.java index 6f0de20cd..190ae378b 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/Part.java +++ b/k9mail-library/src/main/java/com/fsck/k9/mail/Part.java @@ -15,7 +15,7 @@ public interface Part { Body getBody(); - String getContentType() throws MessagingException; + String getContentType(); String getDisposition() throws MessagingException; @@ -25,7 +25,7 @@ public interface Part { boolean isMimeType(String mimeType) throws MessagingException; - String getMimeType() throws MessagingException; + String getMimeType(); void setBody(Body body); diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeBodyPart.java b/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeBodyPart.java index a39c9813b..3c0103541 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeBodyPart.java +++ b/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeBodyPart.java @@ -85,7 +85,7 @@ public class MimeBodyPart extends BodyPart { } @Override - public String getContentType() throws MessagingException { + public String getContentType() { String contentType = getFirstHeader(MimeHeader.HEADER_CONTENT_TYPE); return (contentType == null) ? "text/plain" : contentType; } @@ -111,7 +111,7 @@ public class MimeBodyPart extends BodyPart { } @Override - public String getMimeType() throws MessagingException { + public String getMimeType() { return MimeUtility.getHeaderParameter(getContentType(), null); } diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMessage.java b/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMessage.java index 120756dba..91ab8c812 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMessage.java +++ b/k9mail-library/src/main/java/com/fsck/k9/mail/internet/MimeMessage.java @@ -163,7 +163,7 @@ public class MimeMessage extends Message { } @Override - public String getContentType() throws MessagingException { + public String getContentType() { String contentType = getFirstHeader(MimeHeader.HEADER_CONTENT_TYPE); return (contentType == null) ? "text/plain" : contentType; } @@ -172,12 +172,14 @@ public class MimeMessage extends Message { public String getDisposition() throws MessagingException { return getFirstHeader(MimeHeader.HEADER_CONTENT_DISPOSITION); } + @Override public String getContentId() throws MessagingException { return null; } + @Override - public String getMimeType() throws MessagingException { + public String getMimeType() { return MimeUtility.getHeaderParameter(getContentType(), null); } diff --git a/k9mail/src/androidTest/java/com/fsck/k9/crypto/MessageDecryptorTest.java b/k9mail/src/androidTest/java/com/fsck/k9/crypto/MessageDecryptorTest.java new file mode 100644 index 000000000..17782d318 --- /dev/null +++ b/k9mail/src/androidTest/java/com/fsck/k9/crypto/MessageDecryptorTest.java @@ -0,0 +1,78 @@ +package com.fsck.k9.crypto; + + +import java.util.List; + +import android.support.test.runner.AndroidJUnit4; + +import com.fsck.k9.mail.Part; +import com.fsck.k9.mail.internet.MimeBodyPart; +import com.fsck.k9.mail.internet.MimeMessage; +import com.fsck.k9.mail.internet.MimeMessageHelper; +import com.fsck.k9.mail.internet.MimeMultipart; +import com.fsck.k9.mail.internet.TextBody; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static junit.framework.Assert.assertEquals; +import static junit.framework.Assert.assertSame; + + +@RunWith(AndroidJUnit4.class) +public class MessageDecryptorTest { + + @Test + public void findEncryptedPartsShouldReturnEmptyListForEmptyMessage() throws Exception { + MimeMessage emptyMessage = new MimeMessage(); + + List encryptedParts = MessageDecryptor.findEncryptedParts(emptyMessage); + assertEquals(0, encryptedParts.size()); + } + + @Test + public void findEncryptedPartsShouldReturnEmptyListForSimpleMessage() throws Exception { + MimeMessage message = new MimeMessage(); + message.setBody(new TextBody("message text")); + + List encryptedParts = MessageDecryptor.findEncryptedParts(message); + assertEquals(0, encryptedParts.size()); + } + + @Test + public void findEncryptedPartsShouldReturnEmptyEncryptedPart() throws Exception { + MimeMessage message = new MimeMessage(); + MimeMultipart mulitpartEncrypted = new MimeMultipart(); + mulitpartEncrypted.setSubType("encrypted"); + MimeMessageHelper.setBody(message, mulitpartEncrypted); + + List encryptedParts = MessageDecryptor.findEncryptedParts(message); + assertEquals(1, encryptedParts.size()); + assertSame(message, encryptedParts.get(0)); + } + + @Test + public void findEncryptedPartsShouldReturnMultipleEncryptedParts() throws Exception { + MimeMessage message = new MimeMessage(); + MimeMultipart multipartMixed = new MimeMultipart(); + multipartMixed.setSubType("mixed"); + MimeMessageHelper.setBody(message, multipartMixed); + + MimeMultipart mulitpartEncryptedOne = new MimeMultipart(); + mulitpartEncryptedOne.setSubType("encrypted"); + MimeBodyPart bodyPartOne = new MimeBodyPart(mulitpartEncryptedOne); + multipartMixed.addBodyPart(bodyPartOne); + + MimeBodyPart bodyPartTwo = new MimeBodyPart(null, "text/plain"); + multipartMixed.addBodyPart(bodyPartTwo); + + MimeMultipart mulitpartEncryptedThree = new MimeMultipart(); + mulitpartEncryptedThree.setSubType("encrypted"); + MimeBodyPart bodyPartThree = new MimeBodyPart(mulitpartEncryptedThree); + multipartMixed.addBodyPart(bodyPartThree); + + List encryptedParts = MessageDecryptor.findEncryptedParts(message); + assertEquals(2, encryptedParts.size()); + assertSame(bodyPartOne, encryptedParts.get(0)); + assertSame(bodyPartThree, encryptedParts.get(1)); + } +} diff --git a/k9mail/src/main/java/com/fsck/k9/crypto/MessageDecryptor.java b/k9mail/src/main/java/com/fsck/k9/crypto/MessageDecryptor.java new file mode 100644 index 000000000..f15acad9d --- /dev/null +++ b/k9mail/src/main/java/com/fsck/k9/crypto/MessageDecryptor.java @@ -0,0 +1,41 @@ +package com.fsck.k9.crypto; + + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +import com.fsck.k9.mail.Body; +import com.fsck.k9.mail.BodyPart; +import com.fsck.k9.mail.MessagingException; +import com.fsck.k9.mail.Multipart; +import com.fsck.k9.mail.Part; + + +public class MessageDecryptor { + private static final String MULTIPART_ENCRYPTED = "multipart/encrypted"; + + public static List findEncryptedParts(Part startPart) { + List encryptedParts = new ArrayList(); + Stack partsToCheck = new Stack(); + partsToCheck.push(startPart); + + while (!partsToCheck.isEmpty()) { + Part part = partsToCheck.pop(); + String mimeType = part.getMimeType(); + Body body = part.getBody(); + + if (MULTIPART_ENCRYPTED.equals(mimeType)) { + encryptedParts.add(part); + } else if (body instanceof Multipart) { + Multipart multipart = (Multipart) body; + for (int i = multipart.getCount() - 1; i >= 0; i--) { + BodyPart bodyPart = multipart.getBodyPart(i); + partsToCheck.push(bodyPart); + } + } + } + + return encryptedParts; + } +}