Pollen-commits
Threads by month
- ----- 2026 -----
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
October 2017
- 1 participants
- 101 discussions
16 Oct '17
This is an automated email from the git hooks/post-receive script.
New change to branch feature/85-droits-utilisateurs in repository pollen.
See https://gitlab.nuiton.org/chorem/pollen.git
from 9401eb9a en fonction de la configuration serveur rendre obligatoire la connexion des utilisateur (refs #85)
new f8301440 ajout du lien qui explique comment tester les providers en local
The 1 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 f83014403dde4fcf02241d575172c04fad763189
Author: Kevin Morin <morin(a)codelutin.com>
Date: Mon Oct 16 14:43:27 2017 +0200
ajout du lien qui explique comment tester les providers en local
Summary of changes:
README.md | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
--
To stop receiving notification emails like this one, please contact
chorem.org SCM administrator <admin+scm(a)chorem.org>.
1
1
This is an automated email from the git hooks/post-receive script.
New change to branch develop in repository pollen.
See https://gitlab.nuiton.org/chorem/pollen.git
from 8281c4c0 ajout du type de bouton
adds 681c5f06 refs #44 debut de modifs du back pour accepter plusieurs emails par utilisateur
adds 4984c6df fichier oublié
adds 062dbeac refs #44 checks de sécurité + refactoring + tests unitaires
adds 36295f55 corrections exceptions
adds 36c7fa73 refs #44 correction de la migration
adds e574d5ce refs #44 envoi d'un mail pour validation de l'adresse email
adds cd10e94e refs #44 corrections
adds 8c99b526 refs #44 nouvelle ui pour les adresses email
adds 41a0c8a3 refs #44 meilleure gestion des emails de validation
adds 86a73fba refs #44 validation de l'adresse email par l'admin
adds ca0eeef8 refs #44 gestion des adresses email par l'admin
adds 90f30944 gestion de l'avatar par l'admin
adds afb6df3c refs #44 correction de la migration pour ajouter les emails des providers
new 1a9d7396 fixes #44 Several email addresses for the users
The 1 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 1a9d739657f12250a6fc32a01fcaee41c552e557
Merge: 8281c4c0 afb6df3c
Author: Kevin Morin <morin(a)codelutin.com>
Date: Mon Oct 16 11:59:20 2017 +0200
fixes #44 Several email addresses for the users
Summary of changes:
.../common/V3_1_0_5__Extract_email_addresses.java | 107 +++++++++++
.../entity/PollenUserEmailAddressTopiaDao.java | 21 ++
.../pollen/persistence/entity/PollenUserImpl.java | 2 +-
.../persistence/entity/PollenUserTopiaDao.java | 23 ++-
.../pollen/persistence/entity/PollenUsers.java | 35 ----
.../persistence/entity/UserCredentialTopiaDao.java | 18 +-
.../h2/V3_1_0_4__add_email_address_table.sql | 13 ++
.../h2/V3_1_0_6__drop_email_from_user.sql | 2 +
.../V3_1_0_4__add_email_address_table.sql | 13 ++
.../postgresql/V3_1_0_6__drop_email_from_user.sql | 2 +
pollen-persistence/src/main/xmi/pollen.properties | 2 +-
pollen-persistence/src/main/xmi/pollen.zargo | Bin 29234 -> 30366 bytes
.../pollen/rest/api/PollenRestApiApplication.java | 2 +
.../rest/api/PollenRestApiApplicationListener.java | 4 +-
... PollenDefaultEmailAddressExceptionMapper.java} | 12 +-
.../chorem/pollen/rest/api/v1/PollenUserApi.java | 69 +++++++
.../chorem/pollen/rest/api/PollenUserApiTest.java | 2 +-
.../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 | 49 +++--
.../pollen/services/service/PollService.java | 6 +-
.../services/service/PollenServiceSupport.java | 5 +
.../pollen/services/service/PollenUserService.java | 214 +++++++++++++++------
.../pollen/services/service/SocialAuthService.java | 36 +++-
.../pollen/services/service/VoterListService.java | 82 +-------
.../pollen/services/service/mail/EmailService.java | 22 ++-
.../services/service/mail/LostPasswordEmail.java | 3 -
.../service/mail/ResendValidationEmail.java | 12 --
.../service/mail/UserAccountCreatedEmail.java | 20 --
.../mail/UserAccountCreatedFromProviderEmail.java | 3 -
.../service/mail/UserAccountDeletedEmail.java | 3 -
.../service/mail/UserAccountEditedEmail.java | 3 -
...java => UserAccountEmailAddressAddedEmail.java} | 23 ++-
.../mail/UserAccountEmailValidatedEmail.java | 3 -
.../mail/UserAccountPasswordChangedEmail.java | 3 -
...ava => PollenDefaultEmailAddressException.java} | 6 +-
.../service/security/PollenSecurityRealm.java | 2 +-
.../services/service/security/SecurityService.java | 21 +-
.../resources/email/ResendValidationEmail.mustache | 6 +-
.../email/ResendValidationEmail_fr.mustache | 6 +-
.../email/UserAccountCreatedEmail.mustache | 8 +-
.../email/UserAccountCreatedEmail_fr.mustache | 8 +-
.../UserAccountEmailAddressAddedEmail.mustache | 5 +
.../UserAccountEmailAddressAddedEmail_fr.mustache | 5 +
.../email/UserAccountEmailValidatedEmail.mustache | 4 +-
.../UserAccountEmailValidatedEmail_fr.mustache | 4 +-
pollen-services/src/main/resources/fixtures.yaml | 49 ++++-
.../i18n/pollen-services_en_GB.properties | 38 ++--
.../i18n/pollen-services_fr_FR.properties | 6 +-
.../services/service/FavoriteListServiceTest.java | 10 +-
.../pollen/services/service/PollServiceTest.java | 10 +-
.../services/service/PollenUserServiceTest.java | 151 +++++++++------
.../services/service/VoterListServiceTest.java | 6 +-
pollen-ui-riot-js/src/main/web/css/main.css | 8 +
pollen-ui-riot-js/src/main/web/i18n/en.json | 33 ++--
pollen-ui-riot-js/src/main/web/i18n/fr.json | 72 ++++---
pollen-ui-riot-js/src/main/web/js/AuthService.js | 4 +
pollen-ui-riot-js/src/main/web/js/UserService.js | 43 ++++-
.../src/main/web/tag/PollenHeader.tag.html | 4 +-
.../src/main/web/tag/SignCheck.tag.html | 17 +-
.../src/main/web/tag/UserProfile.tag.html | 118 ++++++------
.../src/main/web/tag/admin/UserCard.tag.html | 7 +-
.../src/main/web/tag/admin/UserEditModal.tag.html | 169 +++++++++-------
.../src/main/web/tag/components/Card.tag.html | 8 +-
.../tag/components/UserEmailAddressList.tag.html | 139 +++++++++++++
.../main/web/tag/popup/InformationPopup.tag.html | 2 +-
.../src/main/web/tag/popup/Modal.tag.html | 2 +-
69 files changed, 1228 insertions(+), 631 deletions(-)
create mode 100644 pollen-persistence/src/main/java/db/migration/common/V3_1_0_5__Extract_email_addresses.java
create mode 100644 pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUserEmailAddressTopiaDao.java
delete mode 100644 pollen-persistence/src/main/java/org/chorem/pollen/persistence/entity/PollenUsers.java
create mode 100644 pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_4__add_email_address_table.sql
create mode 100644 pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_6__drop_email_from_user.sql
create mode 100644 pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_4__add_email_address_table.sql
create mode 100644 pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_6__drop_email_from_user.sql
copy pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/exceptionMappers/{PollenUserBannedExceptionMapper.java => PollenDefaultEmailAddressExceptionMapper.java} (68%)
create mode 100644 pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserEmailAddressBean.java
copy pollen-services/src/main/java/org/chorem/pollen/services/service/mail/{UserAccountDeletedEmail.java => UserAccountEmailAddressAddedEmail.java} (70%)
copy pollen-services/src/main/java/org/chorem/pollen/services/service/security/{PollenUserBannedException.java => PollenDefaultEmailAddressException.java} (86%)
create mode 100644 pollen-services/src/main/resources/email/UserAccountEmailAddressAddedEmail.mustache
create mode 100644 pollen-services/src/main/resources/email/UserAccountEmailAddressAddedEmail_fr.mustache
create mode 100644 pollen-ui-riot-js/src/main/web/tag/components/UserEmailAddressList.tag.html
--
To stop receiving notification emails like this one, please contact
chorem.org SCM administrator <admin+scm(a)chorem.org>.
1
1
16 Oct '17
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
from 90f30944 gestion de l'avatar par l'admin
new afb6df3c refs #44 correction de la migration pour ajouter les emails des providers
The 1 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 afb6df3c9513ff5339c109d66f456aabf7eeee55
Author: Kevin Morin <morin(a)codelutin.com>
Date: Mon Oct 16 11:49:11 2017 +0200
refs #44 correction de la migration pour ajouter les emails des providers
Summary of changes:
.../common/V3_1_0_5__Extract_email_addresses.java | 24 +++++++++++++++++++++-
1 file changed, 23 insertions(+), 1 deletion(-)
--
To stop receiving notification emails like this one, please contact
chorem.org SCM administrator <admin+scm(a)chorem.org>.
1
1
16 Oct '17
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
omits 57d016d0 refs #44 correction de la migration
omits 57687fee corrections exceptions
omits beb73f87 refs #44 checks de sécurité + refactoring + tests unitaires
omits f9cdab49 fichier oublié
omits cc5d175c refs #44 debut de modifs du back pour accepter plusieurs emails par utilisateur
adds 200e8231 implentation du jugement majoritaire (algo de dépouillement) ref #149
adds d989f50e Configuration du jugement majoritaire a l'edition du sondage ref #149
adds dd36bebb modification de l'écran de vote pour la jugement majoritaire ref #149
adds ddf81a43 modification de l'écran de résultat pour la jugement majoritaire ref #149
adds 3fe4ce2f Merge branch 'feature/149-jugement-majoritaire' into develop
adds 7249b09f correction de l'id de la resource pour les choix de type resource
adds 55e0db1c correction couleur des commentaires
adds 56c2b402 Borda : mise a jour du nombre de rangs si le nombre de choix change
adds 8281c4c0 ajout du type de bouton
new 681c5f06 refs #44 debut de modifs du back pour accepter plusieurs emails par utilisateur
new 4984c6df fichier oublié
new 062dbeac refs #44 checks de sécurité + refactoring + tests unitaires
new 36295f55 corrections exceptions
new 36c7fa73 refs #44 correction de la migration
new e574d5ce refs #44 envoi d'un mail pour validation de l'adresse email
new cd10e94e refs #44 corrections
new 8c99b526 refs #44 nouvelle ui pour les adresses email
new 41a0c8a3 refs #44 meilleure gestion des emails de validation
new 86a73fba refs #44 validation de l'adresse email par l'admin
new ca0eeef8 refs #44 gestion des adresses email par l'admin
new 90f30944 gestion de l'avatar par l'admin
This update added new revisions after undoing existing revisions.
That is to say, some revisions that were in the old version of the
branch are not in the new version. This situation occurs
when a user --force pushes a change and generates a repository
containing something like this:
* -- * -- B -- O -- O -- O (57d016d0)
\
N -- N -- N refs/heads/feature/44_several_email_address (90f30944)
You should already have received notification emails for all of the O
revisions, and so the following emails describe only the N revisions
from the common base, B.
Any revisions marked "omits" are not gone; other references still
refer to them. Any revisions marked "discards" are gone forever.
The 12 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 90f30944d050b55e87026d49a8c396521b19a263
Author: Kevin Morin <morin(a)codelutin.com>
Date: Mon Oct 16 11:18:59 2017 +0200
gestion de l'avatar par l'admin
commit ca0eeef88116a1851487cd75a54c0c5b22214d88
Author: Kevin Morin <morin(a)codelutin.com>
Date: Mon Oct 16 11:01:59 2017 +0200
refs #44 gestion des adresses email par l'admin
commit 86a73fba8d010b59ec2d29ed3f2fa3307bf8f20b
Author: Kevin Morin <morin(a)codelutin.com>
Date: Mon Oct 16 11:01:25 2017 +0200
refs #44 validation de l'adresse email par l'admin
commit 41a0c8a3773cd869fbb4ab2d1320000d9fffd54c
Author: Kevin Morin <morin(a)codelutin.com>
Date: Thu Oct 12 16:05:59 2017 +0200
refs #44 meilleure gestion des emails de validation
commit 8c99b526f2a41361eea13396fef7fdabeeb0f6e0
Author: Kevin Morin <morin(a)codelutin.com>
Date: Thu Oct 12 15:32:02 2017 +0200
refs #44 nouvelle ui pour les adresses email
commit cd10e94e18679a99ef8354b63d369ad5e80c25dc
Author: Kevin Morin <morin(a)codelutin.com>
Date: Thu Oct 12 15:31:25 2017 +0200
refs #44 corrections
commit e574d5ced9bd6b5a19791aad7316e508c5d2ca9c
Author: Kevin Morin <morin(a)codelutin.com>
Date: Thu Oct 12 15:31:03 2017 +0200
refs #44 envoi d'un mail pour validation de l'adresse email
commit 36c7fa73ad5ee0e2b7263392e617784d2c3ecc70
Author: Kevin Morin <morin(a)codelutin.com>
Date: Mon Oct 9 18:15:06 2017 +0200
refs #44 correction de la migration
commit 36295f55664cf06f2ffe58126345fe7a993c8595
Author: Kevin Morin <morin(a)codelutin.com>
Date: Mon Oct 9 17:01:01 2017 +0200
corrections exceptions
commit 062dbeaccc2bd720e394d829bde2ef264d27c815
Author: Kevin Morin <morin(a)codelutin.com>
Date: Mon Oct 9 16:43:06 2017 +0200
refs #44 checks de sécurité + refactoring + tests unitaires
commit 4984c6dfb80e2cade74af8539cff85fe6f7de069
Author: Kevin Morin <morin(a)codelutin.com>
Date: Thu Oct 5 10:46:13 2017 +0200
fichier oublié
commit 681c5f06e76c7215f9137bc1f429dde69d1d6804
Author: Kevin Morin <morin(a)codelutin.com>
Date: Thu Oct 5 10:34:12 2017 +0200
refs #44 debut de modifs du back pour accepter plusieurs emails par utilisateur
Summary of changes:
.../converter/VoteCountingConfigDeserializer.java | 17 +
.../chorem/pollen/rest/api/v1/PollenUserApi.java | 47 ++-
pollen-services/pom.xml | 5 +
.../pollen/services/bean/VoteCountingTypeBean.java | 4 +
.../voteCounting/VoteCountingDetailResultBean.java | 8 +
.../MajorityJudgmentChoiceResultBean.java | 62 ++++
.../MajorityJudgmentDetailResultBean.java | 58 ++++
.../pollen/services/service/ChoiceService.java | 2 +-
.../services/service/NotificationService.java | 8 +
.../pollen/services/service/PollenUserService.java | 33 ++
.../pollen/services/service/SocialAuthService.java | 2 +-
.../pollen/services/service/mail/EmailService.java | 15 +-
.../service/mail/ResendValidationEmail.java | 9 -
.../service/mail/UserAccountCreatedEmail.java | 17 -
...java => UserAccountEmailAddressAddedEmail.java} | 20 +-
.../resources/email/ResendValidationEmail.mustache | 6 +-
.../email/ResendValidationEmail_fr.mustache | 6 +-
.../email/UserAccountCreatedEmail.mustache | 8 +-
.../email/UserAccountCreatedEmail_fr.mustache | 8 +-
.../UserAccountEmailAddressAddedEmail.mustache | 5 +
.../UserAccountEmailAddressAddedEmail_fr.mustache | 5 +
.../email/UserAccountEmailValidatedEmail.mustache | 4 +-
.../UserAccountEmailValidatedEmail_fr.mustache | 4 +-
.../i18n/pollen-services_en_GB.properties | 1 +
.../i18n/pollen-services_fr_FR.properties | 1 +
pollen-ui-riot-js/src/main/web/css/main.css | 8 +
pollen-ui-riot-js/src/main/web/i18n/en.json | 41 ++-
pollen-ui-riot-js/src/main/web/i18n/fr.json | 80 +++--
pollen-ui-riot-js/src/main/web/js/AuthService.js | 4 +
pollen-ui-riot-js/src/main/web/js/Poll.js | 6 +-
pollen-ui-riot-js/src/main/web/js/UserService.js | 43 ++-
.../src/main/web/tag/PollenHeader.tag.html | 4 +-
.../src/main/web/tag/SignCheck.tag.html | 17 +-
.../src/main/web/tag/UserProfile.tag.html | 118 +++----
.../src/main/web/tag/admin/UserCard.tag.html | 7 +-
.../src/main/web/tag/admin/UserEditModal.tag.html | 169 +++++-----
.../src/main/web/tag/components/Card.tag.html | 8 +-
.../tag/components/UserEmailAddressList.tag.html | 139 +++++++++
.../src/main/web/tag/poll/Comments.tag.html | 6 +-
.../src/main/web/tag/poll/Results.tag.html | 16 +-
.../src/main/web/tag/poll/Settings.tag.html | 5 +
.../src/main/web/tag/poll/Summary.tag.html | 7 +-
.../src/main/web/tag/poll/Votes.tag.html | 40 ++-
.../main/web/tag/popup/InformationPopup.tag.html | 2 +-
.../src/main/web/tag/popup/Modal.tag.html | 2 +-
.../web/tag/voteCountingType/BordaConfig.tag.html | 11 +-
.../MajorityJudgmentConfig.tag.html | 84 +++++
.../MajorityJudgmentDetailResult.tag.html | 222 ++++++++++++++
pollen-votecounting-aggregator/pom.xml | 6 +
.../votecounting/model/ChoiceToVoteRenderType.java | 5 +-
.../LICENSE.txt | 0
.../README.md | 0
.../pom.xml | 6 +-
.../votecounting/MajorityJudgmentChoiceResult.java | 43 +++
.../votecounting/MajorityJudgmentConfig.java | 21 ++
.../votecounting/MajorityJudgmentDetailResult.java | 39 ++-
.../votecounting/MajorityJudgmentVoteCounting.java | 36 +--
.../MajorityJudgmentVoteCountingStrategy.java | 264 ++++++++++++++++
.../org.chorem.pollen.votecounting.VoteCounting | 1 +
...votecounting-majority-judgment_en_GB.properties | 4 +
...votecounting-majority-judgment_fr_FR.properties | 4 +
.../MajorityJudgmentVoteCountingStrategyTest.java | 341 +++++++++++++++++++++
.../votecounting/VoteCountingFactoryTest.java | 7 +-
.../src/test/resources/log4j.properties | 0
64 files changed, 1854 insertions(+), 317 deletions(-)
create mode 100644 pollen-services/src/main/java/org/chorem/pollen/services/bean/voteCounting/majorityJugment/MajorityJudgmentChoiceResultBean.java
create mode 100644 pollen-services/src/main/java/org/chorem/pollen/services/bean/voteCounting/majorityJugment/MajorityJudgmentDetailResultBean.java
copy pollen-services/src/main/java/org/chorem/pollen/services/service/mail/{ResendValidationEmail.java => UserAccountEmailAddressAddedEmail.java} (74%)
create mode 100644 pollen-services/src/main/resources/email/UserAccountEmailAddressAddedEmail.mustache
create mode 100644 pollen-services/src/main/resources/email/UserAccountEmailAddressAddedEmail_fr.mustache
create mode 100644 pollen-ui-riot-js/src/main/web/tag/components/UserEmailAddressList.tag.html
create mode 100644 pollen-ui-riot-js/src/main/web/tag/voteCountingType/MajorityJudgmentConfig.tag.html
create mode 100644 pollen-ui-riot-js/src/main/web/tag/voteCountingType/MajorityJudgmentDetailResult.tag.html
copy LICENSE.txt => pollen-votecounting-majority-judgment/LICENSE.txt (100%)
copy {pollen-services => pollen-votecounting-majority-judgment}/README.md (100%)
copy {pollen-votecounting-normal => pollen-votecounting-majority-judgment}/pom.xml (92%)
create mode 100644 pollen-votecounting-majority-judgment/src/main/java/org/chorem/pollen/votecounting/MajorityJudgmentChoiceResult.java
create mode 100644 pollen-votecounting-majority-judgment/src/main/java/org/chorem/pollen/votecounting/MajorityJudgmentConfig.java
copy pollen-votecounting-instant-runoff/src/main/java/org/chorem/pollen/votecounting/InstantRunoffDetailResult.java => pollen-votecounting-majority-judgment/src/main/java/org/chorem/pollen/votecounting/MajorityJudgmentDetailResult.java (52%)
copy pollen-votecounting-instant-runoff/src/main/java/org/chorem/pollen/votecounting/InstantRunoffVoteCounting.java => pollen-votecounting-majority-judgment/src/main/java/org/chorem/pollen/votecounting/MajorityJudgmentVoteCounting.java (68%)
create mode 100644 pollen-votecounting-majority-judgment/src/main/java/org/chorem/pollen/votecounting/MajorityJudgmentVoteCountingStrategy.java
create mode 100644 pollen-votecounting-majority-judgment/src/main/resources/META-INF/services/org.chorem.pollen.votecounting.VoteCounting
create mode 100644 pollen-votecounting-majority-judgment/src/main/resources/i18n/pollen-votecounting-majority-judgment_en_GB.properties
create mode 100644 pollen-votecounting-majority-judgment/src/main/resources/i18n/pollen-votecounting-majority-judgment_fr_FR.properties
create mode 100644 pollen-votecounting-majority-judgment/src/test/java/org/chorem/pollen/votecounting/MajorityJudgmentVoteCountingStrategyTest.java
copy {pollen-votecounting-instant-runoff => pollen-votecounting-majority-judgment}/src/test/java/org/chorem/pollen/votecounting/VoteCountingFactoryTest.java (86%)
copy {pollen-votecounting-instant-runoff => pollen-votecounting-majority-judgment}/src/test/resources/log4j.properties (100%)
--
To stop receiving notification emails like this one, please contact
chorem.org SCM administrator <admin+scm(a)chorem.org>.
1
5
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 8c99b526f2a41361eea13396fef7fdabeeb0f6e0
Author: Kevin Morin <morin(a)codelutin.com>
Date: Thu Oct 12 15:32:02 2017 +0200
refs #44 nouvelle ui pour les adresses email
---
pollen-ui-riot-js/src/main/web/i18n/en.json | 15 +-
pollen-ui-riot-js/src/main/web/i18n/fr.json | 54 +++---
pollen-ui-riot-js/src/main/web/js/UserService.js | 15 ++
.../src/main/web/tag/UserProfile.tag.html | 199 +++++++++++++++------
4 files changed, 202 insertions(+), 81 deletions(-)
diff --git a/pollen-ui-riot-js/src/main/web/i18n/en.json b/pollen-ui-riot-js/src/main/web/i18n/en.json
index 6cdab3dd..4906fbb7 100644
--- a/pollen-ui-riot-js/src/main/web/i18n/en.json
+++ b/pollen-ui-riot-js/src/main/web/i18n/en.json
@@ -409,15 +409,20 @@
"userProfile_deleteAccount": "Delete your account",
"userProfile_deleteUserMessage": "Delete your account? All the polls you created will be deleted; your votes and comments will be anonymized.",
"userProfile_identity": "Identity",
+ "userProfile_saveIdentity": "Save",
+ "userProfile_updatedIdentity": "Your identity has been updated",
"userProfile_name": "Name",
"userProfile_name_placeholder": "Enter your user name",
- "userProfile_email": "Email",
- "userProfile_email_placeholder": "Enter your email",
+ "userProfile_email": "Email address",
+ "userProfile_emails": "Email addresses",
+ "userProfile_defaultEmailAddress": "Set as default email address",
+ "userProfile_email_placeholder": "Enter your email address",
"userProfile_emailValidate": "Validate",
- "userProfile_emailValidationWaiting": "Validation wainting",
"userProfile_resendValidation": "Send a new invitation",
- "userProfile_saveIdentity": "Save",
- "userProfile_updatedIdentity": "Your identity has been updated",
+ "userProfile_validationResent": "An email has been sent to {0}",
+ "userProfile_addEmailAddress": "Add a new email address",
+ "userProfile_deleteEmailAddress": "Delete the email address",
+ "userProfile_deleteEmailAddressMessage": "Delete the email address {0}?",
"userProfile_passwordChange": "Password change",
"userProfile_oldPassword": "Old password",
"userProfile_oldPassword_placeholder": "Enter your old password",
diff --git a/pollen-ui-riot-js/src/main/web/i18n/fr.json b/pollen-ui-riot-js/src/main/web/i18n/fr.json
index c3b3037a..6a2e2d5a 100644
--- a/pollen-ui-riot-js/src/main/web/i18n/fr.json
+++ b/pollen-ui-riot-js/src/main/web/i18n/fr.json
@@ -196,9 +196,9 @@
"resendvalidation_title": "Renvoyer un courriel de validation de compte",
"resendvalidation_cancel": "Annuler",
"resendvalidation_action": "Envoyer",
- "resendvalidation_placeholder": "Entrez votre courriel",
+ "resendvalidation_placeholder": "Entrez votre adresse électronique",
"resendvalidation_sent": "Un nouveau courriel d'invitation a été envoyé",
- "resendvalidation_error_emailNotFound": "Le courriel n'a pas été trouvé",
+ "resendvalidation_error_emailNotFound": "L'adresse électronique n'a pas été trouvé",
"signcheck_title": "Validation de votre compte",
"signcheck_signin": "Vous connecter",
"signcheck_resendValidation": "Envoyer une nouvelle invitation",
@@ -214,13 +214,13 @@
"signin_lostpassword": "Mot de passe perdu ?",
"signin_connexion": "Se connecter",
"signin_signinWithProvider": "Ou connectez vous avec votre compte :",
- "signin_error_signin_emailOrPasswordInvalid": "Courriel ou mot de passe invalide",
+ "signin_error_signin_emailOrPasswordInvalid": "Adresse électronique ou mot de passe invalide",
"signin_error_signin_banned": "Compte bloqué",
"signin_error_signin_emailNotValidated": "Vous devez valider votre compte avant de pouvoir vous connecter. Relevez vos emails, nous vous avons envoyé un lien de validation.",
"newpassword_title": "Obtenir un nouveau mot de passe",
"newpassword_action": "Envoyer",
- "newpassword_placeholder": "Entrez votre courriel",
- "newpassword_error_emailNotFound": "Le courriel n'a pas été trouvé",
+ "newpassword_placeholder": "Entrez votre adresse électronique",
+ "newpassword_error_emailNotFound": "L'adresse électronique n'a pas été trouvé",
"newpassword_sent": "Un nouveau mot de passe vient d'être envoyé",
"footer_doc": "Pollen 3.1",
"footer_download": "Télécharger",
@@ -259,8 +259,8 @@
"poll_description_name": "Votre nom",
"poll_description_namePlaceHolder": "Renseignez votre nom",
"poll_description_nameNotBlank": "Vote nom ne doit pas être blanc",
- "poll_description_email": "Votre courriel",
- "poll_description_emailPlaceHolder": "Renseignez votre courriel",
+ "poll_description_email": "Votre adresse électronique",
+ "poll_description_emailPlaceHolder": "Renseignez votre adresse électronique",
"poll_settings_restricted": "Sondage restreint ?",
"poll_settings_restricted_yes": "Seules les personnes invitées à l'etape suivante peuvent voter. Un courriel leur sera envoyé avec un lien personnel.",
"poll_settings_restricted_no": "Toutes les personnes ayant le lien du sondage peuvent voter.",
@@ -346,12 +346,12 @@
"poll_settings_restrictedPoll": "Seul les invités peuvent voter (Sondage privé)",
"poll_settings_restrictedPoll_withMe": "Je participe au sondage",
"poll_settings_notification": "Recevoir des notifications :",
- "poll_settings_notification_disabled": "Pour activer les notifications, vous devez renseigner votre courriel dans la partie 'Description'.",
+ "poll_settings_notification_disabled": "Pour activer les notifications, vous devez renseigner votre adresse électronique dans la partie 'Description'.",
"poll_settings_voteNotification": "À chaque action sur les votes",
"poll_settings_commentNotification": "À chaque action sur les commentaires",
"poll_settings_newChoiceNotification": "À chaque ajout de choix",
"poll_settings_notifyMeBeforePollEnds": "Recevoir une notification avant la fin des votes",
- "poll_settings_notifyMeBeforePollEnds_disabled": "Pour activer le rappel de la fin du sondage, vous devez renseigner votre courriel dans la partie 'Description', et choisir une date de fin pour le sondage en activant la période d'ouverture des votes.",
+ "poll_settings_notifyMeBeforePollEnds_disabled": "Pour activer le rappel de la fin du sondage, vous devez renseigner votre adresse électronique dans la partie 'Description', et choisir une date de fin pour le sondage en activant la période d'ouverture des votes.",
"poll_settings_notifyMeHoursBeforePollEnds": "Combien d'heures avant ?",
"poll_choices_title": "Liste des choix",
"poll_choices_label": "Choix",
@@ -375,7 +375,7 @@
"poll_voters_restrictedPoll_withGroup": "Organiser les invités dans des groupes",
"poll_voters_invite": "Inviter des participants",
"poll_voters_already_invite_label": "Participants déjà invités",
- "poll_voters_new_invite_label": "Renseignez le courriel des participants (séparé par un espace)",
+ "poll_voters_new_invite_label": "Renseignez les adresses électroniques des participants (séparées par un espace)",
"poll_created_title": "Sondage créé",
"poll_created_message": "Le sondage vient d'être créé. Un courriel vous a été adressé ainsi qu'aux éventuels participants.",
"poll_created_edit": "Pour gérer le sondage, veuillez utiliser le lien suivant",
@@ -391,7 +391,7 @@
"users_manyFound": "{0} trouvés sur ",
"user_banned": "Banni",
"user_emailValidate": "En cours de validation",
- "user_emailIsValidate": "Courriel validé",
+ "user_emailIsValidate": "Adresse électronique validé",
"user_administrator": "Administrateur",
"user_edit": "Modifier l'utilisateur",
"user_ban": "Désactiver",
@@ -400,7 +400,7 @@
"user_deleteUser": "Supprimer l'utilisateur",
"user_deleteUserMessage": "Supprimer l'utilisateur ?",
"user_name": "Nom",
- "user_email": "Courriel",
+ "user_email": "Adresse électronique",
"user_premiumTo": "Illimité jusqu'au",
"user_premiumOf": "Fin de l'illimité depuis le",
"user_cancel": "Annuler",
@@ -411,13 +411,17 @@
"userProfile_identity": "Identité",
"userProfile_name": "Nom",
"userProfile_name_placeholder": "Entrez votre nom d'utilisateur",
- "userProfile_email": "Courriel",
- "userProfile_email_placeholder": "Entrez votre courriel",
- "userProfile_emailValidate": "Courriel vérifié",
- "userProfile_emailValidationWaiting": "En cours de validation",
- "userProfile_resendValidation": "Envoyer une nouvelle invitation",
"userProfile_saveIdentity": "Enregistrer",
"userProfile_updatedIdentity": "Votre identité a été mise à jour",
+ "userProfile_email": "Adresse électronique",
+ "userProfile_emails": "Adresses électroniques",
+ "userProfile_defaultEmailAddress": "Définir comme adresse par défaut",
+ "userProfile_email_placeholder": "Entrez votre adresse électronique",
+ "userProfile_resendValidation": "Envoyer un nouveau courriel de validation de l'adresse électronique",
+ "userProfile_validationResent": "Un courriel a été envoyé à l'adresse {0}",
+ "userProfile_addEmailAddress": "Ajouter une adresse électronique",
+ "userProfile_deleteEmailAddress": "Supprimer l'adresse électronique",
+ "userProfile_deleteEmailAddressMessage": "Supprimer l'adresse électronique {0} ?",
"userProfile_passwordChange": "Changement de mot de passe",
"userProfile_oldPassword": "Ancien mot de passe",
"userProfile_oldPassword_placeholder": "Entrez votre ancien mot de passe",
@@ -473,7 +477,7 @@
"favoriteList_add": "Ajouter",
"search_label": "Rechercher",
"favoriteList_createDate": "Date de création",
- "favoriteList_email": "Courriel",
+ "favoriteList_email": "Adresse électronique",
"favoriteList_noFavoriteList": "Aucune liste de votants",
"favoriteList_cancel": "Annuler",
"favoriteList_back": "Retour",
@@ -486,7 +490,7 @@
"favoriteList_member_import": "Importer",
"favoriteList_member_importCsv": "Importer un fichier CSV",
"favoriteList_member_csvFile": "Fichier des membres",
- "favoriteList_member_csvFile_exemple": "# Courriel;Nom;Poids\ndupond(a)domaine.fr;Jean Dupond;1.00\npseudo(a)bleu.fr;Arnaud Lemaitre;4.50\nmiller(a)courriel.com;Benjamin Miller;3.00",
+ "favoriteList_member_csvFile_exemple": "# Adresse électronique;Nom;Poids\ndupond(a)domaine.fr;Jean Dupond;1.00\npseudo(a)bleu.fr;Arnaud Lemaitre;4.50\nmiller(a)courriel.com;Benjamin Miller;3.00",
"favoriteList_member_csvFile_exemple_label": "Exemple de fichier",
"favoriteList_member_csvFile_exemple_detail": "Si le poids est omis, sa valeur par défaut est 1",
"favoriteList_member_importLdap": "Importer un annuaire LDAP",
@@ -501,8 +505,8 @@
"favoriteList_member_save": "Enregistrer",
"favoriteList_member_name": "Nom",
"favoriteList_member_name_placeholder": "Le nom du membre",
- "favoriteList_member_email": "Courriel",
- "favoriteList_member_email_placeholder": "Le courriel du membre",
+ "favoriteList_member_email": "Adresse électronique",
+ "favoriteList_member_email_placeholder": "L'adresse électronique du membre",
"favoriteList_member_weight": "Poids",
"favoriteList_member_ldap_placeholder": "L'adresse de l'annuaire LDAP",
"favoriteList_member_add": "Ajouter",
@@ -546,8 +550,8 @@
"voterList_member_edit": "Modifier le participant",
"voterList_member_name": "Nom",
"voterList_member_name_error_alreadyExist": "Le Nom existe dèjà dans cette liste",
- "voterList_member_email": "Courriel",
- "voterList_member_email_error_alreadyExist": "Le Courriel existe dèjà dans cette liste",
+ "voterList_member_email": "Adresse électronique",
+ "voterList_member_email_error_alreadyExist": "L'adresse électronique existe dèjà dans cette liste",
"voterList_member_weight": "Poids",
"voterList_member_delete": "Supprimer le participant",
"voterList_member_deleteMessage": "Supprimer le participant ?",
@@ -570,8 +574,8 @@
"report_level_off_topic_detail": "Un contenu hors-sujet",
"report_level_illegal": "Illégal",
"report_level_illegal_detail": "Un contenu manifestement illégal",
- "report_email": "Votre courriel",
- "report_email_placeholder": "Votre-courriel(a)exemple.com",
+ "report_email": "Votre adresse électronique",
+ "report_email_placeholder": "Votre-adresse-electronique(a)exemple.com",
"report_count": "Signalement",
"report_score": "Score",
"report_reports_title": "Signalements",
diff --git a/pollen-ui-riot-js/src/main/web/js/UserService.js b/pollen-ui-riot-js/src/main/web/js/UserService.js
index b54ecc0f..aed9818d 100644
--- a/pollen-ui-riot-js/src/main/web/js/UserService.js
+++ b/pollen-ui-riot-js/src/main/web/js/UserService.js
@@ -57,6 +57,21 @@ class UserService extends FetchService {
return this.post(url, user);
}
+ addEmailAddressToUser(emailAddress) {
+ let url = this._getUserUrlPrefix() + "/email";
+ return this.post(url, emailAddress);
+ }
+
+ deleteEmailAddress(emailAddressId) {
+ let url = this._getUserUrlPrefix() + "/email/" + emailAddressId;
+ return this.doDelete(url);
+ }
+
+ setDefaultEmailAddress(emailAddressId) {
+ let url = this._getUserUrlPrefix() + "/email/default?emailAddressId=" + emailAddressId;
+ return this.put(url);
+ }
+
changePassword(oldPassword, newPassword) {
let url = this._getUserUrlPrefix() + "/password";
let body = {
diff --git a/pollen-ui-riot-js/src/main/web/tag/UserProfile.tag.html b/pollen-ui-riot-js/src/main/web/tag/UserProfile.tag.html
index 8852a355..512ae8cc 100644
--- a/pollen-ui-riot-js/src/main/web/tag/UserProfile.tag.html
+++ b/pollen-ui-riot-js/src/main/web/tag/UserProfile.tag.html
@@ -32,60 +32,87 @@ require("./components/Avatar.tag.html");
<div class="main-content">
<div class="row-content">
- <form ref="identity-form" class="identity-form column-content">
- <HumanInput onsubmit={submitIdentity}/>
- <h3 class="c-heading"><i class="fa fa-address-card"/> {__.identity}</h3>
- <div class="o-form-element">
- <label class="c-label" for="name">{__.name}</label>
- <input class="c-field {c-field--error : errors.name}"
- type="text"
- name="name"
- ref="name"
- value={user.name}
- placeholder="{__.name_placeholder}"
- required
- maxlength="255">
- <div if="{errors.name}"
- class="c-hint--static c-hint--error">
- {errors.name}
+ <div class="column-content">
+ <form ref="identity-form" class="identity-form">
+ <HumanInput onsubmit={submitIdentity}/>
+ <h3 class="c-heading"><i class="fa fa-address-card"/> {__.identity}</h3>
+ <div class="o-form-element">
+ <label class="c-label" for="name">{__.name}</label>
+ <input class="c-field {c-field--error : errors.name}"
+ type="text"
+ name="name"
+ ref="name"
+ value={user.name}
+ placeholder="{__.name_placeholder}"
+ required
+ maxlength="255">
+ <div if="{errors.name}"
+ class="c-hint--static c-hint--error">
+ {errors.name}
+ </div>
+ </div>
+ <div class="actions-right">
+ <button type="submit"
+ class="c-button c-button--info">
+ <i class="fa fa-check" aria-hidden="true"></i>
+ {__.saveIdentity}
+ </button>
+ </div>
+ </form>
+
+ <div class="email-addresses">
+ <h3 class="c-heading"><i class="fa fa-at"/> {__.emails}</h3>
+ <div each="{emailAddress, index in user.emailAddresses}" class="email-address {index % 2 == 0 ? 'even' : 'odd'}">
+ <span class="email-address-label {validation-pending : !emailAddress.validated} {default-address : user.defaultEmailAddress.id === emailAddress.id}">
+ {emailAddress.emailAddress}
+ </span>
+ <button type="button"
+ class="c-button u-small c-button--gost-info"
+ if={!emailAddress.validated}
+ title="{__.resendValidation}"
+ onclick={resendValidation(emailAddress.emailAddress)}>
+ <i class="fa fa-paper-plane" aria-hidden="true"></i>
+ </button>
+ <button if="{user.defaultEmailAddress.id !== emailAddress.id && emailAddress.validated}"
+ class="c-button u-small c-button--info"
+ title="{__.defaultEmailAddress}"
+ onclick="{setDefaultEmailAddress(emailAddress.id)}">
+ <i class="fa fa-envelope"></i>
+ </button>
+ <button disabled="{user.defaultEmailAddress.id === emailAddress.id}"
+ class="c-button u-small c-button--error"
+ title="{__.deleteEmailAddress}"
+ onclick="{deleteEmailAddress(emailAddress.id, index)}">
+ <i class="fa fa-trash"></i>
+ </button>
</div>
</div>
- <div class="o-form-element">
- <label class="c-label" for="email">{__.email}</label>
- <div class="o-field o-field--icon-right">
- <input class="c-field {c-field--error : errors.email}"
- type="email"
- name="email"
- ref="email"
- value={user.email}
- placeholder="{__.email_placeholder}"
- required
- maxlength="255">
- <i class="fa fa-fw fa-{user.emailIsValidate ? 'check' : 'refresh'} c-icon"
- title={user.emailIsValidate ? __.emailValidate : __.emailValidationWaiting}></i>
- </div>
+ <form ref="new-email-form" class="new-email-form">
+ <HumanInput onsubmit={submitEmailAddress}/>
+ <div class="o-form-element c-input-group">
+ <div class="o-field o-field--icon-right">
+ <input class="c-field {c-field--error : errors.email}"
+ type="email"
+ name="email"
+ ref="newEmailAddress"
+ placeholder="{__.email_placeholder}"
+ required
+ maxlength="255">
+ </div>
+ <button type="submit"
+ class="c-button c-button--success"
+ title="{__.addEmailAddress}">
+ <i class="fa fa-plus" aria-hidden="true"></i>
+ </button>
+ </div>
<div if="{errors.email}"
class="c-hint--static c-hint--error">
{errors.email}
</div>
- </div>
+ </form>
- <div class="actions-right">
- <button type="button"
- class="c-button c-button--gost-info"
- if={!user.emailIsValidate}
- onclick={resendValidation}>
- <i class="fa fa-paper-plane" aria-hidden="true"></i>
- {__.resendValidation}
- </button>
- <button type="submit"
- class="c-button c-button--info">
- <i class="fa fa-check" aria-hidden="true"></i>
- {__.saveIdentity}
- </button>
- </div>
- </form>
+ </div>
<form ref="password-form" class="password-form column-content">
<HumanInput onsubmit={submitPassword}/>
@@ -235,21 +262,60 @@ require("./components/Avatar.tag.html");
this.update();
};
- this.resendValidation = () => {
- this.authService.resendValidation(this.user.email);
- };
-
this.submitIdentity = e => {
e.preventDefault();
e.stopPropagation();
+ let previousName = this.user.name;
this.user.name = this.refs.name.value;
- this.user.email = this.refs.email.value;
userService.saveUser(this.user).then(() => {
this.session.updateUser();
this.bus.trigger("message", new Message(this._l("updatedIdentity"), "success"));
+ }).catch((e) => {
+ this.errors.name = e.name;
+ this.update();
+ });
+ };
+
+ this.resendValidation = (emailAddress) => () => {
+ this.authService.resendValidation(emailAddress).then(() => {
+ this.bus.trigger("message", new Message(this._l("validationResent", emailAddress), "success"));
+ });
+ };
+
+ this.deleteEmailAddress = (emailAddressId, index) => () => {
+ this.confirm(this._l("deleteEmailAddressMessage", this.user.emailAddresses[index].emailAddress)).then((confirm) => {
+ if (!confirm) {
+ return Promise.reject();
+ }
+ return userService.deleteEmailAddress(emailAddressId);
+ }).then(result => {
+ this.user.emailAddresses.splice(index, 1);
+ this.session.updateUser();
});
};
+ this.setDefaultEmailAddress = (emailAddressId, index) => () => {
+ userService.setDefaultEmailAddress(emailAddressId).then(() => {
+ this.user.defaultEmailAddress = this.user.emailAddresses[index];
+ this.session.updateUser();
+ });
+ };
+
+ this.submitEmailAddress = e => {
+ e.preventDefault();
+ e.stopPropagation();
+ let emailAddress = this.refs.newEmailAddress.value;
+ userService.addEmailAddressToUser(emailAddress).then((result) => {
+ this.user.emailAddresses.push({id: result.id, emailAddress: emailAddress, validated: false});
+ this.refs.newEmailAddress.value = null;
+ this.update();
+ this.session.updateUser();
+ }).catch((e) => {
+ this.errors.email = e.email;
+ this.update();
+ });
+ }
+
this.checkPassword = () => {
var password = this.refs.newPassword.value;
var repeatPassword = this.refs.repeatPassword.value;
@@ -412,6 +478,37 @@ require("./components/Avatar.tag.html");
padding: 0 5px;
}
+ .email-addresses {
+ width: 100%;
+ margin-top: 20px;
+ }
+
+ .email-address {
+ display: flex;
+ justify-content: space-around;
+ align-items: center;
+ margin: 1px 0;
+ padding: 1px 5px;
+ }
+
+ .email-address.odd {
+ background-color: var(--list-alternate-row);
+ }
+
+ .email-address-label {
+ flex-grow: 1;
+ padding: 0 5px;
+ }
+
+ .email-address-label.default-address {
+ font-weight: bold;
+ }
+
+ .email-address-label.validation-pending {
+ font-style: italic;
+ opacity: 0.7;
+ }
+
.providers {
padding: 0 10px;
}
--
To stop receiving notification emails like this one, please contact
chorem.org SCM administrator <admin+scm(a)chorem.org>.
1
0
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 cd10e94e18679a99ef8354b63d369ad5e80c25dc
Author: Kevin Morin <morin(a)codelutin.com>
Date: Thu Oct 12 15:31:25 2017 +0200
refs #44 corrections
---
.../src/main/java/org/chorem/pollen/rest/api/v1/PollenUserApi.java | 4 ++--
.../java/org/chorem/pollen/services/service/SocialAuthService.java | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
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 27691c35..7abdf256 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
@@ -225,13 +225,13 @@ public class PollenUserApi {
@Path("/user/email/default")
@PUT
public void setDefaultEmailAddress(@Context PollenUserService pollenUserService,
- PollenEntityId<PollenUserEmailAddress> emailAddressId)
+ @QueryParam("emailAddressId") PollenEntityId<PollenUserEmailAddress> emailAddressId)
throws PollenEmailNotValidatedException {
pollenUserService.setDefaultEmailAddress(emailAddressId.getEntityId());
}
@Path("/user/email/{emailAddressId}")
- @POST
+ @DELETE
public void removeEmailAddress(@Context PollenUserService pollenUserService,
@PathParam("emailAddressId") PollenEntityId<PollenUserEmailAddress> emailAddressId)
throws PollenDefaultEmailAddressException {
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 a3f896c3..e0b5afd6 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
@@ -141,7 +141,7 @@ public class SocialAuthService extends PollenServiceSupport {
UserCredential credential = createUserCredential(p);
connectedUser.addUserCredential(credential);
- if (StringUtils.isNotBlank(credentialEmail)) {
+ if (StringUtils.isNotBlank(credential.getEmail())) {
boolean addEmailAddress = connectedUser.getEmailAddresses().stream()
.map(PollenUserEmailAddress::getEmailAddress)
.noneMatch(email -> Objects.equals(credentialEmail, email));
--
To stop receiving notification emails like this one, please contact
chorem.org SCM administrator <admin+scm(a)chorem.org>.
1
0
16 Oct '17
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 e574d5ced9bd6b5a19791aad7316e508c5d2ca9c
Author: Kevin Morin <morin(a)codelutin.com>
Date: Thu Oct 12 15:31:03 2017 +0200
refs #44 envoi d'un mail pour validation de l'adresse email
---
.../services/service/NotificationService.java | 8 +++++++
.../pollen/services/service/PollenUserService.java | 3 +++
.../pollen/services/service/mail/EmailService.java | 11 +++++++++
.../service/mail/UserAccountCreatedEmail.java | 8 -------
...java => UserAccountEmailAddressAddedEmail.java} | 28 ++++------------------
.../UserAccountEmailAddressAddedEmail.mustache | 5 ++++
.../UserAccountEmailAddressAddedEmail_fr.mustache | 5 ++++
.../i18n/pollen-services_en_GB.properties | 1 +
.../i18n/pollen-services_fr_FR.properties | 1 +
9 files changed, 38 insertions(+), 32 deletions(-)
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 c06da4c8..0b26b609 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
@@ -57,6 +57,7 @@ import org.chorem.pollen.services.service.mail.UserAccountCreatedEmail;
import org.chorem.pollen.services.service.mail.UserAccountCreatedFromProviderEmail;
import org.chorem.pollen.services.service.mail.UserAccountDeletedEmail;
import org.chorem.pollen.services.service.mail.UserAccountEditedEmail;
+import org.chorem.pollen.services.service.mail.UserAccountEmailAddressAddedEmail;
import org.chorem.pollen.services.service.mail.UserAccountEmailValidatedEmail;
import org.chorem.pollen.services.service.mail.UserAccountPasswordChangedEmail;
import org.chorem.pollen.services.service.mail.VoteAddedEmail;
@@ -128,6 +129,13 @@ public class NotificationService extends PollenServiceSupport {
}
}
+ public void onUserEmailAddressAdded(PollenUser user, PollenUserEmailAddress emailAddress) {
+ EmailService emailService = getEmailService();
+ UserAccountEmailAddressAddedEmail email = emailService.newUserAccountEmailAddressAddedEmail(user, emailAddress);
+ email.addTo(emailAddress.getEmailAddress());
+ emailService.send(email);
+ }
+
public void onUserEmailValidated(PollenUser user, PollenUserEmailAddress emailAddress) {
EmailService emailService = getEmailService();
UserAccountEmailValidatedEmail email = emailService.newUserAccountEmailValidatedEmail(user);
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 3f2b45f5..3b772a5e 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
@@ -338,6 +338,9 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer
address.setActivationToken(emailActivation);
user.addEmailAddresses(address);
commit();
+
+ getNotificationService().onUserEmailAddressAdded(user, address);
+
return PollenEntityRef.of(address);
}
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 4d7de18e..6d9f4d1a 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
@@ -261,6 +261,17 @@ public class EmailService extends PollenServiceSupport {
return email;
}
+ public UserAccountEmailAddressAddedEmail newUserAccountEmailAddressAddedEmail(PollenUser user,
+ PollenUserEmailAddress emailAddress) {
+ UserAccountEmailAddressAddedEmail email = new UserAccountEmailAddressAddedEmail(getLocale());
+ email.setUser(user);
+ PollenEntityId<PollenUser> userId = getPollenEntityId(user);
+ email.setValidateUrl(getPollenUIUrlRenderService().getUserValidateUrl(getUIContext().getUserValidateUrl(),
+ userId.getReducedId(),
+ emailAddress.getActivationToken().getToken()));
+ return email;
+ }
+
public UserAccountEmailValidatedEmail newUserAccountEmailValidatedEmail(PollenUser user) {
UserAccountEmailValidatedEmail email = new UserAccountEmailValidatedEmail(getLocale());
email.setUser(user);
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 e8f527ec..72d6695c 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
@@ -38,7 +38,6 @@ public class UserAccountCreatedEmail extends PollenMail {
private String validateUrl;
private String pollenUrl;
- private String password;
protected UserAccountCreatedEmail(Locale locale) {
super(locale);
@@ -73,11 +72,4 @@ public class UserAccountCreatedEmail extends PollenMail {
this.pollenUrl = pollenUrl;
}
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
}
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/UserAccountEmailAddressAddedEmail.java
similarity index 67%
copy from pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountCreatedEmail.java
copy to pollen-services/src/main/java/org/chorem/pollen/services/service/mail/UserAccountEmailAddressAddedEmail.java
index e8f527ec..b61c28dc 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/UserAccountEmailAddressAddedEmail.java
@@ -27,26 +27,21 @@ import org.nuiton.i18n.I18n;
import java.util.Locale;
/**
- * Created on 4/30/14.
- *
- * @author Tony Chemit - dev(a)tchemit.fr
- * @since 2.0
+ * @author Kevin Morin - morin(a)codelutin.com
*/
-public class UserAccountCreatedEmail extends PollenMail {
+public class UserAccountEmailAddressAddedEmail extends PollenMail {
private PollenUser user;
private String validateUrl;
- private String pollenUrl;
- private String password;
- protected UserAccountCreatedEmail(Locale locale) {
+ protected UserAccountEmailAddressAddedEmail(Locale locale) {
super(locale);
}
@Override
public String getSubject() {
- return I18n.l(locale, "pollen.service.mail.UserAccountCreatedEmail.subject", user.getName());
+ return I18n.l(locale, "pollen.service.mail.UserAccountEmailAddressAddedEmail.subject", user.getName());
}
public PollenUser getUser() {
@@ -65,19 +60,4 @@ public class UserAccountCreatedEmail extends PollenMail {
this.validateUrl = validateUrl;
}
- public String getPollenUrl() {
- return pollenUrl;
- }
-
- public void setPollenUrl(String pollenUrl) {
- this.pollenUrl = pollenUrl;
- }
-
- public String getPassword() {
- return password;
- }
-
- public void setPassword(String password) {
- this.password = password;
- }
}
diff --git a/pollen-services/src/main/resources/email/UserAccountEmailAddressAddedEmail.mustache b/pollen-services/src/main/resources/email/UserAccountEmailAddressAddedEmail.mustache
new file mode 100644
index 00000000..b70c4bb1
--- /dev/null
+++ b/pollen-services/src/main/resources/email/UserAccountEmailAddressAddedEmail.mustache
@@ -0,0 +1,5 @@
+Welcome {{user.name}},
+
+You have just added the following email address to your Pollen account: {{user.email}}
+
+To use it, you need to validate this email address on this url: {{validateUrl}}
\ No newline at end of file
diff --git a/pollen-services/src/main/resources/email/UserAccountEmailAddressAddedEmail_fr.mustache b/pollen-services/src/main/resources/email/UserAccountEmailAddressAddedEmail_fr.mustache
new file mode 100644
index 00000000..b130080d
--- /dev/null
+++ b/pollen-services/src/main/resources/email/UserAccountEmailAddressAddedEmail_fr.mustache
@@ -0,0 +1,5 @@
+Bonjour {{user.name}},
+
+Vous venez d'ajouter l'adresse électronique suivante à votre compte Pollen : {{user.email}}
+
+Pour l'utiliser, vous devez valider cette adresse en allant sur cette url : {{validateUrl}}
\ No newline at end of file
diff --git a/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties b/pollen-services/src/main/resources/i18n/pollen-services_en_GB.properties
index a48fcfba..ea6db8ad 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
@@ -167,6 +167,7 @@ pollen.service.mail.UserAccountCreatedEmail.subject=[Pollen] Confirmation of acc
pollen.service.mail.UserAccountCreatedFromProviderEmail.subject=[Pollen] Confirmation of account creation %s
pollen.service.mail.UserAccountDeletedEmail.subject=[Pollen] Confirmation of deletion of the account %s
pollen.service.mail.UserAccountEditedEmail.subject=[Pollen] Update of the account %s
+pollen.service.mail.UserAccountEmailAddressAddedEmail.subject=[Pollen] New email address added %s
pollen.service.mail.UserAccountEmailValidatedEmail.subject=[Pollen] Validation of your account %s
pollen.service.mail.UserAccountPasswordChangedEmail.subject=[Pollen] Confirmation of the modification of teh password of your account %s
pollen.service.mail.VoteAddedEmail.subject=[Pollen] A vote was added in poll %s
diff --git a/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties b/pollen-services/src/main/resources/i18n/pollen-services_fr_FR.properties
index 49cccfaf..47b32796 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
@@ -166,6 +166,7 @@ pollen.service.mail.UserAccountCreatedEmail.subject=[Pollen] Confirmation de cr
pollen.service.mail.UserAccountCreatedFromProviderEmail.subject=[Pollen] Confirmation de création du compte %s
pollen.service.mail.UserAccountDeletedEmail.subject=[Pollen] Confirmation de suppression du compte %s
pollen.service.mail.UserAccountEditedEmail.subject=[Pollen] Édition du compte %s
+pollen.service.mail.UserAccountEmailAddressAddedEmail.subject=[Pollen] Nouvelle adresse électronique ajoutée %s
pollen.service.mail.UserAccountEmailValidatedEmail.subject=[Pollen] Valiation de votre compte %s
pollen.service.mail.UserAccountPasswordChangedEmail.subject=[Pollen] Confirmation de la modification du mot de passe du compte %s
pollen.service.mail.VoteAddedEmail.subject=[Pollen] Un nouveau vote a été ajouté au sondage %s
--
To stop receiving notification emails like this one, please contact
chorem.org SCM administrator <admin+scm(a)chorem.org>.
1
0
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 36c7fa73ad5ee0e2b7263392e617784d2c3ecc70
Author: Kevin Morin <morin(a)codelutin.com>
Date: Mon Oct 9 18:15:06 2017 +0200
refs #44 correction de la migration
---
.../V3_1_0_5__Extract_email_addresses.java} | 30 ++++++++++++----------
.../h2/V3_1_0_4__add_email_address_table.sql | 13 ++++++++++
.../h2/V3_1_0_6__drop_email_from_user.sql | 2 ++
.../V3_1_0_4__add_email_address_table.sql | 13 ++++++++++
.../postgresql/V3_1_0_6__drop_email_from_user.sql | 2 ++
pollen-persistence/src/main/xmi/pollen.properties | 2 +-
6 files changed, 47 insertions(+), 15 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/common/V3_1_0_5__Extract_email_addresses.java
similarity index 68%
rename from pollen-persistence/src/main/java/db/migration/V3_0_1_4__Extract_email_addresses.java
rename to pollen-persistence/src/main/java/db/migration/common/V3_1_0_5__Extract_email_addresses.java
index ea0fb3a4..677ab47b 100644
--- a/pollen-persistence/src/main/java/db/migration/V3_0_1_4__Extract_email_addresses.java
+++ b/pollen-persistence/src/main/java/db/migration/common/V3_1_0_5__Extract_email_addresses.java
@@ -11,20 +11,20 @@ import org.nuiton.topia.persistence.internal.ShortTopiaIdFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.Statement;
+import java.sql.Timestamp;
/**
* @author Kevin Morin (Code Lutin)
*/
-public class V3_0_1_4__Extract_email_addresses implements JdbcMigration {
+public class V3_1_0_5__Extract_email_addresses implements JdbcMigration {
/** Logger. */
- private static final Log log = LogFactory.getLog(V3_0_1_4__Extract_email_addresses.class);
+ private static final Log log = LogFactory.getLog(V3_1_0_5__Extract_email_addresses.class);
@Override
public void migrate(Connection connection) throws Exception {
- Statement insertStatement = null;
+ PreparedStatement insertStatement = null;
PreparedStatement updateStatement = null;
ResultSet resultSet = null;
@@ -33,9 +33,9 @@ public class V3_0_1_4__Extract_email_addresses implements JdbcMigration {
try {
connection.setAutoCommit(false);
- insertStatement = connection.createStatement();
- StringBuilder query = new StringBuilder("INSERT INTO POLLENUSEREMAILADDRESS VALUES ");
-
+ insertStatement = connection.prepareStatement("INSERT INTO POLLENUSEREMAILADDRESS " +
+ "(TOPIAID, TOPIAVERSION, TOPIACREATEDATE, EMAILADDRESS, ACTIVATIONTOKEN, POLLENUSER) " +
+ "VALUES (?, ?, ?, ?, ?, ?)");
updateStatement =
connection.prepareStatement("UPDATE pollenuser SET DEFAULTEMAILADDRESS = ? WHERE topiaid = ?");
@@ -47,20 +47,22 @@ public class V3_0_1_4__Extract_email_addresses implements JdbcMigration {
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("')");
+
+ insertStatement.setString(1, addressTopiaId);
+ insertStatement.setInt(2, 1);
+ insertStatement.setTimestamp(3, new Timestamp(System.currentTimeMillis()));
+ insertStatement.setString(4,emailAddress);
+ insertStatement.setString(5, emailTokenActivation);
+ insertStatement.setString(6, userTopiaId);
+ insertStatement.addBatch();
updateStatement.setString(1, addressTopiaId);
updateStatement.setString(2, userTopiaId);
updateStatement.addBatch();
}
- insertStatement.execute(query.toString());
+ insertStatement.executeBatch();
updateStatement.executeBatch();
resultSet.close();
diff --git a/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_4__add_email_address_table.sql b/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_4__add_email_address_table.sql
new file mode 100644
index 00000000..e5031ae4
--- /dev/null
+++ b/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_4__add_email_address_table.sql
@@ -0,0 +1,13 @@
+CREATE TABLE POLLENUSEREMAILADDRESS (
+ TOPIAID VARCHAR(255) NOT NULL PRIMARY KEY,
+ TOPIAVERSION BIGINT NOT NULL,
+ TOPIACREATEDATE TIMESTAMP,
+ EMAILADDRESS VARCHAR(255),
+ ACTIVATIONTOKEN VARCHAR(255),
+ POLLENUSER VARCHAR(255),
+ FOREIGN KEY (ACTIVATIONTOKEN) REFERENCES POLLENTOKEN(TOPIAID),
+ FOREIGN KEY (POLLENUSER) REFERENCES POLLENUSER(TOPIAID)
+);
+
+ALTER TABLE POLLENUSER ADD DEFAULTEMAILADDRESS VARCHAR(255);
+ALTER TABLE POLLENUSER ADD FOREIGN KEY (DEFAULTEMAILADDRESS) REFERENCES POLLENUSEREMAILADDRESS(TOPIAID);
\ No newline at end of file
diff --git a/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_6__drop_email_from_user.sql b/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_6__drop_email_from_user.sql
new file mode 100644
index 00000000..5a6f68ab
--- /dev/null
+++ b/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_6__drop_email_from_user.sql
@@ -0,0 +1,2 @@
+ALTER TABLE POLLENUSER DROP EMAIL;
+ALTER TABLE POLLENUSER DROP EMAILACTIVATIONTOKEN;
\ No newline at end of file
diff --git a/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_4__add_email_address_table.sql b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_4__add_email_address_table.sql
new file mode 100644
index 00000000..e5031ae4
--- /dev/null
+++ b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_4__add_email_address_table.sql
@@ -0,0 +1,13 @@
+CREATE TABLE POLLENUSEREMAILADDRESS (
+ TOPIAID VARCHAR(255) NOT NULL PRIMARY KEY,
+ TOPIAVERSION BIGINT NOT NULL,
+ TOPIACREATEDATE TIMESTAMP,
+ EMAILADDRESS VARCHAR(255),
+ ACTIVATIONTOKEN VARCHAR(255),
+ POLLENUSER VARCHAR(255),
+ FOREIGN KEY (ACTIVATIONTOKEN) REFERENCES POLLENTOKEN(TOPIAID),
+ FOREIGN KEY (POLLENUSER) REFERENCES POLLENUSER(TOPIAID)
+);
+
+ALTER TABLE POLLENUSER ADD DEFAULTEMAILADDRESS VARCHAR(255);
+ALTER TABLE POLLENUSER ADD FOREIGN KEY (DEFAULTEMAILADDRESS) REFERENCES POLLENUSEREMAILADDRESS(TOPIAID);
\ No newline at end of file
diff --git a/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_6__drop_email_from_user.sql b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_6__drop_email_from_user.sql
new file mode 100644
index 00000000..5a6f68ab
--- /dev/null
+++ b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_6__drop_email_from_user.sql
@@ -0,0 +1,2 @@
+ALTER TABLE POLLENUSER DROP EMAIL;
+ALTER TABLE POLLENUSER DROP EMAILACTIVATIONTOKEN;
\ No newline at end of file
diff --git a/pollen-persistence/src/main/xmi/pollen.properties b/pollen-persistence/src/main/xmi/pollen.properties
index f20c6e9f..ca28eb99 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.5
+model.tagvalue.version=3.1.0.6
#model.tagValue.notGenerateToString=true
#model.tagValue.constantPrefix=PROPERTY_
#model.tagValue.useEnumerationName=true
--
To stop receiving notification emails like this one, please contact
chorem.org SCM administrator <admin+scm(a)chorem.org>.
1
0
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 36295f55664cf06f2ffe58126345fe7a993c8595
Author: Kevin Morin <morin(a)codelutin.com>
Date: Mon Oct 9 17:01:01 2017 +0200
corrections exceptions
---
.../pollen/rest/api/PollenRestApiApplication.java | 2 ++
.../PollenDefaultEmailAddressExceptionMapper.java | 41 ++++++++++++++++++++++
.../chorem/pollen/rest/api/v1/PollenUserApi.java | 8 +++--
3 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplication.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplication.java
index 8d14605f..03667415 100644
--- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplication.java
+++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/PollenRestApiApplication.java
@@ -28,6 +28,7 @@ import org.chorem.pollen.rest.api.exceptionMappers.FavoriteListImportExceptionMa
import org.chorem.pollen.rest.api.exceptionMappers.InvalidEntityLinkExceptionMapper;
import org.chorem.pollen.rest.api.exceptionMappers.InvalidFormExceptionMapper;
import org.chorem.pollen.rest.api.exceptionMappers.PollenAuthenticationExceptionMapper;
+import org.chorem.pollen.rest.api.exceptionMappers.PollenDefaultEmailAddressExceptionMapper;
import org.chorem.pollen.rest.api.exceptionMappers.PollenEmailNotValidatedExceptionMapper;
import org.chorem.pollen.rest.api.exceptionMappers.PollenEmailOrProviderAccountAlreadyUsedExceptionMapper;
import org.chorem.pollen.rest.api.exceptionMappers.PollenInvalidEmailActivationTokenExceptionMapper;
@@ -85,6 +86,7 @@ public class PollenRestApiApplication extends Application {
new PollenInvalidPermissionExceptionMapper(),
new PollenInvalidEmailActivationTokenExceptionMapper(),
new PollenEmailNotValidatedExceptionMapper(),
+ new PollenDefaultEmailAddressExceptionMapper(),
new PollenEmailOrProviderAccountAlreadyUsedExceptionMapper(),
new PollenUserBannedExceptionMapper(),
new InvalidFormExceptionMapper(),
diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/exceptionMappers/PollenDefaultEmailAddressExceptionMapper.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/exceptionMappers/PollenDefaultEmailAddressExceptionMapper.java
new file mode 100644
index 00000000..b2814846
--- /dev/null
+++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/exceptionMappers/PollenDefaultEmailAddressExceptionMapper.java
@@ -0,0 +1,41 @@
+package org.chorem.pollen.rest.api.exceptionMappers;
+
+/*-
+ * #%L
+ * Pollen :: Rest Api
+ * %%
+ * Copyright (C) 2009 - 2017 CodeLutin
+ * %%
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ * #L%
+ */
+
+import org.chorem.pollen.services.service.security.PollenDefaultEmailAddressException;
+
+import javax.ws.rs.core.Response;
+
+/**
+ * @author Kevin Morin - morin(a)codelutin.com
+ */
+public class PollenDefaultEmailAddressExceptionMapper extends PollenAbstractExceptionMapper<PollenDefaultEmailAddressException> {
+
+ public PollenDefaultEmailAddressExceptionMapper() {
+ super(Response.Status.FORBIDDEN);
+ }
+
+ @Override
+ protected Object getEntity(PollenDefaultEmailAddressException exception) {
+ return "defaultEmailAddress";
+ }
+}
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 028eddf8..27691c35 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
@@ -39,6 +39,8 @@ import org.chorem.pollen.services.service.InvalidFormException;
import org.chorem.pollen.services.service.PollenResourceService;
import org.chorem.pollen.services.service.PollenUserService;
import org.chorem.pollen.services.service.SocialAuthService;
+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.PollenSecurityContext;
import org.chorem.pollen.services.service.security.SecurityService;
@@ -223,14 +225,16 @@ public class PollenUserApi {
@Path("/user/email/default")
@PUT
public void setDefaultEmailAddress(@Context PollenUserService pollenUserService,
- PollenEntityId<PollenUserEmailAddress> emailAddressId) {
+ PollenEntityId<PollenUserEmailAddress> emailAddressId)
+ throws PollenEmailNotValidatedException {
pollenUserService.setDefaultEmailAddress(emailAddressId.getEntityId());
}
@Path("/user/email/{emailAddressId}")
@POST
public void removeEmailAddress(@Context PollenUserService pollenUserService,
- @PathParam("emailAddressId") PollenEntityId<PollenUserEmailAddress> emailAddressId) {
+ @PathParam("emailAddressId") PollenEntityId<PollenUserEmailAddress> emailAddressId)
+ throws PollenDefaultEmailAddressException {
pollenUserService.removeEmailAddress(emailAddressId.getEntityId());
}
}
--
To stop receiving notification emails like this one, please contact
chorem.org SCM administrator <admin+scm(a)chorem.org>.
1
0
16 Oct '17
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 062dbeaccc2bd720e394d829bde2ef264d27c815
Author: Kevin Morin <morin(a)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(a)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(a)pollen.fake"));
+ assertTrue(content.contains("jean(a)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(a)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(a)pollen.fake
+ emailAddress: tony(a)pollen.org
email_address_tony_2:
&email_address_tony2 !email-address
- emailAddress: tony2(a)pollen.fake
+ emailAddress: tony2(a)pollen.org
user_tony:
&tony !user
@@ -18,15 +18,15 @@ user_tony:
email_address_jean_default:
&email_address_jean1 !email-address
- emailAddress: jean(a)pollen.fake
+ emailAddress: jean(a)pollen.org
email_address_jean_2:
&email_address_jean2 !email-address
- emailAddress: jean2(a)pollen.fake
+ emailAddress: jean2(a)pollen.org
email_address_jean_3:
&email_address_jean3 !email-address
- emailAddress: jean3(a)pollen.fake
+ emailAddress: jean3(a)pollen.org
user_jean:
&jean !user
@@ -41,7 +41,7 @@ user_jean:
email_address_julien_default:
&email_address_julien !email-address
- emailAddress: julien(a)pollen.fake
+ emailAddress: julien(a)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(a)pollen.fake", "fake");
+ login("jean(a)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(a)pollen.fake", "fake");
+ login("jean(a)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(a)pollen.fake", "fake");
+ login("jean(a)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(a)pollen.fake", "fake");
+ login("jean(a)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(a)pollen.fake", "fake");
+ login("jean(a)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(a)pollen.fake", "fake");
+ login("tony(a)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(a)pollen.fake", pollenUser.getEmail());
+ Assert.assertTrue(pollenUser.getEmailAddresses().stream()
+ .anyMatch(emailAddress -> "tony(a)pollen.org".equals(emailAddress.getEmailAddress())));
- login("jean(a)pollen.fake", "fake");
+ login("jean(a)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(a)pollen.fake", pollenUser.getEmail());
+ Assert.assertTrue(pollenUser.getEmailAddresses().stream()
+ .anyMatch(emailAddress -> "tony(a)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(a)pollen.fake", "fake");
- PaginationResultBean<PollenUserBean> users = service.getUsers(null, "");
+ login("jean(a)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(a)pollen.fake", "fake");
+ login("jean(a)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(a)notpollen.org");
+ setDefaultEmail(newUser, "pollen(a)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(a)pollen.org");
+ setDefaultEmail(newUser, "pollen(a)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(a)pollen.org");
+ newUser2.setName("Pollen");
+ setDefaultEmail(newUser2, "pollen(a)pollen.org");
try {
service.createUser(newUser2);
@@ -152,7 +163,7 @@ public class PollenUserServiceTest extends AbstractPollenServiceTest {
assertErrorKeyFound(e, "email");
}
- newUser2.setEmail("pollen2(a)pollen.org");
+ setDefaultEmail(newUser2, "pollen2(a)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(a)pollen.org");
+ setDefaultEmail(newUser3, "pollen(a)pollen.org");
try {
service.createUser(newUser3);
@@ -179,7 +191,7 @@ public class PollenUserServiceTest extends AbstractPollenServiceTest {
assertErrorKeyFound(e, "email");
}
- newUser3.setEmail("pollen3(a)pollen.org");
+ setDefaultEmail(newUser3, "pollen3(a)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(a)pollen.fake", "fake");
+ login("jean(a)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(a)pollen.org";
- user.setEmail(email);
+ String email = "tony4(a)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(a)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(a)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(a)pollen.fake", "fake");
+// login("jean(a)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(a)pollen.fake", "fake");
+ login("jean(a)pollen.org", "fake");
PollBean poll = pollService.getNewPoll(ChoiceType.TEXT);
poll.setPollType(PollType.RESTRICTED);
poll.setTitle("poll1");
- poll.setParticipants(Sets.newHashSet("pierr(a)pollen.fake", "paul(a)pollen.fake", "jasque(a)pollen.fake"));
+ poll.setParticipants(Sets.newHashSet("pierr(a)pollen.org", "paul(a)pollen.org", "jasque(a)pollen.org"));
List<ChoiceBean> choices = new ArrayList<>();
--
To stop receiving notification emails like this one, please contact
chorem.org SCM administrator <admin+scm(a)chorem.org>.
1
0