[Suiviobsmer-commits] r184 - in trunk: . suiviobsmer-business suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock suiviobsmer-business/src/main/resources suiviobsmer-business/src/main/xmi suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/component
Author: fdesbois Date: 2010-01-12 10:42:35 +0000 (Tue, 12 Jan 2010) New Revision: 184 Added: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/MD5.java trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/components/Layout.properties Modified: trunk/pom.xml trunk/suiviobsmer-business/pom.xml trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerBusinessException.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerContext.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceUserImpl.java trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceUserMock.java trunk/suiviobsmer-business/src/main/resources/SuiviObsmer.properties trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImplTest.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/components/FeedBack.java trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/components/Layout.java trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/components/Layout.tml trunk/suiviobsmer-ui/src/main/webapp/Administration.tml trunk/suiviobsmer-ui/src/main/webapp/css/main.css Log: - Evol #1972 : send email when create a user - Improve errors for connexion + add MD5 encoding Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/pom.xml 2010-01-12 10:42:35 UTC (rev 184) @@ -41,6 +41,11 @@ <version>1.8.0</version> </dependency> <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-email</artifactId> + <version>1.2</version> + </dependency> + <dependency> <groupId>org.nuiton</groupId> <artifactId>nuiton-utils</artifactId> <version>${nuitonutils.version}</version> Modified: trunk/suiviobsmer-business/pom.xml =================================================================== --- trunk/suiviobsmer-business/pom.xml 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-business/pom.xml 2010-01-12 10:42:35 UTC (rev 184) @@ -27,6 +27,10 @@ <artifactId>commons-io</artifactId> </dependency> <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-email</artifactId> + </dependency> + <dependency> <groupId>org.nuiton</groupId> <artifactId>nuiton-utils</artifactId> </dependency> Added: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/MD5.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/MD5.java (rev 0) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/MD5.java 2010-01-12 10:42:35 UTC (rev 184) @@ -0,0 +1,59 @@ +/* *##% Pollen + * Copyright (C) 2009 CodeLutin + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. ##%*/ + +package fr.ifremer.suiviobsmer; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * Classe utilitaire permettant d'encoder des chaîne en MD5. + * + * @version $Id$ + */ +public class MD5 { + + /** + * Encode la chaine passé en paramètre avec l’algorithme MD5 + * + * @param key : la chaine à encoder + * @return la valeur (string) hexadécimale sur 32 bits + */ + public static String encode(String key) { + + byte[] uniqueKey = key.getBytes(); + byte[] hash = null; + + try { + // on récupère un objet qui permettra de crypter la chaine + hash = MessageDigest.getInstance("MD5").digest(uniqueKey); + } catch (NoSuchAlgorithmException e) { + throw new Error("no MD5 support in this VM"); + } + + StringBuffer hashString = new StringBuffer(); + for (int i = 0; i < hash.length; ++i) { + String hex = Integer.toHexString(hash[i]); + if (hex.length() == 1) { + hashString.append("0"); + hashString.append(hex.charAt(hex.length() - 1)); + } else { + hashString.append(hex.substring(hex.length() - 2)); + } + } + return hashString.toString(); + } +} Property changes on: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/MD5.java ___________________________________________________________________ Added: svn:keywords + "Author Date Id Revision HeadURL" Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerBusinessException.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerBusinessException.java 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerBusinessException.java 2010-01-12 10:42:35 UTC (rev 184) @@ -52,7 +52,7 @@ } public static enum Type { - IMPORT_ERROR, SELECT_PROBLEM, NOT_EXISTS; + IMPORT_ERROR, SELECT_PROBLEM, NOT_EXISTS, OTHER, CONNECTION; } public Type getType() { Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerContext.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerContext.java 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/SuiviObsmerContext.java 2010-01-12 10:42:35 UTC (rev 184) @@ -25,9 +25,10 @@ import java.util.Date; import java.util.Properties; -import java.util.Random; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.StringUtils; +import org.apache.commons.mail.EmailException; +import org.apache.commons.mail.SimpleEmail; import org.hibernate.exception.SQLGrammarException; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaContextFactory; @@ -54,6 +55,9 @@ private static final Logger log = LoggerFactory.getLogger(SuiviObsmerContext.class); public static final String PROP_FILENAME_LOG_ACTIVITY = "suiviobsmer.log.activityCalendar"; + public static final String PROP_EMAIL_HOST = "suiviobsmer.email.host"; + public static final String PROP_EMAIL_PORT = "suiviobsmer.email.port"; + public static final String PROP_EMAIL_FROM = "suiviobsmer.email.from"; private static SuiviObsmerRunner runner; @@ -140,7 +144,7 @@ } public static String encodeString(String string) { - return string; + return MD5.encode(string); } public static String convertId(String topiaId) { @@ -161,4 +165,16 @@ } return false; } + + public static void sendEmail(String to, String subject, String msg) throws EmailException { + SimpleEmail email = new SimpleEmail(); + email.setHostName(getProperty(PROP_EMAIL_HOST)); + email.setSmtpPort(Integer.parseInt(getProperty(PROP_EMAIL_PORT))); + email.setFrom(getProperty(PROP_EMAIL_FROM)); + email.addTo(to); + email.setSubject(subject); + email.setMsg(msg); + email.setCharset("UTF-8"); + email.send(); + } } Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceUserImpl.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceUserImpl.java 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/impl/ServiceUserImpl.java 2010-01-12 10:42:35 UTC (rev 184) @@ -21,6 +21,8 @@ package fr.ifremer.suiviobsmer.impl; +import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException; +import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException.Type; import fr.ifremer.suiviobsmer.SuiviObsmerException; import fr.ifremer.suiviobsmer.SuiviObsmerModelDAOHelper; import fr.ifremer.suiviobsmer.SuiviObsmerContext; @@ -65,18 +67,17 @@ UserDAO dao = SuiviObsmerModelDAOHelper.getUserDAO(transaction); - user = dao.findByProperties(User.LOGIN, login, User.PASSWORD, password); + String passwordEncoded = SuiviObsmerContext.encodeString(password); + user = dao.findByProperties(User.LOGIN, login, User.PASSWORD, passwordEncoded); if (user != null) { // load company entity user.getCompany(); + } else { + throw new SuiviObsmerBusinessException(Type.CONNECTION, this.getClass(), + "Identifiant ou mot de passe incorrects, veuillez réessayer."); } - /*if (user == null) { - * // FIXME test instanceof dans SuiviObsmerUtils.serviceException - throw new SuiviObsmerExceptionConnection("Login et/ou password incorrects, veuillez réessayer" ou mail ?) - }*/ - transaction.closeContext(); } catch (Exception eee) { SuiviObsmerContext.serviceException(transaction, "Une erreur est survenue lors de la demande de connexion", eee); @@ -85,6 +86,49 @@ } @Override + public void forgetPassword(String login) throws SuiviObsmerException { + TopiaContext transaction = null; + try { + if (!login.contains("@")) { + throw new SuiviObsmerBusinessException(Type.OTHER, this.getClass(), "Votre identifiant n'est pas un email valide, " + + "veuillez contacter un administrateur pour qu'il puisse changer votre mot de passe."); + } + + transaction = rootContext.beginTransaction(); + + UserDAO dao = SuiviObsmerModelDAOHelper.getUserDAO(transaction); + + User user = dao.findByLogin(login); + if (user == null) { + throw new SuiviObsmerBusinessException(Type.NOT_EXISTS, this.getClass(), + "L'email '" + login + "' n'est pas référencé dans l'application."); + } + + String password = SuiviObsmerContext.createRandomString(8); + String passwordEncoded = SuiviObsmerContext.encodeString(password); + user.setPassword(passwordEncoded); + + String subject = "[WAO] Mot de passe oublié"; + String msg = "Bonjour,\n\n" + + "\tUn nouveau mot de passe a été généré pour votre identifiant " + login + " :\n" + + "\t\t - mot de passe = " + password + "\n\n" + + "Vous pouvez modifier votre password en accédant à la page de gestion de votre profile utilisateur.\n\n" + + "Cordialement,\n\n" + + "L'Equipe WAO"; + + SuiviObsmerContext.sendEmail(user.getLogin(), subject, msg); + if (log.isDebugEnabled()) { + log.debug("send email to : " + user.getLogin()); + } + + transaction.commitTransaction(); + transaction.closeContext(); + } catch (Exception eee) { + SuiviObsmerContext.serviceException(transaction, "Impossible de créer ou de mettre à jour l'utilisateur", eee); + } + } + + @Override public void createUpdateUser(User user, boolean generatePassword) throws SuiviObsmerException { TopiaContext transaction = null; try { @@ -94,21 +138,38 @@ transaction = rootContext.beginTransaction(); + String password = user.getPassword(); + if (generatePassword) { - String random = SuiviObsmerContext.createRandomString(8); - String password = SuiviObsmerContext.encodeString(random); + password = SuiviObsmerContext.createRandomString(8); if (log.isDebugEnabled()) { - log.debug("show password : " + random); - } - user.setPassword(password); + log.debug("show password : " + password); + } } + + String passwordEncoded = SuiviObsmerContext.encodeString(password); + user.setPassword(passwordEncoded); UserDAO dao = SuiviObsmerModelDAOHelper.getUserDAO(transaction); - SuiviObsmerContext.prepareTopiaId(User.class, user); + boolean newUser = SuiviObsmerContext.prepareTopiaId(User.class, user); dao.update(user); - // TODO send mail to user.getLogin() if contains @ + if (newUser && user.getLogin().contains("@")) { + String subject = "[WAO] Création de votre compte"; + String msg = "Bonjour,\n\n" + + "\tVous avez été inscris sur le site WAO : Web Applicatif Obsmer. Vos identifiants de connexion sont :\n" + + "\t\t - identifiant = " + user.getLogin() + "\n" + + "\t\t - mot de passe = " + password + "\n\n" + + "Vous pouvez modifier votre mot de passe en accédant à la page de gestion de votre profile utilisateur.\n\n" + + "Cordialement,\n\n" + + "L'Equipe WAO"; + + SuiviObsmerContext.sendEmail(user.getLogin(), subject, msg); + if (log.isDebugEnabled()) { + log.debug("send email to : " + user.getLogin()); + } + } transaction.commitTransaction(); transaction.closeContext(); Modified: trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceUserMock.java =================================================================== --- trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceUserMock.java 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-business/src/main/java/fr/ifremer/suiviobsmer/mock/ServiceUserMock.java 2010-01-12 10:42:35 UTC (rev 184) @@ -145,4 +145,9 @@ jean.setCompany(company); return company; } + + @Override + public void forgetPassword(String login) throws SuiviObsmerException { + throw new UnsupportedOperationException("Not supported yet."); + } } Modified: trunk/suiviobsmer-business/src/main/resources/SuiviObsmer.properties =================================================================== --- trunk/suiviobsmer-business/src/main/resources/SuiviObsmer.properties 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-business/src/main/resources/SuiviObsmer.properties 2010-01-12 10:42:35 UTC (rev 184) @@ -10,4 +10,7 @@ suiviobsmer.log.activityCalendar=log/activity.log - +# Config for sending Email +suiviobsmer.email.host=smtp.free.fr +suiviobsmer.email.port=25 +suiviobsmer.email.from=admin at suiviobsmer.org Modified: trunk/suiviobsmer-business/src/main/xmi/suiviobsmer.zargo =================================================================== (Binary files differ) Modified: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java =================================================================== --- trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/entity/BoatImplTest.java 2010-01-12 10:42:35 UTC (rev 184) @@ -98,6 +98,7 @@ company.setName("TARTANPION"); serviceUser.createUpdateCompany(company); User user = new UserImpl(); + user.setLogin("user"); user.setFirstName("Jean"); user.setLastName("Michmuche"); user.setCompany(company); Modified: trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImplTest.java =================================================================== --- trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImplTest.java 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-business/src/test/java/fr/ifremer/suiviobsmer/impl/ServiceBoatImplTest.java 2010-01-12 10:42:35 UTC (rev 184) @@ -117,6 +117,7 @@ company.setName("TARTANPION"); serviceUser.createUpdateCompany(company); User user = new UserImpl(); + user.setLogin("login"); user.setFirstName("Jean"); user.setLastName("Michmuche"); user.setCompany(company); @@ -261,6 +262,7 @@ company.setName("TARTANPION"); serviceUser.createUpdateCompany(company); User user = new UserImpl(); + user.setLogin("user"); user.setFirstName("Jean"); user.setLastName("Michmuche"); user.setCompany(company); Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/components/FeedBack.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/components/FeedBack.java 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/components/FeedBack.java 2010-01-12 10:42:35 UTC (rev 184) @@ -55,6 +55,8 @@ /** Messages d'info */ private List<String> infoMessages; + private boolean hasErrors; + @Inject private ComponentResources _resources; @@ -67,6 +69,7 @@ // Rendu des messages d'erreur et vidage de la collection if (!errorMessages.isEmpty()) { + hasErrors = true; writer.element("div", "class", "fb-error"); for (String message : errorMessages) { writer.write(message); @@ -117,4 +120,8 @@ errorMessages.add(message); } } + + public boolean hasErrors() { + return hasErrors; + } } Modified: trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/components/Layout.java =================================================================== --- trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/components/Layout.java 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-ui/src/main/java/fr/ifremer/suiviobsmer/ui/components/Layout.java 2010-01-12 10:42:35 UTC (rev 184) @@ -21,6 +21,7 @@ package fr.ifremer.suiviobsmer.ui.components; +import fr.ifremer.suiviobsmer.SuiviObsmerBusinessException; import fr.ifremer.suiviobsmer.SuiviObsmerException; import fr.ifremer.suiviobsmer.entity.User; import fr.ifremer.suiviobsmer.services.ServiceUser; @@ -31,11 +32,11 @@ import org.apache.tapestry5.annotations.InjectContainer; import org.apache.tapestry5.annotations.Log; import org.apache.tapestry5.annotations.Parameter; +import org.apache.tapestry5.annotations.Persist; import org.apache.tapestry5.annotations.Property; import org.apache.tapestry5.annotations.SessionState; import org.apache.tapestry5.ioc.annotations.Inject; import org.apache.tapestry5.services.Request; -import org.apache.tapestry5.services.Session; import org.slf4j.Logger; /** @@ -107,6 +108,9 @@ @Property private String password; + @Property + private String email; + public String getPageTitle() { return this.pageTitle; } @@ -159,20 +163,27 @@ } @Log - Object onSuccessFromConnexionForm() { + Object onSuccessFromConnexionForm() throws SuiviObsmerException { try { - User userForm = serviceUser.connect(login, password); - if (userForm != null) { - currentUser = userForm; - } else { - connexionFeedback.addError("Erreur de connexion, identifiant ou mot de passe incorrect !"); - } - } catch (SuiviObsmerException eee) { - // db error, others, ... + currentUser = serviceUser.connect(login, password); + } catch (SuiviObsmerBusinessException eee) { + connexionFeedback.addError(eee.getMessage()); } return null; } + public boolean hasConnexionErrors() { + return connexionFeedback.hasErrors(); + } + void onSuccessFromForgetPassword() throws SuiviObsmerException { + try { + serviceUser.forgetPassword(email); + connexionFeedback.addInfo("Un email avec votre nouveau mot de passe vous a été envoyé."); + } catch (SuiviObsmerBusinessException eee) { + connexionFeedback.addError(eee.getMessage()); + } + } + @Log Object onActionFromExit() { setCurrentUser(null); Added: trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/components/Layout.properties =================================================================== --- trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/components/Layout.properties (rev 0) +++ trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/components/Layout.properties 2010-01-12 10:42:35 UTC (rev 184) @@ -0,0 +1,3 @@ +login-label: Identifiant +password-label: Mot de passe +email-label: Votre identifiant \ No newline at end of file Modified: trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/components/Layout.tml =================================================================== --- trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/components/Layout.tml 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-ui/src/main/resources/fr/ifremer/suiviobsmer/ui/components/Layout.tml 2010-01-12 10:42:35 UTC (rev 184) @@ -68,6 +68,14 @@ <p:else> <div id="so-connexion-feedback"> <t:feedback t:id="connexionFeedback" /> + <t:if t:test="hasConnexionErrors()"> + <form t:type="form" t:id="forgetPassword"> + <strong>Mot de passe oublié ?</strong> + <t:label t:for="email" /> : + <input t:type="textfield" t:id="email" value="email" /> + <input class="ico accept" t:type="submit" value="Go" title="Envoyez moi un nouveau mot de passe" /> + </form> + </t:if> </div> <div class="clearfix" id="so-connexion"> <form t:id="connexionForm" t:type="form"> Modified: trunk/suiviobsmer-ui/src/main/webapp/Administration.tml =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/Administration.tml 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-ui/src/main/webapp/Administration.tml 2010-01-12 10:42:35 UTC (rev 184) @@ -43,6 +43,10 @@ <fieldset class="user-form clearfix"> <form t:type="beaneditform" class="clearfix" t:id="user" t:include="firstName, lastName, login, password, phoneNumber, admin, active"> + <p:login> + <t:label t:for="login" /> + <input t:type="textfield" t:id="login" value="user.login" t:validate="required" /> + </p:login> <p:password> <t:label t:for="generatePassword" /> <input t:type="checkbox" t:id="generatePassword" value="generatePassword" /> Modified: trunk/suiviobsmer-ui/src/main/webapp/css/main.css =================================================================== --- trunk/suiviobsmer-ui/src/main/webapp/css/main.css 2010-01-11 17:32:18 UTC (rev 183) +++ trunk/suiviobsmer-ui/src/main/webapp/css/main.css 2010-01-12 10:42:35 UTC (rev 184) @@ -39,6 +39,7 @@ width: 60%; margin-left: auto; margin-right: auto; + text-align: center; } div#so-connexion {
participants (1)
-
fdesbois@users.labs.libre-entreprise.org