Skip to content

Commit 3a86aed

Browse files
committed
#465: don't explicitly depend on DKIM/SMIME modules
1 parent fe90d3a commit 3a86aed

File tree

6 files changed

+43
-9
lines changed

6 files changed

+43
-9
lines changed

modules/core-module/src/main/java/org/simplejavamail/internal/modules/DKIMModule.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,11 @@ public interface DKIMModule {
2525
* @return The original mime message wrapped in a new one that performs signing when sent.
2626
*/
2727
MimeMessage signMessageWithDKIM(@NotNull Email email, @NotNull MimeMessage messageToSign, @NotNull DkimConfig dkimConfig, @NotNull Recipient fromRecipient);
28+
29+
/**
30+
* @return Whether the email has been properly wrapped in a MimeMessage subtype that overrides Message-ID. This is to
31+
* make sure we never send an email without making sure the Message-ID is properly customized (using
32+
* {@link org.simplejavamail.api.email.EmailPopulatingBuilder#fixingMessageId(String)}.
33+
*/
34+
boolean isMessageIdFixingMessage(MimeMessage message);
2835
}

modules/core-module/src/main/java/org/simplejavamail/internal/modules/SMIMEModule.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,11 @@ public interface SMIMEModule {
7474

7575
@NotNull
7676
MimeMessage encryptMessageWithSmime(@NotNull Session session, @NotNull final Email email, @NotNull MimeMessage messageToProtect, @NotNull X509Certificate x509Certificate);
77+
78+
/**
79+
* @return Whether the email has been properly wrapped in a MimeMessage subtype that overrides Message-ID. This is to
80+
* make sure we never send an email without making sure the Message-ID is properly customized (using
81+
* {@link org.simplejavamail.api.email.EmailPopulatingBuilder#fixingMessageId(String)}.
82+
*/
83+
boolean isMessageIdFixingMessage(MimeMessage message);
7784
}

modules/dkim-module/src/main/java/org/simplejavamail/internal/dkimsupport/DKIMSigner.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,9 @@ public MimeMessage signMessageWithDKIM(@NotNull Email email, @NotNull final Mime
5757
throw new org.simplejavamail.internal.dkimsupport.DKIMSigningException(org.simplejavamail.internal.dkimsupport.DKIMSigningException.ERROR_SIGNING_DKIM_INVALID_DOMAINKEY, e);
5858
}
5959
}
60+
61+
@Override
62+
public boolean isMessageIdFixingMessage(MimeMessage message) {
63+
return message instanceof DkimMessageIdFixingMimeMessage;
64+
}
6065
}

modules/simple-java-mail/src/main/java/org/simplejavamail/internal/moduleloader/ModuleLoader.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public class ModuleLoader {
1818

1919
private static final boolean BATCH_SUPPORT_CLASS_AVAILABLE = MiscUtil.classAvailable("org.simplejavamail.internal.batchsupport.BatchSupport");
2020
private static final boolean SMIME_SUPPORT_CLASS_AVAILABLE = MiscUtil.classAvailable("org.simplejavamail.internal.smimesupport.SMIMESupport");
21+
private static final boolean DKIM_SUPPORT_CLASS_AVAILABLE = MiscUtil.classAvailable("org.simplejavamail.internal.dkimsupport.DKIMSigner");
2122

2223
private static final Map<Class, Object> LOADED_MODULES = new HashMap<>();
2324

@@ -100,6 +101,13 @@ public static boolean smimeModuleAvailable() {
100101
SMIME_SUPPORT_CLASS_AVAILABLE);
101102
}
102103

