This is an automated email from the git hooks/post-receive script. New commit to branch feature/85-droits-utilisateurs in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit 6d8f4a2afb09fca63a88ac44ab95cf649c1defb8 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Tue Oct 17 11:33:07 2017 +0200 droit de création de sondage (refs #85) --- .../h2/V3_1_0_7__add_user_can_create_poll.sql | 3 ++ .../V3_1_0_7__add_user_can_create_poll.sql | 3 ++ pollen-persistence/src/main/xmi/pollen.properties | 2 +- pollen-persistence/src/main/xmi/pollen.zargo | Bin 30366 -> 30431 bytes pollen-services/src/main/config/PollenServices.ini | 8 +++- .../pollen/services/bean/ConfigurationBean.java | 10 +++++ .../pollen/services/bean/PollenUserBean.java | 10 +++++ .../chorem/pollen/services/bean/UsersRight.java | 12 ++++++ .../services/config/PollenServicesConfig.java | 6 +++ .../services/service/ConfigurationService.java | 1 + .../pollen/services/service/PollService.java | 3 ++ .../services/service/PollenServiceSupport.java | 20 +++++++++ .../pollen/services/service/PollenUserService.java | 6 +++ .../services/service/security/SecurityService.java | 22 ++++++++++ .../i18n/pollen-services_en_GB.properties | 1 + .../i18n/pollen-services_fr_FR.properties | 1 + .../services/service/VoteCountingServiceTest.java | 3 ++ pollen-ui-riot-js/src/main/web/i18n/fr.json | 1 + pollen-ui-riot-js/src/main/web/js/Session.js | 21 ++++++++++ .../src/main/web/tag/Authorization.tag.html | 5 +++ .../src/main/web/tag/AvatarAction.tag.js | 20 --------- .../src/main/web/tag/FilterLoginProvider.tag.js | 46 +++++++++++++++++++++ .../src/main/web/tag/LinkAction.tag.js | 20 --------- pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html | 21 +++------- .../src/main/web/tag/PollenHeader.tag.html | 11 ++++- .../src/main/web/tag/SigninAction.tag.js | 26 +++--------- .../src/main/web/tag/admin/UserCard.tag.html | 18 ++++++-- .../src/main/web/tag/admin/UserEditModal.tag.html | 25 +++++++++-- 28 files changed, 238 insertions(+), 87 deletions(-) diff --git a/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_7__add_user_can_create_poll.sql b/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_7__add_user_can_create_poll.sql new file mode 100644 index 00000000..0394853c --- /dev/null +++ b/pollen-persistence/src/main/resources/db/migration/h2/V3_1_0_7__add_user_can_create_poll.sql @@ -0,0 +1,3 @@ +-- add canCreatePoll in user +alter table pollenuser add cancreatepoll boolean; +update pollenuser set cancreatepoll = false; \ No newline at end of file diff --git a/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_7__add_user_can_create_poll.sql b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_7__add_user_can_create_poll.sql new file mode 100644 index 00000000..0394853c --- /dev/null +++ b/pollen-persistence/src/main/resources/db/migration/postgresql/V3_1_0_7__add_user_can_create_poll.sql @@ -0,0 +1,3 @@ +-- add canCreatePoll in user +alter table pollenuser add cancreatepoll boolean; +update pollenuser set cancreatepoll = false; \ 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 ca28eb99..3b6ddb78 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.6 +model.tagvalue.version=3.1.0.7 #model.tagValue.notGenerateToString=true #model.tagValue.constantPrefix=PROPERTY_ #model.tagValue.useEnumerationName=true diff --git a/pollen-persistence/src/main/xmi/pollen.zargo b/pollen-persistence/src/main/xmi/pollen.zargo index 7df0d631..92718584 100644 Binary files a/pollen-persistence/src/main/xmi/pollen.zargo and b/pollen-persistence/src/main/xmi/pollen.zargo differ diff --git a/pollen-services/src/main/config/PollenServices.ini b/pollen-services/src/main/config/PollenServices.ini index e20ffe6c..7705da6c 100644 --- a/pollen-services/src/main/config/PollenServices.ini +++ b/pollen-services/src/main/config/PollenServices.ini @@ -209,4 +209,10 @@ defaultValue = 0 description = pollen.configuration.userConnectedRequired key = pollen.default.userConnectedRequired type = boolean -defaultValue = false \ No newline at end of file +defaultValue = false + +[option usersCanCreatePoll] +description = pollen.configuration.usersCanCreatePoll +key = pollen.default.usersCanCreatePoll +type = org.chorem.pollen.services.bean.UsersRight +defaultValue = ALL_USERS \ No newline at end of file diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/ConfigurationBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/ConfigurationBean.java index ae045eb5..04fd7ceb 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/bean/ConfigurationBean.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/ConfigurationBean.java @@ -7,6 +7,8 @@ public class ConfigurationBean { protected boolean userConnectedRequired; + protected UsersRight usersCanCreatePoll; + public boolean isUserConnectedRequired() { return userConnectedRequired; } @@ -14,4 +16,12 @@ public class ConfigurationBean { public void setUserConnectedRequired(boolean userConnectedRequired) { this.userConnectedRequired = userConnectedRequired; } + + public UsersRight getUsersCanCreatePoll() { + return usersCanCreatePoll; + } + + public void setUsersCanCreatePoll(UsersRight usersCanCreatePoll) { + this.usersCanCreatePoll = usersCanCreatePoll; + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserBean.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserBean.java index 2cdc54da..52fd0b2e 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserBean.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/PollenUserBean.java @@ -63,6 +63,8 @@ public class PollenUserBean extends PollenBean<PollenUser> { protected PollenUserEmailAddressBean defaultEmailAddress; + protected boolean canCreatePoll; + public PollenUserBean() { super(PollenUser.class); } @@ -178,4 +180,12 @@ public class PollenUserBean extends PollenBean<PollenUser> { public void setDefaultEmailAddress(PollenUserEmailAddressBean defaultEmailAddress) { this.defaultEmailAddress = defaultEmailAddress; } + + public boolean isCanCreatePoll() { + return canCreatePoll; + } + + public void setCanCreatePoll(boolean canCreatePoll) { + this.canCreatePoll = canCreatePoll; + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/bean/UsersRight.java b/pollen-services/src/main/java/org/chorem/pollen/services/bean/UsersRight.java new file mode 100644 index 00000000..4a805770 --- /dev/null +++ b/pollen-services/src/main/java/org/chorem/pollen/services/bean/UsersRight.java @@ -0,0 +1,12 @@ +package org.chorem.pollen.services.bean; + +/** + * @author Sylvain Bavencoff - bavencoff@codelutin.com + */ +public enum UsersRight { + + ALL_USERS, + USERS_CONNECTED, + USERS_SELECTED + +} diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServicesConfig.java b/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServicesConfig.java index 37fc3d79..4c8c3510 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServicesConfig.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/config/PollenServicesConfig.java @@ -33,6 +33,7 @@ import org.chorem.pollen.persistence.entity.PollType; import org.chorem.pollen.persistence.entity.ResultVisibility; import org.chorem.pollen.persistence.entity.VoteVisibility; import org.chorem.pollen.services.PollenTechnicalException; +import org.chorem.pollen.services.bean.UsersRight; import org.nuiton.config.ApplicationConfig; import org.nuiton.config.ArgumentsParserException; @@ -158,4 +159,9 @@ public class PollenServicesConfig extends GeneratedPollenServicesConfig { public Locale getFeedbackLocale() { return Locale.forLanguageTag(get().getOption(PollenServicesConfigOption.LOCALE_FEEDBACK.getKey())); } + + @Override + public UsersRight getUsersCanCreatePoll() { + return UsersRight.valueOf(get().getOption(PollenServicesConfigOption.USERS_CAN_CREATE_POLL.getKey())); + } } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/ConfigurationService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/ConfigurationService.java index 53253903..74845e1d 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/ConfigurationService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/ConfigurationService.java @@ -10,6 +10,7 @@ public class ConfigurationService extends PollenServiceSupport { public ConfigurationBean getConfiguration() { ConfigurationBean bean = new ConfigurationBean(); bean.setUserConnectedRequired(getPollenServiceConfig().isUserConnectedRequired()); + bean.setUsersCanCreatePoll(getPollenServiceConfig().getUsersCanCreatePoll()); return bean; } diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java index 7591f396..1ce0a46f 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java @@ -250,6 +250,7 @@ public class PollService extends PollenServiceSupport { public PollBean getNewPoll(ChoiceType choiceType) { checkIsConnectedRequired(); + checkPermission(PermissionVerb.addPoll); PollBean pollBean = new PollBean(); pollBean.setChoiceType(choiceType); @@ -301,6 +302,7 @@ public class PollService extends PollenServiceSupport { List<VoterListBean> voterLists, List<VoterListMemberBean> voterListMembers) throws InvalidFormException { checkIsConnectedRequired(); + checkPermission(PermissionVerb.addPoll); checkNotNull(poll); checkIsNotPersisted(poll); @@ -379,6 +381,7 @@ public class PollService extends PollenServiceSupport { checkIsConnectedRequired(); checkNotNull(pollId); + checkPermission(PermissionVerb.addPoll); checkPermission(PermissionVerb.clonePoll, pollId); Poll poll = getPoll0(pollId); diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java index f99c5945..20460e7f 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollenServiceSupport.java @@ -306,6 +306,26 @@ public abstract class PollenServiceSupport implements PollenService { } + protected void checkPermission(PermissionVerb verb) { + + String permission = getSecurityService().createPermission(verb); + getSecurityService().checkPermission(permission); + + } + + protected boolean isPermitted(PermissionVerb verb) { + + String permission = getSecurityService().createPermission(verb); + return getSecurityService().isPermitted(permission); + + } + + protected boolean isNotPermitted(PermissionVerb verb) { + + return !isPermitted(verb); + + } + protected void checkNotNull(Object object) { Preconditions.checkNotNull(object); 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 944a14af..54298256 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 @@ -41,6 +41,7 @@ import org.chorem.pollen.services.bean.PollenEntityRef; import org.chorem.pollen.services.bean.PollenUserBean; import org.chorem.pollen.services.bean.PollenUserEmailAddressBean; import org.chorem.pollen.services.bean.UserCredentialBean; +import org.chorem.pollen.services.bean.UsersRight; import org.chorem.pollen.services.bean.resource.ResourceFileBean; import org.chorem.pollen.services.service.security.PollenDefaultEmailAddressException; import org.chorem.pollen.services.service.security.PollenEmailNotValidatedException; @@ -98,6 +99,8 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer bean.setDefaultEmailAddress(toPollenUserEmailAddressBean(entity.getDefaultEmailAddress())); } + bean.setCanCreatePoll(entity.isCanCreatePoll()); + return bean; } @@ -495,6 +498,9 @@ public class PollenUserService extends PollenServiceSupport implements PollenSer } toSave.setName(user.getName()); toSave.setLanguage(user.getLanguage()); + if (UsersRight.USERS_SELECTED.equals(getPollenServiceConfig().getUsersCanCreatePoll())) { + toSave.setCanCreatePoll(user.isCanCreatePoll()); + } return toSave; 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 422fe360..3dfb9a6d 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 @@ -63,6 +63,7 @@ import org.chorem.pollen.persistence.entity.VoterListMember; import org.chorem.pollen.services.PollenServiceContext; import org.chorem.pollen.services.bean.PaginationParameterBean; import org.chorem.pollen.services.bean.PollenEntityRef; +import org.chorem.pollen.services.bean.UsersRight; import org.chorem.pollen.services.service.PollenServiceSupport; import org.nuiton.topia.persistence.TopiaEntity; @@ -362,6 +363,12 @@ public class SecurityService extends PollenServiceSupport { } + public String createPermission(PermissionVerb verb) { + + return ":" + verb.name(); + + } + public void checkUserPassword(PollenUser user, String password) throws PollenInvalidPasswordException { String encodedPassword = null; @@ -554,6 +561,15 @@ public class SecurityService extends PollenServiceSupport { PollenPrincipal pollenPrincipal = securityContext.getMainPrincipal(); PollenUser user = securityContext.getPollenUser(); + // get addPoll + UsersRight usersCanCreatePoll = getPollenServiceConfig().getUsersCanCreatePoll(); + if (UsersRight.ALL_USERS.equals(usersCanCreatePoll) + || (UsersRight.USERS_CONNECTED.equals(usersCanCreatePoll) && user != null) + || (UsersRight.USERS_SELECTED.equals(usersCanCreatePoll) && user != null && user.isCanCreatePoll())) { + permissions.add(createSubjectPermission(PermissionVerb.addPoll)); + } + + // Get read data Set<Poll> polls = getPollDao().findAllFreePolls(); @@ -847,6 +863,12 @@ public class SecurityService extends PollenServiceSupport { } + private String createSubjectPermission(PermissionVerb verb) { + + return "*:" + verb; + + } + private String createWildcardSubjectPermission(TopiaEntity entity) { return "*:*:" + entity.getTopiaId(); 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 a28db74e..837b3e8f 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 @@ -41,6 +41,7 @@ pollen.configuration.uiEndPoint=Ui end point pollen.configuration.uiUrlPollEdit=Url to edit a poll pollen.configuration.uiUrlPollVote=Url to vote on a poll pollen.configuration.userConnectedRequired=Only connected users can be access on application +pollen.configuration.usersCanCreatePoll=Wich user can create Poll ("All_USERS", "USERS_CONNECTED" or "USERS_SELECTED") pollen.configuration.version=Application version pollen.configurqtion.uiUrlPollVoteEdit=Url to edit a vote on a poll pollen.configurqtion.uiUrlUserValidate=Url de validate user account 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 248bbe1a..8d4b0392 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 @@ -41,6 +41,7 @@ pollen.configuration.uiEndPoint=End point de l'ui pollen.configuration.uiUrlPollEdit=Url d'édition d'un sondage pollen.configuration.uiUrlPollVote=Url de vote sur un sondage pollen.configuration.userConnectedRequired=Seul les utilisateurs connectés peuvent accéder à l'application +pollen.configuration.usersCanCreatePoll=Quels utilisateurs peuvent créer des sondages ("All_USERS", "USERS_CONNECTED" ou "USERS_SELECTED") pollen.configuration.version=Version de l'application pollen.configurqtion.uiUrlPollVoteEdit=Url d'édition de vote sur un sondage pollen.configurqtion.uiUrlUserValidate=Url de validation d'un compte utilisateur diff --git a/pollen-services/src/test/java/org/chorem/pollen/services/service/VoteCountingServiceTest.java b/pollen-services/src/test/java/org/chorem/pollen/services/service/VoteCountingServiceTest.java index 5840a8d1..234b059d 100644 --- a/pollen-services/src/test/java/org/chorem/pollen/services/service/VoteCountingServiceTest.java +++ b/pollen-services/src/test/java/org/chorem/pollen/services/service/VoteCountingServiceTest.java @@ -98,6 +98,9 @@ public class VoteCountingServiceTest extends AbstractPollenServiceTest { String pollId = createdPollRef.getEntityId(); + + pollService.getSecurityContext().setSubject(null); + List<ChoiceBean> createdChoices = choiceService.getChoices(pollId); ChoiceBean createdChoiceBean1 = createdChoices.get(0); ChoiceBean createdChoiceBean2 = createdChoices.get(1); 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 4a809ab9..5a4658fb 100644 --- a/pollen-ui-riot-js/src/main/web/i18n/fr.json +++ b/pollen-ui-riot-js/src/main/web/i18n/fr.json @@ -391,6 +391,7 @@ "users_oneFound": "{0} trouvé sur ", "users_manyFound": "{0} trouvés sur ", "user_banned": "Banni", + "user_pollCreator": "Createur de sondages", "user_emailValidate": "En cours de validation", "user_emailIsValidate": "Adresse électronique validé", "user_administrator": "Administrateur", diff --git a/pollen-ui-riot-js/src/main/web/js/Session.js b/pollen-ui-riot-js/src/main/web/js/Session.js index 8dce67bf..31067807 100644 --- a/pollen-ui-riot-js/src/main/web/js/Session.js +++ b/pollen-ui-riot-js/src/main/web/js/Session.js @@ -212,6 +212,27 @@ class Session { return this.pollenUIContext.uiEndPoint + "/?loginProvider=" + provider + "&action=signin"; } + isCanCreatePoll() { + return this.configurationServer + && (!this.configurationServer.userConnectedRequired || this.user) + && (this.configurationServer.usersCanCreatePoll === "ALL_USERS" + || (this.configurationServer.usersCanCreatePoll === "USERS_CONNECTED" && this.user) + || (this.configurationServer.usersCanCreatePoll === "USERS_SELECTED" && this.user && this.user.canCreatePoll)); + } + + getCanCreatePollPromise() { + return this.configurationServerPromise.then(config => { + if (config.usersCanCreatePoll === "ALL_USERS") { + return true; + } + return this.userPromise.then(user => { + return config.usersCanCreatePoll === "USERS_CONNECTED" || user.canCreatePoll; + }, () => { + return false; + }); + }); + } + } module.exports = singleton(Session); diff --git a/pollen-ui-riot-js/src/main/web/tag/Authorization.tag.html b/pollen-ui-riot-js/src/main/web/tag/Authorization.tag.html index 80384688..c31c5ce1 100644 --- a/pollen-ui-riot-js/src/main/web/tag/Authorization.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/Authorization.tag.html @@ -37,6 +37,11 @@ } else { authorizationPromise = Promise.resolve(true); } + if (this.opts.promise) { + authorizationPromise = Promise.all([this.opts.promise, authorizationPromise]).then(result => { + return result[0] && result[1]; + }); + } Promise.all([this.argumentsPromise, authorizationPromise]).then(result => { this.routeArguments = result[0]; diff --git a/pollen-ui-riot-js/src/main/web/tag/AvatarAction.tag.js b/pollen-ui-riot-js/src/main/web/tag/AvatarAction.tag.js deleted file mode 100644 index f3d184b7..00000000 --- a/pollen-ui-riot-js/src/main/web/tag/AvatarAction.tag.js +++ /dev/null @@ -1,20 +0,0 @@ -let riot = require("riot"); -let route = require("riot-route/lib/tag").default; // a voir pourquoi le default doit être mi ; -let session = require("../js/Session"); -let userService = require("../js/UserService"); - -riot.tag("avataraction", false, function() { - - var q = route.query(); - if (q.loginProvider != null && session.isConnected()) { - session.userPromise.then(() => { - userService.setProviderAvatar(q).then(() => { - location.replace(session.pollenUIContext.uiEndPoint + "/#user/profile"); - }, (e) => { - e.text().then(label => { - location.replace(session.pollenUIContext.uiEndPoint + "/#user/profile?error=" + label); - }); - }); - }); - } -}); diff --git a/pollen-ui-riot-js/src/main/web/tag/FilterLoginProvider.tag.js b/pollen-ui-riot-js/src/main/web/tag/FilterLoginProvider.tag.js new file mode 100644 index 00000000..c2961265 --- /dev/null +++ b/pollen-ui-riot-js/src/main/web/tag/FilterLoginProvider.tag.js @@ -0,0 +1,46 @@ +let riot = require("riot"); +let route = require("riot-route/lib/tag").default; // a voir pourquoi le default doit être mi ; +let session = require("../js/Session"); +let userService = require("../js/UserService"); + +riot.tag("filterloginProvider", false, function() { + + let query = route.query(); + if (query.loginProvider != null) { + if (query.action === "signin") { + session.signInProvider(query).then(() => { + let currentPage = localStorage.getItem("currentPage"); + localStorage.removeItem("currentPage"); + location.replace(session.pollenUIContext.uiEndPoint + "/" + currentPage); + }, (e) => { + let currentPage = localStorage.getItem("currentPage"); + localStorage.removeItem("currentPage"); + e.text().then(label => { + location.replace(session.pollenUIContext.uiEndPoint + "/" + currentPage + "?error=" + label); + }); + }); + + } else if (query.action === "link" && session.isConnected()) { + session.userPromise.then(() => { + userService.linkProvider(query).then(() => { + location.replace(session.pollenUIContext.uiEndPoint + "/#user/profile"); + }, (e) => { + e.text().then(label => { + location.replace(session.pollenUIContext.uiEndPoint + "/#user/profile?error=" + label); + }); + }); + }); + + } else if (query.action === "avatar" && session.isConnected()) { + session.userPromise.then(() => { + userService.setProviderAvatar(query).then(() => { + location.replace(session.pollenUIContext.uiEndPoint + "/#user/profile"); + }, (e) => { + e.text().then(label => { + location.replace(session.pollenUIContext.uiEndPoint + "/#user/profile?error=" + label); + }); + }); + }); + } + } +}); diff --git a/pollen-ui-riot-js/src/main/web/tag/LinkAction.tag.js b/pollen-ui-riot-js/src/main/web/tag/LinkAction.tag.js deleted file mode 100644 index 639b9f96..00000000 --- a/pollen-ui-riot-js/src/main/web/tag/LinkAction.tag.js +++ /dev/null @@ -1,20 +0,0 @@ -let riot = require("riot"); -let route = require("riot-route/lib/tag").default; // a voir pourquoi le default doit être mi ; -let session = require("../js/Session"); -let userService = require("../js/UserService"); - -riot.tag("linkaction", false, function() { - - var q = route.query(); - if (q.loginProvider != null && session.isConnected()) { - session.userPromise.then(() => { - userService.linkProvider(q).then(() => { - location.replace(session.pollenUIContext.uiEndPoint + "/#user/profile"); - }, (e) => { - e.text().then(label => { - location.replace(session.pollenUIContext.uiEndPoint + "/#user/profile?error=" + label); - }); - }); - }); - } -}); diff --git a/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html b/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html index 980e66ee..80d439f2 100644 --- a/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/Pollen.tag.html @@ -31,9 +31,7 @@ require("./SignCheck.tag.html"); require("./Home.tag.html"); require("./Privacy.tag.html"); require("./PageChanged.tag.js"); -require("./SigninAction.tag.js"); -require("./AvatarAction.tag.js"); -require("./LinkAction.tag.js"); +require("./FilterLoginProvider.tag.js"); require("./poll/EditPoll.tag.html"); require("./poll/Poll.tag.html"); require("./poll/Summary.tag.html"); @@ -78,6 +76,7 @@ require("./popup/GtuChangeModal.tag.html"); </route> <route path=""> + <FilterLoginProvider/> <Authorization connected-if-required="true"> <Home/> </Authorization> @@ -120,7 +119,7 @@ require("./popup/GtuChangeModal.tag.html"); </route> <route path="poll/new/*"> - <Authorization connected-if-required="true"> + <Authorization connected-if-required="true" promise={parent.parent.session.getCanCreatePollPromise()}> <PageChanged page="newPoll"/> <EditPoll choice-type={routeArguments[0]}/> </Authorization> @@ -231,14 +230,6 @@ require("./popup/GtuChangeModal.tag.html"); <route path="signin.."> <SignInAction/> </route> - - <route path="avatar"> - <AvatarAction/> - </route> - - <route path="link"> - <LinkAction/> - </route> </router> <SignIn ref="signIn"/> </div> @@ -248,10 +239,10 @@ require("./popup/GtuChangeModal.tag.html"); <PollenMessageManager/> <script type="es6"> - let session = require("../js/Session"); - this.installBundle(session, "main"); + this.session = require("../js/Session"); + this.installBundle(this.session, "main"); - session.start(); + this.session.start(); this.pageTitle = undefined; this.onLocaleChange = () => { diff --git a/pollen-ui-riot-js/src/main/web/tag/PollenHeader.tag.html b/pollen-ui-riot-js/src/main/web/tag/PollenHeader.tag.html index 7bb263f6..145b8461 100644 --- a/pollen-ui-riot-js/src/main/web/tag/PollenHeader.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/PollenHeader.tag.html @@ -28,12 +28,12 @@ require("./components/Avatar.tag.html"); <a class="header-home instance-title" href="#" target="_top"></a> <div class="header-actions"> - <div if={ (session.configurationServer && !session.configurationServer.userConnectedRequired) || user}> + <div if={canCreatePoll}> <a class="header-link header-link--info" href="#poll/new/text" title="{__.newPoll}"> <i class="fa fa-plus"></i> <span class="action-label">{__.newPoll}</span> </a> </div> - <div class="dropdown" if="{user && user.administrator}"> + <div class="dropdown" if="{admin}"> <a class="header-link"> <i class="fa fa-wrench"/> </a> @@ -97,15 +97,22 @@ require("./components/Avatar.tag.html"); this.user = this.session.getUser(); this.admin = this.user && this.user.administrator; + this.canCreatePoll = false; this.onUserChange = user => { this.user = user; this.admin = user && user.administrator; + this.canCreatePoll = this.session.isCanCreatePoll(); this.update(); }; this.listen("user", this.onUserChange); + this.session.getCanCreatePollPromise().then(canCreatePoll => { + this.canCreatePoll = canCreatePoll; + this.update(); + }); + this.openFeedback = () => { this.refs.feedbackModal.open().then(() => { this.update(); diff --git a/pollen-ui-riot-js/src/main/web/tag/SigninAction.tag.js b/pollen-ui-riot-js/src/main/web/tag/SigninAction.tag.js index 5dbd80a5..52a6562f 100644 --- a/pollen-ui-riot-js/src/main/web/tag/SigninAction.tag.js +++ b/pollen-ui-riot-js/src/main/web/tag/SigninAction.tag.js @@ -4,24 +4,10 @@ let session = require("../js/Session"); riot.tag("signinaction", false, function() { - let q = route.query(); - if (q.loginProvider != null) { - session.signInProvider(q).then(() => { - let currentPage = localStorage.getItem("currentPage"); - localStorage.removeItem("currentPage"); - location.replace(session.pollenUIContext.uiEndPoint + "/" + currentPage); - }, (e) => { - let currentPage = localStorage.getItem("currentPage"); - localStorage.removeItem("currentPage"); - e.text().then(label => { - location.replace(session.pollenUIContext.uiEndPoint + "/" + currentPage + "?error=" + label); - }); - }); - } else { - this.bus.trigger("signIn"); - this.listen("signInClosed", () => { - this.logger.info("route to " + (q.hash || "")); - route(q.hash || ""); - }); - } + let query = route.query(); + this.bus.trigger("signIn"); + this.listen("signInClosed", () => { + this.logger.info("route to " + (query.hash || "")); + route(query.hash || ""); + }); }); diff --git a/pollen-ui-riot-js/src/main/web/tag/admin/UserCard.tag.html b/pollen-ui-riot-js/src/main/web/tag/admin/UserCard.tag.html index 76e8a22b..de2ba90f 100644 --- a/pollen-ui-riot-js/src/main/web/tag/admin/UserCard.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/admin/UserCard.tag.html @@ -8,12 +8,12 @@ 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% @@ -37,6 +37,10 @@ require("./UserEditModal.tag.html"); class="premium fa fa-star-o" aria-hidden="true" title={parent.__.premiumOf + ' ' + parent.formatDate(parent.opts.user.premiumTo, 'LL')}></i> + <i if={parent.session.configurationServer.usersCanCreatePoll === "USERS_SELECTED" && parent.opts.user.canCreatePoll} + class="poll-creator fa fa-plus success" + aria-hidden="true" + title={parent.__.pollCreator}></i> <div class="user-email" if="{parent.opts.user.defaultEmailAddress}"> <i class="fa fa-refresh" if={!parent.opts.user.emailIsValidate} title={parent.__.emailValidate}></i> {parent.opts.user.defaultEmailAddress.emailAddress} @@ -80,8 +84,8 @@ require("./UserEditModal.tag.html"); </form> <script type="es6"> - let session = require("../../js/Session"); - this.installBundle(session, "user"); + this.session = require("../../js/Session"); + this.installBundle(this.session, "user"); let userService = require("../../js/UserService"); this.editing = false; this.errors = {}; @@ -143,6 +147,12 @@ require("./UserEditModal.tag.html"); font-size: 3em; left: 105px; } + .poll-creator { + position: absolute; + top: 65px; + font-size: 3em; + left: 35px; + } </style> </UserCard> diff --git a/pollen-ui-riot-js/src/main/web/tag/admin/UserEditModal.tag.html b/pollen-ui-riot-js/src/main/web/tag/admin/UserEditModal.tag.html index f86fbe0a..77c3a77d 100644 --- a/pollen-ui-riot-js/src/main/web/tag/admin/UserEditModal.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/admin/UserEditModal.tag.html @@ -8,12 +8,12 @@ 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% @@ -81,6 +81,19 @@ require("../components/UserEmailAddressList.tag.html"); </div> </label> </div> + <div class="o-form-element" + if={parent.pollCreatorEnable}> + <label class="c-toggle c-toggle--info"> + {parent.__.pollCreator} + <input type="checkbox" + id="canCreatePoll" + ref="canCreatePoll" + checked={parent.opts.user.canCreatePoll}> + <div class="c-toggle__track"> + <div class="c-toggle__handle"></div> + </div> + </label> + </div> </div> <UserEmailAddressList class="column email-addresses" user="{parent.opts.user}" admin="{true}"/> </div> @@ -104,10 +117,9 @@ require("../components/UserEmailAddressList.tag.html"); this.save = () => { let user2 = Object.assign({}, this.opts.user); user2.name = this.refs.modal.refs.name.value; - user2.email = this.refs.modal.refs.email.value; user2.administrator = this.refs.modal.refs.administrator.checked; user2.banned = this.refs.modal.refs.banned.checked; - user2.emailIsValidate = this.refs.modal.refs.emailIsValidate.checked; + user2.canCreatePoll = this.refs.modal.refs.canCreatePoll.checked; user2.premiumTo = this.refs.modal.refs.premiumTo.getValue(); return userService.saveUser(user2).then(() => { @@ -133,6 +145,11 @@ require("../components/UserEmailAddressList.tag.html"); }); }; + session.configurationServerPromise.then(config => { + this.pollCreatorEnable = config.usersCanCreatePoll === "USERS_SELECTED"; + this.update(); + }); + </script> <style> .modal-content { -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.