You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2020/12/09 05:14:00 UTC

[james-project] 01/02: JAMES-3466 Provision 'system' mailboxes only when listing mailboxes

This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit b6bf3c0609d29b4fab09055fe34adc2685bc9607
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Tue Dec 8 16:04:31 2020 +0700

    JAMES-3466 Provision 'system' mailboxes only when listing mailboxes
---
 .../methods/integration/SendMDNMethodTest.java     |  1 +
 .../integration/SetMailboxesMethodTest.java        | 26 +++++++++-------------
 .../cucumber/GetMailboxesMethodStepdefs.java       |  9 ++++++++
 .../cucumber/sharing/CopyAndSharing.feature        |  2 ++
 .../cucumber/sharing/MoveMessageAndSharing.feature |  2 ++
 .../sharing/SetMessagesOnSharedMailbox.feature     |  1 +
 .../jmap/draft/methods/GetMailboxesMethod.java     | 18 +++++++++------
 .../jmap/http/DefaultMailboxesProvisioner.java     |  6 ++---
 .../org/apache/james/jmap/http/JMAPApiRoutes.java  |  8 ++-----
 .../jmap/draft/methods/GetMailboxesMethodTest.java | 21 +++++++++++++++--
 .../apache/james/jmap/http/JMAPApiRoutesTest.java  |  6 +----
 .../james/jmap/method/MailboxGetMethod.scala       | 23 ++++++++++---------
 .../apache/james/jmap/routes/JMAPApiRoutes.scala   | 10 +++------
 .../james/jmap/routes/JMAPApiRoutesTest.scala      | 14 +++++-------
 14 files changed, 82 insertions(+), 65 deletions(-)

diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SendMDNMethodTest.java b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SendMDNMethodTest.java
index 6667197..6da78b1 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SendMDNMethodTest.java
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SendMDNMethodTest.java
@@ -98,6 +98,7 @@ public abstract class SendMDNMethodTest {
         dataProbe.addUser(HOMER.asString(), PASSWORD);
         dataProbe.addUser(BART.asString(), BOB_PASSWORD);
         mailboxProbe.createMailbox("#private", HOMER.asString(), DefaultMailboxes.INBOX);
+        mailboxProbe.createMailbox("#private", HOMER.asString(), DefaultMailboxes.OUTBOX);
         homerAccessToken = authenticateJamesUser(baseUri(jmapServer), HOMER, PASSWORD);
         bartAccessToken = authenticateJamesUser(baseUri(jmapServer), BART, BOB_PASSWORD);
     }
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMailboxesMethodTest.java b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMailboxesMethodTest.java
index ca325a9..f316892 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMailboxesMethodTest.java
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/SetMailboxesMethodTest.java
@@ -33,8 +33,8 @@ import static org.assertj.core.api.Assertions.assertThat;
 import static org.hamcrest.Matchers.contains;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.hamcrest.Matchers.containsString;
-import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.emptyOrNullString;
+import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasEntry;
 import static org.hamcrest.Matchers.hasItem;
 import static org.hamcrest.Matchers.hasKey;
