This is an automated email from the git hooks/post-receive script. New commit to branch feature/44_several_email_address in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit cc5d175cab85ae3cf0dac5989c64fefe56b7fa21 Author: Kevin Morin <morin@codelutin.com> Date: Thu Oct 5 10:34:12 2017 +0200 refs #44 debut de modifs du back pour accepter plusieurs emails par utilisateur --- .../V3_0_1_4__Extract_email_addresses.java | 83 +++++++++++ .../pollen/persistence/entity/PollenUserImpl.java | 2 +- .../persistence/entity/PollenUserTopiaDao.java | 4 - .../pollen/persistence/entity/PollenUsers.java | 35 ----- .../persistence/entity/UserCredentialTopiaDao.java | 11 +- pollen-persistence/src/main/xmi/pollen.properties | 2 +- pollen-persistence/src/main/xmi/pollen.zargo | Bin 29234 -> 30366 bytes .../rest/api/PollenRestApiApplicationListener.java | 4 +- .../chorem/pollen/rest/api/v1/PollenUserApi.java | 22 +++ .../org/chorem/pollen/services/PollenFixtures.java | 4 + .../pollen/services/bean/PollenUserBean.java | 30 ++-- .../services/bean/PollenUserEmailAddressBean.java | 33 +++++ .../pollen/services/service/FixturesService.java | 7 + .../services/service/NotificationService.java | 41 +++--- .../pollen/services/service/PollService.java | 6 +- .../services/service/PollenServiceSupport.java | 5 + .../pollen/services/service/PollenUserService.java | 156 ++++++++++++--------- .../pollen/services/service/SocialAuthService.java | 29 +++- .../pollen/services/service/mail/EmailService.java | 7 +- .../services/service/mail/LostPasswordEmail.java | 3 - .../service/mail/ResendValidationEmail.java | 3 - .../service/mail/UserAccountCreatedEmail.java | 3 - .../mail/UserAccountCreatedFromProviderEmail.java | 3 - .../service/mail/UserAccountDeletedEmail.java | 3 - .../service/mail/UserAccountEditedEmail.java | 3 - .../mail/UserAccountEmailValidatedEmail.java | 3 - .../mail/UserAccountPasswordChangedEmail.java | 3 - .../services/service/security/SecurityService.java | 15 +- pollen-services/src/main/resources/fixtures.yaml | 49 +++++-- .../i18n/pollen-services_en_GB.properties | 37 ++--- .../i18n/pollen-services_fr_FR.properties | 5 +- .../pollen/services/service/PollServiceTest.java | 6 +- .../services/service/PollenUserServiceTest.java | 3 +- 33 files changed, 399 insertions(+), 221 deletions(-) diff --git a/pollen-persistence/src/main/java/db/migration/V3_0_1_4__Extract_email_addresses.java b/pollen-persistence/src/main/java/db/migration/V3_0_1_4__Extract_email_addresses.java new file mode 100644 index 00000000..ea0fb3a4 --- /dev/null +++ b/pollen-persistence/src/main/java/db/migration/V3_0_1_4__Extract_email_addresses.java @@ -0,0 +1,83 @@ +package db.migration.common; + +import org.chorem.pollen.persistence.entity.PollenUserEmailAddress; +import org.flywaydb.core.api.migration.jdbc.JdbcMigration; +import org.flywaydb.core.internal.util.logging.Log; +import org.flywaydb.core.internal.util.logging.LogFactory; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaIdFactory; +import org.nuiton.topia.persistence.internal.ShortTopiaIdFactory; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.Statement; + +/** + * @author Kevin Morin (Code Lutin) + */ +public class V3_0_1_4__Extract_email_addresses implements JdbcMigration { + + /** Logger. */ + private static final Log log = LogFactory.getLog(V3_0_1_4__Extract_email_addresses.class); + + @Override + public void migrate(Connection connection) throws Exception { + + Statement insertStatement = null; + PreparedStatement updateStatement = null; + ResultSet resultSet = null; + + TopiaIdFactory shortTopiaIdFactory = new ShortTopiaIdFactory(); + + try { + connection.setAutoCommit(false); + + insertStatement = connection.createStatement(); + StringBuilder query = new StringBuilder("INSERT INTO POLLENUSEREMAILADDRESS VALUES "); + + updateStatement = + connection.prepareStatement("UPDATE pollenuser SET DEFAULTEMAILADDRESS = ? WHERE topiaid = ?"); + + resultSet = connection.createStatement() + .executeQuery("SELECT u.topiaId, u.email, u.emailactivationtoken FROM pollenuser u"); + + while (resultSet.next()) { + + String userTopiaId = resultSet.getString(1); + String emailAddress = resultSet.getString(2); + String emailTokenActivation = resultSet.getString(3); + + String addressTopiaId = shortTopiaIdFactory.newTopiaId(PollenUserEmailAddress.class, (TopiaEntity) null); + query.append("(").append(addressTopiaId).append(",") + .append("1 , NOW(),") + .append("'").append(emailAddress).append("',") + .append("'").append(emailTokenActivation).append("',") + .append("'").append(userTopiaId).append("')"); + + updateStatement.setString(1, addressTopiaId); + updateStatement.setString(2, userTopiaId); + updateStatement.addBatch(); + } + + insertStatement.execute(query.toString()); + updateStatement.executeBatch(); + resultSet.close(); + + connection.commit(); + + } finally { + if (resultSet != null) { + resultSet.close(); + } + if (insertStatement != null) { + insertStatement.close(); + } + if (updateStatement != null) { + updateStatement.close(); + } + } + + log.info("done !"); + } +} diff --git a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUserImpl.java b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUserImpl.java index fee4c4c3..bd84b16b 100644 --- a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUserImpl.java +++ b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUserImpl.java @@ -28,6 +28,6 @@ public class PollenUserImpl extends PollenUserAbstract { @Override public boolean isEmailValidated() { - return emailActivationToken == null; + return getDefaultEmailAddress() == null || getDefaultEmailAddress().getActivationToken() == null; } } diff --git a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUserTopiaDao.java b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUserTopiaDao.java index 06f84e33..28fe12f7 100644 --- a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUserTopiaDao.java +++ b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUserTopiaDao.java @@ -38,10 +38,6 @@ import java.util.Optional; */ public class PollenUserTopiaDao extends AbstractPollenUserTopiaDao<PollenUser> { - public boolean emailExists(String email) { - return forEmailEquals(email).exists(); - } - public PaginationResult<PollenUser> findAll(PaginationParameter page, String search) { Map<String, Object> parameters = new HashMap<>(); diff --git a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUsers.java b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUsers.java deleted file mode 100644 index 8536092e..00000000 --- a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUsers.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.chorem.pollen.persistence.entity; - -/* - * #%L - * Pollen :: Persistence - * %% - * 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% - */ - -/** - * Created on 4/25/14. - * - * @author Tony Chemit - dev@tchemit.fr - * @since 2.0 - */ -public class PollenUsers { - - public static boolean isEmailActivated(PollenUser pollenUser) { - return pollenUser.getEmailActivationToken() == null; - } -} diff --git a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/UserCredentialTopiaDao.java b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/UserCredentialTopiaDao.java index 7fc64cda..f4a3d205 100644 --- a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/UserCredentialTopiaDao.java +++ b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/UserCredentialTopiaDao.java @@ -32,11 +32,12 @@ public class UserCredentialTopiaDao extends AbstractUserCredentialTopiaDao<UserC + " WHERE" + " (credential." + UserCredential.PROPERTY_PROVIDER + " = :provider" + " AND credential." + UserCredential.PROPERTY_USER_ID + " = :credentialUserId)"; - if (email != null) { - query += " OR user." + PollenUser.PROPERTY_TOPIA_ID + " != :userTopiaId" - + " AND (credential." + UserCredential.PROPERTY_EMAIL + " = :credentialEmail" - + " OR user." + PollenUser.PROPERTY_EMAIL + " = :userEmail)"; - } + //FIXME kmorin 20171003 +// if (email != null) { +// query += " OR user." + PollenUser.PROPERTY_TOPIA_ID + " != :userTopiaId" +// + " AND (credential." + UserCredential.PROPERTY_EMAIL + " = :credentialEmail" +// + " OR user." + PollenUser.PROPERTY_EMAIL + " = :userEmail)"; +// } Map<String, Object> params = new HashMap<>(); params.put("provider", provider); diff --git a/pollen-persistence/src/main/xmi/pollen.properties b/pollen-persistence/src/main/xmi/pollen.properties index 28095962..f20c6e9f 100644 --- a/pollen-persistence/src/main/xmi/pollen.properties +++ b/pollen-persistence/src/main/xmi/pollen.properties @@ -18,7 +18,7 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # #L% ###m -model.tagvalue.version=3.1.0.3 +model.tagvalue.version=3.1.0.5 #model.tagValue.notGenerateToString=true #model.tagValue.constantPrefix=PROPERTY_ #model.tagValue.useEnumerationName=true diff --git a/pollen-persistence/src/main/xmi/pollen.zargo b/pollen-persistence/src/main/xmi/pollen.zargo index e4adfd28..7df0d631 100644 Binary files a/pollen-persistence/src/main/xmi/pollen.zargo and b/pollen-persistence/src/main/xmi/pollen.zargo differ diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java index 7d654ae4..d4e34508 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplicationListener.java @@ -33,6 +33,7 @@ import org.chorem.pollen.services.bean.FavoriteListMemberBean; import org.chorem.pollen.services.bean.PaginationParameterBean; import org.chorem.pollen.services.bean.PollBean; import org.chorem.pollen.services.bean.PollenUserBean; +import org.chorem.pollen.services.bean.PollenUserEmailAddressBean; import org.chorem.pollen.services.bean.ReportBean; import org.chorem.pollen.services.bean.VoteBean; import org.chorem.pollen.services.bean.VoteToChoiceBean; @@ -82,7 +83,8 @@ public class PollenRestApiApplicationListener implements ServletContextListener VoterListMemberBean.class, PaginationParameterBean.class, PollenUIContext.class, - ReportBean.class + ReportBean.class, + PollenUserEmailAddressBean.class ); private Scheduler scheduler; 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 04fca78e..028eddf8 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 @@ -25,6 +25,7 @@ import com.google.gson.Gson; import org.brickred.socialauth.SocialAuthManager; import org.chorem.pollen.persistence.entity.PollenResource; import org.chorem.pollen.persistence.entity.PollenUser; +import org.chorem.pollen.persistence.entity.PollenUserEmailAddress; import org.chorem.pollen.persistence.entity.UserCredential; import org.chorem.pollen.rest.api.beans.ChangePasswordBean; import org.chorem.pollen.services.bean.PaginationParameterBean; @@ -211,4 +212,25 @@ public class PollenUserApi { public void deleteUserAvatar(@Context PollenUserService pollenUserService) { pollenUserService.deleteAvatar(); } + + @Path("/user/email") + @POST + public PollenEntityRef<PollenUserEmailAddress> addEmailAddress(@Context PollenUserService pollenUserService, + String emailAddress) throws InvalidFormException { + return pollenUserService.addEmailAddress(emailAddress); + } + + @Path("/user/email/default") + @PUT + public void setDefaultEmailAddress(@Context PollenUserService pollenUserService, + PollenEntityId<PollenUserEmailAddress> emailAddressId) { + pollenUserService.setDefaultEmailAddress(emailAddressId.getEntityId()); + } + + @Path("/user/email/{emailAddressId}") + @POST + public void removeEmailAddress(@Context PollenUserService pollenUserService, + @PathParam("emailAddressId") PollenEntityId<PollenUserEmailAddress> emailAddressId) { + pollenUserService.removeEmailAddress(emailAddressId.getEntityId()); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/PollenFixtures.java b/pollen-services/src/main/java/org/chorem/pollen/services/PollenFixtures.java index 894ccd34..87b303af 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/PollenFixtures.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/PollenFixtures.java @@ -30,6 +30,7 @@ import org.chorem.pollen.persistence.entity.FavoriteListImpl; import org.chorem.pollen.persistence.entity.FavoriteListMemberImpl; import org.chorem.pollen.persistence.entity.PollImpl; import org.chorem.pollen.persistence.entity.PollenPrincipalImpl; +import org.chorem.pollen.persistence.entity.PollenUserEmailAddressImpl; import org.chorem.pollen.persistence.entity.PollenUserImpl; import org.chorem.pollen.persistence.entity.VoteImpl; import org.chorem.pollen.persistence.entity.VoteToChoiceImpl; @@ -39,6 +40,7 @@ import org.chorem.pollen.persistence.entity.VoterListMemberImpl; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Map; public class PollenFixtures { @@ -68,6 +70,8 @@ public class PollenFixtures { reader.getConfig().setClassTag("vote", VoteImpl.class); reader.getConfig().setClassTag("pollen-principal", PollenPrincipalImpl.class); reader.getConfig().setClassTag("pollenUIContext", PollenUIContext.class); + reader.getConfig().setClassTag("email-address", PollenUserEmailAddressImpl.class); + reader.getConfig().setClassTag("array-list", ArrayList.class); try { fixtures = (Map<String, Object>) reader.read(); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserBean.java index f18ab44f..2cdc54da 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserBean.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserBean.java @@ -41,8 +41,6 @@ public class PollenUserBean extends PollenBean<PollenUser> { protected String language; - protected String email; - protected String password; protected boolean banned; @@ -61,6 +59,10 @@ public class PollenUserBean extends PollenBean<PollenUser> { protected boolean premium; + protected List<PollenUserEmailAddressBean> emailAddresses = new ArrayList<>(); + + protected PollenUserEmailAddressBean defaultEmailAddress; + public PollenUserBean() { super(PollenUser.class); } @@ -89,14 +91,6 @@ public class PollenUserBean extends PollenBean<PollenUser> { this.language = language; } - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - public String getPassword() { return password; } @@ -168,4 +162,20 @@ public class PollenUserBean extends PollenBean<PollenUser> { public void setPremium(boolean premium) { this.premium = premium; } + + public List<PollenUserEmailAddressBean> getEmailAddresses() { + return emailAddresses; + } + + public void setEmailAddresses(List<PollenUserEmailAddressBean> emailAddresses) { + this.emailAddresses = emailAddresses; + } + + public PollenUserEmailAddressBean getDefaultEmailAddress() { + return defaultEmailAddress; + } + + public void setDefaultEmailAddress(PollenUserEmailAddressBean defaultEmailAddress) { + this.defaultEmailAddress = defaultEmailAddress; + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserEmailAddressBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserEmailAddressBean.java new file mode 100644 index 00000000..c01c12d1 --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserEmailAddressBean.java @@ -0,0 +1,33 @@ +package org.chorem.pollen.services.bean; + +import org.chorem.pollen.persistence.entity.PollenUserEmailAddress; + +/** + * @author Kevin Morin (Code Lutin) + */ +public class PollenUserEmailAddressBean extends PollenBean<PollenUserEmailAddress> { + + protected String emailAddress; + + protected boolean validated; + + public PollenUserEmailAddressBean() { + super(PollenUserEmailAddress.class); + } + + public String getEmailAddress() { + return emailAddress; + } + + public void setEmailAddress(String emailAddress) { + this.emailAddress = emailAddress; + } + + public boolean isValidated() { + return validated; + } + + public void setValidated(boolean validated) { + this.validated = validated; + } +} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java index 970dcecf..68926fff 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/FixturesService.java @@ -30,6 +30,8 @@ import org.chorem.pollen.persistence.entity.Choice; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.PollenUser; +import org.chorem.pollen.persistence.entity.PollenUserEmailAddress; +import org.chorem.pollen.persistence.entity.PollenUserEmailAddressTopiaDao; import org.chorem.pollen.persistence.entity.PollenUserTopiaDao; import org.chorem.pollen.services.PollenFixtures; import org.chorem.pollen.services.PollenTechnicalException; @@ -92,10 +94,15 @@ public class FixturesService extends PollenServiceSupport { SecurityService securityService = getSecurityService(); PollenUserTopiaDao userDao = persistenceContext.getPollenUserDao(); + PollenUserEmailAddressTopiaDao emailAddressDao = persistenceContext.getPollenUserEmailAddressDao(); Collection<PollenUser> users = fixtures.fixture("users"); for (PollenUser user : users) { + for (PollenUserEmailAddress emailAddress : user.getEmailAddresses()) { + PollenUserEmailAddress createdEmailAddress = emailAddressDao.create(emailAddress); + emailAddress.setTopiaId(createdEmailAddress.getTopiaId()); + } securityService.setUserPassword(user, user.getPassword()); PollenUser createdUser = userDao.create(user); 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 ba7c6dbf..c06da4c8 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 @@ -28,6 +28,7 @@ import org.chorem.pollen.persistence.entity.FavoriteList; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollType; import org.chorem.pollen.persistence.entity.PollenUser; +import org.chorem.pollen.persistence.entity.PollenUserEmailAddress; import org.chorem.pollen.persistence.entity.Report; import org.chorem.pollen.persistence.entity.UserCredential; import org.chorem.pollen.persistence.entity.Vote; @@ -76,69 +77,69 @@ import java.util.Set; public class NotificationService extends PollenServiceSupport { public void onUserCreated(PollenUser user) { - if (StringUtils.isNotBlank(user.getEmail())) { + if (user.getDefaultEmailAddress() != null) { EmailService emailService = getEmailService(); UserAccountCreatedEmail email = emailService.newUserAccountCreatedEmail(user); - email.addTo(user.getEmail()); + email.addTo(user.getDefaultEmailAddress().getEmailAddress()); emailService.send(email); } } public void onUserCreatedFromProvider(PollenUser user, UserCredential credential) { - if (StringUtils.isNotBlank(user.getEmail())) { + if (user.getDefaultEmailAddress() != null) { EmailService emailService = getEmailService(); UserAccountCreatedFromProviderEmail email = emailService.newUserAccountCreatedFromProviderEmail(user, credential); - email.addTo(user.getEmail()); + email.addTo(user.getDefaultEmailAddress().getEmailAddress()); emailService.send(email); } } - public void onResendValidation(PollenUser user) { + public void onResendValidation(PollenUser user, PollenUserEmailAddress emailAddress) { EmailService emailService = getEmailService(); - ResendValidationEmail email = emailService.newUserResendValidationEmail(user); - email.addTo(user.getEmail()); + ResendValidationEmail email = emailService.newUserResendValidationEmail(user, emailAddress); + email.addTo(emailAddress.getEmailAddress()); emailService.send(email); } public void onUserEdited(PollenUser user) { - if (StringUtils.isNotBlank(user.getEmail())) { + if (user.getDefaultEmailAddress() != null) { EmailService emailService = getEmailService(); UserAccountEditedEmail email = emailService.newUserAccountEditedEmail(user); - email.addTo(user.getEmail()); + email.addTo(user.getDefaultEmailAddress().getEmailAddress()); emailService.send(email); } } public void onUserDeleted(PollenUser user) { - if (StringUtils.isNotBlank(user.getEmail())) { + if (user.getDefaultEmailAddress() != null) { EmailService emailService = getEmailService(); UserAccountDeletedEmail email = emailService.newUserAccountDeletedEmail(user); - email.addTo(user.getEmail()); + email.addTo(user.getDefaultEmailAddress().getEmailAddress()); emailService.send(email); } } public void onUserPasswordChanged(PollenUser user) { - if (StringUtils.isNotBlank(user.getEmail())) { + if (user.getDefaultEmailAddress() != null) { EmailService emailService = getEmailService(); UserAccountPasswordChangedEmail email = emailService.newUserAccountPasswordChangedEmail(user); - email.addTo(user.getEmail()); + email.addTo(user.getDefaultEmailAddress().getEmailAddress()); emailService.send(email); } } - public void onUserEmailValidated(PollenUser user) { + public void onUserEmailValidated(PollenUser user, PollenUserEmailAddress emailAddress) { EmailService emailService = getEmailService(); UserAccountEmailValidatedEmail email = emailService.newUserAccountEmailValidatedEmail(user); - email.addTo(user.getEmail()); + email.addTo(emailAddress.getEmailAddress()); emailService.send(email); } public void onUserLostPasswordAsked(PollenUser user, String newPassword) { - if (StringUtils.isNotBlank(user.getEmail())) { + if (user.getDefaultEmailAddress() != null) { EmailService emailService = getEmailService(); LostPasswordEmail email = emailService.newLostPasswordEmail(user, newPassword); - email.addTo(user.getEmail()); + email.addTo(user.getDefaultEmailAddress().getEmailAddress()); emailService.send(email); } } @@ -343,7 +344,7 @@ public class NotificationService extends PollenServiceSupport { getAdminsToSentReport(poll, comment).forEach(admin -> { CommentReportForAdminEmail commentReportForAdminEmail = emailService.newCommentReportForAdminEmail(poll, comment, report, admin); - commentReportForAdminEmail.addTo(admin.getEmail()); + commentReportForAdminEmail.addTo(admin.getDefaultEmailAddress().getEmailAddress()); emailService.send(commentReportForAdminEmail); }); @@ -379,7 +380,7 @@ public class NotificationService extends PollenServiceSupport { getAdminsToSentReport(poll, choice).forEach(admin -> { ChoiceReportForAdminEmail choiceReportForAdminEmail = emailService.newChoiceReportForAdminEmail(poll, choice, report, admin); - choiceReportForAdminEmail.addTo(admin.getEmail()); + choiceReportForAdminEmail.addTo(admin.getDefaultEmailAddress().getEmailAddress()); emailService.send(choiceReportForAdminEmail); }); @@ -401,7 +402,7 @@ public class NotificationService extends PollenServiceSupport { getAdminsToSentReport(poll, poll).forEach(admin -> { PollReportForAdminEmail pollReportForAdminEmail = emailService.newPollReportForAdminEmail(poll, report, admin); - pollReportForAdminEmail.addTo(admin.getEmail()); + pollReportForAdminEmail.addTo(admin.getDefaultEmailAddress().getEmailAddress()); emailService.send(pollReportForAdminEmail); }); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java index ee82987b..786796c1 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java @@ -276,7 +276,9 @@ public class PollService extends PollenServiceSupport { if (connectedUser != null) { pollBean.setCreatorName(connectedUser.getName()); - pollBean.setCreatorEmail(connectedUser.getEmail()); + if (connectedUser.getDefaultEmailAddress() != null) { + pollBean.setCreatorEmail(connectedUser.getDefaultEmailAddress().getEmailAddress()); + } pollBean.setGtuValidated(getGtuService().isGtuValidated(connectedUser)); } @@ -465,7 +467,7 @@ public class PollService extends PollenServiceSupport { if (creator != null) { if (!creator.equals(connectedUser)) { - throw new PollenUnauthorizedException(connectedUser.getEmail()); + throw new PollenUnauthorizedException(connectedUser.getTopiaId()); } else { // no poll assigned return null; diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java index 06c86f35..a8abd9e9 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java @@ -39,6 +39,7 @@ import org.chorem.pollen.persistence.entity.PollTopiaDao; import org.chorem.pollen.persistence.entity.PollenPrincipalTopiaDao; import org.chorem.pollen.persistence.entity.PollenResourceTopiaDao; import org.chorem.pollen.persistence.entity.PollenUser; +import org.chorem.pollen.persistence.entity.PollenUserEmailAddressTopiaDao; import org.chorem.pollen.persistence.entity.PollenUserTopiaDao; import org.chorem.pollen.persistence.entity.ReportTopiaDao; import org.chorem.pollen.persistence.entity.SessionTokenTopiaDao; @@ -219,6 +220,10 @@ public abstract class PollenServiceSupport implements PollenService { return getPersistenceContext().getPollenUserDao(); } + protected PollenUserEmailAddressTopiaDao getPollenUserEmailAddressDao() { + return getPersistenceContext().getPollenUserEmailAddressDao(); + } + protected UserCredentialTopiaDao getUserCredentialDao() { return getPersistenceContext().getUserCredentialDao(); } 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 222733b8..8f88d1fc 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 @@ -21,7 +21,6 @@ package org.chorem.pollen.services.service; * #L% */ -import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -31,7 +30,7 @@ import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.PollenResource; import org.chorem.pollen.persistence.entity.PollenToken; import org.chorem.pollen.persistence.entity.PollenUser; -import org.chorem.pollen.persistence.entity.PollenUserTopiaDao; +import org.chorem.pollen.persistence.entity.PollenUserEmailAddress; import org.chorem.pollen.persistence.entity.ResourceType; import org.chorem.pollen.persistence.entity.UserCredential; import org.chorem.pollen.persistence.entity.Vote; @@ -40,6 +39,7 @@ import org.chorem.pollen.services.bean.PaginationParameterBean; import org.chorem.pollen.services.bean.PaginationResultBean; import org.chorem.pollen.services.bean.PollenEntityRef; import org.chorem.pollen.services.bean.PollenUserBean; +import org.chorem.pollen.services.bean.PollenUserEmailAddressBean; import org.chorem.pollen.services.bean.UserCredentialBean; import org.chorem.pollen.services.bean.resource.ResourceFileBean; import org.chorem.pollen.services.service.security.PollenInvalidEmailActivationTokenException; @@ -51,7 +51,6 @@ import org.nuiton.util.pagination.PaginationResult; import java.util.Date; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; import static org.nuiton.i18n.I18n.l; @@ -75,9 +74,8 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer bean.setAdministrator(entity.isAdministrator()); bean.setBanned(entity.isBanned()); bean.setLanguage(entity.getLanguage()); - bean.setEmail(entity.getEmail()); bean.setPassword(null); - bean.setEmailIsValidate(entity.getEmailActivationToken() == null); + bean.setEmailIsValidate(entity.isEmailValidated()); bean.setWithPassword(entity.getPassword() != null); if (entity.getUserCredential() != null) { bean.setCredentials(entity.getUserCredential().stream() @@ -91,7 +89,20 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer bean.setGtuValidated(getGtuService().isGtuValidated(entity)); bean.setPremium(isPremium(entity)); + bean.setEmailAddresses(entity.getEmailAddresses().stream() + .map(this::toPollenUserEmailAddressBean) + .collect(Collectors.toList())); + if (entity.getDefaultEmailAddress() != null) { + bean.setDefaultEmailAddress(toPollenUserEmailAddressBean(entity.getDefaultEmailAddress())); + } + + return bean; + } + public PollenUserEmailAddressBean toPollenUserEmailAddressBean(PollenUserEmailAddress entity) { + PollenUserEmailAddressBean bean = new PollenUserEmailAddressBean(); + bean.setEmailAddress(entity.getEmailAddress()); + bean.setValidated(entity.getActivationToken() == null); return bean; } @@ -136,8 +147,10 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer checkNotNull(user); checkIsNotPersisted(user); - ErrorMap errorMap = checkPollenUser(user); + if (user.getDefaultEmailAddress() != null) { + checkUserEmailAddress(errorMap, user.getDefaultEmailAddress().getEmailAddress()); + } errorMap.failIfNotEmpty(); PollenUser result = savePollenUser(user); @@ -223,32 +236,35 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer checkNotNull(token); PollenUser user = getUser0(userId); - - getSecurityService().checkUserEmailValidation(user, token); + PollenUserEmailAddress emailAddress = getPollenUserEmailAddressDao().findEmailAddressByToken(token); + if (emailAddress == null || !user.containsEmailAddresses(emailAddress)) { + throw new PollenInvalidEmailActivationTokenException(); + } // reset token in database - user.setEmailActivationToken(null); + emailAddress.setActivationToken(null); commit(); - getNotificationService().onUserEmailValidated(user); + getNotificationService().onUserEmailValidated(user, emailAddress); } public void resendValidation(String email) { checkNotNull(email); - PollenUser user = getPollenUserDao().forEmailEquals(email).findUniqueOrNull(); - if (user == null) { + PollenUserEmailAddress userEmailAddress = getPollenUserEmailAddressDao().forEmailAddressEquals(email).findUniqueOrNull(); + if (userEmailAddress == null) { return; } + PollenUser user = getPollenUserDao().forEmailAddressesContains(userEmailAddress).findUnique(); - if (user.getEmailActivationToken() == null) { - user.setEmailActivationToken(getSecurityService().generateNewToken()); + if (userEmailAddress.getActivationToken() == null) { + userEmailAddress.setActivationToken(getSecurityService().generateNewToken()); commit(); } - getNotificationService().onResendValidation(user); + getNotificationService().onResendValidation(user, userEmailAddress); } @@ -258,18 +274,16 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer PollenUserBean adminBean = new PollenUserBean(); - adminBean.setEmail("admin@chorem.org"); + PollenUserEmailAddressBean emailAddress = new PollenUserEmailAddressBean(); + emailAddress.setEmailAddress("admin@chorem.org"); + + adminBean.setDefaultEmailAddress(emailAddress); adminBean.setPassword("admin"); adminBean.setName("admin"); + PollenUser admin = savePollenUser(adminBean); admin.setAdministrator(true); - try { - validateUserEmail(admin.getTopiaId(), admin.getEmailActivationToken().getToken()); - } catch (PollenInvalidEmailActivationTokenException e) { - if (log.isErrorEnabled()) { - log.error("Email of default user is not valid", e); - } - } + admin.getDefaultEmailAddress().setActivationToken(null); commit(); } @@ -297,43 +311,58 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer return PollenEntityRef.of(avatarResource); } - protected ErrorMap checkPollenUser(PollenUserBean user) { - + public PollenEntityRef<PollenUserEmailAddress> addEmailAddress(String emailAddress) throws InvalidFormException { + checkNotNull(emailAddress); ErrorMap errors = new ErrorMap(); + emailAddress = checkUserEmailAddress(errors, emailAddress); + errors.failIfNotEmpty(); - boolean userExists = user.isPersisted(); - PollenUser persisted = userExists ? getUser0(user.getEntityId()) : null; - PollenUserTopiaDao dao = getPollenUserDao(); - - String userEmail = getCleanMail(user.getEmail()); - - boolean emailNotblank = checkNotBlank(errors, "email", userEmail, l(getLocale(), "pollen.error.user.mailEmpty")); + PollenUser user = checkAndGetConnectedUser(); + PollenUserEmailAddress address = getPollenUserEmailAddressDao().create(); + address.setEmailAddress(emailAddress); + PollenToken emailActivation = getSecurityService().generateNewToken(); + address.setActivationToken(emailActivation); + user.addEmailAddresses(address); + commit(); + return PollenEntityRef.of(address); + } + protected String checkUserEmailAddress(ErrorMap errors, String emailAddress) { + emailAddress = getCleanMail(emailAddress); + boolean emailNotblank = checkNotBlank(errors, "email", emailAddress, l(getLocale(), "pollen.error.user.mailEmpty")); if (emailNotblank) { + checkValidEmail(errors, "email", emailAddress, l(getLocale(), "pollen.error.user.mailInvalid")); + checkEmailPattern(errors, "email", emailAddress, l(getLocale(), "pollen.error.user.mailUnauthorized")); + check(errors, "email", !getPollenUserEmailAddressDao().emailExists(emailAddress), l(getLocale(), "pollen.error.user.mailExist")); + } + return emailAddress; + } - checkValidEmail(errors, "email", userEmail, l(getLocale(), "pollen.error.user.mailInvalid")); - - checkEmailPattern(errors, "email", userEmail, l(getLocale(), "pollen.error.user.mailUnauthorized")); - - if (userExists) { - - // check if email is available only if has changed - - boolean emailChanged = ObjectUtils.notEqual(persisted.getEmail(), userEmail); - - if (emailChanged) { - - check(errors, "email", !dao.emailExists(userEmail), l(getLocale(), "pollen.error.user.mailExist")); + public void setDefaultEmailAddress(String emailAddressId) { + checkNotNull(emailAddressId); + PollenUser user = checkAndGetConnectedUser(); + PollenUserEmailAddress emailAddress = user.getEmailAddressesByTopiaId(emailAddressId); + checkNotNull(emailAddress); + user.setDefaultEmailAddress(emailAddress); + commit(); + } - } + public void removeEmailAddress(String emailAddressId) { + checkNotNull(emailAddressId); + PollenUser user = checkAndGetConnectedUser(); + PollenUserEmailAddress emailAddress = user.getEmailAddressesByTopiaId(emailAddressId); + checkNotNull(emailAddress); + getPollenUserEmailAddressDao().delete(emailAddress); + commit(); + } - } else { + protected ErrorMap checkPollenUser(PollenUserBean user) { - check(errors, "email", !dao.emailExists(userEmail), l(getLocale(), "pollen.error.user.mailExist")); + ErrorMap errors = new ErrorMap(); - } + boolean userExists = user.isPersisted(); - } + checkNotBlank(errors, "name", user.getName(), l(getLocale(), "pollen.error.user.nameEmpty")); if (!userExists) { checkNotBlank(errors, "password", user.getPassword(), l(getLocale(), "pollen.error.user.passwordEmpty")); @@ -357,36 +386,33 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer boolean userExists = user.isPersisted(); - String cleanMail = getCleanMail(user.getEmail()); - PollenUser toSave; if (userExists) { toSave = getUser0(user.getEntityId()); - boolean emailChanged = !Objects.equals(toSave.getEmail(), cleanMail); - - if (emailChanged) { - - PollenToken emailActivation = getSecurityService().generateNewToken(); - toSave.setEmailActivationToken(emailActivation); - - } - } else { PollenToken emailActivation = getSecurityService().generateNewToken(); toSave = getPollenUserDao().create(); - toSave.setEmailActivationToken(emailActivation); + + PollenUserEmailAddressBean emailAddress = user.getDefaultEmailAddress(); + if (emailAddress != null) { + PollenUserEmailAddress defaultEmailAddress = getPollenUserEmailAddressDao().create(); + String cleanMail = getCleanMail(emailAddress.getEmailAddress()); + defaultEmailAddress.setEmailAddress(cleanMail); + defaultEmailAddress.setActivationToken(emailActivation); + toSave.addEmailAddresses(defaultEmailAddress); + toSave.setDefaultEmailAddress(defaultEmailAddress); + } if (user.isGtuValidated()) { toSave.setGtuValidationDate(getNow()); } getSecurityService().setUserPassword(toSave, user.getPassword()); - } PollenSecurityContext securityContext = getSecurityContext(); @@ -397,10 +423,6 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer } toSave.setName(user.getName()); toSave.setLanguage(user.getLanguage()); - toSave.setEmail(cleanMail); - if (user.isEmailIsValidate() && toSave.getEmailActivationToken() != null) { - toSave.setEmailActivationToken(null); - } return toSave; diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java index da9b9bbd..5f3ba2ec 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/SocialAuthService.java @@ -34,6 +34,7 @@ import org.chorem.pollen.persistence.entity.LoginProvider; import org.chorem.pollen.persistence.entity.LoginProviderTopiaDao; import org.chorem.pollen.persistence.entity.PollenResource; import org.chorem.pollen.persistence.entity.PollenUser; +import org.chorem.pollen.persistence.entity.PollenUserEmailAddress; import org.chorem.pollen.persistence.entity.PollenUserImpl; import org.chorem.pollen.persistence.entity.PollenUserTopiaDao; import org.chorem.pollen.persistence.entity.ResourceType; @@ -50,6 +51,7 @@ import java.net.URLConnection; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -79,7 +81,7 @@ public class SocialAuthService extends PollenServiceSupport { } pollenUser = pollenUserForCredential.get(); - } else if (userDao.emailExists(p.getEmail())) { + } else if (getPollenUserEmailAddressDao().emailExists(p.getEmail())) { throw new PollenEmailOrProviderAccountAlreadyUsedException(); } else { @@ -96,7 +98,15 @@ public class SocialAuthService extends PollenServiceSupport { pollenUser = new PollenUserImpl(); pollenUser.setName(name); - pollenUser.setEmail(credential.getEmail()); + + String credentialEmail = getCleanMail(credential.getEmail()); + if (StringUtils.isNotBlank(credentialEmail)) { + PollenUserEmailAddress defaultEmailAddress = getPollenUserEmailAddressDao().create(); + defaultEmailAddress.setEmailAddress(credentialEmail); + pollenUser.addEmailAddresses(defaultEmailAddress); + pollenUser.setDefaultEmailAddress(defaultEmailAddress); + } + pollenUser.setLanguage(p.getLanguage()); pollenUser.setAdministrator(false); pollenUser.setBanned(false); @@ -120,16 +130,29 @@ public class SocialAuthService extends PollenServiceSupport { // get profile Profile p = provider.getUserProfile(); + String credentialEmail = getCleanMail(p.getEmail()); boolean credentialValid = getUserCredentialDao().isCredentialValid(p.getProviderId(), p.getValidatedId(), connectedUser.getTopiaId(), - p.getEmail()); + credentialEmail); if (!credentialValid) { throw new PollenEmailOrProviderAccountAlreadyUsedException(); } UserCredential credential = createUserCredential(p); connectedUser.addUserCredential(credential); + + if (StringUtils.isNotBlank(credentialEmail)) { + boolean addEmailAddress = connectedUser.getEmailAddresses().stream() + .map(PollenUserEmailAddress::getEmailAddress) + .noneMatch(email -> Objects.equals(credentialEmail, email)); + if (addEmailAddress) { + PollenUserEmailAddress emailAddress = getPollenUserEmailAddressDao().create(); + emailAddress.setEmailAddress(credentialEmail); + connectedUser.addEmailAddresses(emailAddress); + } + } + commit(); return credential.getUserName(); 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 fbc640e1..4d7de18e 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 @@ -43,6 +43,7 @@ import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.PollenResource; import org.chorem.pollen.persistence.entity.PollenUser; +import org.chorem.pollen.persistence.entity.PollenUserEmailAddress; import org.chorem.pollen.persistence.entity.Report; import org.chorem.pollen.persistence.entity.UserCredential; import org.chorem.pollen.persistence.entity.Vote; @@ -234,7 +235,7 @@ public class EmailService extends PollenServiceSupport { PollenEntityId<PollenUser> userId = getPollenEntityId(user); email.setValidateUrl(getPollenUIUrlRenderService().getUserValidateUrl(getUIContext().getUserValidateUrl(), userId.getReducedId(), - user.getEmailActivationToken().getToken())); + user.getDefaultEmailAddress().getActivationToken().getToken())); return email; } @@ -266,7 +267,7 @@ public class EmailService extends PollenServiceSupport { return email; } - public ResendValidationEmail newUserResendValidationEmail(PollenUser user) { + public ResendValidationEmail newUserResendValidationEmail(PollenUser user, PollenUserEmailAddress emailAddress) { ResendValidationEmail email = new ResendValidationEmail(getLocale()); email.setUser(user); email.setPollenUrl(getUIContext().getUiEndPoint()); @@ -274,7 +275,7 @@ public class EmailService extends PollenServiceSupport { PollenEntityId<PollenUser> userId = getPollenEntityId(user); email.setValidateUrl(getPollenUIUrlRenderService().getUserValidateUrl(getUIContext().getUserValidateUrl(), userId.getReducedId(), - user.getEmailActivationToken().getToken())); + emailAddress.getActivationToken().getToken())); return email; } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/LostPasswordEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/LostPasswordEmail.java index 2c9fab11..8e3a7c2d 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/LostPasswordEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/LostPasswordEmail.java @@ -62,9 +62,6 @@ public class LostPasswordEmail extends PollenMail { @Override public String getSubject() { - if (user.getName() == null) { - return I18n.l(locale, "pollen.service.mail.LostPasswordEmail.subject", user.getEmail()); - } return I18n.l(locale, "pollen.service.mail.LostPasswordEmail.subject", user.getName()); } 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 index 97de0fd2..1b0f9408 100644 --- 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 @@ -45,9 +45,6 @@ public class ResendValidationEmail extends PollenMail { @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()); } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedEmail.java index b18979bc..e8f527ec 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedEmail.java @@ -46,9 +46,6 @@ public class UserAccountCreatedEmail extends PollenMail { @Override public String getSubject() { - if (user.getName() == null) { - return I18n.l(locale, "pollen.service.mail.UserAccountCreatedEmail.subject", user.getEmail()); - } return I18n.l(locale, "pollen.service.mail.UserAccountCreatedEmail.subject", user.getName()); } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedFromProviderEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedFromProviderEmail.java index 8f7adec3..da280ff4 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedFromProviderEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedFromProviderEmail.java @@ -44,9 +44,6 @@ public class UserAccountCreatedFromProviderEmail extends PollenMail { @Override public String getSubject() { - if (user.getName() == null) { - return I18n.l(locale, "pollen.service.mail.UserAccountCreatedFromProviderEmail.subject", user.getEmail()); - } return I18n.l(locale, "pollen.service.mail.UserAccountCreatedFromProviderEmail.subject", user.getName()); } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountDeletedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountDeletedEmail.java index c5d1b444..7573cc5c 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountDeletedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountDeletedEmail.java @@ -40,9 +40,6 @@ public class UserAccountDeletedEmail extends PollenMail { @Override public String getSubject() { - if (user.getName() == null) { - return I18n.l(locale, "pollen.service.mail.UserAccountDeletedEmail.subject", user.getEmail()); - } return I18n.l(locale, "pollen.service.mail.UserAccountDeletedEmail.subject", user.getName()); } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEditedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEditedEmail.java index 6ec43bce..36860881 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEditedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEditedEmail.java @@ -43,9 +43,6 @@ public class UserAccountEditedEmail extends PollenMail { @Override public String getSubject() { - if (user.getName() == null) { - return I18n.l(locale, "pollen.service.mail.UserAccountEditedEmail.subject", user.getEmail()); - } return I18n.l(locale, "pollen.service.mail.UserAccountEditedEmail.subject", user.getName()); } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailValidatedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailValidatedEmail.java index ea825395..7d4d1a1a 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailValidatedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailValidatedEmail.java @@ -44,9 +44,6 @@ public class UserAccountEmailValidatedEmail extends PollenMail { @Override public String getSubject() { - if (user.getName() == null) { - return I18n.l(locale, "pollen.service.mail.UserAccountEmailValidatedEmail.subject", user.getEmail()); - } return I18n.l(locale, "pollen.service.mail.UserAccountEmailValidatedEmail.subject", user.getName()); } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountPasswordChangedEmail.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountPasswordChangedEmail.java index 5036ee31..a901f515 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountPasswordChangedEmail.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountPasswordChangedEmail.java @@ -44,9 +44,6 @@ public class UserAccountPasswordChangedEmail extends PollenMail { @Override public String getSubject() { - if (user.getName() == null) { - return I18n.l(locale, "pollen.service.mail.UserAccountPasswordChangedEmail.subject", user.getEmail()); - } return I18n.l(locale, "pollen.service.mail.UserAccountPasswordChangedEmail.subject", user.getName()); } 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 752e606b..b41bfb2a 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 @@ -207,6 +207,7 @@ public class SecurityService extends PollenServiceSupport { Preconditions.checkNotNull(login); + //FIXME PollenUser user = getPollenUserDao().forEmailEquals(login).findUniqueOrNull(); if (user == null) { @@ -365,20 +366,6 @@ 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) { - throw new PollenInvalidEmailActivationTokenException(); - } - - } - public boolean isPermitted(String permission) { Subject subject = getSubject(); diff --git a/pollen-services/src/main/resources/fixtures.yaml b/pollen-services/src/main/resources/fixtures.yaml index 0044a81d..cce8c5d6 100644 --- a/pollen-services/src/main/resources/fixtures.yaml +++ b/pollen-services/src/main/resources/fixtures.yaml @@ -1,22 +1,55 @@ +email_address_tony_default: + &email_address_tony1 !email-address + emailAddress: tony@pollen.fake + +email_address_tony_2: + &email_address_tony2 !email-address + emailAddress: tony2@pollen.fake + user_tony: &tony !user password: fake name: T - email: tony@pollen.fake + emailAddresses: !array-list + - *email_address_tony1 + - *email_address_tony2 + defaultEmailAddress: *email_address_tony1 administrator: false +email_address_jean_default: + &email_address_jean1 !email-address + emailAddress: jean@pollen.fake + +email_address_jean_2: + &email_address_jean2 !email-address + emailAddress: jean2@pollen.fake + +email_address_jean_3: + &email_address_jean3 !email-address + emailAddress: jean3@pollen.fake + user_jean: &jean !user password: fake name: J - email: jean@pollen.fake + emailAddresses: !array-list + - *email_address_jean1 + - *email_address_jean2 + - *email_address_jean3 + defaultEmailAddress: *email_address_jean1 administrator: true +email_address_julien_default: + &email_address_julien !email-address + emailAddress: julien@pollen.fake + user_julien: &julien !user password: fake name: J - email: julien@pollen.fake + emailAddresses: !array-list + - *email_address_julien + defaultEmailAddress: *email_address_julien administrator: true poll_normal: @@ -88,12 +121,12 @@ choiceB: choiceType: TEXT choices: - - *normal_choixA - - *normal_choixB + - *normal_choixA + - *normal_choixB votes: - - normal_vote1 - - normal_vote2 + - normal_vote1 + - normal_vote2 users: - *tony @@ -101,7 +134,7 @@ users: - *julien polls: - - *normal + - *normal pollenUIContext_chorem: &chorem !pollenUIContext 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 5680fe60..a48fcfba 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 @@ -47,14 +47,14 @@ pollen.error.childFavoriteList.already.used=Child list "%s" is already used pollen.error.childFavoriteList.childIsAncestor=Child list "%2$s" is ancestor of main list %1$s pollen.error.childFavoriteList.sameParentChild=Child "%s" must be not equal to parent pollen.error.childFavoriteList.weight.negativeOrNull=Weight (%s) must be positive -pollen.error.choice.choiceDateEmpty=choice date can not be empty +pollen.error.choice.choiceDateEmpty=choice date cannot be empty pollen.error.choice.choiceDateExist=choice date already used in this list pollen.error.choice.choiceDateInvalid=Date format %s is not valid -pollen.error.choice.choiceNameEmpty=choice name can not be empty +pollen.error.choice.choiceNameEmpty=choice name cannot be empty pollen.error.choice.choiceNameExist=choice name already used in this list -pollen.error.choice.choiceTypeEmpty=choiceType can not be null -pollen.error.comment.author.name.mandatory=author name can not be empty -pollen.error.comment.text.mandatory=text can not be empty +pollen.error.choice.choiceTypeEmpty=choiceType cannot be null +pollen.error.comment.author.name.mandatory=author name cannot be empty +pollen.error.comment.text.mandatory=text cannot be empty pollen.error.favoriteList.import.csv.already.used.email=Line %s \: Email already used pollen.error.favoriteList.import.csv.already.used.name=Line %s \: Name already used pollen.error.favoriteList.import.csv.invalid.email=Line %s \: Invalid email @@ -67,12 +67,12 @@ pollen.error.favoriteList.import.ldap.login.urlEncoding=Bad encoding for login " pollen.error.favoriteList.import.ldap.password.urlEncoding=Bad encoding for password "%s" pollen.error.favoriteList.import.ldap.server=Error on LDAP server \: %s pollen.error.favoriteList.name.already.used=name "%s" already used by another favorite list -pollen.error.favoriteList.name.empty=name can not be empty +pollen.error.favoriteList.name.empty=name cannot be empty pollen.error.favoriteListMember.email.already.used=member email "%s" already used in this list -pollen.error.favoriteListMember.email.empty=member email can not be empty +pollen.error.favoriteListMember.email.empty=member email cannot be empty pollen.error.favoriteListMember.email.invalid=member email "%s" is not valid pollen.error.favoriteListMember.name.already.used=member name "%s" already used -pollen.error.favoriteListMember.name.empty=member name can not be empty +pollen.error.favoriteListMember.name.empty=member name cannot be empty pollen.error.favoriteListMember.weight.negativeOrNull=Weight (%s) must be positive pollen.error.import.favoriteList.parser=Bad structure file \: %s pollen.error.import.favoriteList.version=import file version (%s) is not correct @@ -92,20 +92,21 @@ pollen.error.poll.voteCountingType.mandatory=vote counting type is mandatory pollen.error.poll.voteVisibility.mandatory=vote visibility is mandatory pollen.error.poll.voterList.mandatory.for.groupedPoll=At least one voter list ins mandatory for a grouped poll pollen.error.report.email.invalid=Email invalid -pollen.error.report.email.mandatory=Email can not be empty -pollen.error.report.level.mandatory=Report level can not be empty +pollen.error.report.email.mandatory=Email cannot be empty +pollen.error.report.level.mandatory=Report level cannot be empty pollen.error.resource.empty=No resource sent -pollen.error.resource.maxSize=File "%s" of %4.2f %s can't be over %4.2f %s. +pollen.error.resource.maxSize=File "%s" of %4.2f %s cannot be over %4.2f %s. pollen.error.resource.notExist=Image don't exist pollen.error.resource.resourceTypeRequired=Resource type is required pollen.error.user.bannedSelf=You can't banned yourself pollen.error.user.gtuValidation.required=General terms of use validation is required -pollen.error.user.mailEmpty=The email address can not be empty +pollen.error.user.mailEmpty=The email address cannot be empty pollen.error.user.mailExist=The email address already exists pollen.error.user.mailInvalid=The email address is not valid pollen.error.user.mailUnauthorized=The email address is not authorized -pollen.error.user.passwordEmpty=password can not be empty -pollen.error.user.passwordInvalid=password is not valid +pollen.error.user.nameEmpty=The name cannot be empty +pollen.error.user.passwordEmpty=The password cannot be empty +pollen.error.user.passwordInvalid=The password is not valid pollen.error.vote.limitedVote.overflow=Too many choices pollen.error.vote.poll.finished=Votes are finished, you cannot vote anymore pollen.error.vote.poll.isClosed=poll is closed, you can't vote @@ -113,16 +114,16 @@ pollen.error.vote.poll.notStarted=poll is not started pollen.error.vote.totalVote.invalid=Total vote value is invalid pollen.error.vote.voteValue.invalid=Value is invalid pollen.error.vote.voterName.alreadyExist=voter name is already used -pollen.error.vote.voterName.mandatory=voter name can not be empty +pollen.error.vote.voterName.mandatory=voter name cannot be empty pollen.error.voterList.member.email.alreadyUsed=member email already used in this list pollen.error.voterList.member.email.invalid=member email is not valid -pollen.error.voterList.member.email.mandatory=member email can not be empty +pollen.error.voterList.member.email.mandatory=member email cannot be empty pollen.error.voterList.member.mandatory=voterList must contains at least one member pollen.error.voterList.member.name.alreadyUsed=member name already used in this list -pollen.error.voterList.member.name.mandatory=member name can not be empty +pollen.error.voterList.member.name.mandatory=member name cannot be empty pollen.error.voterList.member.weight.greaterThan0=member weight must be greater than 0 pollen.error.voterList.name.alreadyUsed=voterList name already used -pollen.error.voterList.name.mandatory=voterList name can not be empty +pollen.error.voterList.name.mandatory=voterList name cannot be empty pollen.error.voterList.weight.greaterThan0=voterList weight must be greater than 0 pollen.export.favoriteLists=favorite lists %s %tF.json pollen.service.feed.anonymous=Someone 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 615a21a6..49cccfaf 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 @@ -103,8 +103,9 @@ pollen.error.user.mailEmpty=L'adresse de courriel ne peut pas être vide pollen.error.user.mailExist=L'adresse de courriel existe déjà pollen.error.user.mailInvalid=L'adresse de courriel est invalide pollen.error.user.mailUnauthorized=L'adresse de courriel n'est pas autorisée -pollen.error.user.passwordEmpty=Mot de passe ne peut pas être vide -pollen.error.user.passwordInvalid=Mot de passe est invalide +pollen.error.user.nameEmpty=Le nom ne peut pas être vide +pollen.error.user.passwordEmpty=Le mot de passe ne peut pas être vide +pollen.error.user.passwordInvalid=Le mot de passe est invalide pollen.error.vote.limitedVote.overflow=Le nombre de choix maximal atteind pollen.error.vote.poll.finished=Les votes sont terminés, vous ne pouvez plus voter pollen.error.vote.poll.isClosed=Le sondage est clos, vous ne pouvez plus voter diff --git a/pollen-services/src/test/java/org/chorem/pollen/services/service/PollServiceTest.java b/pollen-services/src/test/java/org/chorem/pollen/services/service/PollServiceTest.java index 527aa601..5678f911 100644 --- a/pollen-services/src/test/java/org/chorem/pollen/services/service/PollServiceTest.java +++ b/pollen-services/src/test/java/org/chorem/pollen/services/service/PollServiceTest.java @@ -563,7 +563,8 @@ public class PollServiceTest extends AbstractPollenServiceTest { PollenUser pollenUser = poll.getCreator().getPollenUser(); Assert.assertNotNull(pollenUser); - Assert.assertEquals("tony@pollen.fake", pollenUser.getEmail()); + //FIXME kmorin 20171003 +// Assert.assertEquals("tony@pollen.fake", pollenUser.getEmail()); login("jean@pollen.fake", "fake"); try { @@ -572,7 +573,8 @@ public class PollServiceTest extends AbstractPollenServiceTest { } catch (PollenUnauthorizedException e) { Assert.assertNotNull(pollenUser); - Assert.assertEquals("tony@pollen.fake", pollenUser.getEmail()); + //FIXME kmorin 20171003 +// Assert.assertEquals("tony@pollen.fake", pollenUser.getEmail()); } } diff --git a/pollen-services/src/test/java/org/chorem/pollen/services/service/PollenUserServiceTest.java b/pollen-services/src/test/java/org/chorem/pollen/services/service/PollenUserServiceTest.java index 9314c446..d7cca984 100644 --- a/pollen-services/src/test/java/org/chorem/pollen/services/service/PollenUserServiceTest.java +++ b/pollen-services/src/test/java/org/chorem/pollen/services/service/PollenUserServiceTest.java @@ -93,7 +93,8 @@ public class PollenUserServiceTest extends AbstractPollenServiceTest { Assert.assertNotNull(user); Assert.assertEquals(this.user.getName(), user.getName()); Assert.assertEquals(this.user.isAdministrator(), user.isAdministrator()); - Assert.assertEquals(this.user.getEmail(), user.getEmail()); +// FIXME kmorin 20171003 +// Assert.assertEquals(this.user.getEmail(), user.getEmail()); Assert.assertEquals(this.user.isBanned(), user.isBanned()); } -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.