Skip to content

Commit 3c8b315

Browse files
committed
#7: fix missing S/MIME details on the resulting Outlook message
1 parent c9386f5 commit 3c8b315

File tree

2 files changed

+122
-25
lines changed

2 files changed

+122
-25
lines changed

src/main/java/org/simplejavamail/outlookmessageparser/model/OutlookMessage.java

Lines changed: 95 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Set;
2323
import java.util.TreeMap;
2424

25+
import static java.util.Arrays.copyOfRange;
2526
import static java.util.regex.Pattern.compile;
2627

2728
/**
@@ -64,6 +65,18 @@ public class OutlookMessage {
6465
* The name part of Reply-To header
6566
*/
6667
private String replyToName;
68+
/**
69+
* The MIME part of the S/MIME header
70+
*/
71+
private String smimeMime;
72+
/**
73+
* The S/MIME type part of the S/MIME header
74+
*/
75+
private String smimeType;
76+
/**
77+
* The S/MIME name part of the S/MIME header
78+
*/
79+
private String smimeName;
6780
/**
6881
* The mail's subject.
6982
*/
@@ -239,6 +252,9 @@ public void setProperty(final OutlookMessageProperty msgProp) {
239252
case 0x39: //CLIENT SUBMIT TIME
240253
setClientSubmitTime(stringValue);
241254
break;
255+
case 0x8005: // S/MIME details
256+
setSmime(stringValue);
257+
break;
242258
}
243259

