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 be...@apache.org on 2006/06/20 10:40:04 UTC

svn commit: r415565 - in /james/server/trunk/src: conf/ java/org/apache/james/ java/org/apache/james/management/ test/org/apache/james/management/

Author: berndf
Date: Tue Jun 20 01:40:03 2006
New Revision: 415565

URL: http://svn.apache.org/viewvc?rev=415565&view=rev
Log:
- added UserManagement JMX MBean
- TODOs: merge common code from RemoteManagerHandler; allow change of repositories

Added:
    james/server/trunk/src/java/org/apache/james/management/
    james/server/trunk/src/java/org/apache/james/management/UserManagement.java
    james/server/trunk/src/java/org/apache/james/management/UserManagement.xinfo
    james/server/trunk/src/java/org/apache/james/management/UserManagementException.java
    james/server/trunk/src/java/org/apache/james/management/UserManagementMBean.java
    james/server/trunk/src/test/org/apache/james/management/
    james/server/trunk/src/test/org/apache/james/management/UserManagementTest.java
Modified:
    james/server/trunk/src/conf/james-assembly.xml
    james/server/trunk/src/java/org/apache/james/JamesMBean.java

Modified: james/server/trunk/src/conf/james-assembly.xml
URL: http://svn.apache.org/viewvc/james/server/trunk/src/conf/james-assembly.xml?rev=415565&r1=415564&r2=415565&view=diff
==============================================================================
--- james/server/trunk/src/conf/james-assembly.xml (original)
+++ james/server/trunk/src/conf/james-assembly.xml Tue Jun 20 01:40:03 2006
@@ -67,6 +67,11 @@
              role="org.apache.avalon.cornerstone.services.threads.ThreadManager" />
   </block>
 
+    <!-- The User Management block  -->
+  <block name="usermanagement" class="org.apache.james.management.UserManagement" >
+    <provide name="localusersrepository" role="org.apache.james.services.UsersRepository"/>
+  </block>
+
   <!-- POP3 Server -->
   <block name="pop3server" class="org.apache.james.pop3server.POP3Server" >
     <provide name="localusersrepository" role="org.apache.james.services.UsersRepository"/>

Modified: james/server/trunk/src/java/org/apache/james/JamesMBean.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/JamesMBean.java?rev=415565&r1=415564&r2=415565&view=diff
==============================================================================
--- james/server/trunk/src/java/org/apache/james/JamesMBean.java (original)
+++ james/server/trunk/src/java/org/apache/james/JamesMBean.java Tue Jun 20 01:40:03 2006
@@ -21,6 +21,7 @@
  * An interface to expose James management functionality through JMX.  At
  * the time of this writing, this interface is just an example.
  * 
