From fbe8c5cdec430349f7db6d6faa01319682e79556 Mon Sep 17 00:00:00 2001 From: Stian Thorgersen Date: Wed, 11 Dec 2013 13:44:47 +0000 Subject: [PATCH] Added SocialLoader to social core --- .../org/keycloak/services/FormService.java | 6 ++-- .../services/resources/SocialResource.java | 34 +++++-------------- .../org/keycloak/social/SocialLoader.java | 31 +++++++++++++++++ 3 files changed, 41 insertions(+), 30 deletions(-) create mode 100644 social/core/src/main/java/org/keycloak/social/SocialLoader.java diff --git a/services/src/main/java/org/keycloak/services/FormService.java b/services/src/main/java/org/keycloak/services/FormService.java index 83aac731b2..f525bbd6f4 100755 --- a/services/src/main/java/org/keycloak/services/FormService.java +++ b/services/src/main/java/org/keycloak/services/FormService.java @@ -25,15 +25,14 @@ import org.keycloak.models.RealmModel; import org.keycloak.models.RoleModel; import org.keycloak.models.UserModel; import org.keycloak.services.resources.flows.FormFlows; +import org.keycloak.social.SocialLoader; import org.keycloak.social.SocialProvider; import javax.ws.rs.core.MultivaluedMap; import java.net.URI; -import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.ServiceLoader; /** * @author Viliam Rockai @@ -98,8 +97,7 @@ public interface FormService { socialProviders = new LinkedList(); Map socialConfig = realm.getSocialConfig(); if (socialConfig != null) { - for (Iterator itr = ServiceLoader.load(org.keycloak.social.SocialProvider.class).iterator(); itr.hasNext(); ) { - SocialProvider p = itr.next(); + for (SocialProvider p : SocialLoader.load()) { if (socialConfig.containsKey(p.getId() + ".key") && socialConfig.containsKey(p.getId() + ".secret")) { socialProviders.add(p); } diff --git a/services/src/main/java/org/keycloak/services/resources/SocialResource.java b/services/src/main/java/org/keycloak/services/resources/SocialResource.java index 54dac0d713..83fa595ea9 100755 --- a/services/src/main/java/org/keycloak/services/resources/SocialResource.java +++ b/services/src/main/java/org/keycloak/services/resources/SocialResource.java @@ -39,6 +39,7 @@ import org.keycloak.social.AuthCallback; import org.keycloak.social.AuthRequest; import org.keycloak.social.RequestDetails; import org.keycloak.social.SocialConstants; +import org.keycloak.social.SocialLoader; import org.keycloak.social.SocialProvider; import org.keycloak.social.SocialProviderConfig; import org.keycloak.social.SocialProviderException; @@ -63,11 +64,9 @@ import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.UriInfo; import java.net.URISyntaxException; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.ServiceLoader; import java.util.UUID; /** @@ -114,7 +113,7 @@ public class SocialResource { Map queryParams = getQueryParams(); RequestDetails requestData = getRequestDetails(queryParams); - SocialProvider provider = getProvider(requestData.getProviderId()); + SocialProvider provider = SocialLoader.load(requestData.getProviderId()); String realmId = requestData.getClientAttribute("realmId"); @@ -179,7 +178,7 @@ public class SocialResource { } realm.addSocialLink(user, socialLink); - } else { + } else { // Redirect user to registration screen with prefilled data from social provider MultivaluedMap formData = fillRegistrationFormWithSocialData(socialUser); @@ -212,13 +211,13 @@ public class SocialResource { @GET @Path("{realm}/login") public Response redirectToProviderAuth(@PathParam("realm") final String realmId, - @QueryParam("provider_id") final String providerId, @QueryParam("client_id") final String clientId, - @QueryParam("scope") final String scope, @QueryParam("state") final String state, - @QueryParam("redirect_uri") final String redirectUri) { + @QueryParam("provider_id") final String providerId, @QueryParam("client_id") final String clientId, + @QueryParam("scope") final String scope, @QueryParam("state") final String state, + @QueryParam("redirect_uri") final String redirectUri) { RealmManager realmManager = new RealmManager(session); RealmModel realm = realmManager.getRealm(realmId); - SocialProvider provider = getProvider(providerId); + SocialProvider provider = SocialLoader.load(providerId); if (provider == null) { return Flows.forms(realm, request, uriInfo).setError("Social provider not found").forwardToErrorPage(); } @@ -305,11 +304,7 @@ public class SocialResource { } private RequestDetails getRequestDetails(Map queryParams) { - Iterator itr = ServiceLoader.load(SocialProvider.class).iterator(); - - while (itr.hasNext()) { - SocialProvider provider = itr.next(); - + for (SocialProvider provider : SocialLoader.load()) { if (queryParams.containsKey(provider.getRequestIdParamName())) { String requestId = queryParams.get(provider.getRequestIdParamName())[0]; if (socialRequestManager.isRequestId(requestId)) { @@ -321,19 +316,6 @@ public class SocialResource { return null; } - private SocialProvider getProvider(String providerId) { - Iterator itr = ServiceLoader.load(SocialProvider.class).iterator(); - - while (itr.hasNext()) { - SocialProvider provider = itr.next(); - if (provider.getId().equals(providerId)) { - return provider; - } - } - - return null; - } - private Map getQueryParams() { Map queryParams = new HashMap(); for (Entry> e : uriInfo.getQueryParameters().entrySet()) { diff --git a/social/core/src/main/java/org/keycloak/social/SocialLoader.java b/social/core/src/main/java/org/keycloak/social/SocialLoader.java new file mode 100644 index 0000000000..5dfb44a7e4 --- /dev/null +++ b/social/core/src/main/java/org/keycloak/social/SocialLoader.java @@ -0,0 +1,31 @@ +package org.keycloak.social; + +import java.util.ServiceLoader; + +/** + * @author Stian Thorgersen + */ +public class SocialLoader { + + private SocialLoader() { + } + + public static SocialProvider load(String id) { + if (id == null) { + throw new NullPointerException(); + } + + for (SocialProvider s : load()) { + if (id.equals(s.getId())) { + return s; + } + } + + return null; + } + + public static Iterable load() { + return ServiceLoader.load(SocialProvider.class); + } + +}