[jira] [Created] (JAMES-2735) Add new mailet and matcher that uses the headers and the per recipients
Simon Levesque created JAMES-2735: - Summary: Add new mailet and matcher that uses the headers and the per recipients Key: JAMES-2735 URL: https://issues.apache.org/jira/browse/JAMES-2735 Project: James Server Issue Type: New Feature Components: Matchers/Mailets (bundled) Affects Versions: 3.3.0 Reporter: Simon Levesque Currently, the RemoveHeader and HasHeader components are only acting on the global ones; not the per recipient ones. Need to create: - RemoveHeaderGlobalAndPerRecipient - HasHeaderGlobalAndPerRecipient -- This message was sent by Atlassian JIRA (v7.6.3#76005) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[jira] [Commented] (JAMES-2735) Add new mailet and matcher that uses the headers and the per recipients
[ https://issues.apache.org/jira/browse/JAMES-2735?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16820968#comment-16820968 ] Simon Levesque commented on JAMES-2735: --- as discussed, I will do a pull request with these: - https://github.com/foilen/james-extra-components/blob/master/src/main/java/com/foilen/james/components/mailet/RemoveHeaderGlobalAndSpecific.java -- https://github.com/foilen/james-extra-components/blob/master/src/test/java/com/foilen/james/components/mailet/RemoveHeaderGlobalAndSpecificTest.java - https://github.com/foilen/james-extra-components/blob/master/src/main/java/com/foilen/james/components/matcher/HasHeaderGlobalAndSpecific.java -- https://github.com/foilen/james-extra-components/blob/master/src/test/java/com/foilen/james/components/matcher/HasHeaderGlobalAndSpecificTest.java > Add new mailet and matcher that uses the headers and the per recipients > --- > > Key: JAMES-2735 > URL: https://issues.apache.org/jira/browse/JAMES-2735 > Project: James Server > Issue Type: New Feature > Components: Matchers/Mailets (bundled) >Affects Versions: 3.3.0 >Reporter: Simon Levesque >Priority: Minor > > Currently, the RemoveHeader and HasHeader components are only acting on the > global ones; not the per recipient ones. > Need to create: > - RemoveHeaderGlobalAndPerRecipient > - HasHeaderGlobalAndPerRecipient -- This message was sent by Atlassian JIRA (v7.6.3#76005) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[james-project] branch master updated (5560716 -> 6fb06d5)
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a change to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git. from 5560716 JAMES-2713 Add integration test for Delete API new 6c88dad JAMES-2721 using a @ClassRule for a singleton is pointless new 6fb06d5 JAMES-2721 provide a builder-like API for allowing Cassandra restart between tests The 2 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "add" were already present in the repository and have only been added to this reference. Summary of changes: .../cassandra/DockerCassandraRestartRule.java | 30 - .../backends/cassandra/DockerCassandraRule.java| 11 .../backend/rabbitmq/DockerRabbitMQTestRule.java | 31 -- .../cassandra/CassandraCombinationManagerTest.java | 7 + .../CassandraMailboxManagerStressTest.java | 7 + .../CassandraMessageIdManagerQuotaTest.java| 7 + .../CassandraMessageIdManagerSideEffectTest.java | 7 + .../CassandraMessageIdManagerStorageTest.java | 7 + .../CassandraSubscriptionManagerTest.java | 7 + .../mail/CassandraAnnotationMapperTest.java| 7 + .../mail/CassandraAttachmentMapperTest.java| 7 + .../mail/CassandraGenericMailboxMapperTest.java| 7 + .../CassandraMailboxManagerAttachmentTest.java | 7 + .../mail/CassandraMailboxMapperAclTest.java| 7 + .../cassandra/mail/CassandraMailboxMapperTest.java | 7 + .../mail/CassandraMessageIdMapperTest.java | 7 + .../cassandra/mail/CassandraMessageMapperTest.java | 7 + .../cassandra/mail/CassandraMessageMoveTest.java | 7 + .../CassandraMessageWithAttachmentMapperTest.java | 7 + .../quota/CassandraCurrentQuotaManagerTest.java| 7 + .../quota/CassandraPerUserMaxQuotaManagerTest.java | 7 + .../user/CassandraSubscriptionMapperTest.java | 7 + .../cassandra/CassandraAuthenticatePlainTest.java | 5 ++-- .../cassandra/CassandraAuthenticatedStateTest.java | 5 ++-- .../cassandra/CassandraConcurrentSessionsTest.java | 5 ++-- .../cassandra/CassandraCondstoreTest.java | 5 ++-- .../imapmailbox/cassandra/CassandraCopyTest.java | 5 ++-- .../imapmailbox/cassandra/CassandraEventsTest.java | 5 ++-- .../cassandra/CassandraExpungeTest.java| 5 ++-- .../cassandra/CassandraFetchBodySectionTest.java | 5 ++-- .../cassandra/CassandraFetchBodyStructureTest.java | 5 ++-- .../cassandra/CassandraFetchHeadersTest.java | 5 ++-- .../imapmailbox/cassandra/CassandraFetchTest.java | 5 ++-- .../cassandra/CassandraListingTest.java| 5 ++-- .../cassandra/CassandraListingWithSharingTest.java | 5 ++-- .../cassandra/CassandraMailboxAnnotationTest.java | 5 ++-- .../CassandraMailboxWithLongNameErrorTest.java | 5 ++-- .../imapmailbox/cassandra/CassandraMoveTest.java | 5 ++-- .../CassandraNonAuthenticatedStateTest.java| 5 ++-- .../cassandra/CassandraPartialFetchTest.java | 5 ++-- .../imapmailbox/cassandra/CassandraQuotaTest.java | 5 ++-- .../imapmailbox/cassandra/CassandraRenameTest.java | 5 ++-- .../imapmailbox/cassandra/CassandraSearchTest.java | 5 ++-- .../cassandra/CassandraSecurityTest.java | 5 ++-- .../imapmailbox/cassandra/CassandraSelectTest.java | 5 ++-- .../cassandra/CassandraSelectedInboxTest.java | 5 ++-- .../cassandra/CassandraSelectedStateTest.java | 5 ++-- .../cassandra/CassandraUidSearchOnIndexTest.java | 5 ++-- .../cassandra/CassandraUidSearchTest.java | 5 ++-- .../cassandra/CassandraUserFlagsSupportTest.java | 5 ++-- .../rabbitmq/RabbitMQAuthenticatePlainTest.java| 5 ++-- .../rabbitmq/RabbitMQAuthenticatedStateTest.java | 5 ++-- .../rabbitmq/RabbitMQConcurrentSessionsTest.java | 5 ++-- .../rabbitmq/RabbitMQCondstoreTest.java| 5 ++-- .../mpt/imapmailbox/rabbitmq/RabbitMQCopyTest.java | 5 ++-- .../imapmailbox/rabbitmq/RabbitMQEventsTest.java | 5 ++-- .../rabbitmq/RabbitMQFetchBodySectionTest.java | 5 ++-- .../rabbitmq/RabbitMQFetchBodyStructureTest.java | 5 ++-- .../rabbitmq/RabbitMQFetchHeadersTest.java | 5 ++-- .../imapmailbox/rabbitmq/RabbitMQFetchTest.java| 5 ++-- .../imapmailbox/rabbitmq/RabbitMQListingTest.java | 5 ++-- .../rabbitmq/RabbitMQListingWithSharingTest.java | 5 ++-- .../rabbitmq/RabbitMQMailboxAnnotationTest.java| 5 ++-- .../RabbitMQMailboxWithLongNameErrorTest.java | 5 ++-- .../mpt/imapmailbox/rabbitmq/RabbitMQMoveTest.java | 5 ++-- .../RabbitMQNonAuthenticatedStateTest.java | 5 ++-- .../rabbitmq/RabbitMQPartialFetchTest.java | 5 ++-- .../imapmailbox/rabbitmq/RabbitMQQuotaTest.java| 5 ++-- .../imapmailbox/rabbitmq/RabbitMQRenameTest.ja
[james-project] 02/02: JAMES-2721 provide a builder-like API for allowing Cassandra restart between tests
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git commit 6fb06d544a26551a62dfa973fa10aa0acc78fc12 Author: Matthieu Baechler AuthorDate: Fri Apr 12 14:55:59 2019 +0200 JAMES-2721 provide a builder-like API for allowing Cassandra restart between tests --- .../cassandra/DockerCassandraRestartRule.java | 30 - .../backends/cassandra/DockerCassandraRule.java| 11 .../backend/rabbitmq/DockerRabbitMQTestRule.java | 31 -- .../cassandra/CassandraCombinationManagerTest.java | 6 + .../CassandraMailboxManagerStressTest.java | 6 + .../CassandraMessageIdManagerQuotaTest.java| 6 + .../CassandraMessageIdManagerSideEffectTest.java | 6 + .../CassandraMessageIdManagerStorageTest.java | 6 + .../CassandraSubscriptionManagerTest.java | 6 + .../mail/CassandraAnnotationMapperTest.java| 6 + .../mail/CassandraAttachmentMapperTest.java| 6 + .../mail/CassandraGenericMailboxMapperTest.java| 6 + .../CassandraMailboxManagerAttachmentTest.java | 6 + .../mail/CassandraMailboxMapperAclTest.java| 6 + .../cassandra/mail/CassandraMailboxMapperTest.java | 6 + .../mail/CassandraMessageIdMapperTest.java | 6 + .../cassandra/mail/CassandraMessageMapperTest.java | 6 + .../cassandra/mail/CassandraMessageMoveTest.java | 6 + .../CassandraMessageWithAttachmentMapperTest.java | 6 + .../quota/CassandraCurrentQuotaManagerTest.java| 6 + .../quota/CassandraPerUserMaxQuotaManagerTest.java | 6 + .../user/CassandraSubscriptionMapperTest.java | 6 + .../cassandra/CassandraAuthenticatePlainTest.java | 2 +- .../cassandra/CassandraAuthenticatedStateTest.java | 2 +- .../cassandra/CassandraConcurrentSessionsTest.java | 2 +- .../cassandra/CassandraCondstoreTest.java | 2 +- .../imapmailbox/cassandra/CassandraCopyTest.java | 2 +- .../imapmailbox/cassandra/CassandraEventsTest.java | 2 +- .../cassandra/CassandraExpungeTest.java| 2 +- .../cassandra/CassandraFetchBodySectionTest.java | 2 +- .../cassandra/CassandraFetchBodyStructureTest.java | 2 +- .../cassandra/CassandraFetchHeadersTest.java | 2 +- .../imapmailbox/cassandra/CassandraFetchTest.java | 2 +- .../cassandra/CassandraListingTest.java| 2 +- .../cassandra/CassandraListingWithSharingTest.java | 2 +- .../cassandra/CassandraMailboxAnnotationTest.java | 2 +- .../CassandraMailboxWithLongNameErrorTest.java | 2 +- .../imapmailbox/cassandra/CassandraMoveTest.java | 2 +- .../CassandraNonAuthenticatedStateTest.java| 2 +- .../cassandra/CassandraPartialFetchTest.java | 2 +- .../imapmailbox/cassandra/CassandraQuotaTest.java | 2 +- .../imapmailbox/cassandra/CassandraRenameTest.java | 2 +- .../imapmailbox/cassandra/CassandraSearchTest.java | 2 +- .../cassandra/CassandraSecurityTest.java | 2 +- .../imapmailbox/cassandra/CassandraSelectTest.java | 2 +- .../cassandra/CassandraSelectedInboxTest.java | 2 +- .../cassandra/CassandraSelectedStateTest.java | 2 +- .../cassandra/CassandraUidSearchOnIndexTest.java | 2 +- .../cassandra/CassandraUidSearchTest.java | 2 +- .../cassandra/CassandraUserFlagsSupportTest.java | 2 +- .../rabbitmq/RabbitMQAuthenticatePlainTest.java| 2 +- .../rabbitmq/RabbitMQAuthenticatedStateTest.java | 2 +- .../rabbitmq/RabbitMQConcurrentSessionsTest.java | 2 +- .../rabbitmq/RabbitMQCondstoreTest.java| 2 +- .../mpt/imapmailbox/rabbitmq/RabbitMQCopyTest.java | 2 +- .../imapmailbox/rabbitmq/RabbitMQEventsTest.java | 2 +- .../rabbitmq/RabbitMQFetchBodySectionTest.java | 2 +- .../rabbitmq/RabbitMQFetchBodyStructureTest.java | 2 +- .../rabbitmq/RabbitMQFetchHeadersTest.java | 2 +- .../imapmailbox/rabbitmq/RabbitMQFetchTest.java| 2 +- .../imapmailbox/rabbitmq/RabbitMQListingTest.java | 2 +- .../rabbitmq/RabbitMQListingWithSharingTest.java | 2 +- .../rabbitmq/RabbitMQMailboxAnnotationTest.java| 2 +- .../RabbitMQMailboxWithLongNameErrorTest.java | 2 +- .../mpt/imapmailbox/rabbitmq/RabbitMQMoveTest.java | 2 +- .../RabbitMQNonAuthenticatedStateTest.java | 2 +- .../rabbitmq/RabbitMQPartialFetchTest.java | 2 +- .../imapmailbox/rabbitmq/RabbitMQQuotaTest.java| 2 +- .../imapmailbox/rabbitmq/RabbitMQRenameTest.java | 2 +- .../imapmailbox/rabbitmq/RabbitMQSearchTest.java | 2 +- .../imapmailbox/rabbitmq/RabbitMQSecurityTest.java | 2 +- .../imapmailbox/rabbitmq/RabbitMQSelectTest.java | 2 +- .../rabbitmq/RabbitMQSelectedInboxTest.java| 2 +- .../rabbitmq/RabbitMQSelectedStateTest.java| 2 +- .../rabbitmq/RabbitMQUidSearchTest.java| 2 +- .../ra
[jira] [Commented] (JAMES-2709) [BlobSharingMechanism] LinShare implementation
[ https://issues.apache.org/jira/browse/JAMES-2709?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16820814#comment-16820814 ] Rene Cordier commented on JAMES-2709: - PR : https://github.com/linagora/james-project/pull/2310 > [BlobSharingMechanism] LinShare implementation > -- > > Key: JAMES-2709 > URL: https://issues.apache.org/jira/browse/JAMES-2709 > Project: James Server > Issue Type: New Feature >Reporter: Rene Cordier >Priority: Major > Fix For: 3.4.0 > > > Implement as a third-party software a BlobSharingMechanism that: > * Upload the file in the sharee workspace > * Shares it to the reciepient > Implement tests about it. -- This message was sent by Atlassian JIRA (v7.6.3#76005) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[jira] [Closed] (JAMES-2713) [Integration Tests] Webadmin delete and purge APIs
[ https://issues.apache.org/jira/browse/JAMES-2713?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Antoine Duprat closed JAMES-2713. - > [Integration Tests] Webadmin delete and purge APIs > -- > > Key: JAMES-2713 > URL: https://issues.apache.org/jira/browse/JAMES-2713 > Project: James Server > Issue Type: New Feature >Reporter: Rene Cordier >Priority: Major > Fix For: 3.4.0 > > > In cassandra and memory in `/server/protocols/jmap-integration-testing`, > write following tests to delete and purge mails from the supertrash feature. > Make sure as well to setup correctly guice bindings to prove that this new > feature integrates well into our system. > *Delete API* > {code} > Given an user with emails present in the vault > When admin is using delete with the message ID of one of those emails > Then the email should be deleted from user's vault > {code} > {code} > Given an user with emails present in the vault > When admin is using delete with the message ID that doesn't exist > Then no email should be deleted from user's vault > {code} > *Purge API* > {code} > Given an user with emails present in the vault matching a configured > retention policy > When admin is using purge > Then the emails matching the configured retention policy should be deleted > from user's vault > {code} > {code} > Given an user with emails present in the vault not matching a configured > retention policy > When admin is using purge > Then no emails should be deleted from user's vault > {code} > {code} > Given an user with no emails present in the vault > When admin is using purge > Then nothing should happen > {code} > {code} > Given two users with emails present in their vault matching a configured > retention policy > When admin is using purge > Then the emails matching the configured retention policy should be deleted > from both users' vault > {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[jira] [Resolved] (JAMES-2713) [Integration Tests] Webadmin delete and purge APIs
[ https://issues.apache.org/jira/browse/JAMES-2713?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Antoine Duprat resolved JAMES-2713. --- Resolution: Fixed merged > [Integration Tests] Webadmin delete and purge APIs > -- > > Key: JAMES-2713 > URL: https://issues.apache.org/jira/browse/JAMES-2713 > Project: James Server > Issue Type: New Feature >Reporter: Rene Cordier >Priority: Major > Fix For: 3.4.0 > > > In cassandra and memory in `/server/protocols/jmap-integration-testing`, > write following tests to delete and purge mails from the supertrash feature. > Make sure as well to setup correctly guice bindings to prove that this new > feature integrates well into our system. > *Delete API* > {code} > Given an user with emails present in the vault > When admin is using delete with the message ID of one of those emails > Then the email should be deleted from user's vault > {code} > {code} > Given an user with emails present in the vault > When admin is using delete with the message ID that doesn't exist > Then no email should be deleted from user's vault > {code} > *Purge API* > {code} > Given an user with emails present in the vault matching a configured > retention policy > When admin is using purge > Then the emails matching the configured retention policy should be deleted > from user's vault > {code} > {code} > Given an user with emails present in the vault not matching a configured > retention policy > When admin is using purge > Then no emails should be deleted from user's vault > {code} > {code} > Given an user with no emails present in the vault > When admin is using purge > Then nothing should happen > {code} > {code} > Given two users with emails present in their vault matching a configured > retention policy > When admin is using purge > Then the emails matching the configured retention policy should be deleted > from both users' vault > {code} -- This message was sent by Atlassian JIRA (v7.6.3#76005) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[jira] [Closed] (JAMES-2710) [WebAdmin DMRS Route] Purge API
[ https://issues.apache.org/jira/browse/JAMES-2710?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Antoine Duprat closed JAMES-2710. - > [WebAdmin DMRS Route] Purge API > --- > > Key: JAMES-2710 > URL: https://issues.apache.org/jira/browse/JAMES-2710 > Project: James Server > Issue Type: New Feature > Components: webadmin >Reporter: Rene Cordier >Priority: Major > Fix For: 3.4.0 > > > *API proposal* > {code:java} > POST /deletedMessages?action=purge > - 200 success > {"taskId":"1234-5678"} > {code} > * Define POST method in DeletedMessageVaultRoutes(#1024 (closed)) > * Using configuration retention to work with purge > Document that a CRON needs to be configured to call this endpoint in a > regular basis. -- This message was sent by Atlassian JIRA (v7.6.3#76005) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[jira] [Resolved] (JAMES-2710) [WebAdmin DMRS Route] Purge API
[ https://issues.apache.org/jira/browse/JAMES-2710?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Antoine Duprat resolved JAMES-2710. --- Resolution: Fixed merged > [WebAdmin DMRS Route] Purge API > --- > > Key: JAMES-2710 > URL: https://issues.apache.org/jira/browse/JAMES-2710 > Project: James Server > Issue Type: New Feature > Components: webadmin >Reporter: Rene Cordier >Priority: Major > Fix For: 3.4.0 > > > *API proposal* > {code:java} > POST /deletedMessages?action=purge > - 200 success > {"taskId":"1234-5678"} > {code} > * Define POST method in DeletedMessageVaultRoutes(#1024 (closed)) > * Using configuration retention to work with purge > Document that a CRON needs to be configured to call this endpoint in a > regular basis. -- This message was sent by Atlassian JIRA (v7.6.3#76005) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[james-project] 03/11: JAMES-2710 Add getDeleteByQueryExecutor() for easy spy memory-vault
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git commit 245146476040907231f58089dfe81b47fd625ee3 Author: datph AuthorDate: Fri Apr 5 11:54:05 2019 +0700 JAMES-2710 Add getDeleteByQueryExecutor() for easy spy memory-vault --- .../org/apache/james/vault/memory/MemoryDeletedMessagesVault.java | 8 +++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/MemoryDeletedMessagesVault.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/MemoryDeletedMessagesVault.java index 773faec..ecee56e 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/MemoryDeletedMessagesVault.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/memory/MemoryDeletedMessagesVault.java @@ -40,6 +40,7 @@ import org.apache.james.vault.utils.DeleteByQueryExecutor; import org.apache.james.vault.utils.VaultGarbageCollectionTask; import org.reactivestreams.Publisher; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.collect.HashBasedTable; import com.google.common.collect.ImmutableList; @@ -122,10 +123,15 @@ public class MemoryDeletedMessagesVault implements DeletedMessageVault { ZonedDateTime beginningOfRetentionPeriod = now.minus(retentionConfiguration.getRetentionPeriod()); return new VaultGarbageCollectionTask( -deleteByQueryExecutor, +getDeleteByQueryExecutor(), beginningOfRetentionPeriod); } +@VisibleForTesting +public DeleteByQueryExecutor getDeleteByQueryExecutor() { +return deleteByQueryExecutor; +} + private Flux listAll(User user) { synchronized (table) { return Flux.fromIterable(ImmutableList.copyOf(table.row(user).values())) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[james-project] 07/11: JAMES-2711 Add document for DeleteAPI of DMVRoutes
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git commit b8a1afec83db928ef20970d330d303ccbcd340dd Author: datph AuthorDate: Tue Apr 9 15:45:25 2019 +0700 JAMES-2711 Add document for DeleteAPI of DMVRoutes --- .../vault/routes/DeletedMessagesVaultRoutes.java | 15 +- src/site/markdown/server/manage-webadmin.md| 34 +++--- 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java index e2faa4c..37acd23 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java @@ -140,12 +140,11 @@ public class DeletedMessagesVaultRoutes implements Routes { public static final String ROOT_PATH = "deletedMessages"; public static final String USERS = "users"; -public static final String USER_PATH = ROOT_PATH + SEPARATOR + USERS; private static final String USER_PATH_PARAM = ":user"; static final String MESSAGE_PATH_PARAM = "messages"; private static final String MESSAGE_ID_PARAM = ":messageId"; -private static final String RESTORE_PATH = USER_PATH + SEPARATOR + USER_PATH_PARAM; -private static final String DELETE_PATH = USER_PATH + SEPARATOR + USER_PATH_PARAM + SEPARATOR + MESSAGE_PATH_PARAM + SEPARATOR + MESSAGE_ID_PARAM; +static final String USER_PATH = ROOT_PATH + SEPARATOR + USERS + SEPARATOR + USER_PATH_PARAM; +private static final String DELETE_PATH = ROOT_PATH + SEPARATOR + USERS + SEPARATOR + USER_PATH_PARAM + SEPARATOR + MESSAGE_PATH_PARAM + SEPARATOR + MESSAGE_ID_PARAM; private static final String SCOPE_QUERY_PARAM = "scope"; private static final String ACTION_QUERY_PARAM = "action"; private static final String EXPORT_TO_QUERY_PARAM = "exportTo"; @@ -183,14 +182,15 @@ public class DeletedMessagesVaultRoutes implements Routes { @Override public void define(Service service) { -service.post(RESTORE_PATH, this::userActions, jsonTransformer); +service.post(USER_PATH, this::userActions, jsonTransformer); service.delete(ROOT_PATH, this::deleteWithScope, jsonTransformer); service.delete(DELETE_PATH, this::deleteMessage, jsonTransformer); } @POST -@Path(USER_PATH) -@ApiOperation(value = "Restore deleted emails from a specified user to his new restore mailbox") +@Path("users/{user}") +@ApiOperation(value = "Restore deleted emails from a specified user to his new restore mailbox" + +" or export their content to a destination mail address") @ApiImplicitParams({ @ApiImplicitParam( required = true, @@ -231,7 +231,6 @@ public class DeletedMessagesVaultRoutes implements Routes { } @DELETE -@Path(ROOT_PATH) @ApiOperation(value = "Purge all expired messages based on retentionPeriod of deletedMessageVault configuration") @ApiImplicitParams({ @ApiImplicitParam( @@ -254,7 +253,7 @@ public class DeletedMessagesVaultRoutes implements Routes { } @DELETE -@Path(DELETE_PATH) +@Path("users/{user}/messages/{messageId}") @ApiOperation(value = "Delete message with messageId") @ApiImplicitParams({ @ApiImplicitParam( diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md index 98ef7fb..a1b9a4a 100644 --- a/src/site/markdown/server/manage-webadmin.md +++ b/src/site/markdown/server/manage-webadmin.md @@ -2644,6 +2644,7 @@ Here are the following actions available on the 'Deleted Messages Vault' - [Restore Deleted Messages](#Restore_deleted_messages) - [Export Deleted Messages](#Export_deleted_messages) - [Purge Deleted Messages](#Purge_deleted_messages) + - [Permanently remove Deleted Message](#Permanently_remove_deleted_message) Note that the 'Deleted Messages Vault' feature is only supported on top of Cassandra-Guice. @@ -2820,9 +2821,9 @@ while: ### Purge Deleted Messages -You can overwrite 'retentionPeriod' configuration in deletedMessageVault or use default value is 1 year. +You can overwrite 'retentionPeriod' configuration in 'deletedMessageVault' configuration file or use default value is 1 year. -Delete all expired deleted messages with 'retentionPeriod' configured. +Purge all deleted messages older than configured 'retentionPeriod' ``` curl -XDEL http://ip:port/deletedMessages?scope=ex
[james-project] 09/11: JAMES-2713 Change params config for RequestSpecification The params default update strategy is MERGE. So we will have conflict when request 2 webAdmin APIs in a testcase. We cha
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git commit 76336eb4bc97eaf1105ddb51ae6d5f5ec6bc3ce7 Author: datph AuthorDate: Thu Apr 11 18:23:44 2019 +0700 JAMES-2713 Change params config for RequestSpecification The params default update strategy is MERGE. So we will have conflict when request 2 webAdmin APIs in a testcase. We change params update strategy to REPLACE --- .../james/jmap/methods/integration/DeletedMessagesVaultTest.java | 6 +- .../src/test/java/org/apache/james/webadmin/WebAdminUtils.java | 7 ++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java index 6c76951..8ab9e11 100644 --- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java @@ -21,6 +21,7 @@ package org.apache.james.jmap.methods.integration; import static io.restassured.RestAssured.given; import static io.restassured.RestAssured.with; +import static io.restassured.config.ParamConfig.UpdateStrategy.REPLACE; import static org.apache.james.jmap.HttpJmapAuthentication.authenticateJamesUser; import static org.apache.james.jmap.JmapCommonRequests.getLastMessageId; import static org.apache.james.jmap.JmapCommonRequests.getOutboxId; @@ -73,6 +74,7 @@ import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import io.restassured.RestAssured; +import io.restassured.config.ParamConfig; import io.restassured.parsing.Parser; import io.restassured.specification.RequestSpecification; @@ -164,7 +166,9 @@ public abstract class DeletedMessagesVaultTest { homerAccessToken = authenticateJamesUser(baseUri(jmapServer), HOMER, PASSWORD); bartAccessToken = authenticateJamesUser(baseUri(jmapServer), BART, BOB_PASSWORD); -webAdminApi = WebAdminUtils.spec(jmapServer.getProbe(WebAdminGuiceProbe.class).getWebAdminPort()); +webAdminApi = WebAdminUtils.spec(jmapServer.getProbe(WebAdminGuiceProbe.class).getWebAdminPort()) +.config(WebAdminUtils.defaultConfig() +.paramConfig(new ParamConfig(REPLACE, REPLACE, REPLACE))); } @After diff --git a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java index a2c3a2a..b5a02fa 100644 --- a/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java +++ b/server/protocols/webadmin/webadmin-core/src/test/java/org/apache/james/webadmin/WebAdminUtils.java @@ -34,6 +34,7 @@ import org.apache.james.webadmin.authentication.NoAuthenticationFilter; import com.github.steveash.guavate.Guavate; import io.restassured.builder.RequestSpecBuilder; +import io.restassured.config.RestAssuredConfig; import io.restassured.http.ContentType; import io.restassured.specification.RequestSpecification; @@ -68,10 +69,14 @@ public class WebAdminUtils { return new RequestSpecBuilder() .setContentType(ContentType.JSON) .setAccept(ContentType.JSON) - .setConfig(newConfig().encoderConfig(encoderConfig().defaultContentCharset(StandardCharsets.UTF_8))) +.setConfig(defaultConfig()) .setPort(port.getValue()); } +public static RestAssuredConfig defaultConfig() { +return newConfig().encoderConfig(encoderConfig().defaultContentCharset(StandardCharsets.UTF_8)); +} + public static RequestSpecification spec(Port port) { return given().spec(buildRequestSpecification(port).build()); } - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[james-project] 11/11: JAMES-2713 Add integration test for Delete API
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git commit 556071622272b41f6bdc5066d3720fa5cf87a1eb Author: datph AuthorDate: Wed Apr 17 15:15:40 2019 +0700 JAMES-2713 Add integration test for Delete API --- .../integration/DeletedMessagesVaultTest.java | 82 ++ 1 file changed, 82 insertions(+) diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java index 7962379..8bf523f 100644 --- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java @@ -688,6 +688,75 @@ public abstract class DeletedMessagesVaultTest { .hasSize(0); } +@Test +public void vaultDeleteShouldDeleteMessageThenExportWithNoEntry() throws Exception { +bartSendMessageToHomer(); +WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1); + +String messageIdOfHomer = listMessageIdsForAccount(homerAccessToken).get(0); + +homerDeletesMessages(listMessageIdsForAccount(homerAccessToken)); +WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 0); + +deleteVault(HOMER, messageIdOfHomer); + +String fileLocation = exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, bartAccessToken); +try (ZipAssert zipAssert = assertThatZip(new FileInputStream(fileLocation))) { +zipAssert.hasNoEntry(); +} +} + +@Test +public void vaultDeleteShouldNotDeleteEmptyVaultThenExportNoEntry() throws Exception { +bartSendMessageToHomer(); +WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1); + +String messageIdOfHomer = listMessageIdsForAccount(homerAccessToken).get(0); + +deleteVault(HOMER, messageIdOfHomer); + +String fileLocation = exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, bartAccessToken); +try (ZipAssert zipAssert = assertThatZip(new FileInputStream(fileLocation))) { +zipAssert.hasNoEntry(); +} +} + +@Test +public void vaultDeleteShouldNotDeleteNotMatchedMessageInVaultThenExportAnEntry() throws Exception { +bartSendMessageToHomer(); +WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1); + +String messageIdOfBart = listMessageIdsForAccount(bartAccessToken).get(0); +String messageIdOfHomer = listMessageIdsForAccount(homerAccessToken).get(0); + +homerDeletesMessages(listMessageIdsForAccount(homerAccessToken)); +WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 0); + +deleteVault(HOMER, messageIdOfBart); + +String fileLocation = exportAndGetFileLocationFromLastMail(EXPORT_ALL_HOMER_MESSAGES_TO_BART, bartAccessToken); +try (ZipAssert zipAssert = assertThatZip(new FileInputStream(fileLocation))) { +zipAssert.hasEntriesSize(1) +.allSatisfies(entry -> entry.hasName(messageIdOfHomer + ".eml")); +} +} + +@Test +public void vaultDeleteShouldNotAppendMessageToTheUserMailbox() { +bartSendMessageToHomer(); +WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 1); + +String messageIdOfHomer = listMessageIdsForAccount(homerAccessToken).get(0); + +homerDeletesMessages(listMessageIdsForAccount(homerAccessToken)); +WAIT_TWO_MINUTES.until(() -> listMessageIdsForAccount(homerAccessToken).size() == 0); + +deleteVault(HOMER, messageIdOfHomer); + +assertThat(listMessageIdsForAccount(homerAccessToken)) +.hasSize(0); +} + private String exportAndGetFileLocationFromLastMail(ExportRequest exportRequest, AccessToken shareeAccessToken) { int currentNumberOfMessages = listMessageIdsForAccount(shareeAccessToken).size(); exportVaultContent(exportRequest); @@ -851,4 +920,17 @@ public abstract class DeletedMessagesVaultTest { .then() .body("status", is("completed")); } + +private void deleteVault(String user, String messageId) { +String taskId = +webAdminApi.with() +.delete("/deletedMessages/users/" + user + "/messages/" + messageId) +.jsonPath() +
[james-project] 02/11: JAMES-2710 Change ROOT_PATH of DeleteMessagesVaultRoutes
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git commit 18d0d766ce364b572e1efed3e90eff20ad56d024 Author: datph AuthorDate: Thu Apr 4 15:21:28 2019 +0700 JAMES-2710 Change ROOT_PATH of DeleteMessagesVaultRoutes --- .../vault/routes/DeletedMessagesVaultRoutes.java | 8 +- .../routes/DeletedMessagesVaultRoutesTest.java | 116 +++-- 2 files changed, 65 insertions(+), 59 deletions(-) diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java index c38bcda..32f5d2b 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java @@ -102,9 +102,11 @@ public class DeletedMessagesVaultRoutes implements Routes { } } -public static final String ROOT_PATH = "deletedMessages/users"; +public static final String ROOT_PATH = "deletedMessages"; +public static final String USERS = "users"; +public static final String USER_PATH = ROOT_PATH + SEPARATOR + USERS; private static final String USER_PATH_PARAM = "user"; -private static final String RESTORE_PATH = ROOT_PATH + SEPARATOR + ":" + USER_PATH_PARAM; +private static final String RESTORE_PATH = USER_PATH + SEPARATOR + ":" + USER_PATH_PARAM; private static final String ACTION_QUERY_PARAM = "action"; private static final String EXPORT_TO_QUERY_PARAM = "exportTo"; @@ -140,7 +142,7 @@ public class DeletedMessagesVaultRoutes implements Routes { } @POST -@Path(ROOT_PATH) +@Path(USER_PATH) @ApiOperation(value = "Restore deleted emails from a specified user to his new restore mailbox") @ApiImplicitParams({ @ApiImplicitParam( 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 713ddc9..db166b0 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 @@ -34,7 +34,10 @@ import static org.apache.james.vault.DeletedMessageFixture.SUBJECT; import static org.apache.james.vault.DeletedMessageFixture.USER; import static org.apache.james.vault.DeletedMessageFixture.USER_2; import static org.apache.james.vault.DeletedMessageVaultSearchContract.MESSAGE_ID_GENERATOR; +import static org.apache.james.webadmin.Constants.SEPARATOR; import static org.apache.james.webadmin.WebAdminServer.NO_CONFIGURATION; +import static org.apache.james.webadmin.vault.routes.DeletedMessagesVaultRoutes.USERS; +import static org.apache.james.webadmin.vault.routes.DeletedMessagesVaultRoutes.USER_PATH; import static org.apache.james.webadmin.vault.routes.RestoreService.RESTORE_MAILBOX_NAME; import static org.apache.mailet.base.MailAddressFixture.RECIPIENT1; import static org.apache.mailet.base.MailAddressFixture.RECIPIENT2; @@ -135,6 +138,7 @@ class DeletedMessagesVaultRoutesTest { "\"criteria\": []" + "}"; private static final Domain DOMAIN = Domain.of("apache.org"); +private static final String BOB_PATH = USERS + SEPARATOR + USER.asString(); private WebAdminServer webAdminServer; private MemoryDeletedMessagesVault vault; @@ -206,7 +210,7 @@ class DeletedMessagesVaultRoutesTest { @Test void userVaultAPIShouldReturnInvalidWhenActionIsMissing() { when() -.post(USER.asString()) +.post(BOB_PATH) .then() .statusCode(HttpStatus.BAD_REQUEST_400) .body("statusCode", is(400)) @@ -220,7 +224,7 @@ class DeletedMessagesVaultRoutesTest { given() .queryParam("action", "") .when() -.post(USER.asString()) +.post(BOB_PATH) .then() .statusCode(HttpStatus.BAD_REQUEST_400) .body("statusCode", is(400)) @@ -234,7 +238,7 @@ class DeletedMessagesVaultRoutesTest { given() .queryParam("action", "invalid action") .when() -
[james-project] branch master updated (8d008f5 -> 5560716)
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a change to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git. from 8d008f5 JAMES-2714 Link configuration details to howTo new 6189ecd JAMES-2710 Rename VaultAction to support purge action new 18d0d76 JAMES-2710 Change ROOT_PATH of DeleteMessagesVaultRoutes new 2451464 JAMES-2710 Add getDeleteByQueryExecutor() for easy spy memory-vault new 9a97b6a JAMES-2710 Add Purge API to DeletedMessagesVaultRoutes new c8f84a8 JAMES-2710 Document Purge API new 0980816 JAMES-2711 Add DeleteAPI to DeletedMessageVaultRoutes new b8a1afe JAMES-2711 Add document for DeleteAPI of DMVRoutes new 0957eec JAMES-2713 Move UpdatableTickingClock to server-testing for using in other modules new 76336eb JAMES-2713 Change params config for RequestSpecification The params default update strategy is MERGE. So we will have conflict when request 2 webAdmin APIs in a testcase. We change params update strategy to REPLACE new ae48fba JAMES-2713 Add integration test for Purge API new 5560716 JAMES-2713 Add integration test for Delete API The 11 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "add" were already present in the repository and have only been added to this reference. Summary of changes: .../vault/memory/MemoryDeletedMessagesVault.java | 8 +- .../vault/utils/VaultGarbageCollectionTask.java| 2 +- .../CassandraDeletedMessageVaultTest.java | 6 +- .../integration/DeletedMessagesVaultTest.java | 198 +++- ...FileMailRepositoryDeletedMessagesVaultTest.java | 6 +- .../memory/MemoryDeletedMessagesVaultTest.java | 6 +- .../rabbitmq/RabbitMQDeletedMessagesVaultTest.java | 6 +- .../org/apache/james/webadmin/WebAdminUtils.java | 7 +- .../routes/DeletedMessagesVaultDeleteTask.java | 62 ++- .../vault/routes/DeletedMessagesVaultRoutes.java | 209 +++- .../routes/DeletedMessagesVaultRoutesTest.java | 545 ++--- .../RabbitMQMailQueueConfigurationChangeTest.java | 1 + .../queue/rabbitmq/RabbitMQMailQueueTest.java | 1 + .../apache/james/utils}/UpdatableTickingClock.java | 10 +- src/site/markdown/server/manage-webadmin.md| 50 ++ 15 files changed, 980 insertions(+), 137 deletions(-) copy mailbox/tools/indexer/src/main/java/org/apache/mailbox/tools/indexer/UserReindexingTask.java => server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java (53%) rename server/{queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq => testing/src/main/java/org/apache/james/utils}/UpdatableTickingClock.java (89%) - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[james-project] 06/11: JAMES-2711 Add DeleteAPI to DeletedMessageVaultRoutes
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git commit 0980816d7dc2a0c35d8c3c3d41bbc33148379b27 Author: datph AuthorDate: Mon Apr 8 16:34:50 2019 +0700 JAMES-2711 Add DeleteAPI to DeletedMessageVaultRoutes --- .../routes/DeletedMessagesVaultDeleteTask.java | 84 + .../vault/routes/DeletedMessagesVaultRoutes.java | 58 ++- .../routes/DeletedMessagesVaultRoutesTest.java | 191 - 3 files changed, 329 insertions(+), 4 deletions(-) diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java new file mode 100644 index 000..9c886c5 --- /dev/null +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultDeleteTask.java @@ -0,0 +1,84 @@ +/ + * Licensed to the Apache Software Foundation (ASF) under one * + * or more contributor license agreements. See the NOTICE file * + * distributed with this work for additional information* + * regarding copyright ownership. The ASF licenses this file * + * to you under the Apache License, Version 2.0 (the* + * "License"); you may not use this file except in compliance * + * with the License. You may obtain a copy of the License at * + * * + * http://www.apache.org/licenses/LICENSE-2.0 * + * * + * Unless required by applicable law or agreed to in writing, * + * software distributed under the License is distributed on an * + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * + * KIND, either express or implied. See the License for the* + * specific language governing permissions and limitations * + * under the License. * + / + +package org.apache.james.webadmin.vault.routes; + +import java.util.Optional; + +import org.apache.james.core.User; +import org.apache.james.mailbox.model.MessageId; +import org.apache.james.task.Task; +import org.apache.james.task.TaskExecutionDetails; +import org.apache.james.vault.DeletedMessageVault; + +import reactor.core.publisher.Mono; + +public class DeletedMessagesVaultDeleteTask implements Task { + +public class AdditionalInformation implements TaskExecutionDetails.AdditionalInformation { + +private final User user; +private final MessageId deleteMessageId; + +AdditionalInformation(User user, MessageId deleteMessageId) { +this.user = user; +this.deleteMessageId = deleteMessageId; +} + +public String getUser() { +return user.asString(); +} + +public String getDeleteMessageId() { +return deleteMessageId.serialize(); +} +} + +static final String TYPE = "deletedMessages/delete"; + +private final DeletedMessageVault vault; +private final User user; +private final MessageId messageId; + +DeletedMessagesVaultDeleteTask(DeletedMessageVault vault, User user, MessageId messageId) { +this.vault = vault; +this.user = user; +this.messageId = messageId; +} + +@Override +public Result run() { +return Mono.from(vault.delete(user, messageId)) +.doOnError(e -> LOGGER.error("Error while deleting message {} for user {} in DeletedMessageVault: {}", messageId, user, e)) +.thenReturn(Result.COMPLETED) +.blockOptional() +.orElse(Result.PARTIAL); +} + +@Override +public String type() { +return TYPE; +} + +@Override +public Optional details() { +return Optional.of(new AdditionalInformation(user, messageId)); +} + +} diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java index 50f483e..e2faa4c 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java @@ -37,6 +37,7 @@ import org.apache.commons.
[james-project] 04/11: JAMES-2710 Add Purge API to DeletedMessagesVaultRoutes
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git commit 9a97b6a5f4f0498495431f83815b5c65d2bf9d85 Author: datph AuthorDate: Fri Apr 5 11:55:03 2019 +0700 JAMES-2710 Add Purge API to DeletedMessagesVaultRoutes --- .../vault/utils/VaultGarbageCollectionTask.java| 2 +- .../vault/routes/DeletedMessagesVaultRoutes.java | 130 +-- .../routes/DeletedMessagesVaultRoutesTest.java | 240 - 3 files changed, 357 insertions(+), 15 deletions(-) diff --git a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/utils/VaultGarbageCollectionTask.java b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/utils/VaultGarbageCollectionTask.java index 36170f3..5a55c80 100644 --- a/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/utils/VaultGarbageCollectionTask.java +++ b/mailbox/plugin/deleted-messages-vault/src/main/java/org/apache/james/vault/utils/VaultGarbageCollectionTask.java @@ -65,7 +65,7 @@ public class VaultGarbageCollectionTask implements Task { } } -private static final String TYPE = "deletedMessages/garbageCollection"; +public static final String TYPE = "deletedMessages/garbageCollection"; private final DeleteByQueryExecutor deleteByQueryExecutor; private final DeleteByQueryExecutor.Notifiers notifiers; diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java index 32f5d2b..50f483e 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java @@ -23,10 +23,12 @@ import static org.apache.james.webadmin.Constants.SEPARATOR; import java.util.List; import java.util.Optional; +import java.util.function.Function; import java.util.stream.Stream; import javax.inject.Inject; import javax.mail.internet.AddressException; +import javax.ws.rs.DELETE; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; @@ -40,6 +42,7 @@ import org.apache.james.task.TaskId; import org.apache.james.task.TaskManager; import org.apache.james.user.api.UsersRepository; import org.apache.james.user.api.UsersRepositoryException; +import org.apache.james.vault.DeletedMessageVault; import org.apache.james.vault.search.Query; import org.apache.james.webadmin.Constants; import org.apache.james.webadmin.Routes; @@ -63,6 +66,7 @@ import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; +import spark.HaltException; import spark.Request; import spark.Response; import spark.Service; @@ -85,7 +89,8 @@ public class DeletedMessagesVaultRoutes implements Routes { .findFirst(); } -private static List plainValues() { +@VisibleForTesting +static List plainValues() { return Stream.of(values()) .map(VaultAction::getValue) .collect(Guavate.toImmutableList()); @@ -102,16 +107,51 @@ public class DeletedMessagesVaultRoutes implements Routes { } } +enum VaultScope { +EXPIRED("expired"); + +static Optional getScope(String value) { +Preconditions.checkNotNull(value, "scope cannot be null"); +Preconditions.checkArgument(StringUtils.isNotBlank(value), "scope cannot be empty or blank"); + +return Stream.of(values()) +.filter(action -> action.value.equals(value)) +.findFirst(); +} + +@VisibleForTesting +static List plainValues() { +return Stream.of(values()) +.map(VaultScope::getValue) +.collect(Guavate.toImmutableList()); +} + +private final String value; + +VaultScope(String value) { +this.value = value; +} + +public String getValue() { +return value; +} +} + public static final String ROOT_PATH = "deletedMessages"; public static final String USERS = "users"; public static final String USER_PATH = ROOT_PATH + SEPARATOR + USERS; -private static final String USER_PATH_PARAM = "user"; -private static final String RESTORE_PATH = USER_PATH + SEPARATOR + ":" + USER_PATH_PARAM; +private static final String USER_PATH_PARAM = ":user"; +static final S
[james-project] 10/11: JAMES-2713 Add integration test for Purge API
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git commit ae48fba707fd43de180ce57fab4f2735bf723358 Author: datph AuthorDate: Thu Apr 11 18:27:25 2019 +0700 JAMES-2713 Add integration test for Purge API --- .../CassandraDeletedMessageVaultTest.java | 6 +- .../integration/DeletedMessagesVaultTest.java | 110 - ...FileMailRepositoryDeletedMessagesVaultTest.java | 6 +- .../memory/MemoryDeletedMessagesVaultTest.java | 6 +- .../rabbitmq/RabbitMQDeletedMessagesVaultTest.java | 6 +- 5 files changed, 122 insertions(+), 12 deletions(-) diff --git a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java index 9cbc0ec..b3c0a99 100644 --- a/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java +++ b/server/protocols/jmap-integration-testing/cassandra-jmap-integration-testing/src/test/java/org/apache/james/jmap/cassandra/CassandraDeletedMessageVaultTest.java @@ -20,6 +20,7 @@ package org.apache.james.jmap.cassandra; import java.io.IOException; +import java.time.Clock; import org.apache.james.CassandraJmapTestRule; import org.apache.james.DockerCassandraRule; @@ -43,7 +44,7 @@ public class CassandraDeletedMessageVaultTest extends DeletedMessagesVaultTest { public CassandraJmapTestRule rule = CassandraJmapTestRule.defaultTestRule(); @Override -protected GuiceJamesServer createJmapServer(FileSystem fileSystem) throws IOException { +protected GuiceJamesServer createJmapServer(FileSystem fileSystem, Clock clock) throws IOException { return rule.jmapServer(cassandra.getModule(), binder -> binder.bind(PreDeletionHooksConfiguration.class) .toInstance(PreDeletionHooksConfiguration.forHooks( @@ -51,7 +52,8 @@ public class CassandraDeletedMessageVaultTest extends DeletedMessagesVaultTest { binder -> binder.bind(WebAdminConfiguration.class).toInstance(WebAdminConfiguration.TEST_CONFIGURATION), binder -> binder.bind(MailRepositoryDeletedMessageVault.Configuration.class) .toInstance(new MailRepositoryDeletedMessageVault.Configuration(MailRepositoryUrl.from("cassandra://var/deletedMessages/user"))), -binder -> binder.bind(FileSystem.class).toInstance(fileSystem)); +binder -> binder.bind(FileSystem.class).toInstance(fileSystem), +binder -> binder.bind(Clock.class).toInstance(clock)); } @Override diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java index 8ab9e11..7962379 100644 --- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java +++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/DeletedMessagesVaultTest.java @@ -40,6 +40,9 @@ import static org.hamcrest.Matchers.is; import java.io.FileInputStream; import java.io.IOException; +import java.time.Clock; +import java.time.Instant; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.stream.Collectors; @@ -59,6 +62,7 @@ import org.apache.james.server.core.filesystem.FileSystemImpl; import org.apache.james.utils.DataProbeImpl; import org.apache.james.utils.IMAPMessageReader; import org.apache.james.utils.JmapGuiceProbe; +import org.apache.james.utils.UpdatableTickingClock; import org.apache.james.utils.WebAdminGuiceProbe; import org.apache.james.webadmin.WebAdminUtils; import org.awaitility.Duration; @@ -110,6 +114,8 @@ public abstract class DeletedMessagesVaultTest { } } +private static final Instant NOW = Instant.now(); +private static final Instant ONE_DAY_AFTER_ONE_YEAR_EXPIRATION = NOW.plus(366, ChronoUnit.DAYS); private static final String FIRST_SUBJECT = "first subject"; private static final String SECOND_SUBJECT = "second subject"; private static final String HOMER = "homer@" + DOMAIN; @@ -130,7 +136,7 @@ public abstract class DeletedMessagesVaultTest { private MailboxId otherMailboxId; -protected abstract GuiceJamesServer createJmapServer(FileSystem fileSystem) throws IOException; +protecte
[james-project] 05/11: JAMES-2710 Document Purge API
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git commit c8f84a8a5b769eef9b0859fb22fa0f17238fc639 Author: datph AuthorDate: Fri Apr 5 16:43:19 2019 +0700 JAMES-2710 Document Purge API --- src/site/markdown/server/manage-webadmin.md | 24 1 file changed, 24 insertions(+) diff --git a/src/site/markdown/server/manage-webadmin.md b/src/site/markdown/server/manage-webadmin.md index da75144..98ef7fb 100644 --- a/src/site/markdown/server/manage-webadmin.md +++ b/src/site/markdown/server/manage-webadmin.md @@ -2643,6 +2643,7 @@ Here are the following actions available on the 'Deleted Messages Vault' - [Restore Deleted Messages](#Restore_deleted_messages) - [Export Deleted Messages](#Export_deleted_messages) + - [Purge Deleted Messages](#Purge_deleted_messages) Note that the 'Deleted Messages Vault' feature is only supported on top of Cassandra-Guice. @@ -2816,6 +2817,29 @@ while: - userExportFrom: export deleted messages from this user - exportTo: content of deleted messages have been shared to this mail address - totalExportedMessages: number of deleted messages match with json query, then being shared to sharee + +### Purge Deleted Messages + +You can overwrite 'retentionPeriod' configuration in deletedMessageVault or use default value is 1 year. + +Delete all expired deleted messages with 'retentionPeriod' configured. + +``` +curl -XDEL http://ip:port/deletedMessages?scope=expired +``` + +Response code: + + - 201: Task for purging has been created + - 400: Bad request: + - action query param is not present + - action query param is not a valid action + +You may want to call this endpoint on a regular basis. Example: + +``` +0 0 * * * /usr/bin/curl --request POST http://ip:port/deletedMessages?action=purge >/dev/null 2>&1 +``` ## Task management - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[james-project] 08/11: JAMES-2713 Move UpdatableTickingClock to server-testing for using in other modules
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git commit 0957eec827440f777fc99728b10cd08c646b2a75 Author: datph AuthorDate: Wed Apr 17 14:35:52 2019 +0700 JAMES-2713 Move UpdatableTickingClock to server-testing for using in other modules --- .../rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java | 1 + .../org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java | 1 + .../java/org/apache/james/utils}/UpdatableTickingClock.java| 10 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java index 46dfdbe..c4fe56f 100644 --- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java +++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueConfigurationChangeTest.java @@ -53,6 +53,7 @@ import org.apache.james.queue.rabbitmq.view.cassandra.CassandraMailQueueViewModu import org.apache.james.queue.rabbitmq.view.cassandra.CassandraMailQueueViewTestFactory; import org.apache.james.queue.rabbitmq.view.cassandra.configuration.CassandraMailQueueViewConfiguration; import org.apache.james.util.streams.Iterators; +import org.apache.james.utils.UpdatableTickingClock; import org.apache.mailet.Mail; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java index dd9b53d..c636b9d 100644 --- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java +++ b/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/RabbitMQMailQueueTest.java @@ -54,6 +54,7 @@ import org.apache.james.queue.rabbitmq.view.cassandra.CassandraMailQueueViewModu import org.apache.james.queue.rabbitmq.view.cassandra.CassandraMailQueueViewTestFactory; import org.apache.james.queue.rabbitmq.view.cassandra.configuration.CassandraMailQueueViewConfiguration; import org.apache.james.util.streams.Iterators; +import org.apache.james.utils.UpdatableTickingClock; import org.apache.mailet.Mail; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/UpdatableTickingClock.java b/server/testing/src/main/java/org/apache/james/utils/UpdatableTickingClock.java similarity index 89% rename from server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/UpdatableTickingClock.java rename to server/testing/src/main/java/org/apache/james/utils/UpdatableTickingClock.java index fca8022..2db26c7 100644 --- a/server/queue/queue-rabbitmq/src/test/java/org/apache/james/queue/rabbitmq/UpdatableTickingClock.java +++ b/server/testing/src/main/java/org/apache/james/utils/UpdatableTickingClock.java @@ -17,7 +17,7 @@ * under the License. * / -package org.apache.james.queue.rabbitmq; +package org.apache.james.utils; import java.time.Clock; import java.time.Instant; @@ -25,14 +25,14 @@ import java.time.ZoneId; import org.apache.commons.lang3.NotImplementedException; -class UpdatableTickingClock extends Clock { +public class UpdatableTickingClock extends Clock { private Instant currentInstant; -UpdatableTickingClock(Instant currentInstant) { +public UpdatableTickingClock(Instant currentInstant) { this.currentInstant = currentInstant; } -void setInstant(Instant instant) { +public void setInstant(Instant instant) { currentInstant = instant; } @@ -51,7 +51,7 @@ class UpdatableTickingClock extends Clock { return currentInstant; } -synchronized void tick() { +public synchronized void tick() { currentInstant = currentInstant.plusMillis(1); } - To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org
[james-project] 01/11: JAMES-2710 Rename VaultAction to support purge action
This is an automated email from the ASF dual-hosted git repository. aduprat pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/james-project.git commit 6189ecd1d3f3738d0cad775355a6405afbf24ab9 Author: datph AuthorDate: Thu Apr 4 11:07:22 2019 +0700 JAMES-2710 Rename VaultAction to support purge action --- .../vault/routes/DeletedMessagesVaultRoutes.java | 22 +++--- .../routes/DeletedMessagesVaultRoutesTest.java | 2 +- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java index 7c1fa72..c38bcda 100644 --- a/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java +++ b/server/protocols/webadmin/webadmin-mailbox-deleted-message-vault/src/main/java/org/apache/james/webadmin/vault/routes/DeletedMessagesVaultRoutes.java @@ -72,11 +72,11 @@ import spark.Service; @Produces(Constants.JSON_CONTENT_TYPE) public class DeletedMessagesVaultRoutes implements Routes { -enum UserVaultAction { +enum VaultAction { RESTORE("restore"), EXPORT("export"); -static Optional getAction(String value) { +static Optional getAction(String value) { Preconditions.checkNotNull(value, "action cannot be null"); Preconditions.checkArgument(StringUtils.isNotBlank(value), "action cannot be empty or blank"); @@ -87,13 +87,13 @@ public class DeletedMessagesVaultRoutes implements Routes { private static List plainValues() { return Stream.of(values()) -.map(UserVaultAction::getValue) +.map(VaultAction::getValue) .collect(Guavate.toImmutableList()); } private final String value; -UserVaultAction(String value) { +VaultAction(String value) { this.value = value; } @@ -173,14 +173,14 @@ public class DeletedMessagesVaultRoutes implements Routes { @ApiResponse(code = HttpStatus.INTERNAL_SERVER_ERROR_500, message = "Internal server error - Something went bad on the server side.") }) private TaskIdDto userActions(Request request, Response response) throws JsonExtractException { -UserVaultAction requestedAction = extractUserVaultAction(request); +VaultAction requestedAction = extractVaultAction(request); Task requestedTask = generateTask(requestedAction, request); TaskId taskId = taskManager.submit(requestedTask); return TaskIdDto.respond(response, taskId); } -private Task generateTask(UserVaultAction requestedAction, Request request) throws JsonExtractException { +private Task generateTask(VaultAction requestedAction, Request request) throws JsonExtractException { User user = extractUser(request); validateUserExist(user); Query query = translate(jsonExtractor.parse(request.body())); @@ -264,17 +264,17 @@ public class DeletedMessagesVaultRoutes implements Routes { } } -private UserVaultAction extractUserVaultAction(Request request) { +private VaultAction extractVaultAction(Request request) { String actionParam = request.queryParams(ACTION_QUERY_PARAM); return Optional.ofNullable(actionParam) -.map(this::getUserVaultAction) +.map(this::getVaultAction) .orElseThrow(() -> new IllegalArgumentException("action parameter is missing")); } -private UserVaultAction getUserVaultAction(String actionString) { -return UserVaultAction.getAction(actionString) +private VaultAction getVaultAction(String actionString) { +return VaultAction.getAction(actionString) .orElseThrow(() -> new IllegalArgumentException(String.format("'%s' is not a valid action. Supported values are: (%s)", actionString, -Joiner.on(",").join(UserVaultAction.plainValues(); +Joiner.on(",").join(VaultAction.plainValues(); } } 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 7989b31..713ddc9 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