Author: norman
Date: Sat Jan 28 13:33:34 2012
New Revision: 1237058
URL: http://svn.apache.org/viewvc?rev=1237058&view=rev
Log:
Add support for ACL extension. Thanks to Jochen Gazda for the patch.See IMAP-351
Added:
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/GetACLCommandParser.java
(with props)
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java
(with props)
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/GetACLRequest.java
(with props)
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/ACLResponse.java
(with props)
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
(with props)
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
(with props)
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/StatusResponseTypeMatcher.java
(with props)
Modified:
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
Modified:
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java?rev=1237058&r1=1237057&r2=1237058&view=diff
==============================================================================
---
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
(original)
+++
james/imap/trunk/api/src/main/java/org/apache/james/imap/api/ImapConstants.java
Sat Jan 28 13:33:34 2012
@@ -103,6 +103,8 @@ public interface ImapConstants {
public static final String SUPPORTS_QRESYNC = "QRESYNC";
+ public static final String SUPPORTS_ACL = "ACL";
+
public static final String INBOX_NAME = "INBOX";
public static final String MIME_TYPE_TEXT = "TEXT";
@@ -212,6 +214,16 @@ public interface ImapConstants {
public static final String APPEND_COMMAND_NAME = "APPEND";
public static final String ENABLE_COMMAND_NAME = "ENABLE";
+
+ public static final String GETACL_COMMAND_NAME = "GETACL";
+
+ public static final String SETACL_COMMAND_NAME = "SETACL";
+
+ public static final String DELETEACL_COMMAND_NAME = "DELETEACL";
+
+ public static final String LISTRIGHTS_COMMAND_NAME = "LISTRIGHTS";
+
+ public static final String MYRIGHTS_COMMAND_NAME = "MYRIGHTS";
public static final String LIST_RESPONSE_NAME = "LIST";
@@ -221,6 +233,8 @@ public interface ImapConstants {
public static final String SEARCH_RESPONSE_NAME = "SEARCH";
+ public static final String ACL_RESPONSE_NAME = "ACL";
+
public static final String NAME_ATTRIBUTE_NOINFERIORS = "\\Noinferiors";
public static final String NAME_ATTRIBUTE_NOSELECT = "\\Noselect";
Added:
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/GetACLCommandParser.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/GetACLCommandParser.java?rev=1237058&view=auto
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/GetACLCommandParser.java
(added)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/GetACLCommandParser.java
Sat Jan 28 13:33:34 2012
@@ -0,0 +1,48 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.imap.decode.parser;
+
+import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.ImapMessage;
+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.GetACLRequest;
+
+/**
+ * GETACL Parser
+ *
+ */
+public class GetACLCommandParser extends AbstractImapCommandParser {
+
+ public GetACLCommandParser() {
+
super(ImapCommand.authenticatedStateCommand(ImapConstants.GETACL_COMMAND_NAME));
+ }
+
+ @Override
+ protected ImapMessage decode(ImapCommand command, ImapRequestLineReader
request, String tag, ImapSession session) throws DecodingException {
+ final String mailboxName = request.mailbox();
+ request.eol();
+ return new GetACLRequest(tag, command, mailboxName);
+ }
+
+}
Propchange:
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/GetACLCommandParser.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java?rev=1237058&r1=1237057&r2=1237058&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/decode/parser/ImapParserFactory.java
Sat Jan 28 13:33:34 2012
@@ -72,8 +72,8 @@ public class ImapParserFactory implement
// RFC2342 NAMESPACE
_imapCommands.put(ImapConstants.NAMESPACE_COMMAND_NAME,
NamespaceCommandParser.class);
- // RFC2086 GETACL, SETACL, DELETEACL, LISTRIGHTS, MYRIGHTS
- // _imapCommands.put( "GETACL", GetAclCommand.class );
+ // RFC4314 GETACL, SETACL, DELETEACL, LISTRIGHTS, MYRIGHTS
+ _imapCommands.put(ImapConstants.GETACL_COMMAND_NAME,
GetACLCommandParser.class );
// _imapCommands.put( "SETACL", SetAclCommand.class );
// _imapCommands.put( "DELETEACL", DeleteAclCommand.class );
// _imapCommands.put( "LISTRIGHTS", ListRightsCommand.class );
Added:
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java?rev=1237058&view=auto
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java
(added)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java
Sat Jan 28 13:33:34 2012
@@ -0,0 +1,83 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.imap.encode;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.ImapMessage;
+import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.encode.base.AbstractChainedImapEncoder;
+import org.apache.james.imap.message.response.ACLResponse;
+import org.apache.james.mailbox.MailboxACL.MailboxACLEntryKey;
+import org.apache.james.mailbox.MailboxACL.MailboxACLRights;
+
+/**
+ * ACL Response Encoder.
+ *
+ */
+public class ACLResponseEncoder extends AbstractChainedImapEncoder {
+
+ public ACLResponseEncoder(ImapEncoder next) {
+ super(next);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.apache.james.imap.encode.base.AbstractChainedImapEncoder#doEncode
+ * (org.apache.james.imap.api.ImapMessage,
+ * org.apache.james.imap.encode.ImapResponseComposer,
+ * org.apache.james.imap.api.process.ImapSession)
+ */
+ protected void doEncode(ImapMessage acceptableMessage,
ImapResponseComposer composer, ImapSession session) throws IOException {
+ final ACLResponse aclResponse = (ACLResponse) acceptableMessage;
+ final Map<MailboxACLEntryKey, MailboxACLRights> entries =
aclResponse.getAcl().getEntries();
+ composer.untagged();
+ composer.commandName(ImapConstants.ACL_RESPONSE_NAME);
+
+ String mailboxName = aclResponse.getMailboxName();
+ composer.quote(mailboxName == null ? "" : mailboxName);
+
+ if (entries != null) {
+ for (Entry<MailboxACLEntryKey, MailboxACLRights> entry :
entries.entrySet()) {
+ String identifier = entry.getKey().serialize();
+ composer.quote(identifier);
+ String rights = entry.getValue().serialize();
+ composer.quote(rights == null ? "" : rights);
+ }
+ }
+ composer.end();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ *
org.apache.james.imap.encode.base.AbstractChainedImapEncoder#isAcceptable
+ * (org.apache.james.imap.api.ImapMessage)
+ */
+ public boolean isAcceptable(ImapMessage message) {
+ return message instanceof ACLResponse;
+ }
+}
Propchange:
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/ACLResponseEncoder.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java?rev=1237058&r1=1237057&r2=1237058&view=diff
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
(original)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/encode/main/DefaultImapEncoderFactory.java
Sat Jan 28 13:33:34 2012
@@ -20,6 +20,7 @@
package org.apache.james.imap.encode.main;
import org.apache.james.imap.api.display.Localizer;
+import org.apache.james.imap.encode.ACLResponseEncoder;
import org.apache.james.imap.encode.AuthenticateResponseEncoder;
import org.apache.james.imap.encode.CapabilityResponseEncoder;
import org.apache.james.imap.encode.ContinuationResponseEncoder;
@@ -59,7 +60,9 @@ public class DefaultImapEncoderFactory i
*/
public static final ImapEncoder createDefaultEncoder(final Localizer
localizer, final boolean neverAddBodyStructureExtensions) {
final EndImapEncoder endImapEncoder = new EndImapEncoder();
- final NamespaceResponseEncoder namespaceEncoder = new
NamespaceResponseEncoder(endImapEncoder);
+
+ final ACLResponseEncoder aclResponseEncoder = new
ACLResponseEncoder(endImapEncoder);
+ final NamespaceResponseEncoder namespaceEncoder = new
NamespaceResponseEncoder(aclResponseEncoder);
final StatusResponseEncoder statusResponseEncoder = new
StatusResponseEncoder(namespaceEncoder, localizer);
final RecentResponseEncoder recentResponseEncoder = new
RecentResponseEncoder(statusResponseEncoder);
final FetchResponseEncoder fetchResponseEncoder = new
FetchResponseEncoder(recentResponseEncoder, neverAddBodyStructureExtensions);
Added:
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/GetACLRequest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/GetACLRequest.java?rev=1237058&view=auto
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/GetACLRequest.java
(added)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/GetACLRequest.java
Sat Jan 28 13:33:34 2012
@@ -0,0 +1,41 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.imap.message.request;
+
+import org.apache.james.imap.api.ImapCommand;
+
+/**
+ * GETACL Request.
+ *
+ * @author Peter Palaga
+ */
+public class GetACLRequest extends AbstractImapRequest {
+ private final String mailboxName;
+
+ public GetACLRequest(String tag, ImapCommand command, String mailboxName) {
+ super(tag, command);
+ this.mailboxName = mailboxName;
+ }
+
+ public String getMailboxName() {
+ return mailboxName;
+ }
+
+}
Propchange:
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/request/GetACLRequest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/ACLResponse.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/ACLResponse.java?rev=1237058&view=auto
==============================================================================
---
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/ACLResponse.java
(added)
+++
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/ACLResponse.java
Sat Jan 28 13:33:34 2012
@@ -0,0 +1,91 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.imap.message.response;
+
+import java.util.Map.Entry;
+
+import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.display.CharsetUtil;
+import org.apache.james.imap.api.message.response.ImapResponseMessage;
+import org.apache.james.mailbox.MailboxACL;
+import org.apache.james.mailbox.MailboxACL.MailboxACLEntryKey;
+import org.apache.james.mailbox.MailboxACL.MailboxACLRights;
+
+/**
+ * ACL Response.
+ *
+ */
+public final class ACLResponse implements ImapResponseMessage {
+ private final MailboxACL acl;
+
+ private final String mailboxName;
+
+ public ACLResponse(String mailboxName, MailboxACL acl) {
+ super();
+ //FIXME encodeModifiedUTF7 invocations should probably be moved to
org.apache.james.imap.encode.ImapResponseComposer analogically to
org.apache.james.imap.decode.ImapRequestLineReader.mailbox()
+ this.mailboxName = CharsetUtil.encodeModifiedUTF7(mailboxName);
+ this.acl = acl;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (o instanceof ACLResponse) {
+ ACLResponse other = (ACLResponse) o;
+ return this.acl == other.acl || (this.acl != null &&
this.acl.equals(other.acl))
+ && this.mailboxName == other.mailboxName ||
(this.mailboxName != null && this.mailboxName.equals(other.mailboxName))
+ ;
+ }
+ return false;
+ }
+
+ public MailboxACL getAcl() {
+ return acl;
+ }
+
+ public String getMailboxName() {
+ return mailboxName;
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ return PRIME * acl.hashCode() + mailboxName.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder result = new StringBuilder()
+ .append(ImapConstants.ACL_RESPONSE_NAME)
+ .append(' ')
+ .append(mailboxName);
+
+ for (Entry<MailboxACLEntryKey, MailboxACLRights> en :
acl.getEntries().entrySet()) {
+ result
+ .append(' ')
+ .append(en.getKey().toString())
+ .append(' ')
+ .append(en.getValue().toString())
+ ;
+ }
+
+ return result.toString();
+ };
+
+}
Propchange:
james/imap/trunk/message/src/main/java/org/apache/james/imap/message/response/ACLResponse.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java?rev=1237058&r1=1237057&r2=1237058&view=diff
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
(original)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/DefaultProcessorChain.java
Sat Jan 28 13:33:34 2012
@@ -84,7 +84,11 @@ public class DefaultProcessorChain {
final UnselectProcessor unselectProcessor = new
UnselectProcessor(startTLSProcessor, mailboxManager, statusResponseFactory);
final CompressProcessor compressProcessor = new
CompressProcessor(unselectProcessor, statusResponseFactory);
- final EnableProcessor enableProcessor = new
EnableProcessor(compressProcessor, mailboxManager, statusResponseFactory);
+
+ final GetACLProcessor getACLProcessor = new
GetACLProcessor(compressProcessor, mailboxManager, statusResponseFactory);
+
+ final EnableProcessor enableProcessor = new
EnableProcessor(getACLProcessor, mailboxManager, statusResponseFactory);
+
// add for QRESYNC
enableProcessor.addProcessor(selectProcessor);
@@ -108,6 +112,8 @@ public class DefaultProcessorChain {
// Add to announce QRESYNC
capabilityProcessor.addProcessor(selectProcessor);
+
+ capabilityProcessor.addProcessor(getACLProcessor);
return enableProcessor;
Added:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java?rev=1237058&view=auto
==============================================================================
---
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
(added)
+++
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
Sat Jan 28 13:33:34 2012
@@ -0,0 +1,113 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.imap.processor;
+
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.display.HumanReadableText;
+import org.apache.james.imap.api.message.response.StatusResponseFactory;
+import org.apache.james.imap.api.process.ImapProcessor;
+import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.message.request.GetACLRequest;
+import org.apache.james.imap.message.response.ACLResponse;
+import org.apache.james.mailbox.InsufficientRightsException;
+import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxNotFoundException;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageManager.MetaData;
+import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
+import org.apache.james.mailbox.SimpleMailboxACL.Rfc4314Rights;
+
+/**
+ * GETACL Processor.
+ *
+ */
+public class GetACLProcessor extends AbstractMailboxProcessor<GetACLRequest>
implements CapabilityImplementingProcessor {
+
+ private static final List<String> CAPABILITIES =
Collections.singletonList(ImapConstants.SUPPORTS_ACL);
+
+ public GetACLProcessor(ImapProcessor next, MailboxManager mailboxManager,
StatusResponseFactory factory) {
+ super(GetACLRequest.class, next, mailboxManager, factory);
+ }
+
+ @Override
+ protected void doProcess(GetACLRequest message, ImapSession session,
String tag, ImapCommand command, Responder responder) {
+
+ final MailboxManager mailboxManager = getMailboxManager();
+ final MailboxSession mailboxSession =
ImapSessionUtils.getMailboxSession(session);
+ try {
+ String mailboxName = message.getMailboxName();
+
+ MessageManager messageManager =
mailboxManager.getMailbox(buildFullPath(session, mailboxName), mailboxSession);
+
+ /*
+ * RFC 4314 section 6.
+ * An implementation MUST make sure the ACL commands themselves do
+ * not give information about mailboxes with appropriately
+ * restricted ACLs. For example, when a user agent executes a
GETACL
+ * command on a mailbox that the user has no permission to LIST,
the
+ * server would respond to that request with the same error that
+ * would be used if the mailbox did not exist, thus revealing no
+ * existence information, much less the mailboxâs ACL.
+ */
+ if (!messageManager.hasRight(Rfc4314Rights.l_Lookup_RIGHT,
mailboxSession)) {
+ throw new MailboxNotFoundException(mailboxName);
+ }
+
+ /* RFC 4314 section 4. */
+ if (!messageManager.hasRight(Rfc4314Rights.a_Administer_RIGHT,
mailboxSession)) {
+ throw new InsufficientRightsException();
+ }
+
+ MetaData metaData = messageManager.getMetaData(false,
mailboxSession, FetchGroup.NO_COUNT);
+ ACLResponse aclResponse = new ACLResponse(mailboxName,
metaData.getACL());
+ responder.respond(aclResponse);
+ okComplete(command, tag, responder);
+ // FIXME should we send unsolicited responses here?
+ // unsolicitedResponses(session, responder, false);
+ } catch (MailboxNotFoundException e) {
+ no(command, tag, responder, HumanReadableText.MAILBOX_NOT_FOUND);
+ } catch (InsufficientRightsException e) {
+ // FIXME: be more specific in the human readable text.
+ no(command, tag, responder,
HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+ } catch (MailboxException e) {
+ // FIXME: be more specific in the human readable text.
+ no(command, tag, responder,
HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+ }
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.apache.james.imap.processor.CapabilityImplementingProcessor#
+ *
getImplementedCapabilities(org.apache.james.imap.api.process.ImapSession)
+ */
+ public List<String> getImplementedCapabilities(ImapSession session) {
+ return CAPABILITIES;
+ }
+
+}
Propchange:
james/imap/trunk/processor/src/main/java/org/apache/james/imap/processor/GetACLProcessor.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java?rev=1237058&view=auto
==============================================================================
---
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
(added)
+++
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
Sat Jan 28 13:33:34 2012
@@ -0,0 +1,217 @@
+/****************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one *
+ * or more contributor license agreements. See the NOTICE file *
+ * distributed with this work for additional information *
+ * regarding copyright ownership. The ASF licenses this file *
+ * to you under the Apache License, Version 2.0 (the *
+ * "License"); you may not use this file except in compliance *
+ * with the License. You may obtain a copy of the License at *
+ * *
+ * http://www.apache.org/licenses/LICENSE-2.0 *
+ * *
+ * Unless required by applicable law or agreed to in writing, *
+ * software distributed under the License is distributed on an *
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
+ * KIND, either express or implied. See the License for the *
+ * specific language governing permissions and limitations *
+ * under the License. *
+ ****************************************************************/
+
+package org.apache.james.imap.processor;
+
+import org.apache.james.imap.api.ImapCommand;
+import org.apache.james.imap.api.ImapConstants;
+import org.apache.james.imap.api.ImapSessionState;
+import org.apache.james.imap.api.ImapSessionUtils;
+import org.apache.james.imap.api.message.response.StatusResponse;
+import org.apache.james.imap.api.process.ImapProcessor;
+import org.apache.james.imap.api.process.ImapProcessor.Responder;
+import org.apache.james.imap.api.process.ImapSession;
+import org.apache.james.imap.message.request.GetACLRequest;
+import org.apache.james.imap.message.response.ACLResponse;
+import org.apache.james.imap.message.response.UnpooledStatusResponseFactory;
+import org.apache.james.mailbox.MailboxACL;
+import org.apache.james.mailbox.MailboxException;
+import org.apache.james.mailbox.MailboxManager;
+import org.apache.james.mailbox.MailboxNotFoundException;
+import org.apache.james.mailbox.MailboxPath;
+import org.apache.james.mailbox.MailboxSession;
+import org.apache.james.mailbox.MailboxSession.User;
+import org.apache.james.mailbox.MessageManager;
+import org.apache.james.mailbox.MessageManager.MetaData;
+import org.apache.james.mailbox.MessageManager.MetaData.FetchGroup;
+import org.apache.james.mailbox.SimpleMailboxACL;
+import org.apache.james.mailbox.SimpleMailboxACL.Rfc4314Rights;
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.jmock.integration.junit4.JMock;
+import org.jmock.integration.junit4.JUnit4Mockery;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * GetACLProcessor Test.
+ *
+ */
+@RunWith(JMock.class)
+public class GetACLProcessorTest {
+
+ private static final String MAILBOX_NAME = ImapConstants.INBOX_NAME;
+ private static final String USER_1 = "user1";
+
+ ImapSession imapSessionStub;
+ MailboxManager mailboxManagerStub;
+ MailboxSession mailboxSessionStub;
+ MessageManager messageManagerStub;
+ MetaData metaDataStub;
+ Mockery mockery = new JUnit4Mockery();
+ GetACLRequest namespaceRequest;
+ UnpooledStatusResponseFactory statusResponseFactory;
+ GetACLProcessor subject;
+ User user1Stub;
+
+ private Expectations prepareRightsExpectations() throws MailboxException {
+ return new Expectations() {
+ {
+
+
allowing(imapSessionStub).getAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY);
+ will(returnValue(mailboxSessionStub));
+
+ allowing(imapSessionStub).getState();
+ will(returnValue(ImapSessionState.AUTHENTICATED));
+
+ allowing(mailboxSessionStub).getUser();
+ will(returnValue(user1Stub));
+
+ allowing(user1Stub).getUserName();
+ will(returnValue(USER_1));
+
+
allowing(mailboxManagerStub).startProcessingRequest(with(same(mailboxSessionStub)));
+
allowing(mailboxManagerStub).endProcessingRequest(with(same(mailboxSessionStub)));
+
+
allowing(messageManagerStub).getMetaData(with(any(Boolean.class)),
with(same(mailboxSessionStub)), with(any(FetchGroup.class)));
+ will(returnValue(metaDataStub));
+
+ }
+ };
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ statusResponseFactory = new UnpooledStatusResponseFactory();
+ mailboxManagerStub = mockery.mock(MailboxManager.class);
+ subject = new GetACLProcessor(mockery.mock(ImapProcessor.class),
mailboxManagerStub, statusResponseFactory);
+ imapSessionStub = mockery.mock(ImapSession.class);
+ mailboxSessionStub = mockery.mock(MailboxSession.class);
+ user1Stub = mockery.mock(User.class);
+ messageManagerStub = mockery.mock(MessageManager.class);
+ metaDataStub = mockery.mock(MetaData.class);
+
+ namespaceRequest = new GetACLRequest("TAG",
ImapCommand.anyStateCommand("Name"), MAILBOX_NAME);
+
+ }
+
+ @Test
+ public void testNoListRight() throws Exception {
+
+ Expectations expectations = prepareRightsExpectations();
+
expectations.allowing(messageManagerStub).hasRight(expectations.with(Expectations.equal(Rfc4314Rights.l_Lookup_RIGHT)),
expectations.with(Expectations.same(mailboxSessionStub)));
+ expectations.will(Expectations.returnValue(false));
+
+
expectations.allowing(mailboxManagerStub).getMailbox(expectations.with(Expectations.any(MailboxPath.class)),
expectations.with(Expectations.any(MailboxSession.class)));
+ expectations.will(Expectations.returnValue(messageManagerStub));
+
+ mockery.checking(expectations);
+
+ final Responder responderMock = mockery.mock(Responder.class);
+ mockery.checking(new Expectations() {
+ {
+ oneOf(responderMock).respond(with(new
StatusResponseTypeMatcher(StatusResponse.Type.NO)));
+ }
+ });
+
+ subject.doProcess(namespaceRequest, responderMock, imapSessionStub);
+
+ }
+
+ @Test
+ public void testNoAdminRight() throws Exception {
+
+ Expectations expectations = prepareRightsExpectations();
+
expectations.allowing(messageManagerStub).hasRight(expectations.with(Expectations.equal(Rfc4314Rights.l_Lookup_RIGHT)),
expectations.with(Expectations.same(mailboxSessionStub)));
+ expectations.will(Expectations.returnValue(true));
+
+
expectations.allowing(messageManagerStub).hasRight(expectations.with(Expectations.equal(Rfc4314Rights.a_Administer_RIGHT)),
expectations.with(Expectations.same(mailboxSessionStub)));
+ expectations.will(Expectations.returnValue(false));
+
+
expectations.allowing(mailboxManagerStub).getMailbox(expectations.with(Expectations.any(MailboxPath.class)),
expectations.with(Expectations.any(MailboxSession.class)));
+ expectations.will(Expectations.returnValue(messageManagerStub));
+
+ mockery.checking(expectations);
+
+ final Responder responderMock = mockery.mock(Responder.class);
+ mockery.checking(new Expectations() {
+ {
+ oneOf(responderMock).respond(with(new
StatusResponseTypeMatcher(StatusResponse.Type.NO)));
+ }
+ });
+
+ subject.doProcess(namespaceRequest, responderMock, imapSessionStub);
+
+ }
+
+ @Test
+ public void testInexistentMailboxName() throws Exception {
+ Expectations expectations = prepareRightsExpectations();
+
+
expectations.allowing(mailboxManagerStub).getMailbox(expectations.with(Expectations.any(MailboxPath.class)),
expectations.with(Expectations.any(MailboxSession.class)));
+ expectations.will(Expectations.throwException(new
MailboxNotFoundException(MAILBOX_NAME)));
+
+ mockery.checking(expectations);
+
+ final Responder responderMock = mockery.mock(Responder.class);
+ mockery.checking(new Expectations() {
+ {
+ oneOf(responderMock).respond(with(new
StatusResponseTypeMatcher(StatusResponse.Type.NO)));
+ }
+ });
+
+ subject.doProcess(namespaceRequest, responderMock, imapSessionStub);
+ }
+
+ @Test
+ public void testSufficientRights() throws Exception {
+
+ final MailboxACL acl = SimpleMailboxACL.OWNER_FULL_ACL;
+
+ Expectations expectations = prepareRightsExpectations();
+
+
expectations.allowing(mailboxManagerStub).getMailbox(expectations.with(Expectations.any(MailboxPath.class)),
expectations.with(Expectations.any(MailboxSession.class)));
+ expectations.will(Expectations.returnValue(messageManagerStub));
+
+
expectations.allowing(messageManagerStub).hasRight(expectations.with(Expectations.equal(Rfc4314Rights.l_Lookup_RIGHT)),
expectations.with(Expectations.same(mailboxSessionStub)));
+ expectations.will(Expectations.returnValue(true));
+
+
expectations.allowing(messageManagerStub).hasRight(expectations.with(Expectations.equal(Rfc4314Rights.a_Administer_RIGHT)),
expectations.with(Expectations.same(mailboxSessionStub)));
+ expectations.will(Expectations.returnValue(true));
+
+
+ expectations.allowing(metaDataStub).getACL();
+ expectations.will(Expectations.returnValue(acl));
+
+ mockery.checking(expectations);
+
+ final ACLResponse response = new ACLResponse(MAILBOX_NAME, acl);
+ final Responder responderMock = mockery.mock(Responder.class);
+ mockery.checking(new Expectations() {
+ {
+ oneOf(responderMock).respond(with(equal(response)));
+ oneOf(responderMock).respond(with(new
StatusResponseTypeMatcher(StatusResponse.Type.OK)));
+ }
+ });
+
+ subject.doProcess(namespaceRequest, responderMock, imapSessionStub);
+ }
+
+}
Propchange:
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/GetACLProcessorTest.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Added:
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/StatusResponseTypeMatcher.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/StatusResponseTypeMatcher.java?rev=1237058&view=auto
==============================================================================
---
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/StatusResponseTypeMatcher.java
(added)
+++
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/StatusResponseTypeMatcher.java
Sat Jan 28 13:33:34 2012
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+package org.apache.james.imap.processor;
+
+import org.apache.james.imap.api.message.response.StatusResponse;
+import org.hamcrest.BaseMatcher;
+import org.hamcrest.Description;
+
+/**
+ * A matcher for {@link StatusResponse} objects, whereby only their
+ * serverResponseType field is significant. is significant.
+ *
+ */
+public class StatusResponseTypeMatcher extends BaseMatcher<StatusResponse> {
+ private final
org.apache.james.imap.api.message.response.StatusResponse.Type
serverResponseType;
+
+ public
StatusResponseTypeMatcher(org.apache.james.imap.api.message.response.StatusResponse.Type
responseCode) {
+ super();
+ this.serverResponseType = responseCode;
+ }
+
+ @Override
+ public boolean matches(Object o) {
+ if (o instanceof StatusResponse) {
+ StatusResponse sr = (StatusResponse) o;
+ return this.serverResponseType.equals(sr.getServerResponseType());
+ }
+ return false;
+ }
+
+ @Override
+ public void describeTo(Description d) {
+ d.appendText(StatusResponse.class.getName());
+ d.appendText(" with serverResponseType.equals(" +
serverResponseType.name() + ")");
+
+ }
+
+}
\ No newline at end of file
Propchange:
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/StatusResponseTypeMatcher.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified:
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
URL:
http://svn.apache.org/viewvc/james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java?rev=1237058&r1=1237057&r2=1237058&view=diff
==============================================================================
---
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
(original)
+++
james/imap/trunk/processor/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
Sat Jan 28 13:33:34 2012
@@ -43,6 +43,7 @@ import org.apache.james.imap.api.process
import org.apache.james.mailbox.BadCredentialsException;
import org.apache.james.mailbox.Content;
import org.apache.james.mailbox.Headers;
+import org.apache.james.mailbox.MailboxACL.MailboxACLRight;
import org.apache.james.mailbox.MailboxException;
import org.apache.james.mailbox.MailboxListener;
import org.apache.james.mailbox.MailboxManager;
@@ -295,6 +296,12 @@ public class MailboxEventAnalyserTest {
}
+ @Override
+ public boolean hasRight(MailboxACLRight right, MailboxSession
session) throws MailboxException {
+ //FIXME: somebody should approve that always true is the
proper result here
+ return true;
+ }
+
};
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]