This is an automated email from the git hooks/post-receive script. New change to branch feature/44_several_email_address in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git at beb73f87 refs #44 checks de sécurité + refactoring + tests unitaires This branch includes the following new commits: new cc5d175c refs #44 debut de modifs du back pour accepter plusieurs emails par utilisateur new f9cdab49 fichier oublié new beb73f87 refs #44 checks de sécurité + refactoring + tests unitaires The 3 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 beb73f87483cbf14c39e1c1f0e5786dac77d71b2 Author: Kevin Morin <morin@codelutin.com> Date: Mon Oct 9 16:43:06 2017 +0200 refs #44 checks de sécurité + refactoring + tests unitaires 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 commit f9cdab49b012e83a7e7a3c2f09c94d0729179ef8 Author: Kevin Morin <morin@codelutin.com> Date: Thu Oct 5 10:46:13 2017 +0200 fichier oublié -- 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/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>.
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 f9cdab49b012e83a7e7a3c2f09c94d0729179ef8 Author: Kevin Morin <morin@codelutin.com> Date: Thu Oct 5 10:46:13 2017 +0200 fichier oublié --- .../entity/PollenUserEmailAddressTopiaDao.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUserEmailAddressTopiaDao.java b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUserEmailAddressTopiaDao.java new file mode 100644 index 00000000..df319654 --- /dev/null +++ b/pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUserEmailAddressTopiaDao.java @@ -0,0 +1,21 @@ +package org.chorem.pollen.persistence.entity; + +import java.util.HashMap; +import java.util.Map; + +public class PollenUserEmailAddressTopiaDao extends AbstractPollenUserEmailAddressTopiaDao<PollenUserEmailAddress> { + + public boolean emailExists(String email) { + return forEmailAddressEquals(email).exists(); + } + + public PollenUserEmailAddress findEmailAddressByToken(String token) { + String hql = newFromClause() + + " WHERE " + PollenUserEmailAddress.PROPERTY_ACTIVATION_TOKEN + "." + PollenToken.PROPERTY_TOKEN + + " = :token"; + Map<String, Object> params = new HashMap<>(); + params.put("token", token); + return findUniqueOrNull(hql, params); + } + +} //PollenUserEmailAddressTopiaDao -- 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/44_several_email_address in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit beb73f87483cbf14c39e1c1f0e5786dac77d71b2 Author: Kevin Morin <morin@codelutin.com> Date: Mon Oct 9 16:43:06 2017 +0200 refs #44 checks de sécurité + refactoring + tests unitaires --- .../persistence/entity/PollenUserTopiaDao.java | 19 ++- .../persistence/entity/UserCredentialTopiaDao.java | 25 ++-- .../chorem/pollen/rest/api/PollenUserApiTest.java | 2 +- .../pollen/services/service/PollenUserService.java | 51 ++++++- .../pollen/services/service/SocialAuthService.java | 7 +- .../pollen/services/service/VoterListService.java | 82 +---------- .../PollenDefaultEmailAddressException.java | 34 +++++ .../service/security/PollenSecurityRealm.java | 2 +- .../services/service/security/SecurityService.java | 8 +- pollen-services/src/main/resources/fixtures.yaml | 12 +- .../services/service/FavoriteListServiceTest.java | 10 +- .../pollen/services/service/PollServiceTest.java | 12 +- .../services/service/PollenUserServiceTest.java | 152 +++++++++++++-------- .../services/service/VoterListServiceTest.java | 6 +- 14 files changed, 235 insertions(+), 187 deletions(-) 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 28fe12f7..d17dbbbb 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 @@ -30,7 +30,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; /** * @author Tony Chemit - dev@tchemit.fr @@ -67,7 +66,7 @@ public class PollenUserTopiaDao extends AbstractPollenUserTopiaDao<PollenUser> { } - public Optional<PollenUser> tryFindUserWithCredential(String providerId, String userId) { + public PollenUser findUserWithCredentialOrNull(String providerId, String userId) { Objects.requireNonNull(providerId); Objects.requireNonNull(userId); @@ -80,6 +79,20 @@ public class PollenUserTopiaDao extends AbstractPollenUserTopiaDao<PollenUser> { parameters.put("providerId", providerId); parameters.put("userId", userId); - return Optional.ofNullable(findUniqueOrNull(hql, parameters)); + return findUniqueOrNull(hql, parameters); } + + public PollenUser findUserWithEmailAddressOrNull(String emailAddress) { + Objects.requireNonNull(emailAddress); + + Map<String, Object> parameters = new HashMap<>(); + + String hql = "SELECT user FROM " + PollenUser.class.getName() + " as user " + + "INNER JOIN user." + PollenUser.PROPERTY_EMAIL_ADDRESSES + " as emailAddresses " + + "WHERE emailAddresses." + PollenUserEmailAddress.PROPERTY_EMAIL_ADDRESS + " = :emailAddress"; + parameters.put("emailAddress", emailAddress); + + return findUniqueOrNull(hql, parameters); + } + } 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 f4a3d205..4e31206b 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 @@ -28,24 +28,27 @@ public class UserCredentialTopiaDao extends AbstractUserCredentialTopiaDao<UserC public boolean isCredentialValid(String provider, String credentialUserId, String userTopiaId, String email) { String query = "SELECT COUNT(*)" - + " FROM " + PollenUser.class.getName() + " AS user RIGHT JOIN user." + PollenUser.PROPERTY_USER_CREDENTIAL + " AS credential" - + " WHERE" - + " (credential." + UserCredential.PROPERTY_PROVIDER + " = :provider" - + " AND credential." + UserCredential.PROPERTY_USER_ID + " = :credentialUserId)"; - //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)"; -// } + + " FROM " + PollenUser.class.getName() + " AS user" + + " LEFT JOIN user." + PollenUser.PROPERTY_USER_CREDENTIAL + " AS credential"; + if (email != null) { + query += " LEFT JOIN user." + PollenUser.PROPERTY_EMAIL_ADDRESSES + " AS emailAddress"; + } + query += " 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 emailAddress." + PollenUserEmailAddress.PROPERTY_EMAIL_ADDRESS + " = :emailAddress)"; + } Map<String, Object> params = new HashMap<>(); params.put("provider", provider); params.put("credentialUserId", credentialUserId); if (email != null) { - params.put("userEmail", email); params.put("userTopiaId", userTopiaId); params.put("credentialEmail", email); + params.put("emailAddress", email); } return count(query, params) == 0; } 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 95b2e8d5..309f6c52 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 @@ -80,7 +80,7 @@ public class PollenUserApiTest extends AbstractPollenRestApiTest { String content = request.execute().returnContent().asString(); showTestResult(content); assertTrue(content.contains("email")); - assertTrue(content.contains("jean@pollen.fake")); + assertTrue(content.contains("jean@pollen.org")); } 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 8f88d1fc..3f2b45f5 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 @@ -42,6 +42,8 @@ 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.PollenDefaultEmailAddressException; +import org.chorem.pollen.services.service.security.PollenEmailNotValidatedException; import org.chorem.pollen.services.service.security.PollenInvalidEmailActivationTokenException; import org.chorem.pollen.services.service.security.PollenInvalidPasswordException; import org.chorem.pollen.services.service.security.PollenSecurityContext; @@ -101,6 +103,7 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer public PollenUserEmailAddressBean toPollenUserEmailAddressBean(PollenUserEmailAddress entity) { PollenUserEmailAddressBean bean = new PollenUserEmailAddressBean(); + bean.setEntityId(entity.getTopiaId()); bean.setEmailAddress(entity.getEmailAddress()); bean.setValidated(entity.getActivationToken() == null); return bean; @@ -148,7 +151,9 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer checkIsNotPersisted(user); ErrorMap errorMap = checkPollenUser(user); - if (user.getDefaultEmailAddress() != null) { + if (user.getDefaultEmailAddress() == null) { + errorMap.addError("email", "pollen.error.user.mailEmpty"); + } else { checkUserEmailAddress(errorMap, user.getDefaultEmailAddress().getEmailAddress()); } errorMap.failIfNotEmpty(); @@ -312,12 +317,21 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer } public PollenEntityRef<PollenUserEmailAddress> addEmailAddress(String emailAddress) throws InvalidFormException { + PollenUser connectedUser = checkAndGetConnectedUser(); + return addEmailAddress(connectedUser.getTopiaId(), emailAddress); + } + + public PollenEntityRef<PollenUserEmailAddress> addEmailAddress(String userId, String emailAddress) throws InvalidFormException { + checkConnectedUserOrAdmin(userId); + return addEmailAddress(getUser0(userId), emailAddress); + } + + protected PollenEntityRef<PollenUserEmailAddress> addEmailAddress(PollenUser user, String emailAddress) throws InvalidFormException { checkNotNull(emailAddress); ErrorMap errors = new ErrorMap(); emailAddress = checkUserEmailAddress(errors, emailAddress); errors.failIfNotEmpty(); - PollenUser user = checkAndGetConnectedUser(); PollenUserEmailAddress address = getPollenUserEmailAddressDao().create(); address.setEmailAddress(emailAddress); PollenToken emailActivation = getSecurityService().generateNewToken(); @@ -338,20 +352,45 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer return emailAddress; } - public void setDefaultEmailAddress(String emailAddressId) { + public void setDefaultEmailAddress(String emailAddressId) throws PollenEmailNotValidatedException { + PollenUser connectedUser = checkAndGetConnectedUser(); + setDefaultEmailAddress(connectedUser, emailAddressId); + } + + public void setDefaultEmailAddress(String userId, String emailAddressId) throws PollenEmailNotValidatedException { + checkConnectedUserOrAdmin(userId); + setDefaultEmailAddress(getUser0(userId), emailAddressId); + } + + protected void setDefaultEmailAddress(PollenUser user, String emailAddressId) throws PollenEmailNotValidatedException { checkNotNull(emailAddressId); - PollenUser user = checkAndGetConnectedUser(); PollenUserEmailAddress emailAddress = user.getEmailAddressesByTopiaId(emailAddressId); checkNotNull(emailAddress); + if (emailAddress.getActivationToken() != null) { + throw new PollenEmailNotValidatedException(); + } user.setDefaultEmailAddress(emailAddress); commit(); } - public void removeEmailAddress(String emailAddressId) { + public void removeEmailAddress(String emailAddressId) throws PollenDefaultEmailAddressException { + PollenUser connectedUser = checkAndGetConnectedUser(); + removeEmailAddressFromUser(connectedUser, emailAddressId); + } + + public void removeEmailAddress(String userId, String emailAddressId) throws PollenDefaultEmailAddressException { + checkConnectedUserOrAdmin(userId); + removeEmailAddressFromUser(getUser0(userId), emailAddressId); + } + + protected void removeEmailAddressFromUser(PollenUser user, String emailAddressId) throws PollenDefaultEmailAddressException { checkNotNull(emailAddressId); - PollenUser user = checkAndGetConnectedUser(); + if (user.getDefaultEmailAddress() != null && user.getDefaultEmailAddress().getTopiaId().equals(emailAddressId)) { + throw new PollenDefaultEmailAddressException(); + } PollenUserEmailAddress emailAddress = user.getEmailAddressesByTopiaId(emailAddressId); checkNotNull(emailAddress); + user.removeEmailAddresses(emailAddress); getPollenUserEmailAddressDao().delete(emailAddress); commit(); } 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 5f3ba2ec..a3f896c3 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 @@ -52,7 +52,6 @@ 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; /** @@ -73,13 +72,13 @@ public class SocialAuthService extends PollenServiceSupport { PollenUser pollenUser; PollenUserTopiaDao userDao = getPollenUserDao(); - Optional<PollenUser> pollenUserForCredential = userDao.tryFindUserWithCredential(p.getProviderId(), p.getValidatedId()); + PollenUser pollenUserForCredential = userDao.findUserWithCredentialOrNull(p.getProviderId(), p.getValidatedId()); - if (pollenUserForCredential.isPresent()) { + if (pollenUserForCredential != null) { if (log.isDebugEnabled()) { log.debug("credentials found"); } - pollenUser = pollenUserForCredential.get(); + pollenUser = pollenUserForCredential; } else if (getPollenUserEmailAddressDao().emailExists(p.getEmail())) { throw new PollenEmailOrProviderAccountAlreadyUsedException(); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java index eb9a3833..3aa8e4e2 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java @@ -56,86 +56,6 @@ import static org.nuiton.i18n.I18n.l; */ public class VoterListService extends PollenServiceSupport { -// protected VoterListMemberBean emailToMember(String email) { -// VoterListMemberBean member = new VoterListMemberBean(); -// member.setEmail(email); -// member.setWeight(1.0); -// PollenUser user = getPollenUserDao().forEmailEquals(email).findAnyOrNull(); -// if (user != null) { -// member.setName(user.getName()); -// } else { -// member.setName(email); -// } -// return member; -// } - -// public PollenEntityRef<VoterList> importFavoriteList(String pollId, -// String favoriteListId) { -// return importFavoriteList(pollId, null, favoriteListId); -// } -// -// public PollenEntityRef<VoterList> importFavoriteList(String pollId, -// String parentId, -// String favoriteListId) { -// -// checkIsConnected(); -// checkNotNull(pollId); -// checkNotNull(favoriteListId); -// checkPermission(PermissionVerb.editPoll, pollId); -// -// Poll poll = getPollService().getPoll0(pollId); -// -// PollenUser user = getConnectedUser(); -// -// FavoriteList favoriteList = getFavoriteListService().getFavoriteList0(user, favoriteListId); -// -// VoterList result = null; -// List<VoterListMember> existingVoterListMembers = null; -// if (parentId != null) { -// result = getVoterList0(poll, parentId); -// } else { -// if (poll.getPollType() == PollType.RESTRICTED) { -// List<VoterList> existingVoterList = getVoterLists0(poll); -// if (existingVoterList.size() > 0) { -// result = getVoterList0(poll, existingVoterList.get(0).getTopiaId()); -// } -// } -// } -// -// if (result == null) { -// VoterListTopiaDao dao = getVoterListDao(); -// result = dao.create(); -// result.setName(favoriteList.getName()); -// result.setWeight(1d); -// } else { -// existingVoterListMembers = getVoterListMembers0(result); -// } -// -// List<FavoriteListMember> favoriteListMembers = getFavoriteListService().getFavoriteListMembers0(favoriteList); -// -// for (FavoriteListMember favoriteListMember : favoriteListMembers) { -// VoterListMemberBean voterListMember = new VoterListMemberBean(); -// -// voterListMember.setName(favoriteListMember.getName()); -// voterListMember.setEmail(favoriteListMember.getEmail()); -// voterListMember.setWeight(1d); -// -// ErrorMap errorMap = checkVoterListMember(existingVoterListMembers, voterListMember); -// if (errorMap.isEmpty()) { -// // no error then create member -// saveVoterListMember(result, voterListMember); -// } -// -// } -// -// result.setPoll(poll); -// -// commit(); -// -// return PollenEntityRef.of(result); -// -// } - public VoterListMemberBean toVoterListMemberBean(VoterListMember entity) { VoterListMemberBean bean = new VoterListMemberBean(); @@ -463,7 +383,7 @@ public class VoterListService extends PollenServiceSupport { String cleanMail = getCleanMail(voterListMember.getEmail()); if (!voterListMemberExists || !cleanMail.equals(toSave.getMember().getEmail())) { PollenPrincipal member = searchOrCreatePrincipal(poll, cleanMail, voterListMember.getName()); - PollenUser user = getPollenUserDao().forEquals(PollenUser.PROPERTY_EMAIL, cleanMail).findUniqueOrNull(); + PollenUser user = getPollenUserDao().findUserWithEmailAddressOrNull(cleanMail); if (user != null) { member.setPollenUser(user); member.setName(user.getName()); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PollenDefaultEmailAddressException.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PollenDefaultEmailAddressException.java new file mode 100644 index 00000000..a1a0c79e --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PollenDefaultEmailAddressException.java @@ -0,0 +1,34 @@ +package org.chorem.pollen.services.service.security; + +/* + * #%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% + */ + +/** + * Error thrown when the user tires to login although he has not yet validated his email. + * + * @author Kevin Morin - morin@codelutin.com + */ +public class PollenDefaultEmailAddressException extends Exception { + + public PollenDefaultEmailAddressException() { + super("defaultEmailAddress"); + } +} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PollenSecurityRealm.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PollenSecurityRealm.java index a19678df..e6290db4 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PollenSecurityRealm.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/security/PollenSecurityRealm.java @@ -80,7 +80,7 @@ public class PollenSecurityRealm extends AuthorizingRealm { try (PollenTopiaPersistenceContext persistenceContext = applicationContext.newPersistenceContext()) { PollenUser pollenUser = - persistenceContext.getPollenUserDao().forEmailEquals(username).findUniqueOrNull(); + persistenceContext.getPollenUserDao().findUserWithEmailAddressOrNull(username); if (pollenUser == null) { throw new AuthenticationException(); 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 b41bfb2a..82813313 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 @@ -154,7 +154,10 @@ public class SecurityService extends PollenServiceSupport { throw new PollenAuthenticationException(e); } - PollenUser user = getPollenUserDao().forEmailEquals(login).findUnique(); + PollenUser user = getPollenUserDao().findUserWithEmailAddressOrNull(login); + if (user == null) { + throw new PollenUnauthorizedException(login); + } return getSessionTokenForUser(user); } @@ -207,8 +210,7 @@ public class SecurityService extends PollenServiceSupport { Preconditions.checkNotNull(login); - //FIXME - PollenUser user = getPollenUserDao().forEmailEquals(login).findUniqueOrNull(); + PollenUser user = getPollenUserDao().findUserWithEmailAddressOrNull(login); if (user == null) { throw new PollenUnauthorizedException(login); diff --git a/pollen-services/src/main/resources/fixtures.yaml b/pollen-services/src/main/resources/fixtures.yaml index cce8c5d6..9d3814be 100644 --- a/pollen-services/src/main/resources/fixtures.yaml +++ b/pollen-services/src/main/resources/fixtures.yaml @@ -1,10 +1,10 @@ email_address_tony_default: &email_address_tony1 !email-address - emailAddress: tony@pollen.fake + emailAddress: tony@pollen.org email_address_tony_2: &email_address_tony2 !email-address - emailAddress: tony2@pollen.fake + emailAddress: tony2@pollen.org user_tony: &tony !user @@ -18,15 +18,15 @@ user_tony: email_address_jean_default: &email_address_jean1 !email-address - emailAddress: jean@pollen.fake + emailAddress: jean@pollen.org email_address_jean_2: &email_address_jean2 !email-address - emailAddress: jean2@pollen.fake + emailAddress: jean2@pollen.org email_address_jean_3: &email_address_jean3 !email-address - emailAddress: jean3@pollen.fake + emailAddress: jean3@pollen.org user_jean: &jean !user @@ -41,7 +41,7 @@ user_jean: email_address_julien_default: &email_address_julien !email-address - emailAddress: julien@pollen.fake + emailAddress: julien@pollen.org user_julien: &julien !user diff --git a/pollen-services/src/test/java/org/chorem/pollen/services/service/FavoriteListServiceTest.java b/pollen-services/src/test/java/org/chorem/pollen/services/service/FavoriteListServiceTest.java index aea159c4..e5f12b6a 100644 --- a/pollen-services/src/test/java/org/chorem/pollen/services/service/FavoriteListServiceTest.java +++ b/pollen-services/src/test/java/org/chorem/pollen/services/service/FavoriteListServiceTest.java @@ -79,7 +79,7 @@ public class FavoriteListServiceTest extends AbstractPollenServiceTest { @Test public void importFavoriteListFromFile() throws PollenInvalidSessionTokenException, PollenAuthenticationException, InvalidFormException, IOException, FavoriteListImportException, PollenEmailNotValidatedException, PollenUserBannedException { - login("jean@pollen.fake", "fake"); + login("jean@pollen.org", "fake"); FavoriteListBean favoriteListBean1 = new FavoriteListBean(); @@ -109,7 +109,7 @@ public class FavoriteListServiceTest extends AbstractPollenServiceTest { @Test public void createFavoriteList() throws PollenInvalidSessionTokenException, PollenAuthenticationException, InvalidFormException, PollenEmailNotValidatedException, PollenUserBannedException { - login("jean@pollen.fake", "fake"); + login("jean@pollen.org", "fake"); // create a first list @@ -226,7 +226,7 @@ public class FavoriteListServiceTest extends AbstractPollenServiceTest { @Test public void editFavoriteList() throws PollenInvalidSessionTokenException, PollenAuthenticationException, InvalidFormException, PollenEmailNotValidatedException, PollenUserBannedException { - login("jean@pollen.fake", "fake"); + login("jean@pollen.org", "fake"); // create a first list @@ -295,7 +295,7 @@ public class FavoriteListServiceTest extends AbstractPollenServiceTest { @Test public void editFavoriteListMember() throws PollenInvalidSessionTokenException, PollenAuthenticationException, InvalidFormException, PollenEmailNotValidatedException, PollenUserBannedException { - login("jean@pollen.fake", "fake"); + login("jean@pollen.org", "fake"); // create a first list @@ -389,7 +389,7 @@ public class FavoriteListServiceTest extends AbstractPollenServiceTest { @Test public void editChildFavoriteList() throws PollenInvalidSessionTokenException, PollenAuthenticationException, InvalidFormException, PollenEmailNotValidatedException, PollenUserBannedException { - login("jean@pollen.fake", "fake"); + login("jean@pollen.org", "fake"); // create a first list 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 5678f911..2f241c99 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 @@ -549,7 +549,7 @@ public class PollServiceTest extends AbstractPollenServiceTest { Assert.assertNull(poll.getCreator().getPollenUser()); } - login("tony@pollen.fake", "fake"); + login("tony@pollen.org", "fake"); try { service.assignPollToConnectedUser(poll.getTopiaId()); Assert.fail("An error should be thrown if the connected user does not provide the permission to edit the poll"); @@ -563,18 +563,18 @@ public class PollServiceTest extends AbstractPollenServiceTest { PollenUser pollenUser = poll.getCreator().getPollenUser(); Assert.assertNotNull(pollenUser); - //FIXME kmorin 20171003 -// Assert.assertEquals("tony@pollen.fake", pollenUser.getEmail()); + Assert.assertTrue(pollenUser.getEmailAddresses().stream() + .anyMatch(emailAddress -> "tony@pollen.org".equals(emailAddress.getEmailAddress()))); - login("jean@pollen.fake", "fake"); + login("jean@pollen.org", "fake"); try { service.assignPollToConnectedUser(poll.getTopiaId()); Assert.fail("An error should be thrown as the poll is already assigned to a user"); } catch (PollenUnauthorizedException e) { Assert.assertNotNull(pollenUser); - //FIXME kmorin 20171003 -// Assert.assertEquals("tony@pollen.fake", pollenUser.getEmail()); + Assert.assertTrue(pollenUser.getEmailAddresses().stream() + .anyMatch(emailAddress -> "tony@pollen.org".equals(emailAddress.getEmailAddress()))); } } 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 d7cca984..80c4d071 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 @@ -23,12 +23,15 @@ package org.chorem.pollen.services.service; import org.apache.commons.collections4.CollectionUtils; import org.chorem.pollen.persistence.entity.PollenUser; +import org.chorem.pollen.persistence.entity.PollenUserEmailAddress; import org.chorem.pollen.services.AbstractPollenServiceTest; import org.chorem.pollen.services.bean.PaginationResultBean; 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.bean.PollenUserEmailAddressBean; import org.chorem.pollen.services.service.security.PollenAuthenticationException; +import org.chorem.pollen.services.service.security.PollenDefaultEmailAddressException; import org.chorem.pollen.services.service.security.PollenEmailNotValidatedException; import org.chorem.pollen.services.service.security.PollenInvalidSessionTokenException; import org.chorem.pollen.services.service.security.PollenUserBannedException; @@ -38,7 +41,11 @@ import org.junit.Test; import org.nuiton.topia.persistence.TopiaNoResultException; import java.text.ParseException; +import java.util.Arrays; import java.util.Date; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; /** * TODO @@ -67,10 +74,10 @@ public class PollenUserServiceTest extends AbstractPollenServiceTest { @Test public void testGetPollenUsers() throws PollenAuthenticationException, PollenInvalidSessionTokenException, PollenEmailNotValidatedException, PollenUserBannedException { - login("jean@pollen.fake", "fake"); - PaginationResultBean<PollenUserBean> users = service.getUsers(null, ""); + login("jean@pollen.org", "fake"); + PaginationResultBean<PollenUserBean> users = service.getUsers(null, ""); Assert.assertNotNull(users); Assert.assertTrue(CollectionUtils.isNotEmpty(users.getElements())); @@ -79,7 +86,7 @@ public class PollenUserServiceTest extends AbstractPollenServiceTest { @Test public void testGetPollenUser() throws PollenInvalidSessionTokenException, PollenAuthenticationException, PollenEmailNotValidatedException, PollenUserBannedException { - login("jean@pollen.fake", "fake"); + login("jean@pollen.org", "fake"); try { service.getUser("pollen_user_tony_" + System.nanoTime()); @@ -93,8 +100,9 @@ public class PollenUserServiceTest extends AbstractPollenServiceTest { Assert.assertNotNull(user); Assert.assertEquals(this.user.getName(), user.getName()); Assert.assertEquals(this.user.isAdministrator(), user.isAdministrator()); -// FIXME kmorin 20171003 -// Assert.assertEquals(this.user.getEmail(), user.getEmail()); + Assert.assertEquals(this.user.sizeEmailAddresses(), user.getEmailAddresses().size()); + Assert.assertEquals(this.user.getDefaultEmailAddress().getEmailAddress(), user.getDefaultEmailAddress().getEmailAddress()); + Assert.assertEquals(this.user.getDefaultEmailAddress().getTopiaId(), user.getDefaultEmailAddress().getEntityId()); Assert.assertEquals(this.user.isBanned(), user.isBanned()); } @@ -111,27 +119,30 @@ public class PollenUserServiceTest extends AbstractPollenServiceTest { } PollenUserBean newUser = new PollenUserBean(); - newUser.setEmail("pollen@notpollen.org"); + setDefaultEmail(newUser, "pollen@notpollen.org"); try { + // no name // no generate password // unauthorized email service.createUser(newUser); Assert.fail(); } catch (InvalidFormException e) { // no password - assertErrorKeyFound(e, "password", "email"); + assertErrorKeyFound(e, "name", "password", "email"); } - newUser.setEmail("pollen@pollen.org"); + setDefaultEmail(newUser, "pollen@pollen.org"); newUser.setPassword("password"); + newUser.setName("Pollen"); PollenEntityRef<PollenUser> savedUser = service.createUser(newUser); Assert.assertNotNull(savedUser); Assert.assertNotNull(savedUser.getEntityId()); PollenUserBean newUser2 = new PollenUserBean(); - newUser2.setEmail("pollen@pollen.org"); + newUser2.setName("Pollen"); + setDefaultEmail(newUser2, "pollen@pollen.org"); try { service.createUser(newUser2); @@ -152,7 +163,7 @@ public class PollenUserServiceTest extends AbstractPollenServiceTest { assertErrorKeyFound(e, "email"); } - newUser2.setEmail("pollen2@pollen.org"); + setDefaultEmail(newUser2, "pollen2@pollen.org"); PollenEntityRef<PollenUser> savedUser2 = service.createUser(newUser2); Assert.assertNotNull(savedUser2); Assert.assertNotNull(savedUser2.getEntityId()); @@ -160,6 +171,7 @@ public class PollenUserServiceTest extends AbstractPollenServiceTest { // generate password by the server PollenUserBean newUser3 = new PollenUserBean(); newUser3.setPassword("azerty"); + newUser3.setName("Pollen"); try { service.createUser(newUser3); @@ -169,7 +181,7 @@ public class PollenUserServiceTest extends AbstractPollenServiceTest { assertErrorKeyFound(e, "email"); } - newUser3.setEmail("pollen@pollen.org"); + setDefaultEmail(newUser3, "pollen@pollen.org"); try { service.createUser(newUser3); @@ -179,7 +191,7 @@ public class PollenUserServiceTest extends AbstractPollenServiceTest { assertErrorKeyFound(e, "email"); } - newUser3.setEmail("pollen3@pollen.org"); + setDefaultEmail(newUser3, "pollen3@pollen.org"); PollenEntityId<PollenUser> savedUser3 = service.createUser(newUser3); Assert.assertNotNull(savedUser3); @@ -187,63 +199,89 @@ public class PollenUserServiceTest extends AbstractPollenServiceTest { } @Test - public void testEditUser() throws InvalidFormException, PollenInvalidSessionTokenException, PollenAuthenticationException, PollenEmailNotValidatedException, PollenUserBannedException { + public void testEditUser() throws InvalidFormException, PollenInvalidSessionTokenException, PollenAuthenticationException, PollenEmailNotValidatedException, PollenUserBannedException, PollenDefaultEmailAddressException { - login("jean@pollen.fake", "fake"); + login("jean@pollen.org", "fake"); PollenUserBean user = service.getUser(this.user.getTopiaId()); + String originalEmail = user.getDefaultEmailAddress().getEmailAddress(); user.setPassword("password"); Assert.assertNotNull(user); -// Assert.assertNull(user.getEmailActivationToken()); - -// getServiceContext().getPersistenceContext().getHibernateSupport().getHibernateSession().evict(user); - String email = "tony@pollen.org"; - user.setEmail(email); + String email = "tony4@pollen.org"; + setEmails(user, email); service.editUser(user); PollenUserBean savedUser = service.getUser(user.getEntityId()); Assert.assertNotNull(savedUser); - Assert.assertEquals(email, savedUser.getEmail()); -// Assert.assertNotNull(savedUser.getEmailActivationToken()); + // the email addresses are not updated in the edit method + Assert.assertEquals(2, savedUser.getEmailAddresses().size()); + Assert.assertEquals(originalEmail, savedUser.getDefaultEmailAddress().getEmailAddress()); + + try { + service.addEmailAddress(user.getEntityId(), "jean@pollen.org"); + Assert.fail(); + } catch (InvalidFormException e) { + // not available email + assertErrorKeyFound(e, "email"); + } + + PollenEntityRef<PollenUserEmailAddress> lastEmailAddress = service.addEmailAddress(savedUser.getEntityId(), email); + + savedUser = service.getUser(savedUser.getEntityId()); + Assert.assertNotNull(savedUser); + Assert.assertEquals(3, savedUser.getEmailAddresses().size()); + Optional<PollenUserEmailAddressBean> lastEmailAddressBean = savedUser.getEmailAddresses().stream() + .filter(emailAddress -> emailAddress.getEntityId().equals(lastEmailAddress.getEntityId())) + .findFirst(); + Assert.assertFalse(lastEmailAddressBean.get().isValidated()); + + try { + service.setDefaultEmailAddress(savedUser.getEntityId(), lastEmailAddress.getEntityId()); + Assert.fail(); + } catch (PollenEmailNotValidatedException e) { + savedUser = service.getUser(savedUser.getEntityId()); + Assert.assertEquals(originalEmail, savedUser.getDefaultEmailAddress().getEmailAddress()); + } + + Optional<PollenUserEmailAddressBean> emailAddressValidatedButNotDefaultOptional = savedUser.getEmailAddresses().stream() + .filter(emailAddress -> !emailAddress.getEmailAddress().equals(originalEmail) && emailAddress.isValidated()) + .findFirst(); + PollenUserEmailAddressBean emailAddressValidatedButNotDefaultBean = emailAddressValidatedButNotDefaultOptional.get(); + service.setDefaultEmailAddress(savedUser.getEntityId(), emailAddressValidatedButNotDefaultBean.getEntityId()); + savedUser = service.getUser(savedUser.getEntityId()); + Assert.assertEquals(emailAddressValidatedButNotDefaultBean.getEmailAddress(), + savedUser.getDefaultEmailAddress().getEmailAddress()); + + try { + service.removeEmailAddress(savedUser.getEntityId(), savedUser.getDefaultEmailAddress().getEntityId()); + Assert.fail(); + } catch (PollenDefaultEmailAddressException e) { + savedUser = service.getUser(savedUser.getEntityId()); + Assert.assertEquals(3, savedUser.getEmailAddresses().size()); + } + + service.removeEmailAddress(savedUser.getEntityId(), lastEmailAddress.getEntityId()); + savedUser = service.getUser(savedUser.getEntityId()); + Assert.assertEquals(2, savedUser.getEmailAddresses().size()); + + } + + protected void setEmails(PollenUserBean user, String ... emailAddresses) { + List<PollenUserEmailAddressBean> emailAddressBeans = Arrays.stream(emailAddresses).map(emailAddress -> { + PollenUserEmailAddressBean emailAddressBean = new PollenUserEmailAddressBean(); + emailAddressBean.setEmailAddress(emailAddress); + return emailAddressBean; + }).collect(Collectors.toList()); + user.setEmailAddresses(emailAddressBeans); + } + + protected void setDefaultEmail(PollenUserBean user, String emailAddress) { + PollenUserEmailAddressBean emailAddressBean = new PollenUserEmailAddressBean(); + emailAddressBean.setEmailAddress(emailAddress); + user.setDefaultEmailAddress(emailAddressBean); } -// @Test -// public void testValidateEmail() throws PollenInvalidEmailActivationTokenException, InvalidFormException { -// -// PollenUserBean user = service.getUser(this.user.getTopiaId()); -// Assert.assertNotNull(user); -// Assert.assertNull(user.getEmailActivationToken()); -// -// getServiceContext().getPersistenceContext().getHibernateSupport().getHibernateSession().evict(user); -// -// String email = "tony@pollen.org"; -// user.setEmail(email); -// user.setPassword("fake"); -// -// service.editUser(user); -// -// PollenUserBean savedUser = service.getUser(user.getId()); -// Assert.assertNotNull(savedUser); -// -// Assert.assertEquals(email, savedUser.getEmail()); -//// Assert.assertNotNull(savedUser.getEmailActivationToken()); -// -// try { -// service.validateUserEmail(user.getId(), "fakeToken"); -// Assert.fail(); -// } catch (PollenInvalidEmailActivationTokenException e) { -// Assert.assertTrue(true); -// } -// -// Assert.assertFalse(PollenUsers.isEmailActivated(savedUser)); -// -// service.validateUserEmail(user.getId(), savedUser.getEmailActivationToken().getToken()); -// -// PollenUserBean reloadedUser = service.getUser(this.user.getTopiaId()); -// Assert.assertTrue(PollenUsers.isEmailActivated(reloadedUser)); -// -// } } diff --git a/pollen-services/src/test/java/org/chorem/pollen/services/service/VoterListServiceTest.java b/pollen-services/src/test/java/org/chorem/pollen/services/service/VoterListServiceTest.java index 86d32982..12a3878f 100644 --- a/pollen-services/src/test/java/org/chorem/pollen/services/service/VoterListServiceTest.java +++ b/pollen-services/src/test/java/org/chorem/pollen/services/service/VoterListServiceTest.java @@ -86,7 +86,7 @@ public class VoterListServiceTest extends AbstractPollenServiceTest { // @Test // public void importFavoriteList() throws FavoriteListImportException, InvalidFormException, IOException, PollenInvalidSessionTokenException, PollenAuthenticationException { // -// login("jean@pollen.fake", "fake"); +// login("jean@pollen.org", "fake"); // // // create favorite list // @@ -146,13 +146,13 @@ public class VoterListServiceTest extends AbstractPollenServiceTest { @Test public void createVoterList() throws InvalidFormException, PollenInvalidSessionTokenException, PollenAuthenticationException, PollenEmailNotValidatedException, PollenUserBannedException { - login("jean@pollen.fake", "fake"); + login("jean@pollen.org", "fake"); PollBean poll = pollService.getNewPoll(ChoiceType.TEXT); poll.setPollType(PollType.RESTRICTED); poll.setTitle("poll1"); - poll.setParticipants(Sets.newHashSet("pierr@pollen.fake", "paul@pollen.fake", "jasque@pollen.fake")); + poll.setParticipants(Sets.newHashSet("pierr@pollen.org", "paul@pollen.org", "jasque@pollen.org")); List<ChoiceBean> choices = new ArrayList<>(); -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
participants (1)
-
chorem.org scm