+ * @deprecated this MBean will be replaced by UserManagementMBean
  * @phoenix:mx-topic name="MainJAMESServerManagement"
  */
 public interface JamesMBean {
@@ -28,6 +29,8 @@
     /**
      * Adds a user to this mail server.
      *
+     * @deprecated moved to UserManagementMBean 
+     * 
      * @phoenix:mx-operation
      * @phoenix:mx-description Add a new user
      *

Added: james/server/trunk/src/java/org/apache/james/management/UserManagement.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/management/UserManagement.java?rev=415565&view=auto
==============================================================================
--- james/server/trunk/src/java/org/apache/james/management/UserManagement.java (added)
+++ james/server/trunk/src/java/org/apache/james/management/UserManagement.java Tue Jun 20 01:40:03 2006
@@ -0,0 +1,152 @@
+/***********************************************************************
+ * Copyright (c) 2006 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.management;
+
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.james.services.UsersRepository;
+import org.apache.james.services.User;
+import org.apache.james.services.JamesUser;
+import org.apache.mailet.MailAddress;
+
+import javax.mail.internet.ParseException;
+import java.util.Iterator;
+import java.util.ArrayList;
+import java.util.List;
+
+public class UserManagement implements UserManagementMBean, Serviceable {
+
+    /**
+     * The administered UsersRepository
+     */
+    private UsersRepository users;
+
+    /**
+     * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
+     */
+    public void service( final ServiceManager componentManager )
+        throws ServiceException {
+        users = (UsersRepository) componentManager.lookup(UsersRepository.ROLE);
+        if (users == null) {
+            throw new ServiceException("","The user repository could not be found.");
+        }
+    }
+
+    private JamesUser getJamesUser(String userName) throws UserManagementException {
+        User baseuser = users.getUserByName(userName);
+        if (baseuser == null) throw new UserManagementException("user not found: " + userName);
+        if (! (baseuser instanceof JamesUser ) ) throw new UserManagementException("user is not of type JamesUser: " + userName);
+
+        return (JamesUser) baseuser;
+    }
+
+    public boolean addUser(String userName, String password) {
+        return users.addUser(userName, password);
+    }
+
+    public boolean deleteUser(String userName) {
+        if (!users.contains(userName)) return false;
+        users.removeUser(userName);
+        return true;
+    }
+
+    public boolean verifyExists(String userName) {
+        return users.contains(userName);
+    }
+
+    public long countUsers() {
+        return users.countUsers();
+    }
+
+    public String[] listAllUsers() {
+        List userNames = new ArrayList();
+        for (Iterator it = users.list(); it.hasNext();) {
+            userNames.add(it.next());
+        }
+        return (String[])userNames.toArray(new String[]{});
+    }
+
+    public boolean setPassword(String userName, String password) throws UserManagementException {
+        User user = users.getUserByName(userName);
+        if (user == null) throw new UserManagementException("user not found: " + userName);
+        return user.setPassword(password);
+    }
+
+    public boolean setAlias(String userName, String aliasUserName) throws UserManagementException {
+        JamesUser user = getJamesUser(userName);
+        JamesUser aliasUser = getJamesUser(aliasUserName);
+        if (aliasUser == null) return false;
+
+        boolean success = user.setAlias(aliasUserName);
+        user.setAliasing(true);
+        users.updateUser(user);
+        return success;
+    }
+
+    public boolean unsetAlias(String userName) throws UserManagementException {
+        JamesUser user = getJamesUser(userName);
+        if (!user.getAliasing()) return false;
+        
+        user.setAliasing(false);
+        users.updateUser(user);
+        return true;
+    }
+
+    public String getAlias(String userName) throws UserManagementException {
+        JamesUser user = getJamesUser(userName);
+        if (!user.getAliasing()) return null;
+        return user.getAlias();
+    }
+
+    public boolean setForwardAddress(String userName, String forwardEmailAddress) throws UserManagementException {
+        MailAddress forwardAddress;
+        try {
+             forwardAddress = new MailAddress(forwardEmailAddress);
+        } catch(ParseException pe) {
+            throw new UserManagementException(pe);
+        }
+
+        JamesUser user = getJamesUser(userName);
+        boolean success = user.setForwardingDestination(forwardAddress);
+        if (!success) return false;
+        
+        user.setForwarding(true);
+        users.updateUser(user);
+        return true;
+    }
+
+    public boolean unsetForwardAddress(String userName) throws UserManagementException {
+        JamesUser user = getJamesUser(userName);
+
+        if (!user.getForwarding()) return false;
+        
+        user.setForwarding(false);
+        users.updateUser(user);
+        return true;
+    }
+
+    public String getForwardAddress(String userName) throws UserManagementException {
+        JamesUser user = getJamesUser(userName);
+        if (!user.getForwarding()) return null;
+        return user.getForwardingDestination().toString();
+    }
+
+
+}

Added: james/server/trunk/src/java/org/apache/james/management/UserManagement.xinfo
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/management/UserManagement.xinfo?rev=415565&view=auto
==============================================================================
--- james/server/trunk/src/java/org/apache/james/management/UserManagement.xinfo (added)
+++ james/server/trunk/src/java/org/apache/james/management/UserManagement.xinfo Tue Jun 20 01:40:03 2006
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+
+<blockinfo>
+
+  <!-- section to describe block -->
+  <block>
+    <version>1.0</version>
+  </block>
+
+  <!-- interfaces that may be exported to manange this block -->
+  <management-access-points>
+    <service name="org.apache.james.management.UserManagementMBean"/>
+  </management-access-points>
+
+  <dependencies>
+    <dependency>
+      <service name="org.apache.james.services.UsersRepository" version="1.0"/>
+    </dependency>
+  </dependencies>
+</blockinfo>

