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