branch feature/1_socialauth updated (e7253bfe -> 6ad03011)
This is an automated email from the git hooks/post-receive script. New change to branch feature/1_socialauth in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git from e7253bfe refs #1 ajout de la conf des providers dans la base (plus simple à modifier) + début de l'admin new 96d56ad1 refs #1 ajout du socialmanager dans la session en attendant le retour du provider + gestion des tiers de connexion + gestion des comptes sans email new 6ad03011 refs #1 gestion des tiers de connexion + style du login The 2 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 6ad03011d76b59ef512a3fcf88a235510b8e4323 Author: Kevin Morin <morin@codelutin.com> Date: Fri Aug 25 18:04:36 2017 +0200 refs #1 gestion des tiers de connexion + style du login commit 96d56ad16172a41ac45792aadc135237a21c53b0 Author: Kevin Morin <morin@codelutin.com> Date: Fri Aug 25 18:03:46 2017 +0200 refs #1 ajout du socialmanager dans la session en attendant le retour du provider + gestion des tiers de connexion + gestion des comptes sans email Summary of changes: .../org/chorem/pollen/rest/api/v1/AuthApi.java | 41 +++++-- .../services/service/NotificationService.java | 50 ++++---- .../pollen/services/service/SocialAuthService.java | 60 ++++++---- pollen-ui-riot-js/src/main/web/css/main.css | 8 ++ pollen-ui-riot-js/src/main/web/i18n.json | 14 ++- pollen-ui-riot-js/src/main/web/js/AuthService.js | 18 ++- pollen-ui-riot-js/src/main/web/js/FetchService.js | 5 +- pollen-ui-riot-js/src/main/web/js/Session.js | 2 +- pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html | 131 ++++++++++++++------- pollen-ui-riot-js/src/main/web/tag/SignUp.tag.html | 4 +- .../src/main/web/tag/admin/LoginProviders.tag.html | 104 +++++++++++++--- 11 files changed, 318 insertions(+), 119 deletions(-) -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/1_socialauth in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit 96d56ad16172a41ac45792aadc135237a21c53b0 Author: Kevin Morin <morin@codelutin.com> Date: Fri Aug 25 18:03:46 2017 +0200 refs #1 ajout du socialmanager dans la session en attendant le retour du provider + gestion des tiers de connexion + gestion des comptes sans email --- .../org/chorem/pollen/rest/api/v1/AuthApi.java | 41 ++++++++++++--- .../services/service/NotificationService.java | 50 ++++++++++-------- .../pollen/services/service/SocialAuthService.java | 60 ++++++++++++++-------- 3 files changed, 101 insertions(+), 50 deletions(-) diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java index 748dc894..fc2ac99b 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/AuthApi.java @@ -26,10 +26,13 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.shiro.codec.Base64; +import org.brickred.socialauth.SocialAuthManager; +import org.chorem.pollen.persistence.entity.LoginProvider; import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.persistence.entity.SessionToken; import org.chorem.pollen.services.PollenServiceContext; import org.chorem.pollen.services.bean.LoginProviderBean; +import org.chorem.pollen.services.bean.PollenEntityId; import org.chorem.pollen.services.bean.PollenEntityRef; import org.chorem.pollen.services.service.PollenUserService; import org.chorem.pollen.services.service.SocialAuthService; @@ -42,7 +45,9 @@ import org.chorem.pollen.services.service.security.PollenSecurityContext; import org.chorem.pollen.services.service.security.PollenUserBannedException; import org.chorem.pollen.services.service.security.SecurityService; +import javax.servlet.http.HttpServletRequest; import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.POST; @@ -55,7 +60,6 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.NewCookie; import javax.ws.rs.core.Response; -import java.net.URI; import java.util.List; import java.util.Map; @@ -75,7 +79,8 @@ public class AuthApi { public static final String COOKIE_POLLEN_AUTH = "pollen-auth"; private static final String COOKIE_POLLEN_CONNECTED = "pollen-connected"; - private final static int COOKIE_MAX_AGE = 60 * 60 * 24 * 365; // 1 year + private static final int COOKIE_MAX_AGE = 60 * 60 * 24 * 365; // 1 year + private static final String SOCIAL_AUTH_MANAGER_SESSION_KEY = "socialAuthManager"; public static Response.ResponseBuilder removeAuthCookie(Response.ResponseBuilder reponseBuilder) { @@ -191,13 +196,15 @@ public class AuthApi { @Path("/login/{providerId}") @GET - public Response loginProvider(@Context SocialAuthService socialAuthService, + public String getLoginProviderUrl(@Context SocialAuthService socialAuthService, + @Context HttpServletRequest request, @PathParam("providerId") String providerId, @QueryParam("providerRedirection") String providerRedirection) throws Exception { - String providerLoginUrl = socialAuthService.getProviderAuthenticationUrl(providerId, providerRedirection); - return Response.seeOther(URI.create(providerLoginUrl)).build(); + SocialAuthManager socialAuthManager = socialAuthService.getSocialAuthManager(); + request.getSession(true).setAttribute(SOCIAL_AUTH_MANAGER_SESSION_KEY, socialAuthManager); + return socialAuthManager.getAuthenticationUrl(providerId, providerRedirection); } @Path("/login/{providerId}") @@ -206,14 +213,18 @@ public class AuthApi { @Context PollenServiceContext serviceContext, @Context SecurityService securityService, @Context PollenSecurityContext securityContext, - @PathParam("providerId") String providerId, - String providerRedirection, + @Context HttpServletRequest request, @HeaderParam("authorization") String authorization) throws Exception { + SocialAuthManager socialAuthManager = + (SocialAuthManager) request.getSession().getAttribute(SOCIAL_AUTH_MANAGER_SESSION_KEY); + //socialAuthManager + request.getSession().removeAttribute(SOCIAL_AUTH_MANAGER_SESSION_KEY); Gson gson = new Gson(); Map<String, String> paramsMap = gson.fromJson(authorization, Map.class); - PollenEntityRef<PollenUser> userPollenEntityRef = socialAuthService.login(providerId, providerRedirection, paramsMap); + PollenEntityRef<PollenUser> userPollenEntityRef = socialAuthService.login(socialAuthManager, + paramsMap); return getLoginResponseFromPollenUser(serviceContext, securityService, securityContext, userPollenEntityRef); } @@ -270,8 +281,22 @@ public class AuthApi { return socialAuthService.saveLoginProvider(loginProvider, true); } + @Path("/loginproviders/{providerId}") + @DELETE + public void deleteLoginProvider(@Context SocialAuthService socialAuthService, + @PathParam("providerId") PollenEntityId<LoginProvider> providerId) { + socialAuthService.deleteLoginProvider(providerId.getEntityId()); + + } + @Path("/loginproviders/active") @GET + public List<String> getActiveLoginProviders(@Context SocialAuthService socialAuthService) { + return socialAuthService.getActiveLoginProviders(); + } + + @Path("/loginproviders/available") + @GET public List<String> getAvailableLoginProviders(@Context SocialAuthService socialAuthService) { return socialAuthService.getAvailableLoginProviders(); } 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 035fb742..50e62797 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 @@ -73,10 +73,12 @@ import java.util.Set; public class NotificationService extends PollenServiceSupport { public void onUserCreated(PollenUser user) { - EmailService emailService = getEmailService(); - UserAccountCreatedEmail email = emailService.newUserAccountCreatedEmail(user); - email.addTo(user.getEmail()); - emailService.send(email); + if (StringUtils.isNotBlank(user.getEmail())) { + EmailService emailService = getEmailService(); + UserAccountCreatedEmail email = emailService.newUserAccountCreatedEmail(user); + email.addTo(user.getEmail()); + emailService.send(email); + } } public void onResendValidation(PollenUser user) { @@ -87,24 +89,30 @@ public class NotificationService extends PollenServiceSupport { } public void onUserEdited(PollenUser user) { - EmailService emailService = getEmailService(); - UserAccountEditedEmail email = emailService.newUserAccountEditedEmail(user); - email.addTo(user.getEmail()); - emailService.send(email); + if (StringUtils.isNotBlank(user.getEmail())) { + EmailService emailService = getEmailService(); + UserAccountEditedEmail email = emailService.newUserAccountEditedEmail(user); + email.addTo(user.getEmail()); + emailService.send(email); + } } public void onUserDeleted(PollenUser user) { - EmailService emailService = getEmailService(); - UserAccountDeletedEmail email = emailService.newUserAccountDeletedEmail(user); - email.addTo(user.getEmail()); - emailService.send(email); + if (StringUtils.isNotBlank(user.getEmail())) { + EmailService emailService = getEmailService(); + UserAccountDeletedEmail email = emailService.newUserAccountDeletedEmail(user); + email.addTo(user.getEmail()); + emailService.send(email); + } } public void onUserPasswordChanged(PollenUser user) { - EmailService emailService = getEmailService(); - UserAccountPasswordChangedEmail email = emailService.newUserAccountPasswordChangedEmail(user); - email.addTo(user.getEmail()); - emailService.send(email); + if (StringUtils.isNotBlank(user.getEmail())) { + EmailService emailService = getEmailService(); + UserAccountPasswordChangedEmail email = emailService.newUserAccountPasswordChangedEmail(user); + email.addTo(user.getEmail()); + emailService.send(email); + } } public void onUserEmailValidated(PollenUser user) { @@ -115,10 +123,12 @@ public class NotificationService extends PollenServiceSupport { } public void onUserLostPasswordAsked(PollenUser user, String newPassword) { - EmailService emailService = getEmailService(); - LostPasswordEmail email = emailService.newLostPasswordEmail(user, newPassword); - email.addTo(user.getEmail()); - emailService.send(email); + if (StringUtils.isNotBlank(user.getEmail())) { + EmailService emailService = getEmailService(); + LostPasswordEmail email = emailService.newLostPasswordEmail(user, newPassword); + email.addTo(user.getEmail()); + emailService.send(email); + } } public void onFavoriteListAdded(PollenUser user, FavoriteList favoriteList) { 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 2d4aa50f..2e136aa7 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 @@ -19,7 +19,7 @@ import org.chorem.pollen.persistence.entity.UserCredentialImpl; import org.chorem.pollen.services.bean.LoginProviderBean; import org.chorem.pollen.services.bean.PollenEntityRef; -import java.util.Comparator; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -33,21 +33,9 @@ public class SocialAuthService extends PollenServiceSupport { /** Logger. */ private static final Log log = LogFactory.getLog(SocialAuthService.class); - public String getProviderAuthenticationUrl(String providerId, String redirection) throws Exception { - SocialAuthManager manager = getSocialAuthManager(); - - // get Provider URL to which you should redirect for authentication. - // id can have values "facebook", "twitter", "yahoo" etc. or the OpenID URL - return manager.getAuthenticationUrl(providerId, redirection); - } - - public PollenEntityRef<PollenUser> login(String providerId, - String redirection, + public PollenEntityRef<PollenUser> login(SocialAuthManager manager, Map<String, String> paramsMap) throws Exception { - SocialAuthManager manager = getSocialAuthManager(); - manager.getAuthenticationUrl(providerId, redirection); - paramsMap.remove(Constants.STATE); AuthProvider provider = manager.connect(paramsMap); // get profile @@ -94,7 +82,7 @@ public class SocialAuthService extends PollenServiceSupport { return getSecurityService().getSessionTokenForUser(pollenUser); } - protected SocialAuthManager getSocialAuthManager() throws Exception { + public SocialAuthManager getSocialAuthManager() throws Exception { //Create an instance of SocialAuthConfgi object SocialAuthConfig config = SocialAuthConfig.getDefault(); @@ -128,27 +116,47 @@ public class SocialAuthService extends PollenServiceSupport { public List<LoginProviderBean> getAllLoginProviders() { checkIsAdmin(); LoginProviderTopiaDao dao = getLoginProviderDao(); - List<LoginProvider> loginProviders = dao.findAll().stream() - .sorted(Comparator.comparing(LoginProvider::getName)) - .collect(Collectors.toList()); + List<LoginProvider> loginProviders = dao.findAll(); return toBeanList(LoginProviderBean.class, loginProviders); } - public List<String> getAvailableLoginProviders() { + public List<String> getActiveLoginProviders() { LoginProviderTopiaDao dao = getLoginProviderDao(); return dao.forActiveEquals(true).findAll().stream() .map(LoginProvider::getName) - .sorted() .collect(Collectors.toList()); } + public List<String> getAvailableLoginProviders() { + return new ArrayList<String>() {{ + add(Constants.AMAZON); + add(Constants.FACEBOOK); + add(Constants.FLICKR); + add(Constants.FOURSQUARE); + add(Constants.GITHUB); + add(Constants.GOOGLE_PLUS); + add(Constants.HOTMAIL); + add(Constants.INSTAGRAM); + add(Constants.LINKEDIN); + add(Constants.LINKEDINOAUTH2); + add(Constants.MENDELEY); + add(Constants.MYSPACE); + add(Constants.NIMBLE); + add(Constants.RUNKEEPER); + add(Constants.SALESFORCE); + add(Constants.STACK_EXCHANGE); + add(Constants.TWITTER); + add(Constants.YAHOO); + add(Constants.YAMMER); + }}; + } + public LoginProviderBean saveLoginProvider(LoginProviderBean loginProvider, boolean loginProviderExists) { checkIsAdmin(); checkNotNull(loginProvider); - LoginProviderTopiaDao dao = getLoginProviderDao(); + LoginProviderTopiaDao dao = getLoginProviderDao(); LoginProvider toSave; - if (loginProviderExists) { toSave = dao.forTopiaIdEquals(loginProvider.getEntityId()).findUnique(); } else { @@ -163,4 +171,12 @@ public class SocialAuthService extends PollenServiceSupport { commit(); return toBean(LoginProviderBean.class, toSave); } + + public void deleteLoginProvider(String providerId) { + checkIsAdmin(); + checkNotNull(providerId); + LoginProviderTopiaDao dao = getLoginProviderDao(); + dao.delete(dao.forTopiaIdEquals(providerId).findUnique()); + commit(); + } } -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/1_socialauth in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit 6ad03011d76b59ef512a3fcf88a235510b8e4323 Author: Kevin Morin <morin@codelutin.com> Date: Fri Aug 25 18:04:36 2017 +0200 refs #1 gestion des tiers de connexion + style du login --- pollen-ui-riot-js/src/main/web/css/main.css | 8 ++ pollen-ui-riot-js/src/main/web/i18n.json | 14 ++- pollen-ui-riot-js/src/main/web/js/AuthService.js | 18 ++- pollen-ui-riot-js/src/main/web/js/FetchService.js | 5 +- pollen-ui-riot-js/src/main/web/js/Session.js | 2 +- pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html | 131 ++++++++++++++------- pollen-ui-riot-js/src/main/web/tag/SignUp.tag.html | 4 +- .../src/main/web/tag/admin/LoginProviders.tag.html | 104 +++++++++++++--- 8 files changed, 217 insertions(+), 69 deletions(-) diff --git a/pollen-ui-riot-js/src/main/web/css/main.css b/pollen-ui-riot-js/src/main/web/css/main.css index 04db9045..59c2433c 100644 --- a/pollen-ui-riot-js/src/main/web/css/main.css +++ b/pollen-ui-riot-js/src/main/web/css/main.css @@ -470,3 +470,11 @@ pollenfooter a:hover { .no-border { border: 0; } + +.align-right { + text-align: right; +} + +.align-center { + text-align: center; + } \ No newline at end of file diff --git a/pollen-ui-riot-js/src/main/web/i18n.json b/pollen-ui-riot-js/src/main/web/i18n.json index 61efac9d..ce320eaa 100644 --- a/pollen-ui-riot-js/src/main/web/i18n.json +++ b/pollen-ui-riot-js/src/main/web/i18n.json @@ -545,7 +545,12 @@ "loginProviders_key": "Clé client", "loginProviders_secret": "Code secret", "loginProviders_permissions": "Permissions", - "loginProviders_active": "Actif" + "loginProviders_active": "Actif", + "loginProviders_newProvider": "Nouveau tiers", + "loginProviders_deleteMessage": "Êtes-vous sûr de vouloir supprimer ce tier ?", + "loginProviders_emptyName": "Le nom est obligatoire", + "loginProviders_emptyKey": "La clé client est obligatoire", + "loginProviders_emptySecret": "Le code secret est obligatoire" }, "en": { "main_pollen_title": "Pollen - ", @@ -1072,6 +1077,11 @@ "loginProviders_key": "Client key", "loginProviders_secret": "Secret code", "loginProviders_permissions": "Permissions", - "loginProviders_active": "Active" + "loginProviders_active": "Active", + "loginProviders_newProvider": "New provider", + "loginProviders_deleteMessage": "Are you sure you want to delete this provider?", + "loginProviders_emptyName": "The name is mandatory", + "loginProviders_emptyKey": "The client key is mandatory", + "loginProviders_emptySecret": "The secret code is mandatory" } } diff --git a/pollen-ui-riot-js/src/main/web/js/AuthService.js b/pollen-ui-riot-js/src/main/web/js/AuthService.js index 5aa63a94..3fd1d1f1 100644 --- a/pollen-ui-riot-js/src/main/web/js/AuthService.js +++ b/pollen-ui-riot-js/src/main/web/js/AuthService.js @@ -68,12 +68,15 @@ class AuthService extends FetchService { return this.post("/v1/resendValidation", email); } - signInProvider(query, providerRedirection) { + getLoginProviderUrl(providerId, redirection) { + return this.get("/v1/login/" + providerId, { providerRedirection: redirection}); + } + + signInProvider(query) { return this.fetch( "/v1/login/" + query.loginProvider, "POST", - {Authorization: JSON.stringify(query)}, - providerRedirection); + {Authorization: JSON.stringify(query)}); } getAllLoginProviders() { @@ -81,13 +84,20 @@ class AuthService extends FetchService { } getAvailableLoginProviders() { - console.log("getAvailableLoginProviders") + return this.get("/v1/loginproviders/available"); + } + + getActiveLoginProviders() { return this.get("/v1/loginproviders/active"); } saveLoginProvider(loginProvider) { return this.post("/v1/loginproviders/" + (loginProvider.id || ""), loginProvider); } + + deleteLoginProvider(loginProvider) { + return this.doDelete("/v1/loginproviders/" + loginProvider.id); + } } module.exports = singleton(AuthService); diff --git a/pollen-ui-riot-js/src/main/web/js/FetchService.js b/pollen-ui-riot-js/src/main/web/js/FetchService.js index 8966f29b..ccdbeb42 100644 --- a/pollen-ui-riot-js/src/main/web/js/FetchService.js +++ b/pollen-ui-riot-js/src/main/web/js/FetchService.js @@ -49,7 +49,10 @@ class FetchService { return null; } if (response.status === 200) { - return response.json(); + let responseCopy = response.clone(); + return responseCopy.json().catch(err => { + return response.text(); + }); } if (response.status === 400) { return response.json().then(json => Promise.reject(json)); 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 b2deb15e..5582ba2a 100644 --- a/pollen-ui-riot-js/src/main/web/js/Session.js +++ b/pollen-ui-riot-js/src/main/web/js/Session.js @@ -134,7 +134,7 @@ class Session { } signInProvider(query) { - return authService.signInProvider(query, this.getProviderRedirectionUrl(query.loginProvider)) + return authService.signInProvider(query) .then(auth => this.updateConnection(auth, this)); } diff --git a/pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html b/pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html index c571e63a..f58786ac 100644 --- a/pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/SignIn.tag.html @@ -24,42 +24,45 @@ require("./components/HumanInput.tag.html"); <SignIn> <div class="body-container colors-default sign-in-layer" show={openSignIn}> <div class="body-content"> - <h1 class="c-heading">{__.title}</h1> + <h1 class="c-heading"><i class="fa fa-sign-in"></i> {__.title}</h1> <form class="signin"> <HumanInput onsubmit={signIn}/> <div class="o-form-element"> - <div class="c-input-group c-input-group--stacked"> - <div class="o-field"> - <input class="c-field {c-field--error : message}" - type="email" - id="login" - name="login" - ref="login" - required - placeholder={__.login_placeholder}> - </div> - <div class="o-field o-field--icon-right"> - <input class="c-field {c-field--error : message}" - type="password" - id="password" - name="password" - ref="password" - required - placeholder={__.password_placeholder}> - <button class="c-icon login-btn" - type="submit" - title={__.connexion}> - <i class="fa fa-fw fa-arrow-right"/> - </button> - </div> - </div> + <label class="c-label" for="login">{__.login}</label> + <input class="c-field {c-field--error : message}" + type="email" + id="login" + name="login" + ref="login" + required + placeholder={__.login_placeholder}/> + </div> + <div class="o-form-element"> + <label class="c-label" for="password">{__.password}</label> + <input class="c-field {c-field--error : message}" + type="password" + id="password" + name="password" + ref="password" + required + placeholder={__.password_placeholder}> + </div> + <div class="o-form-element align-right"> + <p><button class="c-button c-button--info" type="submit"><i class="fa fa-sign-in"></i> {__.title}</button></p> <div class="c-hint--static c-hint--error">{message}</div> + <p><a onclick="{newPassword}">{__.lostpassword}</a></p> + </div> + <div class="o-form-element align-center"> + <p>Ou connectez vous avec votre compte :</p> + <p> + <a each="{loginProvider in loginProviders}" class="provider-link" + onclick="{signinWithProvider(loginProvider)}"> + <i class="fa fa-{providerIcons[loginProvider]}" if="{providerIcons[loginProvider]}"></i> + <span if="{!providerIcons[loginProvider]}">{loginProvider}</span> + </a> + </p> </div> - <a onclick="{newPassword}">{__.lostpassword}</a> </form> - <p>Ou connectez vous avec votre compte : - <a each="{loginProvider in loginProviders}" onclick="{signinWithProvider(loginProvider)}">{loginProvider}</a> - </p> </div> <SignUp/> @@ -78,10 +81,25 @@ require("./components/HumanInput.tag.html"); this.message = ""; this.openSignIn = false; + this.providerIcons = { + "amazon": "amazon", + "facebook": "facebook-official", + "flickr": "flickr", + "foursquare": "foursquare", + "github": "github", + "googleplus": "google", + "instagram": "instagram", + "linkedin": "linkedin", + "linkedin2": "linkedin", + "stackexchange": "stack-exchange", + "twitter": "twitter", + "yahoo": "yahoo" + }; + let authService = require("../js/AuthService"); this.loginProviders = []; this.on("mount", () => { - authService.getAvailableLoginProviders().then((result) => { + authService.getActiveLoginProviders().then((result) => { this.loginProviders = result; this.update(); }); @@ -122,8 +140,11 @@ require("./components/HumanInput.tag.html"); this.signinWithProvider = (provider) => (e) => { let currentPage = location.hash || "#"; localStorage.setItem("currentPage", currentPage); - location.href = this.session.configuration.endPoint + "/v1/login/" + provider - + "?providerRedirection=" + encodeURIComponent(this.session.getProviderRedirectionUrl(provider)); + let authService = require("../js/AuthService"); + let redirection = encodeURIComponent(this.session.getProviderRedirectionUrl(provider)); + authService.getLoginProviderUrl(provider, redirection).then(result => { + location.href = result; + }); }; </script> @@ -143,21 +164,10 @@ require("./components/HumanInput.tag.html"); top: 10px; } - .signin { - width: 250px; - margin: 0 auto; - } - .c-heading { text-align: center; } - .login-btn { - border: none; - background: transparent; - font-size: 1em; - } - .body-content { margin-bottom: 20px; } @@ -168,6 +178,39 @@ require("./components/HumanInput.tag.html"); } } + .signin { + padding: 0 1em; + margin: 0 auto; + max-width: 450px; + } + + .o-form-element p { + padding: 2px 0; + } + + .provider-link { + font-size: 2em; + } + + @media (min-width: 640px) { + .o-form-element .c-label:first-child { + width: 35%; + display: inline-block; + text-align: right; + float: left; + padding-top: 0.5em; + padding-right: 5px; + } + + .o-form-element .c-field { + width: 65%; + display: inline-block; + } + + .signin .c-hint--static { + margin-left: 35%; + } + } </style> </SignIn> diff --git a/pollen-ui-riot-js/src/main/web/tag/SignUp.tag.html b/pollen-ui-riot-js/src/main/web/tag/SignUp.tag.html index eee9115a..1d830d41 100644 --- a/pollen-ui-riot-js/src/main/web/tag/SignUp.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/SignUp.tag.html @@ -95,8 +95,8 @@ require("./components/HumanInput.tag.html"); <div class="actions-right"> <button type="submit" class="c-button c-button--info"> - <i class="fa fa-plus" aria-hidden="true"></i> - {__.validate} + <i class="fa fa-user-plus" aria-hidden="true"></i> + {__.title} </button> </div> </form> diff --git a/pollen-ui-riot-js/src/main/web/tag/admin/LoginProviders.tag.html b/pollen-ui-riot-js/src/main/web/tag/admin/LoginProviders.tag.html index 5e23f89e..49e06b1c 100644 --- a/pollen-ui-riot-js/src/main/web/tag/admin/LoginProviders.tag.html +++ b/pollen-ui-riot-js/src/main/web/tag/admin/LoginProviders.tag.html @@ -1,3 +1,5 @@ +require("../components/HumanInput.tag.html"); + <LoginProviders> <div class="container" show="{loaded}"> <h1>{__.title}</h1> @@ -7,29 +9,38 @@ <table> <thead> <tr> - <th>{__.name}</th> - <th>{__.key}</th> - <th>{__.secret}</th> - <th>{__.permission}</th> + <th>{__.name}*</th> + <th>{__.key}*</th> + <th>{__.secret}*</th> + <th>{__.permissions}</th> <th>{__.active}</th> </tr> </thead> <tbody> <tr each="{loginprovider, index in loginProviders}"> - <td><input type="text" ref="name{index}" value="{loginprovider.name}" required/></td> - <td><input type="text" ref="key{index}" value="{loginprovider.key}" required/></td> - <td><input type="text" ref="secret{index}" value="{loginprovider.secret}" required/></td> - <td><input type="text" ref="permissions{index}" value="{loginprovider.permissions}"/></td> - <td><input type="checkbox" ref="active{index}" checked="{loginprovider.active}"/></td> <td> - <button class="c-button" onclick="{saveLoginProvider(index)}"><i class="fa fa-check"></i></button> - <button class="c-button" onclick="{cancelEdition(index)}"><i class="fa fa-remove"></i></button> + <select class="c-field" ref="name{index}" required disabled="{editingRow != index}"> + <option>{loginprovider.name}</option> + <option each="{availableProvider in availableLoginProviders}">{availableProvider}</option> + </select> + </td> + <td><input class="c-field" type="text" ref="key{index}" value="{loginprovider.key}" required disabled="{editingRow != index}"/></td> + <td><input class="c-field c-field--large" type="text" ref="secret{index}" value="{loginprovider.secret}" required disabled="{editingRow != index}"/></td> + <td><input class="c-field" type="text" ref="permissions{index}" value="{loginprovider.permissions}" disabled="{editingRow != index}"/></td> + <td><input type="checkbox" ref="active{index}" checked="{loginprovider.active}" disabled="{editingRow != index}"/></td> + <td if="{editingRow != index}"> + <button class="c-button c-button--info" onclick="{editLoginProvider(index)}" disabled="{editingRow != null}"><i class="fa fa-edit"></i></button> + <button class="c-button c-button--error" onclick="{deleteLoginProvider(index)}" disabled="{editingRow != null}"><i class="fa fa-trash"></i></button> + </td> + <td if="{editingRow == index}"> + <button class="c-button c-button--success" onclick="{saveLoginProvider(index)}"><i class="fa fa-check"></i></button> + <button class="c-button c-button--error" onclick="{cancelEdition(index)}"><i class="fa fa-remove"></i></button> </td> </tr> </tbody> </table> - <button class="c-button" onclick="{addProvider}"><i class="fa fa-plus"></i></button> + <button class="c-button" onclick="{addProvider}" disabled="{editingRow != null}"><i class="fa fa-plus"></i> {__.newProvider}</button> </div> </div> @@ -38,27 +49,77 @@ let session = require("../../js/Session"); this.installBundle(session, "loginProviders"); + this.editingRow = null; + let authService = require("../../js/AuthService"); this.loginProviders = []; - authService.getAllLoginProviders().then((result) => { + this.availableLoginProviders = []; + Promise.all([authService.getAllLoginProviders(), authService.getAvailableLoginProviders()]).then(results => { if (!this.loaded) { - this.loginProviders = result; + this.loginProviders = results[0]; + let usedLoginProviders = Array.from(this.loginProviders, item => item.name); + this.availableLoginProviders = results[1].filter(item => usedLoginProviders.indexOf(item) === -1); + this.availableLoginProviders.sort(); this.loaded = true; this.update(); } - return result; }); this.addProvider = (e) => { e.preventDefault(); e.stopPropagation(); this.loginProviders.push({}); + this.editingRow = this.loginProviders.length - 1; + }; + + this.editLoginProvider = (index) => (e) => { + e.preventDefault(); + e.stopPropagation(); + this.editingRow = index; + }; + + this.deleteLoginProvider = (index) => (e) => { + e.preventDefault(); + e.stopPropagation(); + let loginProvider = this.loginProviders[index]; + this.confirm(this.__.deleteMessage).then((confirm) => { + if (confirm) { + if (!loginProvider.id) { + this.loginProviders.splice(index, 1); + this.availableLoginProviders.push(loginProvider.name); + this.availableLoginProviders.sort(); + this.update(); + } else { + authService.deleteLoginProvider(loginProvider).then(() => { + this.loginProviders.splice(index, 1); + this.availableLoginProviders.push(loginProvider.name); + this.availableLoginProviders.sort(); + this.update(); + }); + } + } + }); }; this.saveLoginProvider = (index) => (e) => { e.preventDefault(); e.stopPropagation(); let loginProvider = this.loginProviders[index]; + let oldProvider = loginProvider.name; + + if (!this.refs["name" + index].value) { + alert(this.__.emptyName); + return; + } + if (!this.refs["key" + index].value) { + alert(this.__.emptyKey); + return; + } + if (!this.refs["secret" + index].value) { + alert(this.__.emptySecret); + return; + } + loginProvider.name = this.refs["name" + index].value; loginProvider.key = this.refs["key" + index].value; loginProvider.secret = this.refs["secret" + index].value; @@ -72,6 +133,15 @@ loginProvider.secret = result.secret; loginProvider.permissions = result.permissions; loginProvider.active = result.active; + + this.availableLoginProviders.splice(this.availableLoginProviders.indexOf(result.name), 1); + this.availableLoginProviders.push(oldProvider); + this.availableLoginProviders.sort(); + + this.refs["name" + index].value = loginProvider.name; + + this.editingRow = null; + this.update(); }); }; @@ -84,9 +154,13 @@ this.refs["secret" + index].value = loginProvider.secret || ""; this.refs["permissions" + index].value = loginProvider.permissions || ""; this.refs["active" + index].checked = loginProvider.active || false; + this.editingRow = null; }; </script> <style> + td { + text-align: center; + } </style> </LoginProviders> -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.
participants (1)
-
chorem.org scm