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 3d231c2c240a0ff44e8bb7385a84f693fe78f4a3 Author: Benoit Tellier <[email protected]> AuthorDate: Mon Nov 16 13:13:58 2020 +0700 JAMES-3440 Configuration option to enable EmailQuery view File: jmap.properties Default value: false (as we can not assume admins would have provisioned the view correctly, we should let them a grace period to migrate their data). --- .../destination/conf/jmap.properties | 4 ++++ .../destination/conf/jmap.properties | 4 ++++ .../destination/conf/jmap.properties | 4 ++++ .../cassandra/destination/conf/jmap.properties | 4 ++++ .../guice/memory/destination/conf/jmap.properties | 4 ++++ .../servers/pages/distributed/configure/jmap.adoc | 5 ++++ .../org/apache/james/jmap/draft/JMAPModule.java | 1 + .../org/apache/james/jmap/JMAPConfiguration.java | 28 ++++++++++++++++++++-- .../apache/james/jmap/JMAPConfigurationTest.java | 9 ++++--- src/site/xdoc/server/config-jmap.xml | 5 ++++ 10 files changed, 63 insertions(+), 5 deletions(-) diff --git a/dockerfiles/run/guice/cassandra-ldap/destination/conf/jmap.properties b/dockerfiles/run/guice/cassandra-ldap/destination/conf/jmap.properties index 53bc403..1980cfa 100644 --- a/dockerfiles/run/guice/cassandra-ldap/destination/conf/jmap.properties +++ b/dockerfiles/run/guice/cassandra-ldap/destination/conf/jmap.properties @@ -12,3 +12,7 @@ tls.secret=james72laBalle # which should be a PEM format file. # jwt.publickeypem.url=file://conf/jwt_publickey + +# Should simple Email/query be resolved against a Cassandra projection, or should we resolve them against ElasticSearch? +# This enables a higher resilience, but the projection needs to be correctly populated. False by default. +# view.email.query.enabled=true diff --git a/dockerfiles/run/guice/cassandra-rabbitmq-ldap/destination/conf/jmap.properties b/dockerfiles/run/guice/cassandra-rabbitmq-ldap/destination/conf/jmap.properties index 53bc403..1980cfa 100644 --- a/dockerfiles/run/guice/cassandra-rabbitmq-ldap/destination/conf/jmap.properties +++ b/dockerfiles/run/guice/cassandra-rabbitmq-ldap/destination/conf/jmap.properties @@ -12,3 +12,7 @@ tls.secret=james72laBalle # which should be a PEM format file. # jwt.publickeypem.url=file://conf/jwt_publickey + +# Should simple Email/query be resolved against a Cassandra projection, or should we resolve them against ElasticSearch? +# This enables a higher resilience, but the projection needs to be correctly populated. False by default. +# view.email.query.enabled=true diff --git a/dockerfiles/run/guice/cassandra-rabbitmq/destination/conf/jmap.properties b/dockerfiles/run/guice/cassandra-rabbitmq/destination/conf/jmap.properties index 53bc403..1980cfa 100644 --- a/dockerfiles/run/guice/cassandra-rabbitmq/destination/conf/jmap.properties +++ b/dockerfiles/run/guice/cassandra-rabbitmq/destination/conf/jmap.properties @@ -12,3 +12,7 @@ tls.secret=james72laBalle # which should be a PEM format file. # jwt.publickeypem.url=file://conf/jwt_publickey + +# Should simple Email/query be resolved against a Cassandra projection, or should we resolve them against ElasticSearch? +# This enables a higher resilience, but the projection needs to be correctly populated. False by default. +# view.email.query.enabled=true diff --git a/dockerfiles/run/guice/cassandra/destination/conf/jmap.properties b/dockerfiles/run/guice/cassandra/destination/conf/jmap.properties index 53bc403..71d28c6 100644 --- a/dockerfiles/run/guice/cassandra/destination/conf/jmap.properties +++ b/dockerfiles/run/guice/cassandra/destination/conf/jmap.properties @@ -12,3 +12,7 @@ tls.secret=james72laBalle # which should be a PEM format file. # jwt.publickeypem.url=file://conf/jwt_publickey + +# Should simple Email/query be resolved against a Cassandra projection, or should we resolve them against ElasticSearch? +# This enables a higher resilience, but the projection needs to be correctly populated. False by default. +# view.email.query.enabled=true \ No newline at end of file diff --git a/dockerfiles/run/guice/memory/destination/conf/jmap.properties b/dockerfiles/run/guice/memory/destination/conf/jmap.properties index 53bc403..1980cfa 100644 --- a/dockerfiles/run/guice/memory/destination/conf/jmap.properties +++ b/dockerfiles/run/guice/memory/destination/conf/jmap.properties @@ -12,3 +12,7 @@ tls.secret=james72laBalle # which should be a PEM format file. # jwt.publickeypem.url=file://conf/jwt_publickey + +# Should simple Email/query be resolved against a Cassandra projection, or should we resolve them against ElasticSearch? +# This enables a higher resilience, but the projection needs to be correctly populated. False by default. +# view.email.query.enabled=true diff --git a/docs/modules/servers/pages/distributed/configure/jmap.adoc b/docs/modules/servers/pages/distributed/configure/jmap.adoc index f2b55d0..5ab56a9 100644 --- a/docs/modules/servers/pages/distributed/configure/jmap.adoc +++ b/docs/modules/servers/pages/distributed/configure/jmap.adoc @@ -37,6 +37,11 @@ This should not be the same keystore than the ones used by TLS based protocols. | Optional. Configuration max size Upload in new JMAP-RFC-8621. | Default value: 30M. Supported units are B (bytes) K (KB) M (MB) G (GB). +| view.email.query.enabled +| Optional boolean. Defaults to false. +| Should simple Email/query be resolved against a Cassandra projection, or should we resolve them against ElasticSearch? +This enables a higher resilience, but the projection needs to be correctly populated. + |=== == Wire tapping diff --git a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java index 934da8e..91cf4bf 100644 --- a/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java +++ b/server/container/guice/protocols/jmap/src/main/java/org/apache/james/jmap/draft/JMAPModule.java @@ -139,6 +139,7 @@ public class JMAPModule extends AbstractModule { return JMAPConfiguration.builder() .enabled(configuration.getBoolean("enabled", true)) .port(Port.of(configuration.getInt("jmap.port", DEFAULT_JMAP_PORT))) + .enableEmailQueryView(Optional.ofNullable(configuration.getBoolean("view.email.query.enabled", null))) .build(); } catch (FileNotFoundException e) { LOGGER.warn("Could not find JMAP configuration file. JMAP server will not be enabled."); diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPConfiguration.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPConfiguration.java index cf2e61d..5b7c729 100644 --- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPConfiguration.java +++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/JMAPConfiguration.java @@ -33,6 +33,7 @@ public class JMAPConfiguration { public static class Builder { private Optional<Boolean> enabled = Optional.empty(); + private Optional<Boolean> emailQueryViewEnabled = Optional.empty(); private Optional<Port> port = Optional.empty(); private Builder() { @@ -52,6 +53,23 @@ public class JMAPConfiguration { return enabled(false); } + public Builder enableEmailQueryView(boolean enabled) { + return enableEmailQueryView(Optional.of(enabled)); + } + + public Builder enableEmailQueryView(Optional<Boolean> enabled) { + this.emailQueryViewEnabled = enabled; + return this; + } + + public Builder enableEmailQueryView() { + return enableEmailQueryView(true); + } + + public Builder disableEmailQueryView() { + return enableEmailQueryView(false); + } + public Builder port(Port port) { this.port = Optional.of(port); return this; @@ -64,18 +82,20 @@ public class JMAPConfiguration { public JMAPConfiguration build() { Preconditions.checkState(enabled.isPresent(), "You should specify if JMAP server should be started"); - return new JMAPConfiguration(enabled.get(), port); + return new JMAPConfiguration(enabled.get(), port, emailQueryViewEnabled.orElse(false)); } } private final boolean enabled; private final Optional<Port> port; + private final boolean emailQueryViewEnabled; @VisibleForTesting - JMAPConfiguration(boolean enabled, Optional<Port> port) { + JMAPConfiguration(boolean enabled, Optional<Port> port, boolean emailQueryViewEnabled) { this.enabled = enabled; this.port = port; + this.emailQueryViewEnabled = emailQueryViewEnabled; } public boolean isEnabled() { @@ -85,4 +105,8 @@ public class JMAPConfiguration { public Optional<Port> getPort() { return port; } + + public boolean isEmailQueryViewEnabled() { + return emailQueryViewEnabled; + } } diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPConfigurationTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPConfigurationTest.java index 68dbf75..011f774 100644 --- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPConfigurationTest.java +++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/JMAPConfigurationTest.java @@ -41,22 +41,24 @@ class JMAPConfigurationTest { @Test void buildShouldWorkWhenRandomPort() { - JMAPConfiguration expectedJMAPConfiguration = new JMAPConfiguration(ENABLED, Optional.empty()); + JMAPConfiguration expectedJMAPConfiguration = new JMAPConfiguration(ENABLED, Optional.empty(), ENABLED); JMAPConfiguration jmapConfiguration = JMAPConfiguration.builder() .enable() .randomPort() + .enableEmailQueryView() .build(); assertThat(jmapConfiguration).isEqualToComparingFieldByField(expectedJMAPConfiguration); } @Test void buildShouldWorkWhenFixedPort() { - JMAPConfiguration expectedJMAPConfiguration = new JMAPConfiguration(ENABLED, Optional.of(Port.of(80))); + JMAPConfiguration expectedJMAPConfiguration = new JMAPConfiguration(ENABLED, Optional.of(Port.of(80)), ENABLED); JMAPConfiguration jmapConfiguration = JMAPConfiguration.builder() .enable() .port(Port.of(80)) + .enableEmailQueryView() .build(); assertThat(jmapConfiguration).isEqualToComparingFieldByField(expectedJMAPConfiguration); @@ -64,10 +66,11 @@ class JMAPConfigurationTest { @Test void buildShouldWorkWhenDisabled() { - JMAPConfiguration expectedJMAPConfiguration = new JMAPConfiguration(DISABLED, Optional.empty()); + JMAPConfiguration expectedJMAPConfiguration = new JMAPConfiguration(DISABLED, Optional.empty(), DISABLED); JMAPConfiguration jmapConfiguration = JMAPConfiguration.builder() .disable() + .disableEmailQueryView() .build(); assertThat(jmapConfiguration).isEqualToComparingFieldByField(expectedJMAPConfiguration); } diff --git a/src/site/xdoc/server/config-jmap.xml b/src/site/xdoc/server/config-jmap.xml index ce649ac..ef03111 100644 --- a/src/site/xdoc/server/config-jmap.xml +++ b/src/site/xdoc/server/config-jmap.xml @@ -64,6 +64,11 @@ <dt><strong>upload.max.size</strong></dt> <dd>Optional. Configuration max size Upload in new JMAP-RFC-8621.</dd> <dd>Default value: 30M. Supported units are B (bytes) K (KB) M (MB) G (GB).</dd> + + <dt><strong>view.email.query.enabled</strong></dt> + <dd>Optional boolean. Defaults to false.</dd> + <dd>Should simple Email/query be resolved against a Cassandra projection, or should we resolve them against ElasticSearch? + This enables a higher resilience, but the projection needs to be correctly populated.</dd> </dl> </subsection> --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
