@Override public void setSubject(String subject) { setHeader("Subject", subject); }
@Override public void setInReplyTo(String inReplyTo) { setHeader("In-Reply-To", inReplyTo); }
public void setMessageId(String messageId) { setHeader("Message-ID", messageId); mMessageId = messageId; }
@Override public void setSender(Address sender) { if (sender != null) { setHeader("Sender", sender.toEncodedString()); this.mSender = new Address[] { sender }; } else { this.mSender = null; } }
@Override public void setEncoding(String encoding) throws MessagingException { if (mBody != null) { mBody.setEncoding(encoding); } setHeader(MimeHeader.HEADER_CONTENT_TRANSFER_ENCODING, encoding); }
@Override public void setFrom(Address from) { if (from != null) { setHeader("From", from.toEncodedString()); this.mFrom = new Address[] { from }; } else { this.mFrom = null; } }
private void addDraftStateHeader() { AutocryptDraftStateHeader autocryptDraftStateHeader = AutocryptDraftStateHeader.fromCryptoStatus(cryptoStatus); currentProcessedMimeMessage.setHeader(AutocryptDraftStateHeader.AUTOCRYPT_DRAFT_STATE_HEADER, autocryptDraftStateHeader.toHeaderValue()); }
@Override public void setReplyTo(Address[] replyTo) { if (replyTo == null || replyTo.length == 0) { removeHeader("Reply-to"); mReplyTo = null; } else { setHeader("Reply-to", Address.toEncodedString(replyTo)); mReplyTo = replyTo; } }
private void moveSubjectIntoEncryptedPayload() { String[] subjects = currentProcessedMimeMessage.getHeader(MimeHeader.SUBJECT); if (subjects.length > 0) { messageContentBodyPart.setHeader(MimeHeader.HEADER_CONTENT_TYPE, messageContentBodyPart.getContentType() + "; protected-headers=\"v1\""); messageContentBodyPart.setHeader(MimeHeader.SUBJECT, subjects[0]); currentProcessedMimeMessage.setHeader(MimeHeader.SUBJECT, resourceProvider.encryptedSubject()); } }
private static Message createMessage(String mimeType, Body body) { MimeMessage message = new MimeMessage(); message.setBody(body); message.setHeader(MimeHeader.HEADER_CONTENT_TYPE, mimeType); return message; }
private static Message createMessage(String mimeType, Body body) { MimeMessage message = new MimeMessage(); message.setBody(body); message.setHeader(MimeHeader.HEADER_CONTENT_TYPE, mimeType); return message; }
@Test public void textPlain() throws Exception { MimeMessage message = new MimeMessage(); message.setUid("msguid"); message.setHeader("Content-Type", "text/plain"); MessageCryptoCallback messageCryptoCallback = mock(MessageCryptoCallback.class); messageCryptoHelper.asyncStartOrResumeProcessingMessage(message, messageCryptoCallback, null, false); ArgumentCaptor<MessageCryptoAnnotations> captor = ArgumentCaptor.forClass(MessageCryptoAnnotations.class); verify(messageCryptoCallback).onCryptoOperationsFinished(captor.capture()); MessageCryptoAnnotations annotations = captor.getValue(); assertTrue(annotations.isEmpty()); verifyNoMoreInteractions(messageCryptoCallback); verify(autocryptOperations).hasAutocryptHeader(message); verifyNoMoreInteractions(autocryptOperations); }
private void mimeBuildSignedMessage(@NonNull BodyPart signedBodyPart, Intent result) throws MessagingException { if (!cryptoStatus.isSigningEnabled()) { throw new IllegalStateException("call to mimeBuildSignedMessage while signing isn't enabled!"); } byte[] signedData = result.getByteArrayExtra(OpenPgpApi.RESULT_DETACHED_SIGNATURE); if (signedData == null) { throw new MessagingException("didn't find expected RESULT_DETACHED_SIGNATURE in api call result"); } MimeMultipart multipartSigned = createMimeMultipart(); multipartSigned.setSubType("signed"); multipartSigned.addBodyPart(signedBodyPart); multipartSigned.addBodyPart( new MimeBodyPart(new BinaryMemoryBody(signedData, MimeUtil.ENC_7BIT), "application/pgp-signature; name=\"signature.asc\"")); MimeMessageHelper.setBody(currentProcessedMimeMessage, multipartSigned); String contentType = String.format( "multipart/signed; boundary=\"%s\";\r\n protocol=\"application/pgp-signature\"", multipartSigned.getBoundary()); if (result.hasExtra(OpenPgpApi.RESULT_SIGNATURE_MICALG)) { String micAlgParameter = result.getStringExtra(OpenPgpApi.RESULT_SIGNATURE_MICALG); contentType += String.format("; micalg=\"%s\"", micAlgParameter); } else { Timber.e("missing micalg parameter for pgp multipart/signed!"); } currentProcessedMimeMessage.setHeader(MimeHeader.HEADER_CONTENT_TYPE, contentType); }
public static MimeMessage messageFromBody(BodyPart bodyPart) throws MessagingException { MimeMessage message = new MimeMessage(); MimeMessageHelper.setBody(message, bodyPart.getBody()); if (bodyPart.getContentType() != null) { message.setHeader("Content-Type", bodyPart.getContentType()); } message.setUid("msguid"); return message; }
private void mimeBuildEncryptedMessage(@NonNull Body encryptedBodyPart) throws MessagingException { MimeMultipart multipartEncrypted = createMimeMultipart(); multipartEncrypted.setSubType("encrypted"); multipartEncrypted.addBodyPart(new MimeBodyPart(new TextBody("Version: 1"), "application/pgp-encrypted")); MimeBodyPart encryptedPart = new MimeBodyPart(encryptedBodyPart, "application/octet-stream; name=\"encrypted.asc\""); encryptedPart.addHeader(MimeHeader.HEADER_CONTENT_DISPOSITION, "inline; filename=\"encrypted.asc\""); multipartEncrypted.addBodyPart(encryptedPart); MimeMessageHelper.setBody(currentProcessedMimeMessage, multipartEncrypted); String contentType = String.format( "multipart/encrypted; boundary=\"%s\";\r\n protocol=\"application/pgp-encrypted\"", multipartEncrypted.getBoundary()); currentProcessedMimeMessage.setHeader(MimeHeader.HEADER_CONTENT_TYPE, contentType); }
@Test public void testSimpleHtmlMessage() throws MessagingException { String bodyText = "<strong>K-9 Mail</strong> rocks :>"; // Create text/plain body TextBody body = new TextBody(bodyText); // Create message MimeMessage message = new MimeMessage(); message.setHeader(MimeHeader.HEADER_CONTENT_TYPE, "text/html"); MimeMessageHelper.setBody(message, body); // Extract text ArrayList<Viewable> outputViewableParts = new ArrayList<>(); MessageExtractor.findViewablesAndAttachments(message, outputViewableParts, null); assertEquals(outputViewableParts.size(), 1); ViewableExtractedText container = messageViewInfoExtractor.extractTextFromViewables(outputViewableParts); assertEquals(BODY_TEXT, container.text); assertEquals(bodyText, container.html); }
@Test public void textPlain_withAutocrypt() throws Exception { MimeMessage message = new MimeMessage(); message.setUid("msguid"); message.setHeader("Content-Type", "text/plain"); when(autocryptOperations.hasAutocryptHeader(message)).thenReturn(true); when(autocryptOperations.addAutocryptPeerUpdateToIntentIfPresent(same(message), any(Intent.class))).thenReturn(true); MessageCryptoCallback messageCryptoCallback = mock(MessageCryptoCallback.class); messageCryptoHelper.asyncStartOrResumeProcessingMessage(message, messageCryptoCallback, null, false); ArgumentCaptor<MessageCryptoAnnotations> captor = ArgumentCaptor.forClass(MessageCryptoAnnotations.class); verify(messageCryptoCallback).onCryptoOperationsFinished(captor.capture()); MessageCryptoAnnotations annotations = captor.getValue(); assertTrue(annotations.isEmpty()); verifyNoMoreInteractions(messageCryptoCallback); ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); verify(autocryptOperations).addAutocryptPeerUpdateToIntentIfPresent(same(message), intentCaptor.capture()); verify(openPgpApi).executeApiAsync(same(intentCaptor.getValue()), same((InputStream) null), same((OutputStream) null), any(IOpenPgpCallback.class)); }
@Test public void testTextPlainFormatFlowed() throws MessagingException { // Create text/plain body TextBody body = new TextBody(BODY_TEXT_FLOWED); // Create message MimeMessage message = new MimeMessage(); MimeMessageHelper.setBody(message, body); message.setHeader(MimeHeader.HEADER_CONTENT_TYPE, "text/plain; format=flowed"); // Extract text List<Part> outputNonViewableParts = new ArrayList<>(); ArrayList<Viewable> outputViewableParts = new ArrayList<>(); MessageExtractor.findViewablesAndAttachments(message, outputViewableParts, outputNonViewableParts); ViewableExtractedText container = messageViewInfoExtractor.extractTextFromViewables(outputViewableParts); String expectedText = "K-9 Mail rocks :> flowed line\r\n" + "not flowed line"; String expectedHtml = "<pre class=\"k9mail\">" + "K-9 Mail rocks :> flowed line<br>not flowed line" + "</pre>"; assertEquals(expectedText, container.text); assertEquals(expectedHtml, container.html); }
@Test public void testSimplePlainTextMessage() throws MessagingException { // Create text/plain body TextBody body = new TextBody(BODY_TEXT); // Create message MimeMessage message = new MimeMessage(); message.setHeader(MimeHeader.HEADER_CONTENT_TYPE, "text/plain"); MimeMessageHelper.setBody(message, body); // Extract text List<Part> outputNonViewableParts = new ArrayList<>(); ArrayList<Viewable> outputViewableParts = new ArrayList<>(); MessageExtractor.findViewablesAndAttachments(message, outputViewableParts, outputNonViewableParts); ViewableExtractedText container = messageViewInfoExtractor.extractTextFromViewables(outputViewableParts); String expectedHtml = "<pre class=\"k9mail\">" + "K-9 Mail rocks :>" + "</pre>"; assertEquals(BODY_TEXT, container.text); assertEquals(expectedHtml, container.html); }
@Test public void testShouldSanitizeOutputHtml() throws MessagingException { // Create text/plain body TextBody body = new TextBody(BODY_TEXT); // Create message MimeMessage message = new MimeMessage(); MimeMessageHelper.setBody(message, body); message.setHeader(MimeHeader.HEADER_CONTENT_TYPE, "text/plain; format=flowed"); // Prepare fixture HtmlProcessor htmlProcessor = mock(HtmlProcessor.class); MessageViewInfoExtractor messageViewInfoExtractor = new MessageViewInfoExtractor(null, htmlProcessor, new TestCoreResourceProvider()); String value = "--sanitized html--"; when(htmlProcessor.processForDisplay(anyString())).thenReturn(value); // Extract text List<Part> outputNonViewableParts = new ArrayList<>(); ArrayList<Viewable> outputViewableParts = new ArrayList<>(); MessageExtractor.findViewablesAndAttachments(message, outputViewableParts, outputNonViewableParts); ViewableExtractedText viewableExtractedText = messageViewInfoExtractor.extractTextFromViewables(outputViewableParts); assertSame(value, viewableExtractedText.html); }