Added: james/server/trunk/src/java/org/apache/james/management/UserManagementException.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/management/UserManagementException.java?rev=415565&view=auto
==============================================================================
--- james/server/trunk/src/java/org/apache/james/management/UserManagementException.java (added)
+++ james/server/trunk/src/java/org/apache/james/management/UserManagementException.java Tue Jun 20 01:40:03 2006
@@ -0,0 +1,39 @@
+/***********************************************************************
+ * Copyright (c) 2006 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.management;
+
+public class UserManagementException extends Exception {
+
+    public UserManagementException() {
+        super();
+    }
+
+    public UserManagementException(String message) {
+        super(message);
+    }
+
+    public UserManagementException(Exception e) {
+        super(e);
+    }
+    
+    public UserManagementException(String message, Exception e) {
+        super(message, e);
+    }
+
+}

Added: james/server/trunk/src/java/org/apache/james/management/UserManagementMBean.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/java/org/apache/james/management/UserManagementMBean.java?rev=415565&view=auto
==============================================================================
--- james/server/trunk/src/java/org/apache/james/management/UserManagementMBean.java (added)
+++ james/server/trunk/src/java/org/apache/james/management/UserManagementMBean.java Tue Jun 20 01:40:03 2006
@@ -0,0 +1,159 @@
+/***********************************************************************
+ * Copyright (c) 2006 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.management;
+
+/**
+ * Expose user account management functionality through JMX.
+ * 
+ * @phoenix:mx-topic name="UserAdministration"
+ */
+public interface UserManagementMBean {
+
+    /**
+     * Adds a user to this mail server.
+     *
+     * @phoenix:mx-operation
+     * @phoenix:mx-description Add a new user
+     *
+     * @param userName The name of the user being added
+     * @param password The password of the user being added
+     * @return if the operation was successfull
+     */
+    boolean addUser(String userName, String password);
+    
+    /**
+     * Deletes a user from this mail server.
+     *
+     * @phoenix:mx-operation
+     * @phoenix:mx-description Delete an existing user
+     *
+     * @param userName The name of the user being deleted
+     * @return if the operation was successfull
+     */
+    boolean deleteUser(String userName);
+
+    /**
+     * Check if a user exists with the given name.
+     *
+     * @phoenix:mx-operation
+     * @phoenix:mx-description Check for existing user name
+     *
+     * @param userName The name of the user
+     * @return TRUE, if the user exists
+     */
+    boolean verifyExists(String userName);
+
+    /**
+     * Total count of existing users
+     *
+     * @phoenix:mx-operation
+     * @phoenix:mx-description Total count of existing users
+     *
+     * @return Total count of existing users
+     */
+    long countUsers();
+
+    /**
+     * List the names of all users
+     *
+     * @phoenix:mx-operation
+     * @phoenix:mx-description List all existing users
+     *
+     * @return List of all user names
+     */
+    String[] listAllUsers();
+
+    /**
+     * Set a user's password
+     *
+     * @phoenix:mx-operation
+     * @phoenix:mx-description Set a user's password
+     *
+     * @param userName The name of the user whose password will be changed
+     * @param password The new password 
+     * @return if the user has been found and the password was changed successfully
+     */
+    boolean setPassword(String userName, String password) throws UserManagementException;
+    
+    /**
+     * Set a user's alias to whom all mail is forwarded to
+     *
+     * @phoenix:mx-operation
+     * @phoenix:mx-description Set a user's alias to whom all mail is forwarded to
+     *
+     * @param userName The name of the user whose alias is set
+     * @param aliasUserName The user becoming the new alias 
+     * @return if the user has been found and the password was changed successfully
+     */
+    boolean setAlias(String userName, String aliasUserName) throws UserManagementException;
+    
+    /**
+     * Removes a user's alias which terminates local mail forwarding
+     *
+     * @phoenix:mx-operation
+     * @phoenix:mx-description Removes a user's alias which terminates local mail forwarding
+     *
+     * @param userName The name of the user whose alias is unset
+     * @return if the user has been found and the alias was removed
+     */
+    boolean unsetAlias(String userName) throws UserManagementException;
+    
+    /**
+     * Retrieves the user's alias, if set
+     *
+     * @phoenix:mx-operation
+     * @phoenix:mx-description Retrieves the user's alias, if set
+     *
+     * @return User's alias, or NULL, if no alias is set
+     */
+    String getAlias(String userName) throws UserManagementException;
+
+    /**
+     * Set a user's forward email address to whom all mail is forwarded to
+     *
+     * @phoenix:mx-operation
+     * @phoenix:mx-description Set a user's forward email address to whom all mail is forwarded to
+     *
+     * @param userName The name of the user whose forward is set
+     * @param forwardEmailAddress The new forward email address  
+     * @return if the user has been found and the password was changed successfully
+     */
+    boolean setForwardAddress(String userName, String forwardEmailAddress) throws UserManagementException;
+    
+    /**
+     * Removes a user's forward email address which terminates remote mail forwarding
+     *
+     * @phoenix:mx-operation
+     * @phoenix:mx-description Removes a user's forward email address which terminates remote mail forwarding
+     *
+     * @param userName The name of the user whose forward is unset
+     * @return if the user has been found and the forward was removed
+     */
+    boolean unsetForwardAddress(String userName) throws UserManagementException;
+    
+    /**
+     * Retrieves the user's forward, if set
+     *
+     * @phoenix:mx-operation
+     * @phoenix:mx-description Retrieves the user's forward, if set
+     *
+     * @return User's forward email address, or NULL, if no forward is set
+     */
+    String getForwardAddress(String userName) throws UserManagementException;
+
+}

