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 rd...@apache.org on 2008/12/31 16:14:17 UTC

svn commit: r730408 - in /james/protocols/imap/trunk: deployment/src/test/java/org/apache/james/imap/functional/jpa/ deployment/src/test/java/org/apache/james/imap/functional/jpa/user/ jpa/src/main/java/org/apache/james/imap/jpa/

Author: rdonkin
Date: Wed Dec 31 07:14:16 2008
New Revision: 730408

URL: http://svn.apache.org/viewvc?rev=730408&view=rev
Log:
Split authentication (which will usually be delegated to a container) from subscription management (which is particular requirements related to IMAP). Aim to add JPA support for subscription (but not authentication) persistence.

Added:
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/user/
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/user/InMemoryUserManager.java
      - copied, changed from r730402, james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/SimpleUserManager.java
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/user/User.java
      - copied, changed from r730402, james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/UserDetails.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/Authenticator.java
      - copied, changed from r730402, james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/UserManager.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/Subscriber.java
      - copied, changed from r730402, james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/UserManager.java
Removed:
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/SimpleUserManager.java
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/UserDetails.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/UserManager.java
Modified:
    james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/JPAHostSystem.java
    james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java

Modified: james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/JPAHostSystem.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/JPAHostSystem.java?rev=730408&r1=730407&r2=730408&view=diff
==============================================================================
--- james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/JPAHostSystem.java (original)
+++ james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/JPAHostSystem.java Wed Dec 31 07:14:16 2008
@@ -28,6 +28,7 @@
 import org.apache.james.imap.encode.main.DefaultImapEncoderFactory;
 import org.apache.james.imap.functional.ImapHostSystem;
 import org.apache.james.imap.functional.SimpleMailboxManagerProvider;
+import org.apache.james.imap.functional.jpa.user.InMemoryUserManager;
 import org.apache.james.imap.jpa.JPAMailboxManager;
 import org.apache.james.imap.main.DefaultImapDecoderFactory;
 import org.apache.james.imap.processor.main.DefaultImapProcessorFactory;
@@ -44,7 +45,7 @@
     }
     
     private final JPAMailboxManager mailboxManager;
