1 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 ; 37 import java.util.ResourceBundle ; 38 import java.util.Locale ; 39 import java.util.Set ; 40 import java.util.HashSet ; 41 42 public class UserRegistrarImpl implements UserRegistrar, Serviceable, Initializable, Configurable, ThreadSafe { 43 private ServiceManager serviceManager; 44 private String login; 45 private String password; 46 private String roles[]; 47 private String defaultRoleName; 48 private Repository repository; 49 private SecureRandom random = null; 50 private int KEYLENGTH = 20; 51 private String daisyHomePath; 52 private Set excludeUsers = new HashSet (); 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 [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 { 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 ("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 nsae) { 104 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 login, String password, String email, String firstName, String lastName, 117 String server, String mountPoint, Locale locale) throws Exception { 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 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 bundle = getBundle(locale); 141 String 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 confirmKey) throws Exception { 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 [] {}); 157 } 158 159 String 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 [] {}); 166 } 167 } 168 169 private String 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 (result); 182 } 183 184 public void sendPasswordReminder(String login, String server, String mountPoint, Locale locale) throws Exception { 185 if (excludeUsers.contains(login)) 186 throw new Exception ("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 [0]); 194 195 if (user.getEmail() == null || user.getEmail().equals("")) 196 throw new RegistrarException("exception.no-email", new Object [] {login}); 197 198 String password = Gpw.generate(8); 199 user.setPassword(password); 200 user.save(); 201 202 ResourceBundle bundle = getBundle(locale); 203 String 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 email, String server, String mountPoint, Locale locale) throws Exception { 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 [] {email}); 219 220 StringBuffer logins = new StringBuffer (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 bundle = getBundle(locale); 228 String 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 getDaisyHomePath(String server, String mountPoint) { 237 if (this.daisyHomePath != null) 238 return this.daisyHomePath; 239 else 240 return server + mountPoint; 241 } 242 243 private ResourceBundle getBundle(Locale locale) { 244 return ResourceBundle.getBundle("org/outerj/daisy/frontend/components/userregistrar/messages", locale); 245 } 246 } 247 | Popular Tags |