You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2022/06/25 04:49:52 UTC
[james-project] branch master updated: JAMES-3781 As a user I want to enforce explicit configuration
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
The following commit(s) were added to refs/heads/master by this push:
new 59c865cf23 JAMES-3781 As a user I want to enforce explicit configuration
59c865cf23 is described below
commit 59c865cf2319bbfe45b1cfbd51f65380a4572731
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Jun 17 11:13:49 2022 +0700
JAMES-3781 As a user I want to enforce explicit configuration
Adds james.fail.on.missing.configuration=true JVM option.
---
.../sample-configuration/jvm.properties | 5 ++++-
.../sample-configuration/jvm.properties | 5 ++++-
.../sample-configuration/jvm.properties | 5 ++++-
.../apps/jpa-app/sample-configuration/jvm.properties | 5 ++++-
.../jpa-smtp-app/sample-configuration/jvm.properties | 5 ++++-
.../memory-app/sample-configuration/jvm.properties | 5 ++++-
.../apache/james/DefaultMemoryJamesServerTest.java | 16 +++++++++++++++-
.../configuration/FileConfigurationProvider.java | 7 +++++++
.../org/apache/james/utils/PropertiesProvider.java | 20 ++++++++++++++++++--
9 files changed, 64 insertions(+), 9 deletions(-)
diff --git a/server/apps/cassandra-app/sample-configuration/jvm.properties b/server/apps/cassandra-app/sample-configuration/jvm.properties
index ba36d04837..c87f7ee40f 100644
--- a/server/apps/cassandra-app/sample-configuration/jvm.properties
+++ b/server/apps/cassandra-app/sample-configuration/jvm.properties
@@ -38,4 +38,7 @@ config.file=conf/cassandra-driver.conf
# io.netty.leakDetection.level=SIMPLE
# Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup.
-# james.exit.on.startup.error=true
\ No newline at end of file
+# james.exit.on.startup.error=true
+
+# Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false.
+# james.fail.on.missing.configuration=true
diff --git a/server/apps/distributed-app/sample-configuration/jvm.properties b/server/apps/distributed-app/sample-configuration/jvm.properties
index 816af67cf3..7041e12355 100644
--- a/server/apps/distributed-app/sample-configuration/jvm.properties
+++ b/server/apps/distributed-app/sample-configuration/jvm.properties
@@ -38,4 +38,7 @@ config.file=conf/cassandra-driver.conf
# io.netty.leakDetection.level=SIMPLE
# Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup.
-# james.exit.on.startup.error=true
\ No newline at end of file
+# james.exit.on.startup.error=true
+
+# Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false.
+# james.fail.on.missing.configuration=true
diff --git a/server/apps/distributed-pop3-app/sample-configuration/jvm.properties b/server/apps/distributed-pop3-app/sample-configuration/jvm.properties
index ba36d04837..c87f7ee40f 100644
--- a/server/apps/distributed-pop3-app/sample-configuration/jvm.properties
+++ b/server/apps/distributed-pop3-app/sample-configuration/jvm.properties
@@ -38,4 +38,7 @@ config.file=conf/cassandra-driver.conf
# io.netty.leakDetection.level=SIMPLE
# Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup.
-# james.exit.on.startup.error=true
\ No newline at end of file
+# james.exit.on.startup.error=true
+
+# Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false.
+# james.fail.on.missing.configuration=true
diff --git a/server/apps/jpa-app/sample-configuration/jvm.properties b/server/apps/jpa-app/sample-configuration/jvm.properties
index a0463cae71..c7404877b5 100644
--- a/server/apps/jpa-app/sample-configuration/jvm.properties
+++ b/server/apps/jpa-app/sample-configuration/jvm.properties
@@ -35,4 +35,7 @@
# io.netty.leakDetection.level=SIMPLE
# Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup.
-# james.exit.on.startup.error=true
\ No newline at end of file
+# james.exit.on.startup.error=true
+
+# Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false.
+# james.fail.on.missing.configuration=true
diff --git a/server/apps/jpa-smtp-app/sample-configuration/jvm.properties b/server/apps/jpa-smtp-app/sample-configuration/jvm.properties
index a0463cae71..c7404877b5 100644
--- a/server/apps/jpa-smtp-app/sample-configuration/jvm.properties
+++ b/server/apps/jpa-smtp-app/sample-configuration/jvm.properties
@@ -35,4 +35,7 @@
# io.netty.leakDetection.level=SIMPLE
# Should James exit on Startup error? Boolean, defaults to true. This prevents partial startup.
-# james.exit.on.startup.error=true
\ No newline at end of file
+# james.exit.on.startup.error=true
+
+# Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false.
+# james.fail.on.missing.configuration=true
diff --git a/server/apps/memory-app/sample-configuration/jvm.properties b/server/apps/memory-app/sample-configuration/jvm.properties
index 399c195121..8d23fd39a2 100644
--- a/server/apps/memory-app/sample-configuration/jvm.properties
+++ b/server/apps/memory-app/sample-configuration/jvm.properties
@@ -35,4 +35,7 @@
# io.netty.leakDetection.level=SIMPLE
# Should James exit on Startup error? Boolean, defaults to true.
-# james.exit.on.startup.error=true
\ No newline at end of file
+# james.exit.on.startup.error=true
+
+# Fails explicitly on missing configuration file rather that taking implicit values. Defautls to false.
+# james.fail.on.missing.configuration=true
diff --git a/server/apps/memory-app/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java b/server/apps/memory-app/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java
index 5198406ae4..19e08aa2c4 100644
--- a/server/apps/memory-app/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java
+++ b/server/apps/memory-app/src/test/java/org/apache/james/DefaultMemoryJamesServerTest.java
@@ -21,10 +21,12 @@ package org.apache.james;
import static org.apache.james.data.UsersRepositoryModuleChooser.Implementation.DEFAULT;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
import org.apache.commons.configuration2.BaseHierarchicalConfiguration;
import org.apache.james.modules.TestJMAPServerModule;
import org.apache.james.server.core.configuration.ConfigurationProvider;
+import org.apache.james.utils.PropertiesProvider.MissingConfigurationFile;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -39,10 +41,22 @@ class DefaultMemoryJamesServerTest {
.server(configuration -> MemoryJamesServerMain.createServer(configuration)
.overrideWith(new TestJMAPServerModule())
.overrideWith(binder -> binder.bind(ConfigurationProvider.class).toInstance((s, l) -> new BaseHierarchicalConfiguration())))
+ .disableAutoStart()
.build();
@Test
- void memoryJamesServerShouldStartWithNoConfigurationFile(GuiceJamesServer server) {
+ void memoryJamesServerShouldStartWithNoConfigurationFile(GuiceJamesServer server) throws Exception {
+ server.start();
assertThat(server.isStarted()).isTrue();
}
+
+ @Test
+ void shouldFailOnMissingConfigurationFilesWhenRequested(GuiceJamesServer server) {
+ System.setProperty("james.fail.on.missing.configuration", "true");
+ try {
+ assertThatThrownBy(server::start).hasCauseInstanceOf(MissingConfigurationFile.class);
+ } finally {
+ System.setProperty("james.fail.on.missing.configuration", "false");
+ }
+ }
}
diff --git a/server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java b/server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java
index 02977747dd..0dc26268a0 100644
--- a/server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java
+++ b/server/container/core/src/main/java/org/apache/james/server/core/configuration/FileConfigurationProvider.java
@@ -49,6 +49,10 @@ public class FileConfigurationProvider implements ConfigurationProvider {
public static final HierarchicalConfiguration<ImmutableNode> EMPTY_CONFIGURATION = new XMLConfiguration();
+ private static boolean failOnMissingConfiguration() {
+ return Boolean.valueOf(System.getProperty("james.fail.on.missing.configuration", "false"));
+ }
+
public static XMLConfiguration getConfig(InputStream configStream) throws ConfigurationException {
FileBasedConfigurationBuilder<XMLConfiguration> builder = new FileBasedConfigurationBuilder<>(XMLConfiguration.class)
.configure(new Parameters()
@@ -85,6 +89,9 @@ public class FileConfigurationProvider implements ConfigurationProvider {
return selectConfigurationPart(configPathParts,
getConfig(inputStream.get()));
}
+ if (failOnMissingConfiguration()) {
+ throw new ConfigurationException("Missing configuration: " + component);
+ }
return EMPTY_CONFIGURATION;
}
diff --git a/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java b/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java
index d07476f09b..1797510328 100644
--- a/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java
+++ b/server/container/guice/configuration/src/main/java/org/apache/james/utils/PropertiesProvider.java
@@ -45,10 +45,19 @@ import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
public class PropertiesProvider {
+ public static class MissingConfigurationFile extends RuntimeException {
+ public MissingConfigurationFile(String message) {
+ super(message);
+ }
+ }
private static final Logger LOGGER = LoggerFactory.getLogger("org.apache.james.CONFIGURATION");
private static final char COMMA = ',';
+ private static boolean failOnMissingConfiguration() {
+ return Boolean.valueOf(System.getProperty("james.fail.on.missing.configuration", "false"));
+ }
+
@VisibleForTesting
public static PropertiesProvider forTesting() {
org.apache.james.server.core.configuration.Configuration configuration = org.apache.james.server.core.configuration.Configuration.builder()
@@ -74,7 +83,7 @@ public class PropertiesProvider {
.map(this::getConfigurationFile)
.flatMap(Optional::stream)
.findFirst()
- .orElseThrow(() -> new FileNotFoundException(Joiner.on(",").join(filenames) + " not found"));
+ .orElseThrow(() -> fail(Joiner.on(",").join(filenames) + " not found"));
return getConfiguration(file);
}
@@ -83,11 +92,18 @@ public class PropertiesProvider {
Preconditions.checkArgument(!Strings.isNullOrEmpty(fileName));
File file = getConfigurationFile(fileName)
- .orElseThrow(() -> new FileNotFoundException(fileName));
+ .orElseThrow(() -> fail(fileName));
return getConfiguration(file);
}
+ public FileNotFoundException fail(String message) {
+ if (failOnMissingConfiguration()) {
+ throw new MissingConfigurationFile(message);
+ }
+ return new FileNotFoundException(message);
+ }
+
private Configuration getConfiguration(File propertiesFile) throws ConfigurationException {
FileBasedConfigurationBuilder<FileBasedConfiguration> builder = new FileBasedConfigurationBuilder<FileBasedConfiguration>(PropertiesConfiguration.class)
.configure(new Parameters()
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org