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