Hi Jochen,
comments inside..


Am Freitag, 6. Januar 2012 um 12:25 schrieb Jochen Gazda:

> Gentlemen,
>  
> Please read and comment.
>  
> I have started to implement the ACL support. In the very first phase I
> would like to
> - add support for IMAP GETACL command and
> - add support for storing ACL at least for one storage backend.
>  
> During this first phase I would like to learn how to do things in a
> James-compiliant way so that I will be able to implement other ACL
> commands later.
>  
> 1. A new interface org.apache.james.mailbox.MailboxACL and default
> implementation org.apache.james.mailbox.store.SimpleMailboxACL
> Stores an ACL applicable to a mailbox. Inspired by RFC4314 IMAP4
> Access Control List (ACL) Extension.
> Note: An ACL class that could serve our purpose exists in
> com.sun.mail.imap. We will not stick to a proprietary API, will we?
>  
>  

Nope we should not use it here. I would even be in favor to remove the usage of 
javamail at all in mailbox but thats another story..

  
>  
> 2. MailboxACL usage:
> org.apache.james.mailbox.store.mail.model.Mailbox<Id> and
> implementations will be extended to store the related ACL:
> MailboxACL getACL();
> void setACL(MailboxACL acl);
> This is probably OK.
>  
>  

Yes
  
>  
> 3. MailboxACL usage: org.apache.james.mailbox.MessageManager.MetaData
> will be extended to offer a read access to the ACL of the related
> mailbox. This was approved by Norman Maurer.
> MailboxACL getACL();
>  
> 4. MailboxACL usage: Under org.apache.james.imap ACL-related requests,
> decoders, responses, encoders and processors will use MailboxACL.
> It is probably OK as there is a lot of org.apache.james.mailbox.*
> usage under org.apache.james.imap.
>  
>  

yeah...
  
>  
> 5. MailboxACL instantiation: Clearly, there will be (at least) two
> places where MailboxACL will be instantiated:
> i. In Mailbox implementations when reading ACLs from their backends
> ii. In org.apache.james.imap decoders when parsing the ACL related
> IMAP requests.
>  
> At the moment I have hardcoded a constructor of my default
> implementation on both places. I am asking myself if some kind of
> factory pattern should be used instead.
>  
>  

Just use the constructor for now, we can change later if needed...
  
>  
> 6. How to access an ACL stored in a mailbox backend from a subclass of
> org.apache.james.imap.processor.AbstractMailboxProcessor:
> At the moment I have this code to prepare a response for GETACL IMAP command:
> MessageManager messageManager =
> getMailboxManager().getMailbox(buildFullPath(session, mailboxName),
> mailboxSession);
> MetaData metaData = messageManager.getMetaData(false,
> mailboxSession, FetchGroup.NO_COUNT);
>  
> I have not tested it yet, but principally, it should work. I only
> wonder at two things with that code:
>  
> i. org.apache.james.mailbox.MailboxManager.getMailbox(MailboxPath,
> MailboxSession)
> It returns a MessageManager rather than a Mailbox. Should it not
> rather be called getMessageManager?
>  
>  

Yeah it should. Its called getMailbox(..) for historic reasons.. I guess we 
should change it like you suggested..

  
>  
> ii. org.apache.james.mailbox.MessageManager.getMetaData(boolean,
> MailboxSession, FetchGroup)
> Javadoc says "Gets current meta data for the mailbox." Why is
> this method in MessageManager and not in MailboxManager?
>  
>  


As the info you need to retrieve is depend to the MessageManager you got. Like 
getting the message count, unseen messages etc..
  
>  
> 7. What and in which order should the GetACLProcessor say after
> sending the ACL response?
> i. Should it send also unsolicitedResponses?
> ii. unsolicitedResponses should be sent before or after okComplete?
> iii. on MailboxException, we send no() and I wonder what should its
> HumanReadableText say?
> iv. is the no() sufficient for all exceptions? What if somebody is
> asking for ACL of a folder which
> (a) does not exist or
> (b) cannot be looked up by the current user?
> Isn't taggedBad more suitable for (a) and/or (b)?
>  
I will need to review the RFC for this to answer..
  
>  
> Here is what I have now:
>  
> @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);
> 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 (MailboxException e) {
> // FIXME: be more specific in the human readable text.
> no(command, tag, responder,
> HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
> }
> }
>  
>  
> 8. Interpretation of ACLs:
> To have ACL stored on every mailbox is far from being able to tell if
> the given user can perform the given operation for the given
> mailbox(es when copying/moving).
> A new service responsible for resolving of ACLs is necessary. I
> propose to call it MailboxACLResolver.
> In which package should it be placed? Also in org.apache.james.mailbox?
> Probably every single operation between IMAP and mailbox stores should
> pass through this service. Where in the code should such a permission
> enforcement be placed?
> How should MailboxACLResolver be instantiated?
>  
>  


Yeah mailbox api I think… It should be instanced once and get injected in the 
constructor.
  
>  
> 9. A new event type: 
> org.apache.james.mailbox.MailboxListener.MailboxACLUpdated
> It is quite clear what it should look like. It is also quite clear to
> me where and how it should be fired.
> But I cannot figure out who should listen to it and what the listener should 
> do.
>  

I need to read the rfc to answer this..
  
>  
>  
> Thanks,
>  
> Gazda
>  
>  

--  
Norman Maurer   

Reply via email to