From 0d7057640110c7ee92f59867fde681a20a124bd7 Mon Sep 17 00:00:00 2001 From: pasindu Date: Mon, 17 Apr 2023 09:49:43 +0530 Subject: [PATCH] change http client to okhttp --- .../pom.xml | 15 +- .../APIApplicationServices.java | 3 +- .../APIApplicationServicesImpl.java | 104 +++++++++--- .../PublisherAPIServiceStartupHandler.java | 159 ------------------ .../PublisherRESTAPIServices.java | 111 +++++------- .../dto/APIApplicationKey.java | 70 +++++++- .../exceptions/BadRequestException.java | 2 + .../internal/PublisherRESTAPIDataHolder.java | 30 ++++ .../PublisherRESTAPIServiceComponent.java | 23 +-- .../pom.xml | 5 + .../publisher/APIPublisherServiceImpl.java | 9 +- .../publisher/APIPublisherStartupHandler.java | 10 +- components/apimgt-extensions/pom.xml | 46 ----- 13 files changed, 264 insertions(+), 323 deletions(-) delete mode 100644 components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherAPIServiceStartupHandler.java create mode 100644 components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/internal/PublisherRESTAPIDataHolder.java diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/pom.xml b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/pom.xml index 002909f644..8e25736b1f 100644 --- a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/pom.xml +++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/pom.xml @@ -79,8 +79,13 @@ feign-okhttp +<<<<<<< HEAD org.wso2.carbon.apimgt org.wso2.carbon.apimgt.api +======= + org.json.wso2 + json +>>>>>>> 2855ef0a30 (change http client to okhttp) @@ -110,7 +115,6 @@ javax.net.ssl, - org.apache.commons.logging, org.apache.http;version="${httpclient.version.range}", org.apache.http.client;version="${httpclient.version.range}", @@ -123,17 +127,12 @@ org.osgi.framework.*;version="${imp.package.version.osgi.framework}", org.osgi.service.*;version="${imp.package.version.osgi.service}", - - org.wso2.carbon.core, org.apache.commons.ssl, - - - - org.apache.commons.httpclient, org.wso2.carbon.apimgt.api.model, - okhttp3.* + okhttp3.*, + org.json diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/APIApplicationServices.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/APIApplicationServices.java index 5ca41cf6e2..401f680214 100644 --- a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/APIApplicationServices.java +++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/APIApplicationServices.java @@ -3,11 +3,10 @@ package io.entgra.devicemgt.apimgt.extension.publisher.api; import io.entgra.devicemgt.apimgt.extension.publisher.api.dto.APIApplicationKey; import io.entgra.devicemgt.apimgt.extension.publisher.api.dto.AccessTokenInfo; import io.entgra.devicemgt.apimgt.extension.publisher.api.exceptions.APIApplicationServicesException; -import io.entgra.devicemgt.apimgt.extension.publisher.api.exceptions.BadRequestException; public interface APIApplicationServices { - APIApplicationKey createAndRetrieveApplicationCredentials() throws BadRequestException, APIApplicationServicesException; + APIApplicationKey createAndRetrieveApplicationCredentials() throws APIApplicationServicesException; AccessTokenInfo generateAccessTokenFromRegisteredApplication(String clientId, String clientSecret) throws APIApplicationServicesException; AccessTokenInfo generateAccessTokenFromRefreshToken(String refreshToken, String clientId, String clientSecret) throws APIApplicationServicesException; diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/APIApplicationServicesImpl.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/APIApplicationServicesImpl.java index 55c544d25b..c2aa63c432 100644 --- a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/APIApplicationServicesImpl.java +++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/APIApplicationServicesImpl.java @@ -1,48 +1,109 @@ package io.entgra.devicemgt.apimgt.extension.publisher.api; -import com.google.gson.JsonObject; -import io.entgra.devicemgt.apimgt.extension.publisher.api.bean.RegistrationProfile; +import com.google.gson.Gson; +import org.json.JSONObject; import io.entgra.devicemgt.apimgt.extension.publisher.api.constants.Constants; import io.entgra.devicemgt.apimgt.extension.publisher.api.dto.APIApplicationKey; import io.entgra.devicemgt.apimgt.extension.publisher.api.dto.AccessTokenInfo; import io.entgra.devicemgt.apimgt.extension.publisher.api.exceptions.APIApplicationServicesException; -import io.entgra.devicemgt.apimgt.extension.publisher.api.exceptions.BadRequestException; -import io.entgra.devicemgt.apimgt.extension.publisher.api.util.PublisherRESTAPIUtil; import okhttp3.*; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.ssl.Base64; -import org.apache.http.HttpHeaders; -import org.apache.http.HttpResponse; -import org.apache.http.NameValuePair; -import org.apache.http.client.HttpClient; -import org.apache.http.client.entity.UrlEncodedFormEntity; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; -import org.apache.http.message.BasicNameValuePair; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.io.IOException; -import java.net.URL; import java.security.KeyManagementException; -import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; -import java.util.*; public class APIApplicationServicesImpl implements APIApplicationServices { private static final Log log = LogFactory.getLog(APIApplicationServicesImpl.class); <<<<<<< HEAD private static final OkHttpClient client = getOkHttpClient(); + private static final Gson gson = new Gson(); + private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); + String msg = null; + // private ApiApplicationConfigurations ApplicationConfig = null; - private static OkHttpClient getOkHttpClient() { + @Override + public APIApplicationKey createAndRetrieveApplicationCredentials() + throws APIApplicationServicesException { + + JSONObject jsonObject = new JSONObject(); + jsonObject.put("callbackUrl", Constants.EMPTY_STRING); + jsonObject.put("clientName",Constants.CLIENT_NAME); + jsonObject.put("grantType",Constants.GRANT_TYPE); + jsonObject.put("owner",Constants.OWNER); + jsonObject.put("saasApp",true); + + RequestBody requestBody = RequestBody.Companion.create(jsonObject.toString(), JSON); + String keyManagerEndpoint = "https://localhost:9443/client-registration/v0.17/register"; + + Request request = new Request.Builder() + .url(keyManagerEndpoint) + .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Credentials.basic("admin", "admin")) + .post(requestBody) + .build(); + try { + Response response = client.newCall(request).execute(); + return gson.fromJson(response.body().string(), APIApplicationKey.class); + } catch (IOException e) { + msg = "Error occurred while processing the response"; + throw new APIApplicationServicesException(msg); + } + } + + @Override + public AccessTokenInfo generateAccessTokenFromRegisteredApplication(String consumerKey, String consumerSecret) + throws APIApplicationServicesException { + JSONObject params = new JSONObject(); + params.put(Constants.GRANT_TYPE_PARAM_NAME,Constants.PASSWORD_GRANT_TYPE); + //ToDo: Remove hardcoded value + params.put(Constants.PASSWORD_GRANT_TYPE_USERNAME,"admin"); + params.put(Constants.PASSWORD_GRANT_TYPE_PASSWORD,"admin"); + params.put(Constants.SCOPE_PARAM_NAME,Constants.SCOPES); + return getToken(params, consumerKey, consumerSecret); + } + + @Override + public AccessTokenInfo generateAccessTokenFromRefreshToken(String refreshToken, String consumerKey, String consumerSecret) + throws APIApplicationServicesException { + + JSONObject params = new JSONObject(); + params.put(Constants.GRANT_TYPE_PARAM_NAME,Constants.REFRESH_TOKEN_GRANT_TYPE); + //ToDo: Remove hardcoded value + params.put(Constants.REFRESH_TOKEN_GRANT_TYPE_PARAM_NAME, refreshToken); + params.put(Constants.SCOPE_PARAM_NAME,Constants.SCOPES); + return getToken(params, consumerKey, consumerSecret); + } + + public AccessTokenInfo getToken(JSONObject nameValuePairs, String clientId, String clientSecret) + throws APIApplicationServicesException{ + + RequestBody requestBody = RequestBody.Companion.create(nameValuePairs.toString(), JSON); + //application/x-www-form-urlencoded + String keyManagerEndpoint = "https://localhost:9443/oauth2/token"; + + Request request = new Request.Builder() + .url(keyManagerEndpoint) + .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Credentials.basic(clientId, clientSecret)) + .post(requestBody) + .build(); + + try { + Response response = client.newCall(request).execute(); + return gson.fromJson(response.body().string(), AccessTokenInfo.class); + } catch (IOException e) { + msg = "Error occurred while processing the response"; + throw new APIApplicationServicesException(msg); + } + } + + protected static OkHttpClient getOkHttpClient() { X509TrustManager trustAllCerts = new X509TrustManager() { public java.security.cert.X509Certificate[] getAcceptedIssuers() { return new java.security.cert.X509Certificate[0]; @@ -91,6 +152,7 @@ public class APIApplicationServicesImpl implements APIApplicationServices { } } +<<<<<<< HEAD @Override public APIApplicationKey createAndRetrieveApplicationCredentials() throws APIApplicationServicesException, BadRequestException { @@ -285,4 +347,6 @@ public class APIApplicationServicesImpl implements APIApplicationServices { static String getBase64Encode(String key, String value) { return new String(Base64.encodeBase64((key + ":" + value).getBytes())); } +======= +>>>>>>> 2855ef0a30 (change http client to okhttp) } diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherAPIServiceStartupHandler.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherAPIServiceStartupHandler.java deleted file mode 100644 index 2b005b0cc0..0000000000 --- a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherAPIServiceStartupHandler.java +++ /dev/null @@ -1,159 +0,0 @@ -package io.entgra.devicemgt.apimgt.extension.publisher.api; - -import io.entgra.devicemgt.apimgt.extension.publisher.api.dto.AccessTokenInfo; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.wso2.carbon.core.ServerStartupObserver; - -public class PublisherAPIServiceStartupHandler implements ServerStartupObserver { - - private static final Log log = LogFactory.getLog(PublisherAPIServiceStartupHandler.class); - private PublisherRESTAPIServices publisherRESTAPIServices; - private AccessTokenInfo accessTokenInfo; - - @Override - public void completingServerStartup() { - - } - - @Override - public void completedServerStartup() { - -// String cid = null; -// String cS = null; -// String token = null; -// AccessTokenInfo accessTokenInfo = new AccessTokenInfo(); -// -// try { -// URL url = new URL("https://localhost:9443/client-registration/v0.17/register"); -// HttpClient httpclient = PublisherRESTAPIUtil.getHttpClient(url.getProtocol()); -// HttpPost request = new HttpPost(url.toString()); -// -// RegistrationProfile registrationProfile = new RegistrationProfile(); -// registrationProfile.setCallbackUrl(Constants.EMPTY_STRING); -// registrationProfile.setClientName(Constants.CLIENT_NAME); -// registrationProfile.setOwner(Constants.OWNER); -// registrationProfile.setGrantType(Constants.GRANT_TYPE); -// registrationProfile.setIsSaasApp(true); -// -// String jsonString = registrationProfile.toJSON(); -// StringEntity entity = new StringEntity(jsonString, ContentType.APPLICATION_JSON); -// request.setEntity(entity); -// -// String basicAuth = PublisherRESTAPIServices.getBase64Encode("admin", "admin"); -// -// request.setHeader("Authorization", "Basic " + basicAuth); -// request.setHeader("Content-Type", "application/json"); -// -// HttpResponse httpResponse = httpclient.execute(request); -// -// if (httpResponse != null) { -// -// String response = PublisherRESTAPIUtil.getResponseString(httpResponse); -// try { -// if(response != null){ -// JSONParser jsonParser = new JSONParser(); -// JSONObject jsonPayload = (JSONObject) jsonParser.parse(response); -// String clientId = (String) jsonPayload.get(Constants.CLIENT_ID); -// String clientSecret = (String) jsonPayload.get(Constants.CLIENT_SECRET); -// cid = clientId; -// cS = clientSecret; -// } -// } catch (ParseException e) { -// throw new RuntimeException(e); -// } -// -// System.out.println(response); -// } -// System.out.println(httpResponse.getStatusLine().getStatusCode()); -// -// -// } catch (IOException | NoSuchAlgorithmException | KeyStoreException | -// KeyManagementException e) { -// log.error("failed to call http client.", e); -// } -// -// -// String response = null; -// -// List params = new ArrayList<>(); -// params.add(new BasicNameValuePair(Constants.GRANT_TYPE_PARAM_NAME, Constants.PASSWORD_GRANT_TYPE)); -// params.add(new BasicNameValuePair(Constants.PASSWORD_GRANT_TYPE_USERNAME, "admin")); -// params.add(new BasicNameValuePair(Constants.PASSWORD_GRANT_TYPE_PASSWORD, "admin")); -// params.add(new BasicNameValuePair(Constants.SCOPE_PARAM_NAME, Constants.SCOPES)); -// try { -// URL url = new URL("https://localhost:9443/oauth2/token"); -// HttpClient httpclient = PublisherRESTAPIUtil.getHttpClient(url.getProtocol()); -// HttpPost request = new HttpPost(url.toString()); -// -// request.addHeader("Authorization", "Basic " + PublisherRESTAPIServices.getBase64Encode(cid, cS)); -// request.addHeader("Content-Type", "application/x-www-form-urlencoded"); -// request.setEntity(new UrlEncodedFormEntity(params)); -// HttpResponse httpResponse = httpclient.execute(request); -// response = PublisherRESTAPIUtil.getResponseString(httpResponse); -// JSONParser jsonParser = new JSONParser(); -// JSONObject jsonObject = (JSONObject) jsonParser.parse(response); -// token = (String) jsonObject.get(Constants.ACCESS_TOKEN_GRANT_TYPE_PARAM_NAME); -// if (token != null && !token.isEmpty()){ -// accessTokenInfo.setRefreshToken(token); -// accessTokenInfo.setRefreshToken((String) jsonObject.get(Constants.REFRESH_TOKEN_GRANT_TYPE_PARAM_NAME)); -// accessTokenInfo.setExpiresIn((Long) jsonObject.get(Constants.OAUTH_EXPIRES_IN)); -// accessTokenInfo.setTokenType((String) jsonObject.get(Constants.OAUTH_TOKEN_TYPE)); -// accessTokenInfo.setScope((String) jsonObject.get(Constants.OAUTH_TOKEN_SCOPE)); -// } -// System.out.println(accessTokenInfo); -// -// } catch (IOException | KeyStoreException | NoSuchAlgorithmException | -// KeyManagementException| ParseException e) { -// throw new RuntimeException(e); -// } -// -// String key = "perm:sms-handler:view-configuration"; -// String value = new String(Base64.encodeBase64((key).getBytes())).replace("=", ""); -// -// -// String getScopeUrl = "https://localhost:9443/api/am/publisher/v2/scopes/" + value; -// try { -// URL url = new URL(getScopeUrl); -// HttpClient httpclient = PublisherRESTAPIUtil.getHttpClient(url.getProtocol()); -// HttpHead request = new HttpHead(url.toString()); -// -// request.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + token); -// HttpResponse httpResponse = httpclient.execute(request); -// -// String code = String.valueOf(httpResponse.getStatusLine().getStatusCode()); -// System.out.println(code); -// -// } catch (IOException | KeyStoreException | NoSuchAlgorithmException | KeyManagementException e) { -// throw new RuntimeException(e); -// } -// -// String updateScopeUrl = "https://localhost:9443/api/am/publisher/v2/scopes/" + "27fce6f1-6741-4ad5-b700-a56427fd3dbb"; -// try { -// URL url = new URL(updateScopeUrl); -// HttpClient httpclient = PublisherRESTAPIUtil.getHttpClient(url.getProtocol()); -// HttpPut request = new HttpPut(url.toString()); -// -// request.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + token); -// request.setHeader(HttpHeaders.CONTENT_TYPE, "application/json"); -// -// -// String jsonString = "{\"name\": \"" + "name" + "\",\"displayName\": \"" + "displayname" + -// "\", \"description\": \"" + "description" + "\"," + "\"bindings\": [" + -// "\"Internal/devicemgt-user\"]}"; -// StringEntity entity = new StringEntity(jsonString, ContentType.APPLICATION_JSON); -// request.setEntity(entity); -// -// HttpResponse httpResponse = httpclient.execute(request); -// int code = httpResponse.getStatusLine().getStatusCode(); -// System.out.println(code); -// } catch (IOException | KeyStoreException | NoSuchAlgorithmException | KeyManagementException e) { -// throw new RuntimeException(e); -// } - - -// publisherRESTAPIServices = new PublisherRESTAPIServices(); -// publisherRESTAPIServices.isSharedScopeNameExists("perm:sms-handler:view-configuration"); - - } -} diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherRESTAPIServices.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherRESTAPIServices.java index 6e37e01986..a0bb43217d 100644 --- a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherRESTAPIServices.java +++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/PublisherRESTAPIServices.java @@ -5,111 +5,92 @@ import io.entgra.devicemgt.apimgt.extension.publisher.api.dto.APIApplicationKey; import io.entgra.devicemgt.apimgt.extension.publisher.api.dto.AccessTokenInfo; import io.entgra.devicemgt.apimgt.extension.publisher.api.exceptions.APIApplicationServicesException; import io.entgra.devicemgt.apimgt.extension.publisher.api.exceptions.BadRequestException; -import io.entgra.devicemgt.apimgt.extension.publisher.api.util.PublisherRESTAPIUtil; -import io.entgra.devicemgt.apimgt.extension.publisher.api.util.ScopeUtils; +import okhttp3.*; import org.apache.commons.httpclient.HttpStatus; -import org.apache.http.HttpHeaders; -import org.apache.http.client.methods.HttpHead; -import org.apache.http.client.methods.HttpPut; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.ssl.Base64; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; +import org.json.JSONObject; import org.wso2.carbon.apimgt.api.model.Scope; import java.io.IOException; -import java.net.URL; -import java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; +import static io.entgra.devicemgt.apimgt.extension.publisher.api.APIApplicationServicesImpl.getOkHttpClient; public class PublisherRESTAPIServices { private static final Log log = LogFactory.getLog(PublisherRESTAPIServices.class); + private static final OkHttpClient client = getOkHttpClient(); + private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8"); public boolean isSharedScopeNameExists(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, String key) throws APIApplicationServicesException, BadRequestException { String keyValue = new String(Base64.encodeBase64((key).getBytes())).replace("=", ""); String getScopeUrl = "https://localhost:9443/api/am/publisher/v2/scopes/" + keyValue; - try { - URL url = new URL(getScopeUrl); - HttpClient httpclient = PublisherRESTAPIUtil.getHttpClient(url.getProtocol()); - HttpHead request = new HttpHead(url.toString()); - - request.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + accessTokenInfo.getAccessToken()); - HttpResponse httpResponse = httpclient.execute(request); - if (HttpStatus.SC_OK == httpResponse.getStatusLine().getStatusCode()){ + Request request = new Request.Builder() + .url(getScopeUrl) + .addHeader(Constants.AUTHORIZATION_HEADER_NAME, "Bearer " + accessTokenInfo.getAccessToken()) + .head() + .build(); + try { + Response response = client.newCall(request).execute(); + if (response.code() == HttpStatus.SC_OK){ return true; - } else if(HttpStatus.SC_UNAUTHORIZED == httpResponse.getStatusLine().getStatusCode()) { + }else if(HttpStatus.SC_UNAUTHORIZED == response.code()) { APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); AccessTokenInfo refreshedAccessToken = apiApplicationServices. generateAccessTokenFromRefreshToken(accessTokenInfo.getRefreshToken(), apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret() ); + //max attempt count return isSharedScopeNameExists(apiApplicationKey,refreshedAccessToken, key); - } else if (HttpStatus.SC_BAD_REQUEST == httpResponse.getStatusLine().getStatusCode()){ - String response = httpResponse.toString(); + } else if (HttpStatus.SC_BAD_REQUEST == response.code()){ log.info(response); - throw new BadRequestException(response); + throw new BadRequestException(response.toString()); } else { return false; } - } catch (IOException e) { - throw new APIApplicationServicesException("Error when reading the response from buffer.", e); - } catch (KeyStoreException e) { - throw new APIApplicationServicesException("Failed loading the keystore.", e); - } catch (NoSuchAlgorithmException e) { - throw new APIApplicationServicesException("No such algorithm found when loading the ssl socket", e); - } catch (KeyManagementException e) { - throw new APIApplicationServicesException("Failed setting up the ssl http client.", e); + String msg = "Error occurred while processing the response"; + throw new APIApplicationServicesException(msg); } } - public void updateSharedScope(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, Scope scope) + public boolean updateSharedScope(APIApplicationKey apiApplicationKey, AccessTokenInfo accessTokenInfo, Scope scope) throws APIApplicationServicesException, BadRequestException { String updateScopeUrl = "https://localhost:9443/api/am/publisher/v2/scopes/" + scope.getId(); - try { - URL url = new URL(updateScopeUrl); - HttpClient httpclient = PublisherRESTAPIUtil.getHttpClient(url.getProtocol()); - HttpPut request = new HttpPut(url.toString()); - request.setHeader(HttpHeaders.AUTHORIZATION, Constants.AUTHORIZATION_HEADER_PREFIX_BEARER + - accessTokenInfo.getAccessToken()); - request.setHeader(HttpHeaders.CONTENT_TYPE, Constants.APPLICATION_JSON); + JSONObject setScope = new JSONObject(); + setScope.put("name", scope.getKey()); + setScope.put("displayName", scope.getName()); + setScope.put("description", scope.getDescription()); + setScope.put("bindings", scope.getRoles()); + - ScopeUtils setScope = new ScopeUtils(); - setScope.setKey(scope.getKey()); - setScope.setName(scope.getName()); - setScope.setDescription(scope.getDescription()); - setScope.setRoles(scope.getRoles()); - String jsonString = setScope.toJSON(); - StringEntity entity = new StringEntity(jsonString, ContentType.APPLICATION_JSON); - request.setEntity(entity); + RequestBody requestBody = RequestBody.Companion.create(setScope.toString(), JSON); + Request request = new Request.Builder() + .url(updateScopeUrl) + .addHeader(Constants.AUTHORIZATION_HEADER_NAME, "Bearer " + accessTokenInfo.getAccessToken()) + .put(requestBody) + .build(); - HttpResponse httpResponse = httpclient.execute(request); - if (HttpStatus.SC_OK != httpResponse.getStatusLine().getStatusCode() && HttpStatus.SC_UNAUTHORIZED == httpResponse.getStatusLine().getStatusCode()){ + try { + Response response = client.newCall(request).execute(); + if (response.code() == HttpStatus.SC_OK) { + return true; + } else if (HttpStatus.SC_UNAUTHORIZED == response.code()) { APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); - AccessTokenInfo accessTokenInfo1 = apiApplicationServices. - generateAccessTokenFromRefreshToken(accessTokenInfo.getRefreshToken(), apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret() ); - updateSharedScope(apiApplicationKey, accessTokenInfo1, scope); - } else if (HttpStatus.SC_BAD_REQUEST == httpResponse.getStatusLine().getStatusCode()){ - String response = httpResponse.toString(); + AccessTokenInfo refreshedAccessToken = apiApplicationServices. + generateAccessTokenFromRefreshToken(accessTokenInfo.getRefreshToken(), apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret()); + return updateSharedScope(apiApplicationKey, refreshedAccessToken, scope); + } else if (HttpStatus.SC_BAD_REQUEST == response.code()) { log.info(response); - throw new BadRequestException(response); + throw new BadRequestException(response.toString()); + } else { + return false; } - } catch (IOException e) { - throw new APIApplicationServicesException("Error when reading the response from buffer.", e); - } catch (KeyStoreException e) { - throw new APIApplicationServicesException("Failed loading the keystore.", e); - } catch (NoSuchAlgorithmException e) { - throw new APIApplicationServicesException("No such algorithm found when loading the ssl socket", e); - } catch (KeyManagementException e) { - throw new APIApplicationServicesException("Failed setting up the ssl http client.", e); + String msg = "Error occurred while processing the response"; + throw new APIApplicationServicesException(msg); } } } diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/dto/APIApplicationKey.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/dto/APIApplicationKey.java index fdd20f2f22..d0fc3b9f68 100644 --- a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/dto/APIApplicationKey.java +++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/dto/APIApplicationKey.java @@ -4,9 +4,20 @@ package io.entgra.devicemgt.apimgt.extension.publisher.api.dto; * This holds api application consumer id and secret. */ public class APIApplicationKey { - + private String clientName; private String clientId; private String clientSecret; + private String callBackURL; + private String isSaasApplication; + private String appOwner; + private String jsonString; + private String jsonAppAttribute; + private String tokenType; + + public APIApplicationKey(String clientId, String clientSecret){ + this.clientId = clientId; + this.clientSecret = clientSecret; + } public String getClientId() { return clientId; @@ -23,4 +34,61 @@ public class APIApplicationKey { public void setClientSecret(String clientSecret) { this.clientSecret = clientSecret; } + public String getClientName() { + return clientName; + } + + public void setClientName(String clientName) { + this.clientName = clientName; + } + + + public String getCallBackURL() { + return callBackURL; + } + + public void setCallBackURL(String callBackURL) { + this.callBackURL = callBackURL; + } + + public String getIsSaasApplication() { + return isSaasApplication; + } + + public void setIsSaasApplication(String isSaasApplication) { + this.isSaasApplication = isSaasApplication; + } + + public String getAppOwner() { + return appOwner; + } + + public void setAppOwner(String appOwner) { + this.appOwner = appOwner; + } + + public String getJsonString() { + return jsonString; + } + + public void setJsonString(String jsonString) { + this.jsonString = jsonString; + } + + public String getJsonAppAttribute() { + return jsonAppAttribute; + } + + public void setJsonAppAttribute(String jsonAppAttribute) { + this.jsonAppAttribute = jsonAppAttribute; + } + + public String getTokenType() { + return tokenType; + } + + public void setTokenType(String tokenType) { + this.tokenType = tokenType; + } + } diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/exceptions/BadRequestException.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/exceptions/BadRequestException.java index 1e58e27d7b..427c4b5e35 100644 --- a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/exceptions/BadRequestException.java +++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/exceptions/BadRequestException.java @@ -24,6 +24,8 @@ */ package io.entgra.devicemgt.apimgt.extension.publisher.api.exceptions; +import okhttp3.Response; + public class BadRequestException extends Exception { private static final long serialVersionUID = -2387103750774855056L; diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/internal/PublisherRESTAPIDataHolder.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/internal/PublisherRESTAPIDataHolder.java new file mode 100644 index 0000000000..885f3ead7a --- /dev/null +++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/internal/PublisherRESTAPIDataHolder.java @@ -0,0 +1,30 @@ +package io.entgra.devicemgt.apimgt.extension.publisher.api.internal; + +import io.entgra.devicemgt.apimgt.extension.publisher.api.APIApplicationServices; +import io.entgra.devicemgt.apimgt.extension.publisher.api.PublisherRESTAPIServices; + +public class PublisherRESTAPIDataHolder { + + private static final PublisherRESTAPIDataHolder thisInstance = new PublisherRESTAPIDataHolder(); + + private APIApplicationServices apiApplicationServices; +// +// private PublisherRESTAPIServices publisherRESTAPIServices; + + public static PublisherRESTAPIDataHolder getInstance(){ + return thisInstance; + } + public APIApplicationServices getApiApplicationServices() { + return apiApplicationServices; + } + public void setApiApplicationServices(APIApplicationServices apiApplicationServices) { + this.apiApplicationServices = apiApplicationServices; + } +// public PublisherRESTAPIServices getPublisherRESTAPIServices() { +// return publisherRESTAPIServices; +// } +// public void setPublisherRESTAPIServices(PublisherRESTAPIServices publisherRESTAPIServices) { +// this.publisherRESTAPIServices = publisherRESTAPIServices; +// } + +} diff --git a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/internal/PublisherRESTAPIServiceComponent.java b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/internal/PublisherRESTAPIServiceComponent.java index 612f77a8d9..d34012c1f4 100644 --- a/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/internal/PublisherRESTAPIServiceComponent.java +++ b/components/apimgt-extensions/io.entgra.devicemgt.apimgt.extension.publisher.api/src/main/java/io.entgra.devicemgt.apimgt.extension.publisher.api/internal/PublisherRESTAPIServiceComponent.java @@ -1,13 +1,12 @@ package io.entgra.devicemgt.apimgt.extension.publisher.api.internal; +import io.entgra.devicemgt.apimgt.extension.publisher.api.APIApplicationServices; +import io.entgra.devicemgt.apimgt.extension.publisher.api.APIApplicationServicesImpl; import io.entgra.devicemgt.apimgt.extension.publisher.api.PublisherRESTAPIServices; -import io.entgra.devicemgt.apimgt.extension.publisher.api.PublisherAPIServiceStartupHandler; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.osgi.framework.BundleContext; import org.osgi.service.component.ComponentContext; -import org.wso2.carbon.core.ServerShutdownHandler; -import org.wso2.carbon.core.ServerStartupObserver; /** * @scr.component name="io.entgra.devicemgt.apimgt.extension.publisher.api.internal.PublisherRESTAPIServiceComponent" @@ -24,17 +23,19 @@ public class PublisherRESTAPIServiceComponent { try { BundleContext bundleContext = componentContext.getBundleContext(); - PublisherAPIServiceStartupHandler publisherAPIServiceStartupHandler = new PublisherAPIServiceStartupHandler(); - bundleContext.registerService(PublisherAPIServiceStartupHandler.class.getName(), publisherAPIServiceStartupHandler, null); - bundleContext.registerService(ServerStartupObserver.class.getName(), publisherAPIServiceStartupHandler, null); - bundleContext.registerService(ServerShutdownHandler.class.getName(), publisherAPIServiceStartupHandler, null); - - PublisherRESTAPIServices publisherRESTAPIServices = new PublisherRESTAPIServices(); - bundleContext.registerService(PublisherRESTAPIServices.class.getName(), publisherRESTAPIServices, null); +// PublisherRESTAPIServices publisherRESTAPIServices = new PublisherRESTAPIServices(); +// bundleContext.registerService(PublisherRESTAPIServices.class.getName(), publisherRESTAPIServices, null); +// PublisherRESTAPIDataHolder.getInstance().setPublisherRESTAPIServices(publisherRESTAPIServices); + APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); + bundleContext.registerService(APIApplicationServices.class.getName(), apiApplicationServices, null); + PublisherRESTAPIDataHolder.getInstance().setApiApplicationServices(apiApplicationServices); + if (log.isDebugEnabled()) { + log.debug("API Application bundle has been successfully initialized"); + } } catch (Exception e) { - throw new RuntimeException(e); + log.error("Error occurred while initializing API Application bundle", e); } } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/pom.xml b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/pom.xml index 0ca58492f5..d9246c253a 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/pom.xml +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/pom.xml @@ -126,6 +126,10 @@ org.wso2.carbon.devicemgt io.entgra.devicemgt.apimgt.extension.publisher.api + + org.wso2.carbon.devicemgt + io.entgra.devicemgt.apimgt.extension.publisher.api + @@ -171,6 +175,7 @@ org.w3c.dom, io.entgra.devicemgt.apimgt.extension.publisher.api, io.entgra.devicemgt.apimgt.extension.publisher.api.dto, + io.entgra.devicemgt.apimgt.extension.publisher.api.exceptions, org.wso2.carbon.apimgt.annotations.api, org.wso2.carbon.apimgt.api, org.wso2.carbon.apimgt.api.model, diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherServiceImpl.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherServiceImpl.java index c6f16436a1..2fe4883df5 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherServiceImpl.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherServiceImpl.java @@ -371,12 +371,10 @@ public class APIPublisherServiceImpl implements APIPublisherService { apiApplicationKey = apiApplicationServices.createAndRetrieveApplicationCredentials(); accessTokenInfo = apiApplicationServices.generateAccessTokenFromRegisteredApplication( apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret()); - } catch (BadRequestException e) { + } catch (APIApplicationServicesException e) { String errorMsg = "Error while generating application"; log.error(errorMsg, e); throw new APIManagerPublisherException(e); - } catch (APIApplicationServicesException e) { - throw new RuntimeException(e); } try { @@ -384,9 +382,6 @@ public class APIPublisherServiceImpl implements APIPublisherService { PrivilegedCarbonContext.startTenantFlow(); PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(tenantDomain, true); PublisherRESTAPIServices publisherRESTAPIServices = new PublisherRESTAPIServices(); -// APIProvider apiProvider = API_MANAGER_FACTORY.getAPIProvider(MultitenantUtils.getTenantAwareUsername( -// PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm().getRealmConfiguration() -// .getAdminUserName())); try { String fileName = @@ -447,7 +442,7 @@ public class APIPublisherServiceImpl implements APIPublisherService { } catch (IOException | DirectoryIteratorException ex) { log.error("failed to read scopes from file.", ex); } catch (APIApplicationServicesException | BadRequestException e) { - String errorMsg = "Error while generating an OAuth token"; + String errorMsg = "Error while Calling APIs"; log.error(errorMsg, e); throw new APIManagerPublisherException(e); } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherStartupHandler.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherStartupHandler.java index a530fa5b47..3933f60716 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherStartupHandler.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.webapp.publisher/src/main/java/org/wso2/carbon/apimgt/webapp/publisher/APIPublisherStartupHandler.java @@ -19,6 +19,11 @@ package org.wso2.carbon.apimgt.webapp.publisher; +import io.entgra.devicemgt.apimgt.extension.publisher.api.APIApplicationServices; +import io.entgra.devicemgt.apimgt.extension.publisher.api.APIApplicationServicesImpl; +import io.entgra.devicemgt.apimgt.extension.publisher.api.dto.APIApplicationKey; +import io.entgra.devicemgt.apimgt.extension.publisher.api.dto.AccessTokenInfo; +import io.entgra.devicemgt.apimgt.extension.publisher.api.exceptions.APIApplicationServicesException; import io.entgra.devicemgt.apimgt.extension.publisher.api.exceptions.BadRequestException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -53,10 +58,7 @@ public class APIPublisherStartupHandler implements ServerStartupObserver { log.debug("Total number of unpublished APIs: " + APIPublisherDataHolder.getInstance().getUnpublishedApis().size()); } - try { - } catch (Exception e) { - throw new RuntimeException(e); - } + publisher = APIPublisherDataHolder.getInstance().getApiPublisherService(); int retryCount = 0; while (retryCount < MAX_RETRY_COUNT && (!failedAPIsStack.isEmpty() || !currentAPIsStack.isEmpty())) { diff --git a/components/apimgt-extensions/pom.xml b/components/apimgt-extensions/pom.xml index 747eb843dd..ae822fd4eb 100644 --- a/components/apimgt-extensions/pom.xml +++ b/components/apimgt-extensions/pom.xml @@ -25,52 +25,6 @@ 5.0.26-SNAPSHOT ../../pom.xml - - - org.apache.httpcomponents.wso2 - httpcore - - - org.wso2.orbit.org.apache.httpcomponents - httpclient - - - org.wso2.carbon - org.wso2.carbon.logging - - - org.wso2.carbon - org.wso2.carbon.utils - - - org.eclipse.osgi - org.eclipse.osgi - - - org.eclipse.osgi - org.eclipse.osgi.services - - - org.wso2.carbon - org.wso2.carbon.core - - - com.googlecode.json-simple.wso2 - json-simple - - - org.wso2.carbon.apimgt - org.wso2.carbon.apimgt.api - - - com.squareup.okhttp3 - okhttp - - - io.github.openfeign - feign-okhttp - - 4.0.0 apimgt-extensions