From d6265438c3ee469c1bfcd8444b62c0c41629434a Mon Sep 17 00:00:00 2001 From: bbottema Date: Sun, 26 Jul 2020 10:03:25 +0200 Subject: [PATCH] #7: Added missing case for eneveloped S/MIME sign (smime-type) --- .../utils/mail/smime/SmimeState.java | 8 ++++++- .../utils/mail/smime/SmimeUtil.java | 24 +++++++++++-------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/src/main/java/net/markenwerk/utils/mail/smime/SmimeState.java b/src/main/java/net/markenwerk/utils/mail/smime/SmimeState.java index caaf9e2..9a7c3d5 100644 --- a/src/main/java/net/markenwerk/utils/mail/smime/SmimeState.java +++ b/src/main/java/net/markenwerk/utils/mail/smime/SmimeState.java @@ -43,12 +43,18 @@ public enum SmimeState { * encrypted. */ ENCRYPTED, - + /** * Indicates that the {@link MimePart} or {@link MimeMultipart} is S/MIME * signed. */ SIGNED, + + /** + * Indicates that the {@link MimePart} or {@link MimeMultipart} is S/MIME + * signed using the older envelope style. + */ + SIGNED_ENVELOPED, /** * Indicates that the {@link MimePart} or {@link MimeMultipart} is neither diff --git a/src/main/java/net/markenwerk/utils/mail/smime/SmimeUtil.java b/src/main/java/net/markenwerk/utils/mail/smime/SmimeUtil.java index 60b6e46..6a97e86 100644 --- a/src/main/java/net/markenwerk/utils/mail/smime/SmimeUtil.java +++ b/src/main/java/net/markenwerk/utils/mail/smime/SmimeUtil.java @@ -576,17 +576,15 @@ public static SmimeState getStatus(MimePart mimePart) { throw handledException(e); } } - + private static SmimeState getStatus(ContentType contentType) { - try { - if (isSmimeSignatureContentType(contentType)) { - return SmimeState.SIGNED; - } else if (isSmimeEncryptionContenttype(contentType)) { - return SmimeState.ENCRYPTED; - } else { - return SmimeState.NEITHER; - } - } catch (Exception e) { + if (isSmimeSignatureContentType(contentType)) { + return SmimeState.SIGNED; + } else if (isSignatureSmimeType(contentType)) { + return SmimeState.SIGNED_ENVELOPED; + } else if (isSmimeEncryptionContenttype(contentType)) { + return SmimeState.ENCRYPTED; + } else { return SmimeState.NEITHER; } } @@ -602,6 +600,12 @@ private static boolean isSmimeSignatureContentType(ContentType contentType) { return baseContentType.equalsIgnoreCase("multipart/signed") && isSmimeSignatureProtocoll(contentType.getParameter("protocol")); } + + private static boolean isSignatureSmimeType(ContentType contentType) { + String baseContentType = contentType.getBaseType(); + return baseContentType.equalsIgnoreCase("application/x-pkcs7-mime") + && "signed-data".equals(contentType.getParameter("smime-type")); + } private static boolean isSmimeSignatureProtocoll(String protocol) { return protocol.equalsIgnoreCase("application/pkcs7-signature")