You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by rc...@apache.org on 2022/09/28 09:39:00 UTC
[james-project] branch master updated: JAMES-3813 Module chooser for DeletedMessagesVault on Cassandra based… (#1195)
This is an automated email from the ASF dual-hosted git repository.
rcordier 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 0600e060b9 JAMES-3813 Module chooser for DeletedMessagesVault on Cassandra based… (#1195)
0600e060b9 is described below
commit 0600e060b9406f58cf8b483d03f1109c7686a82d
Author: Benoit TELLIER <bt...@linagora.com>
AuthorDate: Wed Sep 28 16:38:54 2022 +0700
JAMES-3813 Module chooser for DeletedMessagesVault on Cassandra based… (#1195)
---
.../org/apache/james/vault/VaultConfiguration.java | 20 +++++++++++----
.../james/vault/DeletedMessageVaultHookTest.java | 2 +-
.../apache/james/vault/VaultConfigurationTest.java | 12 ++++-----
.../blob/BlobStoreDeletedMessageVaultTest.java | 2 +-
.../deletedMessageVault.properties | 3 +++
.../sample-configuration/listeners.xml | 3 +++
.../james/CassandraJamesServerConfiguration.java | 27 ++++++++++++++++++--
.../org/apache/james/CassandraJamesServerMain.java | 17 ++++++++++---
.../deletedMessageVault.properties | 3 +++
.../sample-configuration/listeners.xml | 4 +++
.../james/CassandraRabbitMQJamesConfiguration.java | 27 ++++++++++++++++++--
.../james/CassandraRabbitMQJamesServerMain.java | 17 ++++++++++---
.../deletedMessageVault.properties | 3 +++
.../sample-configuration/listeners.xml | 3 +++
.../james/DistributedPOP3JamesConfiguration.java | 29 ++++++++++++++++++++--
.../james/DistributedPOP3JamesServerMain.java | 17 ++++++++++---
.../src/test/resources/listeners.xml | 3 ---
.../RabbitMQUnauthorizedEndpointsTest.java | 2 ++
...rTaskSerializationIntegrationImmutableTest.java | 2 ++
...dminServerTaskSerializationIntegrationTest.java | 2 ++
...RabbitMQDeletedMessageVaultIntegrationTest.java | 2 ++
.../routes/DeletedMessagesVaultRoutesTest.java | 4 +--
upgrade-instructions.md | 17 +++++++++++++
23 files changed, 188 insertions(+), 33 deletions(-)
diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/VaultConfiguration.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/VaultConfiguration.java
index 918daa8dbc..c6e46fb0d8 100644
--- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/VaultConfiguration.java
+++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/VaultConfiguration.java
@@ -32,7 +32,9 @@ import com.google.common.base.Preconditions;
public class VaultConfiguration {
public static final VaultConfiguration DEFAULT =
- new VaultConfiguration(ChronoUnit.YEARS.getDuration(), DefaultMailboxes.RESTORED_MESSAGES);
+ new VaultConfiguration(false, ChronoUnit.YEARS.getDuration(), DefaultMailboxes.RESTORED_MESSAGES);
+ public static final VaultConfiguration ENABLED_DEFAULT =
+ new VaultConfiguration(true, ChronoUnit.YEARS.getDuration(), DefaultMailboxes.RESTORED_MESSAGES);
public static VaultConfiguration from(Configuration propertiesConfiguration) {
Duration retentionPeriod = Optional.ofNullable(propertiesConfiguration.getString("retentionPeriod"))
@@ -40,13 +42,16 @@ public class VaultConfiguration {
.orElse(DEFAULT.getRetentionPeriod());
String restoreLocation = Optional.ofNullable(propertiesConfiguration.getString("restoreLocation"))
.orElse(DEFAULT.getRestoreLocation());
- return new VaultConfiguration(retentionPeriod, restoreLocation);
+ boolean enabled = propertiesConfiguration.getBoolean("enabled", false);
+ return new VaultConfiguration(enabled, retentionPeriod, restoreLocation);
}
+ private final boolean enabled;
private final Duration retentionPeriod;
private final String restoreLocation;
- VaultConfiguration(Duration retentionPeriod, String restoreLocation) {
+ VaultConfiguration(boolean enabled, Duration retentionPeriod, String restoreLocation) {
+ this.enabled = enabled;
Preconditions.checkNotNull(retentionPeriod);
Preconditions.checkNotNull(restoreLocation);
@@ -54,6 +59,10 @@ public class VaultConfiguration {
this.restoreLocation = restoreLocation;
}
+ public boolean isEnabled() {
+ return enabled;
+ }
+
public Duration getRetentionPeriod() {
return retentionPeriod;
}
@@ -68,13 +77,14 @@ public class VaultConfiguration {
VaultConfiguration that = (VaultConfiguration) o;
return Objects.equals(this.retentionPeriod, that.retentionPeriod)
- && Objects.equals(this.restoreLocation, that.restoreLocation);
+ && Objects.equals(this.restoreLocation, that.restoreLocation)
+ && Objects.equals(this.enabled, that.enabled);
}
return false;
}
@Override
public final int hashCode() {
- return Objects.hash(retentionPeriod, restoreLocation);
+ return Objects.hash(retentionPeriod, restoreLocation, enabled);
}
}
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
index 315d28970b..0c4447f3c8 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/DeletedMessageVaultHookTest.java
@@ -120,7 +120,7 @@ class DeletedMessageVaultHookTest {
.blobIdFactory(new HashBlobId.Factory())
.defaultBucketName()
.passthrough(), blobStoreDAO, new BucketNameGenerator(clock), clock,
- VaultConfiguration.DEFAULT);
+ VaultConfiguration.ENABLED_DEFAULT);
DeletedMessageConverter deletedMessageConverter = new DeletedMessageConverter();
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/VaultConfigurationTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/VaultConfigurationTest.java
index de34851366..656af119d6 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/VaultConfigurationTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/VaultConfigurationTest.java
@@ -40,13 +40,13 @@ class VaultConfigurationTest {
@Test
void constructorShouldThrowWhenRetentionPeriodIsNull() {
- assertThatThrownBy(() -> new VaultConfiguration(null, DefaultMailboxes.RESTORED_MESSAGES))
+ assertThatThrownBy(() -> new VaultConfiguration(true, null, DefaultMailboxes.RESTORED_MESSAGES))
.isInstanceOf(NullPointerException.class);
}
@Test
void constructorShouldThrowWhenRestoreLocationIsNull() {
- assertThatThrownBy(() -> new VaultConfiguration(ChronoUnit.YEARS.getDuration(), null))
+ assertThatThrownBy(() -> new VaultConfiguration(true, ChronoUnit.YEARS.getDuration(), null))
.isInstanceOf(NullPointerException.class);
}
@@ -62,7 +62,7 @@ class VaultConfigurationTest {
configuration.addProperty("restoreLocation", "INBOX");
assertThat(VaultConfiguration.from(configuration)).isEqualTo(
- new VaultConfiguration(ChronoUnit.YEARS.getDuration(), DefaultMailboxes.INBOX));
+ new VaultConfiguration(false, ChronoUnit.YEARS.getDuration(), DefaultMailboxes.INBOX));
}
@Test
@@ -71,7 +71,7 @@ class VaultConfigurationTest {
configuration.addProperty("retentionPeriod", "15d");
assertThat(VaultConfiguration.from(configuration)).isEqualTo(
- new VaultConfiguration(Duration.ofDays(15), DefaultMailboxes.RESTORED_MESSAGES));
+ new VaultConfiguration(false, Duration.ofDays(15), DefaultMailboxes.RESTORED_MESSAGES));
}
@Test
@@ -80,7 +80,7 @@ class VaultConfigurationTest {
configuration.addProperty("retentionPeriod", "15h");
assertThat(VaultConfiguration.from(configuration)).isEqualTo(
- new VaultConfiguration(Duration.ofHours(15), DefaultMailboxes.RESTORED_MESSAGES));
+ new VaultConfiguration(false, Duration.ofHours(15), DefaultMailboxes.RESTORED_MESSAGES));
}
@Test
@@ -89,7 +89,7 @@ class VaultConfigurationTest {
configuration.addProperty("retentionPeriod", "15");
assertThat(VaultConfiguration.from(configuration)).isEqualTo(
- new VaultConfiguration(Duration.ofDays(15), DefaultMailboxes.RESTORED_MESSAGES));
+ new VaultConfiguration(false, Duration.ofDays(15), DefaultMailboxes.RESTORED_MESSAGES));
}
@Test
diff --git a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java
index fe6f1377e0..0e111ff019 100644
--- a/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java
+++ b/mailbox/plugin/deleted-messages-vault/src/test/java/org/apache/james/vault/blob/BlobStoreDeletedMessageVaultTest.java
@@ -71,7 +71,7 @@ class BlobStoreDeletedMessageVaultTest implements DeletedMessageVaultContract, D
.blobIdFactory(new HashBlobId.Factory())
.defaultBucketName()
.passthrough(),
- blobStoreDAO, new BucketNameGenerator(clock), clock, VaultConfiguration.DEFAULT);
+ blobStoreDAO, new BucketNameGenerator(clock), clock, VaultConfiguration.ENABLED_DEFAULT);
}
@Override
diff --git a/server/apps/cassandra-app/sample-configuration/deletedMessageVault.properties b/server/apps/cassandra-app/sample-configuration/deletedMessageVault.properties
index ab1e3eef99..a6df89a227 100644
--- a/server/apps/cassandra-app/sample-configuration/deletedMessageVault.properties
+++ b/server/apps/cassandra-app/sample-configuration/deletedMessageVault.properties
@@ -1,4 +1,7 @@
# ============================================= Deleted Messages Vault Configuration ==================================
+
+enabled=false
+
# Retention period for your deleted messages into the vault, after which they expire and can be potentially cleaned up
# Optional, default 1y
# retentionPeriod=1y
\ No newline at end of file
diff --git a/server/apps/cassandra-app/sample-configuration/listeners.xml b/server/apps/cassandra-app/sample-configuration/listeners.xml
index 6a1d26196f..9803da2286 100644
--- a/server/apps/cassandra-app/sample-configuration/listeners.xml
+++ b/server/apps/cassandra-app/sample-configuration/listeners.xml
@@ -24,9 +24,12 @@
<listener>
<class>org.apache.james.mailbox.cassandra.MailboxOperationLoggingListener</class>
</listener>
+ <!-- Requires Deleted Message Vault to be activated. See deletedMessageVault.properties -->
+ <!--
<preDeletionHook>
<class>org.apache.james.vault.DeletedMessageVaultHook</class>
</preDeletionHook>
+ -->
<!-- Enable to populate JMAP EmailQueryView -->
<!--
diff --git a/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java b/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java
index d0af89bbf7..66cdafdf52 100644
--- a/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java
+++ b/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerConfiguration.java
@@ -22,6 +22,7 @@ package org.apache.james;
import java.io.File;
import java.util.Optional;
+import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.james.data.UsersRepositoryModuleChooser;
import org.apache.james.filesystem.api.FileSystem;
import org.apache.james.filesystem.api.JamesDirectoriesProvider;
@@ -31,6 +32,7 @@ import org.apache.james.server.core.configuration.Configuration;
import org.apache.james.server.core.configuration.FileConfigurationProvider;
import org.apache.james.server.core.filesystem.FileSystemImpl;
import org.apache.james.utils.PropertiesProvider;
+import org.apache.james.vault.VaultConfiguration;
import com.github.fge.lambdas.Throwing;
@@ -49,6 +51,7 @@ public class CassandraJamesServerConfiguration implements Configuration {
private Optional<ConfigurationPath> configurationPath;
private Optional<BlobStoreConfiguration> blobStoreConfiguration;
private Optional<UsersRepositoryModuleChooser.Implementation> usersRepositoryImplementation;
+ private Optional<VaultConfiguration> vaultConfiguration;
private Builder() {
rootDirectory = Optional.empty();
@@ -56,6 +59,7 @@ public class CassandraJamesServerConfiguration implements Configuration {
searchConfiguration = Optional.empty();
usersRepositoryImplementation = Optional.empty();
blobStoreConfiguration = Optional.empty();
+ vaultConfiguration = Optional.empty();
}
public Builder workingDirectory(String path) {
@@ -101,6 +105,11 @@ public class CassandraJamesServerConfiguration implements Configuration {
return this;
}
+ public Builder vaultConfiguration(VaultConfiguration vaultConfiguration) {
+ this.vaultConfiguration = Optional.of(vaultConfiguration);
+ return this;
+ }
+
public CassandraJamesServerConfiguration build() {
ConfigurationPath configurationPath = this.configurationPath.orElse(new ConfigurationPath(FileSystem.FILE_PROTOCOL_AND_CONF));
JamesServerResourceLoader directories = new JamesServerResourceLoader(rootDirectory
@@ -121,7 +130,15 @@ public class CassandraJamesServerConfiguration implements Configuration {
UsersRepositoryModuleChooser.Implementation usersRepositoryChoice = usersRepositoryImplementation.orElseGet(
() -> UsersRepositoryModuleChooser.Implementation.parse(configurationProvider));
- return new CassandraJamesServerConfiguration(configurationPath, directories, searchConfiguration, blobStoreConfiguration, usersRepositoryChoice);
+ VaultConfiguration vaultConfiguration = this.vaultConfiguration.orElseGet(() -> {
+ try {
+ return VaultConfiguration.from(configurationProvider.getConfiguration("deletedMessageVault"));
+ } catch (ConfigurationException e) {
+ return VaultConfiguration.DEFAULT;
+ }
+ });
+
+ return new CassandraJamesServerConfiguration(configurationPath, directories, searchConfiguration, blobStoreConfiguration, usersRepositoryChoice, vaultConfiguration);
}
}
@@ -134,13 +151,15 @@ public class CassandraJamesServerConfiguration implements Configuration {
private final SearchConfiguration searchConfiguration;
private final BlobStoreConfiguration blobStoreConfiguration;
private final UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation;
+ private final VaultConfiguration vaultConfiguration;
- private CassandraJamesServerConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories, SearchConfiguration searchConfiguration, BlobStoreConfiguration blobStoreConfiguration, UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation) {
+ private CassandraJamesServerConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories, SearchConfiguration searchConfiguration, BlobStoreConfiguration blobStoreConfiguration, UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation, VaultConfiguration vaultConfiguration) {
this.configurationPath = configurationPath;
this.directories = directories;
this.searchConfiguration = searchConfiguration;
this.blobStoreConfiguration = blobStoreConfiguration;
this.usersRepositoryImplementation = usersRepositoryImplementation;
+ this.vaultConfiguration = vaultConfiguration;
}
@Override
@@ -157,6 +176,10 @@ public class CassandraJamesServerConfiguration implements Configuration {
return searchConfiguration;
}
+ public VaultConfiguration getVaultConfiguration() {
+ return vaultConfiguration;
+ }
+
public UsersRepositoryModuleChooser.Implementation getUsersRepositoryImplementation() {
return usersRepositoryImplementation;
}
diff --git a/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerMain.java b/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerMain.java
index 8770a79604..ff4f5f90e7 100644
--- a/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerMain.java
+++ b/server/apps/cassandra-app/src/main/java/org/apache/james/CassandraJamesServerMain.java
@@ -75,6 +75,7 @@ import org.apache.james.modules.server.WebAdminServerModule;
import org.apache.james.modules.vault.DeletedMessageVaultRoutesModule;
import org.apache.james.modules.webadmin.CassandraRoutesModule;
import org.apache.james.modules.webadmin.InconsistencySolvingRoutesModule;
+import org.apache.james.vault.VaultConfiguration;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Module;
@@ -96,7 +97,6 @@ public class CassandraJamesServerMain implements JamesServerMain {
new CassandraRoutesModule(),
new DataRoutesModules(),
new VacationRoutesModule(),
- new DeletedMessageVaultRoutesModule(),
new DLPRoutesModule(),
new InconsistencyQuotasSolvingRoutesModule(),
new InconsistencySolvingRoutesModule(),
@@ -150,7 +150,6 @@ public class CassandraJamesServerMain implements JamesServerMain {
public static final Module CASSANDRA_MAILBOX_MODULE = Modules.combine(
new CassandraConsistencyTaskSerializationModule(),
new CassandraMailboxModule(),
- new CassandraDeletedMessageVaultModule(),
new MailboxModule(),
new TikaMailboxModule());
@@ -190,6 +189,18 @@ public class CassandraJamesServerMain implements JamesServerMain {
.combineWith(BlobStoreModulesChooser.chooseModules(configuration.getBlobStoreConfiguration()))
.combineWith(SearchModuleChooser.chooseModules(configuration.searchConfiguration()))
.combineWith(new UsersRepositoryModuleChooser(new CassandraUsersRepositoryModule())
- .chooseModules(configuration.getUsersRepositoryImplementation()));
+ .chooseModules(configuration.getUsersRepositoryImplementation()))
+ .combineWith(chooseDeletedMessageVault(configuration.getVaultConfiguration()));
+ }
+
+ private static Module chooseDeletedMessageVault(VaultConfiguration vaultConfiguration) {
+ if (vaultConfiguration.isEnabled()) {
+ return Modules.combine(
+ new CassandraDeletedMessageVaultModule(),
+ new DeletedMessageVaultRoutesModule());
+ }
+ return binder -> {
+
+ };
}
}
diff --git a/server/apps/distributed-app/sample-configuration/deletedMessageVault.properties b/server/apps/distributed-app/sample-configuration/deletedMessageVault.properties
index ab1e3eef99..a6df89a227 100644
--- a/server/apps/distributed-app/sample-configuration/deletedMessageVault.properties
+++ b/server/apps/distributed-app/sample-configuration/deletedMessageVault.properties
@@ -1,4 +1,7 @@
# ============================================= Deleted Messages Vault Configuration ==================================
+
+enabled=false
+
# Retention period for your deleted messages into the vault, after which they expire and can be potentially cleaned up
# Optional, default 1y
# retentionPeriod=1y
\ No newline at end of file
diff --git a/server/apps/distributed-app/sample-configuration/listeners.xml b/server/apps/distributed-app/sample-configuration/listeners.xml
index f039b355a7..d90a373d6e 100644
--- a/server/apps/distributed-app/sample-configuration/listeners.xml
+++ b/server/apps/distributed-app/sample-configuration/listeners.xml
@@ -25,9 +25,13 @@
<listener>
<class>org.apache.james.mailbox.cassandra.MailboxOperationLoggingListener</class>
</listener>
+
+ <!-- Requires Deleted Message Vault to be activated. See deletedMessageVault.properties -->
+ <!--
<preDeletionHook>
<class>org.apache.james.vault.DeletedMessageVaultHook</class>
</preDeletionHook>
+ -->
<!-- Enable to populate JMAP EmailQueryView -->
<!--
diff --git a/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java b/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
index 1a07d32a91..dbce0a3cc6 100644
--- a/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
+++ b/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesConfiguration.java
@@ -22,6 +22,7 @@ package org.apache.james;
import java.io.File;
import java.util.Optional;
+import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.james.data.UsersRepositoryModuleChooser;
import org.apache.james.filesystem.api.FileSystem;
import org.apache.james.filesystem.api.JamesDirectoriesProvider;
@@ -33,6 +34,7 @@ import org.apache.james.server.core.configuration.Configuration;
import org.apache.james.server.core.configuration.FileConfigurationProvider;
import org.apache.james.server.core.filesystem.FileSystemImpl;
import org.apache.james.utils.PropertiesProvider;
+import org.apache.james.vault.VaultConfiguration;
import com.github.fge.lambdas.Throwing;
@@ -44,6 +46,7 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
private Optional<ConfigurationPath> configurationPath;
private Optional<MailQueueViewChoice> mailQueueViewChoice;
private Optional<UsersRepositoryModuleChooser.Implementation> usersRepositoryImplementation;
+ private Optional<VaultConfiguration> vaultConfiguration;
private Builder() {
searchConfiguration = Optional.empty();
@@ -52,6 +55,7 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
blobStoreConfiguration = Optional.empty();
usersRepositoryImplementation = Optional.empty();
mailQueueViewChoice = Optional.empty();
+ vaultConfiguration = Optional.empty();
}
public Builder workingDirectory(String path) {
@@ -102,6 +106,11 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
return this;
}
+ public Builder vaultConfiguration(VaultConfiguration vaultConfiguration) {
+ this.vaultConfiguration = Optional.of(vaultConfiguration);
+ return this;
+ }
+
public CassandraRabbitMQJamesConfiguration build() {
ConfigurationPath configurationPath = this.configurationPath.orElse(new ConfigurationPath(FileSystem.FILE_PROTOCOL_AND_CONF));
JamesServerResourceLoader directories = new JamesServerResourceLoader(rootDirectory
@@ -127,13 +136,21 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
() -> MailQueueViewChoice.parse(
new PropertiesProvider(fileSystem, configurationPath))));
+ VaultConfiguration vaultConfiguration = this.vaultConfiguration.orElseGet(() -> {
+ try {
+ return VaultConfiguration.from(configurationProvider.getConfiguration("deletedMessageVault"));
+ } catch (ConfigurationException e) {
+ return VaultConfiguration.DEFAULT;
+ }
+ });
+
return new CassandraRabbitMQJamesConfiguration(
configurationPath,
directories,
blobStoreConfiguration,
searchConfiguration,
usersRepositoryChoice,
- mailQueueViewChoice);
+ mailQueueViewChoice, vaultConfiguration);
}
}
@@ -147,14 +164,16 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
private final SearchConfiguration searchConfiguration;
private final UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation;
private final MailQueueViewChoice mailQueueViewChoice;
+ private final VaultConfiguration vaultConfiguration;
- public CassandraRabbitMQJamesConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories, BlobStoreConfiguration blobStoreConfiguration, SearchConfiguration searchConfiguration, UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation, MailQueueViewChoice mailQueueViewChoice) {
+ public CassandraRabbitMQJamesConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories, BlobStoreConfiguration blobStoreConfiguration, SearchConfiguration searchConfiguration, UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation, MailQueueViewChoice mailQueueViewChoice, VaultConfiguration vaultConfiguration) {
this.configurationPath = configurationPath;
this.directories = directories;
this.blobStoreConfiguration = blobStoreConfiguration;
this.searchConfiguration = searchConfiguration;
this.usersRepositoryImplementation = usersRepositoryImplementation;
this.mailQueueViewChoice = mailQueueViewChoice;
+ this.vaultConfiguration = vaultConfiguration;
}
public MailQueueViewChoice getMailQueueViewChoice() {
@@ -182,4 +201,8 @@ public class CassandraRabbitMQJamesConfiguration implements Configuration {
public UsersRepositoryModuleChooser.Implementation getUsersRepositoryImplementation() {
return usersRepositoryImplementation;
}
+
+ public VaultConfiguration getVaultConfiguration() {
+ return vaultConfiguration;
+ }
}
diff --git a/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java b/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
index efa76a9ccf..a5a1cca527 100644
--- a/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
+++ b/server/apps/distributed-app/src/main/java/org/apache/james/CassandraRabbitMQJamesServerMain.java
@@ -82,6 +82,7 @@ import org.apache.james.modules.server.WebAdminServerModule;
import org.apache.james.modules.vault.DeletedMessageVaultRoutesModule;
import org.apache.james.modules.webadmin.CassandraRoutesModule;
import org.apache.james.modules.webadmin.InconsistencySolvingRoutesModule;
+import org.apache.james.vault.VaultConfiguration;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Module;
@@ -94,7 +95,6 @@ public class CassandraRabbitMQJamesServerMain implements JamesServerMain {
new CassandraRoutesModule(),
new DataRoutesModules(),
new VacationRoutesModule(),
- new DeletedMessageVaultRoutesModule(),
new DLPRoutesModule(),
new InconsistencyQuotasSolvingRoutesModule(),
new InconsistencySolvingRoutesModule(),
@@ -146,7 +146,6 @@ public class CassandraRabbitMQJamesServerMain implements JamesServerMain {
public static final Module CASSANDRA_MAILBOX_MODULE = Modules.combine(
new CassandraConsistencyTaskSerializationModule(),
new CassandraMailboxModule(),
- new CassandraDeletedMessageVaultModule(),
new MailboxModule(),
new TikaMailboxModule());
@@ -190,6 +189,18 @@ public class CassandraRabbitMQJamesServerMain implements JamesServerMain {
.combineWith(BlobStoreCacheModulesChooser.chooseModules(blobStoreConfiguration))
.combineWith(SearchModuleChooser.chooseModules(searchConfiguration))
.combineWith(new UsersRepositoryModuleChooser(new CassandraUsersRepositoryModule())
- .chooseModules(configuration.getUsersRepositoryImplementation()));
+ .chooseModules(configuration.getUsersRepositoryImplementation()))
+ .combineWith(chooseDeletedMessageVault(configuration.getVaultConfiguration()));
+ }
+
+ private static Module chooseDeletedMessageVault(VaultConfiguration vaultConfiguration) {
+ if (vaultConfiguration.isEnabled()) {
+ return Modules.combine(
+ new CassandraDeletedMessageVaultModule(),
+ new DeletedMessageVaultRoutesModule());
+ }
+ return binder -> {
+
+ };
}
}
diff --git a/server/apps/distributed-pop3-app/sample-configuration/deletedMessageVault.properties b/server/apps/distributed-pop3-app/sample-configuration/deletedMessageVault.properties
index ff0869fe35..47ec56c5c4 100644
--- a/server/apps/distributed-pop3-app/sample-configuration/deletedMessageVault.properties
+++ b/server/apps/distributed-pop3-app/sample-configuration/deletedMessageVault.properties
@@ -1,4 +1,7 @@
# ============================================= Deleted Messages Vault Configuration ==================================
+
+enabled=false
+
# Retention period for your deleted messages into the vault, after which they expire and can be potentially cleaned up
# Optional, default 1y
# retentionPeriod=1y
diff --git a/server/apps/distributed-pop3-app/sample-configuration/listeners.xml b/server/apps/distributed-pop3-app/sample-configuration/listeners.xml
index f039b355a7..b8e256b794 100644
--- a/server/apps/distributed-pop3-app/sample-configuration/listeners.xml
+++ b/server/apps/distributed-pop3-app/sample-configuration/listeners.xml
@@ -25,9 +25,12 @@
<listener>
<class>org.apache.james.mailbox.cassandra.MailboxOperationLoggingListener</class>
</listener>
+ <!-- Requires Deleted Message Vault to be activated. See deletedMessageVault.properties -->
+ <!--
<preDeletionHook>
<class>org.apache.james.vault.DeletedMessageVaultHook</class>
</preDeletionHook>
+ -->
<!-- Enable to populate JMAP EmailQueryView -->
<!--
diff --git a/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java b/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java
index b1e9e30e0d..f8c706cc59 100644
--- a/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java
+++ b/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesConfiguration.java
@@ -22,6 +22,7 @@ package org.apache.james;
import java.io.File;
import java.util.Optional;
+import org.apache.commons.configuration2.ex.ConfigurationException;
import org.apache.james.data.UsersRepositoryModuleChooser;
import org.apache.james.filesystem.api.FileSystem;
import org.apache.james.filesystem.api.JamesDirectoriesProvider;
@@ -33,6 +34,7 @@ import org.apache.james.server.core.configuration.Configuration;
import org.apache.james.server.core.configuration.FileConfigurationProvider;
import org.apache.james.server.core.filesystem.FileSystemImpl;
import org.apache.james.utils.PropertiesProvider;
+import org.apache.james.vault.VaultConfiguration;
import com.github.fge.lambdas.Throwing;
@@ -44,6 +46,7 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
private Optional<ConfigurationPath> configurationPath;
private Optional<UsersRepositoryModuleChooser.Implementation> usersRepositoryImplementation;
private Optional<MailQueueViewChoice> mailQueueViewChoice;
+ private Optional<VaultConfiguration> vaultConfiguration;
private Builder() {
searchConfiguration = Optional.empty();
@@ -52,6 +55,7 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
blobStoreConfiguration = Optional.empty();
usersRepositoryImplementation = Optional.empty();
mailQueueViewChoice = Optional.empty();
+ vaultConfiguration = Optional.empty();
}
public Builder workingDirectory(String path) {
@@ -97,6 +101,12 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
return this;
}
+
+ public Builder vaultConfiguration(VaultConfiguration vaultConfiguration) {
+ this.vaultConfiguration = Optional.of(vaultConfiguration);
+ return this;
+ }
+
public DistributedPOP3JamesConfiguration build() {
ConfigurationPath configurationPath = this.configurationPath.orElse(new ConfigurationPath(FileSystem.FILE_PROTOCOL_AND_CONF));
JamesServerResourceLoader directories = new JamesServerResourceLoader(rootDirectory
@@ -122,13 +132,22 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
() -> MailQueueViewChoice.parse(
new PropertiesProvider(fileSystem, configurationPath))));
+
+ VaultConfiguration vaultConfiguration = this.vaultConfiguration.orElseGet(() -> {
+ try {
+ return VaultConfiguration.from(configurationProvider.getConfiguration("deletedMessageVault"));
+ } catch (ConfigurationException e) {
+ return VaultConfiguration.DEFAULT;
+ }
+ });
+
return new DistributedPOP3JamesConfiguration(
configurationPath,
directories,
blobStoreConfiguration,
searchConfiguration,
usersRepositoryChoice,
- mailQueueViewChoice);
+ mailQueueViewChoice, vaultConfiguration);
}
}
@@ -142,14 +161,16 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
private final SearchConfiguration searchConfiguration;
private final UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation;
private final MailQueueViewChoice mailQueueViewChoice;
+ private final VaultConfiguration vaultConfiguration;
- public DistributedPOP3JamesConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories, BlobStoreConfiguration blobStoreConfiguration, SearchConfiguration searchConfiguration, UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation, MailQueueViewChoice mailQueueViewChoice) {
+ public DistributedPOP3JamesConfiguration(ConfigurationPath configurationPath, JamesDirectoriesProvider directories, BlobStoreConfiguration blobStoreConfiguration, SearchConfiguration searchConfiguration, UsersRepositoryModuleChooser.Implementation usersRepositoryImplementation, MailQueueViewChoice mailQueueViewChoice, VaultConfiguration vaultConfiguration) {
this.configurationPath = configurationPath;
this.directories = directories;
this.blobStoreConfiguration = blobStoreConfiguration;
this.searchConfiguration = searchConfiguration;
this.usersRepositoryImplementation = usersRepositoryImplementation;
this.mailQueueViewChoice = mailQueueViewChoice;
+ this.vaultConfiguration = vaultConfiguration;
}
public MailQueueViewChoice getMailQueueViewChoice() {
@@ -177,4 +198,8 @@ public class DistributedPOP3JamesConfiguration implements Configuration {
public UsersRepositoryModuleChooser.Implementation getUsersRepositoryImplementation() {
return usersRepositoryImplementation;
}
+
+ public VaultConfiguration getVaultConfiguration() {
+ return vaultConfiguration;
+ }
}
diff --git a/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesServerMain.java b/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesServerMain.java
index e5c7e374a1..5a603da627 100644
--- a/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesServerMain.java
+++ b/server/apps/distributed-pop3-app/src/main/java/org/apache/james/DistributedPOP3JamesServerMain.java
@@ -85,6 +85,7 @@ import org.apache.james.modules.server.WebAdminServerModule;
import org.apache.james.modules.vault.DeletedMessageVaultRoutesModule;
import org.apache.james.modules.webadmin.CassandraRoutesModule;
import org.apache.james.modules.webadmin.InconsistencySolvingRoutesModule;
+import org.apache.james.vault.VaultConfiguration;
import com.google.common.collect.ImmutableSet;
import com.google.inject.Module;
@@ -98,7 +99,6 @@ public class DistributedPOP3JamesServerMain implements JamesServerMain {
new CassandraRoutesModule(),
new DataRoutesModules(),
new VacationRoutesModule(),
- new DeletedMessageVaultRoutesModule(),
new InconsistencyQuotasSolvingRoutesModule(),
new InconsistencySolvingRoutesModule(),
new MailboxesExportRoutesModule(),
@@ -132,7 +132,6 @@ public class DistributedPOP3JamesServerMain implements JamesServerMain {
new CassandraBlobStoreDependenciesModule(),
new CassandraDomainListModule(),
new CassandraEventStoreModule(),
- new CassandraDeletedMessageVaultModule(),
new CassandraJmapModule(),
new CassandraMailRepositoryModule(),
new CassandraMetricsModule(),
@@ -196,6 +195,18 @@ public class DistributedPOP3JamesServerMain implements JamesServerMain {
binder.bind(UidProvider.class).to(RandomUidProvider.class);
binder.bind(RandomModSeqProvider.class).in(Scopes.SINGLETON);
binder.bind(ModSeqProvider.class).to(RandomModSeqProvider.class);
- });
+ })
+ .combineWith(chooseDeletedMessageVault(configuration.getVaultConfiguration()));
+ }
+
+ private static Module chooseDeletedMessageVault(VaultConfiguration vaultConfiguration) {
+ if (vaultConfiguration.isEnabled()) {
+ return Modules.combine(
+ new CassandraDeletedMessageVaultModule(),
+ new DeletedMessageVaultRoutesModule());
+ }
+ return binder -> {
+
+ };
}
}
diff --git a/server/apps/distributed-pop3-app/src/test/resources/listeners.xml b/server/apps/distributed-pop3-app/src/test/resources/listeners.xml
index 7355d27d02..71dccb1ccb 100644
--- a/server/apps/distributed-pop3-app/src/test/resources/listeners.xml
+++ b/server/apps/distributed-pop3-app/src/test/resources/listeners.xml
@@ -22,7 +22,4 @@
<listener>
<class>org.apache.james.mailbox.cassandra.MailboxOperationLoggingListener</class>
</listener>
- <preDeletionHook>
- <class>org.apache.james.vault.DeletedMessageVaultHook</class>
- </preDeletionHook>
</listeners>
\ No newline at end of file
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQUnauthorizedEndpointsTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQUnauthorizedEndpointsTest.java
index 2e71be399f..d6ab3eff5d 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQUnauthorizedEndpointsTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQUnauthorizedEndpointsTest.java
@@ -35,6 +35,7 @@ import org.apache.james.modules.AwsS3BlobStoreExtension;
import org.apache.james.modules.RabbitMQExtension;
import org.apache.james.modules.TestRabbitMQModule;
import org.apache.james.modules.blobstore.BlobStoreConfiguration;
+import org.apache.james.vault.VaultConfiguration;
import org.apache.james.webadmin.integration.UnauthorizedEndpointsTest;
import org.apache.james.webadmin.integration.UnauthorizedModule;
import org.apache.james.webadmin.routes.AliasRoutes;
@@ -75,6 +76,7 @@ class RabbitMQUnauthorizedEndpointsTest extends UnauthorizedEndpointsTest {
.deduplication()
.noCryptoConfig())
.searchConfiguration(SearchConfiguration.openSearch())
+ .vaultConfiguration(VaultConfiguration.ENABLED_DEFAULT)
.build())
.extension(new DockerOpenSearchExtension())
.extension(new CassandraExtension())
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationImmutableTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationImmutableTest.java
index 032aa85d28..9607ad5304 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationImmutableTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationImmutableTest.java
@@ -44,6 +44,7 @@ import org.apache.james.modules.blobstore.BlobStoreConfiguration;
import org.apache.james.probe.DataProbe;
import org.apache.james.utils.DataProbeImpl;
import org.apache.james.utils.WebAdminGuiceProbe;
+import org.apache.james.vault.VaultConfiguration;
import org.apache.james.webadmin.WebAdminUtils;
import org.apache.james.webadmin.routes.CassandraMappingsRoutes;
import org.apache.james.webadmin.routes.MailQueueRoutes;
@@ -73,6 +74,7 @@ class RabbitMQWebAdminServerTaskSerializationIntegrationImmutableTest {
.disableCache()
.deduplication()
.noCryptoConfig())
+ .vaultConfiguration(VaultConfiguration.ENABLED_DEFAULT)
.searchConfiguration(SearchConfiguration.openSearch())
.build())
.extension(new DockerOpenSearchExtension())
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
index 015617a900..e54a15d3da 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/RabbitMQWebAdminServerTaskSerializationIntegrationTest.java
@@ -74,6 +74,7 @@ import org.apache.james.task.TaskManager;
import org.apache.james.utils.DataProbeImpl;
import org.apache.james.utils.MailRepositoryProbeImpl;
import org.apache.james.utils.WebAdminGuiceProbe;
+import org.apache.james.vault.VaultConfiguration;
import org.apache.james.webadmin.WebAdminUtils;
import org.apache.james.webadmin.routes.CassandraMailboxMergingRoutes;
import org.apache.james.webadmin.routes.MailQueueRoutes;
@@ -105,6 +106,7 @@ class RabbitMQWebAdminServerTaskSerializationIntegrationTest {
.deduplication()
.noCryptoConfig())
.searchConfiguration(SearchConfiguration.openSearch())
+ .vaultConfiguration(VaultConfiguration.ENABLED_DEFAULT)
.build())
.extension(new DockerOpenSearchExtension())
.extension(new CassandraExtension())
diff --git a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
index 575a42935b..ae708fb09c 100644
--- a/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
+++ b/server/protocols/webadmin-integration-test/distributed-webadmin-integration-test/src/test/java/org/apache/james/webadmin/integration/rabbitmq/vault/RabbitMQDeletedMessageVaultIntegrationTest.java
@@ -33,6 +33,7 @@ import org.apache.james.modules.RabbitMQExtension;
import org.apache.james.modules.TestJMAPServerModule;
import org.apache.james.modules.blobstore.BlobStoreConfiguration;
import org.apache.james.modules.vault.TestDeleteMessageVaultPreDeletionHookModule;
+import org.apache.james.vault.VaultConfiguration;
import org.apache.james.webadmin.integration.vault.DeletedMessageVaultIntegrationTest;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Tag;
@@ -54,6 +55,7 @@ class RabbitMQDeletedMessageVaultIntegrationTest extends DeletedMessageVaultInte
.deduplication()
.noCryptoConfig())
.searchConfiguration(SearchConfiguration.openSearch())
+ .vaultConfiguration(VaultConfiguration.ENABLED_DEFAULT)
.build())
.extension(ES_EXTENSION)
.extension(new CassandraExtension())
diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
index a7b574bd3d..88032e17eb 100644
--- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
+++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/test/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutesTest.java
@@ -191,14 +191,14 @@ class DeletedMessagesVaultRoutesTest {
clock = new UpdatableTickingClock(OLD_DELETION_DATE.toInstant());
vault = spy(new BlobStoreDeletedMessageVault(new RecordingMetricFactory(), new MemoryDeletedMessageMetadataVault(),
blobStore, blobStoreDAO, new BucketNameGenerator(clock), clock,
- VaultConfiguration.DEFAULT));
+ VaultConfiguration.ENABLED_DEFAULT));
InMemoryIntegrationResources inMemoryResource = InMemoryIntegrationResources.defaultResources();
mailboxManager = spy(inMemoryResource.getMailboxManager());
taskManager = new MemoryTaskManager(new Hostname("foo"));
JsonTransformer jsonTransformer = new JsonTransformer();
- RestoreService vaultRestore = new RestoreService(vault, mailboxManager, VaultConfiguration.DEFAULT);
+ RestoreService vaultRestore = new RestoreService(vault, mailboxManager, VaultConfiguration.ENABLED_DEFAULT);
blobExporting = spy(new NoopBlobExporting());
zipper = new DeletedMessageZipper();
exportService = new ExportService(blobExporting, blobStore, zipper, vault);
diff --git a/upgrade-instructions.md b/upgrade-instructions.md
index d05cae0ccc..d57977ade5 100644
--- a/upgrade-instructions.md
+++ b/upgrade-instructions.md
@@ -19,6 +19,23 @@ Change list:
- [Adding authorized_users column to user table](#adding-authorized_users-column-to-user-table)
- [Migration to Cassandra driver 4](#migration-to-cassandra-driver-4)
- [Migration to OpenSearch](#migration-to-opensearch)
+- [Deleted message vault is now deactivated by default](#deleted-message-vault-is-now-deactivated-by-default)
+
+### Deleted message vault is now deactivated by default
+
+Date: 13/09/2022
+
+Concerned products: Distributed James, Cassandra James
+
+In order to limit Cassandra table count, amongst others, the deleted message vault is now
+disabled by default.
+
+Users relying on it needs to enable it within `deletedMessageVault.properties` with the following
+property:
+
+```
+enabled=true
+```
### Removal of cassandra.properties chunk.size.message.read
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org