104+
public static boolean dkimModuleAvailable() {
105+
return !FORCED_DISABLED_MODULES.contains(DKIMModule.class) &&
106+
((FORCED_RECHECK_MODULES.contains(DKIMModule.class) &&
107+
MiscUtil.classAvailable("org.simplejavamail.internal.dkimsupport.DKIMSigner")) ||
108+
DKIM_SUPPORT_CLASS_AVAILABLE);
109+
}
110+
103111
@SuppressWarnings("unchecked")
104112
private static <T> T loadModule(Class moduleClass,String moduleName, String moduleImplClassName, String moduleHome) {
105113
try {

modules/simple-java-mail/src/main/java/org/simplejavamail/mailer/internal/SessionBasedEmailToMimeMessageConverter.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,9 @@
1515
import org.simplejavamail.converter.internal.mimemessage.ImmutableDelegatingSMTPMessage;
1616
import org.simplejavamail.converter.internal.mimemessage.MimeMessageProducerHelper;
1717
import org.simplejavamail.email.internal.InternalEmail;
18-
import org.simplejavamail.internal.dkimsupport.DkimMessageIdFixingMimeMessage;
18+
import org.simplejavamail.internal.moduleloader.ModuleLoader;
1919
import org.simplejavamail.mailer.internal.util.MessageIdFixingMimeMessage;
2020
import org.simplejavamail.mailer.internal.util.SessionLogger;
21-
import org.simplejavamail.utils.mail.smime.SmimeMessageIdFixingMimeMessage;
22-
import org.simplejavamail.utils.mail.smime.SmimeMessageIdFixingSMTPMessage;
2321
import org.slf4j.Logger;
2422
import org.slf4j.LoggerFactory;
2523

@@ -90,12 +88,8 @@ private MimeMessage convertAndLogMimeMessage(final Email email) throws Messaging
9088

9189
SessionLogger.logSession(session, operationalConfig.isAsync(), "mail");
9290

93-
if (!(message instanceof MessageIdFixingMimeMessage) &&
94-
!(message instanceof DkimMessageIdFixingMimeMessage) &&
95-
!(message instanceof ImmutableDelegatingSMTPMessage) &&
96-
!(message instanceof SmimeMessageIdFixingMimeMessage) &&
97-
!(message instanceof SmimeMessageIdFixingSMTPMessage)) {
98-
throw new AssertionError("Wrong MimeMessage type; will be unable to fix Message-ID on message.saveChanges()");
91+
if (!messageIsProperlyWrappedForCustomMessageId(message)) {
92+
throw new AssertionError("Wrong MimeMessage type; would be unable to fix Message-ID on message.saveChanges()");
9993
}
10094

10195
message.saveChanges(); // some headers and id's will be set for this specific message
@@ -107,6 +101,12 @@ private MimeMessage convertAndLogMimeMessage(final Email email) throws Messaging
107101
return message;
108102
}
109103

104+
private static boolean messageIsProperlyWrappedForCustomMessageId(MimeMessage message) {
105+
return message instanceof MessageIdFixingMimeMessage || message instanceof ImmutableDelegatingSMTPMessage ||
106+
(ModuleLoader.dkimModuleAvailable() && ModuleLoader.loadDKIMModule().isMessageIdFixingMessage(message)) ||
107+
(ModuleLoader.smimeModuleAvailable() && ModuleLoader.loadSmimeModule().isMessageIdFixingMessage(message));
108+
}
109+
110110
static private MimeMessage convertMimeMessage(final Email email, final Session session) throws MessagingException {
111111
try {
112112
return MimeMessageProducerHelper.produceMimeMessage(email, session);

modules/smime-module/src/main/java/org/simplejavamail/internal/smimesupport/SMIMESupport.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
import org.simplejavamail.internal.smimesupport.model.SmimeDetailsImpl;
4646
import org.simplejavamail.utils.mail.smime.SmimeKey;
4747
import org.simplejavamail.utils.mail.smime.SmimeKeyStore;
48+
import org.simplejavamail.utils.mail.smime.SmimeMessageIdFixingMimeMessage;
49+
import org.simplejavamail.utils.mail.smime.SmimeMessageIdFixingSMTPMessage;
4850
import org.simplejavamail.utils.mail.smime.SmimeState;
4951
import org.simplejavamail.utils.mail.smime.SmimeUtil;
5052
import org.slf4j.Logger;
@@ -447,6 +449,11 @@ public MimeMessage encryptMessageWithSmime(@Nullable final Session session, @Not
447449
return SmimeUtil.encrypt(session, email.getId(), messageToProtect, x509Certificate);
448450
}
449451

452+
@Override
453+
public boolean isMessageIdFixingMessage(MimeMessage message) {
454+
return message instanceof SmimeMessageIdFixingMimeMessage || message instanceof SmimeMessageIdFixingSMTPMessage;
455+
}
456+
450457
private SmimeKey retrieveSmimeKeyFromPkcs12Keystore(@NotNull Pkcs12Config pkcs12) {
451458
if (!SIMPLE_SMIMESTORE_CACHE.containsKey(pkcs12)) {
452459
SIMPLE_SMIMESTORE_CACHE.put(pkcs12, produceSmimeKey(pkcs12));

0 commit comments

Comments
 (0)