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