View Javadoc

1   /****************************************************************
2    * Licensed to the Apache Software Foundation (ASF) under one   *
3    * or more contributor license agreements.  See the NOTICE file *
4    * distributed with this work for additional information        *
5    * regarding copyright ownership.  The ASF licenses this file   *
6    * to you under the Apache License, Version 2.0 (the            *
7    * "License"); you may not use this file except in compliance   *
8    * with the License.  You may obtain a copy of the License at   *
9    *                                                              *
10   *   http://www.apache.org/licenses/LICENSE-2.0                 *
11   *                                                              *
12   * Unless required by applicable law or agreed to in writing,   *
13   * software distributed under the License is distributed on an  *
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
15   * KIND, either express or implied.  See the License for the    *
16   * specific language governing permissions and limitations      *
17   * under the License.                                           *
18   ****************************************************************/
19  
20  
21  
22  
23  package org.apache.james.impl.user;
24  
25  import org.apache.avalon.framework.service.ServiceException;
26  import org.apache.avalon.framework.service.ServiceManager;
27  import org.apache.avalon.framework.service.Serviceable;
28  import org.apache.james.api.user.JamesUser;
29  import org.apache.james.api.user.User;
30  import org.apache.james.api.user.UsersRepository;
31  import org.apache.james.api.user.UsersStore;
32  import org.apache.james.api.user.management.UserManagementException;
33  import org.apache.james.api.user.management.UserManagementMBean;
34  import org.apache.mailet.MailAddress;
35  
36  import javax.mail.internet.ParseException;
37  import java.util.Iterator;
38  import java.util.ArrayList;
39  import java.util.List;
40  
41  public class UserManagement implements UserManagementMBean, Serviceable {
42  
43      String ROLE = "org.apache.james.impl.user.UserManagement";
44      
45      /**
46       * The administered UsersRepository
47       */
48      private UsersRepository localUsers;
49      private UsersStore usersStore;
50  
51      public void setLocalUsers(UsersRepository localUsers) {
52          this.localUsers = localUsers;
53      }
54  
55      public void setUsersStore(UsersStore usersStore) {
56          this.usersStore = usersStore;
57      }
58  
59      /**
60       * @see org.apache.avalon.framework.service.Serviceable#service(org.apache.avalon.framework.service.ServiceManager)
61       */
62      public void service( final ServiceManager componentManager )
63          throws ServiceException {
64          localUsers = (UsersRepository) componentManager.lookup(UsersRepository.ROLE);
65          if (localUsers == null) {
66              throw new ServiceException("","The local user repository could not be found.");
67          }
68          setLocalUsers(localUsers);
69          usersStore = (UsersStore)componentManager.lookup( UsersStore.ROLE );
70          if (usersStore == null) {
71              throw new ServiceException("","The user store containing the user repositories could not be found.");
72          }
73          setUsersStore(usersStore);
74      }
75  
76      private JamesUser getJamesUser(String userName, String repositoryName) throws UserManagementException {
77          User baseuser = getUserRepository(repositoryName).getUserByName(userName);
78          if (baseuser == null) throw new UserManagementException("user not found: " + userName);
79          if (! (baseuser instanceof JamesUser ) ) throw new UserManagementException("user is not of type JamesUser: " + userName);
80  
81          return (JamesUser) baseuser;
82      }
83  
84      private UsersRepository getUserRepository(String repositoryName) throws UserManagementException {
85          if (repositoryName == null) return localUsers; // return default
86  
87          if (usersStore == null) throw new UserManagementException("cannot access user repository named " + repositoryName);
88  
89          UsersRepository repository = usersStore.getRepository(repositoryName);
90          if (repository == null) throw new UserManagementException("user repository does not exist: " + repositoryName);
91          
92          return repository;
93      }
94  
95      /**
96       * @see org.apache.james.api.user.management.UserManagementMBean#addUser(java.lang.String, java.lang.String, java.lang.String)
97       */
98      public boolean addUser(String userName, String password, String repositoryName) throws UserManagementException {
99          return getUserRepository(repositoryName).addUser(userName, password);
100     }
101 
102     /**
103      * @see org.apache.james.api.user.management.UserManagementMBean#deleteUser(java.lang.String, java.lang.String)
104      */
105     public boolean deleteUser(String userName, String repositoryName) throws UserManagementException {
106         UsersRepository users = getUserRepository(repositoryName);
107         if (!users.contains(userName)) return false;
108         users.removeUser(userName);
109         return true;
110     }
111 
112     /**
113      * @see org.apache.james.api.user.management.UserManagementMBean#verifyExists(java.lang.String, java.lang.String)
114      */
115     public boolean verifyExists(String userName, String repositoryName) throws UserManagementException {
116         UsersRepository users = getUserRepository(repositoryName);
117         return users.contains(userName);
118     }
119 
120     /**
121      * @see org.apache.james.api.user.management.UserManagementMBean#countUsers(java.lang.String)
122      */
123     public long countUsers(String repositoryName) throws UserManagementException {
124         UsersRepository users = getUserRepository(repositoryName);
125         return users.countUsers();
126     }
127 
128     /**
129      * @see org.apache.james.api.user.management.UserManagementMBean#listAllUsers(java.lang.String)
130      */
131     public String[] listAllUsers(String repositoryName) throws UserManagementException {
132         List userNames = new ArrayList();
133         UsersRepository users = getUserRepository(repositoryName);
134         for (Iterator it = users.list(); it.hasNext();) {
135             userNames.add(it.next());
136         }
137         return (String[])userNames.toArray(new String[]{});
138     }
139 
140     /**
141      * @see org.apache.james.api.user.management.UserManagementMBean#setPassword(java.lang.String, java.lang.String, java.lang.String)
142      */
143     public boolean setPassword(String userName, String password, String repositoryName) throws UserManagementException {
144         UsersRepository users = getUserRepository(repositoryName);
145         User user = users.getUserByName(userName);
146         if (user == null) throw new UserManagementException("user not found: " + userName);
147         return user.setPassword(password);
148     }
149 
150     /**
151      * @see org.apache.james.api.user.management.UserManagementMBean#setAlias(java.lang.String, java.lang.String, java.lang.String)
152      */
153     public boolean setAlias(String userName, String aliasUserName, String repositoryName) throws UserManagementException {
154         JamesUser user = getJamesUser(userName, null);
155         JamesUser aliasUser = getJamesUser(aliasUserName, null);
156         if (aliasUser == null) return false;
157 
158         boolean success = user.setAlias(aliasUserName);
159         user.setAliasing(true);
160         getUserRepository(repositoryName).updateUser(user);
161         return success;
162     }
163 
164     /**
165      * @see org.apache.james.api.user.management.UserManagementMBean#unsetAlias(java.lang.String, java.lang.String)
166      */
167     public boolean unsetAlias(String userName, String repositoryName) throws UserManagementException {
168         JamesUser user = getJamesUser(userName, null);
169         if (!user.getAliasing()) return false;
170         
171         user.setAliasing(false);
172         getUserRepository(repositoryName).updateUser(user);
173         return true;
174     }
175 
176     /**
177      * @see org.apache.james.api.user.management.UserManagementMBean#getAlias(java.lang.String, java.lang.String)
178      */
179     public String getAlias(String userName, String repositoryName) throws UserManagementException {
180         JamesUser user = getJamesUser(userName, null);
181         if (!user.getAliasing()) return null;
182         return user.getAlias();
183     }
184 
185     /**
186      * @see org.apache.james.api.user.management.UserManagementMBean#setForwardAddress(java.lang.String, java.lang.String, java.lang.String)
187      */
188     public boolean setForwardAddress(String userName, String forwardEmailAddress, String repositoryName) throws UserManagementException {
189         MailAddress forwardAddress;
190         try {
191              forwardAddress = new MailAddress(forwardEmailAddress);
192         } catch(ParseException pe) {
193             throw new UserManagementException(pe);
194         }
195 
196         JamesUser user = getJamesUser(userName, null);
197         boolean success = user.setForwardingDestination(forwardAddress);
198         if (!success) return false;
199         
200         user.setForwarding(true);
201         getUserRepository(repositoryName).updateUser(user);
202         return true;
203     }
204 
205     /**
206      * @see org.apache.james.api.user.management.UserManagementMBean#unsetForwardAddress(java.lang.String, java.lang.String)
207      */
208     public boolean unsetForwardAddress(String userName, String repositoryName) throws UserManagementException {
209         JamesUser user = getJamesUser(userName, null);
210 
211         if (!user.getForwarding()) return false;
212         
213         user.setForwarding(false);
214         getUserRepository(repositoryName).updateUser(user);
215         return true;
216     }
217 
218     /**
219      * @see org.apache.james.api.user.management.UserManagementMBean#getForwardAddress(java.lang.String, java.lang.String)
220      */
221     public String getForwardAddress(String userName, String repositoryName) throws UserManagementException {
222         JamesUser user = getJamesUser(userName, null);
223         if (!user.getForwarding()) return null;
224         return user.getForwardingDestination().toString();
225     }
226 
227     /**
228      * @see org.apache.james.api.user.management.UserManagementMBean#getUserRepositoryNames()
229      */
230     public List getUserRepositoryNames() {
231         List result = new ArrayList();
232         if (usersStore == null) return result;
233         
234         Iterator repositoryNames = usersStore.getRepositoryNames();
235         while (repositoryNames.hasNext()) {
236             String name = (String) repositoryNames.next();
237             result.add(name);
238         }
239         return result;
240     }
241 
242 }