244260
// save all properties (incl. those identified above)
@@ -261,7 +277,7 @@ public void setProperty(final OutlookMessageProperty msgProp) {
261277
// 3003: email address
262278
// 1008 rtf sync
263279
}
264-
280+
265281
private String convertValueToString(final Object value) {
266282
if (value == null) {
267283
return null;
@@ -379,47 +395,43 @@ private byte[] decompressRtfBytes(final byte[] value) {
379395

380396
@Override
381397
public String toString() {
382-
final StringBuilder sb = new StringBuilder();
383-
sb.append("From: ").append(createMailString(fromEmail, fromName)).append("\n");
384-
sb.append("To: ").append(createMailString(toEmail, toName)).append("\n");
385-
if (date != null) {
386-
final SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.ENGLISH);
387-
sb.append("Date: ").append(formatter.format(date)).append("\n");
388-
}
389-
if (subject != null) {
390-
sb.append("Subject: ").append(subject).append("\n");
391-
}
392-
sb.append("").append(outlookAttachments.size()).append(" outlookAttachments.");
398+
final StringBuilder sb = commonToString();
399+
sb.append(outlookAttachments.size()).append(" outlookAttachments.");
393400
return sb.toString();
394401
}
395-
402+
396403
/**
397404
* @return All information of this message object.
398405
*/
399406
public String toLongString() {
400-
final StringBuilder sb = new StringBuilder();
401-
sb.append("From: ").append(createMailString(fromEmail, fromName)).append("\n");
402-
sb.append("To: ").append(createMailString(toEmail, toName)).append("\n");
403-
if (date != null) {
404-
final SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.ENGLISH);
405-
sb.append("Date: ").append(formatter.format(date)).append("\n");
406-
}
407-
if (subject != null) {
408-
sb.append("Subject: ").append(subject).append("\n");
409-
}
407+
final StringBuilder sb = commonToString();
410408
sb.append("\n");
411409
if (bodyText != null) {
412410
sb.append(bodyText);
413411
}
414412
if (!outlookAttachments.isEmpty()) {
415413
sb.append("\n");
416-
sb.append("").append(outlookAttachments.size()).append(" outlookAttachments.\n");
414+
sb.append(outlookAttachments.size()).append(" outlookAttachments.\n");
417415
for (final OutlookAttachment att : outlookAttachments) {
418416
sb.append(att).append("\n");
419417
}
420418
}
421419
return sb.toString();
422420
}
421+
422+
private StringBuilder commonToString() {
423+
final StringBuilder sb = new StringBuilder();
424+
sb.append("From: ").append(createMailString(fromEmail, fromName)).append("\n");
425+
sb.append("To: ").append(createMailString(toEmail, toName)).append("\n");
426+
if (date != null) {
427+
final SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss z", Locale.ENGLISH);
428+
sb.append("Date: ").append(formatter.format(date)).append("\n");
429+
}
430+
if (subject != null) {
431+
sb.append("Subject: ").append(subject).append("\n");
432+
}
433+
return sb;
434+
}
423435

424436
/**
425437
* Convenience method for creating an email address expression (including the name, the address, or both).
@@ -443,6 +455,22 @@ private String createMailString(final String mail, final String name) {
443455
}
444456
return "\"" + name + "\" <" + mail + ">";
445457
}
458+
459+
void setSmime(String smimeHeader) {
460+
// application/pkcs7-mime;smime-type=signed-data;name=smime.p7m
461+
if (smimeHeader != null) {
462+
final String[] smimeHeaderParts = smimeHeader.split(";");
463+
setSmimeMime(smimeHeaderParts[0]);
464+
for (String smimeHeaderParam : copyOfRange(smimeHeaderParts, 1, smimeHeaderParts.length)) {
465+
final String[] smimeParamParts = smimeHeaderParam.split("=");
466+
if (smimeParamParts[0].equals("smime-type")) {
467+
setSmimeType(smimeParamParts[1]);
468+
} else if (smimeParamParts[0].equals("name")) {
469+
setSmimeName(smimeParamParts[1]);
470+
}
471+
}
472+
}
473+
}
446474

447475
/**
448476
* Bean getter for {@link #outlookAttachments}.
@@ -1002,11 +1030,53 @@ public void setReplyToEmail(final String replyToEmail) {
10021030
public String getReplyToName() {
10031031
return replyToName;
10041032
}
1005-
1033+
10061034
/**
10071035
* Bean setter for {@link #replyToName}.
10081036
*/
10091037
public void setReplyToName(final String replyToName) {
10101038
this.replyToName = replyToName;
10111039
}
1040+
1041+
/**
1042+
* Bean getter for {@link #smimeMime}.
1043+
*/
1044+
public String getSmimeMime() {
1045+
return smimeMime;
1046+
}
1047+
1048+
/**
1049+
* Bean setter for {@link #smimeMime}.
1050+
*/
1051+
public void setSmimeMime(String smimeMime) {
1052+
this.smimeMime = smimeMime;
1053+
}
1054+
1055+
/**
1056+
* Bean getter for {@link #smimeType}.
1057+
*/
1058+
public String getSmimeType() {
1059+
return smimeType;
1060+
}
1061+
1062+
/**
1063+
* Bean setter for {@link #smimeType}.
1064+
*/
1065+
public void setSmimeType(String smimeType) {
1066+
this.smimeType = smimeType;
1067+
}
1068+
1069+
/**
1070+
* Bean getter for {@link #smimeName}.
1071+
*/
1072+
public String getSmimeName() {
1073+
return smimeName;
1074+
}
1075+
1076+
/**
1077+
* Bean setter for {@link #smimeName}.
1078+
*/
1079+
public void setSmimeName(String smimeName) {
1080+
this.smimeName = smimeName;
1081+
}
10121082
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package org.simplejavamail.outlookmessageparser.model;
2+
3+
import org.junit.Test;
4+
5+
import static org.assertj.core.api.Assertions.assertThat;
6+
7+
public class OutlookMessageTest {
8+
@Test
9+
public void testSetSmime() {
10+
// application/pkcs7-mime;smime-type=signed-data;name=smime.p7m
11+
testSmime(null, null, null, null);
12+
testSmime("application/pkcs7-mime", "application/pkcs7-mime", null, null);
13+
testSmime("application/pkcs7-mime;", "application/pkcs7-mime", null, null);
14+
testSmime("application/pkcs7-mime;name=moo", "application/pkcs7-mime", null, "moo");
15+
testSmime("application/pkcs7-mime;smime-type=signed-data;name=smime.p7m", "application/pkcs7-mime", "signed-data", "smime.p7m");
16+
testSmime("application/pkcs7-mime;name=smime.p7m;smime-type=signed-data", "application/pkcs7-mime", "signed-data", "smime.p7m");
17+
testSmime("application/pkcs7-mime;name=smime.p7m;smime-type=signed-data;", "application/pkcs7-mime", "signed-data", "smime.p7m");
18+
}
19+
20+
private void testSmime(String smimeHeader, String smimeMime, String smimeType, String smimeName) {
21+
OutlookMessage msg = new OutlookMessage();
22+
msg.setSmime(smimeHeader);
23+
assertThat(msg.getSmimeMime()).isEqualTo(smimeMime);
24+
assertThat(msg.getSmimeType()).isEqualTo(smimeType);
25+
assertThat(msg.getSmimeName()).isEqualTo(smimeName);
26+
}
27+
}

0 commit comments

Comments
 (0)