This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository coselmar. See http://git.codelutin.com/coselmar.git commit 908e1799a2cc2a65d4cdb01eab7e87b64e62fc29 Author: Yannick Martel <martel@©odelutin.com> Date: Wed Jan 28 15:15:20 2015 +0100 add rest services to generate new password and send it by mail --- ...erAccountCreatedMail.java => AbstractMail.java} | 33 ++-------------- ...countCreatedMail.java => LostPasswordMail.java} | 46 +++------------------- .../coselmar/beans/UserAccountCreatedMail.java | 40 +------------------ .../coselmar/services/v1/UsersWebService.java | 39 +++++++++++++++--- .../main/resources/mail/LostPasswordMail.mustache | 13 ++++++ .../resources/mail/LostPasswordMail_fr.mustache | 13 ++++++ coselmar-rest/src/main/resources/mapping | 1 + .../coselmar/services/UsersWebServiceTest.java | 23 +++++++++++ 8 files changed, 94 insertions(+), 114 deletions(-) diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/UserAccountCreatedMail.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/AbstractMail.java similarity index 65% copy from coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/UserAccountCreatedMail.java copy to coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/AbstractMail.java index 8282746..7d96ab0 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/UserAccountCreatedMail.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/AbstractMail.java @@ -26,26 +26,21 @@ package fr.ifremer.coselmar.beans; import java.util.Locale; -import com.google.common.base.Strings; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; -import org.nuiton.i18n.I18n; /** * @author ymartel <martel@codelutin.com> */ -public class UserAccountCreatedMail { +public abstract class AbstractMail { protected Locale locale; protected String to; - private UserBean user; - private String coselmarUrl; - private String password; - public UserAccountCreatedMail(Locale locale) { + public AbstractMail(Locale locale) { this.locale = locale; } @@ -61,13 +56,7 @@ public class UserAccountCreatedMail { this.to = mail; } - public String getSubject() { - String fullname = Strings.nullToEmpty(user.getFirstName()) + " " + Strings.nullToEmpty(user.getName()); - if (StringUtils.isBlank(fullname)) { - return I18n.l(locale, "coselmar.service.mail.UserAccountCreatedMail.subject", user.getMail()); - } - return I18n.l(locale, "coselmar.service.mail.UserAccountCreatedMail.subject", fullname); - } + abstract public String getSubject(); @Override public String toString() { @@ -79,14 +68,6 @@ public class UserAccountCreatedMail { return isRecipientProvided; } - public UserBean getUser() { - return user; - } - - public void setUser(UserBean user) { - this.user = user; - } - public String getCoselmarUrl() { return coselmarUrl; } @@ -94,12 +75,4 @@ public class UserAccountCreatedMail { public void setCoselmarUrl(String coselmarUrl) { this.coselmarUrl = coselmarUrl; } - - public String getPassword () { - return password; - } - - public void setPassword (String password) { - this.password = password; - } } diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/UserAccountCreatedMail.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/LostPasswordMail.java similarity index 58% copy from coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/UserAccountCreatedMail.java copy to coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/LostPasswordMail.java index 8282746..5665653 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/UserAccountCreatedMail.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/LostPasswordMail.java @@ -28,55 +28,27 @@ import java.util.Locale; import com.google.common.base.Strings; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.nuiton.i18n.I18n; /** * @author ymartel <martel@codelutin.com> */ -public class UserAccountCreatedMail { - - protected Locale locale; - - protected String to; +public class LostPasswordMail extends AbstractMail { private UserBean user; - private String coselmarUrl; private String password; - public UserAccountCreatedMail(Locale locale) { - this.locale = locale; - } - - public Locale getLocale() { - return locale; - } - - public String getTo() { - return to; - } - - public void setTo(String mail) { - this.to = mail; + public LostPasswordMail(Locale locale) { + super(locale); } public String getSubject() { String fullname = Strings.nullToEmpty(user.getFirstName()) + " " + Strings.nullToEmpty(user.getName()); if (StringUtils.isBlank(fullname)) { - return I18n.l(locale, "coselmar.service.mail.UserAccountCreatedMail.subject", user.getMail()); + return I18n.l(locale, "coselmar.service.mail.LostPasswordMail.subject", user.getMail()); } - return I18n.l(locale, "coselmar.service.mail.UserAccountCreatedMail.subject", fullname); - } - - @Override - public String toString() { - return ReflectionToStringBuilder.toString(this); - } - - public boolean isRecipientProvided() { - boolean isRecipientProvided = StringUtils.isNotBlank(this.to); - return isRecipientProvided; + return I18n.l(locale, "coselmar.service.mail.LostPasswordMail.subject", fullname); } public UserBean getUser() { @@ -87,14 +59,6 @@ public class UserAccountCreatedMail { this.user = user; } - public String getCoselmarUrl() { - return coselmarUrl; - } - - public void setCoselmarUrl(String coselmarUrl) { - this.coselmarUrl = coselmarUrl; - } - public String getPassword () { return password; } diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/UserAccountCreatedMail.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/UserAccountCreatedMail.java index 8282746..a810c30 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/UserAccountCreatedMail.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/beans/UserAccountCreatedMail.java @@ -28,37 +28,19 @@ import java.util.Locale; import com.google.common.base.Strings; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import org.nuiton.i18n.I18n; /** * @author ymartel <martel@codelutin.com> */ -public class UserAccountCreatedMail { - - protected Locale locale; - - protected String to; +public class UserAccountCreatedMail extends AbstractMail { private UserBean user; - private String coselmarUrl; private String password; public UserAccountCreatedMail(Locale locale) { - this.locale = locale; - } - - public Locale getLocale() { - return locale; - } - - public String getTo() { - return to; - } - - public void setTo(String mail) { - this.to = mail; + super(locale); } public String getSubject() { @@ -69,16 +51,6 @@ public class UserAccountCreatedMail { return I18n.l(locale, "coselmar.service.mail.UserAccountCreatedMail.subject", fullname); } - @Override - public String toString() { - return ReflectionToStringBuilder.toString(this); - } - - public boolean isRecipientProvided() { - boolean isRecipientProvided = StringUtils.isNotBlank(this.to); - return isRecipientProvided; - } - public UserBean getUser() { return user; } @@ -87,14 +59,6 @@ public class UserAccountCreatedMail { this.user = user; } - public String getCoselmarUrl() { - return coselmarUrl; - } - - public void setCoselmarUrl(String coselmarUrl) { - this.coselmarUrl = coselmarUrl; - } - public String getPassword () { return password; } diff --git a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/UsersWebService.java b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/UsersWebService.java index bcf59fa..99f73f7 100644 --- a/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/UsersWebService.java +++ b/coselmar-rest/src/main/java/fr/ifremer/coselmar/services/v1/UsersWebService.java @@ -38,17 +38,19 @@ import com.github.mustachejava.Mustache; import com.github.mustachejava.MustacheException; import com.github.mustachejava.MustacheFactory; import com.google.common.base.Preconditions; +import fr.ifremer.coselmar.beans.AbstractMail; +import fr.ifremer.coselmar.beans.LostPasswordMail; import fr.ifremer.coselmar.beans.UserAccountCreatedMail; import fr.ifremer.coselmar.beans.UserBean; import fr.ifremer.coselmar.beans.UserSearchBean; import fr.ifremer.coselmar.beans.UserWebToken; +import fr.ifremer.coselmar.config.CoselmarServicesConfig; import fr.ifremer.coselmar.converter.BeanEntityConverter; +import fr.ifremer.coselmar.exceptions.CoselmarTechnicalException; import fr.ifremer.coselmar.persistence.SearchRequestBean; import fr.ifremer.coselmar.persistence.entity.CoselmarUser; import fr.ifremer.coselmar.persistence.entity.CoselmarUserRole; -import fr.ifremer.coselmar.exceptions.CoselmarTechnicalException; import fr.ifremer.coselmar.services.CoselmarWebServiceSupport; -import fr.ifremer.coselmar.config.CoselmarServicesConfig; import fr.ifremer.coselmar.services.errors.InvalidCredentialException; import fr.ifremer.coselmar.services.errors.UnauthorizedException; import org.apache.commons.io.Charsets; @@ -369,6 +371,33 @@ public class UsersWebService extends CoselmarWebServiceSupport { commit(); } + public void generateNewPassword(String userMail) { + // Retrieve user + CoselmarUser user = getCoselmarUserDao().forMailEquals(userMail).findUnique(); + + // create new password + String password = getServicesContext().generatePassword(); + + // Salt it, encode it ! + String salt = getServicesContext().generateSalt(); + String encodedPassword = getServicesContext().encodePassword(salt, password); + user.setPassword(encodedPassword); + user.setSalt(salt); + + // commit, and send mail ! + commit(); + + LostPasswordMail lostPasswordMail = new LostPasswordMail(getServicesContext().getLocale()); + String shortId = getPersistenceContext().getTopiaIdFactory().getRandomPart(user.getTopiaId()); + UserBean userBean = BeanEntityConverter.toBean(shortId, user); + lostPasswordMail.setUser(userBean); + lostPasswordMail.setPassword(password); + lostPasswordMail.setTo(user.getMail()); + + sendMail(lostPasswordMail); + + } + ///////////////////////////////////////////// ///////////// Internal Part ///////// ///////////////////////////////////////////// @@ -416,7 +445,7 @@ public class UsersWebService extends CoselmarWebServiceSupport { /////////////// MAIL PART /////////////// ///////////////////////////////////////////// - protected void sendMail(UserAccountCreatedMail mail) { + protected void sendMail(AbstractMail mail) { if (getCoselmarServicesConfig().isDevMode()) { @@ -464,7 +493,7 @@ public class UsersWebService extends CoselmarWebServiceSupport { } } - protected String getBody(UserAccountCreatedMail mail) { + protected String getBody(AbstractMail mail) { Mustache mustache = getMustache(mail); StringWriter stringWriter = new StringWriter(); @@ -473,7 +502,7 @@ public class UsersWebService extends CoselmarWebServiceSupport { return stringWriter.toString(); } - protected Mustache getMustache(UserAccountCreatedMail mail) { + protected Mustache getMustache(AbstractMail mail) { MustacheFactory mustacheFactory = new DefaultMustacheFactory("mail/"); Locale locale = mail.getLocale(); diff --git a/coselmar-rest/src/main/resources/mail/LostPasswordMail.mustache b/coselmar-rest/src/main/resources/mail/LostPasswordMail.mustache new file mode 100644 index 0000000..15f319c --- /dev/null +++ b/coselmar-rest/src/main/resources/mail/LostPasswordMail.mustache @@ -0,0 +1,13 @@ +Dear {{user.name}}, + +A new password have been requested for you on the application. Please find below a new password to connect on Coselmar Platform : + +Password: {{password}} + +You can now change it from the Profile page in the application. + +Regards, + +Team Coselmar Platform. + +<a href="{{coselmarUrl}}">Coselmar Platform</a>. \ No newline at end of file diff --git a/coselmar-rest/src/main/resources/mail/LostPasswordMail_fr.mustache b/coselmar-rest/src/main/resources/mail/LostPasswordMail_fr.mustache new file mode 100644 index 0000000..1832e11 --- /dev/null +++ b/coselmar-rest/src/main/resources/mail/LostPasswordMail_fr.mustache @@ -0,0 +1,13 @@ +Bonjour {{user.name}}, + +Suite à votre demande, un nouveau mot de passe a été généré : + +Password: {{password}} + +Vous pouvez le modifier depuis la page Profil de votre compte. + +Cordialement, + +L'équipe Coselmar Plateforme. + +<a href="{{coselmarUrl}}">Coselmar Plateforme</a>. \ No newline at end of file diff --git a/coselmar-rest/src/main/resources/mapping b/coselmar-rest/src/main/resources/mapping index 6fc2c64..f0fd0df 100644 --- a/coselmar-rest/src/main/resources/mapping +++ b/coselmar-rest/src/main/resources/mapping @@ -45,6 +45,7 @@ DELETE /v1/documents/{documentId} DocumentsWebService.deleteDocume GET /v1/users UsersWebService.getUsers GET /v1/users/{userId} UsersWebService.getUser POST /v1/users/login UsersWebService.login +POST /v1/users/password UsersWebService.generateNewPassword POST /v1/users/{userId} UsersWebService.modifyUser POST /v1/users UsersWebService.addUser DELETE /v1/users/{userId} UsersWebService.deleteUser diff --git a/coselmar-rest/src/test/java/fr/ifremer/coselmar/services/UsersWebServiceTest.java b/coselmar-rest/src/test/java/fr/ifremer/coselmar/services/UsersWebServiceTest.java index 7658d48..23ac5de 100644 --- a/coselmar-rest/src/test/java/fr/ifremer/coselmar/services/UsersWebServiceTest.java +++ b/coselmar-rest/src/test/java/fr/ifremer/coselmar/services/UsersWebServiceTest.java @@ -31,6 +31,7 @@ import com.auth0.jwt.JWTVerifier; import com.google.gson.Gson; import org.apache.commons.codec.binary.Base64; import org.apache.http.HttpResponse; +import org.apache.http.StatusLine; import org.apache.http.client.fluent.Request; import org.apache.http.client.fluent.Response; import org.junit.Assert; @@ -118,4 +119,26 @@ public class UsersWebServiceTest extends AbstractCoselmarWebServiceTest { String token = newUserLoginMap.get("jwt"); jwtVerifier.verify(token); } + + @Test + public void testGenerateNewPassword() throws Exception { + + Request newPasswordRequest = createRequest("/v1/users/password") + .addParameter("userMail", "lambda.expert@temporary.coselmar") + .Post(); + + Response newPasswordResponse = newPasswordRequest.execute(); + Assert.assertEquals(200, newPasswordResponse.returnResponse().getStatusLine().getStatusCode()); + + // Try log now + Request loginRequest = createRequest("/v1/users/login") + .addParameter("mail", "lambda.expert@temporary.coselmar") + .addParameter("password", "manager1234") + .Post(); + + Response loginResponse = loginRequest.execute(); + StatusLine loginStatusLine = loginResponse.returnResponse().getStatusLine(); + Assert.assertEquals(401, loginStatusLine.getStatusCode()); + + } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.