You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ad...@apache.org on 2017/11/23 08:04:08 UTC

[3/6] james-project git commit: JAMES-2227 System mailboxes should be case sensitive

JAMES-2227 System mailboxes should be case sensitive


Project: http://git-wip-us.apache.org/repos/asf/james-project/repo
Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/cc2e8f08
Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/cc2e8f08
Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/cc2e8f08

Branch: refs/heads/master
Commit: cc2e8f08219be18f40ea8f8786109ccdb154a82f
Parents: 314495a
Author: Antoine Duprat <ad...@linagora.com>
Authored: Tue Nov 21 15:25:27 2017 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Thu Nov 23 09:01:14 2017 +0100

----------------------------------------------------------------------
 .../integration/SetMailboxesMethodTest.java     |  4 +-
 .../apache/james/jmap/model/mailbox/Role.java   | 48 +++++++-----
 .../jmap/methods/GetMailboxesMethodTest.java    | 56 +++++++-------
 .../james/jmap/model/mailbox/RoleTest.java      | 78 +++++++++++++++++---
 4 files changed, 125 insertions(+), 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/cc2e8f08/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java
index 690de87..1f7aba8 100644
--- a/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java
+++ b/server/protocols/jmap-integration-testing/jmap-integration-testing-common/src/test/java/org/apache/james/jmap/methods/integration/SetMailboxesMethodTest.java
@@ -2058,7 +2058,7 @@ public abstract class SetMailboxesMethodTest {
                     "    {" +
                     "      \"update\": {" +
                     "        \"" + mailboxId.serialize() + "\" : {" +
-                    "          \"name\" : \"outbox\"" +
+                    "          \"name\" : \"Outbox\"" +
                     "        }" +
                     "      }" +
                     "    }," +
@@ -2076,7 +2076,7 @@ public abstract class SetMailboxesMethodTest {
             .body(NAME, equalTo("mailboxesSet"))
             .body(ARGUMENTS + ".notUpdated", hasEntry(equalTo(mailboxId.serialize()), Matchers.allOf(
                     hasEntry(equalTo("type"), equalTo("invalidArguments")),
-                    hasEntry(equalTo("description"), equalTo("The mailbox 'outbox' is a system mailbox.")))));
+                    hasEntry(equalTo("description"), equalTo("The mailbox 'Outbox' is a system mailbox.")))));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/cc2e8f08/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Role.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Role.java b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Role.java
index 6bac1f3..44115e3 100644
--- a/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Role.java
+++ b/server/protocols/jmap/src/main/java/org/apache/james/jmap/model/mailbox/Role.java
@@ -18,11 +18,9 @@
  ****************************************************************/
 package org.apache.james.jmap.model.mailbox;
 
-import java.util.Locale;
-import java.util.Map;
+import java.util.List;
 import java.util.Optional;
-import java.util.function.Function;
-import java.util.stream.Collectors;
+import java.util.function.BiFunction;
 
 import org.apache.james.jmap.DefaultMailboxes;
 
