Author: JirkaM Date: 2010-02-21 00:53:55 +0100 (Sun, 21 Feb 2010) New Revision: 1801 Modified: trunk/server/elvysCommons/src/elvys/server/bl/user/UserBL.java trunk/server/elvysCommons/src/elvys/server/bl/user/UserBLImpl.java trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/user/UserEditBean.java trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/user/UserLoginBean.java trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/user/UserLostPasswordBean.java trunk/server/webServer2/JavaSource/cz/elvys/webServer/messages/labels_cs.properties trunk/server/webServer2/JavaSource/cz/elvys/webServer/messages/messages_cs.properties trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/stats/StatsCTRLImpl.java trunk/server/webServer2/WebContent/WEB-INF/faces-beans.xml trunk/server/webServer2/WebContent/login_body.xhtml trunk/server/webServer2/WebContent/secured/components/label.xhtml trunk/server/webServer2/WebContent/secured/userrel/editUserForm.xhtml trunk/server/webServer2/WebContent/secured/userrel/listOfUsers.xhtml trunk/server/webServer2/WebContent/styles/login_body.css trunk/server/webServer2/WebContent/template/elvys-template.xhtml Log: * add logic for lost password modified src/elvys/server/bl/user/UserBL.java modified src/elvys/server/bl/user/UserBLImpl.java modified JavaSource/cz/elvys/webServer/beans/user/UserEditBean.java modified JavaSource/cz/elvys/webServer/beans/user/UserLoginBean.java modified JavaSource/cz/elvys/webServer/beans/user/UserLostPasswordBean.java modified JavaSource/cz/elvys/webServer/messages/labels_cs.properties modified JavaSource/cz/elvys/webServer/messages/messages_cs.properties modified SpringSource/cz/elvys/webServer/toSpring/stats/StatsCTRLImpl.java modified WebContent/login_body.xhtml modified WebContent/secured/components/label.xhtml modified WebContent/secured/userrel/editUserForm.xhtml modified WebContent/secured/userrel/listOfUsers.xhtml modified WebContent/styles/login_body.css modified WebContent/template/elvys-template.xhtml modified WebContent/WEB-INF/faces-beans.xml Modified: trunk/server/elvysCommons/src/elvys/server/bl/user/UserBL.java =================================================================== --- trunk/server/elvysCommons/src/elvys/server/bl/user/UserBL.java 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/elvysCommons/src/elvys/server/bl/user/UserBL.java 2010-02-20 23:53:55 UTC (rev 1801) @@ -17,11 +17,28 @@ public static final int USER_LOGED_FAILURE = 1; + /** + * Method for loading user by login. There is created session. + * @param login Username of user + * @return User Object of User + * @throws ExecuteException + */ public User getUserByUserNameMakeSession(String login) throws ExecuteException; public User getUserByUserName(String login, Session sess) throws ExecuteException; + /** + * Save user into db. + * @param user + */ public void saveOrUpdateUser(User user); + + /** + * Load all users specified by company and competency. + * @param compID company id + * @param competency competency + * @return + */ public List<User> loadAllUsers(int compID,String competency); /** @@ -58,6 +75,38 @@ */ public String getSaltPassword(String pass, String securedPart); + /** + * Temporary method for regenerate password to new form. + */ public void saltPasswordForAllUsers(); + /** + * Method for testing username unique. + * @param login + * @return + */ + public boolean isLoginUnique(String login, User user); + + /** + * Validate email with regular expression + * @param email + * @return true valid, false invalid + */ + public boolean isCorrectEmail(String email); + + /** + * Method for create temporary password and send email with new password to user. + * @param user + */ + public String generateRandomString(int lenght); + + /** + * Method for sending email to user email. + * @param to + * @param subject + * @param body + * @return true if email is send, false is sending failed + */ + public boolean sendMail(String to,String subject, String body); + } Modified: trunk/server/elvysCommons/src/elvys/server/bl/user/UserBLImpl.java =================================================================== --- trunk/server/elvysCommons/src/elvys/server/bl/user/UserBLImpl.java 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/elvysCommons/src/elvys/server/bl/user/UserBLImpl.java 2010-02-20 23:53:55 UTC (rev 1801) @@ -4,8 +4,13 @@ import java.math.BigInteger; import java.security.SecureRandom; import java.util.ArrayList; +import java.util.Date; import java.util.LinkedList; import java.util.List; +import java.util.Properties; +import java.util.Random; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.apache.commons.codec.digest.DigestUtils; import org.hibernate.Hibernate; @@ -21,19 +26,18 @@ import cz.elvys.webServer.db.InitSessionFactory; import cz.elvys.webServer.toSpring.exception.ExecuteException; + +import javax.activation.*; + public class UserBLImpl implements UserBL { private static final int PASSWORD_SALT_PART_LENGTH = 8; + private static final String EMAIL_PATTERN = "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$"; + private static final String PASSWORD_RANDOM_ALLOWED_CHAR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; - private String getSalt() throws ExecuteException{ - return null; - } + private static final String EMAIL_MAIL_SERVER = "smpt.elvys.cz"; + private static final String EMAIL_FROM = "lostpassword@xxxxxxxx"; - private String getMD5Salted(String value) throws ExecuteException { - return null; - } - - @Override public User getUserByUserNameMakeSession(String login) throws ExecuteException { Session session = InitSessionFactory.getInstance().getCurrentSession(); @@ -65,7 +69,7 @@ Query query = sess.createQuery("from User user " + "inner join fetch user.role " + "inner join fetch user.company " + - "where username=:usname"); + "where user.username=:usname"); query.setString("usname", login); List<User> users = query.list(); if(users.size() == 1){ @@ -74,6 +78,7 @@ return null; } + @Override public void saveOrUpdateUser(User user){ // ADD validation of password if not updating Session sess = InitSessionFactory.getInstance().getCurrentSession(); @@ -92,6 +97,7 @@ } } + @Override public List<User> loadAllUsers(int compID,String competency) { Session sess = InitSessionFactory.getInstance().getCurrentSession(); Transaction tx = sess.getTransaction(); @@ -108,12 +114,12 @@ // superadmin sees all users query = sess.createQuery("from User as user " + "inner join fetch user.role " + - "inner join fetch user.company WHERE user.disabled = 0"); + "inner join fetch user.company WHERE user.disabled = 0 ORDER BY user.role.role,user.surname"); } else if (competency.equalsIgnoreCase("admin")) { query = sess.createQuery("from User as user " + "inner join fetch user.role " + "inner join fetch user.company " + - "where user.company=:compID and user.role.role!='superadmin' AND user.disabled = 0" ); + "where user.company=:compID and user.role.role!='superadmin' AND user.disabled = 0 ORDER BY user.role.role,user.surname" ); query.setInteger("compID", compID); } else { // TODO log @@ -149,6 +155,7 @@ } } + @Override public List<Company> loadPermittedCompany(int compID,String competency) { Session sess = InitSessionFactory.getInstance().getCurrentSession(); Transaction tx = sess.getTransaction(); @@ -177,7 +184,7 @@ return companiesList; } - + @Override public List<Role> loadPermittedRolesList() { Session sess = InitSessionFactory.getInstance().getCurrentSession(); Transaction tx = sess.getTransaction(); @@ -248,5 +255,80 @@ } + @Override + public boolean isLoginUnique(String login,User userSelected) { + User user = null; + try { + user = getUserByUserNameMakeSession(login); + } catch (ExecuteException e) { + throw new Error("Unable get user by login name.", e); + } + + if(user==null){ + return true; + }else{ + if(userSelected !=null && (user.getId().equals(userSelected.getId()))){ + return true; + } + } + return false; + } + + @Override + public boolean isCorrectEmail(String email){ + Pattern pattern = Pattern.compile(EMAIL_PATTERN); + Matcher matcher = pattern.matcher(email); + return matcher.matches(); + } + + + public String generateRandomString(int lenght){ + Random rand= new Random(); + StringBuffer out=new StringBuffer(); + + String allowedChars = PASSWORD_RANDOM_ALLOWED_CHAR; + + while(out.length() < lenght){ + int idx=Math.abs(( rand.nextInt() % allowedChars.length() )); + out.append(allowedChars.charAt(idx)); + } + return out.toString(); + } + + @Override + public boolean sendMail(String to, String subject, String messageBody) { + /* + // Setup mail server + Properties props = System.getProperties(); + props.put("mail.smtp.host", mailServer); + + // Get a mail session + Session sess = InitSessionFactory.getInstance().getCurrentSession(); + + // Define a new mail message + Message message = new MimeMessage(session); + message.setFrom(new InternetAddress(from)); + message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); + message.setSubject(subject); + + // Create a message part to represent the body text + BodyPart messageBodyPart = new MimeBodyPart(); + messageBodyPart.setText(messageBody); + + //use a MimeMultipart as we need to handle the file attachments + Multipart multipart = new MimeMultipart(); + + //add the message body to the mime message + multipart.addBodyPart(messageBodyPart); + + // Put all message parts in the message + message.setContent(multipart); + + // Send the message + Transport.send(message); + */ + return true; + } + } Modified: trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/user/UserEditBean.java =================================================================== --- trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/user/UserEditBean.java 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/user/UserEditBean.java 2010-02-20 23:53:55 UTC (rev 1801) @@ -39,11 +39,20 @@ private static final long serialVersionUID = 8092026699388193893L; private User selectedUser = null; + + // flag for editing by admin or superadmin private boolean updating; + + // flag for editing profile by his own user + private boolean updatingProfile; + private List<SelectItem> companiesToSelect = null; private Integer sizeOfCompaniesToSelect = null; private List<SelectItem> rolesToSelect = null; private Integer sizeOfRolesToSelect = null; + + // password are separated from object user beacuse of password updating + private String password = null; private String passwordAgain = null; private UserBL userBL; @@ -129,40 +138,102 @@ } - - /** - * Stores new User into DB and forwards to ListOfUsers UC. - * @return - */ - public String saveUser() { + private String saveOrUpdateUser(boolean isEdit){ + String result = null; - if (selectedUser.getPassword().equals(passwordAgain)) { - // salt password - String password = userBL.getSaltPassword(selectedUser.getPassword(),null); - selectedUser.setPassword(password); - - // password and passwordAgain matched - userBL.saveOrUpdateUser(selectedUser); - UserListBean userList = BeanManager.getUserList(); - return userList.prepareListOfUsers(); - } else { - // password and passwordAgain are different + if(!isEdit && password.equals("")){ FacesMessage message = MessageUtils.getMessage( + "user.form.emptyPassword", null, FacesMessage.SEVERITY_ERROR); + FacesContext fc = FacesContext.getCurrentInstance(); + fc.addMessage("editUserForm:password", message); + result = "error"; + } + + if(!isEdit && password.equals("")){ + FacesMessage message = MessageUtils.getMessage( + "user.form.emptyPassword", null, FacesMessage.SEVERITY_ERROR); + FacesContext fc = FacesContext.getCurrentInstance(); + fc.addMessage("editUserForm:password", message); + result = "error"; + } + + // password and passwordAgain are different + if (!password.equals(passwordAgain)) { + FacesMessage message = MessageUtils.getMessage( "user.form.badPasswordAgain", null, FacesMessage.SEVERITY_ERROR); FacesContext fc = FacesContext.getCurrentInstance(); fc.addMessage("editUserForm:passwordAgain", message); - return "error"; + result = "error"; + } + + // check unique of username + boolean isLoginUnique = true; + + if(isEdit){ + isLoginUnique = userBL.isLoginUnique(selectedUser.getUsername(),selectedUser); + }else{ + isLoginUnique = userBL.isLoginUnique(selectedUser.getUsername(),null); } + + if(!isLoginUnique){ + FacesMessage message = MessageUtils.getMessage( + "user.form.loginAlreadyExists", null, FacesMessage.SEVERITY_ERROR); + FacesContext fc = FacesContext.getCurrentInstance(); + fc.addMessage("editUserForm:usernameField", message); + result = "error"; + } + + // check email address + if(!userBL.isCorrectEmail(selectedUser.getEmail())){ + FacesMessage message = MessageUtils.getMessage( + "user.form.user.form.setCorrectEmail", null, FacesMessage.SEVERITY_ERROR); + FacesContext fc = FacesContext.getCurrentInstance(); + fc.addMessage("editUserForm:emailField", message); + result = "error"; + } + + if(result == null){ + // salt password only if password is changed + if(!isEdit){ + String passwordSalt = userBL.getSaltPassword(password,null); + selectedUser.setPassword(passwordSalt); + }else{ + if(!password.equals("")){ + String passwordSalt = userBL.getSaltPassword(password,null); + selectedUser.setPassword(passwordSalt); + } + } + + // set company by logged user, or use sended by superadmin + Company company = selectedUser.getCompany(); + if(company == null){ + UserLoginBean me = BeanManager.getUser(); + selectedUser.setCompany(me.getCompany()); + } + + userBL.saveOrUpdateUser(selectedUser); + UserListBean userList = BeanManager.getUserList(); + return userList.prepareListOfUsers(); + } + + return result; } + /** + * Stores new User into DB and forwards to ListOfUsers UC. + * @return + */ + public String saveUser() { + return saveOrUpdateUser(false); + } + /** * Stores updated User into DB and forwards to ListOfUsers UC. * @return */ public String updateUser() { - userBL.saveOrUpdateUser(selectedUser); - return "listOfUsers"; + return saveOrUpdateUser(true); } @@ -218,4 +289,20 @@ } return null; } + + public boolean isUpdatingProfile() { + return updatingProfile; + } + + public void setUpdatingProfile(boolean updatingProfile) { + this.updatingProfile = updatingProfile; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } } Modified: trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/user/UserLoginBean.java =================================================================== --- trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/user/UserLoginBean.java 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/user/UserLoginBean.java 2010-02-20 23:53:55 UTC (rev 1801) @@ -1,7 +1,7 @@ package cz.elvys.webServer.beans.user; import java.io.Serializable; -import java.util.List; +import java.util.Date; import java.util.TimeZone; import javax.faces.context.FacesContext; @@ -9,14 +9,10 @@ import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; -import org.hibernate.Query; -import org.hibernate.Session; -import org.hibernate.Transaction; import cz.elvys.commons.utils.CommonUtils; import cz.elvys.webServer.HIBgen.Company; import cz.elvys.webServer.HIBgen.User; -import cz.elvys.webServer.db.InitSessionFactory; import cz.elvys.webServer.toSpring.exception.ExecuteException; import cz.elvys.webServer.utils.faces.MessageUtils; import cz.elvys.webServer.utils.type.ValidationMessageHolder; @@ -33,8 +29,7 @@ private static final long serialVersionUID = 8092026699388193893L; // messages - private static final String LOGGED_IN = "User logged in: "; - private static final String TOO_MANY_USERS_FOUND = "Too many users with same credentials found in DB: "; + private static final String LOGGED_IN = "User logged in: "; private static final String NOT_FOUND = "User not found in DB: "; private static final String ERROR_WHILE_READING_USER = "Erro while reading user from DB."; @@ -199,14 +194,47 @@ String whatToReturn = null; // check the result of search for user if(user!=null){ + // we have selected user by usernam, try to compare password + boolean isAuthorized = false; + + // user is selected, check password - if(!userBL.comparePassword(formPassword, user.getPassword())){ - // user is disabled - whatToReturn = "failure"; - ValidationMessageHolder holder = MessageUtils.prepareValidationMessageHolder( - "LoginForm:UsernameField", "login.bad"); - MessageUtils.processValidationMessage(holder); + if(userBL.comparePassword(formPassword, user.getPassword())){ + isAuthorized = true; }else{ + // try temporary password + if(user.getLostPassword() != null){ + // there is save temporary password, try to compare them and check time validity + Long timeValidity = user.getLostPasswdTime().getTime(); + Long today = (new Date()).getTime(); + if(timeValidity<today){ + // temporary password is expired + whatToReturn = "failure"; + ValidationMessageHolder holder = MessageUtils.prepareValidationMessageHolder( + "LoginForm:UsernameField", "login.temporaryPassExpired"); + MessageUtils.processValidationMessage(holder); + }else{ + if(formPassword.equals(user.getLostPassword())){ + isAuthorized = true; + }else{ + // user is disabled + whatToReturn = "failure"; + ValidationMessageHolder holder = MessageUtils.prepareValidationMessageHolder( + "LoginForm:UsernameField", "login.bad"); + MessageUtils.processValidationMessage(holder); + } + } + + }else{ + // user is disabled + whatToReturn = "failure"; + ValidationMessageHolder holder = MessageUtils.prepareValidationMessageHolder( + "LoginForm:UsernameField", "login.bad"); + MessageUtils.processValidationMessage(holder); + } + } + + if(isAuthorized){ whatToReturn = "success"; if (!user.isDisabled()) { loggedIn = true; Modified: trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/user/UserLostPasswordBean.java =================================================================== --- trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/user/UserLostPasswordBean.java 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/JavaSource/cz/elvys/webServer/beans/user/UserLostPasswordBean.java 2010-02-20 23:53:55 UTC (rev 1801) @@ -1,28 +1,21 @@ package cz.elvys.webServer.beans.user; import java.io.Serializable; -import java.util.List; -import java.util.TimeZone; +import java.util.Date; +import javax.faces.application.FacesMessage; import javax.faces.context.FacesContext; import javax.servlet.ServletRequest; -import javax.servlet.http.HttpSession; import org.apache.log4j.Logger; -import org.hibernate.Query; -import org.hibernate.Session; -import org.hibernate.Transaction; import cz.elvys.commons.utils.CommonUtils; -import cz.elvys.webServer.HIBgen.Company; import cz.elvys.webServer.HIBgen.User; -import cz.elvys.webServer.db.InitSessionFactory; import cz.elvys.webServer.toSpring.exception.ExecuteException; import cz.elvys.webServer.utils.faces.MessageUtils; import cz.elvys.webServer.utils.type.ValidationMessageHolder; import elvys.server.bl.Fact; import elvys.server.bl.user.UserBL; -import elvys.server.bl.user.UserBLImpl; public class UserLostPasswordBean implements Serializable { // fields @@ -30,7 +23,109 @@ // const private static final long serialVersionUID = 8092026699388193893L; + private static final int PASSWORD_RANDOM_DEFAULT_LENGTH = 8; // messages + private static final String ERROR_WHILE_READING_USER = "Erro while reading user from DB for send lost password."; + + private UserBL userBL; + private boolean openLostPassword; + + private String loginInput; + + public UserLostPasswordBean(){ + userBL = Fact.getUserBL(); + openLostPassword = false; + loginInput = null; + } + + /** + * Compares bean's property username/password with database entries. <br/> + * This method is called on user's login form is sent. + * + * @return + */ + public String lostPassword() { + openLostPassword = true; + // verify password + if (loginInput == null || loginInput.length() == 0) { + ValidationMessageHolder holder = MessageUtils.prepareValidationMessageHolder( + "LostPasswordForm:LoginInputField", "login.lostPassword.EmptyUsername"); + MessageUtils.processValidationMessage(holder); + return "failure"; + } + + // prepare info about remote host + ServletRequest req = (ServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); + String ip = req.getRemoteAddr(); + String host = req.getRemoteHost(); + + User user = null; + + // password and username are filled, run authorization + try { + user = userBL.getUserByUserNameMakeSession(loginInput); + } catch (ExecuteException e) { + // TODO Auto-generated catch block + String message = CommonUtils.prepareErrorMessage(ERROR_WHILE_READING_USER, "user", loginInput, "ip", ip, "host", host); + log.error(message); + } + + if(user == null){ + // proper user hasn't been found in DB + ValidationMessageHolder holder = MessageUtils.prepareValidationMessageHolder( + "LostPasswordForm:LoginInputField", "login.lostPassword.UserNotExists"); + MessageUtils.processValidationMessage(holder); + return "failure"; + }else{ + // we have selected user from db, try to generate and send email + + // create temporary password for user + String password = userBL.generateRandomString(PASSWORD_RANDOM_DEFAULT_LENGTH); + user.setLostPassword(password); + + // set temporary password availability + Date tomorrow = new Date((new Date()).getTime()+1000*60*60*24); + user.setLostPasswdTime(tomorrow); + + // save user + userBL.saveOrUpdateUser(user); + + // create email + String to = user.getEmail(); + String subject = "Subject"; // login.lostPassword.Email.Subject @TODOD ziskat z messages + String body = "cast1" + " heslo:" + password + "cast2"; // login.lostPassword.Email.Body1, login.lostPassword.Email.Body2 + + if(!userBL.sendMail(to,subject,body)){ + // proper user hasn't been found in DB + ValidationMessageHolder holder = MessageUtils.prepareValidationMessageHolder( + "LostPasswordForm:LoginInputField", "login.lostPassword.Email.NotSend"); + MessageUtils.processValidationMessage(holder); + return "failure"; + }else{ + // proper user hasn't been found in DB + ValidationMessageHolder holder = MessageUtils.prepareValidationMessageHolder( + "LostPasswordForm:LoginInputField", "login.lostPassword.Email.SuccessfullySend"); + MessageUtils.processValidationMessage(holder); + return "failure"; + } + } + } + public boolean isOpenLostPassword() { + return openLostPassword; + } + + public void setOpenLostPassword(boolean openLostPassword) { + this.openLostPassword = openLostPassword; + } + + public String getLoginInput() { + return loginInput; + } + + public void setLoginInput(String loginInput) { + this.loginInput = loginInput; + } + } Modified: trunk/server/webServer2/JavaSource/cz/elvys/webServer/messages/labels_cs.properties =================================================================== --- trunk/server/webServer2/JavaSource/cz/elvys/webServer/messages/labels_cs.properties 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/JavaSource/cz/elvys/webServer/messages/labels_cs.properties 2010-02-20 23:53:55 UTC (rev 1801) @@ -18,6 +18,9 @@ login.reconnect=Byli jste odhl\u00E1\u0161eni. P\u0159ihla\u0161te se pros\u00EDm znovu. login.createdby=\u00A9 2009 SECO Music s.r.o. +login.lostPassword=Zapomn\u011bli jste heslo? Klikn\u011bte zde, porad\u00edme V\u00e1m. +login.lostPassword.infoMessage=Vypl\u0148te pros\u00edm Va\u0161e u\u017eivatelsk\u00e9 jm\u00e9no. Na V\u00e1\u0161 email bude automaticky odesl\u00e1n email s dal\u0161\u00edmi pokyny. +login.lostPassword.Send=Odeslat email @@ -30,6 +33,7 @@ template.menu.user=U\u017Eivatel template.menu.user.list=Seznam u\u017Eivatel\u016F template.menu.user.new=Nov\u00FD u\u017Eivatel +template.menu.user.update=Upravit profil template.menu.layout=Rozvr\u017Een\u00ED template.menu.layout.list=Seznam rozvr\u017Een\u00ED template.menu.layout.create=Nov\u00E9 rozvr\u017Een\u00ED Modified: trunk/server/webServer2/JavaSource/cz/elvys/webServer/messages/messages_cs.properties =================================================================== --- trunk/server/webServer2/JavaSource/cz/elvys/webServer/messages/messages_cs.properties 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/JavaSource/cz/elvys/webServer/messages/messages_cs.properties 2010-02-20 23:53:55 UTC (rev 1801) @@ -1,8 +1,20 @@ company.form.duplicitename=Jm\u00E9no spole\u010Dnosti "{0}" ji\u017E existuje. user.form.badPasswordAgain=\u0160patn\u011B zopakovan\u00E9 heslo. +user.form.loginAlreadyExists=Uveden\u00e9 u\u017eivatelsk\u00e9 jm\u00e9no se ji\u017e v datab\u00e1zi nach\u00e1z\u00ed, uve\u010fte pros\u00edm jin\u00e9 +user.form.setCorrectEmail=Zadejte pros\u00edm email ve spr\u00e1vn\u00e9m tvaru. +user.form.emptyPassword=Vypl\u0148te pros\u00edm heslo +login.lostPassword.UserNotExists=Litujeme, ale zasl\u00e1n\u00ed emailu se nezda\u0159ilo, zkontrolujte pros\u00edm u\u017eivatelsk\u00e9 jm\u00e9no. +login.lostPassword.EmptyUsername=Vypl\u0148te pros\u00edm u\u017eivatelsk\u00e9 jm\u00e9no +login.lostPassword.Email.Subject=Do\u010dasn\u00e9 heslo ze syst\u00e9mu elvys.cz +login.lostPassword.Email.Body1=Dobr\u00fd den, \n\nze syst\u00e9mu elvys V\u00e1m bylo zasl\u00e1no do\u010dasn\u00e9 heslo pro p\u0159ihl\u00e1\u0161en\u00ed. Heslo je k pou\u017eit\u00ed 24 hodin od pod\u00e1n\u00ed \u017e\u00e1dost, proto je nutn\u00e9 si heslo po p\u0159\u00edhl\u00e1\u0161en\u00ed ihned zm\u011bnit.\n +login.lostPassword.Email.Body2=\nPokud jste ne\u017e\u00e1dali o zasl\u00e1n\u00ed nov\u00e9ho hesla, tuto zpr\u00e1vu pros\u00edm ignorujte.\n\nV\u00e1\u0161 t\u00fdm elvys.cz\n\n +login.lostPassword.Email.NotSend=Litujeme, ale email se nepoda\u0159ilo odeslat. Kontaktujte pros\u00edm spr\u00e1vce syst\u00e9mu. +login.lostPassword.Email.SuccessfullySend=Na email p\u0159i\u0159azen\u00fd k zadan\u00e9mu u\u017eivatelsk\u00e9mu jm\u00e9nu bylo odesl\u00e1no do\u010dasn\u00e9 heslo. login.bad=Neplatn\u00E9 p\u0159ihl\u00E1\u0161en\u00ED. Zkuste to pros\u00EDm znovu. +login.temporaryPassExpired=Platnost do\u010dasn\u00e9ho hesla vypr\u0161ela, nechte si zaslat nov\u00e9 do\u010dasn\u00e9 heslo. +login.temporaryPassWrong=Do\u010dasn\u00e9 heslo nesouhlas\u00ed, zkuste jej zadat znovu nebo si nechte zaslat nov\u00e9. elvys.list.modal.nightmode.badtime=\u010Cas mus\u00ED b\u00FDt ve form\u00E1tu\: "HH\:mm". Modified: trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/stats/StatsCTRLImpl.java =================================================================== --- trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/stats/StatsCTRLImpl.java 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/SpringSource/cz/elvys/webServer/toSpring/stats/StatsCTRLImpl.java 2010-02-20 23:53:55 UTC (rev 1801) @@ -17,6 +17,7 @@ import cz.elvys.webServer.db.InitSessionFactory; import cz.elvys.webServer.toSpring.stats.helper.AnyChartXMLHandler; import cz.elvys.webServer.utils.faces.BeanManager; +import cz.elvys.webServer.utils.faces.MessageUtils; /** * @author Jirka @@ -600,9 +601,9 @@ } this.xmlFile.setTitle(chartTitle); this.xmlFile.setChartType(this.chartType); - this.xmlFile.setTitleX(BeanManager.getLabel("stats.show.labelx") + " " + BeanManager.getLabel("stats.show.date.from") + " " - + this.getDateFromOutputFormat() + " " + BeanManager.getLabel("stats.show.date.to") + " " + this.getDateToOutputFormat()); - this.xmlFile.setTitleY(BeanManager.getLabel("stats.show.labely")); + this.xmlFile.setTitleX(MessageUtils.getLabel("stats.show.labelx") + " " + MessageUtils.getLabel("stats.show.date.from") + " " + + this.getDateFromOutputFormat() + " " + MessageUtils.getLabel("stats.show.date.to") + " " + this.getDateToOutputFormat()); + this.xmlFile.setTitleY(MessageUtils.getLabel("stats.show.labely")); this.xmlFileContent = this.xmlFile.generateXMLFile(this.dateFrom, this.dateTo, screenName, this.selectedObjectId); return true; Modified: trunk/server/webServer2/WebContent/WEB-INF/faces-beans.xml =================================================================== --- trunk/server/webServer2/WebContent/WEB-INF/faces-beans.xml 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/WebContent/WEB-INF/faces-beans.xml 2010-02-20 23:53:55 UTC (rev 1801) @@ -19,6 +19,11 @@ <managed-bean-scope>session</managed-bean-scope> </managed-bean> <managed-bean> + <managed-bean-name>userLostPasswordBean</managed-bean-name> + <managed-bean-class>cz.elvys.webServer.beans.user.UserLostPasswordBean</managed-bean-class> + <managed-bean-scope>session</managed-bean-scope> + </managed-bean> + <managed-bean> <managed-bean-name>fileListBean</managed-bean-name> <managed-bean-class>cz.elvys.webServer.beans.filerel.FileListBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> Modified: trunk/server/webServer2/WebContent/login_body.xhtml =================================================================== --- trunk/server/webServer2/WebContent/login_body.xhtml 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/WebContent/login_body.xhtml 2010-02-20 23:53:55 UTC (rev 1801) @@ -45,6 +45,23 @@ </h:panelGrid> </h:form> <h:outputText value="${lbl['login.createdby']}" styleClass="loginFootnote" /> + + <rich:simpleTogglePanel switchType="ajax" label="${lbl['login.lostPassword']}" opened="#{userLostPasswordBean.openLostPassword}" styleClass="loginLostPassword"> + ${lbl['login.lostPassword.infoMessage']} + <h:form id="LostPasswordForm"> + <h:outputLabel for="UserLostPasswordField"> + <h:outputText value="${lbl['login.username']}" styleClass="lostPasswordUserName" />: + </h:outputLabel> + <h:inputText value="#{userLostPasswordBean.loginInput}" id="LoginInputField" styleClass="lostPasswordInputUserName"/> + + <h:commandButton value="${lbl['login.lostPassword.Send']}" + immediate="false" action="#{userLostPasswordBean.lostPassword}" + rendered="true" /><br/> + + <h:message id="LostPassswordMessage" for="LoginInputField" styleClass="lostPasswordErrorMessage"/> + </h:form> + </rich:simpleTogglePanel> + </rich:panel> </f:view> Modified: trunk/server/webServer2/WebContent/secured/components/label.xhtml =================================================================== --- trunk/server/webServer2/WebContent/secured/components/label.xhtml 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/WebContent/secured/components/label.xhtml 2010-02-20 23:53:55 UTC (rev 1801) @@ -18,6 +18,8 @@ | tooltip of the component | -important: | shows asterisk(*) before label when important + | -rendered: + | whether component is rendered or not.. EXTEND POINTS (not working?): @@ -30,7 +32,7 @@ inputPart --> - <h:panelGroup id="#{id}_label_area"> + <h:panelGroup id="#{id}_label_area" rendered="#{ (empty rendered) ? true : rendered }"> <!-- label --> <h:panelGroup> <ui:insert name="labelPre"/> Modified: trunk/server/webServer2/WebContent/secured/userrel/editUserForm.xhtml =================================================================== --- trunk/server/webServer2/WebContent/secured/userrel/editUserForm.xhtml 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/WebContent/secured/userrel/editUserForm.xhtml 2010-02-20 23:53:55 UTC (rev 1801) @@ -14,16 +14,25 @@ </ui:define> <ui:define name="contentTitle"> - <h:outputText rendered="#{!userEditBean.updating}">#{lbl['user.edit.form.title.create']}</h:outputText> - <h:outputText rendered="#{userEditBean.updating}">#{lbl['user.edit.form.title.modify']}</h:outputText> + <h:outputText rendered="#{(!userEditBean.updating AND !userEditBean.updatingProfile)}">#{lbl['user.edit.form.title.create']}</h:outputText> + <h:outputText rendered="#{userEditBean.updating || userEditBean.updatingProfile}">#{lbl['user.edit.form.title.modify']}</h:outputText> </ui:define> <ui:define name="contentSubTitle"></ui:define> <ui:define name="contentBody"> <rich:panel> - <f:facet name="header">#{userEditBean.updating ? lbl['user.edit.form.title.modify'] : lbl['user.edit.form.title.create']}</f:facet> + <f:facet name="header">#{(userEditBean.updating || userEditBean.updatingProfile )? lbl['user.edit.form.title.modify'] : lbl['user.edit.form.title.create']}</f:facet> <h:form id="editUserForm"> <h:panelGrid columns="2"> + + <h:panelGroup rendered="#{!userEditBean.updatingProfile}"> + <elvys:label id="UserEditUsernameLabel" + label="#{lbl['user.edit.form.username']}"></elvys:label> + </h:panelGroup> + <h:panelGroup rendered="#{!userEditBean.updatingProfile}"> + <elvys:inputText2 id="usernameField" + value="#{userEditBean.selectedUser.username}" required="true" /> + </h:panelGroup> <elvys:label id="UserEditSurnameLabel" label="#{lbl['user.edit.form.surname']}"></elvys:label> @@ -45,41 +54,50 @@ <elvys:inputText2 id="phoneField" value="#{userEditBean.selectedUser.phone}" required="false" /> - - <elvys:label id="UserEditUsernameLabel" - label="#{lbl['user.edit.form.username']}"></elvys:label> - <elvys:inputText2 id="usernameField" - value="#{userEditBean.selectedUser.username}" required="true" /> - <elvys:label id="UserEditPassLabel" label="#{lbl['user.edit.form.password']}" - rendered="#{!userEditBean.updating}"></elvys:label> - + ></elvys:label> <h:panelGroup> <h:inputSecret id="password" - value="#{userEditBean.selectedUser.password}" required="true" - rendered="#{!userEditBean.updating}" + value="#{userEditBean.password}" required="#{!(userEditBean.updating || userEditBean.updatingProfile)}" errorStyle="border:1px solid red; color:red;" /> - <h:message for="password" styleClass="error" - rendered="#{!userEditBean.updating}" /> + <h:message for="password" styleClass="error"/> </h:panelGroup> <elvys:label id="UserEditPassagainLabel" label="#{lbl['user.edit.form.passwordagain']}" - rendered="#{!userEditBean.updating}"></elvys:label> - + ></elvys:label> <h:panelGroup> <h:inputSecret id="passwordAgain" - value="#{userEditBean.passwordAgain}" required="true" - rendered="#{!userEditBean.updating}" /> - <h:message for="passwordAgain" styleClass="error" - rendered="#{!userEditBean.updating}" /> + value="#{userEditBean.passwordAgain}" + required="#{!(userEditBean.updating || userEditBean.updatingProfile)}"/> + <h:message for="passwordAgain" styleClass="error" /> </h:panelGroup> + <h:panelGroup rendered="#{!userEditBean.updatingProfile}"> + <elvys:label id="UserEditRoleListLabel" + label="#{lbl['user.edit.form.rolelist']}" + tooltip="#{lbl['user.edit.form.rolelist.tooltip']}" + rendered="#{!userEditBean.updatingProfile}" + ></elvys:label> + </h:panelGroup> + <h:panelGroup rendered="#{!userEditBean.updatingProfile}"> + <h:selectOneListbox id="roleField" required="true" + value="#{userEditBean.selectedUser.role}" + size="#{userEditBean.sizeOfRolesToSelect >=3? 3 : userEditBean.sizeOfRolesToSelect}"> + <f:converter converterId="roleConverter" /> + <f:selectItems value="#{userEditBean.rolesToSelect}" /> + </h:selectOneListbox> + <h:message for="roleField" styleClass="error" /> + </h:panelGroup> - <elvys:label id="UserEditCompanyListLabel" - label="#{lbl['user.edit.form.companylist']}"></elvys:label> - <h:panelGroup> + + <h:panelGroup rendered="#{user.user.system}" > + <elvys:label id="UserEditCompanyListLabel" + label="#{lbl['user.edit.form.companylist']}" + rendered="#{user.user.system}"></elvys:label> + </h:panelGroup> + <h:panelGroup rendered="#{user.user.system}" > <h:selectOneListbox id="companyField" required="true" value="#{userEditBean.selectedUser.company}" size="#{userEditBean.sizeOfCompaniesToSelect >=3? 3 : userEditBean.sizeOfCompaniesToSelect}"> @@ -88,28 +106,15 @@ </h:selectOneListbox> <h:message for="companyField" styleClass="error" /> </h:panelGroup> - - <elvys:label id="UserEditRoleListLabel" - label="#{lbl['user.edit.form.rolelist']}" - tooltip="#{lbl['user.edit.form.rolelist.tooltip']}"></elvys:label> - <h:panelGroup> - <h:selectOneListbox id="roleField" required="true" - value="#{userEditBean.selectedUser.role}" - size="#{userEditBean.sizeOfRolesToSelect >=3? 3 : userEditBean.sizeOfRolesToSelect}"> - <f:converter converterId="roleConverter" /> - <f:selectItems value="#{userEditBean.rolesToSelect}" /> - </h:selectOneListbox> - <h:message for="roleField" styleClass="error" /> - </h:panelGroup> - + </h:panelGrid> <!-- OK BUTTON --> <h:commandButton value="#{lbl['user.edit.form.button.ok']}" - action="#{userEditBean.saveUser}" rendered="#{!userEditBean.updating}" /> + action="#{userEditBean.saveUser}" rendered="#{!(userEditBean.updating || userEditBean.updatingProfile)}" /> <!-- MODIFY BUTTON --> <h:commandButton value="#{lbl['user.edit.form.button.modify']}" - action="#{userEditBean.updateUser}" rendered="#{userEditBean.updating}" /> + action="#{userEditBean.updateUser}" rendered="#{(userEditBean.updating || userEditBean.updatingProfile)}" /> <!-- CANCEL BUTTON --> <h:commandButton value="#{lbl['user.edit.form.button.cancel']}" immediate="true" action="#{usersBean.prepareListOfUsers}" Modified: trunk/server/webServer2/WebContent/secured/userrel/listOfUsers.xhtml =================================================================== --- trunk/server/webServer2/WebContent/secured/userrel/listOfUsers.xhtml 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/WebContent/secured/userrel/listOfUsers.xhtml 2010-02-20 23:53:55 UTC (rev 1801) @@ -93,7 +93,12 @@ <div class="list-operations-main"> <div class="list-operations-item"> <a4j:commandButton id="EditUser" image="/images/icons/edit.png" - action="#{userEditBean.prepareUpdateUserForm}"> + action="#{userEditBean.prepareUpdateUserForm}" + rendered="#{( + (user.compStr eq 'admin' and user_iterator.role.role eq 'user') || + (user.compStr eq 'superadmin') + )}" + > <f:setPropertyActionListener value="#{user_iterator}" target="#{userEditBean.selectedUser}" /> <f:setPropertyActionListener value="${true}" @@ -109,9 +114,8 @@ <div class="list-operations-item"> <a4j:commandButton id="DeleteUser" rendered="#{user.user.id!=user_iterator.id and !user_iterator.system and ( - (user.compStr == 'admin' and user_iterator.role.role == 'user') || - (user.compStr == 'superadmin' and user_iterator.role.role == 'admin') || - (user.compStr == 'superadmin' and user_iterator.role.role == 'user') + (user.compStr eq 'admin' and user_iterator.role.role eq 'user') || + (user.compStr eq 'superadmin') )}" reRender="DeleteUserModalContent" oncomplete="Richfaces.showModalPanel('DeleteUserModal',{left:300, top:300})" Modified: trunk/server/webServer2/WebContent/styles/login_body.css =================================================================== --- trunk/server/webServer2/WebContent/styles/login_body.css 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/WebContent/styles/login_body.css 2010-02-20 23:53:55 UTC (rev 1801) @@ -144,4 +144,21 @@ width: 210px; background-color: red; border: 1px solid black; +} + +.loginLostPassword { + left:170px; + top:340px; + width:410px; + position:absolute; +} + +.lostPasswordErrorMessage { + color:#FF0000; + font-weight:bold; + text-align:center; +} + +.lostPasswordUserName { + font-weight:bold; } \ No newline at end of file Modified: trunk/server/webServer2/WebContent/template/elvys-template.xhtml =================================================================== --- trunk/server/webServer2/WebContent/template/elvys-template.xhtml 2010-02-19 19:01:30 UTC (rev 1800) +++ trunk/server/webServer2/WebContent/template/elvys-template.xhtml 2010-02-20 23:53:55 UTC (rev 1801) @@ -50,11 +50,17 @@ <f:setPropertyActionListener value="${false}" target="#{companiesBean.updating}" /> </rich:menuItem> </rich:dropDownMenu> - <rich:dropDownMenu id="UserMenu" value="#{lbl['template.menu.user']}" disabled="#{user.compStr eq 'user'}"> - <rich:menuItem id="ListOfUsers" value="#{lbl['template.menu.user.list']}" action="#{usersBean.prepareListOfUsers}" submitMode="server"/> - <rich:menuItem id="NewUser" value="#{lbl['template.menu.user.new']}" action="#{userEditBean.prepareCreateUserForm}" submitMode="server"> + <rich:dropDownMenu id="UserMenu" value="#{lbl['template.menu.user']}" > + <rich:menuItem id="ListOfUsers" value="#{lbl['template.menu.user.list']}" action="#{usersBean.prepareListOfUsers}" submitMode="server" render="#{!(user.compStr eq 'user')}"/> + <rich:menuItem id="NewUser" value="#{lbl['template.menu.user.new']}" action="#{userEditBean.prepareCreateUserForm}" submitMode="server" render="#{!(user.compStr eq 'user')}"> <f:setPropertyActionListener value="${false}" target="#{userEditBean.updating}" /> + <f:setPropertyActionListener value="${false}" target="#{userEditBean.updatingProfile}" /> </rich:menuItem> + <rich:menuItem id="EditUser" value="#{lbl['template.menu.user.update']}" action="#{userEditBean.prepareUpdateUserForm}" submitMode="server"> + <f:setPropertyActionListener value="${true}" target="#{userEditBean.updatingProfile}" /> + <f:setPropertyActionListener value="${false}" target="#{userEditBean.updating}" /> + <f:setPropertyActionListener value="#{user.user}" target="#{userEditBean.selectedUser}" /> + </rich:menuItem> </rich:dropDownMenu> <rich:dropDownMenu id="LayoutMenu" value="#{lbl['template.menu.layout']}" disabled="false">