This is an automated email from the ASF dual-hosted git repository. btellier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 860f7266a377da4c4944cc8a1cf786e3467432e2 Author: Tran Tien Duc <[email protected]> AuthorDate: Fri Jun 7 10:41:09 2019 +0700 JAMES-2146 Allow JamesServerBuilder to override guice modules --- .../org/apache/james/CassandraNodeConfTest.java | 52 +++++++++------------- .../CassandraRabbitMQLdapJmapJamesServerTest.java | 29 ++++++------ .../java/org/apache/james/JamesServerBuilder.java | 10 ++++- .../james/GuiceJamesServerStartUpCheckTest.java | 51 ++++++++------------- .../org/apache/james/GuiceJamesServerTest.java | 29 ++++++------ .../apache/james/GuiceLifecycleHeathCheckTest.java | 28 ++++++------ .../apache/james/MemoryJmapJamesServerTest.java | 50 +++++++++------------ .../james/jmap/JMAPConfigurationStartUpCheck.java | 15 ++++++- .../james/jmap/crypto/SecurityKeyLoader.java | 3 ++ .../james/jmap/crypto/SecurityKeyLoaderTest.java | 22 ++++++++- 10 files changed, 145 insertions(+), 144 deletions(-) diff --git a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java index 2444764..53aedfb 100644 --- a/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java +++ b/server/container/guice/cassandra-guice/src/test/java/org/apache/james/CassandraNodeConfTest.java @@ -44,6 +44,16 @@ class CassandraNodeConfTest { private static final int CASSANDRA_PORT = 9042; private static final int LIMIT_TO_10_MESSAGES = 10; + private static JamesServerBuilder extensionBuilder() { + return new JamesServerBuilder() + .extension(new DockerElasticSearchExtension()) + .extension(new CassandraExtension()) + .server(configuration -> GuiceJamesServer.forConfiguration(configuration) + .combineWith(ALL_BUT_JMX_CASSANDRA_MODULE) + .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES))) + .disableAutoStart(); + } + private static String getDockerHostIp() { DockerClientFactory clientFactory = DockerClientFactory.instance(); clientFactory.client(); @@ -65,15 +75,7 @@ class CassandraNodeConfTest { @Nested class NormalBehaviour { @RegisterExtension - JamesServerExtension testExtension = new JamesServerBuilder() - .extension(new DockerElasticSearchExtension()) - .extension(new CassandraExtension()) - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(ALL_BUT_JMX_CASSANDRA_MODULE) - .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class)) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES))) - .disableAutoStart() - .build(); + JamesServerExtension testExtension = extensionBuilder().build(); @Test void serverShouldStartServiceWhenNodeIsReachable(GuiceJamesServer server) throws Exception { @@ -88,18 +90,11 @@ class CassandraNodeConfTest { private final DockerCassandraRule cassandra = new DockerCassandraRule(); @RegisterExtension - JamesServerExtension testExtension = new JamesServerBuilder() - .extension(new DockerElasticSearchExtension()) - .extension(new CassandraExtension(cassandra)) - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(ALL_BUT_JMX_CASSANDRA_MODULE) - .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class)) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(binder -> binder.bind(ClusterConfiguration.class) - .toInstance(clusterWithHosts( - Host.from(unreachableNode, 9042), - cassandra.getHost())))) - .disableAutoStart() + JamesServerExtension testExtension = extensionBuilder() + .overrideServerModule(binder -> binder.bind(ClusterConfiguration.class) + .toInstance(clusterWithHosts( + Host.from(unreachableNode, 9042), + cassandra.getHost()))) .build(); @Test @@ -113,17 +108,10 @@ class CassandraNodeConfTest { private final DockerCassandraRule cassandra = new DockerCassandraRule(); @RegisterExtension - JamesServerExtension testExtension = new JamesServerBuilder() - .extension(new DockerElasticSearchExtension()) - .extension(new CassandraExtension(cassandra)) - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(ALL_BUT_JMX_CASSANDRA_MODULE) - .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class)) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(binder -> binder.bind(ClusterConfiguration.class) - .toInstance(clusterWithHosts( - Host.from(getDockerHostIp(), cassandra.getMappedPort(CASSANDRA_PORT)))))) - .disableAutoStart() + JamesServerExtension testExtension = extensionBuilder() + .overrideServerModule(binder -> binder.bind(ClusterConfiguration.class) + .toInstance(clusterWithHosts( + Host.from(getDockerHostIp(), cassandra.getMappedPort(CASSANDRA_PORT))))) .build(); @Test diff --git a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java index 1867638..0e4edaa 100644 --- a/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java +++ b/server/container/guice/cassandra-rabbitmq-ldap-guice/src/test/java/org/apache/james/CassandraRabbitMQLdapJmapJamesServerTest.java @@ -33,7 +33,6 @@ import org.apache.james.modules.SwiftBlobStoreExtension; import org.apache.james.modules.TestJMAPServerModule; import org.apache.james.modules.blobstore.BlobStoreChoosingConfiguration; import org.apache.james.modules.protocols.ImapGuiceProbe; -import org.apache.james.server.core.configuration.Configuration; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; @@ -61,7 +60,8 @@ class CassandraRabbitMQLdapJmapJamesServerTest { @RegisterExtension JamesServerExtension testExtension = baseJamesServerExtensionBuilder() .extension(new SwiftBlobStoreExtension()) - .server(configuration -> buildGuiceServer(configuration, BlobStoreChoosingConfiguration.objectStorage())) + .overrideServerModule(binder -> binder.bind(BlobStoreChoosingConfiguration.class) + .toInstance(BlobStoreChoosingConfiguration.objectStorage())) .build(); } @@ -70,9 +70,10 @@ class CassandraRabbitMQLdapJmapJamesServerTest { class WithAwsS3 implements ContractSuite { @RegisterExtension JamesServerExtension testExtension = baseJamesServerExtensionBuilder() - .extension(new AwsS3BlobStoreExtension()) - .server(configuration -> buildGuiceServer(configuration, BlobStoreChoosingConfiguration.objectStorage())) - .build(); + .extension(new AwsS3BlobStoreExtension()) + .overrideServerModule(binder -> binder.bind(BlobStoreChoosingConfiguration.class) + .toInstance(BlobStoreChoosingConfiguration.objectStorage())) + .build(); } @Nested @@ -80,7 +81,8 @@ class CassandraRabbitMQLdapJmapJamesServerTest { class WithoutSwiftOrAwsS3 implements ContractSuite { @RegisterExtension JamesServerExtension testExtension = baseJamesServerExtensionBuilder() - .server(configuration -> buildGuiceServer(configuration, BlobStoreChoosingConfiguration.cassandra())) + .overrideServerModule(binder -> binder.bind(BlobStoreChoosingConfiguration.class) + .toInstance(BlobStoreChoosingConfiguration.cassandra())) .build(); } @@ -89,15 +91,10 @@ class CassandraRabbitMQLdapJmapJamesServerTest { .extension(new DockerElasticSearchExtension()) .extension(new CassandraExtension()) .extension(new RabbitMQExtension()) - .extension(new LdapTestExtension()); - } - - GuiceJamesServer buildGuiceServer(Configuration configuration, BlobStoreChoosingConfiguration choosingConfiguration) { - return GuiceJamesServer.forConfiguration(configuration) - .combineWith(CassandraRabbitMQLdapJamesServerMain.MODULES) - .overrideWith(binder -> binder.bind(BlobStoreChoosingConfiguration.class) - .toInstance(choosingConfiguration)) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE); + .extension(new LdapTestExtension()) + .server(configuration -> GuiceJamesServer.forConfiguration(configuration) + .combineWith(CassandraRabbitMQLdapJamesServerMain.MODULES) + .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) + .overrideWith(JmapJamesServerContract.DOMAIN_LIST_CONFIGURATION_MODULE)); } } diff --git a/server/container/guice/guice-common/src/test/java/org/apache/james/JamesServerBuilder.java b/server/container/guice/guice-common/src/test/java/org/apache/james/JamesServerBuilder.java index 8f38e5b..dfed2b0 100644 --- a/server/container/guice/guice-common/src/test/java/org/apache/james/JamesServerBuilder.java +++ b/server/container/guice/guice-common/src/test/java/org/apache/james/JamesServerBuilder.java @@ -45,6 +45,7 @@ public class JamesServerBuilder { private final ImmutableList.Builder<GuiceModuleTestExtension> extensions; private final TemporaryFolderRegistrableExtension folderRegistrableExtension; + private final ImmutableList.Builder<Module> overrideModules; private ServerProvider server; private Optional<ConfigurationProvider> configuration; private Optional<Boolean> autoStart; @@ -54,6 +55,7 @@ public class JamesServerBuilder { extensions = ImmutableList.builder(); folderRegistrableExtension = new TemporaryFolderRegistrableExtension(); autoStart = Optional.empty(); + overrideModules = ImmutableList.builder(); } public JamesServerBuilder extensions(GuiceModuleTestExtension... extensions) { @@ -75,6 +77,11 @@ public class JamesServerBuilder { return this; } + public JamesServerBuilder overrideServerModule(Module module) { + this.overrideModules.add(module); + return this; + } + public JamesServerBuilder disableAutoStart() { this.autoStart = Optional.of(false); return this; @@ -115,7 +122,8 @@ public class JamesServerBuilder { return server .buildServer(configurationProvider.buildConfiguration(file)) .overrideWith(modules) - .overrideWith((binder -> binder.bind(CleanupTasksPerformer.class).asEagerSingleton())); + .overrideWith((binder -> binder.bind(CleanupTasksPerformer.class).asEagerSingleton())) + .overrideWith(overrideModules.build()); } } diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java index 1301a25..ad40b24 100644 --- a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java +++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerStartUpCheckTest.java @@ -115,19 +115,21 @@ class GuiceJamesServerStartUpCheckTest { } } + private static JamesServerBuilder extensionBuilder() { + return new JamesServerBuilder() + .server(configuration -> GuiceJamesServer.forConfiguration(configuration) + .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) + .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES))) + .disableAutoStart(); + } + @Nested class WithStartUpCheckDoesntRequireGuiceComponents implements StartUpCheckSuccessContract { @RegisterExtension - JamesServerExtension jamesServerExtension = new JamesServerBuilder() - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class)) - .overrideWith(binder -> Multibinder - .newSetBinder(binder, StartUpCheck.class) - .addBinding().to(NoopStartUpCheck.class))) - .disableAutoStart() + JamesServerExtension jamesServerExtension = extensionBuilder() + .overrideServerModule(binder -> Multibinder.newSetBinder(binder, StartUpCheck.class) + .addBinding().to(NoopStartUpCheck.class)) .build(); } @@ -135,15 +137,9 @@ class GuiceJamesServerStartUpCheckTest { class WithStartUpCheckRequireGuiceComponents implements StartUpCheckSuccessContract { @RegisterExtension - JamesServerExtension jamesServerExtension = new JamesServerBuilder() - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class)) - .overrideWith(binder -> Multibinder - .newSetBinder(binder, StartUpCheck.class) - .addBinding().to(TestBlobExportMechanismStartUpCheck.class))) - .disableAutoStart() + JamesServerExtension jamesServerExtension = extensionBuilder() + .overrideServerModule(binder -> Multibinder.newSetBinder(binder, StartUpCheck.class) + .addBinding().to(TestBlobExportMechanismStartUpCheck.class)) .build(); } @@ -151,32 +147,21 @@ class GuiceJamesServerStartUpCheckTest { class WithNoStartUpCheck implements StartUpCheckSuccessContract { @RegisterExtension - JamesServerExtension jamesServerExtension = new JamesServerBuilder() - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))) - .disableAutoStart() - .build(); + JamesServerExtension jamesServerExtension = extensionBuilder().build(); } @Nested class StartUpCheckFails { @RegisterExtension - JamesServerExtension jamesServerExtension = new JamesServerBuilder() - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class)) - .overrideWith(binder -> { + JamesServerExtension jamesServerExtension = extensionBuilder() + .overrideServerModule(binder -> { Multibinder<StartUpCheck> setBinder = Multibinder .newSetBinder(binder, StartUpCheck.class); setBinder.addBinding().to(NoopStartUpCheck.class); setBinder.addBinding().to(FailingStartUpCheck.class); - })) - .disableAutoStart() + }) .build(); @Test diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java index 7c9831a..6e49658 100644 --- a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java +++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceJamesServerTest.java @@ -24,16 +24,18 @@ class GuiceJamesServerTest { private static final int LIMIT_TO_10_MESSAGES = 10; + private static JamesServerBuilder extensionBuilder() { + return new JamesServerBuilder() + .server(configuration -> GuiceJamesServer.forConfiguration(configuration) + .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) + .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES))) + .disableAutoStart(); + } + @Nested class NormalBehaviour { @RegisterExtension - JamesServerExtension jamesServerExtension = new JamesServerBuilder() - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class))) - .disableAutoStart() - .build(); + JamesServerExtension jamesServerExtension = extensionBuilder().build(); @Test void serverShouldBeStartedAfterCallingStart(GuiceJamesServer server) throws Exception { @@ -72,15 +74,10 @@ class GuiceJamesServerTest { }; @RegisterExtension - JamesServerExtension jamesServerExtension = new JamesServerBuilder() - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class)) - .overrideWith(binder -> Multibinder.newSetBinder(binder, ConfigurationPerformer.class) - .addBinding() - .toInstance(throwingConfigurationPerformer))) - .disableAutoStart() + JamesServerExtension jamesServerExtension = extensionBuilder() + .overrideServerModule(binder -> Multibinder.newSetBinder(binder, ConfigurationPerformer.class) + .addBinding() + .toInstance(throwingConfigurationPerformer)) .build(); @Test diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceLifecycleHeathCheckTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceLifecycleHeathCheckTest.java index aeff8dd..7e3878c 100644 --- a/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceLifecycleHeathCheckTest.java +++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/GuiceLifecycleHeathCheckTest.java @@ -50,6 +50,15 @@ import reactor.core.scheduler.Schedulers; class GuiceLifecycleHeathCheckTest { private static final int LIMIT_TO_10_MESSAGES = 10; + private static JamesServerBuilder extensionBuilder() { + return new JamesServerBuilder() + .server(configuration -> GuiceJamesServer.forConfiguration(configuration) + .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) + .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) + .overrideWith(binder -> binder.bind(WebAdminConfiguration.class) + .toInstance(WebAdminConfiguration.TEST_CONFIGURATION))); + } + private static void configureRequestSpecification(GuiceJamesServer server) { WebAdminGuiceProbe webAdminGuiceProbe = server.getProbe(WebAdminGuiceProbe.class); @@ -64,13 +73,7 @@ class GuiceLifecycleHeathCheckTest { @Nested class Healthy { @RegisterExtension - JamesServerExtension jamesServerExtension = new JamesServerBuilder() - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class)) - .overrideWith(binder -> binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION))) - .build(); + JamesServerExtension jamesServerExtension = extensionBuilder().build(); @Test void startedJamesServerShouldBeHealthy(GuiceJamesServer server) { @@ -108,14 +111,9 @@ class GuiceLifecycleHeathCheckTest { CountDownLatch latch = new CountDownLatch(1); @RegisterExtension - JamesServerExtension jamesServerExtension = new JamesServerBuilder() - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(binder -> binder.bind(TextExtractor.class).to(PDFTextExtractor.class)) - .overrideWith(binder -> binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION)) - .overrideWith(binder -> binder.bind(CountDownLatch.class).toInstance(latch)) - .overrideWith(binder -> binder.bind(DestroyedBeforeWebAdmin.class).asEagerSingleton())) + JamesServerExtension jamesServerExtension = extensionBuilder() + .overrideServerModule(binder -> binder.bind(CountDownLatch.class).toInstance(latch)) + .overrideServerModule(binder -> binder.bind(DestroyedBeforeWebAdmin.class).asEagerSingleton()) .build(); @Test diff --git a/server/container/guice/memory-guice/src/test/java/org/apache/james/MemoryJmapJamesServerTest.java b/server/container/guice/memory-guice/src/test/java/org/apache/james/MemoryJmapJamesServerTest.java index 2b0469a..26eae94 100644 --- a/server/container/guice/memory-guice/src/test/java/org/apache/james/MemoryJmapJamesServerTest.java +++ b/server/container/guice/memory-guice/src/test/java/org/apache/james/MemoryJmapJamesServerTest.java @@ -34,16 +34,18 @@ class MemoryJmapJamesServerTest { private static final int LIMIT_TO_10_MESSAGES = 10; - @Nested - class JmapJamesServerTest implements JmapJamesServerContract { - - @RegisterExtension - JamesServerExtension jamesServerExtension = new JamesServerBuilder() + private static JamesServerBuilder extensionBuilder() { + return new JamesServerBuilder() .server(configuration -> GuiceJamesServer.forConfiguration(configuration) .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(DOMAIN_LIST_CONFIGURATION_MODULE)) - .build(); + .overrideWith(DOMAIN_LIST_CONFIGURATION_MODULE)); + } + + @Nested + class JmapJamesServerTest implements JmapJamesServerContract { + @RegisterExtension + JamesServerExtension jamesServerExtension = extensionBuilder().build(); } @Nested @@ -53,18 +55,14 @@ class MemoryJmapJamesServerTest { class BadAliasKeyStore { @RegisterExtension - JamesServerExtension jamesServerExtension = new JamesServerBuilder() - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(DOMAIN_LIST_CONFIGURATION_MODULE) - .overrideWith(binder -> binder.bind(JMAPConfiguration.class) - .toInstance(TestJMAPServerModule - .jmapConfigurationBuilder() - .keystore("badAliasKeystore") - .secret("password") - .build()))) + JamesServerExtension jamesServerExtension = extensionBuilder() .disableAutoStart() + .overrideServerModule(binder -> binder.bind(JMAPConfiguration.class) + .toInstance(TestJMAPServerModule + .jmapConfigurationBuilder() + .keystore("badAliasKeystore") + .secret("password") + .build())) .build(); @Test @@ -82,17 +80,13 @@ class MemoryJmapJamesServerTest { class BadSecretKeyStore { @RegisterExtension - JamesServerExtension jamesServerExtension = new JamesServerBuilder() - .server(configuration -> GuiceJamesServer.forConfiguration(configuration) - .combineWith(MemoryJamesServerMain.IN_MEMORY_SERVER_AGGREGATE_MODULE) - .overrideWith(new TestJMAPServerModule(LIMIT_TO_10_MESSAGES)) - .overrideWith(DOMAIN_LIST_CONFIGURATION_MODULE) - .overrideWith(binder -> binder.bind(JMAPConfiguration.class) - .toInstance(TestJMAPServerModule - .jmapConfigurationBuilder() - .secret("WrongSecret") - .build()))) + JamesServerExtension jamesServerExtension = extensionBuilder() .disableAutoStart() + .overrideServerModule(binder -> binder.bind(JMAPConfiguration.class) + .toInstance(TestJMAPServerModule + .jmapConfigurationBuilder() + .secret("WrongSecret") + .build())) .build(); @Test diff --git a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPConfigurationStartUpCheck.java b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPConfigurationStartUpCheck.java index 158d4fc..765b723 100644 --- a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPConfigurationStartUpCheck.java +++ b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPConfigurationStartUpCheck.java @@ -32,14 +32,27 @@ public class JMAPConfigurationStartUpCheck implements StartUpCheck { public static final String CHECK_NAME = "JMAPConfigurationStartUpCheck"; private final SecurityKeyLoader securityKeyLoader; + private final JMAPConfiguration jmapConfiguration; @Inject - JMAPConfigurationStartUpCheck(SecurityKeyLoader securityKeyLoader) { + JMAPConfigurationStartUpCheck(SecurityKeyLoader securityKeyLoader, JMAPConfiguration jmapConfiguration) { this.securityKeyLoader = securityKeyLoader; + this.jmapConfiguration = jmapConfiguration; } @Override public CheckResult check() { + if (jmapConfiguration.isEnabled()) { + return checkSecurityKey(); + } + + return CheckResult.builder() + .checkName(checkName()) + .resultType(ResultType.GOOD) + .build(); + } + + private CheckResult checkSecurityKey() { try { securityKeyLoader.load(); return CheckResult.builder() diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/SecurityKeyLoader.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/SecurityKeyLoader.java index 0bb359c..4ec4ab6 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/SecurityKeyLoader.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/crypto/SecurityKeyLoader.java @@ -34,6 +34,7 @@ import org.apache.james.filesystem.api.FileSystem; import org.apache.james.jmap.JMAPConfiguration; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; public class SecurityKeyLoader { @@ -51,6 +52,8 @@ public class SecurityKeyLoader { } public AsymmetricKeys load() throws Exception { + Preconditions.checkState(jmapConfiguration.isEnabled(), "JMAP is not enabled"); + KeyStore keystore = KeyStore.getInstance(JKS); InputStream fis = fileSystem.getResource(jmapConfiguration.getKeystore()); char[] secret = jmapConfiguration.getSecret().toCharArray(); diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/SecurityKeyLoaderTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/SecurityKeyLoaderTest.java index 8c5675a..8eccdaa 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/SecurityKeyLoaderTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/crypto/SecurityKeyLoaderTest.java @@ -36,6 +36,24 @@ import org.junit.jupiter.params.provider.ValueSource; class SecurityKeyLoaderTest { @Test + void loadShouldThrowWhenJMAPIsNotEnabled() throws Exception { + JMAPConfiguration jmapConfiguration = JMAPConfiguration.builder() + .disable() + .jwtPublicKeyPem(Optional.of(JWT_PUBLIC_KEY)) + .keystore("keystore") + .secret("james72laBalle") + .build(); + + SecurityKeyLoader loader = new SecurityKeyLoader( + FileSystemFixture.CLASSPATH_FILE_SYSTEM, + jmapConfiguration); + + assertThatThrownBy(loader::load) + .isInstanceOf(RuntimeException.class) + .hasMessage("JMAP is not enabled"); + } + + @Test void loadShouldThrowWhenWrongKeystore() throws Exception { JMAPConfiguration jmapConfiguration = JMAPConfiguration.builder() .enable() @@ -72,7 +90,7 @@ class SecurityKeyLoaderTest { } @Test - void loadShouldReturnSecurityKeysWhenCorrectPassword() throws Exception { + void loadShouldReturnAsymmetricKeysWhenCorrectPassword() throws Exception { JMAPConfiguration jmapConfiguration = JMAPConfiguration.builder() .enable() .jwtPublicKeyPem(Optional.of(JWT_PUBLIC_KEY)) @@ -93,7 +111,7 @@ class SecurityKeyLoaderTest { "keystoreJava7", "keystoreJava11", }) - void loadShouldReturnSecurityKeysWhenUsingKeyStoreGeneratedByDifferentJavaVersions( + void loadShouldReturnAsymmetricKeysWhenUsingKeyStoreGeneratedByDifferentJavaVersions( String keyStoreInDifferentVersion) throws Exception { JMAPConfiguration jmapConfiguration = JMAPConfiguration.builder() --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
