Skip to content

Commit 1754118

Browse files
committed
#222 Added property support for trusting SSL hosts and verifying server identity
1 parent 96709d3 commit 1754118

File tree

6 files changed

+81
-5
lines changed

6 files changed

+81
-5
lines changed

angular-app

modules/core-module/src/main/java/org/simplejavamail/api/mailer/MailerGenericBuilder.java

+32
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,18 @@
2626
*/
2727
@Cli.BuilderApiNode(builderApiType = CliBuilderApiType.MAILER)
2828
public interface MailerGenericBuilder<T extends MailerGenericBuilder<?>> {
29+
/**
30+
* {@value}
31+
*
32+
* @see #trustingAllHosts(boolean)
33+
*/
34+
boolean DEFAULT_TRUST_ALL_HOSTS = true;
35+
/**
36+
* {@value}
37+
*
38+
* @see #verifyingServerIdentity(boolean)
39+
*/
40+
boolean DEFAULT_VERIFY_SERVER_IDENTITY = true;
2941
/**
3042
* The default maximum timeout value for the transport socket is <code>{@value}</code> milliseconds (affects socket connect-,
3143
* read- and write timeouts). Can be overridden from a config file or through System variable.
@@ -452,6 +464,24 @@ public interface MailerGenericBuilder<T extends MailerGenericBuilder<?>> {
452464
*/
453465
T resetThreadPoolKeepAliveTime();
454466

467+
/**
468+
* Reset trusting any host; trust all hosts is set to {@value #DEFAULT_TRUST_ALL_HOSTS}.
469+
*
470+
* @see #trustingAllHosts(boolean)
471+
* @see #trustingSSLHosts(String...)
472+
* @see #verifyingServerIdentity(boolean)
473+
*/
474+
T resetTrustingAllHosts();
475+
476+
/**
477+
* Reset verifying the server's identity to {@value #DEFAULT_VERIFY_SERVER_IDENTITY}.
478+
*
479+
* @see #verifyingServerIdentity(boolean)
480+
* @see #trustingSSLHosts(String...)
481+
* @see #trustingAllHosts(boolean)
482+
*/
483+
T resetVerifyingServerIdentity();
484+
455485
/**
456486
* Reset the cluster key to empty, so it will be generated uniquely, avoiding clustering with any other {@link Mailer}.
457487
*
@@ -528,6 +558,8 @@ public interface MailerGenericBuilder<T extends MailerGenericBuilder<?>> {
528558
* Removes all trusted hosts from the list.
529559
*
530560
* @see #trustingSSLHosts(String...)
561+
* @see #trustingAllHosts(boolean)
562+
* @see #verifyingServerIdentity(boolean)
531563
*/
532564
T clearTrustedSSLHosts();
533565

modules/core-module/src/main/java/org/simplejavamail/config/ConfigLoader.java

+6
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@
6060
* <li>simplejavamail.defaults.connectionpool.expireafter.millis</li>
6161
* <li>simplejavamail.defaults.connectionpool.loadbalancing.strategy</li>
6262
* <li>simplejavamail.defaults.sessiontimeoutmillis</li>
63+
* <li>simplejavamail.defaults.trustallhosts</li>
64+
* <li>simplejavamail.defaults.trustedhosts</li>
65+
* <li>simplejavamail.defaults.verifyserveridentity</li>
6366
* <li>simplejavamail.transport.mode.logging.only</li>
6467
* <li>simplejavamail.opportunistic.tls</li>
6568
* <li>simplejavamail.smime.signing.keystore</li>
@@ -132,6 +135,9 @@ public enum Property {
132135
DEFAULT_CONNECTIONPOOL_LOADBALANCING_STRATEGY("simplejavamail.defaults.connectionpool.loadbalancing.strategy"),
133136
DEFAULT_POOL_KEEP_ALIVE_TIME("simplejavamail.defaults.poolsize.keepalivetime"),
134137
DEFAULT_SESSION_TIMEOUT_MILLIS("simplejavamail.defaults.sessiontimeoutmillis"),
138+
DEFAULT_TRUST_ALL_HOSTS("simplejavamail.defaults.trustallhosts"),
139+
DEFAULT_TRUSTED_HOSTS("simplejavamail.defaults.trustedhosts"),
140+
DEFAULT_VERIFY_SERVER_IDENTITY("simplejavamail.defaults.verifyserveridentity"),
135141
TRANSPORT_MODE_LOGGING_ONLY("simplejavamail.transport.mode.logging.only"),
136142
OPPORTUNISTIC_TLS("simplejavamail.opportunistic.tls"),
137143
SMIME_SIGNING_KEYSTORE("simplejavamail.smime.signing.keystore"),

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

+26-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.simplejavamail.api.mailer.config.ProxyConfig;
88
import org.simplejavamail.config.ConfigLoader.Property;
99
import org.simplejavamail.internal.modules.ModuleLoader;
10+
import org.simplejavamail.internal.util.SimpleOptional;
1011

1112
import javax.annotation.Nonnull;
1213
import javax.annotation.Nullable;
@@ -29,6 +30,7 @@
2930
import static org.simplejavamail.config.ConfigLoader.valueOrProperty;
3031
import static org.simplejavamail.config.ConfigLoader.valueOrPropertyAsBoolean;
3132
import static org.simplejavamail.config.ConfigLoader.valueOrPropertyAsInteger;
33+
import static org.simplejavamail.config.ConfigLoader.valueOrPropertyAsString;
3234
import static org.simplejavamail.internal.util.MiscUtil.checkArgumentNotEmpty;
3335
import static org.simplejavamail.internal.util.MiscUtil.valueNullOrEmpty;
3436
import static org.simplejavamail.internal.util.Preconditions.assumeNonNull;
@@ -191,6 +193,8 @@ abstract class MailerGenericBuilderImpl<T extends MailerGenericBuilderImpl<?>> i
191193
this.proxyBridgePort = assumeNonNull(valueOrPropertyAsInteger(null, Property.PROXY_SOCKS5BRIDGE_PORT, DEFAULT_PROXY_BRIDGE_PORT));
192194
this.debugLogging = assumeNonNull(valueOrPropertyAsBoolean(null, Property.JAVAXMAIL_DEBUG, DEFAULT_JAVAXMAIL_DEBUG));
193195
this.sessionTimeout = assumeNonNull(valueOrPropertyAsInteger(null, Property.DEFAULT_SESSION_TIMEOUT_MILLIS, DEFAULT_SESSION_TIMEOUT_MILLIS));
196+
this.trustAllSSLHost = assumeNonNull(valueOrPropertyAsBoolean(null, Property.DEFAULT_TRUST_ALL_HOSTS, DEFAULT_TRUST_ALL_HOSTS));
197+
this.verifyingServerIdentity = assumeNonNull(valueOrPropertyAsBoolean(null, Property.DEFAULT_VERIFY_SERVER_IDENTITY, DEFAULT_VERIFY_SERVER_IDENTITY));
194198
this.threadPoolSize = assumeNonNull(valueOrPropertyAsInteger(null, Property.DEFAULT_POOL_SIZE, DEFAULT_POOL_SIZE));
195199
this.threadPoolKeepAliveTime = assumeNonNull(valueOrPropertyAsInteger(null, Property.DEFAULT_POOL_KEEP_ALIVE_TIME, DEFAULT_POOL_KEEP_ALIVE_TIME));
196200
this.connectionPoolCoreSize = assumeNonNull(valueOrPropertyAsInteger(null, Property.DEFAULT_CONNECTIONPOOL_CORE_SIZE, DEFAULT_CONNECTIONPOOL_CORE_SIZE));
@@ -200,9 +204,12 @@ abstract class MailerGenericBuilderImpl<T extends MailerGenericBuilderImpl<?>> i
200204
this.connectionPoolLoadBalancingStrategy = assumeNonNull(valueOrProperty(null, Property.DEFAULT_CONNECTIONPOOL_LOADBALANCING_STRATEGY, LoadBalancingStrategy.valueOf(DEFAULT_CONNECTIONPOOL_LOADBALANCING_STRATEGY)));
201205
this.transportModeLoggingOnly = assumeNonNull(valueOrPropertyAsBoolean(null, Property.TRANSPORT_MODE_LOGGING_ONLY, DEFAULT_TRANSPORT_MODE_LOGGING_ONLY));
202206

207+
final String trustedHosts = valueOrPropertyAsString(null, Property.DEFAULT_TRUSTED_HOSTS, null);
208+
if (trustedHosts != null) {
209+
this.sslHostsToTrust = Arrays.asList(trustedHosts.split(";"));
210+
}
211+
203212
this.emailAddressCriteria = EmailAddressCriteria.RFC_COMPLIANT.clone();
204-
this.trustAllSSLHost = true;
205-
this.verifyingServerIdentity = true;
206213

207214
this.executorService = determineDefaultExecutorService();
208215
}
@@ -507,14 +514,30 @@ public T withProperty(@Nonnull final String propertyName, @Nullable final Object
507514
}
508515
return (T) this;
509516
}
510-
517+
511518
/**
512519
* @see MailerGenericBuilder#resetSessionTimeout()
513520
*/
514521
@Override
515522
public T resetSessionTimeout() {
516523
return withSessionTimeout(DEFAULT_SESSION_TIMEOUT_MILLIS);
517524
}
525+
526+
/**
527+
* @see MailerGenericBuilder#resetTrustingAllHosts()
528+
*/
529+
@Override
530+
public T resetTrustingAllHosts() {
531+
return trustingAllHosts(DEFAULT_TRUST_ALL_HOSTS);
532+
}
533+
534+
/**
535+
* @see MailerGenericBuilder#resetVerifyingServerIdentity()
536+
*/
537+
@Override
538+
public T resetVerifyingServerIdentity() {
539+
return verifyingServerIdentity(DEFAULT_VERIFY_SERVER_IDENTITY);
540+
}
518541

