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


The following commit(s) were added to refs/heads/master by this push:
     new 891760b217 [REFACTORING] SetAclCommandParser refactoring to strongly 
type SetAclRequest (#2421)
891760b217 is described below

commit 891760b2177a88c1a163dca8c811e4f9b96e11b5
Author: florentos17 <fazav...@linagora.com>
AuthorDate: Tue Oct 1 16:23:37 2024 +0200

    [REFACTORING] SetAclCommandParser refactoring to strongly type 
SetAclRequest (#2421)
---
 .../org/apache/james/mailbox/model/MailboxACL.java | 21 +++++----
 .../org/apache/james/mailbox/acl/ACLDiffTest.java  |  2 +-
 .../james/mailbox/acl/PositiveUserACLDiffTest.java |  2 +-
 .../mailbox/acl/UnionMailboxACLResolverTest.java   |  2 +-
 .../apache/james/mailbox/model/MailboxACLTest.java |  3 +-
 .../mail/eventsourcing/acl/ACLUpdatedDTOTest.java  |  2 +-
 .../MailboxACLUpdatedEventSerializationTest.java   |  4 +-
 .../store/mail/model/MailboxMapperACLTest.java     |  6 +--
 .../imap/decode/parser/SetACLCommandParser.java    | 50 ++++++++++++++++++--
 .../james/imap/message/request/SetACLRequest.java  | 37 +++++++++------
 .../james/imap/processor/SetACLProcessor.java      | 52 ++++-----------------
 .../james/imap/processor/SetACLProcessorTest.java  | 54 ++++++++++++----------
 .../event/PropagateLookupRightListenerTest.java    |  2 +-
 13 files changed, 130 insertions(+), 107 deletions(-)

diff --git 
a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java 
b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
index bcde6e45b2..34204359b5 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/model/MailboxACL.java
@@ -355,6 +355,9 @@ public class MailboxACL {
 
     }
 
+    public static final boolean NEGATIVE_KEY = true;
+    public static final boolean POSITIVE_KEY = !NEGATIVE_KEY;
+
     /**
      * The key used in {@link MailboxACL#getEntries()}. Implementations should
      * override {@link #hashCode()} and {@link #equals(Object)} in such a way
@@ -364,7 +367,7 @@ public class MailboxACL {
      */
     public static class EntryKey {
         public static EntryKey createGroupEntryKey(String name) {
-            return new EntryKey(name, NameType.group, false);
+            return new EntryKey(name, NameType.group, POSITIVE_KEY);
         }
 
         public static EntryKey createGroupEntryKey(String name, boolean 
negative) {
@@ -372,11 +375,11 @@ public class MailboxACL {
         }
 
         public static EntryKey createUserEntryKey(Username name) {
-            return new EntryKey(name.asString(), NameType.user, false);
+            return new EntryKey(name.asString(), NameType.user, POSITIVE_KEY);
         }
 
         public static EntryKey createNegativeUserEntryKey(Username name) {
-            return new EntryKey(name.asString(), NameType.user, true);
+            return new EntryKey(name.asString(), NameType.user, NEGATIVE_KEY);
         }
 
         public static EntryKey createUserEntryKey(Username name, boolean 
negative) {
@@ -651,15 +654,15 @@ public class MailboxACL {
 
     static {
         try {
-            ANYONE_KEY = new EntryKey(SpecialName.anyone.name(), 
NameType.special, false);
-            ANYONE_NEGATIVE_KEY = new EntryKey(SpecialName.anyone.name(), 
NameType.special, true);
-            AUTHENTICATED_KEY = new EntryKey(SpecialName.authenticated.name(), 
NameType.special, false);
-            AUTHENTICATED_NEGATIVE_KEY = new 
EntryKey(SpecialName.authenticated.name(), NameType.special, true);
+            ANYONE_KEY = new EntryKey(SpecialName.anyone.name(), 
NameType.special, POSITIVE_KEY);
+            ANYONE_NEGATIVE_KEY = new EntryKey(SpecialName.anyone.name(), 
NameType.special, NEGATIVE_KEY);
+            AUTHENTICATED_KEY = new EntryKey(SpecialName.authenticated.name(), 
NameType.special, POSITIVE_KEY);
+            AUTHENTICATED_NEGATIVE_KEY = new 
EntryKey(SpecialName.authenticated.name(), NameType.special, NEGATIVE_KEY);
             EMPTY = new MailboxACL();
             FULL_RIGHTS =  new Rfc4314Rights(Right.allRights);
             NO_RIGHTS = new Rfc4314Rights();
-            OWNER_KEY = new EntryKey(SpecialName.owner.name(), 
NameType.special, false);
-            OWNER_NEGATIVE_KEY = new EntryKey(SpecialName.owner.name(), 
NameType.special, true);
+            OWNER_KEY = new EntryKey(SpecialName.owner.name(), 
NameType.special, POSITIVE_KEY);
+            OWNER_NEGATIVE_KEY = new EntryKey(SpecialName.owner.name(), 
NameType.special, NEGATIVE_KEY);
             OWNER_FULL_ACL = new MailboxACL(new Entry[] { new 
Entry(MailboxACL.OWNER_KEY, MailboxACL.FULL_RIGHTS) });
             OWNER_FULL_EXCEPT_ADMINISTRATION_ACL = new MailboxACL(new Entry[] 
{ new Entry(MailboxACL.OWNER_KEY, MailboxACL.FULL_RIGHTS.except(new 
Rfc4314Rights(Right.Administer))) });
         } catch (UnsupportedRightException e) {
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/acl/ACLDiffTest.java 
b/mailbox/api/src/test/java/org/apache/james/mailbox/acl/ACLDiffTest.java
index 8117e7e3ec..022709b81c 100644
--- a/mailbox/api/src/test/java/org/apache/james/mailbox/acl/ACLDiffTest.java
+++ b/mailbox/api/src/test/java/org/apache/james/mailbox/acl/ACLDiffTest.java
@@ -26,7 +26,7 @@ import org.apache.james.mailbox.model.MailboxACL;
 import org.junit.jupiter.api.Test;
 
 class ACLDiffTest {
-    private static final MailboxACL.EntryKey ENTRY_KEY = 
MailboxACL.EntryKey.createGroupEntryKey("any", false);
+    private static final MailboxACL.EntryKey ENTRY_KEY = 
MailboxACL.EntryKey.createGroupEntryKey("any", MailboxACL.POSITIVE_KEY);
     private static final MailboxACL.Rfc4314Rights RIGHTS = new 
MailboxACL.Rfc4314Rights(MailboxACL.Right.Administer);
 
     @Test
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/acl/PositiveUserACLDiffTest.java
 
b/mailbox/api/src/test/java/org/apache/james/mailbox/acl/PositiveUserACLDiffTest.java
index eaeef00874..dfb3e1e93d 100644
--- 
a/mailbox/api/src/test/java/org/apache/james/mailbox/acl/PositiveUserACLDiffTest.java
+++ 
b/mailbox/api/src/test/java/org/apache/james/mailbox/acl/PositiveUserACLDiffTest.java
@@ -33,7 +33,7 @@ class PositiveUserACLDiffTest {
 
     private static final Username USER = Username.of("user");
     private static final EntryKey USER_ENTRY_KEY = 
EntryKey.createUserEntryKey(USER);
-    private static final EntryKey NEGATIVE_USER_ENTRY_KEY = 
EntryKey.createUserEntryKey(USER, true);
+    private static final EntryKey NEGATIVE_USER_ENTRY_KEY = 
EntryKey.createUserEntryKey(USER, MailboxACL.NEGATIVE_KEY);
     private static final EntryKey GROUP_ENTRY_KEY = 
EntryKey.createGroupEntryKey("group");
     private static final Rfc4314Rights RIGHTS = new 
Rfc4314Rights(Right.Administer);
 
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/acl/UnionMailboxACLResolverTest.java
 
b/mailbox/api/src/test/java/org/apache/james/mailbox/acl/UnionMailboxACLResolverTest.java
index 56b0480919..9676efa798 100644
--- 
a/mailbox/api/src/test/java/org/apache/james/mailbox/acl/UnionMailboxACLResolverTest.java
+++ 
b/mailbox/api/src/test/java/org/apache/james/mailbox/acl/UnionMailboxACLResolverTest.java
@@ -64,7 +64,7 @@ class UnionMailboxACLResolverTest {
         noGlobals = new UnionMailboxACLResolver(MailboxACL.EMPTY, 
MailboxACL.EMPTY);
 
         user1Read = new MailboxACL(new Entry(user1Key, 
Rfc4314Rights.fromSerializedRfc4314Rights("r")));
-        user1ReadNegative = new MailboxACL(new 
Entry(EntryKey.createUserEntryKey(USER_1, true), 
Rfc4314Rights.fromSerializedRfc4314Rights("r")));
+        user1ReadNegative = new MailboxACL(new 
Entry(EntryKey.createUserEntryKey(USER_1, MailboxACL.NEGATIVE_KEY), 
Rfc4314Rights.fromSerializedRfc4314Rights("r")));
 
         anyoneRead = new MailboxACL(new Entry(MailboxACL.ANYONE_KEY, 
Rfc4314Rights.fromSerializedRfc4314Rights("r")));
         anyoneReadNegative = new MailboxACL(new 
Entry(MailboxACL.ANYONE_NEGATIVE_KEY, 
Rfc4314Rights.fromSerializedRfc4314Rights("r")));
diff --git 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxACLTest.java 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxACLTest.java
index 5785404374..0811570df8 100644
--- 
a/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxACLTest.java
+++ 
b/mailbox/api/src/test/java/org/apache/james/mailbox/model/MailboxACLTest.java
@@ -46,7 +46,6 @@ class MailboxACLTest {
     private static final String USER_2 = "user2";
     private static final Username USERNAME_1 = Username.of("user1");
     private static final Username USERNAME_2 = Username.of("user2");
-    private static final boolean NEGATIVE = true;
 
     private static final String ae = "ae";
     private static final String ik = "ik";
@@ -272,7 +271,7 @@ class MailboxACLTest {
     @Test
     void ofPositiveNameTypeShouldFilterOutNegativeEntries() throws Exception {
         MailboxACL mailboxACL = new MailboxACL(
-            ImmutableMap.of(EntryKey.createUserEntryKey(Username.of("user1"), 
NEGATIVE), MailboxACL.FULL_RIGHTS));
+            ImmutableMap.of(EntryKey.createUserEntryKey(Username.of("user1"), 
MailboxACL.NEGATIVE_KEY), MailboxACL.FULL_RIGHTS));
         assertThat(mailboxACL.ofPositiveNameType(NameType.user))
             .isEmpty();
     }
diff --git 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/eventsourcing/acl/ACLUpdatedDTOTest.java
 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/eventsourcing/acl/ACLUpdatedDTOTest.java
index 6fa89e2c37..476a35c688 100644
--- 
a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/eventsourcing/acl/ACLUpdatedDTOTest.java
+++ 
b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/eventsourcing/acl/ACLUpdatedDTOTest.java
@@ -39,7 +39,7 @@ class ACLUpdatedDTOTest {
         "    \"newAcl\":{\"entries\":{\"$any\":\"l\"}}" +
         "  }" +
         "}";
-    private static final MailboxACL.EntryKey ENTRY_KEY = 
MailboxACL.EntryKey.createGroupEntryKey("any", false);
+    private static final MailboxACL.EntryKey ENTRY_KEY = 
MailboxACL.EntryKey.createGroupEntryKey("any", MailboxACL.POSITIVE_KEY);
     private static final MailboxACL.Rfc4314Rights RIGHTS = new 
MailboxACL.Rfc4314Rights(MailboxACL.Right.Administer);
     private static final ACLUpdated EVENT = aclUpdated();
 
diff --git 
a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
 
b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
index e957e53daa..d1de1dc5b4 100644
--- 
a/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
+++ 
b/mailbox/event/json/src/test/java/org/apache/james/event/json/MailboxACLUpdatedEventSerializationTest.java
@@ -41,11 +41,11 @@ import org.junit.jupiter.api.Test;
 class MailboxACLUpdatedEventSerializationTest {
 
     private static final Username USERNAME = Username.of("user");
-    private static final MailboxACL.EntryKey ENTRY_KEY = 
org.apache.james.mailbox.model.MailboxACL.EntryKey.createGroupEntryKey("any", 
false);
+    private static final MailboxACL.EntryKey ENTRY_KEY = 
org.apache.james.mailbox.model.MailboxACL.EntryKey.createGroupEntryKey("any", 
MailboxACL.POSITIVE_KEY);
     private static final MailboxACL.Rfc4314Rights RIGHTS = new 
MailboxACL.Rfc4314Rights(MailboxACL.Right.Administer, MailboxACL.Right.Read);
     private static final MailboxACL MAILBOX_ACL = new MailboxACL(
         new MailboxACL.Entry(ENTRY_KEY, RIGHTS),
-        new 
MailboxACL.Entry(MailboxACL.EntryKey.createUserEntryKey(Username.of("alice"), 
true),
+        new 
MailboxACL.Entry(MailboxACL.EntryKey.createUserEntryKey(Username.of("alice"), 
MailboxACL.NEGATIVE_KEY),
             new MailboxACL.Rfc4314Rights(MailboxACL.Right.Insert)));
 
     private static final MailboxACLUpdated MAILBOX_ACL_UPDATED = new 
MailboxACLUpdated(
diff --git 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java
 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java
index f3e1382f31..88e87684a1 100644
--- 
a/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java
+++ 
b/mailbox/store/src/test/java/org/apache/james/mailbox/store/mail/model/MailboxMapperACLTest.java
@@ -39,8 +39,6 @@ import com.google.common.collect.ImmutableMap;
 
 public abstract class MailboxMapperACLTest {
     private static final UidValidity UID_VALIDITY = UidValidity.of(42);
-    private static final boolean POSITIVE = true;
-    private static final boolean NEGATIVE = !POSITIVE;
     private static final Username USER = Username.of("user");
     private static final Username USER_1 = Username.of("user1");
     private static final Username USER_2 = Username.of("user2");
@@ -103,8 +101,8 @@ public abstract class MailboxMapperACLTest {
 
     @Test
     void updateAclShouldTreatNegativeAndPositiveRightSeparately() {
-        EntryKey key1 = EntryKey.createUserEntryKey(USER, NEGATIVE);
-        EntryKey key2 = EntryKey.createUserEntryKey(USER, POSITIVE);
+        EntryKey key1 = EntryKey.createUserEntryKey(USER, 
MailboxACL.POSITIVE_KEY);
+        EntryKey key2 = EntryKey.createUserEntryKey(USER, 
MailboxACL.NEGATIVE_KEY);
         Rfc4314Rights rights = new Rfc4314Rights(Right.Administer, 
Right.PerformExpunge, Right.Write, Right.WriteSeenFlag);
         Rfc4314Rights newRights = new Rfc4314Rights(Right.WriteSeenFlag, 
Right.CreateMailbox, Right.Administer, Right.PerformExpunge, 
Right.DeleteMessages);
         mailboxMapper.updateACL(benwaInboxMailbox, 
MailboxACL.command().key(key1).rights(rights).asReplacement()).block();
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetACLCommandParser.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetACLCommandParser.java
index 7567bc024b..f152a3bec1 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetACLCommandParser.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/decode/parser/SetACLCommandParser.java
@@ -21,15 +21,21 @@ package org.apache.james.imap.decode.parser;
 
 import jakarta.inject.Inject;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.ImapMessage;
 import org.apache.james.imap.api.Tag;
+import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.response.StatusResponseFactory;
 import org.apache.james.imap.api.process.ImapSession;
 import org.apache.james.imap.decode.DecodingException;
 import org.apache.james.imap.decode.ImapRequestLineReader;
 import org.apache.james.imap.decode.base.AbstractImapCommandParser;
 import org.apache.james.imap.message.request.SetACLRequest;
+import org.apache.james.mailbox.exception.UnsupportedRightException;
+import org.apache.james.mailbox.model.MailboxACL;
+
+import com.google.common.base.CharMatcher;
 
 /**
  * SETACL Parser
@@ -43,10 +49,46 @@ public class SetACLCommandParser extends 
AbstractImapCommandParser {
 
     @Override
     protected ImapMessage decode(ImapRequestLineReader request, Tag tag, 
ImapSession session) throws DecodingException {
-        final String mailboxName = request.mailbox();
-        final String identifier = request.astring();
-        final String rights = request.astring();
+        SetACLRequest.MailboxName mailboxName = new 
SetACLRequest.MailboxName(request.mailbox());
+        MailboxACL.EntryKey entryKey = 
MailboxACL.EntryKey.deserialize(request.astring());
+        String editModeAndRights = request.astring();
         request.eol();
-        return new SetACLRequest(tag, mailboxName, identifier, rights);
+
+        MailboxACL.ACLCommand aclCommand = MailboxACL.command()
+                .key(entryKey)
+                .mode(parseEditMode(editModeAndRights))
+                .rights(parseRights(editModeAndRights))
+                .build();
+
+        return new SetACLRequest(tag, mailboxName, aclCommand);
+    }
+
+    private MailboxACL.EditMode parseEditMode(String editModeAndRights) {
+        if (StringUtils.isEmpty(editModeAndRights)) {
+            return MailboxACL.EditMode.REPLACE;
+        }
+
+        return switch (editModeAndRights.charAt(0)) {
+            case MailboxACL.ADD_RIGHTS_MARKER -> MailboxACL.EditMode.ADD;
+            case MailboxACL.REMOVE_RIGHTS_MARKER -> MailboxACL.EditMode.REMOVE;
+            default -> MailboxACL.EditMode.REPLACE;
+        };
+    }
+
+    private MailboxACL.Rfc4314Rights parseRights(String editModeAndRights) 
throws DecodingException {
+        if (StringUtils.isEmpty(editModeAndRights)) {
+            throw new DecodingException(HumanReadableText.INVALID_COMMAND, 
"SETACL command must include rights. If you want to remove rights for that 
user, please use a DELETEACL command.");
+        }
+        try {
+            if (CharMatcher.anyOf("" + MailboxACL.ADD_RIGHTS_MARKER + 
MailboxACL.REMOVE_RIGHTS_MARKER).matches(editModeAndRights.charAt(0))) {
+                // first character is the edit mode, to be excluded here
+                return 
MailboxACL.Rfc4314Rights.deserialize(editModeAndRights.substring(1));
+            } else {
+                // no edit mode
+                return MailboxACL.Rfc4314Rights.deserialize(editModeAndRights);
+            }
+        } catch (UnsupportedRightException e) {
+            throw new DecodingException(HumanReadableText.UNSUPPORTED, 
e.getMessage(), e.getCause());
+        }
     }
 }
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetACLRequest.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetACLRequest.java
index 1b34bb6d3f..6b602ad87e 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetACLRequest.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/message/request/SetACLRequest.java
@@ -21,42 +21,49 @@ package org.apache.james.imap.message.request;
 
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.Tag;
+import org.apache.james.mailbox.model.MailboxACL;
 
 import com.google.common.base.MoreObjects;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Strings;
 
 /**
  * SETACL Request.
  */
 public class SetACLRequest extends AbstractImapRequest {
-    private final String identifier;
-    private final String mailboxName;
-    private final String rights;
 
-    public SetACLRequest(Tag tag, String mailboxName, String identifier, 
String rights) {
-        super(tag, ImapConstants.SETACL_COMMAND);
-        this.mailboxName = mailboxName;
-        this.identifier = identifier;
-        this.rights = rights;
+    public record MailboxName(String mailboxName) {
+        public MailboxName {
+            Preconditions.checkArgument(!Strings.isNullOrEmpty(mailboxName), 
"MailboxName must not be null or empty");
+        }
+
+        public String asString() {
+            return mailboxName;
+        }
     }
 
-    public String getIdentifier() {
-        return identifier;
+    private final MailboxName mailboxName;
+    private final MailboxACL.ACLCommand aclCommand;
+
+    public SetACLRequest(Tag tag, MailboxName mailboxName, 
MailboxACL.ACLCommand aclCommand) {
+        super(tag, ImapConstants.SETACL_COMMAND);
+        this.mailboxName = mailboxName;
+        this.aclCommand = aclCommand;
     }
 
-    public String getMailboxName() {
+    public MailboxName getMailboxName() {
         return mailboxName;
     }
 
-    public String getRights() {
-        return rights;
+    public MailboxACL.ACLCommand getAclCommand() {
+        return aclCommand;
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(this)
-            .add("identifier", identifier)
             .add("mailboxName", mailboxName)
-            .add("rights", rights)
+            .add("ACL command", aclCommand)
             .toString();
     }
 }
diff --git 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java
 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java
index 0c3984cd35..752dffb305 100644
--- 
a/protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java
+++ 
b/protocols/imap/src/main/java/org/apache/james/imap/processor/SetACLProcessor.java
@@ -25,8 +25,6 @@ import java.util.List;
 
 import jakarta.inject.Inject;
 
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.Pair;
 import org.apache.james.imap.api.ImapConstants;
 import org.apache.james.imap.api.display.HumanReadableText;
 import org.apache.james.imap.api.message.Capability;
@@ -40,9 +38,6 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.MailboxACL;
-import org.apache.james.mailbox.model.MailboxACL.EditMode;
-import org.apache.james.mailbox.model.MailboxACL.EntryKey;
-import org.apache.james.mailbox.model.MailboxACL.Rfc4314Rights;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.metrics.api.MetricFactory;
 import org.apache.james.util.FunctionalUtils;
@@ -72,15 +67,14 @@ public class SetACLProcessor extends 
AbstractMailboxProcessor<SetACLRequest> imp
     protected Mono<Void> processRequestReactive(SetACLRequest request, 
ImapSession session, Responder responder) {
         final MailboxManager mailboxManager = getMailboxManager();
         final MailboxSession mailboxSession = session.getMailboxSession();
-        final String mailboxName = request.getMailboxName();
-        final String identifier = request.getIdentifier();
-        MailboxPath mailboxPath = 
PathConverter.forSession(session).buildFullPath(mailboxName);
+        final SetACLRequest.MailboxName mailboxName = request.getMailboxName();
+        MailboxPath mailboxPath = 
PathConverter.forSession(session).buildFullPath(mailboxName.asString());
 
         return checkLookupRight(request, responder, mailboxManager, 
mailboxSession, mailboxPath)
             .filter(FunctionalUtils.identityPredicate())
             .flatMap(hasLookupRight -> checkAdminRight(request, responder, 
mailboxManager, mailboxSession, mailboxName, mailboxPath))
             .filter(FunctionalUtils.identityPredicate())
-            .flatMap(hasAdminRight -> applyRight(mailboxManager, 
mailboxSession, identifier, request, mailboxPath)
+            .flatMap(hasAdminRight -> applyRight(mailboxManager, 
mailboxSession, request, mailboxPath)
                 .then(Mono.fromRunnable(() -> okComplete(request, responder)))
                 .then())
             .onErrorResume(UnsupportedRightException.class,
@@ -96,42 +90,17 @@ public class SetACLProcessor extends 
AbstractMailboxProcessor<SetACLRequest> imp
                 error -> Mono.fromRunnable(() -> no(request, responder, 
HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING)));
     }
 
-    /* parsing the rights is the cheapest thing to begin with */
-    private Pair<Rfc4314Rights, EditMode> 
parsingRightAndEditMode(SetACLRequest request) throws UnsupportedRightException 
{
-        EditMode editMode = EditMode.REPLACE;
-        String rights = request.getRights();
-        if (StringUtils.isNotEmpty(rights)) {
-            switch (rights.charAt(0)) {
-                case MailboxACL.ADD_RIGHTS_MARKER:
-                    editMode = EditMode.ADD;
-                    rights = rights.substring(1);
-                    break;
-                case MailboxACL.REMOVE_RIGHTS_MARKER:
-                    editMode = EditMode.REMOVE;
-                    rights = rights.substring(1);
-                    break;
-            }
-        }
-        return Pair.of(Rfc4314Rights.fromSerializedRfc4314Rights(rights), 
editMode);
-    }
-
     private Mono<Void> applyRight(MailboxManager mailboxManager,
                                   MailboxSession mailboxSession,
-                                  String identifier,
                                   SetACLRequest request,
                                   MailboxPath mailboxPath) {
-        return Mono.fromCallable(() -> parsingRightAndEditMode(request))
-            .flatMap(rightAndEditMode -> 
Mono.from(mailboxManager.applyRightsCommandReactive(
+        return Mono.from(mailboxManager.applyRightsCommandReactive(
                 mailboxPath,
-                MailboxACL.command()
-                    .key(EntryKey.deserialize(identifier))
-                    .mode(rightAndEditMode.getRight())
-                    .rights(rightAndEditMode.getLeft())
-                    .build(),
-                mailboxSession)));
+                request.getAclCommand(),
+                mailboxSession));
     }
 
-    private Mono<Boolean> checkAdminRight(SetACLRequest request, Responder 
responder, MailboxManager mailboxManager, MailboxSession mailboxSession, String 
mailboxName, MailboxPath mailboxPath) {
+    private Mono<Boolean> checkAdminRight(SetACLRequest request, Responder 
responder, MailboxManager mailboxManager, MailboxSession mailboxSession, 
SetACLRequest.MailboxName mailboxName, MailboxPath mailboxPath) {
         return Mono.from(mailboxManager.hasRightReactive(mailboxPath, 
MailboxACL.Right.Administer, mailboxSession))
             .doOnNext(hasRight -> {
                 if (!hasRight) {
@@ -141,7 +110,7 @@ public class SetACLProcessor extends 
AbstractMailboxProcessor<SetACLRequest> imp
                             
HumanReadableText.UNSUFFICIENT_RIGHTS_DEFAULT_VALUE,
                             MailboxACL.Right.Administer.toString(),
                             request.getCommand().getName(),
-                            mailboxName));
+                            mailboxName.asString()));
                 }
             });
     }
@@ -164,8 +133,7 @@ public class SetACLProcessor extends 
AbstractMailboxProcessor<SetACLRequest> imp
     protected MDCBuilder mdc(SetACLRequest request) {
         return MDCBuilder.create()
             .addToContext(MDCBuilder.ACTION, "SET_ACL")
-            .addToContext("mailbox", request.getMailboxName())
-            .addToContext("identifier", request.getIdentifier())
-            .addToContext("rights", request.getRights());
+            .addToContext("mailbox", request.getMailboxName().asString())
+            .addToContext("ACL command", request.getAclCommand().toString());
     }
 }
diff --git 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
index 847d3fe223..5ef6fe8e44 100644
--- 
a/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
+++ 
b/protocols/imap/src/test/java/org/apache/james/imap/processor/SetACLProcessorTest.java
@@ -21,6 +21,7 @@ package org.apache.james.imap.processor;
 
 import static org.apache.james.imap.ImapFixture.TAG;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertThrows;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -42,6 +43,7 @@ import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageManager.MailboxMetaData;
 import org.apache.james.mailbox.MessageManager.MailboxMetaData.FetchGroup;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
+import org.apache.james.mailbox.exception.UnsupportedRightException;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxACL.EditMode;
 import org.apache.james.mailbox.model.MailboxACL.EntryKey;
@@ -101,30 +103,29 @@ class SetACLProcessorTest {
         when(mailboxManager.getMailbox(any(MailboxPath.class), 
any(MailboxSession.class)))
             .thenReturn(messageManager);
 
-        replaceAclRequest = new SetACLRequest(TAG, MAILBOX_NAME, 
USER_1.asString(), SET_RIGHTS);
+        MailboxACL.ACLCommand aclCommand = MailboxACL.command()
+                .key(MailboxACL.EntryKey.createUserEntryKey(USER_1))
+                .mode(EditMode.REPLACE)
+                .rights(MailboxACL.Rfc4314Rights.deserialize(SET_RIGHTS))
+                .build();
+        replaceAclRequest = new SetACLRequest(TAG, new 
SetACLRequest.MailboxName(MAILBOX_NAME), aclCommand);
 
         user1Key = EntryKey.deserialize(USER_1.asString());
         setRights = Rfc4314Rights.fromSerializedRfc4314Rights(SET_RIGHTS);
     }
-    
+
     @Test
     void testUnsupportedRight() {
-        SetACLRequest setACLRequest = new SetACLRequest(TAG, MAILBOX_NAME, 
USER_1.asString(), UNSUPPORTED_RIGHT);
-
-        when(mailboxManager.hasRightReactive(path, MailboxACL.Right.Lookup, 
mailboxSession))
-            .thenReturn(Mono.just(true));
-        when(mailboxManager.hasRightReactive(path, 
MailboxACL.Right.Administer, mailboxSession))
-            .thenReturn(Mono.just(true));
-
-        subject.doProcess(setACLRequest, responder, imapSession).block();
-
-        verify(responder, times(1)).respond(argumentCaptor.capture());
-        verifyNoMoreInteractions(responder);
-
-        assertThat(argumentCaptor.getAllValues())
-            .hasSize(1);
-        assertThat(argumentCaptor.getAllValues().get(0))
-            .matches(StatusResponseTypeMatcher.BAD_RESPONSE_MATCHER::matches);
+        assertThrows(UnsupportedRightException.class, () -> {
+            MailboxACL.Rfc4314Rights unsupportedRight = 
MailboxACL.Rfc4314Rights.deserialize(UNSUPPORTED_RIGHT);
+            MailboxACL.EntryKey entryKey = 
MailboxACL.EntryKey.createUserEntryKey(USER_1);
+            MailboxACL.ACLCommand aclCommand = MailboxACL.command()
+                    .key(entryKey)
+                    .mode(EditMode.REPLACE)
+                    .rights(unsupportedRight)
+                    .build();
+            new SetACLRequest(TAG, new 
SetACLRequest.MailboxName(MAILBOX_NAME), aclCommand);
+        });
     }
     
     @Test
@@ -164,20 +165,20 @@ class SetACLProcessorTest {
 
     @Test
     void testAddRights() throws Exception {
-        testOp("+", EditMode.ADD);
+        testOp(EditMode.ADD);
     }
 
     @Test
     void testRemoveRights() throws Exception {
-        testOp("-", EditMode.REMOVE);
+        testOp(EditMode.REMOVE);
     }
 
     @Test
     void testReplaceRights() throws Exception {
-        testOp("", EditMode.REPLACE);
+        testOp(EditMode.REPLACE);
     }
     
-    private void testOp(String prefix, EditMode editMode) {
+    private void testOp(EditMode editMode) throws UnsupportedRightException {
         when(mailboxManager.hasRightReactive(path, MailboxACL.Right.Lookup, 
mailboxSession))
             .thenReturn(Mono.just(true));
         when(mailboxManager.hasRightReactive(path, 
MailboxACL.Right.Administer, mailboxSession))
@@ -187,8 +188,13 @@ class SetACLProcessorTest {
             mailboxSession))
             .thenReturn(Mono.empty());
 
-        SetACLRequest r = new SetACLRequest(TAG, MAILBOX_NAME, 
USER_1.asString(), prefix + SET_RIGHTS);
-        subject.doProcess(r, responder, imapSession).block();
+        MailboxACL.ACLCommand aclCommand = MailboxACL.command()
+                .key(MailboxACL.EntryKey.createUserEntryKey(USER_1))
+                .mode(editMode)
+                .rights(MailboxACL.Rfc4314Rights.deserialize(SET_RIGHTS))
+                .build();
+        SetACLRequest setACLRequest = new SetACLRequest(TAG, new 
SetACLRequest.MailboxName(MAILBOX_NAME), aclCommand);
+        subject.doProcess(setACLRequest, responder, imapSession).block();
 
         verify(mailboxManager).applyRightsCommandReactive(path,
             
MailboxACL.command().key(user1Key).rights(setRights).mode(editMode).build(),
diff --git 
a/server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
 
b/server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
index c11490a49e..df9a9a1930 100644
--- 
a/server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
+++ 
b/server/protocols/jmap-rfc-8621/src/test/java/org/apache/james/jmap/event/PropagateLookupRightListenerTest.java
@@ -320,7 +320,7 @@ public class PropagateLookupRightListenerTest {
 
     @Test
     public void eventShouldDoNothingWhenNegativeACLEntry() throws Exception {
-        EntryKey negativeUserKey = EntryKey.createUserEntryKey(SHARED_USER, 
true);
+        EntryKey negativeUserKey = EntryKey.createUserEntryKey(SHARED_USER, 
MailboxACL.NEGATIVE_KEY);
         storeRightManager.applyRightsCommand(
             GRAND_CHILD_MAILBOX,
             MailboxACL.command()


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

Reply via email to