-    private final SimpleUserManager userManager; 
+    private final InMemoryUserManager userManager; 
 
     public JPAHostSystem() throws Exception {
         HashMap<String, String> properties = new HashMap<String, String>();
@@ -55,9 +56,9 @@
         properties.put("openjpa.jdbc.SynchronizeMappings", "buildSchema(ForeignKeys=true)");
         properties.put("openjpa.MetaDataFactory", "jpa(Types=org.apache.james.imap.jpa.om.Header;org.apache.james.imap.jpa.om.Mailbox;org.apache.james.imap.jpa.om.Message)");
         
-        userManager = new SimpleUserManager();
+        userManager = new InMemoryUserManager();
         final EntityManagerFactory entityManagerFactory = OpenJPAPersistence.getEntityManagerFactory(properties);
-        mailboxManager = new JPAMailboxManager(userManager, entityManagerFactory);
+        mailboxManager = new JPAMailboxManager(userManager, userManager, entityManagerFactory);
         
         SimpleMailboxManagerProvider provider = new SimpleMailboxManagerProvider();
         final DefaultImapProcessorFactory defaultImapProcessorFactory = new DefaultImapProcessorFactory();

Copied: james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/user/InMemoryUserManager.java (from r730402, james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/SimpleUserManager.java)
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/user/InMemoryUserManager.java?p2=james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/user/InMemoryUserManager.java&p1=james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/SimpleUserManager.java&r1=730402&r2=730408&rev=730408&view=diff
==============================================================================
--- james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/SimpleUserManager.java (original)
+++ james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/user/InMemoryUserManager.java Wed Dec 31 07:14:16 2008
@@ -17,48 +17,52 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.imap.functional.jpa;
+package org.apache.james.imap.functional.jpa.user;
 
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.james.imap.jpa.UserManager;
+import org.apache.james.imap.jpa.Authenticator;
+import org.apache.james.imap.jpa.Subscriber;
 import org.apache.james.imap.mailbox.SubscriptionException;
 
-public class SimpleUserManager implements UserManager {
+/**
+ * Stores users in memory.
+ */
+public class InMemoryUserManager implements Authenticator, Subscriber {
 
-    private final Map users;
+    private final Map<String, User> users;
 
-    public SimpleUserManager() {
-        this.users = new HashMap();
+    public InMemoryUserManager() {
+        this.users = new HashMap<String, User>();
     }
 
-    public boolean isAuthentic(String userid, String passwd) {
-        UserDetails user = (UserDetails) users.get(userid);
+    public boolean isAuthentic(String userid, CharSequence password) {
+        User user = (User) users.get(userid);
         final boolean result;
         if (user == null) {
             result = false;
         } else {
-            result = (passwd.equals(user.getPassword()));
+            result = user.isPassword(password);
         }
         return result;
     }
 
     public void subscribe(String userid, String mailbox)
             throws SubscriptionException {
-        UserDetails user = (UserDetails) users.get(userid);
+        User user = (User) users.get(userid);
         if (user == null) {
-            user = new UserDetails(userid);
+            user = new User(userid);
             users.put(userid, user);
         }
         user.addSubscription(mailbox);
     }
 
-    public Collection subscriptions(String userid) throws SubscriptionException {
-        UserDetails user = (UserDetails) users.get(userid);
+    public Collection<String> subscriptions(String userid) throws SubscriptionException {
+        User user = (User) users.get(userid);
         if (user == null) {
-            user = new UserDetails(userid);
+            user = new User(userid);
             users.put(userid, user);
         }
         return user.getSubscriptions();
@@ -66,18 +70,18 @@
 
     public void unsubscribe(String userid, String mailbox)
             throws SubscriptionException {
-        UserDetails user = (UserDetails) users.get(userid);
+        User user = (User) users.get(userid);
         if (user == null) {
-            user = new UserDetails(userid);
+            user = new User(userid);
             users.put(userid, user);
         }
         user.removeSubscription(mailbox);
     }
 
-    public void addUser(String userid, String password) {
-        UserDetails user = (UserDetails) users.get(userid);
+    public void addUser(String userid, CharSequence password) {
+        User user = (User) users.get(userid);
         if (user == null) {
-            user = new UserDetails(userid);
+            user = new User(userid);
             users.put(userid, user);
         }
         user.setPassword(password);

Copied: james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/user/User.java (from r730402, james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/UserDetails.java)
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/user/User.java?p2=james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/user/User.java&p1=james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/UserDetails.java&r1=730402&r2=730408&rev=730408&view=diff
==============================================================================
--- james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/UserDetails.java (original)
+++ james/protocols/imap/trunk/deployment/src/test/java/org/apache/james/imap/functional/jpa/user/User.java Wed Dec 31 07:14:16 2008
@@ -17,33 +17,35 @@
  * under the License.                                           *
  ****************************************************************/
 
-package org.apache.james.imap.functional.jpa;
+package org.apache.james.imap.functional.jpa.user;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
+import java.util.Set;
 
-public class UserDetails {
+class User {
     private final String userName;
 
-    private String password;
+    private CharSequence password;
 
-    private final Collection subscriptions;
+    private final Set<String> subscriptions;
 
-    public UserDetails(final String userName) {
+    public User(final String userName) {
         this.userName = userName;
-        this.subscriptions = new HashSet();
+        this.subscriptions = new HashSet<String>();
     }
 
-    public String getPassword() {
-        return password;
+    public String getUserName() {
+        return userName;
     }
-
-    public void setPassword(String password) {
+    
+    public void setPassword(CharSequence password) {
         this.password = password;
     }
 
-    public Collection getSubscriptions() {
-        return subscriptions;
+    public Collection<String> getSubscriptions() {
+        return Collections.unmodifiableSet(subscriptions);
     }
 
     public void addSubscription(String subscription) {
@@ -53,4 +55,23 @@
     public void removeSubscription(String mailbox) {
         this.subscriptions.remove(mailbox);
     }
+
+    public boolean isPassword(CharSequence password) {
+        final boolean result;
+        if (password == null) {
+            result = this.password == null;
+        } else if (this.password == null) {
+            result = false;            
+        } else if (this.password.length() == password.length()) {
+            for (int i=0;i<password.length();i++) {
+                if (password.charAt(i) != this.password.charAt(i)) {
+                    return false;
+                }
+            }
+            result = true;
+        } else {
+            result = false;
+        }
+        return result;
+    }
 }

Copied: james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/Authenticator.java (from r730402, james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/UserManager.java)
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/Authenticator.java?p2=james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/Authenticator.java&p1=james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/UserManager.java&r1=730402&r2=730408&rev=730408&view=diff
==============================================================================
--- james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/UserManager.java (original)
+++ james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/Authenticator.java Wed Dec 31 07:14:16 2008
@@ -19,19 +19,17 @@
 
 package org.apache.james.imap.jpa;
 
-import java.util.Collection;
-
-import org.apache.james.imap.mailbox.SubscriptionException;
-
-public interface UserManager {
-
-    public boolean isAuthentic(String userid, String passwd);
-
-    public void subscribe(String user, String mailbox)
-            throws SubscriptionException;
-
-    public Collection subscriptions(String user) throws SubscriptionException;
-
-    public void unsubscribe(String user, String mailbox)
-            throws SubscriptionException;
+/**
+ * Authenticates user credentials.
+ */
+public interface Authenticator {
+
+    /**
+     * Is the given user authentic?
+     * @param userid not null
+     * @param passwd not null
+     * @return true when the user is authentic,
+     * false otherwise
+     */
+    public boolean isAuthentic(String userid, CharSequence passwd);
 }

Modified: james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java?rev=730408&r1=730407&r2=730408&view=diff
==============================================================================
--- james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java (original)
+++ james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/JPAMailboxManager.java Wed Dec 31 07:14:16 2008
@@ -55,13 +55,16 @@
 
     private final Map<String, JPAMailbox> mailboxes;
 
-    private final UserManager userManager;
+    private final Authenticator authenticator;
+    
+    private final Subscriber subscriber;
     
     private final EntityManagerFactory entityManagerFactory;
 
-    public JPAMailboxManager(final UserManager userManager, final EntityManagerFactory entityManagerFactory) {
+    public JPAMailboxManager(final Authenticator authenticator, final Subscriber subscriber, final EntityManagerFactory entityManagerFactory) {
         mailboxes = new HashMap<String, JPAMailbox>();
-        this.userManager = userManager;
+        this.authenticator = authenticator;
+        this.subscriber = subscriber;
         this.entityManagerFactory = entityManagerFactory;
     }
 
@@ -333,21 +336,21 @@
     }
 
     public boolean isAuthentic(String userid, String passwd) {
-        return userManager.isAuthentic(userid, passwd);
+        return authenticator.isAuthentic(userid, passwd);
     }
 
     public void subscribe(String user, String mailbox)
             throws SubscriptionException {
-        userManager.subscribe(user, mailbox);
+        subscriber.subscribe(user, mailbox);
     }
 
     public Collection subscriptions(String user) throws SubscriptionException {
-        return userManager.subscriptions(user);
+        return subscriber.subscriptions(user);
     }
 
     public void unsubscribe(String user, String mailbox)
             throws SubscriptionException {
-        userManager.unsubscribe(user, mailbox);
+        subscriber.unsubscribe(user, mailbox);
     }
 
 }

Copied: james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/Subscriber.java (from r730402, james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/UserManager.java)
URL: http://svn.apache.org/viewvc/james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/Subscriber.java?p2=james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/Subscriber.java&p1=james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/UserManager.java&r1=730402&r2=730408&rev=730408&view=diff
==============================================================================
--- james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/UserManager.java (original)
+++ james/protocols/imap/trunk/jpa/src/main/java/org/apache/james/imap/jpa/Subscriber.java Wed Dec 31 07:14:16 2008
@@ -23,15 +23,34 @@
 
 import org.apache.james.imap.mailbox.SubscriptionException;
 
-public interface UserManager {
-
-    public boolean isAuthentic(String userid, String passwd);
-
+/**
+ * Subscribes users.
+ */
+public interface Subscriber {
+    
+    /**
+     * Subscribes the named user to the given mailbox.
+     * @param user not null
+     * @param mailbox not null
+     * @throws SubscriptionException when subscription fails
+     */
     public void subscribe(String user, String mailbox)
             throws SubscriptionException;
 
-    public Collection subscriptions(String user) throws SubscriptionException;
-
+    /**
+     * Finds all subscriptions for the given user.
+     * @param user not null
+     * @return not null
+     * @throws SubscriptionException when subscriptions cannot be read
+     */
+    public Collection<String> subscriptions(String user) throws SubscriptionException;
+
+    /**
+     * Unsubscribes the given user from the given mailbox.
+     * @param user not null
+     * @param mailbox not null
+     * @throws SubscriptionException when subscriptions cannot be read
+     */
     public void unsubscribe(String user, String mailbox)
             throws SubscriptionException;
 }



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