/* * Copyright 2008-2010 the original author or authors. * * 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 es.alvsanand.webpage.web.beans.session; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.net.FileNameMap; import java.net.URLConnection; import java.security.NoSuchAlgorithmException; import java.util.Date; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.SessionScoped; import javax.faces.component.UIComponent; import javax.faces.component.UIInput; import javax.faces.context.FacesContext; import javax.faces.validator.ValidatorException; import org.apache.commons.codec.binary.Base64; import org.apache.commons.lang.StringUtils; import org.primefaces.event.FileUploadEvent; import com.google.appengine.api.datastore.Blob; import es.alvsanand.webpage.AlvsanandException; import es.alvsanand.webpage.common.FacesUtils; import es.alvsanand.webpage.common.Globals; import es.alvsanand.webpage.common.Logger; import es.alvsanand.webpage.common.MessageResources; import es.alvsanand.webpage.model.Avatar; import es.alvsanand.webpage.model.Role; import es.alvsanand.webpage.model.User; import es.alvsanand.webpage.model.UserState; import es.alvsanand.webpage.model.security.GrantedAuthorityImpl; import es.alvsanand.webpage.services.ServiceException; import es.alvsanand.webpage.services.security.CryptographyService; import es.alvsanand.webpage.services.security.CryptographyServiceImpl; import es.alvsanand.webpage.services.session.UserService; import es.alvsanand.webpage.services.session.UserServiceImpl; /** * This bean process the flow for the user operations * * @author alvaro.santos * @date 18/11/2009 * */ @SessionScoped @ManagedBean(name="registrationBean") public class RegistrationBean implements Serializable{ /** * */ private static final long serialVersionUID = 1602676211690700905L; private transient static final Logger logger = new Logger(RegistrationBean.class); private transient static final String END_REGISTRATION_VIEW_ID = "/xhtml/session/endRegistration.jsf"; private transient static final String END_RESET_PASSWORD_VIEW_ID = "/xhtml/session/endResetPassword.jsf"; private transient static final String MODIFY_PERSONAL_DATA_VIEW_ID = "/xhtml/secured/modifyPersonalData.jsf"; private transient CryptographyService cryptographyService; private transient UserService userService; private String loginName; private String name; private String password; private String rePassword; private String surname; private String email; private String recaptcha; private boolean privacy; private transient UIInput passwordComponent; private String registrationHash; private boolean savedPersonalData; private byte[] photoData; private String photoMediaType; private boolean showFileUpload; public RegistrationBean() { } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRePassword() { return rePassword; } public void setRePassword(String rePassword) { this.rePassword = rePassword; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getRecaptcha() { return recaptcha; } public void setRecaptcha(String recaptcha) { this.recaptcha = recaptcha; } public UIInput getPasswordComponent() { return passwordComponent; } public void setPasswordComponent(UIInput passwordComponent) { this.passwordComponent = passwordComponent; } public boolean isPrivacy() { return privacy; } public void setPrivacy(boolean privacy) { this.privacy = privacy; } public String getRegistrationHash() { return registrationHash; } public void setRegistrationHash(String registrationHash) { this.registrationHash = registrationHash; } public boolean isSavedPersonalData() { return savedPersonalData; } public void setSavedPersonalData(boolean savedPersonalData) { this.savedPersonalData = savedPersonalData; } public byte[] getPhotoData() { return photoData; } public void setPhotoData(byte[] photoData) { this.photoData = photoData; } public String getPhotoMediaType() { return photoMediaType; } public void setPhotoMediaType(String photoMediaType) { this.photoMediaType = photoMediaType; } public UserService getUserService() { if(userService==null){ userService = new UserServiceImpl(); } return userService; } public CryptographyService getCryptographyService() { if(cryptographyService==null){ cryptographyService = new CryptographyServiceImpl(); } return cryptographyService; } public boolean isShowFileUpload() { return showFileUpload; } public void setShowFileUpload(boolean showFileUpload) { this.showFileUpload = showFileUpload; } // JSF methods public void create() { logger.info("Launched RegistrationBean.create"); loginName = null; name = null; password = null; rePassword = null; surname = null; email = null; recaptcha = null; privacy = false; registrationHash = null; photoData = null; photoMediaType = null; showFileUpload = false; } public String save() throws AlvsanandException { logger.info("Launched RegistrationBean.save[" + loginName + "]"); User user = new User(); user.setLoginName(loginName); user.setPassword(password); user.setName(loginName); user.setSurname(surname); user.setEmail(email); Role role = new Role(); role.setName(GrantedAuthorityImpl.ROLE_GENERIC_USER.getAuthority()); user.setRole(role); user.setState(UserState.REGISTERED.getValue()); if (user != null && user.getPassword() != null) { try { String passwordDigested = new String(Base64.encodeBase64(getCryptographyService().digest(user.getPassword().getBytes()))); user.setPassword(passwordDigested); String registrationHash = es.alvsanand.webpage.common.StringUtils.generateRandomString(); user.setRegistrationHash(registrationHash); } catch (NoSuchAlgorithmException noSuchAlgorithmException) { } } getUserService().saveUser(user); getUserService().sendActivationEmail(user); FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME, "registration.end.completed.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME, "registration.end.completed.summary", null)); message.setSeverity(FacesMessage.SEVERITY_INFO); FacesContext.getCurrentInstance().addMessage(null, message); return END_REGISTRATION_VIEW_ID; } public void validateRePassword(FacesContext context, UIComponent validate, Object value) { logger.info("Launched RegistrationBean.validateRePassword"); String rePassword = (String) value; String password = (String) getPasswordComponent().getLocalValue(); if (StringUtils.isEmpty(rePassword) || !rePassword.equals(password)) { ((UIInput) validate).setValid(false); FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.validateRePassword.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.validateRePassword.summary", null)); message.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ValidatorException(message); } } public void validateName(FacesContext context, UIComponent validate, Object value) throws AlvsanandException { logger.info("Launched RegistrationBean.validateName"); String name = (String) value; if (!StringUtils.isEmpty(name)) { int count = 0; try { count = getUserService().getUserCount(name); } catch (ServiceException ex) { throw ex; } if (count > 0) { ((UIInput) validate).setValid(false); FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.validateUserName.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.form.validation.validateUserName.summary", null)); message.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ValidatorException(message); } } } public void activate() throws AlvsanandException { logger.info("Launched RegistrationBean.activate[" + registrationHash + "]"); User user = getUserService().getUserByRegistrationHash(registrationHash); if(user==null){ FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.activate.registrationHash.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.activate.registrationHash.summary", null)); message.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext.getCurrentInstance().addMessage(null, message); return; } if(user.getState()!=UserState.REGISTERED.getValue()){ FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.activate.activated.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.activate.activated.summary", null)); message.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext.getCurrentInstance().addMessage(null, message); return; } user.setState(UserState.ACCEPTED.getValue()); getUserService().saveUser(user); FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME, "registration.activation.completed.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME, "registration.activation.completed.summary", null)); message.setSeverity(FacesMessage.SEVERITY_INFO); FacesContext.getCurrentInstance().addMessage(null, message); } public String resetPassword() throws AlvsanandException { logger.info("Launched RegistrationBean.resetPassword[" + loginName + "]"); User user = getUserService().getUserByLoginName(loginName); if(user==null){ FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.resetPassword.loginName.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.resetPassword.loginName.summary", null)); message.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext.getCurrentInstance().addMessage(null, message); return END_RESET_PASSWORD_VIEW_ID; } String plainPassword = es.alvsanand.webpage.common.StringUtils.generateRandomString(); try { String passwordDigested = new String(Base64.encodeBase64(getCryptographyService().digest(plainPassword.getBytes()))); user.setPassword(passwordDigested); } catch (NoSuchAlgorithmException noSuchAlgorithmException) { } getUserService().saveUser(user); getUserService().sendResetPasswordEmail(user, plainPassword); FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME, "registration.resetPassword.activation.completed.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME, "registration.resetPassword.activation.completed.summary", null)); message.setSeverity(FacesMessage.SEVERITY_INFO); FacesContext.getCurrentInstance().addMessage(null, message); return END_RESET_PASSWORD_VIEW_ID; } public void loadPersonalData() throws AlvsanandException { User actualUser = (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(Globals.SES_USER); logger.info("Launched RegistrationBean.loadPersonalData[" + actualUser + "]"); User user = getUserService().getUser(actualUser); name = user.getName(); surname = user.getSurname(); email = user.getEmail(); password = null; rePassword = null; savedPersonalData = false; } public String savePersonalData() throws AlvsanandException { User actualUser = (User)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get(Globals.SES_USER); logger.info("Launched RegistrationBean.savePersonalData[" + actualUser + "]"); savedPersonalData = true; User user = getUserService().getUser(actualUser); user.setPassword(password); user.setName(name); user.setSurname(surname); user.setEmail(email); if(photoData!=null && StringUtils.isNotEmpty(photoMediaType)){ Avatar avatar = new Avatar(); avatar.setDate(new Date()); avatar.setUser(actualUser); avatar.setMediaType(photoMediaType); avatar.setData(new Blob(photoData)); user.setAvatar(avatar); photoData = null; photoMediaType = null; } if (user != null && user.getPassword() != null) { try { String passwordDigested = new String(Base64.encodeBase64(getCryptographyService().digest(user.getPassword().getBytes()))); user.setPassword(passwordDigested); } catch (NoSuchAlgorithmException noSuchAlgorithmException) { } } getUserService().saveUser(user); FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put(Globals.SES_USER, user); FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME, "registration.modifyPersonalData.completed.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.REGISTRATION_RESOURCE_BUNDLE_NAME, "registration.modifyPersonalData.completed.summary", null)); message.setSeverity(FacesMessage.SEVERITY_INFO); FacesContext.getCurrentInstance().addMessage(null, message); password = null; rePassword = null; showFileUpload = false; return MODIFY_PERSONAL_DATA_VIEW_ID; } public void toggleFileUpload() throws AlvsanandException { logger.info("Launched RegistrationBean.toggleFileUpload"); showFileUpload = !showFileUpload; } public void handleFileUpload(FileUploadEvent fileUploadEvent) { logger.info("Uploaded: {" + fileUploadEvent.getFile().getFileName() + "}"); FacesContext context = FacesContext.getCurrentInstance(); UIComponent fileUploadComponent = FacesUtils.findComponent(context.getViewRoot(), "fileUpload"); InputStream inputStream = null; try { inputStream = fileUploadEvent.getFile().getInputstream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int length; while ((length = inputStream.read(buf)) > 0) { outputStream.write(buf, 0, length); } inputStream.close(); photoData = outputStream.toByteArray(); outputStream.close(); FileNameMap fileNameMap = URLConnection.getFileNameMap(); photoMediaType = fileNameMap.getContentTypeFor(fileUploadEvent.getFile().getFileName()); showFileUpload = false; } catch (IOException e1) { FacesMessage message = new FacesMessage(); message.setDetail(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.modifyPersonalData.fileUpload.detail", null)); message.setSummary(MessageResources.getMessage(MessageResources.ERROR_RESOURCE_BUNDLE_NAME, "error.modifyPersonalData.fileUpload.summary", null)); message.setSeverity(FacesMessage.SEVERITY_ERROR); FacesContext.getCurrentInstance().addMessage(fileUploadComponent.getClientId(context), message); showFileUpload = false; return; } } }