ignore leading whitespace for pgp/inline messages in MessageDecryptVerifier (fixes #1823)
This commit is contained in:
parent
833adc732e
commit
422806f622
2 changed files with 95 additions and 4 deletions
|
@ -8,6 +8,7 @@ import java.util.List;
|
|||
import java.util.Stack;
|
||||
|
||||
import android.support.annotation.Nullable;
|
||||
import android.support.annotation.VisibleForTesting;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import com.fsck.k9.mail.Body;
|
||||
|
@ -188,13 +189,17 @@ public class MessageDecryptVerifier {
|
|||
return isPgpEncrypted || isPgpSigned;
|
||||
}
|
||||
|
||||
private static boolean isPartPgpInlineEncryptedOrSigned(Part part) {
|
||||
@VisibleForTesting
|
||||
static boolean isPartPgpInlineEncryptedOrSigned(Part part) {
|
||||
if (!part.isMimeType(TEXT_PLAIN) && !part.isMimeType(APPLICATION_PGP)) {
|
||||
return false;
|
||||
}
|
||||
String text = MessageExtractor.getTextFromPart(part, TEXT_LENGTH_FOR_INLINE_CHECK);
|
||||
return !TextUtils.isEmpty(text) &&
|
||||
(text.startsWith(PGP_INLINE_START_MARKER) || text.startsWith(PGP_INLINE_SIGNED_START_MARKER));
|
||||
if (TextUtils.isEmpty(text)) {
|
||||
return false;
|
||||
}
|
||||
text = text.trim();
|
||||
return text.startsWith(PGP_INLINE_START_MARKER) || text.startsWith(PGP_INLINE_SIGNED_START_MARKER);
|
||||
}
|
||||
|
||||
public static boolean isPartPgpInlineEncrypted(@Nullable Part part) {
|
||||
|
@ -205,7 +210,11 @@ public class MessageDecryptVerifier {
|
|||
return false;
|
||||
}
|
||||
String text = MessageExtractor.getTextFromPart(part, TEXT_LENGTH_FOR_INLINE_CHECK);
|
||||
return !TextUtils.isEmpty(text) && text.startsWith(PGP_INLINE_START_MARKER);
|
||||
if (TextUtils.isEmpty(text)) {
|
||||
return false;
|
||||
}
|
||||
text = text.trim();
|
||||
return text.startsWith(PGP_INLINE_START_MARKER);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -21,7 +21,9 @@ import org.robolectric.RobolectricTestRunner;
|
|||
import org.robolectric.annotation.Config;
|
||||
|
||||
import static junit.framework.Assert.assertEquals;
|
||||
import static junit.framework.Assert.assertFalse;
|
||||
import static junit.framework.Assert.assertSame;
|
||||
import static junit.framework.Assert.assertTrue;
|
||||
import static org.mockito.Mockito.mock;
|
||||
|
||||
|
||||
|
@ -272,6 +274,86 @@ public class MessageDecryptVerifierTest {
|
|||
assertSame(getPart(message, 1), signedParts.get(0));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isPgpInlineMethods__withPgpInlineData__shouldReturnTrue() throws Exception {
|
||||
String pgpInlineData = "-----BEGIN PGP MESSAGE-----\n" +
|
||||
"Header: Value\n" +
|
||||
"\n" +
|
||||
"base64base64base64base64\n" +
|
||||
"-----END PGP MESSAGE-----\n";
|
||||
|
||||
MimeMessage message = new MimeMessage();
|
||||
message.setBody(new TextBody(pgpInlineData));
|
||||
|
||||
assertTrue(MessageDecryptVerifier.isPartPgpInlineEncrypted(message));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isPgpInlineMethods__withEncryptedDataAndLeadingWhitespace__shouldReturnTrue() throws Exception {
|
||||
String pgpInlineData = "\n \n \n" +
|
||||
"-----BEGIN PGP MESSAGE-----\n" +
|
||||
"Header: Value\n" +
|
||||
"\n" +
|
||||
"base64base64base64base64\n" +
|
||||
"-----END PGP MESSAGE-----\n";
|
||||
|
||||
MimeMessage message = new MimeMessage();
|
||||
message.setBody(new TextBody(pgpInlineData));
|
||||
|
||||
assertTrue(MessageDecryptVerifier.isPartPgpInlineEncryptedOrSigned(message));
|
||||
assertTrue(MessageDecryptVerifier.isPartPgpInlineEncrypted(message));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isPgpInlineMethods__withEncryptedDataAndLeadingGarbage__shouldReturnFalse() throws Exception {
|
||||
String pgpInlineData = "garbage!" +
|
||||
"-----BEGIN PGP MESSAGE-----\n" +
|
||||
"Header: Value\n" +
|
||||
"\n" +
|
||||
"base64base64base64base64\n" +
|
||||
"-----END PGP MESSAGE-----\n";
|
||||
|
||||
MimeMessage message = new MimeMessage();
|
||||
message.setBody(new TextBody(pgpInlineData));
|
||||
|
||||
assertFalse(MessageDecryptVerifier.isPartPgpInlineEncryptedOrSigned(message));
|
||||
assertFalse(MessageDecryptVerifier.isPartPgpInlineEncrypted(message));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isPartPgpInlineEncryptedOrSigned__withSignedData__shouldReturnTrue() throws Exception {
|
||||
String pgpInlineData = "-----BEGIN PGP SIGNED MESSAGE-----\n" +
|
||||
"Header: Value\n" +
|
||||
"\n" +
|
||||
"-----BEGIN PGP SIGNATURE-----\n" +
|
||||
"Header: Value\n" +
|
||||
"\n" +
|
||||
"base64base64base64base64\n" +
|
||||
"-----END PGP SIGNED MESSAGE-----\n";
|
||||
|
||||
MimeMessage message = new MimeMessage();
|
||||
message.setBody(new TextBody(pgpInlineData));
|
||||
|
||||
assertTrue(MessageDecryptVerifier.isPartPgpInlineEncryptedOrSigned(message));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isPartPgpInlineEncrypted__withSignedData__shouldReturnFalse() throws Exception {
|
||||
String pgpInlineData = "-----BEGIN PGP SIGNED MESSAGE-----\n" +
|
||||
"Header: Value\n" +
|
||||
"\n" +
|
||||
"-----BEGIN PGP SIGNATURE-----\n" +
|
||||
"Header: Value\n" +
|
||||
"\n" +
|
||||
"base64base64base64base64\n" +
|
||||
"-----END PGP SIGNED MESSAGE-----\n";
|
||||
|
||||
MimeMessage message = new MimeMessage();
|
||||
message.setBody(new TextBody(pgpInlineData));
|
||||
|
||||
assertFalse(MessageDecryptVerifier.isPartPgpInlineEncrypted(message));
|
||||
}
|
||||
|
||||
MimeMessage messageFromBody(BodyPart bodyPart) throws MessagingException {
|
||||
MimeMessage message = new MimeMessage();
|
||||
MimeMessageHelper.setBody(message, bodyPart.getBody());
|
||||
|
|
Loading…
Reference in a new issue