branch feature/pollen-riot-js updated (c9359ff -> 5337f63)
This is an automated email from the git hooks/post-receive script. New change to branch feature/pollen-riot-js in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git from c9359ff Review security and use now cookies to store authentication informations new b858f7c Amélioration tests new 5337f63 Add resendValidation backend + use now cookies to manage auth cache The 2 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 5337f63ca66326d246e6ed9d58d9166f11ac69e7 Author: Tony CHEMIT <dev@tchemit.fr> Date: Sun Jan 15 18:48:22 2017 +0100 Add resendValidation backend + use now cookies to manage auth cache commit b858f7ca73a813af53e2298a262094ef077d4e86 Author: Tony CHEMIT <dev@tchemit.fr> Date: Sun Jan 15 15:20:10 2017 +0100 Amélioration tests Summary of changes: .../org/chorem/pollen/rest/api/v1/AuthApi.java | 10 ++++ .../chorem/pollen/rest/api/v1/PollenUserApi.java | 1 + pollen-rest-api/src/main/resources/mapping | 1 + pollen-rest-api/src/main/webapp/WEB-INF/web.xml | 43 +++++++++++++++ .../org/chorem/pollen/rest/api/AuthApiTest.java | 10 ++-- .../org/chorem/pollen/rest/api/PollApiTest.java | 26 ++++----- .../chorem/pollen/rest/api/PollenUserApiTest.java | 62 +++++++++++----------- .../chorem/pollen/rest/api/RestApiFixtures.java | 43 +++++++++++++++ .../services/service/NotificationService.java | 11 ++++ .../pollen/services/service/PollenUserService.java | 22 +++++++- .../pollen/services/service/mail/EmailService.java | 14 +++++ ...reatedEmail.java => ResendValidationEmail.java} | 16 ++---- .../services/service/security/SecurityService.java | 4 ++ ...ail.mustache => ResendValidationEmail.mustache} | 4 +- ....mustache => ResendValidationEmail_fr.mustache} | 3 -- .../i18n/pollen-services_en_GB.properties | 1 + .../i18n/pollen-services_fr_FR.properties | 1 + pollen-ui-riot-js/src/main/web/i18n.json | 14 +++++ pollen-ui-riot-js/src/main/web/js/AuthService.js | 6 +-- pollen-ui-riot-js/src/main/web/js/FetchService.js | 4 ++ pollen-ui-riot-js/src/main/web/js/PollForm.js | 3 +- pollen-ui-riot-js/src/main/web/tag/SignCheck.tag | 25 ++++----- pollen-ui-riot-js/src/main/web/tag/SignUp.tag | 8 ++- 23 files changed, 242 insertions(+), 90 deletions(-) create mode 100644 pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/RestApiFixtures.java copy pollen-services/src/main/java/org/chorem/pollen/services/service/mail/{UserAccountCreatedEmail.java => ResendValidationEmail.java} (77%) copy pollen-services/src/main/resources/email/{UserAccountCreatedEmail.mustache => ResendValidationEmail.mustache} (76%) copy pollen-services/src/main/resources/email/{UserAccountCreatedEmail_fr.mustache => ResendValidationEmail_fr.mustache} (77%) -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/pollen-riot-js in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit b858f7ca73a813af53e2298a262094ef077d4e86 Author: Tony CHEMIT <dev@tchemit.fr> Date: Sun Jan 15 15:20:10 2017 +0100 Amélioration tests --- .../org/chorem/pollen/rest/api/AuthApiTest.java | 10 ++-- .../org/chorem/pollen/rest/api/PollApiTest.java | 26 ++++----- .../chorem/pollen/rest/api/PollenUserApiTest.java | 62 +++++++++++----------- .../chorem/pollen/rest/api/RestApiFixtures.java | 43 +++++++++++++++ 4 files changed, 92 insertions(+), 49 deletions(-) diff --git a/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/AuthApiTest.java b/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/AuthApiTest.java index 30122af..c409fbd 100644 --- a/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/AuthApiTest.java +++ b/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/AuthApiTest.java @@ -45,7 +45,7 @@ public class AuthApiTest extends AbstractPollenRestApiTest { @Test public void login() throws URISyntaxException, IOException { - Request request = createRequest("/v1/login") + Request request = createRequest(RestApiFixtures.login()) .addParameter("login", "admin@pollen.org") .addParameter("password", "admin") .Post(); @@ -59,7 +59,7 @@ public class AuthApiTest extends AbstractPollenRestApiTest { @Test public void loginThenLogout() throws URISyntaxException, IOException { - Request login = createRequest("/v1/login") + Request login = createRequest(RestApiFixtures.login()) .addParameter("login", "admin@pollen.org") .addParameter("password", "admin") .Post(); @@ -73,7 +73,7 @@ public class AuthApiTest extends AbstractPollenRestApiTest { PollenEntityRef createBeanRef = getJsonHelper().fromJson(loginContent, type); - Request logout = createRequest("/v1/logout").Get(); + Request logout = createRequest(RestApiFixtures.logout()).Get(); logout.addHeader(PollenRestApiRequestFilter.REQUEST_HEADER_SESSION_TOKEN, createBeanRef.getPermission()); String logoutContent = logout.execute().returnContent().asString(); @@ -85,7 +85,7 @@ public class AuthApiTest extends AbstractPollenRestApiTest { @Test public void badLogin() throws URISyntaxException, IOException { - Request request = createRequest("/v1/login") + Request request = createRequest(RestApiFixtures.login()) .addParameter("login", "admin@pollen.org" + System.nanoTime()) .addParameter("password", "admin" + System.nanoTime()) .Post(); @@ -99,7 +99,7 @@ public class AuthApiTest extends AbstractPollenRestApiTest { @Test public void badPassword() throws URISyntaxException, IOException { - Request request = createRequest("/v1/login") + Request request = createRequest(RestApiFixtures.login()) .addParameter("login", "admin@pollen.org") .addParameter("password", "admin" + System.nanoTime()) .Post(); diff --git a/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java b/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java index e66ec99..480c2ee 100644 --- a/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java +++ b/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollApiTest.java @@ -60,7 +60,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { @Test public void getPollsNew() throws URISyntaxException, IOException { - Request request = createRequest("/v1/polls/new").Get(); + Request request = createRequest(RestApiFixtures.polls("new", null)).Get(); String content = request.execute().returnContent().asString(); showTestResult(content); assertNotNull(content); @@ -71,7 +71,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { public void getPolls() throws URISyntaxException, IOException { //TODO Login as admin before - Request request = createRequest("/v1/polls").Get(); + Request request = createRequest(RestApiFixtures.polls(null, null)).Get(); String content = request.execute().returnContent().asString(); showTestResult(content); assertNotNull(content); @@ -80,7 +80,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { @Ignore @Test public void getPollsCreated() throws URISyntaxException, IOException { - Request request = createRequest("/v1/polls/created").Get(); + Request request = createRequest(RestApiFixtures.polls("created", null)).Get(); String content = request.execute().returnContent().asString(); showTestResult(content); assertNotNull(content); @@ -89,7 +89,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { @Ignore @Test public void getPollsInvited() throws URISyntaxException, IOException { - Request request = createRequest("/v1/polls/invited").Get(); + Request request = createRequest(RestApiFixtures.polls("invited", null)).Get(); String content = request.execute().returnContent().asString(); showTestResult(content); assertNotNull(content); @@ -98,7 +98,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { @Ignore @Test public void getPollsParticipated() throws URISyntaxException, IOException { - Request request = createRequest("/v1/polls/participated").Get(); + Request request = createRequest(RestApiFixtures.polls("participated", null)).Get(); String content = request.execute().returnContent().asString(); showTestResult(content); assertNotNull(content); @@ -109,7 +109,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { Poll poll = fixture(PollenFixtures.POLL_NORMAL_ID); String pollId = encodeId(poll.getTopiaId()); - Request request = createRequest("/v1/polls/" + pollId).Get(); + Request request = createRequest(RestApiFixtures.polls(pollId, null)).Get(); String content = request.execute().returnContent().asString(); showTestResult(content); assertNotNull(content); @@ -140,7 +140,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { String choiceStr = getJsonHelper().toJson(choices); String pollStr = getJsonHelper().toJson(poll); - Request request = createRequest("/v1/polls") + Request request = createRequest(RestApiFixtures.polls(null, null)) .addParameter("poll", pollStr) .addParameter("choices", choiceStr) .Post(); @@ -167,7 +167,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { String choiceStr = getJsonHelper().toJson(choices); String pollStr = getJsonHelper().toJson(poll); - Request request = createRequest("/v1/polls") + Request request = createRequest(RestApiFixtures.polls(null, null)) .addParameter("poll", pollStr) .addParameter("choices", choiceStr) .Post(); @@ -183,7 +183,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { public void putPoll() throws URISyntaxException, IOException { Poll poll = fixture(PollenFixtures.POLL_NORMAL_ID); String pollId = poll.getTopiaId(); - Request request = createRequest("/v1/polls/" + pollId).Put(); + Request request = createRequest(RestApiFixtures.polls(pollId, null)).Put(); String content = request.execute().returnContent().asString(); showTestResult(content); assertNotNull(content); @@ -193,7 +193,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { public void deletePoll() throws URISyntaxException, IOException { Poll poll = fixture(PollenFixtures.POLL_NORMAL_ID); String pollId = encodeId(poll.getTopiaId()); - Request request = createRequest("/v1/polls/" + pollId) + Request request = createRequest(RestApiFixtures.polls(pollId, null)) .addParameter(PollenRestApiRequestFilter.REQUEST_PERMISSION_PARAMETER, poll.getCreator().getPermission().getToken()) .Delete(); String content = request.execute().returnContent().asString(); @@ -206,7 +206,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { public void clonePoll() throws URISyntaxException, IOException { Poll poll = fixture(PollenFixtures.POLL_NORMAL_ID); String pollId = encodeId(poll.getTopiaId()); - Request request = createRequest("/v1/polls/" + pollId).Post(); + Request request = createRequest(RestApiFixtures.polls(pollId, null)).Post(); String content = request.execute().returnContent().asString(); showTestResult(content); assertNotNull(content); @@ -217,7 +217,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { public void exportPoll() throws URISyntaxException, IOException { Poll poll = fixture(PollenFixtures.POLL_NORMAL_ID); String pollId = encodeId(poll.getTopiaId()); - Request request = createRequest("/v1/polls/" + pollId + "/export").Get(); + Request request = createRequest(RestApiFixtures.polls(pollId, "export")).Get(); String content = request.execute().returnContent().asString(); showTestResult(content); assertNotNull(content); @@ -228,7 +228,7 @@ public class PollApiTest extends AbstractPollenRestApiTest { public void closePoll() throws URISyntaxException, IOException { Poll poll = fixture(PollenFixtures.POLL_NORMAL_ID); String pollId = encodeId(poll.getTopiaId()); - Request request = createRequest("/v1/polls/" + pollId + "/close").Post(); + Request request = createRequest(RestApiFixtures.polls(pollId, "close")).Post(); String content = request.execute().returnContent().asString(); showTestResult(content); assertNotNull(content); diff --git a/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollenUserApiTest.java b/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollenUserApiTest.java index 8199e2f..7f6ff76 100644 --- a/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollenUserApiTest.java +++ b/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/PollenUserApiTest.java @@ -50,35 +50,12 @@ public class PollenUserApiTest extends AbstractPollenRestApiTest { loadFixtures("fixtures"); } - protected String login(String login, String password) throws URISyntaxException, IOException { - - Request loginRequest = createRequest("/v1/login") - .addParameter("login", login) - .addParameter("password", password) - .Post(); - - String loginContent = loginRequest.execute().returnContent().asString(); - showTestResult(loginContent); - - Type type = new TypeToken<PollenEntityRef<PollenUser>>() { - }.getType(); - - PollenEntityRef<PollenUser> createBeanRef = getJsonHelper().fromJson(loginContent, type); - Assert.assertNotNull(createBeanRef); - Assert.assertNotNull(createBeanRef.getEntityId()); - Assert.assertNotNull(createBeanRef.getReducedId()); - Assert.assertNotNull(createBeanRef.getPermission()); - - return createBeanRef.getPermission(); - - } - @Test public void getUsers() throws Exception { - String sessionToken = login("admin@pollen.org", "admin"); + String sessionToken = login(); - Request request = createRequest("/v1/users").Get(); + Request request = createRequest(RestApiFixtures.users(null, null)).Get(); request.addHeader(PollenRestApiRequestFilter.REQUEST_HEADER_SESSION_TOKEN, sessionToken); String content = request.execute().returnContent().asString(); showTestResult(content); @@ -89,11 +66,11 @@ public class PollenUserApiTest extends AbstractPollenRestApiTest { @Test public void getUser() throws Exception { - String sessionToken = login("admin@pollen.org", "admin"); + String sessionToken = login(); PollenUser pollenUser = fixture("user_jean"); String userId = encodeId(pollenUser.getTopiaId()); - Request request = createRequest("/v1/users/" + userId).Get(); + Request request = createRequest(RestApiFixtures.users(userId, null)).Get(); request.addHeader(PollenRestApiRequestFilter.REQUEST_HEADER_SESSION_TOKEN, sessionToken); String content = request.execute().returnContent().asString(); showTestResult(content); @@ -106,7 +83,7 @@ public class PollenUserApiTest extends AbstractPollenRestApiTest { @Test public void postUser() throws Exception { - Request request = createRequest("/v1/users").Post(); + Request request = createRequest(RestApiFixtures.users(null, null)).Post(); String content = request.execute().returnContent().asString(); showTestResult(content); assertTrue(content.contains("email2")); @@ -119,7 +96,7 @@ public class PollenUserApiTest extends AbstractPollenRestApiTest { PollenUser pollenUser = fixture("user_jean"); String userId = pollenUser.getTopiaId(); - Request request = createRequest("/v1/users/" + userId).Get(); + Request request = createRequest(RestApiFixtures.users(userId, null)).Get(); String content = request.execute().returnContent().asString(); showTestResult(content); assertTrue(content.contains("email3")); @@ -132,7 +109,7 @@ public class PollenUserApiTest extends AbstractPollenRestApiTest { PollenUser pollenUser = fixture("user_jean"); String userId = encodeId(pollenUser.getTopiaId()); - Request request = createRequest("/v1/users/" + userId).Delete(); + Request request = createRequest(RestApiFixtures.users(userId, null)).Delete(); String content = request.execute().returnContent().asString(); showTestResult(content); assertTrue(content.contains("OK!")); @@ -146,9 +123,32 @@ public class PollenUserApiTest extends AbstractPollenRestApiTest { PollenUser pollenUser = fixture("user_jean"); String userId = encodeId(pollenUser.getTopiaId()); String token = ""; - Request request = createRequest("/v1/users/" + userId + "?token=" + token).Put(); + Request request = createRequest(RestApiFixtures.users(userId, token)).Put(); String content = request.execute().returnContent().asString(); showTestResult(content); assertTrue(content.contains("OK!")); } + + private String login() throws URISyntaxException, IOException { + + Request loginRequest = createRequest(RestApiFixtures.login()) + .addParameter("login", "admin@pollen.org") + .addParameter("password", "admin") + .Post(); + + String loginContent = loginRequest.execute().returnContent().asString(); + showTestResult(loginContent); + + Type type = new TypeToken<PollenEntityRef<PollenUser>>() { + }.getType(); + + PollenEntityRef<PollenUser> createBeanRef = getJsonHelper().fromJson(loginContent, type); + Assert.assertNotNull(createBeanRef); + Assert.assertNotNull(createBeanRef.getEntityId()); + Assert.assertNotNull(createBeanRef.getReducedId()); + Assert.assertNotNull(createBeanRef.getPermission()); + + return createBeanRef.getPermission(); + + } } diff --git a/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/RestApiFixtures.java b/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/RestApiFixtures.java new file mode 100644 index 0000000..d394893 --- /dev/null +++ b/pollen-rest-api/src/test/java/org/chorem/pollen/rest/api/RestApiFixtures.java @@ -0,0 +1,43 @@ +package org.chorem.pollen.rest.api; + +/** + * Created on 15/01/17. + * + * @author Tony Chemit - dev@tchemit.fr + * @since X + */ +public class RestApiFixtures { + + protected static final String LOGIN_API = "/v1/login2"; + protected static final String LOGOUT_API = "/v1/logout"; + protected static final String USERS_API = "/v1/users"; + protected static final String POLLS_API = "/v1/polls"; + + public static String login() { + return LOGIN_API; + } + + public static String users(String userId, String token) { + return api(USERS_API, userId, "?token=", token); + } + + public static String polls(String pollId, String token) { + return api(POLLS_API, pollId, "/", token); + } + + + public static String logout() { + return LOGOUT_API; + } + + private static String api(String api, String idOrAction, String tokenPrefix, String token) { + String result = api; + if (idOrAction != null) { + result += "/" + idOrAction; + } + if (token != null) { + result += tokenPrefix + token; + } + return result; + } +} -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/pollen-riot-js in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit 5337f63ca66326d246e6ed9d58d9166f11ac69e7 Author: Tony CHEMIT <dev@tchemit.fr> Date: Sun Jan 15 18:48:22 2017 +0100 Add resendValidation backend + use now cookies to manage auth cache --- .../org/chorem/pollen/rest/api/v1/AuthApi.java | 10 +++ .../chorem/pollen/rest/api/v1/PollenUserApi.java | 1 + pollen-rest-api/src/main/resources/mapping | 1 + pollen-rest-api/src/main/webapp/WEB-INF/web.xml | 43 ++++++++++++ .../services/service/NotificationService.java | 11 +++ .../pollen/services/service/PollenUserService.java | 22 +++++- .../pollen/services/service/mail/EmailService.java | 14 ++++ .../service/mail/ResendValidationEmail.java | 78 ++++++++++++++++++++++ .../services/service/security/SecurityService.java | 4 ++ .../resources/email/ResendValidationEmail.mustache | 8 +++ .../email/ResendValidationEmail_fr.mustache | 7 ++ .../i18n/pollen-services_en_GB.properties | 1 + .../i18n/pollen-services_fr_FR.properties | 1 + pollen-ui-riot-js/src/main/web/i18n.json | 14 ++++ pollen-ui-riot-js/src/main/web/js/AuthService.js | 6 +- pollen-ui-riot-js/src/main/web/js/FetchService.js | 4 ++ pollen-ui-riot-js/src/main/web/js/PollForm.js | 3 +- pollen-ui-riot-js/src/main/web/tag/SignCheck.tag | 25 +++---- pollen-ui-riot-js/src/main/web/tag/SignUp.tag | 8 ++- 19 files changed, 238 insertions(+), 23 deletions(-) diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java index 474b408..79f05c1 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java @@ -32,9 +32,11 @@ import org.chorem.pollen.persistence.entity.SessionToken; import org.chorem.pollen.persistence.entity.SessionTokenImpl; import org.chorem.pollen.rest.api.PollenRestApiRequestContext; import org.chorem.pollen.services.bean.PollenEntityRef; +import org.chorem.pollen.services.service.PollenUserService; import org.chorem.pollen.services.service.security.DefaultPollenSecurityContext; import org.chorem.pollen.services.service.security.MissingAuthenticationException; import org.chorem.pollen.services.service.security.PollenAuthenticationException; +import org.chorem.pollen.services.service.security.PollenInvalidEmailActivationTokenException; import org.chorem.pollen.services.service.security.PollenInvalidSessionTokenException; import org.chorem.pollen.services.service.security.SecurityService; import org.debux.webmotion.server.WebMotionController; @@ -100,4 +102,12 @@ public class AuthApi extends WebMotionController { securityService.lostPassword(login); } + + + public void resendValidation(PollenUserService pollenUserService, String login) { + + pollenUserService.resendValidation(login); + + } + } diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollenUserApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollenUserApi.java index 31790c3..2ae88d8 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollenUserApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollenUserApi.java @@ -28,6 +28,7 @@ import org.chorem.pollen.services.bean.PollenEntityId; import org.chorem.pollen.services.bean.PollenEntityRef; import org.chorem.pollen.services.bean.PollenUserBean; import org.chorem.pollen.services.service.InvalidFormException; +import org.chorem.pollen.services.service.NotificationService; import org.chorem.pollen.services.service.PollenUserService; import org.chorem.pollen.services.service.security.PollenInvalidEmailActivationTokenException; import org.debux.webmotion.server.WebMotionController; diff --git a/pollen-rest-api/src/main/resources/mapping b/pollen-rest-api/src/main/resources/mapping index 7ffb99e..e68db7b 100644 --- a/pollen-rest-api/src/main/resources/mapping +++ b/pollen-rest-api/src/main/resources/mapping @@ -57,6 +57,7 @@ POST,PUT /v1/login AuthApi.login POST,PUT /v1/login2 AuthApi.login2 GET /v1/lostpassword/{login} AuthApi.lostPassword GET /v1/logout AuthApi.logout +GET /v1/resendValidation/{login} AuthApi.resendValidation # ChoiceApi diff --git a/pollen-rest-api/src/main/webapp/WEB-INF/web.xml b/pollen-rest-api/src/main/webapp/WEB-INF/web.xml index 269ec67..45e02fa 100644 --- a/pollen-rest-api/src/main/webapp/WEB-INF/web.xml +++ b/pollen-rest-api/src/main/webapp/WEB-INF/web.xml @@ -73,4 +73,47 @@ <tracking-mode>COOKIE</tracking-mode> </session-config> + + <!-- Exception --> + <error-page> + <exception-type>java.lang.Exception</exception-type> + <location>/error</location> + </error-page> + + <!-- Bad Request --> + <error-page> + <error-code>400</error-code> + <location>/error</location> + </error-page> + + <!-- Unauthorized --> + <error-page> + <error-code>401</error-code> + <location>/error</location> + </error-page> + + <!-- Forbidden --> + <error-page> + <error-code>403</error-code> + <location>/error</location> + </error-page> + + <!-- Not Found --> + <error-page> + <error-code>404</error-code> + <location>/error</location> + </error-page> + + <!-- Request Time-out --> + <error-page> + <error-code>408</error-code> + <location>/error</location> + </error-page> + + <!-- Internal Server Error --> + <error-page> + <error-code>500</error-code> + <location>/error</location> + </error-page> + </web-app> diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java index bc6ed58..a5b7396 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/NotificationService.java @@ -31,6 +31,7 @@ import org.chorem.pollen.services.service.mail.EmailService; import org.chorem.pollen.services.service.mail.LostPasswordEmail; import org.chorem.pollen.services.service.mail.PollClosedEmail; import org.chorem.pollen.services.service.mail.PollCreatedEmail; +import org.chorem.pollen.services.service.mail.ResendValidationEmail; import org.chorem.pollen.services.service.mail.UserAccountCreatedEmail; /** @@ -52,6 +53,16 @@ public class NotificationService extends PollenServiceSupport { } + public void onResendValidation(PollenUser user) { + + EmailService emailService = getEmailService(); + ResendValidationEmail email = emailService.newUserResendValidationEmail(user); + + email.addTo(user.getEmail()); + emailService.send(email); + + } + public void onUserEdited(PollenUser user) { // TODO } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenUserService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenUserService.java index feccb7c..422302f 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenUserService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenUserService.java @@ -209,8 +209,7 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer } - public void validateUserEmail(String userId, - String token) throws PollenInvalidEmailActivationTokenException { + public void validateUserEmail(String userId, String token) throws PollenInvalidEmailActivationTokenException { checkNotNull(userId); checkNotNull(token); @@ -228,6 +227,23 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer } + public void resendValidation(String email) { + checkNotNull(email); + + PollenUser user = getPollenUserDao().forEmailEquals(email).findUniqueOrNull(); + if (user == null) { + return; + } + + if (user.getEmailActivationToken() == null) { + user.setEmailActivationToken(getSecurityService().generateNewToken()); + commit(); + } + + getNotificationService().onResendValidation(user); + + } + public void createDefaultUsers() throws InvalidFormException { if (getPollenUserDao().count() == 0) { @@ -240,6 +256,7 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer user.setAdministrator(true); user.setEmail("admin@pollen.org"); user.setPassword("admin"); + user.setName("admin"); listUser.add(user); @@ -248,6 +265,7 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer user.setAdministrator(false); user.setEmail("user@pollen.org"); user.setPassword("user"); + user.setName("user"); listUser.add(user); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java index 824b125..b426262 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/EmailService.java @@ -193,6 +193,20 @@ public class EmailService extends PollenServiceSupport { return email; } + public ResendValidationEmail newUserResendValidationEmail(PollenUser user) { + ResendValidationEmail email = new ResendValidationEmail(getLocale()); + email.setUser(user); + email.setPollenUrl(getPollenUIUrlRenderService().getPollenUrl()); + + PollenEntityId<PollenUser> userId = PollenEntityId.newId(PollenUser.class); + userId.setEntityId(user.getTopiaId()); + userId.encode(serviceContext.getTopiaApplicationContext().getTopiaIdFactory()); + + email.setValidateUrl(getPollenUIUrlRenderService().getUserValidateUrl(userId.getReducedId(), user.getEmailActivationToken().getToken())); + + return email; + } + public LostPasswordEmail newLostPasswordEmail(Locale locale, PollenUser user, String password) { LostPasswordEmail email = new LostPasswordEmail(locale); email.setUser(user); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ResendValidationEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ResendValidationEmail.java new file mode 100644 index 0000000..97de0fd --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/ResendValidationEmail.java @@ -0,0 +1,78 @@ +package org.chorem.pollen.services.service.mail; + +/* + * #%L + * Pollen :: Service + * %% + * Copyright (C) 2009 - 2017 Code Lutin, Tony Chemit + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * #L% + */ + +import org.chorem.pollen.persistence.entity.PollenUser; +import org.nuiton.i18n.I18n; + +import java.util.Locale; + +/** + * Created on 4/30/14. + * + * @author Tony Chemit - dev@tchemit.fr + * @since 2.0 + */ +public class ResendValidationEmail extends PollenMail { + + private PollenUser user; + + private String validateUrl; + private String pollenUrl; + + protected ResendValidationEmail(Locale locale) { + super(locale); + } + + @Override + public String getSubject() { + if (user.getName() == null) { + return I18n.l(locale, "pollen.service.mail.ResendValidationEmail.subject", user.getEmail()); + } + return I18n.l(locale, "pollen.service.mail.ResendValidationEmail.subject", user.getName()); + } + + public PollenUser getUser() { + return user; + } + + public void setUser(PollenUser user) { + this.user = user; + } + + public String getValidateUrl() { + return validateUrl; + } + + public void setValidateUrl(String validateUrl) { + this.validateUrl = validateUrl; + } + + public String getPollenUrl() { + return pollenUrl; + } + + public void setPollenUrl(String pollenUrl) { + this.pollenUrl = pollenUrl; + } + +} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java index b716e1a..f02929e 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/security/SecurityService.java @@ -330,6 +330,10 @@ public class SecurityService extends PollenServiceSupport { public void checkUserEmailValidation(PollenUser user, String emailToken) throws PollenInvalidEmailActivationTokenException { + if (user.getEmailActivationToken() == null) { + throw new PollenInvalidEmailActivationTokenException(); + } + boolean valid = Objects.equals(user.getEmailActivationToken().getToken(), emailToken); if (!valid) { diff --git a/pollen-services/src/main/resources/email/ResendValidationEmail.mustache b/pollen-services/src/main/resources/email/ResendValidationEmail.mustache new file mode 100644 index 0000000..4e4df8c --- /dev/null +++ b/pollen-services/src/main/resources/email/ResendValidationEmail.mustache @@ -0,0 +1,8 @@ +Welcome {{user.name}}, + + +You had just created an account on the web application Pollen. + +You must validate your email on this url: <a href="{{validateUrl}}">{{vaidateUrl}}</a> + +You can now manage your polls by logging on the <a href="{{pollenUrl}}">Pollen</a> website. \ No newline at end of file diff --git a/pollen-services/src/main/resources/email/ResendValidationEmail_fr.mustache b/pollen-services/src/main/resources/email/ResendValidationEmail_fr.mustache new file mode 100644 index 0000000..f8762cc --- /dev/null +++ b/pollen-services/src/main/resources/email/ResendValidationEmail_fr.mustache @@ -0,0 +1,7 @@ +Bonjour {{user.name}}, + +Vous venez de créer un compte sur l'application en ligne Pollen + +Vous devez valider votre courriel en allant sur cette adresse : <a href="{{validateUrl}}">{{vaidateUrl}}</a> + +Vous pouvez gérer vos sondages en vous connectant sur <a href="{{pollenUrl}}">Pollen</a>. \ No newline at end of file diff --git a/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties b/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties index a3475c4..05c2853 100644 --- a/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties +++ b/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties @@ -100,6 +100,7 @@ pollen.service.mail.PollCreatedEmail.subject=[Pollen] Poll creation (%s) pollen.service.mail.PollVotePeriodEndedEmail.subject=[Pollen] Vote period ended for poll %s pollen.service.mail.PollVotePeriodStartedEmail.subject=[Pollen] Vote period started for poll %s pollen.service.mail.PollVoteReminderEmail.subject=[Pollen] Reminder to vote on poll %s +pollen.service.mail.ResendValidationEmail.subject=[Pollen] Invitation to validate your account %s pollen.service.mail.RestrictedPollInvitationEmail.subject=[Pollen] Invitation to vote on poll %s pollen.service.mail.UserAccountCreatedEmail.subject=[Pollen] Confirmation of account creation %s pollen.service.mail.VoteAddedEmail.subject=[Pollen] A vote was added in poll %s diff --git a/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties b/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties index 4366d77..ebedd6e 100644 --- a/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties +++ b/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties @@ -99,6 +99,7 @@ pollen.service.mail.PollCreatedEmail.subject=[Pollen] Création du sondage %s pollen.service.mail.PollVotePeriodEndedEmail.subject=[Pollen] Période de vote terminée pour le sondage %s pollen.service.mail.PollVotePeriodStartedEmail.subject=[Pollen] Période de vote commencée pour le sondage %s pollen.service.mail.PollVoteReminderEmail.subject=[Pollen] Rappel du vote au sondage %s +pollen.service.mail.ResendValidationEmail.subject=[Pollen] Validation de votre compte %s pollen.service.mail.RestrictedPollInvitationEmail.subject=[Pollen] Invitation au sondage %s pollen.service.mail.UserAccountCreatedEmail.subject=[Pollen] Confirmation de création du compte %s pollen.service.mail.VoteAddedEmail.subject=[Pollen] Un nouveau vote a été ajouté au sondage %s diff --git a/pollen-ui-riot-js/src/main/web/i18n.json b/pollen-ui-riot-js/src/main/web/i18n.json index 8a82321..702e428 100644 --- a/pollen-ui-riot-js/src/main/web/i18n.json +++ b/pollen-ui-riot-js/src/main/web/i18n.json @@ -17,6 +17,13 @@ "resendvalidation_placeholder": "Entrer votre courriel", "resendvalidation_sent": "Un nouveau courriel d'invitation a été envoyé", "resendvalidation_error_emailNotFound": "Le courriel n'a pas été trouvé", + "signcheck_title":"Validation de votre compte", + "signcheck_signin":"Vous connecter", + "signcheck_resendValidation":"Envoyer une nouvelle invitation", + "signcheck_message":"Votre compte doit être validé afin de pouvoir vous connecter.", + "signcheck_validating":"Votre compte est en cour de validation...", + "signcheck_validating_error":"Votre compte n'a pas pu être validé, essayer de renvoyer une invitation.", + "signcheck_validating_success":"Votre compte a été validé. Vous pouvez vous connecter.", "signin_title": "Déjà membre ?", "signin_login": "Email", "signin_login_placeholder": "Entrer l'email", @@ -58,6 +65,13 @@ "signup_resendValidation": "Already member, but account never validated ?", "signup_error": "Could not register account.", "signup_error_email": "This email is already used.", + "signcheck_title":"Validate your account", + "signcheck_signin":"Sign in", + "signcheck_resendValidation":"Send a new invitation", + "signcheck_message":"Your account must be validate before you can connect.", + "signcheck_validating":"Your account is validating...", + "signcheck_validating_error":"Your account could not be validated, try to send a new invitation.", + "signcheck_validating_success":"Your account was validated! You can now sign in. Enjoy!", "createdaccount_title": "Your account was created", "createdaccount_description": "We sent you an email with the account validation process and your authentication data.", "createdaccount_action": "Continue", diff --git a/pollen-ui-riot-js/src/main/web/js/AuthService.js b/pollen-ui-riot-js/src/main/web/js/AuthService.js index c2444c4..683e499 100644 --- a/pollen-ui-riot-js/src/main/web/js/AuthService.js +++ b/pollen-ui-riot-js/src/main/web/js/AuthService.js @@ -6,7 +6,7 @@ let FetchService = require("./FetchService"); class AuthService extends FetchService { signIn(login, password) { - return this.fetch("/v1/login","POST", { + return this.fetch("/v1/login", "POST", { Authorization: "Basic " + btoa(login + ":" + password) }, null).then((auth) => { if (!auth) { @@ -31,7 +31,7 @@ class AuthService extends FetchService { } validateEmail(userId, token) { - return this.post("/v1/users/" + userId, {token: token}); + return this.put("/v1/users/" + userId + "?token=" + token); } newPassword(email) { @@ -39,7 +39,7 @@ class AuthService extends FetchService { } resendValidation(email) { - return this.get("/v1/lostpassword/" + email); + return this.get("/v1/resendValidation/" + email); } } diff --git a/pollen-ui-riot-js/src/main/web/js/FetchService.js b/pollen-ui-riot-js/src/main/web/js/FetchService.js index bb285bf..5225eb1 100644 --- a/pollen-ui-riot-js/src/main/web/js/FetchService.js +++ b/pollen-ui-riot-js/src/main/web/js/FetchService.js @@ -51,6 +51,10 @@ class FetchService { return this.fetch(url, "POST", null, body); } + put(url, body) { + return this.fetch(url, "PUT", null, body); + } + form(url, data) { let formData = null; if (data) { diff --git a/pollen-ui-riot-js/src/main/web/js/PollForm.js b/pollen-ui-riot-js/src/main/web/js/PollForm.js index 54121ae..0613862 100644 --- a/pollen-ui-riot-js/src/main/web/js/PollForm.js +++ b/pollen-ui-riot-js/src/main/web/js/PollForm.js @@ -30,8 +30,7 @@ class PollForm { dateChoices: [] }; if (user) { - //FIXME On doit aussi remonter le nom de l'utilisateur - this.model.name = user.email; + this.model.name = user.name; this.model.email = user.email; } } diff --git a/pollen-ui-riot-js/src/main/web/tag/SignCheck.tag b/pollen-ui-riot-js/src/main/web/tag/SignCheck.tag index b0daf05..1a67725 100644 --- a/pollen-ui-riot-js/src/main/web/tag/SignCheck.tag +++ b/pollen-ui-riot-js/src/main/web/tag/SignCheck.tag @@ -1,20 +1,19 @@ let authService = require("../js/AuthService"); let session = require("../js/Session"); let emitter = require("../js/EmitterService"); -let route = require("riot-route"); -<SignCjeck> +<SignCheck> <div class="body-container"> <div class="body-container"> <form class="signcheck" method="post" onsubmit="{signIn}"> <div class="split"> <div class="legend"> - <i class="fa fa-user fa-3x"> </i>{__title__} + <i class="fa fa-user fa-3x"> </i>{__.title} </div> - <div>{__message__}</div> + <div>{__.message}</div> <br/> - <a class="button" href="/signin">{__signin__}</a> - <a class="button" href="/signup/validate">{__resendValidation__}</a> + <a if="{!error}" class="button" href="#signin">{__.signin}</a> + <a if="{error}" class="button" href="#signup/validate">{__.resendValidation}</a> <div class="{error ? 'error' : 'info'}">{message}</div> </div> @@ -26,16 +25,16 @@ let route = require("riot-route"); <script> this.installBundle(session.locale, "signcheck", emitter); - this.message = "Votre compte est en cours de validation..."; + this.message = this.__.validating; this.error = false; - authService.validateEmail(opts.id, opts.permission) + authService.validateEmail(opts.id, opts.token) .then(() => { - this.message = "Votre compte a été validé"; + this.message = this.__.validating_success; this.update(); }) .catch(() => { this.error = true; - this.message = "Votre compte n'a pas pu être validé"; + this.message = this.__.validating_error; this.update(); }); @@ -44,10 +43,6 @@ let route = require("riot-route"); <style scoped> - .wide { - width: 320px; - } - .button { margin: 5px 0; } @@ -94,4 +89,4 @@ let route = require("riot-route"); } </style> -</SignCjeck> +</SignCheck> diff --git a/pollen-ui-riot-js/src/main/web/tag/SignUp.tag b/pollen-ui-riot-js/src/main/web/tag/SignUp.tag index c704082..1dfa81c 100644 --- a/pollen-ui-riot-js/src/main/web/tag/SignUp.tag +++ b/pollen-ui-riot-js/src/main/web/tag/SignUp.tag @@ -29,11 +29,17 @@ require("./popup/AccountCreated.tag"); <script> + this.on('mount', () => { + if (this.validate) { + this.refs.resendValidation.open(); + } + }); + this.installBundle(session.locale, "signup", emitter); this.errors = ""; this.resendValidation = () => { - this.refs.resendValidation.open(); + this.validate = true; }; this.signUp = (e) => { -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
participants (1)
-
chorem.org scm