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>.