Added: james/server/trunk/src/test/org/apache/james/management/UserManagementTest.java
URL: http://svn.apache.org/viewvc/james/server/trunk/src/test/org/apache/james/management/UserManagementTest.java?rev=415565&view=auto
==============================================================================
--- james/server/trunk/src/test/org/apache/james/management/UserManagementTest.java (added)
+++ james/server/trunk/src/test/org/apache/james/management/UserManagementTest.java Tue Jun 20 01:40:03 2006
@@ -0,0 +1,214 @@
+/***********************************************************************
+ * Copyright (c) 2006 The Apache Software Foundation.             *
+ * All rights reserved.                                                *
+ * ------------------------------------------------------------------- *
+ * Licensed 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.management;
+
+import junit.framework.TestCase;
+import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.james.services.UsersRepository;
+import org.apache.james.test.mock.avalon.MockLogger;
+import org.apache.james.test.mock.avalon.MockServiceManager;
+import org.apache.james.userrepository.MockUsersRepository;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Arrays;
+
+/**
+ * Tests the UserManagement
+ */
+public class UserManagementTest extends TestCase {
+
+    private MockUsersRepository m_mockUsersRepository;
+    private UserManagement m_userManagement;
+
+    protected void setUp() throws Exception {
+        m_userManagement = new UserManagement();
+        ContainerUtil.enableLogging(m_userManagement, new MockLogger());
+        ContainerUtil.service(m_userManagement, setUpServiceManager());
+    }
+
+    private MockServiceManager setUpServiceManager() {
+        MockServiceManager serviceManager = new MockServiceManager();
+        m_mockUsersRepository = new MockUsersRepository();
+        serviceManager.put(UsersRepository.ROLE, m_mockUsersRepository);
+        return serviceManager;
+    }
+
+    public void testUserCount() throws IOException {
+        assertEquals("no user yet", 0, m_userManagement.countUsers());
+        m_mockUsersRepository.addUser("testCount1", "testCount");
+        assertEquals("1 user", 1, m_userManagement.countUsers());
+        m_mockUsersRepository.addUser("testCount2", "testCount");
+        assertEquals("2 users", 2, m_userManagement.countUsers());
+        m_mockUsersRepository.removeUser("testCount1");
+        assertEquals("1 user", 1, m_userManagement.countUsers());
+    }
+
+    public void testAddUserAndVerify() throws IOException {
+        assertTrue("user added", m_mockUsersRepository.addUser("testCount1", "testCount"));
+        assertFalse("user not there", m_userManagement.verifyExists("testNotAdded"));
+        assertTrue("user is there", m_userManagement.verifyExists("testCount1"));
+        m_mockUsersRepository.removeUser("testCount1");
+        assertFalse("user not there", m_userManagement.verifyExists("testCount1"));
+    }
+
+    public void testDelUser() throws IOException {
+        assertTrue("user added", m_mockUsersRepository.addUser("testDel", "test"));
+        assertFalse("user not there", m_userManagement.verifyExists("testNotDeletable"));
+        assertTrue("user is there", m_userManagement.verifyExists("testDel"));
+        m_mockUsersRepository.removeUser("testDel");
+        assertFalse("user no longer there", m_userManagement.verifyExists("testDel"));
+    }
+
+    public void testListUsers() throws IOException {
+
+        String[] usersArray = new String[] {"ccc", "aaa", "dddd", "bbbbb"};
+        List users = Arrays.asList(usersArray);
+
+        for (int i = 0; i < users.size(); i++) {
+            String user = (String) users.get(i);
+            assertTrue("user added", m_mockUsersRepository.addUser(user, "test"));
+        }
+
+        String[] userNames = m_userManagement.listAllUsers();
+        assertEquals("user count", users.size(), userNames.length);
+
+        for (int i = 0; i < userNames.length; i++) {
+            String user = userNames[i];
+            if (!users.contains(user)) fail("user not listed");
+        }
+    }
+
+    public void testAlias() throws UserManagementException {
+        m_mockUsersRepository.setForceUseJamesUser();
+
+        // do some tests when parameter users don't exist
+        try {
+            m_userManagement.setAlias("testNonExist1", "testNonExist2");
+            fail("user unknown to server");
+        } catch (UserManagementException e) {
+            // success
+        }
+
+        assertTrue("user added", m_userManagement.addUser("testAlias1", "test"));
+
+        assertNull("no alias set", m_userManagement.getAlias("testAlias1"));
+
+        try {
+            m_userManagement.setAlias("testAlias1", "testNonExist2");
+            fail("alias unknown to server");
+        } catch (UserManagementException e) {
+            // success
+        }
+
+        try {
+            m_userManagement.setAlias("testNonExist1", "testAlias");
+            fail("user unknown to server");
+        } catch (UserManagementException e) {
+            // success
+        }
+
+        assertTrue("user added", m_userManagement.addUser("testAlias2", "test"));
+
+        // regular alias
+        assertTrue("alias for testAlias1 set to:testAlias2", m_userManagement.setAlias("testAlias1", "testAlias2"));
+
+        //TODO: is this correct? even primitive circular aliasing allowed!
+        assertTrue("alias for testAlias2 set to:testAlias1", m_userManagement.setAlias("testAlias2", "testAlias1"));
+
+        // did first one persist?
+        assertEquals("Current alias for testAlias1 is: testAlias2", "testAlias2", m_userManagement.getAlias("testAlias1"));
+
+        //TODO: is this correct? setting self as alias!
+        assertTrue("alias for testAlias1 set to:testAlias1", m_userManagement.setAlias("testAlias1", "testAlias1"));
+
+        assertTrue("user added", m_userManagement.addUser("testAlias3", "test"));
+
+        // re-set, simply overwrites
+        assertTrue("alias for testAlias1 set to:testAlias3", m_userManagement.setAlias("testAlias1", "testAlias3"));
+
+        // check overwrite
+        assertEquals("Current alias for testAlias1 is: testAlias3", "testAlias3", m_userManagement.getAlias("testAlias1"));
+
+        // retreat
+        assertTrue("alias for testAlias1 unset", m_userManagement.unsetAlias("testAlias1"));
+
+        // check removed alias
+        //sendCommand("showalias testAlias1");
+        assertNull("User testAlias1 does not currently have an alias", m_userManagement.getAlias("testAlias1"));
+
+    }
+
+    public void testForward() throws UserManagementException {
+        m_mockUsersRepository.setForceUseJamesUser();
+
+        // do some tests when parameter users don't exist
+        try {
+            m_userManagement.setForwardAddress("testNonExist1", "testForward1@locahost");
+            fail("user unknown to server");
+        } catch (UserManagementException e) {
+            // success
+        }
+
+        assertTrue("user added", m_userManagement.addUser("testForwardUser", "test"));
+
+        assertNull("no forward set", m_userManagement.getForwardAddress("testForwardUser"));
+
+        assertTrue(m_userManagement.setForwardAddress("testForwardUser", "testForward1@locahost"));
+
+        // did it persist?
+        String forwardAddress = m_userManagement.getForwardAddress("testForwardUser");
+        assertEquals("forward for testForwardUser is: testForward1@locahost", "testForward1@locahost", forwardAddress);
+
+        // re-set, simply overwrites
+        assertTrue(m_userManagement.setForwardAddress("testForwardUser", "testForward2@locahost"));
+
+        // check overwrite
+        forwardAddress = m_userManagement.getForwardAddress("testForwardUser");
+        assertEquals("forward for testForwardUser is: testForward2@locahost", "testForward2@locahost", forwardAddress);
+
+        // retreat
+        assertTrue("Forward for testForwardUser unset", m_userManagement.unsetForwardAddress("testForwardUser"));
+
+        // check removed forward
+        assertNull("no more forward set", m_userManagement.getForwardAddress("testForwardUser"));
+
+    }
+
+    public void testSetPassword() throws IOException, UserManagementException {
+
+        assertTrue("user added", m_userManagement.addUser("testPwdUser", "pwd1"));
+
+        assertTrue("initial password", m_mockUsersRepository.test("testPwdUser", "pwd1"));
+
+        // set empty pwd
+        assertTrue("changed to empty password", m_userManagement.setPassword("testPwdUser", ""));
+        assertTrue("password changed to empty", m_mockUsersRepository.test("testPwdUser", ""));
+
+        // change pwd
+        assertTrue("changed password", m_userManagement.setPassword("testPwdUser", "pwd2"));
+        assertTrue("password not changed to pwd2", m_mockUsersRepository.test("testPwdUser", "pwd2"));
+
+        // assure case sensitivity
+        assertTrue("changed password", m_userManagement.setPassword("testPwdUser", "pWD2"));
+        assertFalse("password no longer pwd2", m_mockUsersRepository.test("testPwdUser", "pwd2"));
+        assertTrue("password changed to pWD2", m_mockUsersRepository.test("testPwdUser", "pWD2"));
+
+    }
+}



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