mirror of
https://repository.entgra.net/community/device-mgt-core.git
synced 2025-10-06 02:01:45 +00:00
Merge branch 'master' of https://github.com/wso2/carbon-device-mgt
This commit is contained in:
commit
7be1de1b85
@ -0,0 +1,133 @@
|
|||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<artifactId>dynamic-client-registration</artifactId>
|
||||||
|
<groupId>org.wso2.carbon.devicemgt</groupId>
|
||||||
|
<version>0.9.2-SNAPSHOT</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>org.wso2.mdm</groupId>
|
||||||
|
<artifactId>dynamic-client-web-proxy</artifactId>
|
||||||
|
<version>0.9.2-SNAPSHOT</version>
|
||||||
|
<name>WSO2 Carbon - Proxy endpoint of Dynamic Client Registration Web Service</name>
|
||||||
|
<description>WSO2 Carbon - Dynamic Client Registration Web Proxy</description>
|
||||||
|
<packaging>war</packaging>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-war-plugin</artifactId>
|
||||||
|
<version>2.2</version>
|
||||||
|
<configuration>
|
||||||
|
<warName>${project.artifactId}</warName>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-surefire-plugin</artifactId>
|
||||||
|
<version>2.18</version>
|
||||||
|
<configuration>
|
||||||
|
<systemPropertyVariables>
|
||||||
|
<log4j.configuration>file:src/test/resources/log4j.properties</log4j.configuration>
|
||||||
|
</systemPropertyVariables>
|
||||||
|
<suiteXmlFiles>
|
||||||
|
<suiteXmlFile>src/test/resources/testng.xml</suiteXmlFile>
|
||||||
|
</suiteXmlFiles>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wso2.carbon.devicemgt</groupId>
|
||||||
|
<artifactId>org.wso2.carbon.dynamic.client.registration</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wso2.carbon</groupId>
|
||||||
|
<artifactId>org.wso2.carbon.utils</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.ws.commons.axiom</groupId>
|
||||||
|
<artifactId>axiom-api</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.ws.commons.axiom</groupId>
|
||||||
|
<artifactId>axiom-impl</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.ws.commons.axiom.wso2</groupId>
|
||||||
|
<artifactId>axiom</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cxf</groupId>
|
||||||
|
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cxf</groupId>
|
||||||
|
<artifactId>cxf-rt-transports-http</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.cxf</groupId>
|
||||||
|
<artifactId>cxf-rt-bindings-http</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.testng</groupId>
|
||||||
|
<artifactId>testng</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.jackson</groupId>
|
||||||
|
<artifactId>jackson-jaxrs</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-logging</groupId>
|
||||||
|
<artifactId>commons-logging</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.wso2.carbon</groupId>
|
||||||
|
<artifactId>org.wso2.carbon.core</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
</project>
|
||||||
@ -15,18 +15,23 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* 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.proxy;
|
||||||
|
|
||||||
import javax.ws.rs.PathParam;
|
import org.apache.commons.logging.Log;
|
||||||
import javax.ws.rs.core.Response;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
public class ConfigurationServiceImpl implements ConfigurationService {
|
import javax.ws.rs.POST;
|
||||||
|
|
||||||
@Override
|
/**
|
||||||
public Response getProfile(@PathParam("client_id") String clientId) {
|
* Created by harshan on 12/10/15.
|
||||||
return null;
|
*/
|
||||||
|
public class OAuthEndpointProxy {
|
||||||
|
|
||||||
|
private static final Log log = LogFactory.getLog(OAuthEndpointProxy.class);
|
||||||
|
|
||||||
|
@POST
|
||||||
|
public String getAccessToken() {
|
||||||
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -0,0 +1,91 @@
|
|||||||
|
/*
|
||||||
|
* 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.proxy;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.apache.http.HttpEntity;
|
||||||
|
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||||
|
import org.apache.http.util.EntityUtils;
|
||||||
|
import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationException;
|
||||||
|
import org.wso2.carbon.dynamic.client.registration.profile.RegistrationProfile;
|
||||||
|
import org.wso2.carbon.dynamic.client.web.proxy.util.Constants;
|
||||||
|
import org.wso2.carbon.dynamic.client.web.proxy.util.DCRProxyUtils;
|
||||||
|
import org.wso2.carbon.dynamic.client.web.proxy.util.RemoteDCRClient;
|
||||||
|
|
||||||
|
import javax.ws.rs.*;
|
||||||
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by harshan on 12/10/15.
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
@Consumes(MediaType.APPLICATION_JSON)
|
||||||
|
public class RegistrationProxy {
|
||||||
|
|
||||||
|
private static final Log log = LogFactory.getLog(RegistrationProxy.class);
|
||||||
|
|
||||||
|
@POST
|
||||||
|
public Response register(RegistrationProfile profile) {
|
||||||
|
Response response;
|
||||||
|
try {
|
||||||
|
CloseableHttpResponse serverResponse = RemoteDCRClient.createOAuthApplication(profile);
|
||||||
|
HttpEntity responseData = serverResponse.getEntity();
|
||||||
|
int status = serverResponse.getStatusLine().getStatusCode();
|
||||||
|
String resp = EntityUtils.toString(responseData, Constants.CharSets.CHARSET_UTF8);
|
||||||
|
response = Response.status(DCRProxyUtils.getResponseStatus(status)).entity(resp).build();
|
||||||
|
} catch (DynamicClientRegistrationException e) {
|
||||||
|
String msg = "Server error occurred while registering client '" + profile.getClientName() + "'";
|
||||||
|
log.error(msg, e);
|
||||||
|
response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
|
||||||
|
} catch (IOException e) {
|
||||||
|
String msg = "Service invoke error occurred while registering client '" + profile.getClientName() + "'";
|
||||||
|
log.error(msg, e);
|
||||||
|
response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
@DELETE
|
||||||
|
public Response unregister(@QueryParam("applicationName") String applicationName,
|
||||||
|
@QueryParam("userId") String userId,
|
||||||
|
@QueryParam("consumerKey") String consumerKey) {
|
||||||
|
Response response;
|
||||||
|
try {
|
||||||
|
CloseableHttpResponse serverResponse = RemoteDCRClient.deleteOAuthApplication(userId, applicationName,
|
||||||
|
consumerKey);
|
||||||
|
HttpEntity responseData = serverResponse.getEntity();
|
||||||
|
int status = serverResponse.getStatusLine().getStatusCode();
|
||||||
|
String resp = EntityUtils.toString(responseData, Constants.CharSets.CHARSET_UTF8);
|
||||||
|
response = Response.status(DCRProxyUtils.getResponseStatus(status)).entity(resp).build();
|
||||||
|
} catch (DynamicClientRegistrationException e) {
|
||||||
|
String msg = "Server error occurred while deleting the client '" + applicationName + "'";
|
||||||
|
log.error(msg, e);
|
||||||
|
response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
|
||||||
|
} catch (IOException e) {
|
||||||
|
String msg = "Service invoke error occurred while deleting the client '" + applicationName + "'";
|
||||||
|
log.error(msg, e);
|
||||||
|
response = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(msg).build();
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* 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.proxy.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by harshan on 12/10/15.
|
||||||
|
*/
|
||||||
|
public class Constants {
|
||||||
|
|
||||||
|
public static final class ContentTypes {
|
||||||
|
private ContentTypes() {
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final String CONTENT_TYPE_ANY = "*/*";
|
||||||
|
public static final String CONTENT_TYPE_XML = "application/xml";
|
||||||
|
public static final String CONTENT_TYPE_APPLICATION_JSON = "application/json";
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class CharSets {
|
||||||
|
private CharSets() {
|
||||||
|
throw new AssertionError();
|
||||||
|
}
|
||||||
|
|
||||||
|
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";
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* 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.proxy.util;
|
||||||
|
|
||||||
|
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||||
|
import org.wso2.carbon.core.security.AuthenticatorsConfiguration;
|
||||||
|
import org.wso2.carbon.utils.ConfigurationContextService;
|
||||||
|
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by harshan on 12/10/15.
|
||||||
|
*/
|
||||||
|
public class DCRProxyUtils {
|
||||||
|
|
||||||
|
public static ConfigurationContextService getConfigurationContextService() {
|
||||||
|
PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
|
||||||
|
return (ConfigurationContextService) ctx.getOSGiService(ConfigurationContextService.class, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Response.Status getResponseStatus(int statusCode) {
|
||||||
|
switch (statusCode) {
|
||||||
|
case 200 :
|
||||||
|
return Response.Status.OK;
|
||||||
|
case 201 :
|
||||||
|
return Response.Status.CREATED;
|
||||||
|
case 400 :
|
||||||
|
return Response.Status.BAD_REQUEST;
|
||||||
|
case 500 :
|
||||||
|
return Response.Status.INTERNAL_SERVER_ERROR;
|
||||||
|
}
|
||||||
|
return Response.Status.ACCEPTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String getKeyManagerHost()
|
||||||
|
throws IllegalArgumentException {
|
||||||
|
AuthenticatorsConfiguration authenticatorsConfiguration = AuthenticatorsConfiguration.getInstance();
|
||||||
|
AuthenticatorsConfiguration.AuthenticatorConfig authenticatorConfig = authenticatorsConfiguration.
|
||||||
|
getAuthenticatorConfig(
|
||||||
|
Constants.ConfigurationProperties.AUTHENTICATOR_NAME);
|
||||||
|
if (authenticatorConfig != null && authenticatorConfig.getParameters() != null) {
|
||||||
|
return getHostName(authenticatorConfig.getParameters().get(Constants.ConfigurationProperties.
|
||||||
|
AUTHENTICATOR_CONFIG_HOST_URL));
|
||||||
|
|
||||||
|
}else{
|
||||||
|
throw new IllegalArgumentException("Configuration parameters need to be defined in Authenticators.xml.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,150 @@
|
|||||||
|
/*
|
||||||
|
* 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.proxy.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.CloseableHttpResponse;
|
||||||
|
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.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationException;
|
||||||
|
import org.wso2.carbon.dynamic.client.registration.profile.RegistrationProfile;
|
||||||
|
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 CloseableHttpResponse createOAuthApplication(RegistrationProfile registrationProfile)
|
||||||
|
throws DynamicClientRegistrationException {
|
||||||
|
DefaultHttpClient httpClient = new DefaultHttpClient();
|
||||||
|
String clientName = registrationProfile.getClientName();
|
||||||
|
String host = DCRProxyUtils.getKeyManagerHost();
|
||||||
|
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(Constants.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(Constants.RemoteServiceProperties.
|
||||||
|
DYNAMIC_CLIENT_SERVICE_PROTOCOL).setHost(host).setPath(
|
||||||
|
Constants.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);
|
||||||
|
return httpClient.execute(httpPost);
|
||||||
|
} 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 CloseableHttpResponse deleteOAuthApplication(String user, String appName, String clientid)
|
||||||
|
throws DynamicClientRegistrationException {
|
||||||
|
DefaultHttpClient httpClient = new DefaultHttpClient();
|
||||||
|
String host = DCRProxyUtils.getKeyManagerHost();
|
||||||
|
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(Constants.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(Constants.RemoteServiceProperties.
|
||||||
|
DYNAMIC_CLIENT_SERVICE_PROTOCOL).setHost(host).setPath(
|
||||||
|
Constants.RemoteServiceProperties.DYNAMIC_CLIENT_SERVICE_ENDPOINT)
|
||||||
|
.setParameter("applicationName", appName)
|
||||||
|
.setParameter("userId", user)
|
||||||
|
.setParameter("consumerKey", clientid).build();
|
||||||
|
HttpDelete httpDelete = new HttpDelete(uri);
|
||||||
|
return httpClient.execute(httpDelete);
|
||||||
|
} 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int getServerHTTPSPort() {
|
||||||
|
// HTTPS port
|
||||||
|
String mgtConsoleTransport = CarbonUtils.getManagementTransport();
|
||||||
|
ConfigurationContextService configContextService = DCRProxyUtils.getConfigurationContextService();
|
||||||
|
int port = CarbonUtils.getTransportPort(configContextService, mgtConsoleTransport);
|
||||||
|
int httpsProxyPort =
|
||||||
|
CarbonUtils.getTransportProxyPort(configContextService.getServerConfigContext(),
|
||||||
|
mgtConsoleTransport);
|
||||||
|
if (httpsProxyPort > 0) {
|
||||||
|
port = httpsProxyPort;
|
||||||
|
}
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This file defines class loading policy of the whole container. But this behaviour can be overridden by individual webapps by putting this file into the META-INF/ directory.
|
||||||
|
-->
|
||||||
|
<Classloading xmlns="http://wso2.org/projects/as/classloading">
|
||||||
|
|
||||||
|
<!-- Parent-first or child-first. Default behaviour is child-first.-->
|
||||||
|
<ParentFirst>false</ParentFirst>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Default environments that contains provides to all the webapps. This can be overridden by individual webapps by specifing required environments
|
||||||
|
Tomcat environment is the default and every webapps gets it even if they didn't specify it.
|
||||||
|
e.g. If a webapps requires CXF, they will get both Tomcat and CXF.
|
||||||
|
-->
|
||||||
|
<Environments>CXF,Carbon</Environments>
|
||||||
|
</Classloading>
|
||||||
@ -0,0 +1,51 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
<beans xmlns="http://www.springframework.org/schema/beans"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
|
||||||
|
xsi:schemaLocation="
|
||||||
|
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
|
||||||
|
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
|
||||||
|
|
||||||
|
<import resource="classpath:META-INF/cxf/cxf.xml"/>
|
||||||
|
<import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
|
||||||
|
|
||||||
|
<!-- Registration Service Proxy Endpoint -->
|
||||||
|
<jaxrs:server id="RegistrationService" address="/register">
|
||||||
|
<jaxrs:serviceBeans>
|
||||||
|
<ref bean="RegistrationServiceBean"/>
|
||||||
|
</jaxrs:serviceBeans>
|
||||||
|
<jaxrs:providers>
|
||||||
|
<ref bean="jsonProvider"/>
|
||||||
|
</jaxrs:providers>
|
||||||
|
</jaxrs:server>
|
||||||
|
|
||||||
|
<!-- OAuth Service Proxy Endpoint -->
|
||||||
|
<jaxrs:server id="OAuthService" address="/oauth">
|
||||||
|
<jaxrs:serviceBeans>
|
||||||
|
<ref bean="OAuthServiceBean"/>
|
||||||
|
</jaxrs:serviceBeans>
|
||||||
|
<jaxrs:providers></jaxrs:providers>
|
||||||
|
</jaxrs:server>
|
||||||
|
|
||||||
|
<bean id="RegistrationServiceBean" class="org.wso2.carbon.dynamic.client.web.proxy.RegistrationProxy"/>
|
||||||
|
<bean id="OAuthServiceBean" class="org.wso2.carbon.dynamic.client.web.proxy.OAuthEndpointProxy"/>
|
||||||
|
<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
|
||||||
|
</beans>
|
||||||
|
|
||||||
@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
|
||||||
|
<display-name>Dynamic-client-proxy-Webapp</display-name>
|
||||||
|
<servlet>
|
||||||
|
<description>Dynamic-client-registration-proxy Endpoint</description>
|
||||||
|
<display-name>JAX-WS/JAX-RS Servlet</display-name>
|
||||||
|
<servlet-name>CXFServlet</servlet-name>
|
||||||
|
<servlet-class>
|
||||||
|
org.apache.cxf.transport.servlet.CXFServlet
|
||||||
|
</servlet-class>
|
||||||
|
<load-on-startup>1</load-on-startup>
|
||||||
|
</servlet>
|
||||||
|
<servlet-mapping>
|
||||||
|
<servlet-name>CXFServlet</servlet-name>
|
||||||
|
<url-pattern>/*</url-pattern>
|
||||||
|
</servlet-mapping>
|
||||||
|
<session-config>
|
||||||
|
<session-timeout>60</session-timeout>
|
||||||
|
</session-config>
|
||||||
|
</web-app>
|
||||||
@ -0,0 +1,125 @@
|
|||||||
|
@CHARSET "ISO-8859-1";
|
||||||
|
|
||||||
|
/* http://meyerweb.com/eric/tools/css/reset/
|
||||||
|
v2.0 | 20110126
|
||||||
|
License: none (public domain)
|
||||||
|
*/
|
||||||
|
|
||||||
|
html, body, div, span, applet, object, iframe,
|
||||||
|
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
|
||||||
|
a, abbr, acronym, address, big, cite, code,
|
||||||
|
del, dfn, em, img, ins, kbd, q, s, samp,
|
||||||
|
small, strike, strong, sub, sup, tt, var,
|
||||||
|
b, u, i, center,
|
||||||
|
dl, dt, dd, ol, ul, li,
|
||||||
|
fieldset, form, label, legend,
|
||||||
|
table, caption, tbody, tfoot, thead, tr, th, td,
|
||||||
|
article, aside, canvas, details, embed,
|
||||||
|
figure, figcaption, footer, header, hgroup,
|
||||||
|
menu, nav, output, ruby, section, summary,
|
||||||
|
time, mark, audio, video {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
font-size: 100%;
|
||||||
|
font: inherit;
|
||||||
|
vertical-align: baseline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* HTML5 display-role reset for older browsers */
|
||||||
|
article, aside, details, figcaption, figure,
|
||||||
|
footer, header, hgroup, menu, nav, section {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
background: #efefef;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
line-height: 1;
|
||||||
|
width: 960px;
|
||||||
|
margin: auto;
|
||||||
|
background: white;
|
||||||
|
padding: 10px;
|
||||||
|
box-shadow: 0px 0px 5px #CCC;
|
||||||
|
font-family: "Lucida Grande", "Lucida Sans", "Microsoft Sans Serif", "Lucida Sans Unicode", "Verdana", "Sans-serif", "trebuchet ms" !important;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
ol, ul {
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote, q {
|
||||||
|
quotes: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
blockquote:before, blockquote:after,
|
||||||
|
q:before, q:after {
|
||||||
|
content: '';
|
||||||
|
content: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
border-collapse: collapse;
|
||||||
|
border-spacing: 0;
|
||||||
|
width: 960px;
|
||||||
|
border: solid 1px #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
table a {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #1e90ff;
|
||||||
|
padding: 7px;
|
||||||
|
float: left;;
|
||||||
|
}
|
||||||
|
|
||||||
|
.heading {
|
||||||
|
font-size: 18px;
|
||||||
|
margin-top: 20px;
|
||||||
|
float: left;
|
||||||
|
color: #0067B1;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
padding-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.field {
|
||||||
|
font-weight: normal;
|
||||||
|
width: 120px;
|
||||||
|
font-size: 12px;
|
||||||
|
float: left;
|
||||||
|
padding: 7px;
|
||||||
|
clear: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.value {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 12px;
|
||||||
|
float: left;
|
||||||
|
padding: 7px;
|
||||||
|
clear: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.porttypename {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
UL {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
LI {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 12px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
TD {
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
vertical-align: text-top;
|
||||||
|
padding: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
#
|
||||||
|
# Copyright 2009 WSO2, Inc. (http://wso2.com)
|
||||||
|
#
|
||||||
|
# Licensed 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.
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# This is the log4j configuration file used by WSO2 Carbon
|
||||||
|
#
|
||||||
|
# IMPORTANT : Please do not remove or change the names of any
|
||||||
|
# of the Appenders defined here. The layout pattern & log file
|
||||||
|
# can be changed using the WSO2 Carbon Management Console, and those
|
||||||
|
# settings will override the settings in this file.
|
||||||
|
#
|
||||||
|
|
||||||
|
log4j.rootLogger=DEBUG, STD_OUT
|
||||||
|
|
||||||
|
# Redirect log messages to console
|
||||||
|
log4j.appender.STD_OUT=org.apache.log4j.ConsoleAppender
|
||||||
|
log4j.appender.STD_OUT.Target=System.out
|
||||||
|
log4j.appender.STD_OUT.layout=org.apache.log4j.PatternLayout
|
||||||
|
log4j.appender.STD_OUT.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
|
||||||
|
|
||||||
|
<suite name="DCR-Proxy-Tests">
|
||||||
|
<parameter name="useDefaultListeners" value="false"/>
|
||||||
|
</suite>
|
||||||
@ -87,11 +87,6 @@
|
|||||||
<artifactId>cxf-rt-transports-http</artifactId>
|
<artifactId>cxf-rt-transports-http</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.apache.cxf</groupId>
|
|
||||||
<artifactId>cxf-rt-bindings-soap</artifactId>
|
|
||||||
<scope>compile</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.cxf</groupId>
|
<groupId>org.apache.cxf</groupId>
|
||||||
<artifactId>cxf-rt-bindings-http</artifactId>
|
<artifactId>cxf-rt-bindings-http</artifactId>
|
||||||
|
|||||||
@ -63,7 +63,7 @@ public interface RegistrationService {
|
|||||||
* @return Status 200 if success.
|
* @return Status 200 if success.
|
||||||
*/
|
*/
|
||||||
@DELETE
|
@DELETE
|
||||||
public Response unregister(@QueryParam("applicationName") String applicationName,
|
Response unregister(@QueryParam("applicationName") String applicationName,
|
||||||
@QueryParam("userId") String userId,
|
@QueryParam("userId") String userId,
|
||||||
@QueryParam("consumerKey") String consumerKey);
|
@QueryParam("consumerKey") String consumerKey);
|
||||||
|
|
||||||
|
|||||||
@ -89,7 +89,7 @@ public class RegistrationServiceImpl implements RegistrationService {
|
|||||||
boolean status = dynamicClientRegistrationService.unregisterOAuthApplication(userId, applicationName,
|
boolean status = dynamicClientRegistrationService.unregisterOAuthApplication(userId, applicationName,
|
||||||
consumerKey);
|
consumerKey);
|
||||||
if (status) {
|
if (status) {
|
||||||
return Response.status(Response.Status.ACCEPTED).build();
|
return Response.status(Response.Status.OK).build();
|
||||||
}
|
}
|
||||||
return Response.status(Response.Status.BAD_REQUEST).build();
|
return Response.status(Response.Status.BAD_REQUEST).build();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -19,9 +19,9 @@
|
|||||||
~ */
|
~ */
|
||||||
-->
|
-->
|
||||||
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
|
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
|
||||||
<display-name>Admin-Webapp</display-name>
|
<display-name>dynamic-client-registration-Webapp</display-name>
|
||||||
<servlet>
|
<servlet>
|
||||||
<description>JAX-WS/JAX-RS Device Registration Agent Endpoint</description>
|
<description>Dynamic-client-registration Agent Endpoint</description>
|
||||||
<display-name>JAX-WS/JAX-RS Servlet</display-name>
|
<display-name>JAX-WS/JAX-RS Servlet</display-name>
|
||||||
<servlet-name>CXFServlet</servlet-name>
|
<servlet-name>CXFServlet</servlet-name>
|
||||||
<servlet-class>
|
<servlet-class>
|
||||||
|
|||||||
@ -18,11 +18,6 @@
|
|||||||
|
|
||||||
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
|
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
|
||||||
|
|
||||||
<suite name="MDM-windows-initializer">
|
<suite name="DCR-Tests">
|
||||||
<parameter name="useDefaultListeners" value="false"/>
|
<parameter name="useDefaultListeners" value="false"/>
|
||||||
|
|
||||||
<test name="Windows Unit Tests" preserve-order="true">
|
|
||||||
<classes>
|
|
||||||
</classes>
|
|
||||||
</test>
|
|
||||||
</suite>
|
</suite>
|
||||||
@ -66,6 +66,7 @@
|
|||||||
org.wso2.carbon.identity.application.common,
|
org.wso2.carbon.identity.application.common,
|
||||||
org.wso2.carbon.identity.application.common.model,
|
org.wso2.carbon.identity.application.common.model,
|
||||||
org.wso2.carbon.identity.application.mgt,
|
org.wso2.carbon.identity.application.mgt,
|
||||||
|
org.wso2.carbon.identity.application.mgt.stub,
|
||||||
org.wso2.carbon.identity.base,
|
org.wso2.carbon.identity.base,
|
||||||
org.wso2.carbon.identity.oauth,
|
org.wso2.carbon.identity.oauth,
|
||||||
org.wso2.carbon.identity.oauth.dto,
|
org.wso2.carbon.identity.oauth.dto,
|
||||||
|
|||||||
@ -18,6 +18,7 @@
|
|||||||
package org.wso2.carbon.dynamic.client.registration;
|
package org.wso2.carbon.dynamic.client.registration;
|
||||||
|
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
|
import org.wso2.carbon.dynamic.client.registration.util.DCRConstants;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@ -87,10 +88,10 @@ public class OAuthApplicationInfo {
|
|||||||
|
|
||||||
public String toString() {
|
public String toString() {
|
||||||
JSONObject obj = new JSONObject();
|
JSONObject obj = new JSONObject();
|
||||||
obj.put(ApplicationConstants.ClientMetadata.OAUTH_CLIENT_ID, this.getClientId());
|
obj.put(DCRConstants.ClientMetadata.OAUTH_CLIENT_ID, this.getClientId());
|
||||||
obj.put(ApplicationConstants.ClientMetadata.OAUTH_CLIENT_NAME, this.getClientName());
|
obj.put(DCRConstants.ClientMetadata.OAUTH_CLIENT_NAME, this.getClientName());
|
||||||
obj.put(ApplicationConstants.ClientMetadata.OAUTH_CALLBACK_URIS, this.getCallBackURL());
|
obj.put(DCRConstants.ClientMetadata.OAUTH_CALLBACK_URIS, this.getCallBackURL());
|
||||||
obj.put(ApplicationConstants.ClientMetadata.OAUTH_CLIENT_SECRET, this.getClientSecret());
|
obj.put(DCRConstants.ClientMetadata.OAUTH_CLIENT_SECRET, this.getClientSecret());
|
||||||
return obj.toString();
|
return obj.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -27,6 +27,8 @@ import org.wso2.carbon.context.RegistryType;
|
|||||||
import org.wso2.carbon.dynamic.client.registration.*;
|
import org.wso2.carbon.dynamic.client.registration.*;
|
||||||
import org.wso2.carbon.dynamic.client.registration.internal.DynamicClientRegistrationDataHolder;
|
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.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.IdentityApplicationManagementException;
|
||||||
import org.wso2.carbon.identity.application.common.model.*;
|
import org.wso2.carbon.identity.application.common.model.*;
|
||||||
import org.wso2.carbon.identity.application.mgt.ApplicationManagementService;
|
import org.wso2.carbon.identity.application.mgt.ApplicationManagementService;
|
||||||
@ -94,15 +96,15 @@ public class DynamicClientRegistrationServiceImpl implements DynamicClientRegist
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
JSONObject jsonObject = new JSONObject(info.getJsonString());
|
JSONObject jsonObject = new JSONObject(info.getJsonString());
|
||||||
if (jsonObject.has(ApplicationConstants.ClientMetadata.OAUTH_REDIRECT_URIS)) {
|
if (jsonObject.has(DCRConstants.ClientMetadata.OAUTH_REDIRECT_URIS)) {
|
||||||
oAuthApplicationInfo.addParameter(ApplicationConstants.ClientMetadata.OAUTH_REDIRECT_URIS,
|
oAuthApplicationInfo.addParameter(DCRConstants.ClientMetadata.OAUTH_REDIRECT_URIS,
|
||||||
jsonObject
|
jsonObject
|
||||||
.get(ApplicationConstants.ClientMetadata.OAUTH_REDIRECT_URIS));
|
.get(DCRConstants.ClientMetadata.OAUTH_REDIRECT_URIS));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (jsonObject.has(ApplicationConstants.ClientMetadata.OAUTH_CLIENT_GRANT)) {
|
if (jsonObject.has(DCRConstants.ClientMetadata.OAUTH_CLIENT_GRANT)) {
|
||||||
oAuthApplicationInfo.addParameter(ApplicationConstants.ClientMetadata.OAUTH_CLIENT_GRANT, jsonObject
|
oAuthApplicationInfo.addParameter(DCRConstants.ClientMetadata.OAUTH_CLIENT_GRANT, jsonObject
|
||||||
.get(ApplicationConstants.ClientMetadata.OAUTH_CLIENT_GRANT));
|
.get(DCRConstants.ClientMetadata.OAUTH_CLIENT_GRANT));
|
||||||
}
|
}
|
||||||
} catch (JSONException e) {
|
} catch (JSONException e) {
|
||||||
throw new DynamicClientRegistrationException(
|
throw new DynamicClientRegistrationException(
|
||||||
@ -160,7 +162,6 @@ public class DynamicClientRegistrationServiceImpl implements DynamicClientRegist
|
|||||||
}
|
}
|
||||||
|
|
||||||
ServiceProvider existingServiceProvider = appMgtService.getServiceProvider(applicationName, tenantDomain);
|
ServiceProvider existingServiceProvider = appMgtService.getServiceProvider(applicationName, tenantDomain);
|
||||||
|
|
||||||
if (existingServiceProvider == null) {
|
if (existingServiceProvider == null) {
|
||||||
appMgtService.createApplication(serviceProvider, tenantDomain, userName);
|
appMgtService.createApplication(serviceProvider, tenantDomain, userName);
|
||||||
}
|
}
|
||||||
@ -267,9 +268,9 @@ public class DynamicClientRegistrationServiceImpl implements DynamicClientRegist
|
|||||||
oAuthApplicationInfo.setClientName(createdApp.getApplicationName());
|
oAuthApplicationInfo.setClientName(createdApp.getApplicationName());
|
||||||
|
|
||||||
oAuthApplicationInfo.addParameter(
|
oAuthApplicationInfo.addParameter(
|
||||||
ApplicationConstants.ClientMetadata.OAUTH_REDIRECT_URIS, createdApp.getCallbackUrl());
|
DCRConstants.ClientMetadata.OAUTH_REDIRECT_URIS, createdApp.getCallbackUrl());
|
||||||
oAuthApplicationInfo.addParameter(
|
oAuthApplicationInfo.addParameter(
|
||||||
ApplicationConstants.ClientMetadata.OAUTH_CLIENT_GRANT, createdApp.getGrantTypes());
|
DCRConstants.ClientMetadata.OAUTH_CLIENT_GRANT, createdApp.getGrantTypes());
|
||||||
|
|
||||||
return oAuthApplicationInfo;
|
return oAuthApplicationInfo;
|
||||||
} catch (IdentityApplicationManagementException e) {
|
} catch (IdentityApplicationManagementException e) {
|
||||||
|
|||||||
@ -20,7 +20,6 @@ package org.wso2.carbon.dynamic.client.registration.internal;
|
|||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.osgi.framework.ServiceRegistration;
|
|
||||||
import org.osgi.service.component.ComponentContext;
|
import org.osgi.service.component.ComponentContext;
|
||||||
import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationService;
|
import org.wso2.carbon.dynamic.client.registration.DynamicClientRegistrationService;
|
||||||
import org.wso2.carbon.dynamic.client.registration.impl.DynamicClientRegistrationServiceImpl;
|
import org.wso2.carbon.dynamic.client.registration.impl.DynamicClientRegistrationServiceImpl;
|
||||||
@ -44,10 +43,8 @@ public class DynamicClientRegistrationServiceComponent {
|
|||||||
if(log.isDebugEnabled()){
|
if(log.isDebugEnabled()){
|
||||||
log.debug("Starting DynamicClientRegistrationServiceComponent");
|
log.debug("Starting DynamicClientRegistrationServiceComponent");
|
||||||
}
|
}
|
||||||
DynamicClientRegistrationService dynamicClientRegistrationService =
|
|
||||||
new DynamicClientRegistrationServiceImpl();
|
|
||||||
componentContext.getBundleContext().registerService(
|
componentContext.getBundleContext().registerService(
|
||||||
DynamicClientRegistrationService.class.getName(), dynamicClientRegistrationService, null);
|
DynamicClientRegistrationService.class.getName(), new DynamicClientRegistrationServiceImpl(), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
|
|||||||
@ -15,18 +15,18 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* 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.
|
* This class holds the constants used by DynamicClientRegistration component.
|
||||||
*/
|
*/
|
||||||
public final class ApplicationConstants {
|
public final class DCRConstants {
|
||||||
|
|
||||||
public static class ClientMetadata {
|
public static class ClientMetadata {
|
||||||
private ClientMetadata() {
|
private ClientMetadata() {
|
||||||
throw new AssertionError();
|
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_ID = "client_id"; //this means consumer key
|
||||||
public static final String OAUTH_CLIENT_SECRET = "client_secret";
|
public static final String OAUTH_CLIENT_SECRET = "client_secret";
|
||||||
public static final String OAUTH_REDIRECT_URIS = "redirect_uris";
|
public static final String OAUTH_REDIRECT_URIS = "redirect_uris";
|
||||||
@ -15,8 +15,11 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* 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 class DynamicClientRegistrationUtil {
|
||||||
|
|
||||||
public static void validateUsername(String username) {
|
public static void validateUsername(String username) {
|
||||||
@ -36,5 +39,4 @@ public class DynamicClientRegistrationUtil {
|
|||||||
throw new IllegalArgumentException("Consumer Key cannot be null or empty");
|
throw new IllegalArgumentException("Consumer Key cannot be null or empty");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -56,7 +56,27 @@
|
|||||||
!org.wso2.carbon.dynamic.client.web.app.registration.internal,
|
!org.wso2.carbon.dynamic.client.web.app.registration.internal,
|
||||||
org.wso2.carbon.dynamic.client.web.app.registration.*
|
org.wso2.carbon.dynamic.client.web.app.registration.*
|
||||||
</Export-Package>
|
</Export-Package>
|
||||||
<DynamicImport-Package>*</DynamicImport-Package>
|
<Import-Package>
|
||||||
|
javax.xml.bind.*,
|
||||||
|
com.google.*,
|
||||||
|
javax.net.ssl,
|
||||||
|
javax.servlet,
|
||||||
|
org.apache.axis2.context,
|
||||||
|
org.apache.catalina,
|
||||||
|
org.apache.catalina.core,
|
||||||
|
org.apache.commons.*,
|
||||||
|
org.apache.http,
|
||||||
|
org.apache.http.*,
|
||||||
|
org.osgi.framework,
|
||||||
|
org.osgi.service.component,
|
||||||
|
org.wso2.carbon.context,
|
||||||
|
org.wso2.carbon.core,
|
||||||
|
org.wso2.carbon.core.security,
|
||||||
|
org.wso2.carbon.dynamic.client.*,
|
||||||
|
org.wso2.carbon.registry.*,
|
||||||
|
org.wso2.carbon.user.*,
|
||||||
|
org.wso2.carbon.utils
|
||||||
|
</Import-Package>
|
||||||
</instructions>
|
</instructions>
|
||||||
</configuration>
|
</configuration>
|
||||||
</plugin>
|
</plugin>
|
||||||
@ -115,5 +135,13 @@
|
|||||||
<groupId>org.wso2.carbon.devicemgt</groupId>
|
<groupId>org.wso2.carbon.devicemgt</groupId>
|
||||||
<artifactId>org.wso2.carbon.dynamic.client.registration</artifactId>
|
<artifactId>org.wso2.carbon.dynamic.client.registration</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.google.code.gson</groupId>
|
||||||
|
<artifactId>gson</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</project>
|
</project>
|
||||||
@ -52,8 +52,7 @@ public class DynamicClientWebAppRegistrationManager {
|
|||||||
if (dynamicClientWebAppRegistrationManager == null) {
|
if (dynamicClientWebAppRegistrationManager == null) {
|
||||||
synchronized (DynamicClientWebAppRegistrationManager.class) {
|
synchronized (DynamicClientWebAppRegistrationManager.class) {
|
||||||
if (dynamicClientWebAppRegistrationManager == null) {
|
if (dynamicClientWebAppRegistrationManager == null) {
|
||||||
dynamicClientWebAppRegistrationManager =
|
dynamicClientWebAppRegistrationManager = new DynamicClientWebAppRegistrationManager();
|
||||||
new DynamicClientWebAppRegistrationManager();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -65,11 +64,9 @@ public class DynamicClientWebAppRegistrationManager {
|
|||||||
log.debug("Registering OAuth application for web app : " + registrationProfile.getClientName());
|
log.debug("Registering OAuth application for web app : " + registrationProfile.getClientName());
|
||||||
}
|
}
|
||||||
if (DynamicClientWebAppRegistrationUtil.validateRegistrationProfile(registrationProfile)) {
|
if (DynamicClientWebAppRegistrationUtil.validateRegistrationProfile(registrationProfile)) {
|
||||||
DynamicClientRegistrationService dynamicClientRegistrationService =
|
|
||||||
DynamicClientWebAppRegistrationDataHolder.getInstance().getDynamicClientRegistrationService();
|
|
||||||
try {
|
try {
|
||||||
OAuthApplicationInfo oAuthApplicationInfo =
|
OAuthApplicationInfo oAuthApplicationInfo =
|
||||||
dynamicClientRegistrationService.registerOAuthApplication(registrationProfile);
|
DynamicClientWebAppRegistrationUtil.registerOAuthApplication(registrationProfile);
|
||||||
OAuthAppDetails oAuthAppDetails = new OAuthAppDetails();
|
OAuthAppDetails oAuthAppDetails = new OAuthAppDetails();
|
||||||
oAuthAppDetails.setWebAppName(registrationProfile.getClientName());
|
oAuthAppDetails.setWebAppName(registrationProfile.getClientName());
|
||||||
oAuthAppDetails.setClientName(oAuthApplicationInfo.getClientName());
|
oAuthAppDetails.setClientName(oAuthApplicationInfo.getClientName());
|
||||||
@ -79,7 +76,7 @@ public class DynamicClientWebAppRegistrationManager {
|
|||||||
if (DynamicClientWebAppRegistrationUtil.putOAuthApplicationData(oAuthAppDetails)) {
|
if (DynamicClientWebAppRegistrationUtil.putOAuthApplicationData(oAuthAppDetails)) {
|
||||||
return oAuthAppDetails;
|
return oAuthAppDetails;
|
||||||
} else {
|
} else {
|
||||||
dynamicClientRegistrationService.unregisterOAuthApplication(registrationProfile.getOwner(),
|
DynamicClientWebAppRegistrationUtil.unregisterOAuthApplication(registrationProfile.getOwner(),
|
||||||
oAuthApplicationInfo.getClientName(),
|
oAuthApplicationInfo.getClientName(),
|
||||||
oAuthApplicationInfo.getClientId());
|
oAuthApplicationInfo.getClientId());
|
||||||
log.warn("Error occurred while persisting the OAuth application data in registry.");
|
log.warn("Error occurred while persisting the OAuth application data in registry.");
|
||||||
|
|||||||
@ -15,19 +15,30 @@
|
|||||||
* specific language governing permissions and limitations
|
* specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*/
|
*/
|
||||||
package org.wso2.carbon.dynamic.client.web;
|
|
||||||
|
|
||||||
import javax.ws.rs.*;
|
package org.wso2.carbon.dynamic.client.web.app.registration.dto;
|
||||||
import javax.ws.rs.core.MediaType;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
|
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
/**
|
||||||
@Consumes(MediaType.APPLICATION_JSON)
|
* Represents Configuration setting related to OAuth in authenticators.xml.
|
||||||
@Path("/connect")
|
*/
|
||||||
public interface ConfigurationService {
|
public class DynamicClientRegistrationSettings {
|
||||||
|
|
||||||
@GET
|
private boolean isRemote;
|
||||||
@Path("/register")
|
private String host;
|
||||||
Response getProfile(@PathParam("client_id") String clientId);
|
|
||||||
|
|
||||||
|
public boolean isRemote() {
|
||||||
|
return isRemote;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIsRemote(boolean isRemote) {
|
||||||
|
this.isRemote = isRemote;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHost() {
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHost(String host) {
|
||||||
|
this.host = host;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -36,7 +36,8 @@ public class DynamicClientWebAppRegistrationConstants {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static final String CONTENT_TYPE_ANY = "*/*";
|
public static final String CONTENT_TYPE_ANY = "*/*";
|
||||||
public static final String MEDIA_TYPE_XML = "application/xml";
|
public static final String CONTENT_TYPE_XML = "application/xml";
|
||||||
|
public static final String CONTENT_TYPE_APPLICATION_JSON = "application/json";
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final class CharSets {
|
public static final class CharSets {
|
||||||
@ -46,4 +47,23 @@ public class DynamicClientWebAppRegistrationConstants {
|
|||||||
|
|
||||||
public static final String CHARSET_UTF8 = "UTF8";
|
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";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -22,8 +22,11 @@ import com.google.gson.stream.JsonReader;
|
|||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
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.DynamicClientRegistrationException;
|
||||||
|
import org.wso2.carbon.dynamic.client.registration.OAuthApplicationInfo;
|
||||||
import org.wso2.carbon.dynamic.client.registration.profile.RegistrationProfile;
|
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.OAuthAppDetails;
|
||||||
import org.wso2.carbon.dynamic.client.web.app.registration.dto.JaggeryOAuthConfigurationSettings;
|
import org.wso2.carbon.dynamic.client.web.app.registration.dto.JaggeryOAuthConfigurationSettings;
|
||||||
import org.wso2.carbon.dynamic.client.web.app.registration.internal.DynamicClientWebAppRegistrationDataHolder;
|
import org.wso2.carbon.dynamic.client.web.app.registration.internal.DynamicClientWebAppRegistrationDataHolder;
|
||||||
@ -114,7 +117,7 @@ public class DynamicClientWebAppRegistrationUtil {
|
|||||||
|
|
||||||
Resource resource = DynamicClientWebAppRegistrationUtil.getGovernanceRegistry().newResource();
|
Resource resource = DynamicClientWebAppRegistrationUtil.getGovernanceRegistry().newResource();
|
||||||
resource.setContent(writer.toString());
|
resource.setContent(writer.toString());
|
||||||
resource.setMediaType(DynamicClientWebAppRegistrationConstants.ContentTypes.MEDIA_TYPE_XML);
|
resource.setMediaType(DynamicClientWebAppRegistrationConstants.ContentTypes.CONTENT_TYPE_XML);
|
||||||
String resourcePath = DynamicClientWebAppRegistrationConstants.OAUTH_APP_DATA_REGISTRY_PATH + "/" +
|
String resourcePath = DynamicClientWebAppRegistrationConstants.OAUTH_APP_DATA_REGISTRY_PATH + "/" +
|
||||||
oAuthAppDetails.getClientName();
|
oAuthAppDetails.getClientName();
|
||||||
status = DynamicClientWebAppRegistrationUtil.putRegistryResource(resourcePath, resource);
|
status = DynamicClientWebAppRegistrationUtil.putRegistryResource(resourcePath, resource);
|
||||||
@ -315,4 +318,65 @@ public class DynamicClientWebAppRegistrationUtil {
|
|||||||
public static String replaceInvalidChars(String username) {
|
public static String replaceInvalidChars(String username) {
|
||||||
return username.replaceAll("@","_AT_");
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -0,0 +1,185 @@
|
|||||||
|
/*
|
||||||
|
* 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.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
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 Log log = LogFactory.getLog(RemoteDCRClient.class);
|
||||||
|
|
||||||
|
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),
|
||||||
|
DynamicClientWebAppRegistrationConstants.ContentTypes.CONTENT_TYPE_APPLICATION_JSON,
|
||||||
|
DynamicClientWebAppRegistrationConstants.CharSets.CHARSET_UTF8);
|
||||||
|
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, DynamicClientWebAppRegistrationConstants.
|
||||||
|
CharSets.CHARSET_UTF8);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -36,6 +36,7 @@
|
|||||||
|
|
||||||
<modules>
|
<modules>
|
||||||
<module>dynamic-client-web</module>
|
<module>dynamic-client-web</module>
|
||||||
|
<module>dynamic-client-web-proxy</module>
|
||||||
<module>org.wso2.carbon.dynamic.client.registration</module>
|
<module>org.wso2.carbon.dynamic.client.registration</module>
|
||||||
<module>org.wso2.carbon.dynamic.client.web.app.registration</module>
|
<module>org.wso2.carbon.dynamic.client.web.app.registration</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|||||||
@ -105,6 +105,15 @@
|
|||||||
<outputDirectory>${basedir}/src/main/resources/</outputDirectory>
|
<outputDirectory>${basedir}/src/main/resources/</outputDirectory>
|
||||||
<destFileName>dynamic-client-web.war</destFileName>
|
<destFileName>dynamic-client-web.war</destFileName>
|
||||||
</artifactItem>
|
</artifactItem>
|
||||||
|
<artifactItem>
|
||||||
|
<groupId>org.wso2.mdm</groupId>
|
||||||
|
<artifactId>dynamic-client-web-proxy</artifactId>
|
||||||
|
<version>${carbon.device.mgt.version}</version>
|
||||||
|
<type>war</type>
|
||||||
|
<overWrite>true</overWrite>
|
||||||
|
<outputDirectory>${basedir}/src/main/resources/</outputDirectory>
|
||||||
|
<destFileName>dynamic-client-web-proxy.war</destFileName>
|
||||||
|
</artifactItem>
|
||||||
</artifactItems>
|
</artifactItems>
|
||||||
</configuration>
|
</configuration>
|
||||||
</execution>
|
</execution>
|
||||||
|
|||||||
@ -1,2 +1,3 @@
|
|||||||
instructions.configure = \
|
instructions.configure = \
|
||||||
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.dynamic.client.registration.server_${feature.version}/dynamic-client-web.war,target:${installFolder}/../../deployment/server/webapps/dynamic-client-web.war,overwrite:true);\
|
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.dynamic.client.registration.server_${feature.version}/dynamic-client-web.war,target:${installFolder}/../../deployment/server/webapps/dynamic-client-web.war,overwrite:true);\
|
||||||
|
org.eclipse.equinox.p2.touchpoint.natives.copy(source:${installFolder}/../features/org.wso2.carbon.dynamic.client.registration.server_${feature.version}/dynamic-client-web-proxy.war,target:${installFolder}/../../deployment/server/webapps/dynamic-client-web-proxy.war,overwrite:true);\
|
||||||
20
pom.xml
20
pom.xml
@ -1247,9 +1247,12 @@
|
|||||||
<artifactId>gson</artifactId>
|
<artifactId>gson</artifactId>
|
||||||
<version>${google.gson.version}</version>
|
<version>${google.gson.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
<!-- Removing neethi configs-->
|
<groupId>org.apache.httpcomponents</groupId>
|
||||||
|
<artifactId>httpclient</artifactId>
|
||||||
|
<version>${apache.http.version}</version>
|
||||||
|
</dependency>
|
||||||
|
<!-- Removing neethi configs from webapp-->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.neethi.wso2</groupId>
|
<groupId>org.apache.neethi.wso2</groupId>
|
||||||
<artifactId>neethi</artifactId>
|
<artifactId>neethi</artifactId>
|
||||||
@ -1448,16 +1451,6 @@
|
|||||||
<enabled>false</enabled>
|
<enabled>false</enabled>
|
||||||
</releases>
|
</releases>
|
||||||
</repository>
|
</repository>
|
||||||
<repository>
|
|
||||||
<id>wso2-staging</id>
|
|
||||||
<name>WSO2 internal Repository</name>
|
|
||||||
<url>http://maven.wso2.org/nexus/content/repositories/orgwso2carbonidentity-165/</url>
|
|
||||||
<releases>
|
|
||||||
<enabled>true</enabled>
|
|
||||||
<updatePolicy>daily</updatePolicy>
|
|
||||||
<checksumPolicy>ignore</checksumPolicy>
|
|
||||||
</releases>
|
|
||||||
</repository>
|
|
||||||
</repositories>
|
</repositories>
|
||||||
|
|
||||||
|
|
||||||
@ -1555,6 +1548,7 @@
|
|||||||
<google.gson.version>2.3.1</google.gson.version>
|
<google.gson.version>2.3.1</google.gson.version>
|
||||||
<jsr311.version>1.1.1</jsr311.version>
|
<jsr311.version>1.1.1</jsr311.version>
|
||||||
<commons.logging.version>1.2</commons.logging.version>
|
<commons.logging.version>1.2</commons.logging.version>
|
||||||
|
<apache.http.version>4.5.1</apache.http.version>
|
||||||
|
|
||||||
<!-- Neethi version-->
|
<!-- Neethi version-->
|
||||||
<neethi.version>2.0.4</neethi.version>
|
<neethi.version>2.0.4</neethi.version>
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user