@@ -84,6 +84,8 @@ public abstract class SetMailboxesMethodTest {
     private static final String DELETE_MESSAGES = String.valueOf(Right.DeleteMessages.asCharacter());
 
     private static final int MAILBOX_NAME_LENGTH_64K = 65536;
+    private MailboxId draftId;
+    private MailboxId outboxId;
 
     protected abstract GuiceJamesServer createJmapServer() throws IOException;
 
@@ -110,6 +112,10 @@ public abstract class SetMailboxesMethodTest {
         dataProbe.addDomain(DOMAIN);
         dataProbe.addUser(username.asString(), password);
         inboxId = mailboxProbe.createMailbox("#private", username.asString(), DefaultMailboxes.INBOX);
+        outboxId = mailboxProbe.createMailbox("#private", username.asString(), DefaultMailboxes.OUTBOX);
+        mailboxProbe.createMailbox("#private", username.asString(), DefaultMailboxes.TRASH);
+        mailboxProbe.createMailbox("#private", username.asString(), DefaultMailboxes.SENT);
+        draftId = mailboxProbe.createMailbox("#private", username.asString(), DefaultMailboxes.DRAFTS);
         accessToken = authenticateJamesUser(baseUri(jmapServer), username, password);
     }
 
@@ -606,11 +612,7 @@ public abstract class SetMailboxesMethodTest {
             .post("/jmap");
 
         assertThat(mailboxProbe.listSubscriptions(username.asString()))
-            .contains(DefaultMailboxes.OUTBOX,
-                DefaultMailboxes.SENT,
-                DefaultMailboxes.TRASH,
-                DefaultMailboxes.DRAFTS,
-                "mySecondBox");
+            .contains("mySecondBox");
     }
 
     @Test
@@ -635,10 +637,7 @@ public abstract class SetMailboxesMethodTest {
             .statusCode(200);
 
         assertThat(mailboxProbe.listSubscriptions(username.asString()))
-            .contains(DefaultMailboxes.OUTBOX,
-            DefaultMailboxes.SENT,
-            DefaultMailboxes.TRASH,
-            DefaultMailboxes.DRAFTS);
+            .isEmpty();
     }
 
     @Category(BasicFeature.class)
@@ -689,10 +688,7 @@ public abstract class SetMailboxesMethodTest {
             .statusCode(200);
 
         assertThat(mailboxProbe.listSubscriptions(username.asString()))
-            .contains(DefaultMailboxes.OUTBOX,
-                DefaultMailboxes.SENT,
-                DefaultMailboxes.TRASH,
-                DefaultMailboxes.DRAFTS);
+            .isEmpty();
     }
 
     @Test
@@ -2384,7 +2380,6 @@ public abstract class SetMailboxesMethodTest {
 
     @Test
     public void setMailboxesShouldReturnNotUpdatedWhenShareOutboxMailbox() {
-        MailboxId outboxId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username.asString(), DefaultMailboxes.OUTBOX);
         String requestBody =
             "[" +
                 "  [ \"setMailboxes\"," +
@@ -2415,7 +2410,6 @@ public abstract class SetMailboxesMethodTest {
 
     @Test
     public void setMailboxesShouldReturnNotUpdatedWhenShareDraftMailbox() {
-        MailboxId draftId = mailboxProbe.createMailbox(MailboxConstants.USER_NAMESPACE, username.asString(), DefaultMailboxes.DRAFTS);
         String requestBody =
             "[" +
                 "  [ \"setMailboxes\"," +
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/cucumber/GetMailboxesMethodStepdefs.java b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/cucumber/GetMailboxesMethodStepdefs.java
index e66b608..9fc74ea 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/cucumber/GetMailboxesMethodStepdefs.java
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/java/org/apache/james/jmap/draft/methods/integration/cucumber/GetMailboxesMethodStepdefs.java
@@ -30,9 +30,12 @@ import java.util.List;
 
 import javax.inject.Inject;
 
+import org.apache.james.core.Username;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxId;
+import org.apache.james.mailbox.model.MailboxPath;
 
+import cucumber.api.java.en.Given;
 import cucumber.api.java.en.Then;
 import cucumber.api.java.en.When;
 import cucumber.runtime.java.guice.ScenarioScoped;
@@ -51,6 +54,12 @@ public class GetMailboxesMethodStepdefs {
         this.mainStepdefs = mainStepdefs;
     }
 
+    @Given("^the user has a mailbox \"([^\"]*)\"$")
+    public void hasMailbox(String mailbox) {
+        mainStepdefs.mailboxProbe.createMailbox(MailboxPath.forUser(
+            Username.of(userStepdefs.getConnectedUser()), mailbox));
+    }
+
     @When("^\"([^\"]*)\" lists mailboxes$")
     public void getMailboxes(String user) {
         userStepdefs.execWithUser(user, 
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/cucumber/sharing/CopyAndSharing.feature b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/cucumber/sharing/CopyAndSharing.feature
index 1f07c4e..3e23a28 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/cucumber/sharing/CopyAndSharing.feature
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/cucumber/sharing/CopyAndSharing.feature
@@ -24,8 +24,10 @@ Feature: Copy message and sharing
     Given a domain named "domain.tld"
     And some users "alice@domain.tld", "bob@domain.tld"
     And "alice@domain.tld" has a mailbox "shared"
+    And "alice@domain.tld" has a mailbox "INBOX"
     And "alice@domain.tld" shares her mailbox "shared" with "bob@domain.tld" with "aeilrwt" rights
     And "bob@domain.tld" has a mailbox "bobMailbox"
+    And "bob@domain.tld" has a mailbox "INBOX"
     And "alice@domain.tld" has a message "m1" in "INBOX" mailbox
     And "bob@domain.tld" has a message "m2" in "bobMailbox" mailbox
 
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/cucumber/sharing/MoveMessageAndSharing.feature b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/cucumber/sharing/MoveMessageAndSharing.feature
index dc464db..0fc2155 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/cucumber/sharing/MoveMessageAndSharing.feature
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/cucumber/sharing/MoveMessageAndSharing.feature
@@ -24,8 +24,10 @@ Feature: Move message and sharing
     Given a domain named "domain.tld"
     And some users "alice@domain.tld", "bob@domain.tld"
     And "alice@domain.tld" has a mailbox "shared"
+    And "alice@domain.tld" has a mailbox "INBOX"
     And "alice@domain.tld" shares her mailbox "shared" with "bob@domain.tld" with "aeilrwt" rights
     And "bob@domain.tld" has a mailbox "bobMailbox"
+    And "bob@domain.tld" has a mailbox "INBOX"
 
   Scenario: Move message should update the total and the unread counts when asked by sharer
     Given "alice@domain.tld" has a message "m1" in "INBOX" mailbox
diff --git a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/cucumber/sharing/SetMessagesOnSharedMailbox.feature b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/cucumber/sharing/SetMessagesOnSharedMailbox.feature
index b76876d..dc5d7c6 100644
--- a/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/cucumber/sharing/SetMessagesOnSharedMailbox.feature
+++ b/server/protocols/jmap-draft-integration-testing/jmap-draft-integration-testing-common/src/test/resources/cucumber/sharing/SetMessagesOnSharedMailbox.feature
@@ -24,6 +24,7 @@ Feature: SetMessages method on shared folders
     Given a domain named "domain.tld"
     And some users "alice@domain.tld", "bob@domain.tld"
     And "bob@domain.tld" has a mailbox "shared"
+    And "bob@domain.tld" has a mailbox "Outbox"
     And "alice@domain.tld" has a mailbox "INBOX"
     And "bob@domain.tld" has a message "mBob" in "shared" mailbox with two attachments in text
     And "alice@domain.tld" has a message "mAlice" in "INBOX" mailbox with two attachments in text
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMailboxesMethod.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMailboxesMethod.java
index acf9c26..610924f 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMailboxesMethod.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/draft/methods/GetMailboxesMethod.java
@@ -37,6 +37,7 @@ import org.apache.james.jmap.draft.model.MailboxProperty;
 import org.apache.james.jmap.draft.model.MethodCallId;
 import org.apache.james.jmap.draft.model.mailbox.Mailbox;
 import org.apache.james.jmap.draft.utils.quotas.QuotaLoaderWithDefaultPreloaded;
+import org.apache.james.jmap.http.DefaultMailboxesProvisioner;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.model.MailboxId;
@@ -70,15 +71,17 @@ public class GetMailboxesMethod implements Method {
     private final MetricFactory metricFactory;
     private final QuotaRootResolver quotaRootResolver;
     private final QuotaManager quotaManager;
+    private final DefaultMailboxesProvisioner provisioner;
 
     @Inject
     @VisibleForTesting
-    public GetMailboxesMethod(MailboxManager mailboxManager, QuotaRootResolver quotaRootResolver, QuotaManager quotaManager, MailboxFactory mailboxFactory, MetricFactory metricFactory) {
+    public GetMailboxesMethod(MailboxManager mailboxManager, QuotaRootResolver quotaRootResolver, QuotaManager quotaManager, MailboxFactory mailboxFactory, MetricFactory metricFactory, DefaultMailboxesProvisioner provisioner) {
         this.mailboxManager = mailboxManager;
         this.mailboxFactory = mailboxFactory;
         this.metricFactory = metricFactory;
         this.quotaRootResolver = quotaRootResolver;
         this.quotaManager = quotaManager;
+        this.provisioner = provisioner;
     }
 
     @Override
@@ -110,12 +113,13 @@ public class GetMailboxesMethod implements Method {
     }
 
     private Flux<JmapResponse> process(MethodCallId methodCallId, MailboxSession mailboxSession, GetMailboxesRequest mailboxesRequest) {
-        return Flux.from(getMailboxesResponse(mailboxesRequest, mailboxSession)
-            .map(response -> JmapResponse.builder().methodCallId(methodCallId)
-                .response(response)
-                .properties(mailboxesRequest.getProperties().map(this::ensureContainsId))
-                .responseName(RESPONSE_NAME)
-                .build()));
+        return provisioner.createMailboxesIfNeeded(mailboxSession)
+            .thenMany(Flux.from(getMailboxesResponse(mailboxesRequest, mailboxSession)
+                .map(response -> JmapResponse.builder().methodCallId(methodCallId)
+                    .response(response)
+                    .properties(mailboxesRequest.getProperties().map(this::ensureContainsId))
+                    .responseName(RESPONSE_NAME)
+                    .build())));
     }
 
     private Set<MailboxProperty> ensureContainsId(Set<MailboxProperty> input) {
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/DefaultMailboxesProvisioner.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/DefaultMailboxesProvisioner.java
index 0b74d72..a576611 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/DefaultMailboxesProvisioner.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/DefaultMailboxesProvisioner.java
@@ -45,7 +45,7 @@ import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
 import reactor.core.scheduler.Schedulers;
 
-class DefaultMailboxesProvisioner {
+public class DefaultMailboxesProvisioner {
     private static final Logger LOGGER = LoggerFactory.getLogger(DefaultMailboxesProvisioner.class);
     private final MailboxManager mailboxManager;
     private final SubscriptionManager subscriptionManager;
@@ -53,7 +53,7 @@ class DefaultMailboxesProvisioner {
 
     @Inject
     @VisibleForTesting
-    DefaultMailboxesProvisioner(MailboxManager mailboxManager,
+    public DefaultMailboxesProvisioner(MailboxManager mailboxManager,
                                 SubscriptionManager subscriptionManager,
                                 MetricFactory metricFactory) {
         this.mailboxManager = mailboxManager;
@@ -61,7 +61,7 @@ class DefaultMailboxesProvisioner {
         this.metricFactory = metricFactory;
     }
 
-    Mono<Void> createMailboxesIfNeeded(MailboxSession session) {
+    public Mono<Void> createMailboxesIfNeeded(MailboxSession session) {
         return metricFactory.decorateSupplierWithTimerMetric("JMAP-mailboxes-provisioning",
             () -> {
                 Username username = session.getUser();
diff --git a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/JMAPApiRoutes.java b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/JMAPApiRoutes.java
index b9bbca8..4f2f110 100644
--- a/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/JMAPApiRoutes.java
+++ b/server/protocols/jmap-draft/src/main/java/org/apache/james/jmap/http/JMAPApiRoutes.java
@@ -67,15 +67,13 @@ public class JMAPApiRoutes implements JMAPRoutes {
     private final MetricFactory metricFactory;
     private final Authenticator authenticator;
     private final UserProvisioner userProvisioner;
-    private final DefaultMailboxesProvisioner defaultMailboxesProvisioner;
 
     @Inject
-    public JMAPApiRoutes(RequestHandler requestHandler, MetricFactory metricFactory, @Named(InjectionKeys.DRAFT) Authenticator authenticator, UserProvisioner userProvisioner, DefaultMailboxesProvisioner defaultMailboxesProvisioner) {
+    public JMAPApiRoutes(RequestHandler requestHandler, MetricFactory metricFactory, @Named(InjectionKeys.DRAFT) Authenticator authenticator, UserProvisioner userProvisioner) {
         this.requestHandler = requestHandler;
         this.metricFactory = metricFactory;
         this.authenticator = authenticator;
         this.userProvisioner = userProvisioner;
-        this.defaultMailboxesProvisioner = defaultMailboxesProvisioner;
         this.objectMapper = new ObjectMapper();
         objectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
     }
@@ -96,9 +94,7 @@ public class JMAPApiRoutes implements JMAPRoutes {
 
     private Mono<Void> post(HttpServerRequest request, HttpServerResponse response) {
         return authenticator.authenticate(request)
-            .flatMap(session -> Flux.merge(
-                userProvisioner.provisionUser(session),
-                defaultMailboxesProvisioner.createMailboxesIfNeeded(session))
+            .flatMap(session -> userProvisioner.provisionUser(session)
                 .then(Mono.from(metricFactory.decoratePublisherWithTimerMetric("JMAP-request",
                     post(request, response, session))))
                 .subscriberContext(jmapAuthContext(session)))
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMailboxesMethodTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMailboxesMethodTest.java
index 58c795c..c17fbf6 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMailboxesMethodTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/draft/methods/GetMailboxesMethodTest.java
@@ -37,7 +37,10 @@ import org.apache.james.jmap.draft.model.MailboxFactory;
 import org.apache.james.jmap.draft.model.MethodCallId;
 import org.apache.james.jmap.draft.model.Number;
 import org.apache.james.jmap.draft.model.mailbox.Mailbox;
+import org.apache.james.jmap.draft.model.mailbox.MailboxNamespace;
 import org.apache.james.jmap.draft.model.mailbox.SortOrder;
+import org.apache.james.jmap.http.DefaultMailboxesProvisioner;
+import org.apache.james.mailbox.DefaultMailboxes;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MailboxSessionUtil;
 import org.apache.james.mailbox.MessageManager;
@@ -46,10 +49,12 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.inmemory.InMemoryId;
 import org.apache.james.mailbox.inmemory.manager.InMemoryIntegrationResources;
 import org.apache.james.mailbox.model.MailboxACL;
+import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.StoreMailboxManager;
+import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.metrics.logger.DefaultMetricFactory;
 import org.apache.james.mime4j.dom.Message;
 import org.assertj.core.groups.Tuple;
@@ -72,6 +77,7 @@ public class GetMailboxesMethodTest {
 
     private QuotaRootResolver quotaRootResolver;
     private QuotaManager quotaManager;
+    private DefaultMailboxesProvisioner provisioner;
 
     @Before
     public void setup() throws Exception {
@@ -80,8 +86,9 @@ public class GetMailboxesMethodTest {
         quotaRootResolver = mailboxManager.getQuotaComponents().getQuotaRootResolver();
         quotaManager = mailboxManager.getQuotaComponents().getQuotaManager();
         mailboxFactory = new MailboxFactory(mailboxManager, quotaManager, quotaRootResolver);
+        provisioner = new DefaultMailboxesProvisioner(mailboxManager, new StoreSubscriptionManager(mailboxManager.getMapperFactory()), new DefaultMetricFactory());
 
-        getMailboxesMethod = new GetMailboxesMethod(mailboxManager, quotaRootResolver, quotaManager,  mailboxFactory, new DefaultMetricFactory());
+        getMailboxesMethod = new GetMailboxesMethod(mailboxManager, quotaRootResolver, quotaManager,  mailboxFactory, new DefaultMetricFactory(), provisioner);
     }
 
     @Test
@@ -99,6 +106,7 @@ public class GetMailboxesMethodTest {
                 .hasOnlyElementsOfType(GetMailboxesResponse.class)
                 .extracting(GetMailboxesResponse.class::cast)
                 .flatExtracting(GetMailboxesResponse::getList)
+                .filteredOn(mailbox -> !DefaultMailboxes.DEFAULT_MAILBOXES.contains(mailbox.getName()))
                 .isEmpty();
     }
 
@@ -111,7 +119,7 @@ public class GetMailboxesMethodTest {
             .thenThrow(new MailboxException());
         when(mockedMailboxManager.search(any(), any()))
             .thenReturn(Flux.empty());
-        GetMailboxesMethod testee = new GetMailboxesMethod(mockedMailboxManager, quotaRootResolver, quotaManager, mailboxFactory, new DefaultMetricFactory());
+        GetMailboxesMethod testee = new GetMailboxesMethod(mockedMailboxManager, quotaRootResolver, quotaManager, mailboxFactory, new DefaultMetricFactory(), provisioner);
 
         GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
                 .build();
@@ -155,6 +163,7 @@ public class GetMailboxesMethodTest {
                 .hasOnlyElementsOfType(GetMailboxesResponse.class)
                 .extracting(GetMailboxesResponse.class::cast)
                 .flatExtracting(GetMailboxesResponse::getList)
+                .filteredOn(mailbox -> !DefaultMailboxes.DEFAULT_MAILBOXES.contains(mailbox.getName()))
                 .extracting(Mailbox::getId, Mailbox::getName, Mailbox::getUnreadMessages)
                 .containsOnly(Tuple.tuple(InMemoryId.of(1), mailboxPath.getName(), Number.fromLong(2L)));
     }
@@ -180,6 +189,7 @@ public class GetMailboxesMethodTest {
                 .hasOnlyElementsOfType(GetMailboxesResponse.class)
                 .extracting(GetMailboxesResponse.class::cast)
                 .flatExtracting(GetMailboxesResponse::getList)
+                .filteredOn(mailbox -> !DefaultMailboxes.DEFAULT_MAILBOXES.contains(mailbox.getName()))
                 .extracting(Mailbox::getId, Mailbox::getName)
                 .containsOnly(Tuple.tuple(InMemoryId.of(1), mailboxPathToReturn.getName()));
     }
@@ -201,6 +211,7 @@ public class GetMailboxesMethodTest {
                 .hasOnlyElementsOfType(GetMailboxesResponse.class)
                 .extracting(GetMailboxesResponse.class::cast)
                 .flatExtracting(GetMailboxesResponse::getList)
+                .filteredOn(mailbox -> mailbox.getName().equalsIgnoreCase("INBOX"))
                 .extracting(Mailbox::getSortOrder)
                 .containsOnly(SortOrder.of(10));
     }
@@ -222,6 +233,7 @@ public class GetMailboxesMethodTest {
                 .hasOnlyElementsOfType(GetMailboxesResponse.class)
                 .extracting(GetMailboxesResponse.class::cast)
                 .flatExtracting(GetMailboxesResponse::getList)
+                .filteredOn(mailbox -> !DefaultMailboxes.DEFAULT_MAILBOXES.contains(mailbox.getName()))
                 .extracting(Mailbox::getSortOrder)
                 .containsOnly(SortOrder.of(1000));
     }
@@ -243,6 +255,7 @@ public class GetMailboxesMethodTest {
                 .hasOnlyElementsOfType(GetMailboxesResponse.class)
                 .extracting(GetMailboxesResponse.class::cast)
                 .flatExtracting(GetMailboxesResponse::getList)
+                .filteredOn(mailbox -> mailbox.getName().equalsIgnoreCase("INBOX"))
                 .extracting(Mailbox::getSortOrder)
                 .containsOnly(SortOrder.of(10));
     }
@@ -331,6 +344,7 @@ public class GetMailboxesMethodTest {
                 .hasOnlyElementsOfType(GetMailboxesResponse.class)
                 .extracting(GetMailboxesResponse.class::cast)
                 .flatExtracting(GetMailboxesResponse::getList)
+                .filteredOn(mailbox -> !DefaultMailboxes.DEFAULT_MAILBOXES.contains(mailbox.getName()))
                 .extracting(Mailbox::getTotalMessages)
                 .containsExactly(Number.fromLong(2L));
     }
@@ -370,6 +384,7 @@ public class GetMailboxesMethodTest {
                 .hasOnlyElementsOfType(GetMailboxesResponse.class)
                 .extracting(GetMailboxesResponse.class::cast)
                 .flatExtracting(GetMailboxesResponse::getList)
+                .filteredOn(mailbox -> !DefaultMailboxes.DEFAULT_MAILBOXES.contains(mailbox.getName()))
                 .extracting(Mailbox::getUnreadMessages)
                 .containsExactly(Number.fromLong(2L));
     }
@@ -437,6 +452,8 @@ public class GetMailboxesMethodTest {
             .hasOnlyElementsOfType(GetMailboxesResponse.class)
             .extracting(GetMailboxesResponse.class::cast)
             .flatExtracting(GetMailboxesResponse::getList)
+            .filteredOn(mailbox -> MailboxConstants.INBOX.equals(mailbox.getName()))
+            .filteredOn(mailbox -> !mailbox.getNamespace().equals(MailboxNamespace.personal()))
             .extracting(Mailbox::getName, Mailbox::getRole)
             .containsOnly(Tuple.tuple("INBOX", Optional.empty()));
     }
diff --git a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/JMAPApiRoutesTest.java b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/JMAPApiRoutesTest.java
index 43f8fa5..369e525 100644
--- a/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/JMAPApiRoutesTest.java
+++ b/server/protocols/jmap-draft/src/test/java/org/apache/james/jmap/http/JMAPApiRoutesTest.java
@@ -63,17 +63,15 @@ public class JMAPApiRoutesTest {
     private RequestHandler requestHandler;
     private Authenticator mockedAuthFilter;
     private UserProvisioner mockedUserProvisionner;
-    private DefaultMailboxesProvisioner mockedMailboxesProvisionner;
 
     @Before
     public void setup() throws Exception {
         requestHandler = mock(RequestHandler.class);
         mockedAuthFilter = mock(Authenticator.class);
         mockedUserProvisionner = mock(UserProvisioner.class);
-        mockedMailboxesProvisionner = mock(DefaultMailboxesProvisioner.class);
 
         JMAPApiRoutes jmapApiRoutes = new JMAPApiRoutes(requestHandler, new RecordingMetricFactory(),
-            mockedAuthFilter, mockedUserProvisionner, mockedMailboxesProvisionner);
+            mockedAuthFilter, mockedUserProvisionner);
 
         JMAPRoute postApiRoute = jmapApiRoutes.routes()
             .filter(jmapRoute -> jmapRoute.getEndpoint().getMethod().equals(HttpMethod.POST))
@@ -97,8 +95,6 @@ public class JMAPApiRoutesTest {
             .when(mockedAuthFilter).authenticate(any());
         when(mockedUserProvisionner.provisionUser(any()))
             .thenReturn(Mono.empty());
-        when(mockedMailboxesProvisionner.createMailboxesIfNeeded(any()))
-            .thenReturn(Mono.empty());
     }
 
     @After
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxGetMethod.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxGetMethod.scala
index 1419eba..1be6614 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxGetMethod.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/method/MailboxGetMethod.scala
@@ -25,6 +25,7 @@ import org.apache.james.jmap.core.CapabilityIdentifier.{CapabilityIdentifier, JM
 import org.apache.james.jmap.core.Invocation.{Arguments, MethodName}
 import org.apache.james.jmap.core.State.INSTANCE
 import org.apache.james.jmap.core.{AccountId, CapabilityIdentifier, ErrorCode, Invocation, Properties}
+import org.apache.james.jmap.http.MailboxesProvisioner
 import org.apache.james.jmap.json.{MailboxSerializer, ResponseSerializer}
 import org.apache.james.jmap.mail.MailboxGet.UnparsedMailboxId
 import org.apache.james.jmap.mail.{Mailbox, MailboxFactory, MailboxGet, MailboxGetRequest, MailboxGetResponse, NotFound, PersonalNamespace, Subscriptions}
@@ -66,6 +67,7 @@ class MailboxGetMethod @Inject() (serializer: MailboxSerializer,
                                   quotaFactory : QuotaLoaderWithPreloadedDefaultFactory,
                                   mailboxIdFactory: MailboxId.Factory,
                                   mailboxFactory: MailboxFactory,
+                                  provisioner: MailboxesProvisioner,
                                   val metricFactory: MetricFactory,
                                   val sessionSupplier: SessionSupplier) extends MethodRequiringAccountId[MailboxGetRequest] {
   override val methodName: MethodName = MethodName("Mailbox/get")
@@ -98,16 +100,17 @@ class MailboxGetMethod @Inject() (serializer: MailboxSerializer,
   private def getMailboxes(capabilities: Set[CapabilityIdentifier],
                            mailboxGetRequest: MailboxGetRequest,
                            mailboxSession: MailboxSession): SFlux[MailboxGetResults] =
-
-    mailboxGetRequest.ids match {
-      case None => getAllMailboxes(capabilities, mailboxSession)
-        .map(MailboxGetResults.found)
-      case Some(ids) => SFlux.fromIterable(ids.value)
-        .flatMap(id => Try(mailboxIdFactory.fromString(id.value))
-          .fold(e => SMono.just(MailboxGetResults.notFound(id)),
-            mailboxId => getMailboxResultById(capabilities, mailboxId, mailboxSession)),
-          maxConcurrency = 5)
-    }
+    provisioner.createMailboxesIfNeeded(mailboxSession)
+      .thenMany(
+        mailboxGetRequest.ids match {
+          case None => getAllMailboxes(capabilities, mailboxSession)
+            .map(MailboxGetResults.found)
+          case Some(ids) => SFlux.fromIterable(ids.value)
+            .flatMap(id => Try(mailboxIdFactory.fromString(id.value))
+              .fold(e => SMono.just(MailboxGetResults.notFound(id)),
+                mailboxId => getMailboxResultById(capabilities, mailboxId, mailboxSession)),
+              maxConcurrency = 5)
+        })
 
   private def getMailboxResultById(capabilities: Set[CapabilityIdentifier],
                                    mailboxId: MailboxId,
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala
index e3c3b7e..fb27d2e 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/JMAPApiRoutes.scala
@@ -36,7 +36,7 @@ import org.apache.james.jmap.core.ProblemDetails.{notJSONProblem, notRequestProb
 import org.apache.james.jmap.core.{DefaultCapabilities, ErrorCode, Invocation, MissingCapabilityException, ProblemDetails, RequestObject, ResponseObject}
 import org.apache.james.jmap.exceptions.UnauthorizedException
 import org.apache.james.jmap.http.rfc8621.InjectionKeys
-import org.apache.james.jmap.http.{Authenticator, MailboxesProvisioner, UserProvisioning}
+import org.apache.james.jmap.http.{Authenticator, UserProvisioning}
 import org.apache.james.jmap.json.ResponseSerializer
 import org.apache.james.jmap.method.{InvocationWithContext, Method}
 import org.apache.james.jmap.routes.DownloadRoutes.LOGGER
@@ -57,7 +57,6 @@ object JMAPApiRoutes {
 
 class JMAPApiRoutes (val authenticator: Authenticator,
                      userProvisioner: UserProvisioning,
-                     mailboxesProvisioner: MailboxesProvisioner,
                      methods: Set[Method]) extends JMAPRoutes {
 
   private val methodsByName: Map[MethodName, Method] = methods.map(method => method.methodName -> method).toMap
@@ -65,9 +64,8 @@ class JMAPApiRoutes (val authenticator: Authenticator,
   @Inject
   def this(@Named(InjectionKeys.RFC_8621) authenticator: Authenticator,
            userProvisioner: UserProvisioning,
-           mailboxesProvisioner: MailboxesProvisioner,
            javaMethods: java.util.Set[Method]) {
-    this(authenticator, userProvisioner, mailboxesProvisioner, javaMethods.asScala.toSet)
+    this(authenticator, userProvisioner, javaMethods.asScala.toSet)
   }
 
   override def routes(): stream.Stream[JMAPRoute] = Stream.of(
@@ -82,9 +80,7 @@ class JMAPApiRoutes (val authenticator: Authenticator,
 
   private def post(httpServerRequest: HttpServerRequest, httpServerResponse: HttpServerResponse): Mono[Void] =
     SMono(authenticator.authenticate(httpServerRequest))
-      .flatMap((mailboxSession: MailboxSession) => SFlux.merge(Seq(
-          userProvisioner.provisionUser(mailboxSession),
-          mailboxesProvisioner.createMailboxesIfNeeded(mailboxSession)))
+      .flatMap((mailboxSession: MailboxSession) => userProvisioner.provisionUser(mailboxSession)
         .`then`
         .`then`(this.requestAsJsonStream(httpServerRequest)
           .flatMap(requestObject => this.process(requestObject, httpServerResponse, mailboxSession))))
diff --git a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala
index eb64f27..d600b2d 100644
--- a/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala
+++ b/server/protocols/jmap-rfc-8621/src/test/scala/org/apache/james/jmap/routes/JMAPApiRoutesTest.scala
@@ -37,19 +37,18 @@ import org.apache.james.domainlist.memory.MemoryDomainList
 import org.apache.james.jmap.JMAPUrls.JMAP
 import org.apache.james.jmap.core.CapabilityIdentifier.{CapabilityIdentifier, JMAP_CORE}
 import org.apache.james.jmap.core.Invocation.MethodName
-import org.apache.james.jmap.core.{JmapRfc8621Configuration, RequestLevelErrorType}
-import org.apache.james.jmap.http.{Authenticator, BasicAuthenticationStrategy, MailboxesProvisioner, UserProvisioning}
+import org.apache.james.jmap.core.RequestLevelErrorType
+import org.apache.james.jmap.http.{Authenticator, BasicAuthenticationStrategy, UserProvisioning}
 import org.apache.james.jmap.method.{CoreEchoMethod, Method}
 import org.apache.james.jmap.routes.JMAPApiRoutesTest._
 import org.apache.james.jmap.{JMAPConfiguration, JMAPRoutesHandler, JMAPServer, Version, VersionParser}
 import org.apache.james.mailbox.extension.PreDeletionHook
 import org.apache.james.mailbox.inmemory.{InMemoryMailboxManager, MemoryMailboxManagerProvider}
-import org.apache.james.mailbox.store.StoreSubscriptionManager
 import org.apache.james.metrics.tests.RecordingMetricFactory
 import org.apache.james.user.memory.MemoryUsersRepository
 import org.hamcrest.Matchers.equalTo
 import org.mockito.ArgumentMatchers.any
-import org.mockito.Mockito.{doReturn, doThrow, mock, when}
+import org.mockito.Mockito.{doReturn, mock, when}
 import org.scalatest.BeforeAndAfter
 import org.scalatest.flatspec.AnyFlatSpec
 import org.scalatest.matchers.should.Matchers
@@ -74,12 +73,9 @@ object JMAPApiRoutesTest {
   private val AUTHENTICATOR: Authenticator = Authenticator.of(new RecordingMetricFactory, authenticationStrategy)
 
   private val userProvisionner: UserProvisioning = new UserProvisioning(usersRepository, new RecordingMetricFactory)
-  private val subscriptionManager: StoreSubscriptionManager = new StoreSubscriptionManager(mailboxManager.getMapperFactory)
-  private val mailboxesProvisioner: MailboxesProvisioner = new MailboxesProvisioner(mailboxManager, subscriptionManager, new RecordingMetricFactory)
-  private val sessionSupplier: SessionSupplier = new SessionSupplier(JmapRfc8621Configuration(JmapRfc8621Configuration.LOCALHOST_URL_PREFIX))
   private val JMAP_METHODS: Set[Method] = Set(new CoreEchoMethod)
 
-  private val JMAP_API_ROUTE: JMAPApiRoutes = new JMAPApiRoutes(AUTHENTICATOR, userProvisionner, mailboxesProvisioner, JMAP_METHODS)
+  private val JMAP_API_ROUTE: JMAPApiRoutes = new JMAPApiRoutes(AUTHENTICATOR, userProvisionner, JMAP_METHODS)
   private val ROUTES_HANDLER: ImmutableSet[JMAPRoutesHandler] = ImmutableSet.of(new JMAPRoutesHandler(Version.RFC8621, JMAP_API_ROUTE))
 
   private val userBase64String: String = Base64.getEncoder.encodeToString("user1:password".getBytes(StandardCharsets.UTF_8))
@@ -443,7 +439,7 @@ class JMAPApiRoutesTest extends AnyFlatSpec with BeforeAndAfter with Matchers {
     when(mockCoreEchoMethod.requiredCapabilities).thenReturn(Set(JMAP_CORE))
 
     val methods: Set[Method] = Set(mockCoreEchoMethod)
-    val apiRoute: JMAPApiRoutes = new JMAPApiRoutes(AUTHENTICATOR, userProvisionner, mailboxesProvisioner, methods)
+    val apiRoute: JMAPApiRoutes = new JMAPApiRoutes(AUTHENTICATOR, userProvisionner, methods)
     val routesHandler: ImmutableSet[JMAPRoutesHandler] = ImmutableSet.of(new JMAPRoutesHandler(Version.RFC8621, apiRoute))
 
     val versionParser: VersionParser = new VersionParser(SUPPORTED_VERSIONS, JMAPConfiguration.DEFAULT)


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org