519542
/**
520543
* @see MailerGenericBuilder#resetEmailAddressCriteria()

modules/simple-java-mail/src/test/java/org/simplejavamail/mailer/MailerTest.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ public void restoreOriginalStaticProperties() {
4747
+ "simplejavamail.proxy.port=1080\n"
4848
+ "simplejavamail.proxy.username=username proxy\n"
4949
+ "simplejavamail.proxy.password=password proxy\n"
50-
+ "simplejavamail.proxy.socks5bridge.port=1081";
50+
+ "simplejavamail.proxy.socks5bridge.port=1081\n"
51+
+ "simplejavamail.defaults.trustedhosts=192.168.1.122;mymailserver.com;ix55432y";
5152

5253
ConfigLoader.loadProperties(new ByteArrayInputStream(s.getBytes()), false);
5354
}
@@ -58,6 +59,8 @@ public void createMailSession_MinimalConstructor_WithoutConfig() {
5859

5960
final UUID clusterKey = UUID.randomUUID();
6061
Mailer mailer = MailerBuilder.withSMTPServer("host", 25, null, null).withClusterKey(clusterKey).buildMailer();
62+
assertThat(mailer.getOperationalConfig().getSslHostsToTrust()).isEmpty();
63+
6164
Session session = mailer.getSession();
6265

6366
assertThat(session.getDebug()).isFalse();
@@ -138,6 +141,9 @@ public void createMailSession_MaximumConstructor_WithoutConfig() {
138141
public void createMailSession_MinimalConstructor_WithConfig() {
139142
Mailer mailer = MailerBuilder.buildMailer();
140143
Session session = mailer.getSession();
144+
145+
assertThat(mailer.getOperationalConfig().getSslHostsToTrust()).containsExactlyInAnyOrder(
146+
"192.168.1.122", "mymailserver.com", "ix55432y");
141147

142148
assertThat(session.getDebug()).isTrue();
143149
assertThat(session.getProperty("mail.smtp.host")).isEqualTo("smtp.default.com");

modules/spring-module/src/main/java/org/simplejavamail/springsupport/SimpleJavaMailSpringSupport.java

+9
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@
5454
* <li>simplejavamail.defaults.connectionpool.expireafter.millis</li>
5555
* <li>simplejavamail.defaults.connectionpool.loadbalancing.strategy</li>
5656
* <li>simplejavamail.defaults.sessiontimeoutmillis</li>
57+
* <li>simplejavamail.defaults.trustallhosts</li>
58+
* <li>simplejavamail.defaults.trustedhosts</li>
59+
* <li>simplejavamail.defaults.verifyserveridentity</li>
5760
* <li>simplejavamail.transport.mode.logging.only</li>
5861
* <li>simplejavamail.opportunistic.tls</li>
5962
* <li>simplejavamail.smime.signing.keystore</li>
@@ -109,6 +112,9 @@ public MailerGenericBuilder<?> loadGlobalConfigAndCreateDefaultMailer(
109112
@Value("${simplejavamail.defaults.connectionpool.expireafter.millis:#{null}}") final String defaultConnectionPoolExpireAfterMillis,
110113
@Value("${simplejavamail.defaults.connectionpool.loadbalancing.strategy:#{null}}") final String defaultConnectionPoolLoadBalancingStrategy,
111114
@Value("${simplejavamail.defaults.sessiontimeoutmillis:#{null}}") final String defaultSessionTimeoutMillis,
115+
@Value("${simplejavamail.defaults.trustallhosts:#{null}}") final String defaultTrustAllHosts,
116+
@Value("${simplejavamail.defaults.trustedhosts:#{null}}") final String defaultTrustedHosts,
117+
@Value("${simplejavamail.defaults.verifyserveridentity:#{null}}") final String defaultVerifyServerIdentity,
112118
@Value("${simplejavamail.transport.mode.logging.only:#{null}}") final String defaultTransportModeLoggingOnly,
113119
@Value("${simplejavamail.opportunistic.tls:#{null}}") final String defaultOpportunisticTls,
114120
@Value("${simplejavamail.smime.signing.keystore:#{null}}") final String smimeSigningKeyStore,
@@ -150,6 +156,9 @@ public MailerGenericBuilder<?> loadGlobalConfigAndCreateDefaultMailer(
150156
setNullableProperty(emailProperties, Property.DEFAULT_CONNECTIONPOOL_EXPIREAFTER_MILLIS.key(), defaultConnectionPoolExpireAfterMillis);
151157
setNullableProperty(emailProperties, Property.DEFAULT_CONNECTIONPOOL_LOADBALANCING_STRATEGY.key(), defaultConnectionPoolLoadBalancingStrategy);
152158
setNullableProperty(emailProperties, Property.DEFAULT_SESSION_TIMEOUT_MILLIS.key(), defaultSessionTimeoutMillis);
159+
setNullableProperty(emailProperties, Property.DEFAULT_TRUST_ALL_HOSTS.key(), defaultTrustAllHosts);
160+
setNullableProperty(emailProperties, Property.DEFAULT_TRUSTED_HOSTS.key(), defaultTrustedHosts);
161+
setNullableProperty(emailProperties, Property.DEFAULT_VERIFY_SERVER_IDENTITY.key(), defaultVerifyServerIdentity);
153162
setNullableProperty(emailProperties, Property.TRANSPORT_MODE_LOGGING_ONLY.key(), defaultTransportModeLoggingOnly);
154163
setNullableProperty(emailProperties, Property.OPPORTUNISTIC_TLS.key(), defaultOpportunisticTls);
155164
setNullableProperty(emailProperties, Property.SMIME_SIGNING_KEYSTORE.key(), smimeSigningKeyStore);

0 commit comments

Comments
 (0)