You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by ad...@apache.org on 2017/02/14 12:05:46 UTC

[01/12] james-project git commit: JAMES-1930 Introduce administratorId configuration option to UsersRepository

Repository: james-project
Updated Branches:
  refs/heads/master 42b574dcb -> d54953523


JAMES-1930 Introduce administratorId configuration option to UsersRepository


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

Branch: refs/heads/master
Commit: dfb28bd07b19951facc214bfcca210cdf1b081cc
Parents: 42b574d
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Wed Feb 8 15:34:48 2017 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Feb 14 09:16:55 2017 +0100

----------------------------------------------------------------------
 .../apache/james/user/api/UsersRepository.java  |  5 ++++
 .../user/ldap/ReadOnlyUsersLDAPRepository.java  | 21 ++++++++++++++++
 .../james/user/lib/AbstractUsersRepository.java | 17 +++++++++++++
 .../user/lib/AbstractUsersRepositoryTest.java   | 25 ++++++++++++++++++++
 4 files changed, 68 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/dfb28bd0/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java b/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java
index 666fdd7..ea02cc3 100644
--- a/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java
+++ b/server/data/data-api/src/main/java/org/apache/james/user/api/UsersRepository.java
@@ -136,5 +136,10 @@ public interface UsersRepository {
      * @throws UsersRepositoryException
      */
     String getUser(MailAddress mailAddress) throws UsersRepositoryException;
+    
+    /**
+     * Return true if the user is an admin for this repository
+     */
+    boolean isAdministrator(String username) throws UsersRepositoryException;
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/dfb28bd0/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
index 6e07236..cc9eeb2 100644
--- a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
@@ -54,6 +54,8 @@ import org.apache.james.util.retry.naming.ldap.RetryingLdapContext;
 import org.apache.mailet.MailAddress;
 import org.slf4j.Logger;
 
+import com.google.common.base.Optional;
+
 /**
  * <p>
  * This repository implementation serves as a bridge between Apache James and
@@ -91,6 +93,7 @@ import org.slf4j.Logger;
  *      retryStartInterval=&quot;0&quot;
  *      retryMaxInterval=&quot;30&quot;
  *      retryIntervalScale=&quot;1000&quot;
+ *      administratorId=&quot;ldapAdmin&quot;
  *  &lt;/users-store&gt;
  * </pre>
  *
@@ -213,6 +216,9 @@ import org.slf4j.Logger;
  * <b>readTimeout:</b> (optional) Sets property
  * <code>com.sun.jndi.ldap.read.timeout</code> to the specified integer value.
  * Applicable to Java 6 and above.
+ * <li>
+ * <b>administratorId:</b> (optional) User identifier of the administrator user.
+ * The administrator user is allowed to authenticate as other users.
  * </ul>
  *
  * @see ReadOnlyLDAPUser
@@ -295,6 +301,12 @@ public class ReadOnlyUsersLDAPRepository implements UsersRepository, Configurabl
      */
     private LdapContext ldapContext;
     private boolean supportsVirtualHosting;
+    
+    /**
+     * UserId of the administrator
+     * The administrator is allowed to log in as other users
+     */
+    private Optional<String> administratorId;
 
     // Use a connection pool. Default is true.
     private boolean useConnectionPool = true;
@@ -366,6 +378,7 @@ public class ReadOnlyUsersLDAPRepository implements UsersRepository, Configurabl
         //see if there is a filter argument
         filter = configuration.getString("[@filter]");
 
+        administratorId = Optional.fromNullable(configuration.getString("[@administratorId]"));
     }
 
     /**
@@ -770,4 +783,12 @@ public class ReadOnlyUsersLDAPRepository implements UsersRepository, Configurabl
     public String getUser(MailAddress mailAddress) throws UsersRepositoryException {
         return mailAddress.getLocalPart();
     }
+
+    @Override
+    public boolean isAdministrator(String username) throws UsersRepositoryException {
+        if (administratorId.isPresent()) {
+            return administratorId.get().equals(username);
+        }
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/dfb28bd0/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
index 287c482..f0651fe 100644
--- a/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
+++ b/server/data/data-library/src/main/java/org/apache/james/user/lib/AbstractUsersRepository.java
@@ -33,11 +33,15 @@ import org.apache.james.user.api.UsersRepositoryException;
 import org.apache.mailet.MailAddress;
 import org.slf4j.Logger;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Optional;
+
 public abstract class AbstractUsersRepository implements UsersRepository, LogEnabled, Configurable {
 
     private DomainList domainList;
     private boolean virtualHosting;
     private Logger logger;
+    private Optional<String> administratorId;
 
     protected Logger getLogger() {
         return logger;
@@ -57,6 +61,7 @@ public abstract class AbstractUsersRepository implements UsersRepository, LogEna
     public void configure(HierarchicalConfiguration configuration) throws ConfigurationException {
 
         virtualHosting = configuration.getBoolean("enableVirtualHosting", getDefaultVirtualHostingValue());
+        administratorId = Optional.fromNullable(configuration.getString("administratorId"));
 
         doConfigure(configuration);
     }
@@ -142,4 +147,16 @@ public abstract class AbstractUsersRepository implements UsersRepository, LogEna
             return mailAddress.getLocalPart();
         }
     }
+
+    @VisibleForTesting void setAdministratorId(Optional<String> username) {
+        this.administratorId = username;
+    }
+
+    @Override
+    public boolean isAdministrator(String username) throws UsersRepositoryException {
+        if (administratorId.isPresent()) {
+            return administratorId.get().equals(username);
+        }
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/dfb28bd0/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java b/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
index a4908a8..2007354 100644
--- a/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
+++ b/server/data/data-library/src/test/java/org/apache/james/user/lib/AbstractUsersRepositoryTest.java
@@ -34,6 +34,8 @@ import org.junit.Assume;
 import org.junit.Before;
 import org.junit.Test;
 
+import com.google.common.base.Optional;
+
 
 public abstract class AbstractUsersRepositoryTest {
 
@@ -52,6 +54,7 @@ public abstract class AbstractUsersRepositoryTest {
     private String user1;
     private String user2;
     private String user3;
+    private String admin;
     
     @Before 
     public void setUp() throws Exception { 
@@ -62,6 +65,7 @@ public abstract class AbstractUsersRepositoryTest {
         user1 = login("username");
         user2 = login("username2");
         user3 = login("username3");
+        admin = login("admin");
     }
 
     @After
@@ -324,4 +328,25 @@ public abstract class AbstractUsersRepositoryTest {
     protected void disposeUsersRepository() throws UsersRepositoryException {
         LifecycleUtil.dispose(this.usersRepository);
     }
+
+    @Test
+    public void isAdministratorShouldReturnFalseWhenNotConfigured() throws Exception {
+        usersRepository.setAdministratorId(Optional.<String>absent());
+
+        assertThat(usersRepository.isAdministrator(admin)).isFalse();
+    }
+
+    @Test
+    public void isAdministratorShouldReturnTrueWhenConfiguredAndUserIsAdmin() throws Exception {
+        usersRepository.setAdministratorId(Optional.of(admin));
+
+        assertThat(usersRepository.isAdministrator(admin)).isTrue();
+    }
+
+    @Test
+    public void isAdministratorShouldReturnFalseWhenConfiguredAndUserIsNotAdmin() throws Exception {
+        usersRepository.setAdministratorId(Optional.of(admin));
+
+        assertThat(usersRepository.isAdministrator(user1)).isFalse();
+    }
 }


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


[09/12] james-project git commit: JAMES-1930 Implement AUTH PLAIN delegation as part of IMAP

Posted by ad...@apache.org.
JAMES-1930 Implement AUTH PLAIN delegation as part of IMAP


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

Branch: refs/heads/master
Commit: 157be0db425f59e3751ea4ebdcefe3cf4daf7ec2
Parents: 0175e31
Author: Benoit Tellier <bt...@linagora.com>
Authored: Fri Feb 10 11:51:24 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Feb 14 11:29:30 2017 +0100

----------------------------------------------------------------------
 .../imap/api/display/HumanReadableText.java     |   4 +
 .../imap/processor/AbstractAuthProcessor.java   | 165 +++++++++++++++----
 .../imap/processor/AuthenticateProcessor.java   |  49 +-----
 .../james/imap/processor/LoginProcessor.java    |   5 +-
 4 files changed, 143 insertions(+), 80 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/157be0db/protocols/imap/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java b/protocols/imap/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java
index 42dba98..57a98e0 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/api/display/HumanReadableText.java
@@ -113,6 +113,10 @@ public class HumanReadableText {
 
     public static final HumanReadableText COMSUME_UID_FAILED = new HumanReadableText("org.apache.james.imap.COMSUME_UID_FAILED", "failed. Failed to acquire UID.");
 
+    public static final HumanReadableText USER_DOES_NOT_EXIST = new HumanReadableText("org.apache.james.imap.GENERIC_FAILURE_DURING_PROCESSING", "User does not exist");
+
+    public static final HumanReadableText NOT_AN_ADMIN = new HumanReadableText("org.apache.james.imap.GENERIC_FAILURE_DURING_PROCESSING", "Not an admin");
+
     public static final HumanReadableText GENERIC_FAILURE_DURING_PROCESSING = new HumanReadableText("org.apache.james.imap.GENERIC_FAILURE_DURING_PROCESSING", "processing failed.");
 
     public static final HumanReadableText FAILURE_MAILBOX_EXISTS = new HumanReadableText("org.apache.james.imap.FAILURE_NO_SUCH_MAILBOX", "failed. Mailbox already exists.");

http://git-wip-us.apache.org/repos/asf/james-project/blob/157be0db/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
index be5460a..5e10aa6 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AbstractAuthProcessor.java
@@ -31,9 +31,14 @@ import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxExistsException;
+import org.apache.james.mailbox.exception.NotAdminException;
+import org.apache.james.mailbox.exception.UserDoesNotExistException;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
 public abstract class AbstractAuthProcessor<M extends ImapRequest> extends AbstractMailboxProcessor<M>{
 
     private static final String ATTRIBUTE_NUMBER_OF_FAILURES = "org.apache.james.imap.processor.imap4rev1.NUMBER_OF_FAILURES";
@@ -45,57 +50,73 @@ public abstract class AbstractAuthProcessor<M extends ImapRequest> extends Abstr
         super(acceptableClass, next, mailboxManager, factory);
     }
 
-    protected void doAuth(String userid, String passwd, ImapSession session, String tag, ImapCommand command, Responder responder, HumanReadableText failed) {
+    protected void doAuth(AuthenticationAttempt authenticationAttempt, ImapSession session, String tag, ImapCommand command, Responder responder, HumanReadableText failed) {
+        Preconditions.checkArgument(!authenticationAttempt.isDelegation());
         try {
             boolean authFailure = false;
-            if (userid == null) {
+            if (authenticationAttempt.getAuthenticationId() == null) {
                 authFailure = true;
             }
-            if (authFailure == false) {
+            if (!authFailure) {
                 final MailboxManager mailboxManager = getMailboxManager();
                 try {
-                    final MailboxSession mailboxSession = mailboxManager.login(userid, passwd, session.getLog());
+                    final MailboxSession mailboxSession = mailboxManager.login(authenticationAttempt.getAuthenticationId(),
+                        authenticationAttempt.getPassword(),
+                        session.getLog());
                     session.authenticated();
                     session.setAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY, mailboxSession);
-                    final MailboxPath inboxPath = PathConverter.forSession(session).buildFullPath(MailboxConstants.INBOX);
-                    if (mailboxManager.mailboxExists(inboxPath, mailboxSession)) {
-                        if (session.getLog().isDebugEnabled()) {
-                            session.getLog().debug("INBOX exists. No need to create it.");
-                        }
-                    } else {
-                        try {
-                            session.getLog().debug("INBOX does not exist. Creating it.");
-                            mailboxManager.createMailbox(inboxPath, mailboxSession);
-                        } catch (MailboxExistsException e) {
-                            if (session.getLog().isDebugEnabled()) {
-                                session.getLog().debug("Mailbox created by concurrent call. Safe to ignore this exception.");
-                            }
-                        }
-                    }
+                    provisionInbox(session, mailboxManager, mailboxSession);
                     okComplete(command, tag, responder);
                 } catch (BadCredentialsException e) {
                     authFailure = true;
                 }
             }
             if (authFailure) {
-                final Integer currentNumberOfFailures = (Integer) session.getAttribute(ATTRIBUTE_NUMBER_OF_FAILURES);
-                final int failures;
-                if (currentNumberOfFailures == null) {
-                    failures = 1;
-                } else {
-                    failures = currentNumberOfFailures.intValue() + 1;
-                }
-                if (failures < MAX_FAILURES) {
-                    session.setAttribute(ATTRIBUTE_NUMBER_OF_FAILURES, failures);
-                    no(command, tag, responder, failed);
-                } else {
-                    if (session.getLog().isInfoEnabled()) {
-                        session.getLog().info("Too many authentication failures. Closing connection.");
-                    }
-                    bye(responder, HumanReadableText.TOO_MANY_FAILURES);
-                    session.logout();
+                manageFailureCount(session, tag, command, responder, failed);
+            }
+        } catch (MailboxException e) {
+            if (session.getLog().isInfoEnabled()) {
+                session.getLog().info("Login failed", e);
+            }
+            no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
+        }
+    }
+
+    protected void doAuthWithDelegation(AuthenticationAttempt authenticationAttempt, ImapSession session, String tag, ImapCommand command, Responder responder, HumanReadableText failed) {
+        Preconditions.checkArgument(authenticationAttempt.isDelegation());
+        try {
+            boolean authFailure = false;
+            if (authenticationAttempt.getAuthenticationId() == null) {
+                authFailure = true;
+            }
+            if (!authFailure) {
+                final MailboxManager mailboxManager = getMailboxManager();
+                try {
+                    final MailboxSession mailboxSession = mailboxManager.loginAsOtherUser(authenticationAttempt.getAuthenticationId(),
+                        authenticationAttempt.getPassword(),
+                        authenticationAttempt.getDelegateUserName().get(),
+                        session.getLog());
+                    session.authenticated();
+                    session.setAttribute(ImapSessionUtils.MAILBOX_SESSION_ATTRIBUTE_SESSION_KEY, mailboxSession);
+                    provisionInbox(session, mailboxManager, mailboxSession);
+                    okComplete(command, tag, responder);
+                } catch (BadCredentialsException e) {
+                    authFailure = true;
                 }
             }
+            if (authFailure) {
+                manageFailureCount(session, tag, command, responder, failed);
+            }
+        } catch (UserDoesNotExistException e) {
+            if (session.getLog().isInfoEnabled()) {
+                session.getLog().info("User " + authenticationAttempt.getAuthenticationId() + " does not exist", e);
+            }
+            no(command, tag, responder, HumanReadableText.USER_DOES_NOT_EXIST);
+        } catch (NotAdminException e) {
+            if (session.getLog().isInfoEnabled()) {
+                session.getLog().info("User " + authenticationAttempt.getDelegateUserName() + " is not an admin", e);
+            }
+            no(command, tag, responder, HumanReadableText.NOT_AN_ADMIN);
         } catch (MailboxException e) {
             if (session.getLog().isInfoEnabled()) {
                 session.getLog().info("Login failed", e);
@@ -103,4 +124,78 @@ public abstract class AbstractAuthProcessor<M extends ImapRequest> extends Abstr
             no(command, tag, responder, HumanReadableText.GENERIC_FAILURE_DURING_PROCESSING);
         }
     }
+
+    private void provisionInbox(ImapSession session, MailboxManager mailboxManager, MailboxSession mailboxSession) throws MailboxException {
+        final MailboxPath inboxPath = PathConverter.forSession(session).buildFullPath(MailboxConstants.INBOX);
+        if (mailboxManager.mailboxExists(inboxPath, mailboxSession)) {
+            if (session.getLog().isDebugEnabled()) {
+                session.getLog().debug("INBOX exists. No need to create it.");
+            }
+        } else {
+            try {
+                session.getLog().debug("INBOX does not exist. Creating it.");
+                mailboxManager.createMailbox(inboxPath, mailboxSession);
+            } catch (MailboxExistsException e) {
+                if (session.getLog().isDebugEnabled()) {
+                    session.getLog().debug("Mailbox created by concurrent call. Safe to ignore this exception.");
+                }
+            }
+        }
+    }
+
+    protected void manageFailureCount(ImapSession session, String tag, ImapCommand command, Responder responder, HumanReadableText failed) {
+        final Integer currentNumberOfFailures = (Integer) session.getAttribute(ATTRIBUTE_NUMBER_OF_FAILURES);
+        final int failures;
+        if (currentNumberOfFailures == null) {
+            failures = 1;
+        } else {
+            failures = currentNumberOfFailures + 1;
+        }
+        if (failures < MAX_FAILURES) {
+            session.setAttribute(ATTRIBUTE_NUMBER_OF_FAILURES, failures);
+            no(command, tag, responder, failed);
+        } else {
+            if (session.getLog().isInfoEnabled()) {
+                session.getLog().info("Too many authentication failures. Closing connection.");
+            }
+            bye(responder, HumanReadableText.TOO_MANY_FAILURES);
+            session.logout();
+        }
+    }
+
+    protected static AuthenticationAttempt delegation(String authorizeId, String authenticationId, String password) {
+        return new AuthenticationAttempt(Optional.of(authorizeId), authenticationId, password);
+    }
+
+    protected static AuthenticationAttempt noDelegation(String authenticationId, String password) {
+        return new AuthenticationAttempt(Optional.<String>absent(), authenticationId, password);
+    }
+
+    protected static class AuthenticationAttempt {
+        private final Optional<String> delegateUserName;
+        private final String authenticationId;
+        private final String password;
+
+        public AuthenticationAttempt(Optional<String> delegateUserName, String authenticationId, String password) {
+            this.delegateUserName = delegateUserName;
+            this.authenticationId = authenticationId;
+            this.password = password;
+        }
+
+        public boolean isDelegation() {
+            return delegateUserName.isPresent();
+        }
+
+        public Optional<String> getDelegateUserName() {
+            return delegateUserName;
+        }
+
+        public String getAuthenticationId() {
+            return authenticationId;
+        }
+
+        public String getPassword() {
+            return password;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/157be0db/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
index 1abc69d..ea8324a 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
@@ -37,8 +37,6 @@ import org.apache.james.imap.message.request.IRAuthenticateRequest;
 import org.apache.james.imap.message.response.AuthenticateResponse;
 import org.apache.james.mailbox.MailboxManager;
 
-import com.google.common.base.Optional;
-
 /**
  * Processor which handles the AUTHENTICATE command. Only authtype of PLAIN is supported ATM.
  * 
@@ -103,12 +101,15 @@ public class AuthenticateProcessor extends AbstractAuthProcessor<AuthenticateReq
      * @param responder
      */
     protected void doPlainAuth(String initialClientResponse, ImapSession session, String tag, ImapCommand command, Responder responder) {
-        AuthPlainAttempt authPlainAttempt = parseDelegationAttempt(initialClientResponse);
-        // Authenticate user
-        doAuth(authPlainAttempt.getAuthenticationId(), authPlainAttempt.getPassword(), session, tag, command, responder, HumanReadableText.AUTHENTICATION_FAILED);
+        AuthenticationAttempt authenticationAttempt = parseDelegationAttempt(initialClientResponse);
+        if (authenticationAttempt.isDelegation()) {
+            doAuthWithDelegation(authenticationAttempt, session, tag, command, responder, HumanReadableText.AUTHENTICATION_FAILED);
+        } else {
+            doAuth(authenticationAttempt, session, tag, command, responder, HumanReadableText.AUTHENTICATION_FAILED);
+        }
     }
 
