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")