KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > frontend > components > userregistrar > UserRegistrarImpl


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.outerj.daisy.frontend.components.userregistrar;
17
18 import org.apache.avalon.framework.service.Serviceable;
19 import org.apache.avalon.framework.service.ServiceManager;
20 import org.apache.avalon.framework.service.ServiceException;
21 import org.apache.avalon.framework.activity.Initializable;
22 import org.apache.avalon.framework.configuration.Configurable;
23 import org.apache.avalon.framework.configuration.Configuration;
24 import org.apache.avalon.framework.configuration.ConfigurationException;
25 import org.apache.avalon.framework.thread.ThreadSafe;
26 import org.outerj.daisy.repository.RepositoryManager;
27 import org.outerj.daisy.repository.Credentials;
28 import org.outerj.daisy.repository.Repository;
29 import org.outerj.daisy.repository.clientimpl.RemoteRepositoryImpl;
30 import org.outerj.daisy.repository.user.Role;
31 import org.outerj.daisy.repository.user.UserManager;
32 import org.outerj.daisy.repository.user.User;
33 import org.outerj.daisy.emailer.Emailer;
34 import org.outerj.daisy.util.Gpw;
35
36 import java.security.SecureRandom JavaDoc;
37 import java.util.ResourceBundle JavaDoc;
38 import java.util.Locale JavaDoc;
39 import java.util.Set JavaDoc;
40 import java.util.HashSet JavaDoc;
41
42 public class UserRegistrarImpl implements UserRegistrar, Serviceable, Initializable, Configurable, ThreadSafe {
43     private ServiceManager serviceManager;
44     private String JavaDoc login;
45     private String JavaDoc password;
46     private String JavaDoc roles[];
47     private String JavaDoc defaultRoleName;
48     private Repository repository;
49     private SecureRandom JavaDoc random = null;
50     private int KEYLENGTH = 20;
51     private String JavaDoc daisyHomePath;
52     private Set JavaDoc excludeUsers = new HashSet JavaDoc();
53
54     public void service(ServiceManager serviceManager) throws ServiceException {
55         this.serviceManager = serviceManager;
56     }
57
58     public void configure(Configuration configuration) throws ConfigurationException {
59         Configuration registrarUser = configuration.getChild("registrarUser");
60         login = registrarUser.getAttribute("login");
61         password = registrarUser.getAttribute("password");
62
63         Configuration[] roleConfs = configuration.getChild("roles").getChildren("role");
64         roles = new String JavaDoc[roleConfs.length];
65         for (int i = 0; i < roleConfs.length; i++) {
66             roles[i] = roleConfs[i].getValue();
67         }
68         defaultRoleName = configuration.getChild("defaultRole").getValue(null);
69
70         daisyHomePath = configuration.getChild("daisyHomePath").getValue(null);
71
72         Configuration[] excludeUsersConf = configuration.getChild("excludeUsers").getChildren("login");
73         for (int i = 0; i < excludeUsersConf.length; i++) {
74             excludeUsers.add(excludeUsersConf[i].getValue());
75         }
76     }
77
78     public void initialize() throws Exception JavaDoc {
79         RepositoryManager repositoryManager = null;
80         try {
81             repositoryManager = (RepositoryManager)serviceManager.lookup("daisy-repository-manager");
82             repository = repositoryManager.getRepository(new Credentials(login, password));
83         } finally {
84             if (repositoryManager != null)
85                 serviceManager.release(repositoryManager);
86         }
87
88         boolean hasAdminRole = false;
89         long[] roles = repository.getAvailableRoles();
90         for (int i = 0; i < roles.length; i++) {
91             if (roles[i] == Role.ADMINISTRATOR) {
92                 hasAdminRole = true;
93                 break;
94             }
95         }
96         if (!hasAdminRole)
97             throw new Exception JavaDoc("The user to create user registrations, " + login + ", does not have the Administrator role.");
98         
99
100         try {
101             random = SecureRandom.getInstance("SHA1PRNG");
102         }
103         catch(java.security.NoSuchAlgorithmException JavaDoc nsae) {
104             // maybe we are on IBM's SDK
105
random = SecureRandom.getInstance("IBMSecureRandom");
106         }
107         random.setSeed(System.currentTimeMillis());
108     }
109
110     private Repository getRepository() {
111         Repository repository = (Repository)((RemoteRepositoryImpl)this.repository).clone();
112         repository.switchRole(Role.ADMINISTRATOR);
113         return repository;
114     }
115
116     public void registerNewUser(String JavaDoc login, String JavaDoc password, String JavaDoc email, String JavaDoc firstName, String JavaDoc lastName,
117             String JavaDoc server, String JavaDoc mountPoint, Locale JavaDoc locale) throws Exception JavaDoc {
118         Repository repository = getRepository();
119         UserManager userManager = repository.getUserManager();
120         User user = userManager.createUser(login);
121         user.setPassword(password);
122         user.setEmail(email);
123         user.setFirstName(firstName);
124         user.setLastName(lastName);
125         user.setUpdateableByUser(true);
126         user.setConfirmed(false);
127         String JavaDoc confirmKey = generateConfirmationKey();
128         user.setConfirmKey(confirmKey);
129
130         for (int i = 0; i < roles.length; i++) {
131             Role role = userManager.getRole(roles[i], false);
132             user.addToRole(role);
133         }
134         if (defaultRoleName != null) {
135             Role defaultRole = userManager.getRole(defaultRoleName, false);
136             user.setDefaultRole(defaultRole);
137         }
138         user.save();
139
140         ResourceBundle JavaDoc bundle = getBundle(locale);
141         String JavaDoc message = bundle.getString("confirm-message-template");
142         message = message.replaceAll("%%daisyHomePath%%", getDaisyHomePath(server, mountPoint));
143         message = message.replaceAll("%%user%%", String.valueOf(user.getId()));
144         message = message.replaceAll("%%confirmKey%%", confirmKey);
145
146         Emailer emailer = (Emailer)repository.getExtension("Emailer");
147         emailer.send(email, bundle.getString("confirm-message-subject"), message);
148     }
149
150     public void confirmUserRegistration(long userId, String JavaDoc confirmKey) throws Exception JavaDoc {
151         Repository repository = getRepository();
152         UserManager userManager = repository.getUserManager();
153         User user = userManager.getUser(userId, true);
154
155         if (user.isConfirmed()) {
156             throw new RegistrarException("exception.already-confirmed", new Object JavaDoc[] {});
157         }
158
159         String JavaDoc referenceKey = user.getConfirmKey();
160         if (referenceKey != null && !referenceKey.equals("") && referenceKey.equals(confirmKey)) {
161             user.setConfirmed(true);
162             user.setConfirmKey(null);
163             user.save();
164         } else {
165             throw new RegistrarException("exception.failed-invalid-key", new Object JavaDoc[] {});
166         }
167     }
168
169     private String JavaDoc generateConfirmationKey() {
170         byte[] bytes = new byte[KEYLENGTH];
171         char[] result = new char[KEYLENGTH * 2];
172
173         random.nextBytes(bytes);
174
175         for (int i = 0; i < KEYLENGTH; i++) {
176             byte ch = bytes[i];
177             result[2 * i] = Character.forDigit(Math.abs(ch >> 4), 16);
178             result[2 * i + 1] = Character.forDigit(Math.abs(ch & 0x0f), 16);
179         }
180
181         return new String JavaDoc(result);
182     }
183
184     public void sendPasswordReminder(String JavaDoc login, String JavaDoc server, String JavaDoc mountPoint, Locale JavaDoc locale) throws Exception JavaDoc {
185         if (excludeUsers.contains(login))
186             throw new Exception JavaDoc("Requesting a new password for this user is not allowed.");
187
188         Repository repository = getRepository();
189         UserManager userManager = repository.getUserManager();
190         User user = userManager.getUser(login, true);
191
192         if (!user.getAuthenticationScheme().equals("daisy"))
193             throw new RegistrarException("exception.not-daisy-scheme", new Object JavaDoc[0]);
194
195         if (user.getEmail() == null || user.getEmail().equals(""))
196             throw new RegistrarException("exception.no-email", new Object JavaDoc[] {login});
197
198         String JavaDoc password = Gpw.generate(8);
199         user.setPassword(password);
200         user.save();
201
202         ResourceBundle JavaDoc bundle = getBundle(locale);
203         String JavaDoc message = bundle.getString("password-reminder-template");
204         message = message.replaceAll("%%login%%", login);
205         message = message.replaceAll("%%password%%", password);
206         message = message.replaceAll("%%daisyHomePath%%", getDaisyHomePath(server, mountPoint));
207
208         Emailer emailer = (Emailer)repository.getExtension("Emailer");
209         emailer.send(user.getEmail(), bundle.getString("password-reminder-subject"), message);
210     }
211
212     public void sendLoginsReminder(String JavaDoc email, String JavaDoc server, String JavaDoc mountPoint, Locale JavaDoc locale) throws Exception JavaDoc {
213         Repository repository = getRepository();
214         UserManager userManager = repository.getUserManager();
215         User[] users = userManager.getUsersByEmail(email).getArray();
216
217         if (users.length == 0)
218             throw new RegistrarException("exception.no-user-with-that-email", new Object JavaDoc[] {email});
219
220         StringBuffer JavaDoc logins = new StringBuffer JavaDoc(50);
221         for (int i = 0; i < users.length; i++) {
222             if (i > 0)
223                 logins.append(", ");
224             logins.append(users[i].getLogin());
225         }
226
227         ResourceBundle JavaDoc bundle = getBundle(locale);
228         String JavaDoc message = bundle.getString("logins-reminder-template");
229         message = message.replaceAll("%%logins%%", logins.toString());
230         message = message.replaceAll("%%daisyHomePath%%", getDaisyHomePath(server, mountPoint));
231
232         Emailer emailer = (Emailer)repository.getExtension("Emailer");
233         emailer.send(email, bundle.getString("logins-reminder-subject"), message);
234     }
235
236     private String JavaDoc getDaisyHomePath(String JavaDoc server, String JavaDoc mountPoint) {
237         if (this.daisyHomePath != null)
238             return this.daisyHomePath;
239         else
240             return server + mountPoint;
241     }
242
243     private ResourceBundle JavaDoc getBundle(Locale JavaDoc locale) {
244         return ResourceBundle.getBundle("org/outerj/daisy/frontend/components/userregistrar/messages", locale);
245     }
246 }
247
Popular Tags