-    private AuthPlainAttempt parseDelegationAttempt(String initialClientResponse) {
+    private AuthenticationAttempt parseDelegationAttempt(String initialClientResponse) {
         String token2;
         try {
 
@@ -161,40 +162,4 @@ public class AuthenticateProcessor extends AbstractAuthProcessor<AuthenticateReq
         return Collections.unmodifiableList(caps);
     }
 
-    private static AuthPlainAttempt delegation(String authorizeId, String authenticationId, String password) {
-        return new AuthPlainAttempt(Optional.of(authorizeId), authenticationId, password);
-    }
-
-    private static AuthPlainAttempt noDelegation(String authenticationId, String password) {
-        return new AuthPlainAttempt(Optional.<String>absent(), authenticationId, password);
-    }
-
-    private static class AuthPlainAttempt {
-        private final Optional<String> authorizeId;
-        private final String authenticationId;
-        private final String password;
-
-        private AuthPlainAttempt(Optional<String> authorizeId, String authenticationId, String password) {
-            this.authorizeId = authorizeId;
-            this.authenticationId = authenticationId;
-            this.password = password;
-        }
-
-        public boolean isDelegation() {
-            return authorizeId.isPresent();
-        }
-
-        public Optional<String> getAuthorizeId() {
-            return authorizeId;
-        }
-
-        public String getAuthenticationId() {
-            return authenticationId;
-        }
-
-        public String getPassword() {
-            return password;
-        }
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/157be0db/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java
index 3e824e1..4837446 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/LoginProcessor.java
@@ -48,13 +48,12 @@ public class LoginProcessor extends AbstractAuthProcessor<LoginRequest> implemen
      * org.apache.james.imap.api.ImapCommand, org.apache.james.imap.api.process.ImapProcessor.Responder)
      */
     protected void doProcess(LoginRequest request, ImapSession session, String tag, ImapCommand command, Responder responder) {
-            final String userid = request.getUserid();
-            final String passwd = request.getPassword();
             // check if the login is allowed with LOGIN command. See IMAP-304
             if (session.isPlainAuthDisallowed() && session.isTLSActive() == false) {
                 no(command, tag, responder, HumanReadableText.DISABLED_LOGIN);
             } else {
-                doAuth(userid, passwd, session, tag, command, responder, HumanReadableText.INVALID_LOGIN);
+                doAuth(noDelegation(request.getUserid(), request.getPassword()),
+                    session, tag, command, responder, HumanReadableText.INVALID_LOGIN);
             }
     }
 


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


[03/12] james-project git commit: JAMES-1930 Introduce Authorizator to check users authorizations about delegation

Posted by ad...@apache.org.
JAMES-1930 Introduce Authorizator to check users authorizations about delegation


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

Branch: refs/heads/master
Commit: 8b52a2b80c3d5e325eead26c3ab7c3d9be233036
Parents: dfb28bd
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Wed Feb 8 17:54:26 2017 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Feb 14 11:28:19 2017 +0100

----------------------------------------------------------------------
 .../apache/james/mailbox/MailboxManager.java    | 28 ++++++++-
 .../cassandra/CassandraMailboxManager.java      | 20 ++++--
 .../cassandra/CassandraMailboxManagerTest.java  |  6 +-
 .../cassandra/CassandraTestSystemFixture.java   |  3 +-
 .../CassandraMailboxManagerAttachmentTest.java  |  6 +-
 .../ElasticSearchIntegrationTest.java           |  2 +
 .../mailbox/hbase/HBaseMailboxManager.java      |  9 +--
 .../resources/META-INF/spring/mailbox-hbase.xml |  7 ++-
 .../mailbox/hbase/HBaseMailboxManagerTest.java  |  7 ++-
 .../james/mailbox/jcr/JCRMailboxManager.java    |  9 +--
 .../resources/META-INF/spring/mailbox-jcr.xml   |  7 ++-
 .../mailbox/jcr/JCRMailboxManagerTest.java      |  6 +-
 .../james/mailbox/jpa/JPAMailboxManager.java    |  5 +-
 .../jpa/openjpa/OpenJPAMailboxManager.java      | 13 ++--
 .../resources/META-INF/spring/mailbox-jpa.xml   |  9 +--
 .../mailbox/jpa/JPAMailboxManagerTest.java      |  6 +-
 .../search/LuceneMessageSearchIndexTest.java    |  2 +
 .../META-INF/spring/mailbox-maildir.xml         | 15 ++---
 .../maildir/MaildirMailboxManagerTests.java     |  6 +-
 .../inmemory/InMemoryMailboxManager.java        | 15 ++---
 .../META-INF/spring/mailbox-memory.xml          | 15 ++---
 .../inmemory/InMemoryMailboxManagerTest.java    |  3 +-
 .../MessageIdManagerTestSystemProvider.java     |  4 +-
 .../InMemoryMailboxManagerAttachmentTest.java   |  6 +-
 .../manager/InMemoryIntegrationResources.java   |  8 ++-
 .../search/SimpleMessageSearchIndexTest.java    |  2 +
 .../james/mailbox/spring/NoAuthorizator.java    | 30 +++++++++
 .../james/mailbox/spring/SpringMailbox.java     |  2 +-
 .../META-INF/spring/mailbox-no-authorizator.xml | 28 +++++++++
 mailbox/src/site/xdoc/mailbox-store.xml         |  2 +-
 .../james/mailbox/store/Authorizator.java       | 29 +++++++++
 .../james/mailbox/store/FakeAuthorizator.java   | 39 ++++++++++++
 .../mailbox/store/StoreMailboxManager.java      | 30 ++++++---
 .../StoreMailboxManagerAnnotationTest.java      |  3 +-
 .../mailbox/store/StoreMailboxManagerTest.java  | 49 +++++++++++++--
 .../james/mailbox/copier/MailboxCopierTest.java |  7 +++
 .../cassandra/host/CassandraHostSystem.java     |  5 +-
 .../host/ElasticSearchHostSystem.java           |  3 +-
 .../imapmailbox/hbase/host/HBaseHostSystem.java |  4 +-
 .../InMemoryEventAsynchronousHostSystem.java    |  3 +-
 .../inmemory/host/InMemoryHostSystem.java       |  3 +-
 .../mpt/imapmailbox/jcr/host/JCRHostSystem.java |  3 +-
 .../mpt/imapmailbox/jpa/host/JPAHostSystem.java |  3 +-
 .../host/LuceneSearchHostSystem.java            |  3 +-
 .../maildir/host/MaildirHostSystem.java         |  3 +-
 .../base/MailboxEventAnalyserTest.java          |  6 ++
 .../modules/mailbox/CassandraMailboxModule.java |  4 ++
 .../james/modules/mailbox/JPAMailboxModule.java |  4 ++
 .../modules/mailbox/MemoryMailboxModule.java    |  4 ++
 server/container/mailbox-adapter/pom.xml        | 21 ++++---
 .../store/UserRepositoryAuthorizator.java       | 58 +++++++++++++++++
 .../adapter/mailbox/MailboxManagementTest.java  |  2 +
 .../store/UserRepositoryAuthorizatorTest.java   | 65 ++++++++++++++++++++
 .../james/spring-mailbox-authorizator.xml       | 32 ++++++++++
 .../org/apache/james/spring-mailbox-hbase.xml   |  7 ++-
 .../META-INF/org/apache/james/spring-server.xml |  8 +++
 ...ltMailboxesProvisioningFilterThreadTest.java |  5 ++
 .../apache/james/pop3server/POP3ServerTest.java |  7 +++
 .../routes/UserMailboxesRoutesTest.java         |  1 +
 59 files changed, 586 insertions(+), 106 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
index d152466..0cf3e1a 100644
--- a/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/MailboxManager.java
@@ -273,7 +273,7 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport {
 
     /**
      * Autenticates the given user against the given password.<br>
-     * When authentic and authorized, a session will be supplied
+     * When authenticated and authorized, a session will be supplied
      * 
      * @param userid
      *            user name
@@ -281,16 +281,38 @@ public interface MailboxManager extends RequestAware, MailboxListenerSupport {
      *            password supplied
      * @param log
      *            context sensitive log
-     * @return a <code>MailboxSession</code> when the user is authentic and
+     * @return a <code>MailboxSession</code> when the user is authenticated and
      *         authorized to access
      * @throws BadCredentialsException
-     *             when system access is denighed for the given user
+     *             when system access is denied for the given user
      * @throws MailboxException
      *             when the creation fails for other reasons
      */
     MailboxSession login(String userid, String passwd, Logger log) throws BadCredentialsException, MailboxException;
 
     /**
+     * Autenticates the given administrator against the given password,
+     * then switch to an other user<br>
+     * When authenticated and authorized, a session for the other user will be supplied
+     * 
+     * @param adminUserId
+     *            user name of the admin user, matching the credentials
+     * @param passwd
+     *            password supplied for the admin user
+     * @param otherUserId
+     *            user name of the real user
+     * @param log
+     *            context sensitive log
+     * @return a <code>MailboxSession</code> for the real user
+     *         when the admin is authenticated and authorized to access
+     * @throws BadCredentialsException
+     *             when system access is denied for the given user
+     * @throws MailboxException
+     *             when the creation fails for other reasons
+     */
+    MailboxSession loginAsOtherUser(String adminUserId, String passwd, String otherUserId, Logger log) throws BadCredentialsException, MailboxException;
+
+    /**
      * <p>
      * Logs the session out, freeing any resources. Clients who open session
      * should make best efforts to call this when the session is closed.

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
index 5175bff..c1cb183 100644
--- a/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
+++ b/mailbox/cassandra/src/main/java/org/apache/james/mailbox/cassandra/CassandraMailboxManager.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.model.SimpleMailboxACL;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.event.DelegatingMailboxListener;
@@ -52,11 +53,12 @@ public class CassandraMailboxManager extends StoreMailboxManager {
     private final MailboxPathLocker locker;
 
     @Inject
-    public CassandraMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory, Authenticator authenticator,
+    public CassandraMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, Authorizator authorizator,
                                    MailboxPathLocker locker, MessageParser messageParser, MessageId.Factory messageIdFactory,
                                    MailboxEventDispatcher mailboxEventDispatcher, DelegatingMailboxListener delegatingMailboxListener) {
         super(mapperFactory,
             authenticator,
+            authorizator,
             locker,
             new UnionMailboxACLResolver(),
             new SimpleGroupMembershipResolver(),
@@ -69,10 +71,11 @@ public class CassandraMailboxManager extends StoreMailboxManager {
         this.locker = locker;
     }
 
-    public CassandraMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory, Authenticator authenticator,
+    public CassandraMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, Authorizator authorizator,
                                    MailboxPathLocker locker, MessageParser messageParser, MessageId.Factory messageIdFactory) {
         super(mapperFactory,
             authenticator,
+            authorizator,
             locker,
             new UnionMailboxACLResolver(),
             new SimpleGroupMembershipResolver(),
@@ -81,9 +84,18 @@ public class CassandraMailboxManager extends StoreMailboxManager {
         this.locker = locker;
     }
 
-    public CassandraMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, MessageParser messageParser,
+    public CassandraMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory, Authenticator authenticator,  Authorizator authorizator,
+            MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, MessageParser messageParser,
             MessageId.Factory messageIdFactory, int limitOfAnnotations, int limitAnnotationSize) {
-        super(mapperFactory, authenticator, aclResolver, groupMembershipResolver, messageParser, messageIdFactory, limitOfAnnotations, limitAnnotationSize);
+        super(mapperFactory,
+            authenticator,
+            authorizator,
+            aclResolver,
+            groupMembershipResolver,
+            messageParser,
+            messageIdFactory,
+            limitOfAnnotations,
+            limitAnnotationSize);
         this.locker = locker;
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
index caadf4b..281dbf9 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraMailboxManagerTest.java
@@ -42,6 +42,8 @@ import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraSubscriptionModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.NoMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.junit.runner.RunWith;
@@ -98,7 +100,9 @@ public class CassandraMailboxManagerTest {
             GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
             MessageParser messageParser = new MessageParser();
 
-            CassandraMailboxManager manager = new CassandraMailboxManager(mapperFactory, null, new NoMailboxPathLocker(), aclResolver, groupMembershipResolver, 
+            Authenticator noAuthenticator = null;
+            Authorizator noAuthorizator = null;
+            CassandraMailboxManager manager = new CassandraMailboxManager(mapperFactory, noAuthenticator, noAuthorizator, new NoMailboxPathLocker(), aclResolver, groupMembershipResolver, 
                     messageParser, messageIdFactory, LIMIT_ANNOTATIONS, LIMIT_ANNOTATION_SIZE);
             try {
                 manager.init();

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
index 0999c8e..c466e93 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/CassandraTestSystemFixture.java
@@ -41,6 +41,7 @@ import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.NoMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreMessageIdManager;
 import org.apache.james.mailbox.store.event.MailboxEventDispatcher;
@@ -82,7 +83,7 @@ public class CassandraTestSystemFixture {
     }
 
     public static CassandraMailboxManager createMailboxManager(CassandraMailboxSessionMapperFactory mapperFactory) throws Exception{
-        CassandraMailboxManager cassandraMailboxManager = new CassandraMailboxManager(mapperFactory, mock(Authenticator.class),
+        CassandraMailboxManager cassandraMailboxManager = new CassandraMailboxManager(mapperFactory, mock(Authenticator.class), mock(Authorizator.class),
             new NoMailboxPathLocker(), new MessageParser(), new CassandraMessageId.Factory());
         cassandraMailboxManager.init();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
----------------------------------------------------------------------
diff --git a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
index 93228aa..6c717ac 100644
--- a/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
+++ b/mailbox/cassandra/src/test/java/org/apache/james/mailbox/cassandra/mail/CassandraMailboxManagerAttachmentTest.java
@@ -38,6 +38,7 @@ import org.apache.james.mailbox.cassandra.modules.CassandraModSeqModule;
 import org.apache.james.mailbox.cassandra.modules.CassandraUidModule;
 import org.apache.james.mailbox.store.AbstractMailboxManagerAttachmentTest;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.NoMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -70,12 +71,13 @@ public class CassandraMailboxManagerAttachmentTest extends AbstractMailboxManage
                 new CassandraMailboxCounterDAO(cassandra.getConf()),
                 new CassandraMailboxRecentsDAO(cassandra.getConf()));
         Authenticator noAuthenticator = null;
-        mailboxManager = new CassandraMailboxManager(mailboxSessionMapperFactory, noAuthenticator, new NoMailboxPathLocker(), new MessageParser(), messageIdFactory); 
+        Authorizator noAuthorizator = null;
+        mailboxManager = new CassandraMailboxManager(mailboxSessionMapperFactory, noAuthenticator, noAuthorizator, new NoMailboxPathLocker(), new MessageParser(), messageIdFactory); 
         mailboxManager.init();
         MessageParser failingMessageParser = mock(MessageParser.class);
         when(failingMessageParser.retrieveAttachments(any()))
             .thenThrow(new RuntimeException("Message parser set to fail"));
-        parseFailingMailboxManager = new CassandraMailboxManager(mailboxSessionMapperFactory, noAuthenticator, new NoMailboxPathLocker(), failingMessageParser, messageIdFactory); 
+        parseFailingMailboxManager = new CassandraMailboxManager(mailboxSessionMapperFactory, noAuthenticator, noAuthorizator, new NoMailboxPathLocker(), failingMessageParser, messageIdFactory); 
         parseFailingMailboxManager.init();
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index 92b2331..e8e07d5 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -40,6 +40,7 @@ import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
@@ -93,6 +94,7 @@ public class ElasticSearchIntegrationTest extends AbstractMessageSearchIndexTest
         storeMailboxManager = new InMemoryMailboxManager(
             mapperFactory,
             new FakeAuthenticator(),
+            new FakeAuthorizator(),
             new JVMMailboxPathLocker(),
             new UnionMailboxACLResolver(),
             new SimpleGroupMembershipResolver(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java
index baae851..76c83e5 100644
--- a/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java
+++ b/mailbox/hbase/src/main/java/org/apache/james/mailbox/hbase/HBaseMailboxManager.java
@@ -30,6 +30,7 @@ import org.apache.james.mailbox.hbase.mail.model.HBaseMailbox;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreMessageManager;
@@ -43,16 +44,16 @@ import org.apache.james.mailbox.store.transaction.TransactionalMapper;
  */
 public class HBaseMailboxManager extends StoreMailboxManager {
 
-    public HBaseMailboxManager(HBaseMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, 
+    public HBaseMailboxManager(HBaseMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, Authorizator authorizator,
             MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, 
             MessageParser messageParser, MessageId.Factory messageIdFactory) {
-        super(mapperFactory, authenticator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
+        super(mapperFactory, authenticator, authorizator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
     }
 
-    public HBaseMailboxManager(HBaseMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, 
+    public HBaseMailboxManager(HBaseMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, Authorizator authorizator,
             MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, 
             MessageParser messageParser, MessageId.Factory messageIdFactory) {
-        super(mapperFactory, authenticator, new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
+        super(mapperFactory, authenticator, authorizator, new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/hbase/src/main/resources/META-INF/spring/mailbox-hbase.xml
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/main/resources/META-INF/spring/mailbox-hbase.xml b/mailbox/hbase/src/main/resources/META-INF/spring/mailbox-hbase.xml
index 5fe31b8..315a1b5 100644
--- a/mailbox/hbase/src/main/resources/META-INF/spring/mailbox-hbase.xml
+++ b/mailbox/hbase/src/main/resources/META-INF/spring/mailbox-hbase.xml
@@ -40,9 +40,10 @@
     <bean id="hbase-mailboxmanager" class="org.apache.james.mailbox.hbase.HBaseMailboxManager" init-method="init">
         <constructor-arg index="0" ref="hbase-sessionMapperFactory"/>
         <constructor-arg index="1" ref="authenticator"/>
-        <constructor-arg index="2" ref="hbase-locker"/>
-        <constructor-arg index="3" ref="aclResolver"/>
-        <constructor-arg index="4" ref="groupMembershipResolver"/>
+        <constructor-arg index="2" ref="authorizator"/>
+        <constructor-arg index="3" ref="hbase-locker"/>
+        <constructor-arg index="4" ref="aclResolver"/>
+        <constructor-arg index="5" ref="groupMembershipResolver"/>
         <property name="quotaManager" ref="quotaManager"/>
         <property name="maxQuotaManager" ref="maxQuotaManager"/>
         <property name="quotaRootResolver" ref="quotaRootResolver"/>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerTest.java b/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerTest.java
index 7cf8f74..f0d76ce 100644
--- a/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerTest.java
+++ b/mailbox/hbase/src/test/java/org/apache/james/mailbox/hbase/HBaseMailboxManagerTest.java
@@ -36,6 +36,8 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.hbase.mail.HBaseModSeqProvider;
 import org.apache.james.mailbox.hbase.mail.HBaseUidProvider;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.junit.runner.RunWith;
@@ -64,8 +66,11 @@ public class HBaseMailboxManagerTest {
             HBaseMailboxSessionMapperFactory mapperFactory = new HBaseMailboxSessionMapperFactory(CLUSTER.getConf(),
                 uidProvider, modSeqProvider, messageIdFactory);
 
+            Authenticator noAuthenticator = null;
+            Authorizator noAuthorizator = null;
             HBaseMailboxManager manager = new HBaseMailboxManager(mapperFactory,
-                null,
+                noAuthenticator,
+                noAuthorizator,
                 new UnionMailboxACLResolver(),
                 new SimpleGroupMembershipResolver(),
                 new MessageParser(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
index 2e0c26d..9efe0ec 100644
--- a/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
+++ b/mailbox/jcr/src/main/java/org/apache/james/mailbox/jcr/JCRMailboxManager.java
@@ -29,6 +29,7 @@ import org.apache.james.mailbox.jcr.mail.model.JCRMailbox;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreMessageManager;
@@ -45,16 +46,16 @@ public class JCRMailboxManager extends StoreMailboxManager implements JCRImapCon
 
     private final Logger logger = LoggerFactory.getLogger(JCRMailboxManager.class);
     
-    public JCRMailboxManager(JCRMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, 
+    public JCRMailboxManager(JCRMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, Authorizator authorizator,
             MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, 
             MessageParser messageParser, MessageId.Factory messageIdFactory) {
-	    this(mapperFactory, authenticator, new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
+	    this(mapperFactory, authenticator, authorizator, new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
     }
 
-    public JCRMailboxManager(JCRMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, 
+    public JCRMailboxManager(JCRMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, Authorizator authorizator,
             MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, 
             MessageParser messageParser, MessageId.Factory messageIdFactory) {
-        super(mapperFactory, authenticator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
+        super(mapperFactory, authenticator, authorizator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/jcr/src/main/resources/META-INF/spring/mailbox-jcr.xml
----------------------------------------------------------------------
diff --git a/mailbox/jcr/src/main/resources/META-INF/spring/mailbox-jcr.xml b/mailbox/jcr/src/main/resources/META-INF/spring/mailbox-jcr.xml
index 3f4ea84..ccc7451 100644
--- a/mailbox/jcr/src/main/resources/META-INF/spring/mailbox-jcr.xml
+++ b/mailbox/jcr/src/main/resources/META-INF/spring/mailbox-jcr.xml
@@ -30,9 +30,10 @@
     <bean id="jcr-mailboxmanager" class="org.apache.james.mailbox.jcr.JCRMailboxManager" init-method="init">
         <constructor-arg index="0" ref="jcr-sessionMapperFactory"/>
         <constructor-arg index="1" ref="authenticator"/>
-        <constructor-arg index="2" ref="jcr-locker"/>
-        <constructor-arg index="3" ref="aclResolver"/>
-        <constructor-arg index="4" ref="groupMembershipResolver"/>
+        <constructor-arg index="2" ref="authorizator"/>
+        <constructor-arg index="3" ref="jcr-locker"/>
+        <constructor-arg index="4" ref="aclResolver"/>
+        <constructor-arg index="5" ref="groupMembershipResolver"/>
         <property name="quotaManager" ref="quotaManager"/>
         <property name="quotaRootResolver" ref="quotaRootResolver"/>
         <property name="quotaUpdater" ref="quotaUpdater"/>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java b/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java
index ce48e91..7fda2a6 100644
--- a/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java
+++ b/mailbox/jcr/src/test/java/org/apache/james/mailbox/jcr/JCRMailboxManagerTest.java
@@ -37,6 +37,8 @@ import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jcr.mail.JCRModSeqProvider;
 import org.apache.james.mailbox.jcr.mail.JCRUidProvider;
+import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -88,7 +90,9 @@ public class JCRMailboxManagerTest extends MailboxManagerTest<JCRMailboxManager>
             GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
             MessageParser messageParser = new MessageParser();
 
-            JCRMailboxManager manager = new JCRMailboxManager(mf, null, locker, aclResolver, groupMembershipResolver, 
+            Authenticator noAuthenticator = null;
+            Authorizator noAuthorizator = null;
+            JCRMailboxManager manager = new JCRMailboxManager(mf, noAuthenticator, noAuthorizator, locker, aclResolver, groupMembershipResolver, 
                     messageParser, new DefaultMessageId.Factory());
 
             try {

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java
index 11a4578..3754b78 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/JPAMailboxManager.java
@@ -30,6 +30,7 @@ import org.apache.james.mailbox.jpa.mail.model.JPAMailbox;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -41,9 +42,9 @@ import org.apache.james.mailbox.store.transaction.TransactionalMapper;
 public abstract class JPAMailboxManager extends StoreMailboxManager {
     
     public JPAMailboxManager(JPAMailboxSessionMapperFactory mailboxSessionMapperFactory,
-            final Authenticator authenticator, MailboxPathLocker locker, MailboxACLResolver aclResolver, 
+            Authenticator authenticator, Authorizator authorizator, MailboxPathLocker locker, MailboxACLResolver aclResolver, 
             GroupMembershipResolver groupMembershipResolver, MessageParser messageParser, MessageId.Factory messageIdFactory) {
-        super(mailboxSessionMapperFactory, authenticator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
+        super(mailboxSessionMapperFactory, authenticator, authorizator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
index 514a606..f8a2dbb 100644
--- a/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
+++ b/mailbox/jpa/src/main/java/org/apache/james/mailbox/jpa/openjpa/OpenJPAMailboxManager.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.jpa.mail.model.openjpa.EncryptDecryptHelper;
 import org.apache.james.mailbox.jpa.openjpa.OpenJPAMessageManager.AdvancedFeature;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreMessageManager;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -46,10 +47,10 @@ public class OpenJPAMailboxManager extends JPAMailboxManager {
 
     private final AdvancedFeature feature;
 
-    public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, 
+    public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, Authorizator authorizator,
             MailboxPathLocker locker, boolean useStreaming, MailboxACLResolver aclResolver, 
             GroupMembershipResolver groupMembershipResolver, MessageParser messageParser, MessageId.Factory messageIdFactory) {
-        super(mapperFactory, authenticator,  locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
+        super(mapperFactory, authenticator, authorizator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
         if (useStreaming) {
             feature = AdvancedFeature.Streaming;
         } else {
@@ -57,10 +58,10 @@ public class OpenJPAMailboxManager extends JPAMailboxManager {
         }
     }
 
-    public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, 
+    public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, Authorizator authorizator,
             MailboxPathLocker locker,  String encryptPass, MailboxACLResolver aclResolver, 
             GroupMembershipResolver groupMembershipResolver, MessageParser messageParser, MessageId.Factory messageIdFactory) {
-        super(mapperFactory, authenticator,  locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
+        super(mapperFactory, authenticator, authorizator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
         if (encryptPass != null) {
             EncryptDecryptHelper.init(encryptPass);
             feature = AdvancedFeature.Encryption;
@@ -70,10 +71,10 @@ public class OpenJPAMailboxManager extends JPAMailboxManager {
     }
     
     @Inject
-    public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, 
+    public OpenJPAMailboxManager(JPAMailboxSessionMapperFactory mapperFactory, Authenticator authenticator, Authorizator authorizator,
             MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, 
             MessageParser messageParser, MessageId.Factory messageIdFactory) {
-        this(mapperFactory, authenticator, new JVMMailboxPathLocker(), false, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
+        this(mapperFactory, authenticator, authorizator, new JVMMailboxPathLocker(), false, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml b/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
index a4fa05d..6fc298d 100644
--- a/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
+++ b/mailbox/jpa/src/main/resources/META-INF/spring/mailbox-jpa.xml
@@ -34,10 +34,11 @@
     <bean id="jpa-mailboxmanager" class="org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager" init-method="init">
         <constructor-arg index="0" ref="jpa-sessionMapperFactory"/>
         <constructor-arg index="1" ref="authenticator"/>
-        <constructor-arg index="2" ref="aclResolver"/>
-        <constructor-arg index="3" ref="groupMembershipResolver"/>
-        <constructor-arg index="4" ref="messageParser"/>
-        <constructor-arg index="5" ref="messageIdFactory"/>
+        <constructor-arg index="2" ref="authorizator"/>
+        <constructor-arg index="3" ref="aclResolver"/>
+        <constructor-arg index="4" ref="groupMembershipResolver"/>
+        <constructor-arg index="5" ref="messageParser"/>
+        <constructor-arg index="6" ref="messageIdFactory"/>
         <property name="quotaManager" ref="quotaManager"/>
         <property name="quotaRootResolver" ref="quotaRootResolver"/>
         <property name="quotaUpdater" ref="quotaUpdater"/>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
index f9d19dc..64e7ecb 100644
--- a/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
+++ b/mailbox/jpa/src/test/java/org/apache/james/mailbox/jpa/JPAMailboxManagerTest.java
@@ -30,6 +30,8 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.jpa.mail.JPAModSeqProvider;
 import org.apache.james.mailbox.jpa.mail.JPAUidProvider;
 import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
+import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -67,7 +69,9 @@ public class JPAMailboxManagerTest {
             GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
             MessageParser messageParser = new MessageParser();
 
-            openJPAMailboxManager = new OpenJPAMailboxManager(mf, null, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
+            Authenticator noAuthenticator = null;
+            Authorizator noAuthorizator = null;
+            openJPAMailboxManager = new OpenJPAMailboxManager(mf, noAuthenticator, noAuthorizator, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
 
             try {
                 openJPAMailboxManager.init();

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
index 62ce25f..210bd98 100644
--- a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
+++ b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
@@ -27,6 +27,7 @@ import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.model.TestMessageId;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -47,6 +48,7 @@ public class LuceneMessageSearchIndexTest extends AbstractMessageSearchIndexTest
         storeMailboxManager = new InMemoryMailboxManager(
             mapperFactory,
             new FakeAuthenticator(),
+            new FakeAuthorizator(),
             new JVMMailboxPathLocker(),
             new UnionMailboxACLResolver(),
             new SimpleGroupMembershipResolver(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
----------------------------------------------------------------------
diff --git a/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml b/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
index 0c00e7f..66f65c8 100644
--- a/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
+++ b/mailbox/maildir/src/main/resources/META-INF/spring/mailbox-maildir.xml
@@ -36,13 +36,14 @@
     <bean id="maildir-mailboxmanager" class="org.apache.james.mailbox.store.StoreMailboxManager" init-method="init">
         <constructor-arg index="0" ref="maildir-sessionMapperFactory"/>
         <constructor-arg index="1" ref="authenticator"/>
-        <constructor-arg index="2" ref="maildir-locker"/>
-        <constructor-arg index="3" ref="aclResolver"/>
-        <constructor-arg index="4" ref="groupMembershipResolver"/>
-        <constructor-arg index="5" ref="messageParser"/>
-        <constructor-arg index="6" ref="messageIdFactory" />
-        <constructor-arg index="7" ref="dispatcher" />
-        <constructor-arg index="8" ref="delegating-listener" />
+        <constructor-arg index="2" ref="authorizator"/>
+        <constructor-arg index="3" ref="maildir-locker"/>
+        <constructor-arg index="4" ref="aclResolver"/>
+        <constructor-arg index="5" ref="groupMembershipResolver"/>
+        <constructor-arg index="6" ref="messageParser"/>
+        <constructor-arg index="7" ref="messageIdFactory" />
+        <constructor-arg index="8" ref="dispatcher" />
+        <constructor-arg index="9" ref="delegating-listener" />
 <!--         <property name="messageSearchIndex" ref="lazyIndex"/> -->
         <property name="quotaManager" ref="quotaManager"/>
         <property name="quotaRootResolver" ref="quotaRootResolver"/>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerTests.java
----------------------------------------------------------------------
diff --git a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerTests.java b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerTests.java
index 2c3a13d..85875b0 100644
--- a/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerTests.java
+++ b/mailbox/maildir/src/test/java/org/apache/james/mailbox/maildir/MaildirMailboxManagerTests.java
@@ -27,6 +27,8 @@ import org.apache.james.mailbox.acl.MailboxACLResolver;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
 import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
@@ -59,7 +61,9 @@ public class MaildirMailboxManagerTests {
             GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
             MessageParser messageParser = new MessageParser();
 
-            StoreMailboxManager manager = new StoreMailboxManager(mf, null, new JVMMailboxPathLocker(), aclResolver, 
+            Authenticator noAuthenticator = null;
+            Authorizator noAuthorizator = null;
+            StoreMailboxManager manager = new StoreMailboxManager(mf, noAuthenticator, noAuthorizator, new JVMMailboxPathLocker(), aclResolver, 
                     groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
             manager.init();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
index 5793c1a..a37b43d 100644
--- a/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
+++ b/mailbox/memory/src/main/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManager.java
@@ -31,6 +31,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreMessageManager;
@@ -42,25 +43,25 @@ import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 public class InMemoryMailboxManager extends StoreMailboxManager {
 
     @Inject
-    public InMemoryMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator,
+    public InMemoryMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, Authorizator authorizator,
             MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver,
             MessageParser messageParser, MessageId.Factory messageIdFactory, MailboxEventDispatcher dispatcher,
             DelegatingMailboxListener delegatingMailboxListener) {
-        super(mailboxSessionMapperFactory, authenticator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory,
+        super(mailboxSessionMapperFactory, authenticator, authorizator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory,
             MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE, dispatcher,
             delegatingMailboxListener);
     }
 
-    public InMemoryMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator,
+    public InMemoryMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, Authorizator authorizator,
                                   MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver,
                                   MessageParser messageParser, MessageId.Factory messageIdFactory) {
-        super(mailboxSessionMapperFactory, authenticator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
+        super(mailboxSessionMapperFactory, authenticator, authorizator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
     }
 
-    public InMemoryMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, MailboxACLResolver aclResolver, 
-            GroupMembershipResolver groupMembershipResolver, MessageParser messageParser,
+    public InMemoryMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator,  Authorizator authorizator,
+            MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, MessageParser messageParser,
             MessageId.Factory messageIdFactory, int limitOfAnnotations, int limitAnnotationSize) {
-        super(mailboxSessionMapperFactory, authenticator, aclResolver, groupMembershipResolver, messageParser, messageIdFactory, limitOfAnnotations, limitAnnotationSize);
+        super(mailboxSessionMapperFactory, authenticator, authorizator, aclResolver, groupMembershipResolver, messageParser, messageIdFactory, limitOfAnnotations, limitAnnotationSize);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml b/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
index 41205db..d75ced9 100644
--- a/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
+++ b/mailbox/memory/src/main/resources/META-INF/spring/mailbox-memory.xml
@@ -34,13 +34,14 @@
     <bean id="memory-mailboxManager" class="org.apache.james.mailbox.store.StoreMailboxManager" init-method="init">
         <constructor-arg index="0" ref="memory-sessionMapperFactory"/>
         <constructor-arg index="1" ref="authenticator"/>
-        <constructor-arg index="2" ref="memory-locker"/>
-        <constructor-arg index="3" ref="aclResolver"/>
-        <constructor-arg index="4" ref="groupMembershipResolver"/>
-        <constructor-arg index="5" ref="messageParser"/>
-        <constructor-arg index="6" ref="messageIdFactory" />
-        <constructor-arg index="7" ref="dispatcher" />
-        <constructor-arg index="8" ref="delegating-listener" />
+        <constructor-arg index="2" ref="authorizator"/>
+        <constructor-arg index="3" ref="memory-locker"/>
+        <constructor-arg index="4" ref="aclResolver"/>
+        <constructor-arg index="5" ref="groupMembershipResolver"/>
+        <constructor-arg index="6" ref="messageParser"/>
+        <constructor-arg index="7" ref="messageIdFactory" />
+        <constructor-arg index="8" ref="dispatcher" />
+        <constructor-arg index="9" ref="delegating-listener" />
 <!--         <property name="messageSearchIndex" ref="lazyIndex"/> -->
         <property name="quotaManager" ref="quotaManager"/>
         <property name="quotaRootResolver" ref="quotaRootResolver"/>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java
index fe0160c..f6bb97c 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java
@@ -26,6 +26,7 @@ import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.junit.runner.RunWith;
 import org.xenei.junit.contract.Contract;
@@ -51,7 +52,7 @@ public class InMemoryMailboxManagerTest {
 
             InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory();
             MessageId.Factory messageIdFactory = new InMemoryMessageId.Factory();
-            InMemoryMailboxManager mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, new FakeAuthenticator(), 
+            InMemoryMailboxManager mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, new FakeAuthenticator(), new FakeAuthorizator(),
                     aclResolver, groupMembershipResolver, messageParser, messageIdFactory, LIMIT_ANNOTATIONS, LIMIT_ANNOTATION_SIZE);
 
             try {

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MessageIdManagerTestSystemProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MessageIdManagerTestSystemProvider.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MessageIdManagerTestSystemProvider.java
index 6edc24f..cd54d43 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MessageIdManagerTestSystemProvider.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MessageIdManagerTestSystemProvider.java
@@ -26,6 +26,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.manager.MailboxManagerFixture;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.CombinationManagerTestSystem;
 import org.apache.james.mailbox.store.MessageIdManagerTestSystem;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -56,9 +57,10 @@ public class MessageIdManagerTestSystemProvider {
         InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory();
         MessageId.Factory messageIdFactory = new InMemoryMessageId.Factory();
         FakeAuthenticator authenticator = new FakeAuthenticator();
+        FakeAuthorizator authorizator = new FakeAuthorizator();
         authenticator.addUser(MailboxManagerFixture.USER, PASSWORD);
         authenticator.addUser(MailboxManagerFixture.OTHER_USER, PASSWORD);
-        InMemoryMailboxManager mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, authenticator, 
+        InMemoryMailboxManager mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, authenticator, authorizator,
                 aclResolver, groupMembershipResolver, messageParser, messageIdFactory, LIMIT_ANNOTATIONS, LIMIT_ANNOTATION_SIZE);
 
         try {

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
index 614c5cf..df422f0 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/mail/InMemoryMailboxManagerAttachmentTest.java
@@ -33,6 +33,7 @@ import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.AbstractMailboxManagerAttachmentTest;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.NoMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -46,14 +47,15 @@ public class InMemoryMailboxManagerAttachmentTest extends AbstractMailboxManager
     public InMemoryMailboxManagerAttachmentTest() throws Exception {
         mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory();
         Authenticator noAuthenticator = null;
+        Authorizator noAuthorizator = null;
         MessageId.Factory messageIdFactory = new InMemoryMessageId.Factory();
-        mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, noAuthenticator, new NoMailboxPathLocker(), 
+        mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, noAuthenticator, noAuthorizator, new NoMailboxPathLocker(), 
                 new UnionMailboxACLResolver(), null, new MessageParser(), messageIdFactory);
         mailboxManager.init();
         MessageParser failingMessageParser = mock(MessageParser.class);
         when(failingMessageParser.retrieveAttachments(any(InputStream.class)))
             .thenThrow(new RuntimeException("Message parser set to fail"));
-        parseFailingMailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, noAuthenticator, new NoMailboxPathLocker(),
+        parseFailingMailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, noAuthenticator, noAuthorizator, new NoMailboxPathLocker(),
                 new UnionMailboxACLResolver(), null, failingMessageParser, messageIdFactory);
         parseFailingMailboxManager.init();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
index 835b6bc..cc7d22d 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
@@ -37,6 +37,7 @@ import org.apache.james.mailbox.quota.MaxQuotaManager;
 import org.apache.james.mailbox.quota.QuotaManager;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.NoMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -52,12 +53,13 @@ public class InMemoryIntegrationResources implements IntegrationResources {
 
     @Override
     public MailboxManager createMailboxManager(GroupMembershipResolver groupMembershipResolver) throws MailboxException {
-        FakeAuthenticator mockAuthenticator = new FakeAuthenticator();
-        mockAuthenticator.addUser(ManagerTestResources.USER, ManagerTestResources.USER_PASS);
+        FakeAuthenticator fakeAuthenticator = new FakeAuthenticator();
+        fakeAuthenticator.addUser(ManagerTestResources.USER, ManagerTestResources.USER_PASS);
         InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory();
         final StoreMailboxManager manager = new InMemoryMailboxManager(
             mailboxSessionMapperFactory,
-            mockAuthenticator,
+            fakeAuthenticator,
+            new FakeAuthorizator(),
             new NoMailboxPathLocker(),
             new UnionMailboxACLResolver(),
             groupMembershipResolver,

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
index c005b9c..694778b 100644
--- a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
+++ b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
@@ -26,6 +26,7 @@ import org.apache.james.mailbox.inmemory.InMemoryMailboxManager;
 import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -44,6 +45,7 @@ public class SimpleMessageSearchIndexTest extends AbstractMessageSearchIndexTest
         storeMailboxManager = new InMemoryMailboxManager(
             mapperFactory,
             new FakeAuthenticator(),
+            new FakeAuthorizator(),
             new JVMMailboxPathLocker(),
             new UnionMailboxACLResolver(),
             new SimpleGroupMembershipResolver(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java
----------------------------------------------------------------------
diff --git a/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java b/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java
new file mode 100644
index 0000000..88500c3
--- /dev/null
+++ b/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java
@@ -0,0 +1,30 @@
+/****************************************************************
+ * 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.mailbox.spring;
+
+import org.apache.james.mailbox.store.Authorizator;
+
+public class NoAuthorizator implements Authorizator {
+
+    @Override
+    public boolean canLoginAsOtherUser(String userId, String otherUserId) {
+        return false;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/SpringMailbox.java
----------------------------------------------------------------------
diff --git a/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/SpringMailbox.java b/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/SpringMailbox.java
index 176d22d..db85ad8 100644
--- a/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/SpringMailbox.java
+++ b/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/SpringMailbox.java
@@ -27,7 +27,7 @@ public class SpringMailbox {
     
     public SpringMailbox() {
         applicationContext = new ClassPathXmlApplicationContext("META-INF/spring/spring-mailbox.xml",
-            "META-INF/spring/mailbox-authenticator-anonymous.xml", "META-INF/spring/quota.xml",
+            "META-INF/spring/mailbox-authenticator-anonymous.xml", "META-INF/spring/mailbox-no-authorizator.xml", "META-INF/spring/quota.xml",
             "META-INF/spring/quota-alias.xml", "META-INF/spring/event-system.xml", "META-INF/spring/event-alias.xml");
     }
     

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/spring/src/main/resources/META-INF/spring/mailbox-no-authorizator.xml
----------------------------------------------------------------------
diff --git a/mailbox/spring/src/main/resources/META-INF/spring/mailbox-no-authorizator.xml b/mailbox/spring/src/main/resources/META-INF/spring/mailbox-no-authorizator.xml
new file mode 100644
index 0000000..3373a7e
--- /dev/null
+++ b/mailbox/spring/src/main/resources/META-INF/spring/mailbox-no-authorizator.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.    
+-->
+
+<beans xmlns="http://www.springframework.org/schema/beans" 
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+    <bean id="authorizator" class="org.apache.james.mailbox.spring.NoAuthorizator"/>
+
+</beans>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/src/site/xdoc/mailbox-store.xml
----------------------------------------------------------------------
diff --git a/mailbox/src/site/xdoc/mailbox-store.xml b/mailbox/src/site/xdoc/mailbox-store.xml
index c8d882f..64b0ad9 100644
--- a/mailbox/src/site/xdoc/mailbox-store.xml
+++ b/mailbox/src/site/xdoc/mailbox-store.xml
@@ -45,7 +45,7 @@ Image is no more in line with trunk
     <subsection name="Store Mailbox Manager">
       <p>All public and protected methods that can be used by a Mailbox Manager implementations.</p>
       <p>You need to instantiate the StoreMailboxManager with a mailboxSessionMapperFactory,
-         an authenticator, a uidProvider and a mailboxPathlocker.</p>
+         an authenticator, an authorizator, a uidProvider and a mailboxPathlocker.</p>
 <!-- 
 Image is no more in line with trunk
       <p><img src="images/uml/org-apache-james-mailbox-store-mailboxmanager.png"/></p>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java
new file mode 100644
index 0000000..4710e34
--- /dev/null
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java
@@ -0,0 +1,29 @@
+/****************************************************************
+ * 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.mailbox.store;
+
+/**
+ * Authenticates user credentials.
+ */
+public interface Authorizator {
+
+    boolean canLoginAsOtherUser(String userId, String otherUserId);
+}
+

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java
new file mode 100644
index 0000000..4e15ed7
--- /dev/null
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java
@@ -0,0 +1,39 @@
+/****************************************************************
+ * 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.mailbox.store;
+
+import java.util.List;
+
+import com.google.common.collect.ImmutableList;
+
+public class FakeAuthorizator implements Authorizator {
+
+    private List<String> adminIds;
+
+    public FakeAuthorizator(String... adminIds) {
+        this.adminIds = ImmutableList.copyOf(adminIds);
+
+    }
+
+    @Override
+    public boolean canLoginAsOtherUser(String userId, String otherUserId) {
+        return adminIds.contains(userId);
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 9d14622..705fd8d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -104,6 +104,8 @@ public class StoreMailboxManager implements MailboxManager {
 
     private final Authenticator authenticator;
 
+    private Authorizator authorizator;
+
     private final MailboxACLResolver aclResolver;
 
     private final GroupMembershipResolver groupMembershipResolver;
@@ -136,39 +138,40 @@ public class StoreMailboxManager implements MailboxManager {
     private final int limitAnnotationSize;
 
     @Inject
-    public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, 
+    public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, Authorizator authorizator, 
             MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, 
             MessageParser messageParser, MessageId.Factory messageIdFactory, MailboxEventDispatcher mailboxEventDispatcher,
             DelegatingMailboxListener delegatingListener) {
-        this(mailboxSessionMapperFactory, authenticator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory,
+        this(mailboxSessionMapperFactory, authenticator, authorizator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory,
                 MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE, mailboxEventDispatcher, delegatingListener);
     }
 
-    public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator,
+    public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, Authorizator authorizator,
                                MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver,
                                MessageParser messageParser, MessageId.Factory messageIdFactory) {
-        this(mailboxSessionMapperFactory, authenticator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory,
+        this(mailboxSessionMapperFactory, authenticator, authorizator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory,
             MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE);
     }
 
-    public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, 
+    public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, Authorizator authorizator,
             MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, MessageParser messageParser,
             MessageId.Factory messageIdFactory, int limitOfAnnotations, int limitAnnotationSize) {
-        this(mailboxSessionMapperFactory, authenticator, new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver, messageParser, messageIdFactory,
+        this(mailboxSessionMapperFactory, authenticator, authorizator, new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver, messageParser, messageIdFactory,
                 limitOfAnnotations, limitAnnotationSize);
     }
 
-    public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, 
+    public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, Authorizator authorizator,
             MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, MessageParser messageParser,
             MessageId.Factory messageIdFactory, int limitOfAnnotations, int limitAnnotationSize) {
-        this(mailboxSessionMapperFactory, authenticator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory,
+        this(mailboxSessionMapperFactory, authenticator, authorizator, locker, aclResolver, groupMembershipResolver, messageParser, messageIdFactory,
             limitOfAnnotations, limitAnnotationSize, null, null);
     }
 
-    public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator,
+    public StoreMailboxManager(MailboxSessionMapperFactory mailboxSessionMapperFactory, Authenticator authenticator, Authorizator authorizator,
                                MailboxPathLocker locker, MailboxACLResolver aclResolver, GroupMembershipResolver groupMembershipResolver, MessageParser messageParser,
                                MessageId.Factory messageIdFactory, int limitOfAnnotations, int limitAnnotationSize, MailboxEventDispatcher mailboxEventDispatcher, DelegatingMailboxListener delegatingListener) {
         this.authenticator = authenticator;
+        this.authorizator = authorizator;
         this.locker = locker;
         this.mailboxSessionMapperFactory = mailboxSessionMapperFactory;
         this.aclResolver = aclResolver;
@@ -417,6 +420,15 @@ public class StoreMailboxManager implements MailboxManager {
         }
     }
 
+    @Override
+    public MailboxSession loginAsOtherUser(String adminUserid, String passwd, String otherUserId, Logger log) throws BadCredentialsException, MailboxException {
+        if (login(adminUserid, passwd) && authorizator.canLoginAsOtherUser(adminUserid, otherUserId)) {
+            return createSystemSession(otherUserId, log);
+        } else {
+            throw new BadCredentialsException();
+        }
+    }
+
     /**
      * Close the {@link MailboxSession} if not null
      */

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java
index 2dd1df7..08e5837 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerAnnotationTest.java
@@ -71,6 +71,7 @@ public class StoreMailboxManagerAnnotationTest {
 
     @Mock private MailboxSessionMapperFactory mailboxSessionMapperFactory;
     @Mock private Authenticator authenticator;
+    @Mock private Authorizator authorizator;
     @Mock private MailboxACLResolver aclResolver;
     @Mock private GroupMembershipResolver groupMembershipResolver;
     @Mock private MailboxMapper mailboxMapper;
@@ -101,7 +102,7 @@ public class StoreMailboxManagerAnnotationTest {
             }
         });
 
-        storeMailboxManager = spy(new StoreMailboxManager(mailboxSessionMapperFactory, authenticator, aclResolver, groupMembershipResolver, 
+        storeMailboxManager = spy(new StoreMailboxManager(mailboxSessionMapperFactory, authenticator, authorizator, aclResolver, groupMembershipResolver, 
                 messageParser, messageIdFactory, MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE));
         storeMailboxManager.init();
     }

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
index 901b9f9..fd4fae2 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
@@ -19,35 +19,41 @@
 
 package org.apache.james.mailbox.store;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import static org.assertj.core.api.Assertions.assertThat;
-
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.acl.SimpleGroupMembershipResolver;
 import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
+import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
 import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.model.MessageId.Factory;
+import org.apache.james.mailbox.model.TestId;
 import org.apache.james.mailbox.store.mail.MailboxMapper;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
 import org.apache.james.mailbox.store.mail.model.impl.SimpleMailbox;
 import org.junit.Before;
 import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class StoreMailboxManagerTest {
 
     private static final String CURRENT_USER = "user";
+    private static final String CURRENT_USER_PASSWORD = "secret";
+    private static final String ADMIN = "admin";
+    private static final String ADMIN_PASSWORD = "adminsecret";
     private static final MailboxId MAILBOX_ID = TestId.of(123);
-    public static final int UID_VALIDITY = 42;
+    private static final Logger LOGGER = LoggerFactory.getLogger(StoreMailboxManagerTest.class); 
+    private static final int UID_VALIDITY = 42;
     private StoreMailboxManager storeMailboxManager;
     private MailboxMapper mockedMailboxMapper;
     private MailboxSession mockedMailboxSession;
@@ -60,9 +66,13 @@ public class StoreMailboxManagerTest {
         when(mockedMapperFactory.getMailboxMapper(mockedMailboxSession))
             .thenReturn(mockedMailboxMapper);
         Factory messageIdFactory = mock(MessageId.Factory.class);
-        storeMailboxManager = new StoreMailboxManager(mockedMapperFactory, new FakeAuthenticator(), 
+        FakeAuthenticator authenticator = new FakeAuthenticator();
+        authenticator.addUser(CURRENT_USER, CURRENT_USER_PASSWORD);
+        authenticator.addUser(ADMIN, ADMIN_PASSWORD);
+        storeMailboxManager = new StoreMailboxManager(mockedMapperFactory, authenticator, new FakeAuthorizator(ADMIN),
                 new JVMMailboxPathLocker(), new UnionMailboxACLResolver(), new SimpleGroupMembershipResolver(), 
                 new MessageParser(), messageIdFactory);
+        storeMailboxManager.init();
     }
 
     @Test
@@ -166,5 +176,34 @@ public class StoreMailboxManagerTest {
 
         assertThat(expected.getId()).isEqualTo(MAILBOX_ID);
     }
+
+    @Test
+    public void loginShouldCreateSessionWhenGoodPassword() throws Exception {
+        MailboxSession expected = storeMailboxManager.login(CURRENT_USER, CURRENT_USER_PASSWORD, LOGGER);
+
+        assertThat(expected.getUser().getUserName()).isEqualTo(CURRENT_USER);
+    }
+
+    @Test(expected = BadCredentialsException.class)
+    public void loginShouldThrowWhenBadPassword() throws Exception {
+        storeMailboxManager.login(CURRENT_USER, "badpassword", LOGGER);
+    }
+
+    @Test(expected = BadCredentialsException.class)
+    public void loginAsOtherUserShouldNotCreateUserSessionWhenAdminWithBadPassword() throws Exception {
+        storeMailboxManager.loginAsOtherUser(ADMIN, "badpassword", CURRENT_USER, LOGGER);
+    }
+
+    @Test(expected = BadCredentialsException.class)
+    public void loginAsOtherUserShouldNotCreateUserSessionWhenNotAdmin() throws Exception {
+        storeMailboxManager.loginAsOtherUser(CURRENT_USER, CURRENT_USER_PASSWORD, "otheruser", LOGGER);
+    }
+
+    @Test
+    public void loginAsOtherUserShouldCreateUserSessionWhenAdminWithGoodPassword() throws Exception {
+        MailboxSession expected = storeMailboxManager.loginAsOtherUser(ADMIN, ADMIN_PASSWORD, CURRENT_USER, LOGGER);
+
+        assertThat(expected.getUser().getUserName()).isEqualTo(CURRENT_USER);
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java b/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java
index 02ae1e6..c0bdbc1 100644
--- a/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java
+++ b/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java
@@ -38,6 +38,7 @@ import org.apache.james.mailbox.mock.MockMailboxManager;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -166,6 +167,12 @@ public class MailboxCopierTest {
                     return true;
                 }
             },
+            new Authorizator() {
+                @Override
+                public boolean canLoginAsOtherUser(String userId, String otherUserId) {
+                    return false;
+                }
+            },
             aclResolver,
             groupMembershipResolver,
             messageParser,


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


[06/12] james-project git commit: JAMES-1930 Introduce MTP AUTHENTICATE PLAIN tests

Posted by ad...@apache.org.
JAMES-1930 Introduce MTP AUTHENTICATE PLAIN tests


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

Branch: refs/heads/master
Commit: 200460cf3cefb401991cc401b07793b8119e26b9
Parents: bdf8932
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Thu Feb 9 17:46:48 2017 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Feb 14 11:29:30 2017 +0100

----------------------------------------------------------------------
 .../cassandra/CassandraMailboxTest.java         |  2 +
 .../imapmailbox/suite/AuthenticatePlain.java    | 54 +++++++++++++++++++
 .../james/imap/scripts/AuthenticatePlain.test   | 56 ++++++++++++++++++++
 3 files changed, 112 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/200460cf/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java
index 2c43665..cc4d60d 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/CassandraMailboxTest.java
@@ -21,6 +21,7 @@ package org.apache.james.mpt.imapmailbox.cassandra;
 
 import org.apache.james.mpt.imapmailbox.AbstractMailboxTest;
 import org.apache.james.mpt.imapmailbox.suite.MailboxWithLongNameError;
+import org.apache.james.mpt.imapmailbox.suite.AuthenticatePlain;
 import org.apache.james.mpt.imapmailbox.suite.AuthenticatedState;
 import org.apache.james.mpt.imapmailbox.suite.ConcurrentSessions;
 import org.apache.james.mpt.imapmailbox.suite.Events;
@@ -49,6 +50,7 @@ import org.junit.runners.Suite.SuiteClasses;
 @GuiceModules({ CassandraMailboxTestModule.class })
 @SuiteClasses({
     AuthenticatedState.class,
+    AuthenticatePlain.class,
     ConcurrentSessions.class,
     Events.class,
     Expunge.class,

http://git-wip-us.apache.org/repos/asf/james-project/blob/200460cf/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java
new file mode 100644
index 0000000..58a9892
--- /dev/null
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java
@@ -0,0 +1,54 @@
+/****************************************************************
+ * 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.mpt.imapmailbox.suite;
+
+import java.util.Locale;
+
+import javax.inject.Inject;
+
+import org.apache.james.mpt.api.ImapHostSystem;
+import org.apache.james.mpt.imapmailbox.suite.base.BaseNonAuthenticatedState;
+import org.junit.Test;
+
+public class AuthenticatePlain extends BaseNonAuthenticatedState {
+    
+    @Inject
+    private static ImapHostSystem system;
+
+    
+    public AuthenticatePlain() throws Exception {
+        super(system);
+    }
+
+    @Test
+    public void testAuthenticatePlainUS() throws Exception {
+        scriptTest("AuthenticatePlain", Locale.US);
+    }
+
+    @Test
+    public void testAuthenticatePlainITALY() throws Exception {
+        scriptTest("AuthenticatePlain", Locale.ITALY);
+    }
+
+    @Test
+    public void testAuthenticatePlainKOREA() throws Exception {
+        scriptTest("AuthenticatePlain", Locale.KOREA);
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/200460cf/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AuthenticatePlain.test
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AuthenticatePlain.test b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AuthenticatePlain.test
new file mode 100644
index 0000000..8408748
--- /dev/null
+++ b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AuthenticatePlain.test
@@ -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.                                           #
+################################################################
+
+# Correct user with correct password can authenticate with delegation part missing
+C: abcd AUTHENTICATE "PLAIN" {24+}
+# imapuser\0password
+C: aW1hcHVzZXIAcGFzc3dvcmQ=
+S: abcd OK AUTHENTICATE completed.
+
+REINIT
+
+# Correct user with correct password can authenticate with empty delegation part
+C: abcd AUTHENTICATE "PLAIN" {24+}
+# \0imapuser\0password
+C: AGltYXB1c2VyAHBhc3N3b3Jk
+S: abcd OK AUTHENTICATE completed.
+
+REINIT
+
+# Correct user with bad password cannot authenticate
+C: abcd AUTHENTICATE "PLAIN" {28+}
+# \0imapuser\0badpassword
+C: AGltYXB1c2VyAGJhZHBhc3N3b3Jk
+S: abcd NO AUTHENTICATE failed. Authentication failed.
+
+REINIT
+
+# Bad user cannot authenticate
+C: abcd AUTHENTICATE "PLAIN" {24+}
+# \0baduser\0password
+C: AGJhZHVzZXIAcGFzc3dvcmQ=
+S: abcd NO AUTHENTICATE failed. Authentication failed.
+
+REINIT
+
+# Correct user with correct password can authenticate with any delegation part
+C: abcd AUTHENTICATE "PLAIN" {36+}
+# delegate\0imapuser\0password
+C: ZGVsZWdhdGUAaW1hcHVzZXIAcGFzc3dvcmQ=
+S: abcd OK AUTHENTICATE completed.


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


[11/12] james-project git commit: JAMES-1940 Fix Virtual hosting support of LDAP users repository

Posted by ad...@apache.org.
JAMES-1940 Fix Virtual hosting support of LDAP users repository


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

Branch: refs/heads/master
Commit: df96d1afc87c6a325f4b0f2b2814d1d6a07b3a28
Parents: 42b574d
Author: Antoine Duprat <ad...@linagora.com>
Authored: Tue Feb 14 11:18:00 2017 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Feb 14 13:04:54 2017 +0100

----------------------------------------------------------------------
 .../ldap/ReadOnlyUsersLDAPRepositoryTest.java   | 62 +++++++++++++++++++-
 .../src/test/resources/ldif-files/populate.ldif |  1 +
 .../user/ldap/ReadOnlyUsersLDAPRepository.java  |  6 +-
 3 files changed, 67 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/df96d1af/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java
----------------------------------------------------------------------
diff --git a/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java b/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java
index c5e1bbe..17b7ad8 100644
--- a/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java
+++ b/server/data/data-ldap-integration-testing/src/test/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepositoryTest.java
@@ -23,6 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.plist.PropertyListConfiguration;
+import org.apache.mailet.MailAddress;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -35,6 +36,7 @@ public class ReadOnlyUsersLDAPRepositoryTest {
     private static final String DOMAIN = "james.org";
     private static final String ADMIN_PASSWORD = "mysecretpassword";
     private static final String JAMES_USER = "james-user";
+    private static final String JAMES_USER_MAIL = "james-user" + "@" + DOMAIN;
     private static final String UNKNOWN = "unknown";
     private static final String PASSWORD = "secret";
     private static final String BAD_PASSWORD = "badpassword";
@@ -49,8 +51,11 @@ public class ReadOnlyUsersLDAPRepositoryTest {
                 .password(ADMIN_PASSWORD)
                 .build();
         ldapContainer.start();
+    }
+
+    private void startUsersRepository(HierarchicalConfiguration ldapRepositoryConfiguration) throws ConfigurationException, Exception {
         ldapRepository = new ReadOnlyUsersLDAPRepository();
-        ldapRepository.configure(ldapRepositoryConfiguration());
+        ldapRepository.configure(ldapRepositoryConfiguration);
         ldapRepository.setLog(LOGGER);
         ldapRepository.init();
     }
@@ -70,6 +75,22 @@ public class ReadOnlyUsersLDAPRepositoryTest {
         return configuration;
     }
 
+    private HierarchicalConfiguration ldapRepositoryConfigurationWithVirtualHosting() throws ConfigurationException {
+        PropertyListConfiguration configuration = new PropertyListConfiguration();
+        configuration.addProperty("[@ldapHost]", ldapContainer.getLdapHost());
+        configuration.addProperty("[@principal]", "cn=admin\\,dc=james\\,dc=org");
+        configuration.addProperty("[@credentials]", ADMIN_PASSWORD);
+        configuration.addProperty("[@userBase]", "ou=People\\,dc=james\\,dc=org");
+        configuration.addProperty("[@userIdAttribute]", "mail");
+        configuration.addProperty("[@userObjectClass]", "inetOrgPerson");
+        configuration.addProperty("[@maxRetries]", "4");
+        configuration.addProperty("[@retryStartInterval]", "0");
+        configuration.addProperty("[@retryMaxInterval]", "8");
+        configuration.addProperty("[@retryIntervalScale]", "1000");
+        configuration.addProperty("supportsVirtualHosting", true);
+        return configuration;
+    }
+
     @After
     public void tearDown() {
         if (ldapContainer != null) {
@@ -79,21 +100,60 @@ public class ReadOnlyUsersLDAPRepositoryTest {
 
     @Test
     public void knownUserShouldBeAbleToLogInWhenPasswordIsCorrect() throws Exception {
+        startUsersRepository(ldapRepositoryConfiguration());
         assertThat(ldapRepository.test(JAMES_USER, PASSWORD)).isTrue();
     }
 
     @Test
     public void knownUserShouldNotBeAbleToLogInWhenPasswordIsNotCorrect() throws Exception {
+        startUsersRepository(ldapRepositoryConfiguration());
         assertThat(ldapRepository.test(JAMES_USER, BAD_PASSWORD)).isFalse();
     }
 
     @Test
     public void unknownUserShouldNotBeAbleToLogIn() throws Exception {
+        startUsersRepository(ldapRepositoryConfiguration());
         assertThat(ldapRepository.test(UNKNOWN, BAD_PASSWORD)).isFalse();
     }
 
     @Test
     public void unknownUserShouldNotBeAbleToLogInWhenPasswordIsCorrect() throws Exception {
+        startUsersRepository(ldapRepositoryConfiguration());
         assertThat(ldapRepository.test(UNKNOWN, PASSWORD)).isFalse();
     }
+    @Test
+    public void knownUserShouldBeAbleToLogInWhenPasswordIsCorrectWithVirtualHosting() throws Exception {
+        startUsersRepository(ldapRepositoryConfigurationWithVirtualHosting());
+        assertThat(ldapRepository.test(JAMES_USER_MAIL, PASSWORD)).isTrue();
+    }
+
+    @Test
+    public void knownUserShouldNotBeAbleToLogInWhenPasswordIsNotCorrectWithVirtualHosting() throws Exception {
+        startUsersRepository(ldapRepositoryConfigurationWithVirtualHosting());
+        assertThat(ldapRepository.test(JAMES_USER, BAD_PASSWORD)).isFalse();
+    }
+
+    @Test
+    public void unknownUserShouldNotBeAbleToLogInWithVirtualHosting() throws Exception {
+        startUsersRepository(ldapRepositoryConfigurationWithVirtualHosting());
+        assertThat(ldapRepository.test(UNKNOWN, BAD_PASSWORD)).isFalse();
+    }
+
+    @Test
+    public void unknownUserShouldNotBeAbleToLogInWhenPasswordIsCorrectWithVirtualHosting() throws Exception {
+        startUsersRepository(ldapRepositoryConfigurationWithVirtualHosting());
+        assertThat(ldapRepository.test(UNKNOWN, PASSWORD)).isFalse();
+    }
+
+    @Test
+    public void containsWithGetUserShouldBeTrue() throws Exception {
+        startUsersRepository(ldapRepositoryConfiguration());
+        assertThat(ldapRepository.contains(ldapRepository.getUser(new MailAddress(JAMES_USER_MAIL)))).isTrue();
+    }
+
+    @Test
+    public void containsWithGetUserShouldBeTrueWithVirtualHosting() throws Exception {
+        startUsersRepository(ldapRepositoryConfigurationWithVirtualHosting());
+        assertThat(ldapRepository.contains(ldapRepository.getUser(new MailAddress(JAMES_USER_MAIL)))).isTrue();
+    }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/df96d1af/server/data/data-ldap-integration-testing/src/test/resources/ldif-files/populate.ldif
----------------------------------------------------------------------
diff --git a/server/data/data-ldap-integration-testing/src/test/resources/ldif-files/populate.ldif b/server/data/data-ldap-integration-testing/src/test/resources/ldif-files/populate.ldif
index 9376a6c..95f3391 100644
--- a/server/data/data-ldap-integration-testing/src/test/resources/ldif-files/populate.ldif
+++ b/server/data/data-ldap-integration-testing/src/test/resources/ldif-files/populate.ldif
@@ -7,5 +7,6 @@ objectClass: inetOrgPerson
 uid: james-user
 cn: james-user
 sn: james-user
+mail: james-user@james.org
 userPassword: secret
 description: James user

http://git-wip-us.apache.org/repos/asf/james-project/blob/df96d1af/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
index 6e07236..4948a39 100644
--- a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
@@ -768,6 +768,10 @@ public class ReadOnlyUsersLDAPRepository implements UsersRepository, Configurabl
 
     @Override
     public String getUser(MailAddress mailAddress) throws UsersRepositoryException {
-        return mailAddress.getLocalPart();
+        if (supportVirtualHosting()) {
+            return mailAddress.asString();
+        } else {
+            return mailAddress.getLocalPart();
+        }
     }
 }


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


[12/12] james-project git commit: Merge remote-tracking branch 'mine/JAMES-1940-2'

Posted by ad...@apache.org.
Merge remote-tracking branch 'mine/JAMES-1940-2'


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

Branch: refs/heads/master
Commit: d5495352318a74c3f375e85d6d96e9a5632a0d53
Parents: 3f26ba0 df96d1a
Author: Antoine Duprat <ad...@linagora.com>
Authored: Tue Feb 14 13:05:16 2017 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Feb 14 13:05:16 2017 +0100

----------------------------------------------------------------------
 .../ldap/ReadOnlyUsersLDAPRepositoryTest.java   | 62 +++++++++++++++++++-
 .../src/test/resources/ldif-files/populate.ldif |  1 +
 .../user/ldap/ReadOnlyUsersLDAPRepository.java  |  6 +-
 3 files changed, 67 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/d5495352/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
----------------------------------------------------------------------
diff --cc server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
index cc9eeb2,4948a39..f828cb5
--- a/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
+++ b/server/data/data-ldap/src/main/java/org/apache/james/user/ldap/ReadOnlyUsersLDAPRepository.java
@@@ -781,14 -768,10 +781,18 @@@ public class ReadOnlyUsersLDAPRepositor
  
      @Override
      public String getUser(MailAddress mailAddress) throws UsersRepositoryException {
-         return mailAddress.getLocalPart();
+         if (supportVirtualHosting()) {
+             return mailAddress.asString();
+         } else {
+             return mailAddress.getLocalPart();
+         }
      }
 +
 +    @Override
 +    public boolean isAdministrator(String username) throws UsersRepositoryException {
 +        if (administratorId.isPresent()) {
 +            return administratorId.get().equals(username);
 +        }
 +        return false;
 +    }
  }


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


[02/12] james-project git commit: JAMES-1930 Introduce Authorizator to check users authorizations about delegation

Posted by ad...@apache.org.
http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
index 3b8b46c..8e76403 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
@@ -52,6 +52,7 @@ import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaManager;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -73,6 +74,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
     
     private final CassandraMailboxManager mailboxManager;
     private final FakeAuthenticator userManager;
+    private final FakeAuthorizator authorizator;
     private final CassandraCluster cassandraClusterSingleton;
 
     public CassandraHostSystem() throws Exception {
@@ -90,6 +92,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
             new CassandraAnnotationModule());
         cassandraClusterSingleton = CassandraCluster.create(mailboxModule);
         userManager = new FakeAuthenticator();
+        authorizator = new FakeAuthorizator();
         com.datastax.driver.core.Session session = cassandraClusterSingleton.getConf();
         CassandraModSeqProvider modSeqProvider = new CassandraModSeqProvider(session);
         CassandraUidProvider uidProvider = new CassandraUidProvider(session);
@@ -104,7 +107,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
         CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider, modSeqProvider, 
                 session, typesProvider, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO, mailboxRecentsDAO);
         
-        mailboxManager = new CassandraMailboxManager(mapperFactory, userManager, new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory); 
+        mailboxManager = new CassandraMailboxManager(mapperFactory, userManager, authorizator, new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory); 
         QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mapperFactory);
 
         CassandraPerUserMaxQuotaManager perUserMaxQuotaManager = new CassandraPerUserMaxQuotaManager(session);

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
index 6cac0a3..6caa31c 100644
--- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
@@ -54,6 +54,7 @@ import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
@@ -124,7 +125,7 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
-        mailboxManager = new StoreMailboxManager(factory, userManager, aclResolver, groupMembershipResolver, messageParser,
+        mailboxManager = new StoreMailboxManager(factory, userManager, new FakeAuthorizator(), aclResolver, groupMembershipResolver, messageParser,
             messageIdFactory, MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE);
         mailboxManager.setMessageSearchIndex(searchIndex);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java b/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
index 7cd3876..7ed820e 100644
--- a/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
+++ b/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
@@ -41,6 +41,7 @@ import org.apache.james.mailbox.hbase.mail.HBaseModSeqProvider;
 import org.apache.james.mailbox.hbase.mail.HBaseUidProvider;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -91,6 +92,7 @@ public class HBaseHostSystem extends JamesImapHostSystem {
         }
 
         userManager = new FakeAuthenticator();
+        FakeAuthorizator authorizator = new FakeAuthorizator();
 
         final HBaseModSeqProvider modSeqProvider = new HBaseModSeqProvider(conf);
         final HBaseUidProvider uidProvider = new HBaseUidProvider(conf);
@@ -101,7 +103,7 @@ public class HBaseHostSystem extends JamesImapHostSystem {
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
         
-        mailboxManager = new HBaseMailboxManager(mapperFactory, userManager, aclResolver, groupMembershipResolver, 
+        mailboxManager = new HBaseMailboxManager(mapperFactory, userManager, authorizator, aclResolver, groupMembershipResolver, 
                 messageParser, messageIdFactory);
         mailboxManager.init();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java
index d3bce01..0f24491 100644
--- a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java
+++ b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.event.AsynchronousEventDelivery;
@@ -82,7 +83,7 @@ public class InMemoryEventAsynchronousHostSystem extends JamesImapHostSystem {
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
-        mailboxManager = new StoreMailboxManager(factory, userManager, aclResolver, groupMembershipResolver, messageParser, 
+        mailboxManager = new StoreMailboxManager(factory, userManager, new FakeAuthorizator(), aclResolver, groupMembershipResolver, messageParser, 
                 new InMemoryMessageId.Factory(), MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE);
         QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(factory);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
index 766d8d8..5cb7729 100644
--- a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
+++ b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
@@ -36,6 +36,7 @@ import org.apache.james.mailbox.inmemory.quota.InMemoryPerUserMaxQuotaManager;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -84,7 +85,7 @@ public class InMemoryHostSystem extends JamesImapHostSystem {
         MessageParser messageParser = new MessageParser();
 
         InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory();
-        mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, userManager, 
+        mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, userManager, new FakeAuthorizator(),
                 new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver, messageParser, new InMemoryMessageId.Factory());
         QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mailboxManager.getMapperFactory());
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java b/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
index 5841715..edca72d 100644
--- a/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
+++ b/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
@@ -41,6 +41,7 @@ import org.apache.james.mailbox.jcr.mail.JCRModSeqProvider;
 import org.apache.james.mailbox.jcr.mail.JCRUidProvider;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -94,7 +95,7 @@ public class JCRHostSystem extends JamesImapHostSystem{
             GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
             MessageParser messageParser = new MessageParser();
 
-            mailboxManager = new JCRMailboxManager(mf, userManager, locker, aclResolver, groupMembershipResolver, messageParser,
+            mailboxManager = new JCRMailboxManager(mf, userManager, new FakeAuthorizator(), aclResolver, groupMembershipResolver, messageParser,
                     new DefaultMessageId.Factory());
             mailboxManager.init();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
index 42082f1..37165bc 100644
--- a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
+++ b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
@@ -43,6 +43,7 @@ import org.apache.james.mailbox.jpa.mail.JPAUidProvider;
 import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -82,7 +83,7 @@ public class JPAHostSystem extends JamesImapHostSystem {
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
-        mailboxManager = new OpenJPAMailboxManager(mf, userManager, locker, false, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
+        mailboxManager = new OpenJPAMailboxManager(mf, userManager, new FakeAuthorizator(), locker, false, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
         mailboxManager.init();
 
         SubscriptionManager subscriptionManager = new JPASubscriptionManager(mf);

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
index 2361c08..10d8845 100644
--- a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
@@ -49,6 +49,7 @@ import org.apache.james.mailbox.lucene.search.LuceneMessageSearchIndex;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -124,7 +125,7 @@ public class LuceneSearchHostSystem extends JamesImapHostSystem {
             GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
             MessageParser messageParser = new MessageParser();
 
-            mailboxManager = new OpenJPAMailboxManager(factory, userManager, locker, false, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
+            mailboxManager = new OpenJPAMailboxManager(factory, userManager, new FakeAuthorizator(), locker, false, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
 
             LuceneMessageSearchIndex searchIndex = new LuceneMessageSearchIndex(factory, mailboxIdFactory, fsDirectory, messageIdFactory, mailboxManager);
             searchIndex.setEnableSuffixMatch(true);

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
index c1db7f2..9a97fdd 100644
--- a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
+++ b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
@@ -34,6 +34,7 @@ import org.apache.james.mailbox.maildir.MaildirMailboxSessionMapperFactory;
 import org.apache.james.mailbox.maildir.MaildirStore;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
@@ -71,7 +72,7 @@ public class MaildirHostSystem extends JamesImapHostSystem {
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
-        mailboxManager = new StoreMailboxManager(mailboxSessionMapperFactory, userManager, locker, aclResolver, 
+        mailboxManager = new StoreMailboxManager(mailboxSessionMapperFactory, userManager, new FakeAuthorizator(), locker, aclResolver, 
                 groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
         mailboxManager.init();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
index b687c53..e6dbed2 100644
--- a/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
+++ b/protocols/imap/src/test/java/org/apache/james/imap/processor/base/MailboxEventAnalyserTest.java
@@ -47,6 +47,7 @@ import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxSession;
 import org.apache.james.mailbox.MessageManager;
 import org.apache.james.mailbox.MessageUid;
+import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.ComposedMessageId;
 import org.apache.james.mailbox.model.Content;
@@ -410,6 +411,11 @@ public class MailboxEventAnalyserTest {
         public boolean hasChildren(MailboxPath mailboxPath, MailboxSession session) throws MailboxException {
             return false;
         }
+
+        @Override
+        public MailboxSession loginAsOtherUser(String adminUserId, String passwd, String realUserId, Logger log) throws BadCredentialsException, MailboxException {
+            throw new UnsupportedOperationException("Not implemented");
+        }
     };
     
     private final class MyMailboxSession implements MailboxSession {

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
index df0693f..46cc66a 100644
--- a/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
+++ b/server/container/guice/cassandra-guice/src/main/java/org/apache/james/modules/mailbox/CassandraMailboxModule.java
@@ -21,6 +21,7 @@ package org.apache.james.modules.mailbox;
 import javax.inject.Singleton;
 
 import org.apache.james.adapter.mailbox.store.UserRepositoryAuthenticator;
+import org.apache.james.adapter.mailbox.store.UserRepositoryAuthorizator;
 import org.apache.james.backends.cassandra.components.CassandraModule;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxPathLocker;
@@ -40,6 +41,7 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.NoMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreMessageIdManager;
@@ -72,6 +74,7 @@ public class CassandraMailboxModule extends AbstractModule {
         bind(CassandraModSeqProvider.class).in(Scopes.SINGLETON);
         bind(CassandraUidProvider.class).in(Scopes.SINGLETON);
         bind(UserRepositoryAuthenticator.class).in(Scopes.SINGLETON);
+        bind(UserRepositoryAuthorizator.class).in(Scopes.SINGLETON);
         bind(CassandraId.Factory.class).in(Scopes.SINGLETON);
         bind(CassandraMessageId.Factory.class).in(Scopes.SINGLETON);
         bind(CassandraMessageDAO.class).in(Scopes.SINGLETON);
@@ -90,6 +93,7 @@ public class CassandraMailboxModule extends AbstractModule {
         bind(SubscriptionManager.class).to(CassandraSubscriptionManager.class);
         bind(MailboxPathLocker.class).to(NoMailboxPathLocker.class);
         bind(Authenticator.class).to(UserRepositoryAuthenticator.class);
+        bind(Authorizator.class).to(UserRepositoryAuthorizator.class);
         bind(MailboxManager.class).to(CassandraMailboxManager.class);
         bind(MailboxId.Factory.class).to(CassandraId.Factory.class);
         bind(MessageId.Factory.class).to(CassandraMessageId.Factory.class);

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java b/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
index c12cd00..4feba2f 100644
--- a/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
+++ b/server/container/guice/jpa-guice/src/main/java/org/apache/james/modules/mailbox/JPAMailboxModule.java
@@ -29,6 +29,7 @@ import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.PropertiesConfiguration;
 import org.apache.james.JPAConfiguration;
 import org.apache.james.adapter.mailbox.store.UserRepositoryAuthenticator;
+import org.apache.james.adapter.mailbox.store.UserRepositoryAuthorizator;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.SubscriptionManager;
@@ -46,6 +47,7 @@ import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.mail.AttachmentMapperFactory;
@@ -76,6 +78,7 @@ public class JPAMailboxModule extends AbstractModule {
         bind(JPAModSeqProvider.class).in(Scopes.SINGLETON);
         bind(JPAUidProvider.class).in(Scopes.SINGLETON);
         bind(UserRepositoryAuthenticator.class).in(Scopes.SINGLETON);
+        bind(UserRepositoryAuthorizator.class).in(Scopes.SINGLETON);
         bind(JPAId.Factory.class).in(Scopes.SINGLETON);
         bind(SimpleGroupMembershipResolver.class).in(Scopes.SINGLETON);
         bind(UnionMailboxACLResolver.class).in(Scopes.SINGLETON);
@@ -93,6 +96,7 @@ public class JPAMailboxModule extends AbstractModule {
         bind(MailboxPathLocker.class).to(JVMMailboxPathLocker.class);
         bind(Authenticator.class).to(UserRepositoryAuthenticator.class);
         bind(MailboxManager.class).to(OpenJPAMailboxManager.class);
+        bind(Authorizator.class).to(UserRepositoryAuthorizator.class);
         bind(MailboxId.Factory.class).to(JPAId.Factory.class);
         bind(GroupMembershipResolver.class).to(SimpleGroupMembershipResolver.class);
         bind(MailboxACLResolver.class).to(UnionMailboxACLResolver.class);

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
----------------------------------------------------------------------
diff --git a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
index b911b30..09fd4f0 100644
--- a/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
+++ b/server/container/guice/memory-guice/src/main/java/org/apache/james/modules/mailbox/MemoryMailboxModule.java
@@ -22,6 +22,7 @@ package org.apache.james.modules.mailbox;
 import javax.inject.Singleton;
 
 import org.apache.james.adapter.mailbox.store.UserRepositoryAuthenticator;
+import org.apache.james.adapter.mailbox.store.UserRepositoryAuthorizator;
 import org.apache.james.mailbox.MailboxManager;
 import org.apache.james.mailbox.MailboxPathLocker;
 import org.apache.james.mailbox.MessageIdManager;
@@ -43,6 +44,7 @@ import org.apache.james.mailbox.inmemory.mail.InMemoryUidProvider;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MessageId;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.MailboxSessionMapperFactory;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
@@ -82,6 +84,7 @@ public class MemoryMailboxModule extends AbstractModule {
         bind(MailboxSessionMapperFactory.class).to(InMemoryMailboxSessionMapperFactory.class);
         bind(MailboxPathLocker.class).to(JVMMailboxPathLocker.class);
         bind(Authenticator.class).to(UserRepositoryAuthenticator.class);
+        bind(Authorizator.class).to(UserRepositoryAuthorizator.class);
         bind(MailboxManager.class).to(InMemoryMailboxManager.class);
         bind(MessageIdManager.class).to(InMemoryMessageIdManager.class);
         bind(MailboxACLResolver.class).to(UnionMailboxACLResolver.class);
@@ -96,6 +99,7 @@ public class MemoryMailboxModule extends AbstractModule {
         bind(StoreSubscriptionManager.class).in(Scopes.SINGLETON);
         bind(JVMMailboxPathLocker.class).in(Scopes.SINGLETON);
         bind(UserRepositoryAuthenticator.class).in(Scopes.SINGLETON);
+        bind(UserRepositoryAuthorizator.class).in(Scopes.SINGLETON);
         bind(InMemoryMailboxManager.class).in(Scopes.SINGLETON);
         bind(UnionMailboxACLResolver.class).in(Scopes.SINGLETON);
         bind(SimpleGroupMembershipResolver.class).in(Scopes.SINGLETON);

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/container/mailbox-adapter/pom.xml
----------------------------------------------------------------------
diff --git a/server/container/mailbox-adapter/pom.xml b/server/container/mailbox-adapter/pom.xml
index 2c92694..32951dd 100644
--- a/server/container/mailbox-adapter/pom.xml
+++ b/server/container/mailbox-adapter/pom.xml
@@ -51,10 +51,21 @@
         </dependency>
         <dependency>
             <groupId>org.apache.james</groupId>
+            <artifactId>apache-james-mailbox-memory</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.james</groupId>
             <artifactId>apache-james-mailbox-store</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.james</groupId>
+            <artifactId>apache-james-mailbox-store</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.james</groupId>
             <artifactId>apache-james-mailbox-maildir</artifactId>
         </dependency>
         <dependency>
@@ -81,14 +92,8 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.james</groupId>
-            <artifactId>apache-james-mailbox-memory</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.james</groupId>
-            <artifactId>apache-james-mailbox-store</artifactId>
-            <type>test-jar</type>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-core</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java
----------------------------------------------------------------------
diff --git a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java
new file mode 100644
index 0000000..494a499
--- /dev/null
+++ b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java
@@ -0,0 +1,58 @@
+/****************************************************************
+ * 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.adapter.mailbox.store;
+
+import javax.inject.Inject;
+
+import org.apache.james.lifecycle.api.LogEnabled;
+import org.apache.james.mailbox.store.Authorizator;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.api.UsersRepositoryException;
+import org.slf4j.Logger;
+
+/**
+ * Authorizator which use an UsersRepository to check if the delegation is allowed
+ */
+public class UserRepositoryAuthorizator implements Authorizator, LogEnabled {
+
+    private final UsersRepository repos;
+    private Logger log;
+
+    @Inject
+    public UserRepositoryAuthorizator(UsersRepository repos) {
+        this.repos = repos;
+    }
+
+    @Override
+    public boolean canLoginAsOtherUser(String userId, String otherUserId) {
+        try {
+            return repos.isAdministrator(userId) && repos.contains(otherUserId);
+        } catch (UsersRepositoryException e) {
+            log.warn("Unable to access UsersRepository", e);
+        }
+        return false;
+    }
+
+    @Override
+    public void setLog(Logger log) {
+        this.log = log;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
----------------------------------------------------------------------
diff --git a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
index f4c7c5f..dbcd8ac 100644
--- a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
+++ b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
@@ -29,6 +29,7 @@ import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.FakeAuthenticator;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.Mailbox;
@@ -55,6 +56,7 @@ public class MailboxManagementTest {
         StoreMailboxManager mailboxManager = new StoreMailboxManager(
             inMemoryMapperFactory,
             new FakeAuthenticator(),
+            new FakeAuthorizator(),
             new JVMMailboxPathLocker(),
             new UnionMailboxACLResolver(),
             new SimpleGroupMembershipResolver(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java
----------------------------------------------------------------------
diff --git a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java
new file mode 100644
index 0000000..ea94ba4
--- /dev/null
+++ b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java
@@ -0,0 +1,65 @@
+package org.apache.james.adapter.mailbox.store;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.api.UsersRepositoryException;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UserRepositoryAuthorizatorTest {
+    private static final String ADMIN = "admin";
+    private static final String USER = "user";
+    private static final Logger LOGGER = LoggerFactory.getLogger(UserRepositoryAuthorizatorTest.class);
+
+    private UsersRepository usersRepository;
+    private UserRepositoryAuthorizator testee;
+
+    @Before
+    public void setUp() throws Exception {
+        usersRepository = mock(UsersRepository.class);
+        testee = new UserRepositoryAuthorizator(usersRepository);
+        testee.setLog(LOGGER);
+    }
+
+    @Test
+    public void canLoginAsOtherUserShouldReturnFalseWhenIsAdministratorThrows() throws Exception {
+        when(usersRepository.isAdministrator(ADMIN))
+            .thenThrow(new UsersRepositoryException("expected error"));
+        
+        assertThat(testee.canLoginAsOtherUser(ADMIN, USER)).isFalse();
+    }
+
+    @Test
+    public void canLoginAsOtherUserShouldReturnFalseWhenIsAdministratorReturnFalse() throws Exception {
+        when(usersRepository.isAdministrator(ADMIN))
+            .thenReturn(false);
+        
+        assertThat(testee.canLoginAsOtherUser(ADMIN, USER)).isFalse();
+    }
+
+    @Test
+    public void canLoginAsOtherUserShouldReturnFalseWhenUserIsNotInRepository() throws Exception {
+        when(usersRepository.isAdministrator(ADMIN))
+            .thenReturn(true);
+        when(usersRepository.contains(USER))
+            .thenReturn(false);
+        
+        assertThat(testee.canLoginAsOtherUser(ADMIN, USER)).isFalse();
+    }
+
+    @Test
+    public void canLoginAsOtherUserShouldReturnTrueWhenAdminAndUserIsInRepository() throws Exception {
+        when(usersRepository.isAdministrator(ADMIN))
+            .thenReturn(true);
+        when(usersRepository.contains(USER))
+            .thenReturn(true);
+        
+        assertThat(testee.canLoginAsOtherUser(ADMIN, USER)).isTrue();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-authorizator.xml
----------------------------------------------------------------------
diff --git a/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-authorizator.xml b/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-authorizator.xml
new file mode 100644
index 0000000..0185042
--- /dev/null
+++ b/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-authorizator.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.    
+-->
+
+<beans xmlns="http://www.springframework.org/schema/beans" 
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="
+          http://www.springframework.org/schema/beans classpath:org/springframework/beans/factory/xml/spring-beans-3.0.xsd">
+
+    <!-- 
+      Mailbox Authorizator
+     -->
+
+    <bean id="authorizator" class="org.apache.james.adapter.mailbox.store.UserRepositoryAuthorizator"/>
+
+</beans>

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-hbase.xml
----------------------------------------------------------------------
diff --git a/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-hbase.xml b/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-hbase.xml
index da13389..daf6820 100644
--- a/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-hbase.xml
+++ b/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-mailbox-hbase.xml
@@ -38,9 +38,10 @@
     <bean id="hbase-mailboxmanager" class="org.apache.james.mailbox.hbase.HBaseMailboxManager" init-method="init">
         <constructor-arg index="0" ref="hbase-sessionMapperFactory"/>
         <constructor-arg index="1" ref="authenticator"/>
-        <constructor-arg index="2" ref="hbase-locker"/>
-        <constructor-arg index="3" ref="aclResolver"/>
-        <constructor-arg index="4" ref="groupMembershipResolver"/>
+        <constructor-arg index="2" ref="authorizator"/>
+        <constructor-arg index="3" ref="hbase-locker"/>
+        <constructor-arg index="4" ref="aclResolver"/>
+        <constructor-arg index="5" ref="groupMembershipResolver"/>
     </bean>
     
     <bean id="hbase-sessionMapperFactory" class="org.apache.james.mailbox.hbase.HBaseMailboxSessionMapperFactory">

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-server.xml
----------------------------------------------------------------------
diff --git a/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-server.xml b/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-server.xml
index 39788f0..a08cedc 100644
--- a/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-server.xml
+++ b/server/container/spring/src/main/resources/META-INF/org/apache/james/spring-server.xml
@@ -57,6 +57,14 @@
 
     <!-- 
     ===========================================================================
+       Authorizator
+    ===========================================================================
+    -->
+
+    <import resource="classpath:META-INF/org/apache/james/spring-mailbox-authorizator.xml"/>
+
+    <!-- 
+    ===========================================================================
        Queues
     ===========================================================================
     -->

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/protocols/jmap/src/test/java/org/apache/james/jmap/DefaultMailboxesProvisioningFilterThreadTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/jmap/src/test/java/org/apache/james/jmap/DefaultMailboxesProvisioningFilterThreadTest.java b/server/protocols/jmap/src/test/java/org/apache/james/jmap/DefaultMailboxesProvisioningFilterThreadTest.java
index ab0c546..abcd91c 100644
--- a/server/protocols/jmap/src/test/java/org/apache/james/jmap/DefaultMailboxesProvisioningFilterThreadTest.java
+++ b/server/protocols/jmap/src/test/java/org/apache/james/jmap/DefaultMailboxesProvisioningFilterThreadTest.java
@@ -263,6 +263,11 @@ public class DefaultMailboxesProvisioningFilterThreadTest {
         public boolean hasChildren(MailboxPath mailboxPath, MailboxSession session) throws MailboxException {
             return false;
         }
+
+        @Override
+        public MailboxSession loginAsOtherUser(String adminUserId, String passwd, String realUserId, Logger log) throws BadCredentialsException, MailboxException {
+            return null;
+        }
     }
 }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
index 233e652..1b6e453 100644
--- a/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
+++ b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
@@ -51,6 +51,7 @@ import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -738,6 +739,12 @@ public class POP3ServerTest {
                     return false;
                 }
             }
+        }, new Authorizator() {
+
+            @Override
+            public boolean canLoginAsOtherUser(String userId, String otherUserId) {
+                return false;
+            }
         }, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory(), MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE);
         mailboxManager.init();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/8b52a2b8/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java b/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
index f40315b..bd28679 100644
--- a/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
+++ b/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
@@ -103,6 +103,7 @@ public class UserMailboxesRoutesTest {
             MessageId.Factory messageIdFactory = new DefaultMessageId.Factory();
             InMemoryMailboxManager mailboxManager = new InMemoryMailboxManager(new InMemoryMailboxSessionMapperFactory(),
                 (userid, passwd) -> true,
+                (adminUserid, userid) -> false,
                 new JVMMailboxPathLocker(),
                 new UnionMailboxACLResolver(),
                 new SimpleGroupMembershipResolver(),


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


[10/12] james-project git commit: JAMES-1930 MPT test for delegation

Posted by ad...@apache.org.
JAMES-1930 MPT test for delegation


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

Branch: refs/heads/master
Commit: 3f26ba0cdacef98e41c4ea96014f8eadfb0b4f97
Parents: 157be0d
Author: Benoit Tellier <bt...@linagora.com>
Authored: Fri Feb 10 11:49:13 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Feb 14 11:29:30 2017 +0100

----------------------------------------------------------------------
 .../cassandra/host/CassandraHostSystem.java     | 13 +----
 mpt/impl/imap-mailbox/core/pom.xml              |  8 +++
 .../james/mpt/host/JamesImapHostSystem.java     | 44 +++++++++++++--
 .../imapmailbox/suite/AuthenticatePlain.java    | 12 +++-
 .../james/imap/scripts/AuthenticatePlain.test   | 59 ++++++++++++++++----
 .../host/ElasticSearchHostSystem.java           | 10 +---
 .../imapmailbox/hbase/host/HBaseHostSystem.java | 13 +----
 .../inmemory/InMemoryMailboxTest.java           |  2 +
 .../InMemoryEventAsynchronousHostSystem.java    | 11 +---
 .../inmemory/host/InMemoryHostSystem.java       | 11 +---
 .../mpt/imapmailbox/jcr/host/JCRHostSystem.java | 16 +-----
 .../mpt/imapmailbox/jpa/host/JPAHostSystem.java | 15 +----
 .../host/LuceneSearchHostSystem.java            | 14 +----
 .../maildir/host/MaildirHostSystem.java         | 17 ++----
 mpt/pom.xml                                     |  5 ++
 .../user/memory/MemoryUsersRepository.java      |  4 ++
 16 files changed, 133 insertions(+), 121 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
index e466f2d..3f9750b 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
@@ -51,8 +51,6 @@ import org.apache.james.mailbox.cassandra.quota.CassandraCurrentQuotaManager;
 import org.apache.james.mailbox.cassandra.quota.CassandraPerUserMaxQuotaManager;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
-import org.apache.james.mailbox.store.FakeAuthenticator;
-import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -73,8 +71,6 @@ public class CassandraHostSystem extends JamesImapHostSystem {
         Feature.ANNOTATION_SUPPORT);
     
     private final CassandraMailboxManager mailboxManager;
-    private final FakeAuthenticator userManager;
-    private final FakeAuthorizator authorizator;
     private final CassandraCluster cassandraClusterSingleton;
 
     public CassandraHostSystem() throws Exception {
@@ -91,8 +87,6 @@ public class CassandraHostSystem extends JamesImapHostSystem {
             new CassandraAttachmentModule(),
             new CassandraAnnotationModule());
         cassandraClusterSingleton = CassandraCluster.create(mailboxModule);
-        userManager = new FakeAuthenticator();
-        authorizator = FakeAuthorizator.defaultReject();
         com.datastax.driver.core.Session session = cassandraClusterSingleton.getConf();
         CassandraModSeqProvider modSeqProvider = new CassandraModSeqProvider(session);
         CassandraUidProvider uidProvider = new CassandraUidProvider(session);
@@ -107,7 +101,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
         CassandraMailboxSessionMapperFactory mapperFactory = new CassandraMailboxSessionMapperFactory(uidProvider, modSeqProvider, 
                 session, typesProvider, messageDAO, messageIdDAO, imapUidDAO, mailboxCounterDAO, mailboxRecentsDAO);
         
-        mailboxManager = new CassandraMailboxManager(mapperFactory, userManager, authorizator, new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory); 
+        mailboxManager = new CassandraMailboxManager(mapperFactory, authenticator, authorizator, new JVMMailboxPathLocker(), new MessageParser(), messageIdFactory);
         QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mapperFactory);
 
         CassandraPerUserMaxQuotaManager perUserMaxQuotaManager = new CassandraPerUserMaxQuotaManager(session);
@@ -143,11 +137,6 @@ public class CassandraHostSystem extends JamesImapHostSystem {
         cassandraClusterSingleton.clearAllTables();
     }
 
-    public boolean addUser(String user, String password) {
-        userManager.addUser(user, password);
-        return true;
-    }
-
     @Override
     protected void finalize() throws Throwable {
         super.finalize();

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/core/pom.xml
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/core/pom.xml b/mpt/impl/imap-mailbox/core/pom.xml
index a13926d..f2435b0 100644
--- a/mpt/impl/imap-mailbox/core/pom.xml
+++ b/mpt/impl/imap-mailbox/core/pom.xml
@@ -58,6 +58,14 @@
             <artifactId>apache-james-mpt-onami-test</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.apache.james</groupId>
+            <artifactId>james-server-data-memory</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.james</groupId>
+            <artifactId>james-server-mailbox-adapter</artifactId>
+        </dependency>
+        <dependency>
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-classic</artifactId>
         </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java
index e2be945..149209a 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java
@@ -19,35 +19,54 @@
 
 package org.apache.james.mpt.host;
 
+import java.util.HashSet;
+import java.util.Set;
+
+import org.apache.commons.configuration.ConfigurationException;
+import org.apache.commons.configuration.HierarchicalConfiguration;
+import org.apache.commons.configuration.plist.PropertyListConfiguration;
+import org.apache.james.adapter.mailbox.store.UserRepositoryAuthenticator;
+import org.apache.james.adapter.mailbox.store.UserRepositoryAuthorizator;
 import org.apache.james.imap.api.process.ImapProcessor;
 import org.apache.james.imap.decode.ImapDecoder;
 import org.apache.james.imap.decode.main.ImapRequestStreamHandler;
 import org.apache.james.imap.encode.ImapEncoder;
 import org.apache.james.mailbox.MailboxSession.User;
 import org.apache.james.mailbox.model.MailboxPath;
+import org.apache.james.mailbox.store.Authenticator;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.mpt.api.Continuation;
 import org.apache.james.mpt.api.ImapHostSystem;
 import org.apache.james.mpt.helper.ByteBufferInputStream;
 import org.apache.james.mpt.helper.ByteBufferOutputStream;
 import org.apache.james.mpt.session.ImapSessionImpl;
+import org.apache.james.user.memory.MemoryUsersRepository;
 import org.slf4j.LoggerFactory;
 
-import java.util.HashSet;
-import java.util.Set;
+import com.google.common.base.Throwables;
 
 public abstract class JamesImapHostSystem implements ImapHostSystem {
 
-    private ImapDecoder decoder;
+    private final MemoryUsersRepository memoryUsersRepository;
+    private final Set<User> users;
+    protected final Authorizator authorizator;
+    protected final Authenticator authenticator;
 
+    private ImapDecoder decoder;
     private ImapEncoder encoder;
-
     private ImapProcessor processor;
 
-    private final Set<User> users;
-
     public JamesImapHostSystem() {
         super();
         users = new HashSet<User>();
+        memoryUsersRepository = MemoryUsersRepository.withoutVirtualHosting();
+        try {
+            memoryUsersRepository.configure(userRepositoryConfiguration());
+        } catch (ConfigurationException e) {
+            throw Throwables.propagate(e);
+        }
+        authenticator = new UserRepositoryAuthenticator(memoryUsersRepository);
+        authorizator = new UserRepositoryAuthorizator(memoryUsersRepository);
     }
 
     public void configure(ImapDecoder decoder, ImapEncoder encoder,
@@ -57,6 +76,12 @@ public abstract class JamesImapHostSystem implements ImapHostSystem {
         this.processor = processor;
     }
 
+    @Override
+    public boolean addUser(String user, String password) throws Exception {
+        memoryUsersRepository.addUser(user, password);
+        return true;
+    }
+
     public Session newSession(Continuation continuation)
             throws Exception {
         return new Session(continuation);
@@ -67,6 +92,7 @@ public abstract class JamesImapHostSystem implements ImapHostSystem {
     
     public void afterTest() throws Exception {
         users.clear();
+        memoryUsersRepository.clear();
         resetData();
     }
     
@@ -127,5 +153,11 @@ public abstract class JamesImapHostSystem implements ImapHostSystem {
     public void beforeTests() throws Exception {
         // default do nothing
     }
+
+    private HierarchicalConfiguration userRepositoryConfiguration() {
+        PropertyListConfiguration configuration = new PropertyListConfiguration();
+        configuration.addProperty("administratorId", "imapuser");
+        return configuration;
+    }
     
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java
index 58a9892..6f241bb 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/imapmailbox/suite/AuthenticatePlain.java
@@ -23,6 +23,8 @@ import java.util.Locale;
 
 import javax.inject.Inject;
 
+import org.apache.james.mailbox.model.MailboxConstants;
+import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mpt.api.ImapHostSystem;
 import org.apache.james.mpt.imapmailbox.suite.base.BaseNonAuthenticatedState;
 import org.junit.Test;
@@ -32,23 +34,31 @@ public class AuthenticatePlain extends BaseNonAuthenticatedState {
     @Inject
     private static ImapHostSystem system;
 
-    
     public AuthenticatePlain() throws Exception {
         super(system);
     }
 
     @Test
     public void testAuthenticatePlainUS() throws Exception {
+        system.addUser("delegate", "123456");
+        system.createMailbox(new MailboxPath(MailboxConstants.USER_NAMESPACE, "delegate", "delegate"));
+        system.createMailbox(new MailboxPath(MailboxConstants.USER_NAMESPACE, "imapuser", "imapuser"));
         scriptTest("AuthenticatePlain", Locale.US);
     }
 
     @Test
     public void testAuthenticatePlainITALY() throws Exception {
+        system.addUser("delegate", "123456");
+        system.createMailbox(new MailboxPath(MailboxConstants.USER_NAMESPACE, "delegate", "delegate"));
+        system.createMailbox(new MailboxPath(MailboxConstants.USER_NAMESPACE, "imapuser", "imapuser"));
         scriptTest("AuthenticatePlain", Locale.ITALY);
     }
 
     @Test
     public void testAuthenticatePlainKOREA() throws Exception {
+        system.addUser("delegate", "123456");
+        system.createMailbox(new MailboxPath(MailboxConstants.USER_NAMESPACE, "delegate", "delegate"));
+        system.createMailbox(new MailboxPath(MailboxConstants.USER_NAMESPACE, "imapuser", "imapuser"));
         scriptTest("AuthenticatePlain", Locale.KOREA);
     }
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AuthenticatePlain.test
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AuthenticatePlain.test b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AuthenticatePlain.test
index 8408748..50fa93d 100644
--- a/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AuthenticatePlain.test
+++ b/mpt/impl/imap-mailbox/core/src/main/resources/org/apache/james/imap/scripts/AuthenticatePlain.test
@@ -18,39 +18,78 @@
 ################################################################
 
 # Correct user with correct password can authenticate with delegation part missing
-C: abcd AUTHENTICATE "PLAIN" {24+}
+C: 0001 AUTHENTICATE "PLAIN" {24+}
 # imapuser\0password
 C: aW1hcHVzZXIAcGFzc3dvcmQ=
-S: abcd OK AUTHENTICATE completed.
+S: 0001 OK AUTHENTICATE completed.
+
+# Ensure we are imapuser
+C: 0002 SELECT imapuser
+SUB {
+S: \* FLAGS .*
+S: \* .* EXISTS
+S: \* .* RECENT
+S: \* OK \[UIDVALIDITY .*\] UIDs valid
+S: \* OK \[PERMANENTFLAGS .*\] Limited
+S: \* OK \[HIGHESTMODSEQ .*\] Highest
+S: \* OK \[UIDNEXT .*\] Predicted next UID
+}
+S: 0002 OK \[READ-WRITE\] SELECT completed\.
 
 REINIT
 
 # Correct user with correct password can authenticate with empty delegation part
-C: abcd AUTHENTICATE "PLAIN" {24+}
+C: 0003 AUTHENTICATE "PLAIN" {24+}
 # \0imapuser\0password
 C: AGltYXB1c2VyAHBhc3N3b3Jk
-S: abcd OK AUTHENTICATE completed.
+S: 0003 OK AUTHENTICATE completed.
+
+# Ensure we are imapuser
+C: 0004 SELECT imapuser
+SUB {
+S: \* FLAGS .*
+S: \* .* EXISTS
+S: \* .* RECENT
+S: \* OK \[UIDVALIDITY .*\] UIDs valid
+S: \* OK \[PERMANENTFLAGS .*\] Limited
+S: \* OK \[HIGHESTMODSEQ .*\] Highest
+S: \* OK \[UIDNEXT .*\] Predicted next UID
+}
+S: 0004 OK \[READ-WRITE\] SELECT completed\.
 
 REINIT
 
 # Correct user with bad password cannot authenticate
-C: abcd AUTHENTICATE "PLAIN" {28+}
+C: 0005 AUTHENTICATE "PLAIN" {28+}
 # \0imapuser\0badpassword
 C: AGltYXB1c2VyAGJhZHBhc3N3b3Jk
-S: abcd NO AUTHENTICATE failed. Authentication failed.
+S: 0005 NO AUTHENTICATE failed. Authentication failed.
 
 REINIT
 
 # Bad user cannot authenticate
-C: abcd AUTHENTICATE "PLAIN" {24+}
+C: 0006 AUTHENTICATE "PLAIN" {24+}
 # \0baduser\0password
 C: AGJhZHVzZXIAcGFzc3dvcmQ=
-S: abcd NO AUTHENTICATE failed. Authentication failed.
+S: 0006 NO AUTHENTICATE failed. Authentication failed.
 
 REINIT
 
 # Correct user with correct password can authenticate with any delegation part
-C: abcd AUTHENTICATE "PLAIN" {36+}
+C: 0007 AUTHENTICATE "PLAIN" {36+}
 # delegate\0imapuser\0password
 C: ZGVsZWdhdGUAaW1hcHVzZXIAcGFzc3dvcmQ=
-S: abcd OK AUTHENTICATE completed.
+S: 0007 OK AUTHENTICATE completed.
+
+# Ensure we are delegate
+C: 0008 SELECT delegate
+SUB {
+S: \* FLAGS .*
+S: \* .* EXISTS
+S: \* .* RECENT
+S: \* OK \[UIDVALIDITY .*\] UIDs valid
+S: \* OK \[PERMANENTFLAGS .*\] Limited
+S: \* OK \[HIGHESTMODSEQ .*\] Highest
+S: \* OK \[UIDNEXT .*\] Predicted next UID
+}
+S: 0008 OK \[READ-WRITE\] SELECT completed\.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
index 5989b02..a745032 100644
--- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
@@ -53,8 +53,6 @@ import org.apache.james.mailbox.inmemory.InMemoryMailboxSessionMapperFactory;
 import org.apache.james.mailbox.inmemory.InMemoryMessageId;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.store.FakeAuthenticator;
-import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.extractor.DefaultTextExtractor;
@@ -77,12 +75,7 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
     private EmbeddedElasticSearch embeddedElasticSearch;
     private Path tempDirectory;
     private StoreMailboxManager mailboxManager;
-    private FakeAuthenticator userManager;
 
-    public boolean addUser(String user, String password) throws Exception {
-        userManager.addUser(user, password);
-        return true;
-    }
 
     @Override
     public void beforeTest() throws Exception {
@@ -111,7 +104,6 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
             MailboxMappingFactory.getMappingContent()
         );
 
-        userManager = new FakeAuthenticator();
         InMemoryMailboxSessionMapperFactory factory = new InMemoryMailboxSessionMapperFactory();
         InMemoryMessageId.Factory messageIdFactory = new InMemoryMessageId.Factory();
 
@@ -125,7 +117,7 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
-        mailboxManager = new StoreMailboxManager(factory, userManager, FakeAuthorizator.defaultReject(), aclResolver, groupMembershipResolver, messageParser,
+        mailboxManager = new StoreMailboxManager(factory, authenticator, authorizator, aclResolver, groupMembershipResolver, messageParser,
             messageIdFactory, MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE);
         mailboxManager.setMessageSearchIndex(searchIndex);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java b/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
index 4feb238..232d609 100644
--- a/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
+++ b/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
@@ -40,8 +40,6 @@ import org.apache.james.mailbox.hbase.HBaseMailboxSessionMapperFactory;
 import org.apache.james.mailbox.hbase.mail.HBaseModSeqProvider;
 import org.apache.james.mailbox.hbase.mail.HBaseUidProvider;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.store.FakeAuthenticator;
-import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -66,7 +64,6 @@ public class HBaseHostSystem extends JamesImapHostSystem {
     public static Boolean useMiniCluster = true;
     
     private final HBaseMailboxManager mailboxManager;
-    private final FakeAuthenticator userManager;
     private MiniHBaseCluster hbaseCluster;
     private final Configuration conf;
 
@@ -91,9 +88,6 @@ public class HBaseHostSystem extends JamesImapHostSystem {
             conf = HBaseConfiguration.create();
         }
 
-        userManager = new FakeAuthenticator();
-        FakeAuthorizator authorizator = FakeAuthorizator.defaultReject();
-
         final HBaseModSeqProvider modSeqProvider = new HBaseModSeqProvider(conf);
         final HBaseUidProvider uidProvider = new HBaseUidProvider(conf);
         DefaultMessageId.Factory messageIdFactory = new DefaultMessageId.Factory();
@@ -103,7 +97,7 @@ public class HBaseHostSystem extends JamesImapHostSystem {
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
         
-        mailboxManager = new HBaseMailboxManager(mapperFactory, userManager, authorizator, aclResolver, groupMembershipResolver, 
+        mailboxManager = new HBaseMailboxManager(mapperFactory, authenticator, authorizator, aclResolver, groupMembershipResolver,
                 messageParser, messageIdFactory);
         mailboxManager.init();
 
@@ -133,11 +127,6 @@ public class HBaseHostSystem extends JamesImapHostSystem {
         mailboxManager.logout(session, false);
     }
 
-    public boolean addUser(String user, String password) {
-        userManager.addUser(user, password);
-        return true;
-    }
-
     public final void resetUserMetaData() throws Exception {
         File dir = new File(META_DATA_DIRECTORY);
         if (dir.exists()) {

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMailboxTest.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMailboxTest.java b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMailboxTest.java
index 8cb3eee..7c909d0 100644
--- a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMailboxTest.java
+++ b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/InMemoryMailboxTest.java
@@ -19,6 +19,7 @@
 package org.apache.james.mpt.imapmailbox.inmemory;
 
 import org.apache.james.mpt.imapmailbox.AbstractMailboxTest;
+import org.apache.james.mpt.imapmailbox.suite.AuthenticatePlain;
 import org.apache.james.mpt.imapmailbox.suite.AuthenticatedState;
 import org.apache.james.mpt.imapmailbox.suite.ConcurrentSessions;
 import org.apache.james.mpt.imapmailbox.suite.Events;
@@ -48,6 +49,7 @@ import org.junit.runners.Suite.SuiteClasses;
 @GuiceModules({ InMemoryMailboxTestModule.class })
 @SuiteClasses({
     AuthenticatedState.class,
+    AuthenticatePlain.class,
     ConcurrentSessions.class,
     Events.class,
     Expunge.class,

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java
index a628031..466b368 100644
--- a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java
+++ b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java
@@ -35,8 +35,6 @@ import org.apache.james.mailbox.inmemory.quota.InMemoryPerUserMaxQuotaManager;
 import org.apache.james.mailbox.model.MailboxConstants;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
-import org.apache.james.mailbox.store.FakeAuthenticator;
-import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.event.AsynchronousEventDelivery;
@@ -56,7 +54,6 @@ public class InMemoryEventAsynchronousHostSystem extends JamesImapHostSystem {
     private static final ImapFeatures SUPPORTED_FEATURES = ImapFeatures.of(Feature.NAMESPACE_SUPPORT);
 
     private StoreMailboxManager mailboxManager;
-    private FakeAuthenticator userManager;
 
     public static JamesImapHostSystem build() throws Exception {
         return new InMemoryEventAsynchronousHostSystem();
@@ -65,11 +62,6 @@ public class InMemoryEventAsynchronousHostSystem extends JamesImapHostSystem {
     private InMemoryEventAsynchronousHostSystem() throws MailboxException {
         initFields();
     }
-    
-    public boolean addUser(String user, String password) throws Exception {
-        userManager.addUser(user, password);
-        return true;
-    }
 
     @Override
     protected void resetData() throws Exception {
@@ -77,13 +69,12 @@ public class InMemoryEventAsynchronousHostSystem extends JamesImapHostSystem {
     }
     
     private void initFields() throws MailboxException {
-        userManager = new FakeAuthenticator();
         InMemoryMailboxSessionMapperFactory factory = new InMemoryMailboxSessionMapperFactory();
         MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
-        mailboxManager = new StoreMailboxManager(factory, userManager, FakeAuthorizator.defaultReject(), aclResolver, groupMembershipResolver, messageParser,
+        mailboxManager = new StoreMailboxManager(factory, authenticator, authorizator, aclResolver, groupMembershipResolver, messageParser,
                 new InMemoryMessageId.Factory(), MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE);
         QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(factory);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
index de3a4f7..97b4e17 100644
--- a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
+++ b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
@@ -35,8 +35,6 @@ import org.apache.james.mailbox.inmemory.quota.InMemoryCurrentQuotaManager;
 import org.apache.james.mailbox.inmemory.quota.InMemoryPerUserMaxQuotaManager;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.quota.QuotaRootResolver;
-import org.apache.james.mailbox.store.FakeAuthenticator;
-import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -58,7 +56,6 @@ public class InMemoryHostSystem extends JamesImapHostSystem {
         Feature.ANNOTATION_SUPPORT);
 
     private InMemoryMailboxManager mailboxManager;
-    private FakeAuthenticator userManager;
 
     public static JamesImapHostSystem build() throws Exception {
         return new InMemoryHostSystem();
@@ -67,11 +64,6 @@ public class InMemoryHostSystem extends JamesImapHostSystem {
     private InMemoryHostSystem() throws MailboxException {
         initFields();
     }
-    
-    public boolean addUser(String user, String password) throws Exception {
-        userManager.addUser(user, password);
-        return true;
-    }
 
     @Override
     protected void resetData() throws Exception {
@@ -79,13 +71,12 @@ public class InMemoryHostSystem extends JamesImapHostSystem {
     }
     
     private void initFields() throws MailboxException {
-        userManager = new FakeAuthenticator();
         MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
         InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory();
-        mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, userManager, FakeAuthorizator.defaultReject(),
+        mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, authenticator, authorizator,
                 new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver, messageParser, new InMemoryMessageId.Factory());
         QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mailboxManager.getMapperFactory());
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java b/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
index 51f5fe2..a52e696 100644
--- a/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
+++ b/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
@@ -40,8 +40,6 @@ import org.apache.james.mailbox.jcr.JCRUtils;
 import org.apache.james.mailbox.jcr.mail.JCRModSeqProvider;
 import org.apache.james.mailbox.jcr.mail.JCRUidProvider;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.store.FakeAuthenticator;
-import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -54,14 +52,13 @@ import org.apache.james.mpt.imapmailbox.MailboxCreationDelegate;
 import org.slf4j.LoggerFactory;
 import org.xml.sax.InputSource;
 
-public class JCRHostSystem extends JamesImapHostSystem{
+public class JCRHostSystem extends JamesImapHostSystem {
 
     public static JamesImapHostSystem build() throws Exception {
         return new JCRHostSystem();
     }
     
     private final JCRMailboxManager mailboxManager;
-    private final FakeAuthenticator userManager; 
 
     private static final String JACKRABBIT_HOME = "target/jackrabbit";
     public static final String META_DATA_DIRECTORY = "target/user-meta-data";
@@ -84,8 +81,7 @@ public class JCRHostSystem extends JamesImapHostSystem{
             
             // Register imap cnd file
             JCRUtils.registerCnd(repository, workspace, user, pass);
-            
-            userManager = new FakeAuthenticator();
+
             JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
             JCRUidProvider uidProvider = new JCRUidProvider(locker, sessionRepos);
             JCRModSeqProvider modSeqProvider = new JCRModSeqProvider(locker, sessionRepos);
@@ -95,7 +91,7 @@ public class JCRHostSystem extends JamesImapHostSystem{
             GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
             MessageParser messageParser = new MessageParser();
 
-            mailboxManager = new JCRMailboxManager(mf, userManager, FakeAuthorizator.defaultReject(), aclResolver, groupMembershipResolver, messageParser,
+            mailboxManager = new JCRMailboxManager(mf, authenticator, authorizator, aclResolver, groupMembershipResolver, messageParser,
                     new DefaultMessageId.Factory());
             mailboxManager.init();
 
@@ -118,12 +114,6 @@ public class JCRHostSystem extends JamesImapHostSystem{
         }
     }
 
-   
-    public boolean addUser(String user, String password) {
-        userManager.addUser(user, password);
-        return true;
-    }
-
     public void resetData() throws Exception {
         resetUserMetaData();
       

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
index 7c6f930..1fdc752 100644
--- a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
+++ b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
@@ -42,8 +42,6 @@ import org.apache.james.mailbox.jpa.mail.JPAModSeqProvider;
 import org.apache.james.mailbox.jpa.mail.JPAUidProvider;
 import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.store.FakeAuthenticator;
-import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -67,13 +65,9 @@ public class JPAHostSystem extends JamesImapHostSystem {
     }
     
     private final OpenJPAMailboxManager mailboxManager;
-    private final FakeAuthenticator userManager; 
-    private final EntityManagerFactory entityManagerFactory;
 
     public JPAHostSystem() throws Exception {
-        
-        userManager = new FakeAuthenticator();
-        entityManagerFactory = JPA_TEST_CLUSTER.getEntityManagerFactory();
+        EntityManagerFactory entityManagerFactory = JPA_TEST_CLUSTER.getEntityManagerFactory();
         JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
         JPAUidProvider uidProvider = new JPAUidProvider(locker, entityManagerFactory);
         JPAModSeqProvider modSeqProvider = new JPAModSeqProvider(locker, entityManagerFactory);
@@ -83,7 +77,7 @@ public class JPAHostSystem extends JamesImapHostSystem {
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
-        mailboxManager = new OpenJPAMailboxManager(mf, userManager, FakeAuthorizator.defaultReject(), locker, false, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
+        mailboxManager = new OpenJPAMailboxManager(mf, authenticator, authorizator, locker, false, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
         mailboxManager.init();
 
         SubscriptionManager subscriptionManager = new JPASubscriptionManager(mf);
@@ -103,11 +97,6 @@ public class JPAHostSystem extends JamesImapHostSystem {
 
     }
 
-    public boolean addUser(String user, String password) {
-        userManager.addUser(user, password);
-        return true;
-    }
-
     public void resetData() throws Exception {
         resetUserMetaData();
         MailboxSession session = mailboxManager.createSystemSession("test", LoggerFactory.getLogger("TestLog"));

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
index caa3b08..c354e82 100644
--- a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
@@ -48,8 +48,6 @@ import org.apache.james.mailbox.jpa.openjpa.OpenJPAMailboxManager;
 import org.apache.james.mailbox.lucene.search.LuceneMessageSearchIndex;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MessageId;
-import org.apache.james.mailbox.store.FakeAuthenticator;
-import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
 import org.apache.james.mailbox.store.mail.model.impl.MessageParser;
@@ -73,13 +71,6 @@ public class LuceneSearchHostSystem extends JamesImapHostSystem {
 
     private File tempFile;
     private OpenJPAMailboxManager mailboxManager;
-    private FakeAuthenticator userManager;
-    private EntityManagerFactory entityManagerFactory;
-
-    public boolean addUser(String user, String password) throws Exception {
-        userManager.addUser(user, password);
-        return true;
-    }
 
     @Override
     public void beforeTest() throws Exception {
@@ -109,8 +100,7 @@ public class LuceneSearchHostSystem extends JamesImapHostSystem {
     }
 
     private void initFields() {
-        userManager = new FakeAuthenticator();
-        entityManagerFactory = JPA_TEST_CLUSTER.getEntityManagerFactory();
+        EntityManagerFactory entityManagerFactory = JPA_TEST_CLUSTER.getEntityManagerFactory();
         JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
         JPAUidProvider uidProvider = new JPAUidProvider(locker, entityManagerFactory);
         JPAModSeqProvider modSeqProvider = new JPAModSeqProvider(locker, entityManagerFactory);
@@ -125,7 +115,7 @@ public class LuceneSearchHostSystem extends JamesImapHostSystem {
             GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
             MessageParser messageParser = new MessageParser();
 
-            mailboxManager = new OpenJPAMailboxManager(factory, userManager, FakeAuthorizator.defaultReject(), locker, false, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
+            mailboxManager = new OpenJPAMailboxManager(factory, authenticator, authorizator, locker, false, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
 
             LuceneMessageSearchIndex searchIndex = new LuceneMessageSearchIndex(factory, mailboxIdFactory, fsDirectory, messageIdFactory, mailboxManager);
             searchIndex.setEnableSuffixMatch(true);

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
index dcb73c4..4915fe4 100644
--- a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
+++ b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
@@ -33,8 +33,6 @@ import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.maildir.MaildirMailboxSessionMapperFactory;
 import org.apache.james.mailbox.maildir.MaildirStore;
 import org.apache.james.mailbox.model.MailboxPath;
-import org.apache.james.mailbox.store.FakeAuthenticator;
-import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.StoreMailboxManager;
 import org.apache.james.mailbox.store.StoreSubscriptionManager;
@@ -54,25 +52,22 @@ public class MaildirHostSystem extends JamesImapHostSystem {
     private static final ImapFeatures SUPPORTED_FEATURES = ImapFeatures.of();
     
     private final StoreMailboxManager mailboxManager;
-    private final FakeAuthenticator userManager;
-    private final MaildirMailboxSessionMapperFactory mailboxSessionMapperFactory;
-    
+
     public static JamesImapHostSystem build() throws Exception {
         return new MaildirHostSystem();
     }
     
     public MaildirHostSystem() throws MailboxException {
-        userManager = new FakeAuthenticator();
         JVMMailboxPathLocker locker = new JVMMailboxPathLocker();
         MaildirStore store = new MaildirStore(MAILDIR_HOME + "/%user", locker);
-        mailboxSessionMapperFactory = new MaildirMailboxSessionMapperFactory(store);
+        MaildirMailboxSessionMapperFactory mailboxSessionMapperFactory = new MaildirMailboxSessionMapperFactory(store);
         StoreSubscriptionManager sm = new StoreSubscriptionManager(mailboxSessionMapperFactory);
         
         MailboxACLResolver aclResolver = new UnionMailboxACLResolver();
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
-        mailboxManager = new StoreMailboxManager(mailboxSessionMapperFactory, userManager, FakeAuthorizator.defaultReject(), locker, aclResolver,
+        mailboxManager = new StoreMailboxManager(mailboxSessionMapperFactory, authenticator, authorizator, locker, aclResolver,
                 groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
         mailboxManager.init();
 
@@ -87,11 +82,7 @@ public class MaildirHostSystem extends JamesImapHostSystem {
                 defaultImapProcessorFactory);
         (new File(MAILDIR_HOME)).mkdirs();
     }
-    
-    public boolean addUser(String user, String password) throws Exception {
-        userManager.addUser(user, password);
-        return true;
-    }
+
 
     @Override
     public void resetData() throws Exception {

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/mpt/pom.xml
----------------------------------------------------------------------
diff --git a/mpt/pom.xml b/mpt/pom.xml
index 4815d79..2fcd3a7 100644
--- a/mpt/pom.xml
+++ b/mpt/pom.xml
@@ -294,6 +294,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.james</groupId>
+                <artifactId>james-server-mailbox-adapter</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.james</groupId>
                 <artifactId>james-server-data-memory</artifactId>
                 <version>${project.version}</version>
             </dependency>

http://git-wip-us.apache.org/repos/asf/james-project/blob/3f26ba0c/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java
----------------------------------------------------------------------
diff --git a/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java b/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java
index 02d48b8..003d669 100644
--- a/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java
+++ b/server/data/data-memory/src/main/java/org/apache/james/user/memory/MemoryUsersRepository.java
@@ -52,6 +52,10 @@ public class MemoryUsersRepository extends AbstractUsersRepository {
         this.supportVirtualHosting = supportVirtualHosting;
     }
 
+    public void clear() {
+        userByName.clear();
+    }
+
     @Override
     public boolean supportVirtualHosting() {
         return supportVirtualHosting;


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


[08/12] james-project git commit: JAMES-1930 Refactor Auth plain parsing

Posted by ad...@apache.org.
JAMES-1930 Refactor Auth plain parsing


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

Branch: refs/heads/master
Commit: 0175e31af0aae97f8ec56ddcf0c6eaeb010b302e
Parents: 200460c
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Feb 9 11:28:53 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Feb 14 11:29:30 2017 +0100

----------------------------------------------------------------------
 .../imap/processor/AuthenticateProcessor.java   | 67 ++++++++++++++++----
 1 file changed, 54 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/0175e31a/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
----------------------------------------------------------------------
diff --git a/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java b/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
index 12eeb98..1abc69d 100644
--- a/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
+++ b/protocols/imap/src/main/java/org/apache/james/imap/processor/AuthenticateProcessor.java
@@ -37,6 +37,8 @@ import org.apache.james.imap.message.request.IRAuthenticateRequest;
 import org.apache.james.imap.message.response.AuthenticateResponse;
 import org.apache.james.mailbox.MailboxManager;
 
+import com.google.common.base.Optional;
+
 /**
  * Processor which handles the AUTHENTICATE command. Only authtype of PLAIN is supported ATM.
  * 
@@ -101,16 +103,21 @@ public class AuthenticateProcessor extends AbstractAuthProcessor<AuthenticateReq
      * @param responder
      */
     protected void doPlainAuth(String initialClientResponse, ImapSession session, String tag, ImapCommand command, Responder responder) {
-        String pass = null;
-        String user = null;
+        AuthPlainAttempt authPlainAttempt = parseDelegationAttempt(initialClientResponse);
+        // Authenticate user
+        doAuth(authPlainAttempt.getAuthenticationId(), authPlainAttempt.getPassword(), session, tag, command, responder, HumanReadableText.AUTHENTICATION_FAILED);
+    }
+
+    private AuthPlainAttempt parseDelegationAttempt(String initialClientResponse) {
+        String token2;
         try {
 
             String userpass = new String(Base64.decodeBase64(initialClientResponse));
             StringTokenizer authTokenizer = new StringTokenizer(userpass, "\0");
-            String authorize_id = authTokenizer.nextToken();  // Authorization Identity
-            user = authTokenizer.nextToken();                 // Authentication Identity
+            String token1 = authTokenizer.nextToken();  // Authorization Identity
+            token2 = authTokenizer.nextToken();                 // Authentication Identity
             try {
-                pass = authTokenizer.nextToken();             // Password
+                return delegation(token1, token2, authTokenizer.nextToken());
             } catch (java.util.NoSuchElementException _) {
                 // If we got here, this is what happened.  RFC 2595
                 // says that "the client may leave the authorization
@@ -127,19 +134,17 @@ public class AuthenticateProcessor extends AbstractAuthProcessor<AuthenticateReq
                 // elements, leading to the exception we just
                 // caught.  So we need to move the user to the
                 // password, and the authorize_id to the user.
-                pass = user;
-                user = authorize_id;
-            }   
-
-            authTokenizer = null;
+                return noDelegation(token1, token2);
+            } finally {
+                authTokenizer = null;
+            }
         } catch (Exception e) {
             // Ignored - this exception in parsing will be dealt
             // with in the if clause below
+            return noDelegation(null, null);
         }
-        // Authenticate user
-        doAuth(user, pass, session, tag, command, responder, HumanReadableText.AUTHENTICATION_FAILED);
     }
-    
+
     /**
      * @see org.apache.james.imap.processor.CapabilityImplementingProcessor
      * #getImplementedCapabilities(org.apache.james.imap.api.process.ImapSession)
@@ -156,4 +161,40 @@ public class AuthenticateProcessor extends AbstractAuthProcessor<AuthenticateReq
         return Collections.unmodifiableList(caps);
     }
 
+    private static AuthPlainAttempt delegation(String authorizeId, String authenticationId, String password) {
+        return new AuthPlainAttempt(Optional.of(authorizeId), authenticationId, password);
+    }
+
+    private static AuthPlainAttempt noDelegation(String authenticationId, String password) {
+        return new AuthPlainAttempt(Optional.<String>absent(), authenticationId, password);
+    }
+
+    private static class AuthPlainAttempt {
+        private final Optional<String> authorizeId;
+        private final String authenticationId;
+        private final String password;
+
+        private AuthPlainAttempt(Optional<String> authorizeId, String authenticationId, String password) {
+            this.authorizeId = authorizeId;
+            this.authenticationId = authenticationId;
+            this.password = password;
+        }
+
+        public boolean isDelegation() {
+            return authorizeId.isPresent();
+        }
+
+        public Optional<String> getAuthorizeId() {
+            return authorizeId;
+        }
+
+        public String getAuthenticationId() {
+            return authenticationId;
+        }
+
+        public String getPassword() {
+            return password;
+        }
+    }
+
 }


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


[04/12] james-project git commit: JAMES-1930 Authenticator should not mimic backend failure into login failure

Posted by ad...@apache.org.
JAMES-1930 Authenticator should not mimic backend failure into login failure


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

Branch: refs/heads/master
Commit: bf28358271b21f742a5a8188f909d95332dd174c
Parents: 2bf11b0
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Feb 9 15:00:06 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Feb 14 11:29:29 2017 +0100

----------------------------------------------------------------------
 .../james/mailbox/store/Authenticator.java      |  4 +-
 .../mailbox/store/StoreMailboxManager.java      |  2 +-
 .../store/UserRepositoryAuthenticator.java      | 24 ++----
 .../store/UserRepositoryAuthenticatorTest.java  | 82 ++++++++++++++++++++
 4 files changed, 92 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/bf283582/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authenticator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authenticator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authenticator.java
index 71e6eb5..f0587b3 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authenticator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authenticator.java
@@ -19,6 +19,8 @@
 
 package org.apache.james.mailbox.store;
 
+import org.apache.james.mailbox.exception.MailboxException;
+
 /**
  * Authenticates user credentials.
  */
@@ -32,5 +34,5 @@ public interface Authenticator {
      * @return true when the user is authentic,
      * false otherwise
      */
-    boolean isAuthentic(String userid, CharSequence passwd);
+    boolean isAuthentic(String userid, CharSequence passwd) throws MailboxException;
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/bf283582/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 110e08d..0175215 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -409,7 +409,7 @@ public class StoreMailboxManager implements MailboxManager {
      * @param passwd the password
      * @return success true if login success false otherwise
      */
-    private boolean login(String userid, String passwd) {
+    private boolean login(String userid, String passwd) throws MailboxException {
         return authenticator.isAuthentic(userid, passwd);
     }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/bf283582/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticator.java
----------------------------------------------------------------------
diff --git a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticator.java b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticator.java
index 6d6f4b3..31de75c 100644
--- a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticator.java
+++ b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticator.java
@@ -21,42 +21,30 @@ package org.apache.james.adapter.mailbox.store;
 
 import javax.inject.Inject;
 
-import org.apache.james.lifecycle.api.LogEnabled;
+import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.Authenticator;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
-import org.slf4j.Logger;
 
 /**
  * Authenticator which use an UsersRepository to check if the user and password
  * match
  */
-public class UserRepositoryAuthenticator implements Authenticator, LogEnabled {
+public class UserRepositoryAuthenticator implements Authenticator {
 
-    private UsersRepository repos;
-    private Logger log;
+    private final UsersRepository repos;
 
     @Inject
-    public void setUsersRepository(UsersRepository repos) {
+    public UserRepositoryAuthenticator(UsersRepository repos) {
         this.repos = repos;
     }
 
-    /**
-     * @see
-     * org.apache.james.mailbox.store.Authenticator#isAuthentic(java.lang.String
-     * , java.lang.CharSequence)
-     */
-    public boolean isAuthentic(String userid, CharSequence passwd) {
+    public boolean isAuthentic(String userid, CharSequence passwd) throws MailboxException {
         try {
             return repos.test(userid, passwd.toString());
         } catch (UsersRepositoryException e) {
-            log.info("Unable to access UsersRepository", e);
+            throw new MailboxException("Unable to access UsersRepository", e);
         }
-        return false;
-    }
-
-    public void setLog(Logger log) {
-        this.log = log;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/bf283582/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticatorTest.java
----------------------------------------------------------------------
diff --git a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticatorTest.java b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticatorTest.java
new file mode 100644
index 0000000..48c8333
--- /dev/null
+++ b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthenticatorTest.java
@@ -0,0 +1,82 @@
+/****************************************************************
+ * 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.adapter.mailbox.store;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.user.api.UsersRepository;
+import org.apache.james.user.api.UsersRepositoryException;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+public class UserRepositoryAuthenticatorTest {
+
+    public static final String PASSWORD = "password";
+    public static final String USER = "user";
+    public static final String BAD_PASSWORD = "badPassword";
+    public static final String BAD_USER = "badUser";
+    private UsersRepository usersRepository;
+    private UserRepositoryAuthenticator testee;
+
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
+    @Before
+    public void setUp() throws Exception {
+        usersRepository = mock(UsersRepository.class);
+        testee = new UserRepositoryAuthenticator(usersRepository);
+    }
+
+    @Test
+    public void isAuthenticShouldReturnTrueWhenGoodLoginPassword() throws Exception {
+        when(usersRepository.test(USER, PASSWORD)).thenReturn(true);
+
+        assertThat(testee.isAuthentic(USER, PASSWORD)).isTrue();
+    }
+
+    @Test
+    public void isAuthenticShouldReturnFalseWhenWrongPassword() throws Exception {
+        when(usersRepository.test(USER, BAD_PASSWORD)).thenReturn(false);
+
+        assertThat(testee.isAuthentic(USER, BAD_PASSWORD)).isFalse();
+    }
+
+    @Test
+    public void isAuthenticShouldReturnFalseWhenBadUser() throws Exception {
+        when(usersRepository.test(USER, BAD_PASSWORD)).thenReturn(false);
+
+        assertThat(testee.isAuthentic(BAD_USER, BAD_PASSWORD)).isFalse();
+    }
+
+    @Test
+    public void isAuthenticShouldFailOnUserRepositoryFailure() throws Exception {
+        when(usersRepository.test(USER, PASSWORD)).thenThrow(new UsersRepositoryException(""));
+
+        expectedException.expect(MailboxException.class);
+
+        testee.isAuthentic(USER, PASSWORD);
+    }
+
+}


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


[05/12] james-project git commit: JAMES-1930 Improve Exception handling for Authorizer

Posted by ad...@apache.org.
JAMES-1930 Improve Exception handling for Authorizer


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

Branch: refs/heads/master
Commit: 2bf11b032f678f46733c25b64e4eb3114688bb09
Parents: 8b52a2b
Author: Benoit Tellier <bt...@linagora.com>
Authored: Thu Feb 9 10:46:23 2017 +0700
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Feb 14 11:29:29 2017 +0100

----------------------------------------------------------------------
 .../mailbox/exception/NotAdminException.java    | 23 ++++++++
 .../exception/UserDoesNotExistException.java    | 34 +++++++++++
 .../ElasticSearchIntegrationTest.java           |  2 +-
 .../search/LuceneMessageSearchIndexTest.java    |  2 +-
 .../inmemory/InMemoryMailboxManagerTest.java    |  2 +-
 .../MessageIdManagerTestSystemProvider.java     |  2 +-
 .../manager/InMemoryIntegrationResources.java   |  2 +-
 .../search/SimpleMessageSearchIndexTest.java    |  2 +-
 .../james/mailbox/spring/NoAuthorizator.java    |  4 +-
 .../james/mailbox/store/Authorizator.java       | 10 +++-
 .../james/mailbox/store/FakeAuthorizator.java   | 32 +++++++---
 .../mailbox/store/StoreMailboxManager.java      | 19 ++++--
 .../mailbox/store/StoreMailboxManagerTest.java  | 34 +++++++++--
 .../james/mailbox/copier/MailboxCopierTest.java |  4 +-
 .../cassandra/host/CassandraHostSystem.java     |  2 +-
 .../host/ElasticSearchHostSystem.java           |  2 +-
 .../imapmailbox/hbase/host/HBaseHostSystem.java |  2 +-
 .../InMemoryEventAsynchronousHostSystem.java    |  2 +-
 .../inmemory/host/InMemoryHostSystem.java       |  2 +-
 .../mpt/imapmailbox/jcr/host/JCRHostSystem.java |  2 +-
 .../mpt/imapmailbox/jpa/host/JPAHostSystem.java |  2 +-
 .../host/LuceneSearchHostSystem.java            |  2 +-
 .../maildir/host/MaildirHostSystem.java         |  2 +-
 .../store/UserRepositoryAuthorizator.java       | 24 ++++----
 .../adapter/mailbox/MailboxManagementTest.java  |  2 +-
 .../store/UserRepositoryAuthorizatorTest.java   | 62 ++++++++++++++++----
 .../apache/james/pop3server/POP3ServerTest.java |  5 +-
 .../routes/UserMailboxesRoutesTest.java         |  3 +-
 28 files changed, 218 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/api/src/main/java/org/apache/james/mailbox/exception/NotAdminException.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/exception/NotAdminException.java b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/NotAdminException.java
new file mode 100644
index 0000000..a60f360
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/NotAdminException.java
@@ -0,0 +1,23 @@
+/****************************************************************
+ * 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.mailbox.exception;
+
+public class NotAdminException extends MailboxException {
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/api/src/main/java/org/apache/james/mailbox/exception/UserDoesNotExistException.java
----------------------------------------------------------------------
diff --git a/mailbox/api/src/main/java/org/apache/james/mailbox/exception/UserDoesNotExistException.java b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/UserDoesNotExistException.java
new file mode 100644
index 0000000..0c5ddf2
--- /dev/null
+++ b/mailbox/api/src/main/java/org/apache/james/mailbox/exception/UserDoesNotExistException.java
@@ -0,0 +1,34 @@
+/****************************************************************
+ * 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.mailbox.exception;
+
+public class UserDoesNotExistException extends MailboxException {
+
+    private final String name;
+
+    public UserDoesNotExistException(String name) {
+        super("User " + name + "does not exist");
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+}

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
----------------------------------------------------------------------
diff --git a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
index e8e07d5..c406419 100644
--- a/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
+++ b/mailbox/elasticsearch/src/test/java/org/apache/james/mailbox/elasticsearch/ElasticSearchIntegrationTest.java
@@ -94,7 +94,7 @@ public class ElasticSearchIntegrationTest extends AbstractMessageSearchIndexTest
         storeMailboxManager = new InMemoryMailboxManager(
             mapperFactory,
             new FakeAuthenticator(),
-            new FakeAuthorizator(),
+            FakeAuthorizator.defaultReject(),
             new JVMMailboxPathLocker(),
             new UnionMailboxACLResolver(),
             new SimpleGroupMembershipResolver(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
index 210bd98..d76ef4e 100644
--- a/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
+++ b/mailbox/lucene/src/test/java/org/apache/james/mailbox/lucene/search/LuceneMessageSearchIndexTest.java
@@ -48,7 +48,7 @@ public class LuceneMessageSearchIndexTest extends AbstractMessageSearchIndexTest
         storeMailboxManager = new InMemoryMailboxManager(
             mapperFactory,
             new FakeAuthenticator(),
-            new FakeAuthorizator(),
+            FakeAuthorizator.defaultReject(),
             new JVMMailboxPathLocker(),
             new UnionMailboxACLResolver(),
             new SimpleGroupMembershipResolver(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java
index f6bb97c..885d4e1 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/InMemoryMailboxManagerTest.java
@@ -52,7 +52,7 @@ public class InMemoryMailboxManagerTest {
 
             InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory();
             MessageId.Factory messageIdFactory = new InMemoryMessageId.Factory();
-            InMemoryMailboxManager mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, new FakeAuthenticator(), new FakeAuthorizator(),
+            InMemoryMailboxManager mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, new FakeAuthenticator(), FakeAuthorizator.defaultReject(),
                     aclResolver, groupMembershipResolver, messageParser, messageIdFactory, LIMIT_ANNOTATIONS, LIMIT_ANNOTATION_SIZE);
 
             try {

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MessageIdManagerTestSystemProvider.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MessageIdManagerTestSystemProvider.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MessageIdManagerTestSystemProvider.java
index cd54d43..8b27c6a 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MessageIdManagerTestSystemProvider.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/MessageIdManagerTestSystemProvider.java
@@ -57,7 +57,7 @@ public class MessageIdManagerTestSystemProvider {
         InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory();
         MessageId.Factory messageIdFactory = new InMemoryMessageId.Factory();
         FakeAuthenticator authenticator = new FakeAuthenticator();
-        FakeAuthorizator authorizator = new FakeAuthorizator();
+        FakeAuthorizator authorizator = FakeAuthorizator.defaultReject();
         authenticator.addUser(MailboxManagerFixture.USER, PASSWORD);
         authenticator.addUser(MailboxManagerFixture.OTHER_USER, PASSWORD);
         InMemoryMailboxManager mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, authenticator, authorizator,

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
----------------------------------------------------------------------
diff --git a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
index cc7d22d..240b5a7 100644
--- a/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
+++ b/mailbox/memory/src/test/java/org/apache/james/mailbox/inmemory/manager/InMemoryIntegrationResources.java
@@ -59,7 +59,7 @@ public class InMemoryIntegrationResources implements IntegrationResources {
         final StoreMailboxManager manager = new InMemoryMailboxManager(
             mailboxSessionMapperFactory,
             fakeAuthenticator,
-            new FakeAuthorizator(),
+            FakeAuthorizator.defaultReject(),
             new NoMailboxPathLocker(),
             new UnionMailboxACLResolver(),
             groupMembershipResolver,

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
----------------------------------------------------------------------
diff --git a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
index 694778b..b23beb9 100644
--- a/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
+++ b/mailbox/scanning-search/src/test/java/org/apache/james/mailbox/store/search/SimpleMessageSearchIndexTest.java
@@ -45,7 +45,7 @@ public class SimpleMessageSearchIndexTest extends AbstractMessageSearchIndexTest
         storeMailboxManager = new InMemoryMailboxManager(
             mapperFactory,
             new FakeAuthenticator(),
-            new FakeAuthorizator(),
+            FakeAuthorizator.defaultReject(),
             new JVMMailboxPathLocker(),
             new UnionMailboxACLResolver(),
             new SimpleGroupMembershipResolver(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java
----------------------------------------------------------------------
diff --git a/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java b/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java
index 88500c3..f98e331 100644
--- a/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java
+++ b/mailbox/spring/src/main/java/org/apache/james/mailbox/spring/NoAuthorizator.java
@@ -23,8 +23,8 @@ import org.apache.james.mailbox.store.Authorizator;
 public class NoAuthorizator implements Authorizator {
 
     @Override
-    public boolean canLoginAsOtherUser(String userId, String otherUserId) {
-        return false;
+    public AuthorizationState canLoginAsOtherUser(String userId, String otherUserId) {
+        return AuthorizationState.NOT_ADMIN;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java
index 4710e34..2b01aa8 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/Authorizator.java
@@ -19,11 +19,19 @@
 
 package org.apache.james.mailbox.store;
 
+import org.apache.james.mailbox.exception.MailboxException;
+
 /**
  * Authenticates user credentials.
  */
 public interface Authorizator {
 
-    boolean canLoginAsOtherUser(String userId, String otherUserId);
+    enum AuthorizationState {
+        ALLOWED,
+        NOT_ADMIN,
+        UNKNOWN_USER
+    }
+
+    AuthorizationState canLoginAsOtherUser(String userId, String otherUserId) throws MailboxException;
 }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java
index 4e15ed7..948ed55 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/FakeAuthorizator.java
@@ -18,22 +18,38 @@
  ****************************************************************/
 package org.apache.james.mailbox.store;
 
-import java.util.List;
-
-import com.google.common.collect.ImmutableList;
+import com.google.common.base.Optional;
 
 public class FakeAuthorizator implements Authorizator {
 
-    private List<String> adminIds;
+    public static FakeAuthorizator defaultReject() {
+        return new FakeAuthorizator(Optional.<String>absent(), Optional.<String>absent());
+    }
+
+    public static FakeAuthorizator forUserAndAdmin(String admin, String user) {
+        return new FakeAuthorizator(Optional.of(admin), Optional.of(user));
+    }
 
-    public FakeAuthorizator(String... adminIds) {
-        this.adminIds = ImmutableList.copyOf(adminIds);
+    private final Optional<String> adminId;
+    private final Optional<String> delegatedUserId;
 
+    private FakeAuthorizator(Optional<String> adminId, Optional<String> userId) {
+        this.adminId = adminId;
+        this.delegatedUserId = userId;
     }
 
     @Override
-    public boolean canLoginAsOtherUser(String userId, String otherUserId) {
-        return adminIds.contains(userId);
+    public AuthorizationState canLoginAsOtherUser(String userId, String otherUserId) {
+        if (!adminId.isPresent() || !this.delegatedUserId.isPresent()) {
+            return AuthorizationState.NOT_ADMIN;
+        }
+        if (!adminId.get().equals(userId)) {
+            return AuthorizationState.NOT_ADMIN;
+        }
+        if (!otherUserId.equals(this.delegatedUserId.get())) {
+            return AuthorizationState.UNKNOWN_USER;
+        }
+        return AuthorizationState.ALLOWED;
     }
 }
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
index 705fd8d..110e08d 100644
--- a/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
+++ b/mailbox/store/src/main/java/org/apache/james/mailbox/store/StoreMailboxManager.java
@@ -47,6 +47,8 @@ import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxExistsException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
+import org.apache.james.mailbox.exception.NotAdminException;
+import org.apache.james.mailbox.exception.UserDoesNotExistException;
 import org.apache.james.mailbox.model.MailboxACL;
 import org.apache.james.mailbox.model.MailboxAnnotation;
 import org.apache.james.mailbox.model.MailboxAnnotationKey;
@@ -421,12 +423,21 @@ public class StoreMailboxManager implements MailboxManager {
     }
 
     @Override
-    public MailboxSession loginAsOtherUser(String adminUserid, String passwd, String otherUserId, Logger log) throws BadCredentialsException, MailboxException {
-        if (login(adminUserid, passwd) && authorizator.canLoginAsOtherUser(adminUserid, otherUserId)) {
-            return createSystemSession(otherUserId, log);
-        } else {
+    public MailboxSession loginAsOtherUser(String adminUserid, String passwd, String otherUserId, Logger log) throws MailboxException {
+        if (! login(adminUserid, passwd)) {
             throw new BadCredentialsException();
         }
+        Authorizator.AuthorizationState authorizationState = authorizator.canLoginAsOtherUser(adminUserid, otherUserId);
+        switch (authorizationState) {
+            case ALLOWED:
+                return createSystemSession(otherUserId, log);
+            case NOT_ADMIN:
+                throw new NotAdminException();
+            case UNKNOWN_USER:
+                throw new UserDoesNotExistException(otherUserId);
+            default:
+                throw new RuntimeException("Unknown AuthorizationState " + authorizationState);
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
----------------------------------------------------------------------
diff --git a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
index fd4fae2..c55d7cc 100644
--- a/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
+++ b/mailbox/store/src/test/java/org/apache/james/mailbox/store/StoreMailboxManagerTest.java
@@ -30,6 +30,8 @@ import org.apache.james.mailbox.acl.UnionMailboxACLResolver;
 import org.apache.james.mailbox.exception.BadCredentialsException;
 import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.exception.MailboxNotFoundException;
+import org.apache.james.mailbox.exception.NotAdminException;
+import org.apache.james.mailbox.exception.UserDoesNotExistException;
 import org.apache.james.mailbox.mock.MockMailboxSession;
 import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
@@ -54,6 +56,8 @@ public class StoreMailboxManagerTest {
     private static final MailboxId MAILBOX_ID = TestId.of(123);
     private static final Logger LOGGER = LoggerFactory.getLogger(StoreMailboxManagerTest.class); 
     private static final int UID_VALIDITY = 42;
+    public static final String UNKNOWN_USER = "otheruser";
+    public static final String BAD_PASSWORD = "badpassword";
     private StoreMailboxManager storeMailboxManager;
     private MailboxMapper mockedMailboxMapper;
     private MailboxSession mockedMailboxSession;
@@ -69,7 +73,7 @@ public class StoreMailboxManagerTest {
         FakeAuthenticator authenticator = new FakeAuthenticator();
         authenticator.addUser(CURRENT_USER, CURRENT_USER_PASSWORD);
         authenticator.addUser(ADMIN, ADMIN_PASSWORD);
-        storeMailboxManager = new StoreMailboxManager(mockedMapperFactory, authenticator, new FakeAuthorizator(ADMIN),
+        storeMailboxManager = new StoreMailboxManager(mockedMapperFactory, authenticator, FakeAuthorizator.forUserAndAdmin(ADMIN, CURRENT_USER),
                 new JVMMailboxPathLocker(), new UnionMailboxACLResolver(), new SimpleGroupMembershipResolver(), 
                 new MessageParser(), messageIdFactory);
         storeMailboxManager.init();
@@ -186,17 +190,37 @@ public class StoreMailboxManagerTest {
 
     @Test(expected = BadCredentialsException.class)
     public void loginShouldThrowWhenBadPassword() throws Exception {
-        storeMailboxManager.login(CURRENT_USER, "badpassword", LOGGER);
+        storeMailboxManager.login(CURRENT_USER, BAD_PASSWORD, LOGGER);
     }
 
     @Test(expected = BadCredentialsException.class)
     public void loginAsOtherUserShouldNotCreateUserSessionWhenAdminWithBadPassword() throws Exception {
-        storeMailboxManager.loginAsOtherUser(ADMIN, "badpassword", CURRENT_USER, LOGGER);
+        storeMailboxManager.loginAsOtherUser(ADMIN, BAD_PASSWORD, CURRENT_USER, LOGGER);
     }
 
-    @Test(expected = BadCredentialsException.class)
+    @Test(expected = NotAdminException.class)
     public void loginAsOtherUserShouldNotCreateUserSessionWhenNotAdmin() throws Exception {
-        storeMailboxManager.loginAsOtherUser(CURRENT_USER, CURRENT_USER_PASSWORD, "otheruser", LOGGER);
+        storeMailboxManager.loginAsOtherUser(CURRENT_USER, CURRENT_USER_PASSWORD, UNKNOWN_USER, LOGGER);
+    }
+
+    @Test(expected = BadCredentialsException.class)
+    public void loginAsOtherUserShouldThrowBadCredentialWhenBadPasswordAndNotAdminUser() throws Exception {
+        storeMailboxManager.loginAsOtherUser(CURRENT_USER, BAD_PASSWORD, CURRENT_USER, LOGGER);
+    }
+
+    @Test(expected = BadCredentialsException.class)
+    public void loginAsOtherUserShouldThrowBadCredentialWhenBadPasswordNotAdminUserAndUnknownUser() throws Exception {
+        storeMailboxManager.loginAsOtherUser(CURRENT_USER, BAD_PASSWORD, UNKNOWN_USER, LOGGER);
+    }
+
+    @Test(expected = BadCredentialsException.class)
+    public void loginAsOtherUserShouldThrowBadCredentialsWhenBadPasswordAndUserDoesNotExists() throws Exception {
+        storeMailboxManager.loginAsOtherUser(ADMIN, BAD_PASSWORD, UNKNOWN_USER, LOGGER);
+    }
+
+    @Test(expected = UserDoesNotExistException.class)
+    public void loginAsOtherUserShouldNotCreateUserSessionWhenDelegatedUserDoesNotExist() throws Exception {
+        storeMailboxManager.loginAsOtherUser(ADMIN, ADMIN_PASSWORD, UNKNOWN_USER, LOGGER);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java
----------------------------------------------------------------------
diff --git a/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java b/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java
index c0bdbc1..45db8bf 100644
--- a/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java
+++ b/mailbox/tool/src/test/java/org/apache/james/mailbox/copier/MailboxCopierTest.java
@@ -169,8 +169,8 @@ public class MailboxCopierTest {
             },
             new Authorizator() {
                 @Override
-                public boolean canLoginAsOtherUser(String userId, String otherUserId) {
-                    return false;
+                public AuthorizationState canLoginAsOtherUser(String userId, String otherUserId) {
+                    return AuthorizationState.NOT_ADMIN;
                 }
             },
             aclResolver,

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
index 8e76403..e466f2d 100644
--- a/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
+++ b/mpt/impl/imap-mailbox/cassandra/src/test/java/org/apache/james/mpt/imapmailbox/cassandra/host/CassandraHostSystem.java
@@ -92,7 +92,7 @@ public class CassandraHostSystem extends JamesImapHostSystem {
             new CassandraAnnotationModule());
         cassandraClusterSingleton = CassandraCluster.create(mailboxModule);
         userManager = new FakeAuthenticator();
-        authorizator = new FakeAuthorizator();
+        authorizator = FakeAuthorizator.defaultReject();
         com.datastax.driver.core.Session session = cassandraClusterSingleton.getConf();
         CassandraModSeqProvider modSeqProvider = new CassandraModSeqProvider(session);
         CassandraUidProvider uidProvider = new CassandraUidProvider(session);

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
index 6caa31c..5989b02 100644
--- a/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/elasticsearch/src/test/java/org/apache/james/mpt/imapmailbox/elasticsearch/host/ElasticSearchHostSystem.java
@@ -125,7 +125,7 @@ public class ElasticSearchHostSystem extends JamesImapHostSystem {
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
-        mailboxManager = new StoreMailboxManager(factory, userManager, new FakeAuthorizator(), aclResolver, groupMembershipResolver, messageParser,
+        mailboxManager = new StoreMailboxManager(factory, userManager, FakeAuthorizator.defaultReject(), aclResolver, groupMembershipResolver, messageParser,
             messageIdFactory, MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE);
         mailboxManager.setMessageSearchIndex(searchIndex);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java b/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
index 7ed820e..4feb238 100644
--- a/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
+++ b/mpt/impl/imap-mailbox/hbase/src/test/java/org/apache/james/mpt/imapmailbox/hbase/host/HBaseHostSystem.java
@@ -92,7 +92,7 @@ public class HBaseHostSystem extends JamesImapHostSystem {
         }
 
         userManager = new FakeAuthenticator();
-        FakeAuthorizator authorizator = new FakeAuthorizator();
+        FakeAuthorizator authorizator = FakeAuthorizator.defaultReject();
 
         final HBaseModSeqProvider modSeqProvider = new HBaseModSeqProvider(conf);
         final HBaseUidProvider uidProvider = new HBaseUidProvider(conf);

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java
index 0f24491..a628031 100644
--- a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java
+++ b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryEventAsynchronousHostSystem.java
@@ -83,7 +83,7 @@ public class InMemoryEventAsynchronousHostSystem extends JamesImapHostSystem {
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
-        mailboxManager = new StoreMailboxManager(factory, userManager, new FakeAuthorizator(), aclResolver, groupMembershipResolver, messageParser, 
+        mailboxManager = new StoreMailboxManager(factory, userManager, FakeAuthorizator.defaultReject(), aclResolver, groupMembershipResolver, messageParser,
                 new InMemoryMessageId.Factory(), MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE);
         QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(factory);
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
index 5cb7729..de3a4f7 100644
--- a/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
+++ b/mpt/impl/imap-mailbox/inmemory/src/test/java/org/apache/james/mpt/imapmailbox/inmemory/host/InMemoryHostSystem.java
@@ -85,7 +85,7 @@ public class InMemoryHostSystem extends JamesImapHostSystem {
         MessageParser messageParser = new MessageParser();
 
         InMemoryMailboxSessionMapperFactory mailboxSessionMapperFactory = new InMemoryMailboxSessionMapperFactory();
-        mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, userManager, new FakeAuthorizator(),
+        mailboxManager = new InMemoryMailboxManager(mailboxSessionMapperFactory, userManager, FakeAuthorizator.defaultReject(),
                 new JVMMailboxPathLocker(), aclResolver, groupMembershipResolver, messageParser, new InMemoryMessageId.Factory());
         QuotaRootResolver quotaRootResolver = new DefaultQuotaRootResolver(mailboxManager.getMapperFactory());
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java b/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
index edca72d..51f5fe2 100644
--- a/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
+++ b/mpt/impl/imap-mailbox/jcr/src/test/java/org/apache/james/mpt/imapmailbox/jcr/host/JCRHostSystem.java
@@ -95,7 +95,7 @@ public class JCRHostSystem extends JamesImapHostSystem{
             GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
             MessageParser messageParser = new MessageParser();
 
-            mailboxManager = new JCRMailboxManager(mf, userManager, new FakeAuthorizator(), aclResolver, groupMembershipResolver, messageParser,
+            mailboxManager = new JCRMailboxManager(mf, userManager, FakeAuthorizator.defaultReject(), aclResolver, groupMembershipResolver, messageParser,
                     new DefaultMessageId.Factory());
             mailboxManager.init();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
index 37165bc..7c6f930 100644
--- a/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
+++ b/mpt/impl/imap-mailbox/jpa/src/test/java/org/apache/james/mpt/imapmailbox/jpa/host/JPAHostSystem.java
@@ -83,7 +83,7 @@ public class JPAHostSystem extends JamesImapHostSystem {
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
-        mailboxManager = new OpenJPAMailboxManager(mf, userManager, new FakeAuthorizator(), locker, false, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
+        mailboxManager = new OpenJPAMailboxManager(mf, userManager, FakeAuthorizator.defaultReject(), locker, false, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
         mailboxManager.init();
 
         SubscriptionManager subscriptionManager = new JPASubscriptionManager(mf);

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
index 10d8845..caa3b08 100644
--- a/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
+++ b/mpt/impl/imap-mailbox/lucenesearch/src/test/java/org/apache/james/mpt/imapmailbox/lucenesearch/host/LuceneSearchHostSystem.java
@@ -125,7 +125,7 @@ public class LuceneSearchHostSystem extends JamesImapHostSystem {
             GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
             MessageParser messageParser = new MessageParser();
 
-            mailboxManager = new OpenJPAMailboxManager(factory, userManager, new FakeAuthorizator(), locker, false, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
+            mailboxManager = new OpenJPAMailboxManager(factory, userManager, FakeAuthorizator.defaultReject(), locker, false, aclResolver, groupMembershipResolver, messageParser, messageIdFactory);
 
             LuceneMessageSearchIndex searchIndex = new LuceneMessageSearchIndex(factory, mailboxIdFactory, fsDirectory, messageIdFactory, mailboxManager);
             searchIndex.setEnableSuffixMatch(true);

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
index 9a97fdd..dcb73c4 100644
--- a/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
+++ b/mpt/impl/imap-mailbox/maildir/src/test/java/org/apache/james/mpt/imapmailbox/maildir/host/MaildirHostSystem.java
@@ -72,7 +72,7 @@ public class MaildirHostSystem extends JamesImapHostSystem {
         GroupMembershipResolver groupMembershipResolver = new SimpleGroupMembershipResolver();
         MessageParser messageParser = new MessageParser();
 
-        mailboxManager = new StoreMailboxManager(mailboxSessionMapperFactory, userManager, new FakeAuthorizator(), locker, aclResolver, 
+        mailboxManager = new StoreMailboxManager(mailboxSessionMapperFactory, userManager, FakeAuthorizator.defaultReject(), locker, aclResolver,
                 groupMembershipResolver, messageParser, new DefaultMessageId.Factory());
         mailboxManager.init();
 

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java
----------------------------------------------------------------------
diff --git a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java
index 494a499..cda4fa9 100644
--- a/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java
+++ b/server/container/mailbox-adapter/src/main/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizator.java
@@ -21,19 +21,17 @@ package org.apache.james.adapter.mailbox.store;
 
 import javax.inject.Inject;
 
-import org.apache.james.lifecycle.api.LogEnabled;
+import org.apache.james.mailbox.exception.MailboxException;
 import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
-import org.slf4j.Logger;
 
 /**
  * Authorizator which use an UsersRepository to check if the delegation is allowed
  */
-public class UserRepositoryAuthorizator implements Authorizator, LogEnabled {
+public class UserRepositoryAuthorizator implements Authorizator {
 
     private final UsersRepository repos;
-    private Logger log;
 
     @Inject
     public UserRepositoryAuthorizator(UsersRepository repos) {
@@ -41,18 +39,18 @@ public class UserRepositoryAuthorizator implements Authorizator, LogEnabled {
     }
 
     @Override
-    public boolean canLoginAsOtherUser(String userId, String otherUserId) {
+    public AuthorizationState canLoginAsOtherUser(String userId, String otherUserId) throws MailboxException {
         try {
-            return repos.isAdministrator(userId) && repos.contains(otherUserId);
+            if (!repos.isAdministrator(userId)) {
+                return AuthorizationState.NOT_ADMIN;
+            }
+            if (!repos.contains(otherUserId)) {
+                return AuthorizationState.UNKNOWN_USER;
+            }
+            return AuthorizationState.ALLOWED;
         } catch (UsersRepositoryException e) {
-            log.warn("Unable to access UsersRepository", e);
+            throw new MailboxException("Unable to access usersRepository", e);
         }
-        return false;
-    }
-
-    @Override
-    public void setLog(Logger log) {
-        this.log = log;
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
----------------------------------------------------------------------
diff --git a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
index dbcd8ac..4c4cc42 100644
--- a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
+++ b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/MailboxManagementTest.java
@@ -56,7 +56,7 @@ public class MailboxManagementTest {
         StoreMailboxManager mailboxManager = new StoreMailboxManager(
             inMemoryMapperFactory,
             new FakeAuthenticator(),
-            new FakeAuthorizator(),
+            FakeAuthorizator.defaultReject(),
             new JVMMailboxPathLocker(),
             new UnionMailboxACLResolver(),
             new SimpleGroupMembershipResolver(),

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java
----------------------------------------------------------------------
diff --git a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java
index ea94ba4..84e499e 100644
--- a/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java
+++ b/server/container/mailbox-adapter/src/test/java/org/apache/james/adapter/mailbox/store/UserRepositoryAuthorizatorTest.java
@@ -1,65 +1,101 @@
+/****************************************************************
+ * 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.adapter.mailbox.store;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import org.apache.james.mailbox.exception.MailboxException;
+import org.apache.james.mailbox.store.Authorizator;
 import org.apache.james.user.api.UsersRepository;
 import org.apache.james.user.api.UsersRepositoryException;
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.junit.rules.ExpectedException;
 
 public class UserRepositoryAuthorizatorTest {
     private static final String ADMIN = "admin";
     private static final String USER = "user";
-    private static final Logger LOGGER = LoggerFactory.getLogger(UserRepositoryAuthorizatorTest.class);
 
     private UsersRepository usersRepository;
     private UserRepositoryAuthorizator testee;
 
+    @Rule
+    public ExpectedException expectedException = ExpectedException.none();
+
     @Before
     public void setUp() throws Exception {
         usersRepository = mock(UsersRepository.class);
         testee = new UserRepositoryAuthorizator(usersRepository);
-        testee.setLog(LOGGER);
     }
 
     @Test
-    public void canLoginAsOtherUserShouldReturnFalseWhenIsAdministratorThrows() throws Exception {
+    public void canLoginAsOtherUserShouldThrowMailboxExceptionWhenIsAdministratorThrows() throws Exception {
         when(usersRepository.isAdministrator(ADMIN))
             .thenThrow(new UsersRepositoryException("expected error"));
-        
-        assertThat(testee.canLoginAsOtherUser(ADMIN, USER)).isFalse();
+
+        expectedException.expect(MailboxException.class);
+
+        testee.canLoginAsOtherUser(ADMIN, USER);
     }
 
     @Test
-    public void canLoginAsOtherUserShouldReturnFalseWhenIsAdministratorReturnFalse() throws Exception {
+    public void canLoginAsOtherUserShouldReturnNotAdminWhenNotAdminAndNoUser() throws Exception {
         when(usersRepository.isAdministrator(ADMIN))
             .thenReturn(false);
+        when(usersRepository.contains(USER))
+            .thenReturn(false);
         
-        assertThat(testee.canLoginAsOtherUser(ADMIN, USER)).isFalse();
+        assertThat(testee.canLoginAsOtherUser(ADMIN, USER)).isEqualTo(Authorizator.AuthorizationState.NOT_ADMIN);
+    }
+
+    @Test
+    public void canLoginAsOtherUserShouldReturnNotAdminWhenNotAdminAndUser() throws Exception {
+        when(usersRepository.isAdministrator(ADMIN))
+            .thenReturn(false);
+        when(usersRepository.contains(USER))
+            .thenReturn(true);
+
+        assertThat(testee.canLoginAsOtherUser(ADMIN, USER)).isEqualTo(Authorizator.AuthorizationState.NOT_ADMIN);
     }
 
     @Test
-    public void canLoginAsOtherUserShouldReturnFalseWhenUserIsNotInRepository() throws Exception {
+    public void canLoginAsOtherUserShouldReturnUnknownUserWhenUserIsNotInRepository() throws Exception {
         when(usersRepository.isAdministrator(ADMIN))
             .thenReturn(true);
         when(usersRepository.contains(USER))
             .thenReturn(false);
         
-        assertThat(testee.canLoginAsOtherUser(ADMIN, USER)).isFalse();
+        assertThat(testee.canLoginAsOtherUser(ADMIN, USER)).isEqualTo(Authorizator.AuthorizationState.UNKNOWN_USER);
     }
 
     @Test
-    public void canLoginAsOtherUserShouldReturnTrueWhenAdminAndUserIsInRepository() throws Exception {
+    public void canLoginAsOtherUserShouldReturnAllowedWhenAdminAndUserIsInRepository() throws Exception {
         when(usersRepository.isAdministrator(ADMIN))
             .thenReturn(true);
         when(usersRepository.contains(USER))
             .thenReturn(true);
         
-        assertThat(testee.canLoginAsOtherUser(ADMIN, USER)).isTrue();
+        assertThat(testee.canLoginAsOtherUser(ADMIN, USER)).isEqualTo(Authorizator.AuthorizationState.ALLOWED);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
index 1b6e453..46501c9 100644
--- a/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
+++ b/server/protocols/protocols-pop3/src/test/java/org/apache/james/pop3server/POP3ServerTest.java
@@ -740,10 +740,9 @@ public class POP3ServerTest {
                 }
             }
         }, new Authorizator() {
-
             @Override
-            public boolean canLoginAsOtherUser(String userId, String otherUserId) {
-                return false;
+            public AuthorizationState canLoginAsOtherUser(String userId, String otherUserId) {
+                return AuthorizationState.NOT_ADMIN;
             }
         }, aclResolver, groupMembershipResolver, messageParser, new DefaultMessageId.Factory(), MailboxConstants.DEFAULT_LIMIT_ANNOTATIONS_ON_MAILBOX, MailboxConstants.DEFAULT_LIMIT_ANNOTATION_SIZE);
         mailboxManager.init();

http://git-wip-us.apache.org/repos/asf/james-project/blob/2bf11b03/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
----------------------------------------------------------------------
diff --git a/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java b/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
index bd28679..8c9c2db 100644
--- a/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
+++ b/server/protocols/webadmin/src/test/java/org/apache/james/webadmin/routes/UserMailboxesRoutesTest.java
@@ -45,6 +45,7 @@ import org.apache.james.mailbox.model.MailboxId;
 import org.apache.james.mailbox.model.MailboxPath;
 import org.apache.james.mailbox.model.MailboxQuery;
 import org.apache.james.mailbox.model.MessageId;
+import org.apache.james.mailbox.store.FakeAuthorizator;
 import org.apache.james.mailbox.store.JVMMailboxPathLocker;
 import org.apache.james.mailbox.store.SimpleMailboxMetaData;
 import org.apache.james.mailbox.store.mail.model.DefaultMessageId;
@@ -103,7 +104,7 @@ public class UserMailboxesRoutesTest {
             MessageId.Factory messageIdFactory = new DefaultMessageId.Factory();
             InMemoryMailboxManager mailboxManager = new InMemoryMailboxManager(new InMemoryMailboxSessionMapperFactory(),
                 (userid, passwd) -> true,
-                (adminUserid, userid) -> false,
+                FakeAuthorizator.defaultReject(),
                 new JVMMailboxPathLocker(),
                 new UnionMailboxACLResolver(),
                 new SimpleGroupMembershipResolver(),


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


[07/12] james-project git commit: JAMES-1930 Introduce MPT REINIT command

Posted by ad...@apache.org.
JAMES-1930 Introduce MPT REINIT command


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

Branch: refs/heads/master
Commit: bdf89328fcfae95853a20c477422fca70cc3216d
Parents: bf28358
Author: Raphael Ouazana <ra...@linagora.com>
Authored: Thu Feb 9 17:43:55 2017 +0100
Committer: Antoine Duprat <ad...@linagora.com>
Committed: Tue Feb 14 11:29:30 2017 +0100

----------------------------------------------------------------------
 .../java/org/apache/james/mpt/api/Session.java  |  7 ++++++
 .../protocol/FileProtocolSessionBuilder.java    |  3 +++
 .../james/mpt/protocol/ProtocolSession.java     | 25 +++++++++++++++++++-
 .../mpt/protocol/ProtocolSessionBuilder.java    |  2 ++
 .../james/mpt/session/ExternalSession.java      |  5 ++++
 .../james/mpt/host/JamesImapHostSystem.java     |  4 ++++
 .../james/mpt/host/ManageSieveSession.java      |  4 ++++
 7 files changed, 49 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/james-project/blob/bdf89328/mpt/core/src/main/java/org/apache/james/mpt/api/Session.java
----------------------------------------------------------------------
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/api/Session.java b/mpt/core/src/main/java/org/apache/james/mpt/api/Session.java
index 9dd9919..170b365 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/api/Session.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/api/Session.java
@@ -47,6 +47,13 @@ public interface Session {
     void start() throws Exception;
 
     /**
+     * Reopens the session to reinitialize the server state
+     * 
+     * @throws Exception
+     */
+    void restart() throws Exception;
+
+    /**
      * Closes the session.
      * 
      * @throws Exception

http://git-wip-us.apache.org/repos/asf/james-project/blob/bdf89328/mpt/core/src/main/java/org/apache/james/mpt/protocol/FileProtocolSessionBuilder.java
----------------------------------------------------------------------
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/protocol/FileProtocolSessionBuilder.java b/mpt/core/src/main/java/org/apache/james/mpt/protocol/FileProtocolSessionBuilder.java
index 5dea7c8..3648a11 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/protocol/FileProtocolSessionBuilder.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/protocol/FileProtocolSessionBuilder.java
@@ -138,6 +138,9 @@ public class FileProtocolSessionBuilder extends ProtocolSessionBuilder {
                         throw new Exception("Unrecognized log level for " + next);
                     }
                 }
+                else if (next.startsWith(REINIT)) {
+                    session.REINIT(sessionNumber);
+                }
                 else if (next.startsWith(OPEN_UNORDERED_BLOCK_TAG)) {
                     List<String> unorderedLines = new ArrayList<String>(5);
                     next = reader.readLine();

http://git-wip-us.apache.org/repos/asf/james-project/blob/bdf89328/mpt/core/src/main/java/org/apache/james/mpt/protocol/ProtocolSession.java
----------------------------------------------------------------------
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/protocol/ProtocolSession.java b/mpt/core/src/main/java/org/apache/james/mpt/protocol/ProtocolSession.java
index 1afd1f4..5045acb 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/protocol/ProtocolSession.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/protocol/ProtocolSession.java
@@ -202,6 +202,11 @@ public class ProtocolSession implements ProtocolInteractor {
         testElements.add(new LogElement(level, message));
     }
 
+    public void REINIT(int sessionNumber) {
+        this.maxSessionNumber = Math.max(this.maxSessionNumber, sessionNumber);
+        testElements.add(new ReinitElement(sessionNumber));
+    }
+
     /**
      * A client request, which write the specified message to a Writer.
      */
@@ -467,7 +472,7 @@ public class ProtocolSession implements ProtocolInteractor {
         private final int sessionNumber;
 
         public ContinuationElement(int sessionNumber) throws Exception {
-            this.sessionNumber = sessionNumber < 0 ? 0 : sessionNumber;
+            this.sessionNumber = Math.max(0, sessionNumber);
         }
 
         public void testProtocol(Session[] sessions, boolean continueAfterFailure) throws Exception {
@@ -497,6 +502,24 @@ public class ProtocolSession implements ProtocolInteractor {
         }
     }
 
+    private class ReinitElement implements ProtocolElement {
+
+        private final int sessionNumber;
+
+        public ReinitElement(int sessionNumber) {
+            this.sessionNumber = Math.max(0, sessionNumber);
+        }
+
+        public void testProtocol(Session[] sessions, boolean continueAfterFailure) throws Exception {
+            Session session = sessions[sessionNumber];
+            session.restart();
+        }
+
+        public boolean isClient() {
+            return false;
+        }
+    }
+
     /**
      * Allow you to wait a given time at a given point of the test script
      */

http://git-wip-us.apache.org/repos/asf/james-project/blob/bdf89328/mpt/core/src/main/java/org/apache/james/mpt/protocol/ProtocolSessionBuilder.java
----------------------------------------------------------------------
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/protocol/ProtocolSessionBuilder.java b/mpt/core/src/main/java/org/apache/james/mpt/protocol/ProtocolSessionBuilder.java
index 2f4db62..657c64a 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/protocol/ProtocolSessionBuilder.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/protocol/ProtocolSessionBuilder.java
@@ -57,6 +57,8 @@ public class ProtocolSessionBuilder {
 
     public static final String SESSION_TAG = "SESSION:";
 
+    public static final String REINIT = "REINIT";
+
     private final Properties variables;
     
     public ProtocolSessionBuilder() {

http://git-wip-us.apache.org/repos/asf/james-project/blob/bdf89328/mpt/core/src/main/java/org/apache/james/mpt/session/ExternalSession.java
----------------------------------------------------------------------
diff --git a/mpt/core/src/main/java/org/apache/james/mpt/session/ExternalSession.java b/mpt/core/src/main/java/org/apache/james/mpt/session/ExternalSession.java
index 5eb1b74..9c65851 100644
--- a/mpt/core/src/main/java/org/apache/james/mpt/session/ExternalSession.java
+++ b/mpt/core/src/main/java/org/apache/james/mpt/session/ExternalSession.java
@@ -26,6 +26,7 @@ import java.nio.charset.Charset;
 import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.commons.lang.NotImplementedException;
 import org.apache.commons.lang.mutable.MutableInt;
 import org.apache.james.mpt.api.Monitor;
 import org.apache.james.mpt.api.Session;
@@ -151,6 +152,10 @@ public final class ExternalSession implements Session {
         }
     }
 
+    public void restart() throws Exception {
+        throw new NotImplementedException("Restart is not implemented for ExternalSession");
+    }
+
     public void stop() throws Exception {
         monitor.note("closing");
         socket.close();

http://git-wip-us.apache.org/repos/asf/james-project/blob/bdf89328/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java
----------------------------------------------------------------------
diff --git a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java
index 1251cff..e2be945 100644
--- a/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java
+++ b/mpt/impl/imap-mailbox/core/src/main/java/org/apache/james/mpt/host/JamesImapHostSystem.java
@@ -105,6 +105,10 @@ public abstract class JamesImapHostSystem implements ImapHostSystem {
             out.write("* OK IMAP4rev1 Server ready\r\n");
         }
 
+        public void restart() throws Exception {
+            session = new ImapSessionImpl(LoggerFactory.getLogger("sessionLog"));
+        }
+
         public void stop() throws Exception {
             session.deselect();
         }

http://git-wip-us.apache.org/repos/asf/james-project/blob/bdf89328/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/ManageSieveSession.java
----------------------------------------------------------------------
diff --git a/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/ManageSieveSession.java b/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/ManageSieveSession.java
index 05eaa1a..7c1f913 100644
--- a/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/ManageSieveSession.java
+++ b/mpt/impl/managesieve/core/src/main/java/org/apache/james/mpt/host/ManageSieveSession.java
@@ -81,6 +81,10 @@ public class ManageSieveSession implements Session {
     }
 
     @Override
+    public void restart() throws Exception {
+    }
+
+    @Override
     public void writeLine(String line) throws Exception {
         isReadLast = false;
         in.nextLine(line);


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