@@ -35,36 +33,40 @@ import com.google.common.collect.ImmutableList;
 public class Role {
 
     public static final String USER_DEFINED_ROLE_PREFIX = "x-";
+
+    private static final BiFunction<String, String, Boolean> CASE_SENSITIVE_COMPARATOR = (a, b) -> a.equals(b);
+    private static final BiFunction<String, String, Boolean> NON_CASE_SENSITIVE_COMPARATOR = (a, b) -> a.equalsIgnoreCase(b);
+
+    public static final Role INBOX = new Role("inbox", DefaultMailboxes.INBOX, NON_CASE_SENSITIVE_COMPARATOR);
+    public static final Role DRAFTS = new Role("drafts", DefaultMailboxes.DRAFTS, CASE_SENSITIVE_COMPARATOR);
+    public static final Role OUTBOX = new Role("outbox", DefaultMailboxes.OUTBOX, CASE_SENSITIVE_COMPARATOR);
+    public static final Role SENT = new Role("sent", DefaultMailboxes.SENT, CASE_SENSITIVE_COMPARATOR);
+    public static final Role TRASH = new Role("trash", DefaultMailboxes.TRASH, CASE_SENSITIVE_COMPARATOR);
+    public static final Role ARCHIVE = new Role("archive", DefaultMailboxes.ARCHIVE, CASE_SENSITIVE_COMPARATOR);
+    public static final Role SPAM = new Role("spam", DefaultMailboxes.SPAM, CASE_SENSITIVE_COMPARATOR);
+    public static final Role TEMPLATES = new Role("templates", DefaultMailboxes.TEMPLATES, CASE_SENSITIVE_COMPARATOR);
     
-    public static final Role INBOX = new Role("inbox", DefaultMailboxes.INBOX);
-    public static final Role DRAFTS = new Role("drafts", DefaultMailboxes.DRAFTS);
-    public static final Role OUTBOX = new Role("outbox", DefaultMailboxes.OUTBOX);
-    public static final Role SENT = new Role("sent", DefaultMailboxes.SENT);
-    public static final Role TRASH = new Role("trash", DefaultMailboxes.TRASH);
-    public static final Role ARCHIVE = new Role("archive", DefaultMailboxes.ARCHIVE);
-    public static final Role SPAM = new Role("spam", DefaultMailboxes.SPAM);
-    public static final Role TEMPLATES = new Role("templates", DefaultMailboxes.TEMPLATES);
-    
-    private static final Map<String, Role> ROLES = 
-            ImmutableList.<Role>of(INBOX, DRAFTS, OUTBOX, SENT, TRASH, ARCHIVE, SPAM, TEMPLATES)
-                .stream()
-                .collect(Collectors.toMap((Role x) -> x.name.toLowerCase(Locale.US), Function.identity()));
+    private static final List<Role> ROLES = 
+            ImmutableList.<Role>of(INBOX, DRAFTS, OUTBOX, SENT, TRASH, ARCHIVE, SPAM, TEMPLATES);
     
     private final String name;
     private final String defaultMailbox;
+    private final BiFunction<String, String, Boolean> comparator;
 
-    @VisibleForTesting Role(String name, String defaultMailbox) {
+    @VisibleForTesting Role(String name, String defaultMailbox, BiFunction<String, String, Boolean> comparator) {
         this.name = name;
         this.defaultMailbox = defaultMailbox;
+        this.comparator = comparator;
     }
 
     @VisibleForTesting Role(String name) {
         this.name = name;
         this.defaultMailbox = null;
+        this.comparator = NON_CASE_SENSITIVE_COMPARATOR;
     }
 
     public static Optional<Role> from(String name) {
-        Optional<Role> predefinedRole = Optional.ofNullable(ROLES.get(name.toLowerCase(Locale.US)));
+        Optional<Role> predefinedRole = predefinedRole(name);
         if (predefinedRole.isPresent()) {
             return predefinedRole;
         } else {
@@ -72,6 +74,12 @@ public class Role {
         }
     }
 
+    private static Optional<Role> predefinedRole(String name) {
+        return ROLES.stream()
+                .filter(role -> role.comparator.apply(role.defaultMailbox, name))
+                .findFirst();
+    }
+
     private static Optional<Role> tryBuildCustomRole(String name) {
         if (name.startsWith(USER_DEFINED_ROLE_PREFIX)) {
             return Optional.of(new Role(name));
@@ -80,7 +88,7 @@ public class Role {
     }
 
     public boolean isSystemRole() {
-        return ROLES.containsKey(name.toLowerCase(Locale.US));
+        return predefinedRole(defaultMailbox).isPresent();
     }
 
     @JsonValue

http://git-wip-us.apache.org/repos/asf/james-project/blob/cc2e8f08/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
index 9f6c4ce..1356a6b 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/methods/GetMailboxesMethodTest.java
@@ -232,13 +232,13 @@ public class GetMailboxesMethodTest {
     public void getMailboxesShouldReturnMailboxesWithSortOrder() throws Exception {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(USERNAME);
         mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "INBOX"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "ARCHIVE"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "DRAFTS"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "OUTBOX"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "SENT"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "TRASH"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "SPAM"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "TEMPLATES"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Archive"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Drafts"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Outbox"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Sent"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Trash"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Spam"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Templates"), mailboxSession);
 
         GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
                 .build();
@@ -254,13 +254,13 @@ public class GetMailboxesMethodTest {
                 .extracting(Mailbox::getName, Mailbox::getSortOrder)
                 .containsExactly(
                         Tuple.tuple("INBOX", SortOrder.of(10)),
-                        Tuple.tuple("ARCHIVE", SortOrder.of(20)),
-                        Tuple.tuple("DRAFTS", SortOrder.of(30)),
-                        Tuple.tuple("OUTBOX", SortOrder.of(40)),
-                        Tuple.tuple("SENT", SortOrder.of(50)),
-                        Tuple.tuple("TRASH", SortOrder.of(60)),
-                        Tuple.tuple("SPAM", SortOrder.of(70)),
-                        Tuple.tuple("TEMPLATES", SortOrder.of(80)));
+                        Tuple.tuple("Archive", SortOrder.of(20)),
+                        Tuple.tuple("Drafts", SortOrder.of(30)),
+                        Tuple.tuple("Outbox", SortOrder.of(40)),
+                        Tuple.tuple("Sent", SortOrder.of(50)),
+                        Tuple.tuple("Trash", SortOrder.of(60)),
+                        Tuple.tuple("Spam", SortOrder.of(70)),
+                        Tuple.tuple("Templates", SortOrder.of(80)));
     }
 
     @Test
@@ -339,13 +339,13 @@ public class GetMailboxesMethodTest {
     public void getMailboxesShouldReturnMailboxesWithRoles() throws Exception {
         MailboxSession mailboxSession = mailboxManager.createSystemSession(USERNAME);
         mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "INBOX"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "ARCHIVE"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "DRAFTS"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "OUTBOX"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "SENT"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "TRASH"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "SPAM"), mailboxSession);
-        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "TEMPLATES"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Archive"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Drafts"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Outbox"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Sent"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Trash"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Spam"), mailboxSession);
+        mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "Templates"), mailboxSession);
         mailboxManager.createMailbox(MailboxPath.forUser(USERNAME, "WITHOUT ROLE"), mailboxSession);
         
         GetMailboxesRequest getMailboxesRequest = GetMailboxesRequest.builder()
@@ -362,13 +362,13 @@ public class GetMailboxesMethodTest {
                 .extracting(Mailbox::getName, Mailbox::getRole)
                 .containsOnly(
                         Tuple.tuple("INBOX", Optional.of(Role.INBOX)),
-                        Tuple.tuple("ARCHIVE", Optional.of(Role.ARCHIVE)),
-                        Tuple.tuple("DRAFTS", Optional.of(Role.DRAFTS)),
-                        Tuple.tuple("OUTBOX", Optional.of(Role.OUTBOX)),
-                        Tuple.tuple("SENT", Optional.of(Role.SENT)),
-                        Tuple.tuple("TRASH", Optional.of(Role.TRASH)),
-                        Tuple.tuple("SPAM", Optional.of(Role.SPAM)),
-                        Tuple.tuple("TEMPLATES", Optional.of(Role.TEMPLATES)),
+                        Tuple.tuple("Archive", Optional.of(Role.ARCHIVE)),
+                        Tuple.tuple("Drafts", Optional.of(Role.DRAFTS)),
+                        Tuple.tuple("Outbox", Optional.of(Role.OUTBOX)),
+                        Tuple.tuple("Sent", Optional.of(Role.SENT)),
+                        Tuple.tuple("Trash", Optional.of(Role.TRASH)),
+                        Tuple.tuple("Spam", Optional.of(Role.SPAM)),
+                        Tuple.tuple("Templates", Optional.of(Role.TEMPLATES)),
                         Tuple.tuple("WITHOUT ROLE", Optional.empty()));
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/cc2e8f08/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/mailbox/RoleTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/mailbox/RoleTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/mailbox/RoleTest.java
index 05c7928..fcdcede 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/mailbox/RoleTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/model/mailbox/RoleTest.java
@@ -28,18 +28,19 @@ import org.junit.Test;
 public class RoleTest {
 
     @Test
-    public void fromShouldReturnInbox() {
-        assertThat(Role.from("inbox")).isEqualTo(Optional.of(Role.INBOX));
+    public void fromShouldReturnEmptyWhenUnknownValue() {
+        assertThat(Role.from("jjjj")).isEqualTo(Optional.empty());
     }
 
     @Test
-    public void fromShouldReturnEmptyWhenUnknownValue() {
-        assertThat(Role.from("jjjj")).isEqualTo(Optional.empty());
+    public void fromShouldReturnSomethingWhenXPrefixedRole() {
+        assertThat(Role.from("x-client-specific-role")).isEqualTo(Optional.of(new Role("x-client-specific-role")));
     }
 
     @Test
-    public void fromShouldReturnInboxWhenContainsUppercaseValue() {
-        assertThat(Role.from("InBox")).isEqualTo(Optional.of(Role.INBOX));
+    public void isSystemRoleShouldReturnFalseWhenXPrefixedRole() {
+        Role role = Role.from("x-client-specific-role").get();
+        assertThat(role.isSystemRole()).isFalse();
     }
 
     @Test
@@ -54,11 +55,6 @@ public class RoleTest {
     }
 
     @Test
-    public void fromShouldReturnSomethingWhenXPrefixedRole() {
-        assertThat(Role.from("x-client-specific-role")).isEqualTo(Optional.of(new Role("x-client-specific-role")));
-    }
-
-    @Test
     public void isSystemRoleShouldBeTrueWhenInbox() {
         assertThat(Role.INBOX.isSystemRole()).isTrue();
     }
@@ -103,4 +99,64 @@ public class RoleTest {
         Role userRole = Role.from(Role.USER_DEFINED_ROLE_PREFIX + "myRole").get();
         assertThat(userRole.isSystemRole()).isFalse();
     }
+
+    @Test
+    public void theINBOXMailboxNameShouldBeASystemMailbox() {
+        Role role = Role.from("INBOX").get();
+        assertThat(role.isSystemRole()).isTrue();
+    }
+
+    @Test
+    public void theInBoXMailboxNameShouldBeASystemMailbox() {
+        Role role = Role.from("InBoX").get();
+        assertThat(role.isSystemRole()).isTrue();
+    }
+
+    @Test
+    public void theDraftsMailboxNameShouldBeASystemMailbox() {
+        Role role = Role.from("Drafts").get();
+        assertThat(role.isSystemRole()).isTrue();
+    }
+
+    @Test
+    public void theDrAfTsMailboxNameShouldNotBeASystemMailbox() {
+        Optional<Role> role = Role.from("DrAfTs");
+        assertThat(role).isEmpty();
+    }
+
+    @Test
+    public void theOutboxMailboxNameShouldBeASystemMailbox() {
+        Role role = Role.from("Outbox").get();
+        assertThat(role.isSystemRole()).isTrue();
+    }
+
+    @Test
+    public void theOuTbOxMailboxNameShouldNotBeASystemMailbox() {
+        Optional<Role> role = Role.from("OuTbOx");
+        assertThat(role).isEmpty();
+    }
+
+    @Test
+    public void theSentMailboxNameShouldBeASystemMailbox() {
+        Role role = Role.from("Sent").get();
+        assertThat(role.isSystemRole()).isTrue();
+    }
+
+    @Test
+    public void theSeNtMailboxNameShouldNotBeASystemMailbox() {
+        Optional<Role> role = Role.from("SeNt");
+        assertThat(role).isEmpty();
+    }
+
+    @Test
+    public void theTrashMailboxNameShouldBeASystemMailbox() {
+        Role role = Role.from("Trash").get();
+        assertThat(role.isSystemRole()).isTrue();
+    }
+
+    @Test
+    public void theTrAsHMailboxNameShouldNotBeASystemMailbox() {
+        Optional<Role> role = Role.from("TrAsH");
+        assertThat(role).isEmpty();
+    }
 }
\ No newline at end of file


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