From 89e6f0786d7b9afb363a85a77c2855ce1a713d48 Mon Sep 17 00:00:00 2001 From: harshanl Date: Thu, 10 Dec 2015 16:50:33 +0530 Subject: [PATCH] Refactored dynamic-client module to use remote services. --- .../client/web/ConfigurationService.java | 33 ---- .../web/impl/RegistrationServiceImpl.java | 2 +- .../pom.xml | 1 + .../registration/OAuthApplicationInfo.java | 9 +- .../DynamicClientRegistrationServiceImpl.java | 19 +- ...micClientRegistrationServiceComponent.java | 5 +- .../DCRConstants.java} | 8 +- .../DynamicClientRegistrationUtil.java | 8 +- .../pom.xml | 8 + ...ynamicClientWebAppRegistrationManager.java | 9 +- .../DynamicClientRegistrationSettings.java} | 30 ++- ...amicClientWebAppRegistrationConstants.java | 21 +- .../DynamicClientWebAppRegistrationUtil.java | 64 ++++++ .../registration/util/RemoteDCRClient.java | 182 ++++++++++++++++++ pom.xml | 8 +- 15 files changed, 332 insertions(+), 75 deletions(-) delete mode 100644 components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/ConfigurationService.java rename components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/{ApplicationConstants.java => util/DCRConstants.java} (95%) rename components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/{ => util}/DynamicClientRegistrationUtil.java (91%) rename components/identity-extensions/dynamic-client-registration/{dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/impl/ConfigurationServiceImpl.java => org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/dto/DynamicClientRegistrationSettings.java} (56%) create mode 100644 components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/RemoteDCRClient.java diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/ConfigurationService.java b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/ConfigurationService.java deleted file mode 100644 index 0d97308f541..00000000000 --- a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/ConfigurationService.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * you may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.wso2.carbon.dynamic.client.web; - -import javax.ws.rs.*; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -@Produces(MediaType.APPLICATION_JSON) -@Consumes(MediaType.APPLICATION_JSON) -@Path("/connect") -public interface ConfigurationService { - - @GET - @Path("/register") - Response getProfile(@PathParam("client_id") String clientId); - -} diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/impl/RegistrationServiceImpl.java b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/impl/RegistrationServiceImpl.java index 5d8e7bc5fb1..028b6df1f63 100644 --- a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/impl/RegistrationServiceImpl.java +++ b/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/impl/RegistrationServiceImpl.java @@ -89,7 +89,7 @@ public class RegistrationServiceImpl implements RegistrationService { boolean status = dynamicClientRegistrationService.unregisterOAuthApplication(userId, applicationName, consumerKey); if (status) { - return Response.status(Response.Status.ACCEPTED).build(); + return Response.status(Response.Status.OK).build(); } return Response.status(Response.Status.BAD_REQUEST).build(); } diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/pom.xml b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/pom.xml index 9b44329b6b3..4d01bd86978 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/pom.xml +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/pom.xml @@ -66,6 +66,7 @@ org.wso2.carbon.identity.application.common, org.wso2.carbon.identity.application.common.model, org.wso2.carbon.identity.application.mgt, + org.wso2.carbon.identity.application.mgt.stub, org.wso2.carbon.identity.base, org.wso2.carbon.identity.oauth, org.wso2.carbon.identity.oauth.dto, diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/OAuthApplicationInfo.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/OAuthApplicationInfo.java index 547844869ab..5fdb049aaf6 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/OAuthApplicationInfo.java +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/OAuthApplicationInfo.java @@ -18,6 +18,7 @@ package org.wso2.carbon.dynamic.client.registration; import org.json.simple.JSONObject; +import org.wso2.carbon.dynamic.client.registration.util.DCRConstants; import java.util.HashMap; import java.util.Map; @@ -87,10 +88,10 @@ public class OAuthApplicationInfo { public String toString() { JSONObject obj = new JSONObject(); - obj.put(ApplicationConstants.ClientMetadata.OAUTH_CLIENT_ID, this.getClientId()); - obj.put(ApplicationConstants.ClientMetadata.OAUTH_CLIENT_NAME, this.getClientName()); - obj.put(ApplicationConstants.ClientMetadata.OAUTH_CALLBACK_URIS, this.getCallBackURL()); - obj.put(ApplicationConstants.ClientMetadata.OAUTH_CLIENT_SECRET, this.getClientSecret()); + obj.put(DCRConstants.ClientMetadata.OAUTH_CLIENT_ID, this.getClientId()); + obj.put(DCRConstants.ClientMetadata.OAUTH_CLIENT_NAME, this.getClientName()); + obj.put(DCRConstants.ClientMetadata.OAUTH_CALLBACK_URIS, this.getCallBackURL()); + obj.put(DCRConstants.ClientMetadata.OAUTH_CLIENT_SECRET, this.getClientSecret()); return obj.toString(); } diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/impl/DynamicClientRegistrationServiceImpl.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/impl/DynamicClientRegistrationServiceImpl.java index a5640b97eae..7938ba355ac 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/impl/DynamicClientRegistrationServiceImpl.java +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/impl/DynamicClientRegistrationServiceImpl.java @@ -27,6 +27,8 @@ import org.wso2.carbon.context.RegistryType; import org.wso2.carbon.dynamic.client.registration.*; import org.wso2.carbon.dynamic.client.registration.internal.DynamicClientRegistrationDataHolder; import org.wso2.carbon.dynamic.client.registration.profile.RegistrationProfile; +import org.wso2.carbon.dynamic.client.registration.util.DCRConstants; +import org.wso2.carbon.dynamic.client.registration.util.DynamicClientRegistrationUtil; import org.wso2.carbon.identity.application.common.IdentityApplicationManagementException; import org.wso2.carbon.identity.application.common.model.*; import org.wso2.carbon.identity.application.mgt.ApplicationManagementService; @@ -94,15 +96,15 @@ public class DynamicClientRegistrationServiceImpl implements DynamicClientRegist try { JSONObject jsonObject = new JSONObject(info.getJsonString()); - if (jsonObject.has(ApplicationConstants.ClientMetadata.OAUTH_REDIRECT_URIS)) { - oAuthApplicationInfo.addParameter(ApplicationConstants.ClientMetadata.OAUTH_REDIRECT_URIS, + if (jsonObject.has(DCRConstants.ClientMetadata.OAUTH_REDIRECT_URIS)) { + oAuthApplicationInfo.addParameter(DCRConstants.ClientMetadata.OAUTH_REDIRECT_URIS, jsonObject - .get(ApplicationConstants.ClientMetadata.OAUTH_REDIRECT_URIS)); + .get(DCRConstants.ClientMetadata.OAUTH_REDIRECT_URIS)); } - if (jsonObject.has(ApplicationConstants.ClientMetadata.OAUTH_CLIENT_GRANT)) { - oAuthApplicationInfo.addParameter(ApplicationConstants.ClientMetadata.OAUTH_CLIENT_GRANT, jsonObject - .get(ApplicationConstants.ClientMetadata.OAUTH_CLIENT_GRANT)); + if (jsonObject.has(DCRConstants.ClientMetadata.OAUTH_CLIENT_GRANT)) { + oAuthApplicationInfo.addParameter(DCRConstants.ClientMetadata.OAUTH_CLIENT_GRANT, jsonObject + .get(DCRConstants.ClientMetadata.OAUTH_CLIENT_GRANT)); } } catch (JSONException e) { throw new DynamicClientRegistrationException( @@ -160,7 +162,6 @@ public class DynamicClientRegistrationServiceImpl implements DynamicClientRegist } ServiceProvider existingServiceProvider = appMgtService.getServiceProvider(applicationName, tenantDomain); - if (existingServiceProvider == null) { appMgtService.createApplication(serviceProvider, tenantDomain, userName); } @@ -267,9 +268,9 @@ public class DynamicClientRegistrationServiceImpl implements DynamicClientRegist oAuthApplicationInfo.setClientName(createdApp.getApplicationName()); oAuthApplicationInfo.addParameter( - ApplicationConstants.ClientMetadata.OAUTH_REDIRECT_URIS, createdApp.getCallbackUrl()); + DCRConstants.ClientMetadata.OAUTH_REDIRECT_URIS, createdApp.getCallbackUrl()); oAuthApplicationInfo.addParameter( - ApplicationConstants.ClientMetadata.OAUTH_CLIENT_GRANT, createdApp.getGrantTypes()); + DCRConstants.ClientMetadata.OAUTH_CLIENT_GRANT, createdApp.getGrantTypes()); return oAuthApplicationInfo; } catch (IdentityApplicationManagementException e) { diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/internal/DynamicClientRegistrationServiceComponent.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/internal/DynamicClientRegistrationServiceComponent.java index 6717742ac39..4a1ee1a6413 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/internal/DynamicClientRegistrationServiceComponent.java +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/internal/DynamicClientRegistrationServiceComponent.java @@ -20,7 +20,6 @@ package org.wso2.carbon.dynamic.client.registration.internal; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.osgi.framework.ServiceRegistration; import org.osgi.service.component.ComponentContext; import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationService; import org.wso2.carbon.dynamic.client.registration.impl.DynamicClientRegistrationServiceImpl; @@ -44,10 +43,8 @@ public class DynamicClientRegistrationServiceComponent { if(log.isDebugEnabled()){ log.debug("Starting DynamicClientRegistrationServiceComponent"); } - DynamicClientRegistrationService dynamicClientRegistrationService = - new DynamicClientRegistrationServiceImpl(); componentContext.getBundleContext().registerService( - DynamicClientRegistrationService.class.getName(), dynamicClientRegistrationService, null); + DynamicClientRegistrationService.class.getName(), new DynamicClientRegistrationServiceImpl(), null); } @SuppressWarnings("unused") diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/ApplicationConstants.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/util/DCRConstants.java similarity index 95% rename from components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/ApplicationConstants.java rename to components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/util/DCRConstants.java index d9f26334c33..12c59e2de18 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/ApplicationConstants.java +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/util/DCRConstants.java @@ -15,18 +15,18 @@ * specific language governing permissions and limitations * under the License. */ -package org.wso2.carbon.dynamic.client.registration; +package org.wso2.carbon.dynamic.client.registration.util; /** * This class holds the constants used by DynamicClientRegistration component. */ -public final class ApplicationConstants { +public final class DCRConstants { public static class ClientMetadata { private ClientMetadata() { throw new AssertionError(); } - //todo refactor names + public static final String OAUTH_CLIENT_ID = "client_id"; //this means consumer key public static final String OAUTH_CLIENT_SECRET = "client_secret"; public static final String OAUTH_REDIRECT_URIS = "redirect_uris"; @@ -55,4 +55,4 @@ public final class ApplicationConstants { public static final String VALIDITY_PERIOD = "validityPeriod"; } -} +} \ No newline at end of file diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/DynamicClientRegistrationUtil.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/util/DynamicClientRegistrationUtil.java similarity index 91% rename from components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/DynamicClientRegistrationUtil.java rename to components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/util/DynamicClientRegistrationUtil.java index dd835dad97c..b4e53c797b3 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/DynamicClientRegistrationUtil.java +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.registration/src/main/java/org/wso2/carbon/dynamic/client/registration/util/DynamicClientRegistrationUtil.java @@ -15,8 +15,11 @@ * specific language governing permissions and limitations * under the License. */ -package org.wso2.carbon.dynamic.client.registration; +package org.wso2.carbon.dynamic.client.registration.util; +/** + * This class holds the util methods used by DCR component. + */ public class DynamicClientRegistrationUtil { public static void validateUsername(String username) { @@ -36,5 +39,4 @@ public class DynamicClientRegistrationUtil { throw new IllegalArgumentException("Consumer Key cannot be null or empty"); } } - -} +} \ No newline at end of file diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/pom.xml b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/pom.xml index 438dbcefd98..4b3e1f5aea7 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/pom.xml +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/pom.xml @@ -115,5 +115,13 @@ org.wso2.carbon.devicemgt org.wso2.carbon.dynamic.client.registration + + org.apache.httpcomponents + httpclient + + + com.google.code.gson + gson + \ No newline at end of file diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/DynamicClientWebAppRegistrationManager.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/DynamicClientWebAppRegistrationManager.java index 3d9e0083cd7..ef8f643c889 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/DynamicClientWebAppRegistrationManager.java +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/DynamicClientWebAppRegistrationManager.java @@ -52,8 +52,7 @@ public class DynamicClientWebAppRegistrationManager { if (dynamicClientWebAppRegistrationManager == null) { synchronized (DynamicClientWebAppRegistrationManager.class) { if (dynamicClientWebAppRegistrationManager == null) { - dynamicClientWebAppRegistrationManager = - new DynamicClientWebAppRegistrationManager(); + dynamicClientWebAppRegistrationManager = new DynamicClientWebAppRegistrationManager(); } } } @@ -65,11 +64,9 @@ public class DynamicClientWebAppRegistrationManager { log.debug("Registering OAuth application for web app : " + registrationProfile.getClientName()); } if (DynamicClientWebAppRegistrationUtil.validateRegistrationProfile(registrationProfile)) { - DynamicClientRegistrationService dynamicClientRegistrationService = - DynamicClientWebAppRegistrationDataHolder.getInstance().getDynamicClientRegistrationService(); try { OAuthApplicationInfo oAuthApplicationInfo = - dynamicClientRegistrationService.registerOAuthApplication(registrationProfile); + DynamicClientWebAppRegistrationUtil.registerOAuthApplication(registrationProfile); OAuthAppDetails oAuthAppDetails = new OAuthAppDetails(); oAuthAppDetails.setWebAppName(registrationProfile.getClientName()); oAuthAppDetails.setClientName(oAuthApplicationInfo.getClientName()); @@ -79,7 +76,7 @@ public class DynamicClientWebAppRegistrationManager { if (DynamicClientWebAppRegistrationUtil.putOAuthApplicationData(oAuthAppDetails)) { return oAuthAppDetails; } else { - dynamicClientRegistrationService.unregisterOAuthApplication(registrationProfile.getOwner(), + DynamicClientWebAppRegistrationUtil.unregisterOAuthApplication(registrationProfile.getOwner(), oAuthApplicationInfo.getClientName(), oAuthApplicationInfo.getClientId()); log.warn("Error occurred while persisting the OAuth application data in registry."); diff --git a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/impl/ConfigurationServiceImpl.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/dto/DynamicClientRegistrationSettings.java similarity index 56% rename from components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/impl/ConfigurationServiceImpl.java rename to components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/dto/DynamicClientRegistrationSettings.java index 7fcf7fa0753..6bbe47eb5a2 100644 --- a/components/identity-extensions/dynamic-client-registration/dynamic-client-web/src/main/java/org/wso2/carbon/dynamic/client/web/impl/ConfigurationServiceImpl.java +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/dto/DynamicClientRegistrationSettings.java @@ -15,18 +15,30 @@ * specific language governing permissions and limitations * under the License. */ -package org.wso2.carbon.dynamic.client.web.impl; -import org.wso2.carbon.dynamic.client.web.ConfigurationService; +package org.wso2.carbon.dynamic.client.web.app.registration.dto; -import javax.ws.rs.PathParam; -import javax.ws.rs.core.Response; +/** + * Represents Configuration setting related to OAuth in authenticators.xml. + */ +public class DynamicClientRegistrationSettings { + + private boolean isRemote; + private String host; + + public boolean isRemote() { + return isRemote; + } -public class ConfigurationServiceImpl implements ConfigurationService { + public void setIsRemote(boolean isRemote) { + this.isRemote = isRemote; + } - @Override - public Response getProfile(@PathParam("client_id") String clientId) { - return null; + public String getHost() { + return host; } -} \ No newline at end of file + public void setHost(String host) { + this.host = host; + } +} diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationConstants.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationConstants.java index 778063b7228..12697ceb316 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationConstants.java +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationConstants.java @@ -46,4 +46,23 @@ public class DynamicClientWebAppRegistrationConstants { public static final String CHARSET_UTF8 = "UTF8"; } -} + + public static class ConfigurationProperties { + private ConfigurationProperties() { + throw new AssertionError(); + } + + public static final String AUTHENTICATOR_NAME = "OAuthAuthenticator"; + public static final String AUTHENTICATOR_CONFIG_IS_REMOTE = "isRemote"; + public static final String AUTHENTICATOR_CONFIG_HOST_URL = "hostURL"; + } + + public static class RemoteServiceProperties { + private RemoteServiceProperties() { + throw new AssertionError(); + } + + public static final String DYNAMIC_CLIENT_SERVICE_ENDPOINT = "/dynamic-client-web/register"; + public static final String DYNAMIC_CLIENT_SERVICE_PROTOCOL = "https"; + } +} \ No newline at end of file diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationUtil.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationUtil.java index 03550d9896c..23729976558 100644 --- a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationUtil.java +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/DynamicClientWebAppRegistrationUtil.java @@ -22,8 +22,11 @@ import com.google.gson.stream.JsonReader; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.wso2.carbon.context.PrivilegedCarbonContext; +import org.wso2.carbon.core.security.AuthenticatorsConfiguration; import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationException; +import org.wso2.carbon.dynamic.client.registration.OAuthApplicationInfo; import org.wso2.carbon.dynamic.client.registration.profile.RegistrationProfile; +import org.wso2.carbon.dynamic.client.web.app.registration.dto.DynamicClientRegistrationSettings; import org.wso2.carbon.dynamic.client.web.app.registration.dto.OAuthAppDetails; import org.wso2.carbon.dynamic.client.web.app.registration.dto.JaggeryOAuthConfigurationSettings; import org.wso2.carbon.dynamic.client.web.app.registration.internal.DynamicClientWebAppRegistrationDataHolder; @@ -315,4 +318,65 @@ public class DynamicClientWebAppRegistrationUtil { public static String replaceInvalidChars(String username) { return username.replaceAll("@","_AT_"); } + + private static DynamicClientRegistrationSettings getDynamicClientRegistrationSettings() + throws IllegalArgumentException { + AuthenticatorsConfiguration authenticatorsConfiguration = AuthenticatorsConfiguration.getInstance(); + AuthenticatorsConfiguration.AuthenticatorConfig authenticatorConfig = authenticatorsConfiguration. + getAuthenticatorConfig(DynamicClientWebAppRegistrationConstants. + ConfigurationProperties.AUTHENTICATOR_NAME); + DynamicClientRegistrationSettings dynamicClientRegistrationSettings = new DynamicClientRegistrationSettings(); + if (authenticatorConfig != null && authenticatorConfig.getParameters() != null) { + dynamicClientRegistrationSettings.setIsRemote(Boolean.parseBoolean( + authenticatorConfig.getParameters().get( + DynamicClientWebAppRegistrationConstants.ConfigurationProperties. + AUTHENTICATOR_CONFIG_IS_REMOTE))); + dynamicClientRegistrationSettings.setHost(authenticatorConfig.getParameters(). + get(DynamicClientWebAppRegistrationConstants.ConfigurationProperties.AUTHENTICATOR_CONFIG_HOST_URL)); + + }else{ + throw new IllegalArgumentException("Configuration parameters need to be defined in Authenticators.xml."); + } + return dynamicClientRegistrationSettings; + } + + //This method will choose the best DynamicClientRegistrationService based on server configurations and + //registers OAuth client. + public static OAuthApplicationInfo registerOAuthApplication(RegistrationProfile registrationProfile) + throws DynamicClientRegistrationException { + DynamicClientRegistrationSettings dynamicClientRegistrationSettings = getDynamicClientRegistrationSettings(); + if (dynamicClientRegistrationSettings.isRemote()) { + return RemoteDCRClient.createOAuthApplication(registrationProfile, + getHostName(dynamicClientRegistrationSettings.getHost())); + } else { + return DynamicClientWebAppRegistrationDataHolder.getInstance(). + getDynamicClientRegistrationService().registerOAuthApplication(registrationProfile); + } + } + + //This method will choose the best DynamicClientRegistrationService based on server configurations and + //unregisters OAuth client. + public static boolean unregisterOAuthApplication(String owner, String clientName, String clientId) + throws DynamicClientRegistrationException { + DynamicClientRegistrationSettings dynamicClientRegistrationSettings = getDynamicClientRegistrationSettings(); + if (dynamicClientRegistrationSettings.isRemote()) { + return RemoteDCRClient.deleteOAuthApplication(owner, clientName, clientId, + getHostName(dynamicClientRegistrationSettings.getHost())); + } else { + return DynamicClientWebAppRegistrationDataHolder.getInstance(). + getDynamicClientRegistrationService().unregisterOAuthApplication(owner, clientName, clientId); + } + } + + private static String getHostName(String host) { + if (host != null && !host.isEmpty()) { + if (host.contains("https://")) { + return host.replace("https://",""); + } + } else { + throw new IllegalArgumentException("Remote Host parameter must defined in Authenticators.xml."); + } + return null; + } + } \ No newline at end of file diff --git a/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/RemoteDCRClient.java b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/RemoteDCRClient.java new file mode 100644 index 00000000000..120b2f056fb --- /dev/null +++ b/components/identity-extensions/dynamic-client-registration/org.wso2.carbon.dynamic.client.web.app.registration/src/main/java/org/wso2/carbon/dynamic/client/web/app/registration/util/RemoteDCRClient.java @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. + * + * WSO2 Inc. licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. + * you may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.wso2.carbon.dynamic.client.web.app.registration.util; + +import com.google.gson.Gson; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; +import org.apache.http.conn.ssl.SSLSocketFactory; +import org.apache.http.conn.ssl.X509HostnameVerifier; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.SingleClientConnManager; +import org.apache.http.util.EntityUtils; +import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationException; +import org.wso2.carbon.dynamic.client.registration.OAuthApplicationInfo; +import org.wso2.carbon.dynamic.client.registration.profile.RegistrationProfile; +import org.wso2.carbon.dynamic.client.web.app.registration.internal.DynamicClientWebAppRegistrationDataHolder; +import org.wso2.carbon.utils.CarbonUtils; +import org.wso2.carbon.utils.ConfigurationContextService; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URISyntaxException; + +/** + * This class holds the necessary logic to create and delete service-providers by invoking the + * dynamic-client-registration endpoint. + */ +public class RemoteDCRClient { + + private static final String CONTENT_TYPE_APPLICATION_JSON = "application/json"; + private static final String CHARSET_UTF_8 = "UTF-8"; + + public static OAuthApplicationInfo createOAuthApplication(RegistrationProfile registrationProfile, String host) + throws DynamicClientRegistrationException { + DefaultHttpClient httpClient = new DefaultHttpClient(); + String clientName = registrationProfile.getClientName(); + try { + // Setup the HTTPS settings to accept any certificate. + HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; + + SchemeRegistry registry = new SchemeRegistry(); + SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); + socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); + registry.register(new Scheme(DynamicClientWebAppRegistrationConstants.RemoteServiceProperties. + DYNAMIC_CLIENT_SERVICE_PROTOCOL, socketFactory, getServerHTTPSPort())); + SingleClientConnManager mgr = new SingleClientConnManager(httpClient.getParams(), registry); + httpClient = new DefaultHttpClient(mgr, httpClient.getParams()); + + // Set verifier + HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); + + URI uri = new URIBuilder().setScheme(DynamicClientWebAppRegistrationConstants.RemoteServiceProperties. + DYNAMIC_CLIENT_SERVICE_PROTOCOL).setHost(host).setPath( + DynamicClientWebAppRegistrationConstants.RemoteServiceProperties.DYNAMIC_CLIENT_SERVICE_ENDPOINT).build(); + Gson gson = new Gson(); + StringEntity entity = new StringEntity(gson.toJson(registrationProfile), CONTENT_TYPE_APPLICATION_JSON, + CHARSET_UTF_8); + HttpPost httpPost = new HttpPost(uri); + httpPost.setEntity(entity); + HttpResponse response = httpClient.execute(httpPost); + int status = response.getStatusLine().getStatusCode(); + HttpEntity responseData = response.getEntity(); + String responseString = EntityUtils.toString(responseData, CHARSET_UTF_8); + if (status != 201) { + throw new DynamicClientRegistrationException("Backend server error occurred while invoking DCR endpoint for " + + "registering service-provider for web-app : " + clientName); + } + return getOAuthApplicationInfo(gson.fromJson(responseString, JsonElement.class)); + } catch (URISyntaxException e) { + throw new DynamicClientRegistrationException("Exception occurred while constructing the URI for invoking " + + "DCR endpoint for registering service-provider for web-app : " + + clientName, e); + } catch (UnsupportedEncodingException e) { + throw new DynamicClientRegistrationException("Exception occurred while constructing the payload for invoking " + + "DCR endpoint for registering service-provider for web-app : " + + clientName, e); + } catch (IOException e) { + throw new DynamicClientRegistrationException("Connection error occurred while invoking DCR endpoint for" + + " registering service-provider for web-app : " + clientName, e); + } + } + + public static boolean deleteOAuthApplication(String user, String appName, String clientid, String host) + throws DynamicClientRegistrationException { + DefaultHttpClient httpClient = new DefaultHttpClient(); + try { + // Setup the HTTPS settings to accept any certificate. + HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER; + + SchemeRegistry registry = new SchemeRegistry(); + SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory(); + socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier); + registry.register(new Scheme(DynamicClientWebAppRegistrationConstants.RemoteServiceProperties. + DYNAMIC_CLIENT_SERVICE_PROTOCOL, socketFactory, getServerHTTPSPort())); + SingleClientConnManager mgr = new SingleClientConnManager(httpClient.getParams(), registry); + httpClient = new DefaultHttpClient(mgr, httpClient.getParams()); + + // Set verifier + HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier); + + URI uri = new URIBuilder().setScheme(DynamicClientWebAppRegistrationConstants.RemoteServiceProperties. + DYNAMIC_CLIENT_SERVICE_PROTOCOL).setHost(host).setPath( + DynamicClientWebAppRegistrationConstants.RemoteServiceProperties.DYNAMIC_CLIENT_SERVICE_ENDPOINT) + .setParameter("applicationName", appName) + .setParameter("userId", user) + .setParameter("consumerKey", clientid).build(); + HttpDelete httpDelete = new HttpDelete(uri); + HttpResponse response = httpClient.execute(httpDelete); + int status = response.getStatusLine().getStatusCode(); + if (status == 200) { + return true; + } + } catch (IOException e) { + throw new DynamicClientRegistrationException("Connection error occurred while constructing the payload for " + + "invoking DCR endpoint for unregistering the web-app : " + appName, e); + } catch (URISyntaxException e) { + throw new DynamicClientRegistrationException("Exception occurred while constructing the URI for invoking " + + "DCR endpoint for unregistering the web-app : " + appName, e); + } + return false; + } + + private static int getServerHTTPSPort() { + // HTTPS port + String mgtConsoleTransport = CarbonUtils.getManagementTransport(); + ConfigurationContextService configContextService = + DynamicClientWebAppRegistrationDataHolder.getInstance().getConfigurationContextService(); + int port = CarbonUtils.getTransportPort(configContextService, mgtConsoleTransport); + int httpsProxyPort = + CarbonUtils.getTransportProxyPort(configContextService.getServerConfigContext(), + mgtConsoleTransport); + if (httpsProxyPort > 0) { + port = httpsProxyPort; + } + return port; + } + + private static OAuthApplicationInfo getOAuthApplicationInfo(JsonElement jsonData) { + JsonObject jsonObject = jsonData.getAsJsonObject(); + OAuthApplicationInfo oAuthApplicationInfo = new OAuthApplicationInfo(); + JsonElement property = jsonObject.get("client_id"); + if (property != null) { + oAuthApplicationInfo.setClientId(property.getAsString()); + } + property = jsonObject.get("client_name"); + if (property != null) { + oAuthApplicationInfo.setClientName(property.getAsString()); + } + property = jsonObject.get("client_secret"); + if (property != null) { + oAuthApplicationInfo.setClientSecret(property.getAsString()); + } + return oAuthApplicationInfo; + } +} diff --git a/pom.xml b/pom.xml index d041463e527..e648027d2da 100644 --- a/pom.xml +++ b/pom.xml @@ -1247,6 +1247,11 @@ gson ${google.gson.version} + + org.apache.httpcomponents + httpclient + ${apache.http.version} + @@ -1491,7 +1496,7 @@ 4.6.0 - 5.0.3-SNAPSHOT + 5.0.3 4.5.0 @@ -1542,6 +1547,7 @@ 2.3.1 1.1.1 1.2 + 4.5.1 github-scm