From 2c7a40ac57e75c5eedf388265e1044011ae936f7 Mon Sep 17 00:00:00 2001 From: shamalka Date: Tue, 19 Dec 2023 17:05:39 +0530 Subject: [PATCH] Add scope retrieval to tenantcreateobserver --- .../rest/api/APIApplicationServices.java | 1 + .../rest/api/APIApplicationServicesImpl.java | 92 +++++++++++++++++++ .../core/internal/TenantCreateObserver.java | 66 ++++++++----- 3 files changed, 138 insertions(+), 21 deletions(-) diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/APIApplicationServices.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/APIApplicationServices.java index d628c4ce25..b47edc6c21 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/APIApplicationServices.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/APIApplicationServices.java @@ -25,6 +25,7 @@ import io.entgra.device.mgt.core.apimgt.extension.rest.api.exceptions.APIService public interface APIApplicationServices { APIApplicationKey createAndRetrieveApplicationCredentials() throws APIServicesException; + void createAndRetrieveApplicationCredentialsAndGenerateToken() throws APIServicesException; AccessTokenInfo generateAccessTokenFromRegisteredApplication(String clientId, String clientSecret) throws APIServicesException; diff --git a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/APIApplicationServicesImpl.java b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/APIApplicationServicesImpl.java index fa0462945e..4d559b1a70 100644 --- a/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/APIApplicationServicesImpl.java +++ b/components/apimgt-extensions/io.entgra.device.mgt.core.apimgt.extension.rest.api/src/main/java/io/entgra/device/mgt/core/apimgt/extension/rest/api/APIApplicationServicesImpl.java @@ -19,6 +19,9 @@ package io.entgra.device.mgt.core.apimgt.extension.rest.api; import com.google.gson.Gson; +import io.entgra.device.mgt.core.apimgt.extension.rest.api.dto.APIInfo.Scope; +import io.entgra.device.mgt.core.apimgt.extension.rest.api.exceptions.BadRequestException; +import io.entgra.device.mgt.core.apimgt.extension.rest.api.exceptions.UnexpectedResponseException; import io.entgra.device.mgt.core.apimgt.extension.rest.api.internal.APIManagerServiceDataHolder; import org.json.JSONObject; import io.entgra.device.mgt.core.apimgt.extension.rest.api.util.HttpsTrustManagerUtils; @@ -62,9 +65,12 @@ public class APIApplicationServicesImpl implements APIApplicationServices { public APIApplicationKey createAndRetrieveApplicationCredentials() throws APIServicesException { + log.error("=====createAndRetrieveApplicationCredentials=====1"); + String serverUser = null; String serverPassword = null; try { + log.error("=====createAndRetrieveApplicationCredentials=====2"); UserRealm userRealm = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm(); String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); UserStoreManager userStoreManager = userRealm.getUserStoreManager(); @@ -72,9 +78,11 @@ public class APIApplicationServicesImpl implements APIApplicationServices { createUserIfNotExists(Constants.RESERVED_USER_NAME, Constants.RESERVED_USER_PASSWORD, userStoreManager); if(tenantDomain.equals("carbon.super")) { + log.error("=====createAndRetrieveApplicationCredentials=====3"); serverUser = config.getFirstProperty(Constants.SERVER_USER); serverPassword = config.getFirstProperty(Constants.SERVER_PASSWORD); } else { + log.error("=====createAndRetrieveApplicationCredentials=====4"); serverUser = Constants.RESERVED_USER_NAME + "@" + tenantDomain; serverPassword = Constants.RESERVED_USER_PASSWORD; } @@ -84,6 +92,8 @@ public class APIApplicationServicesImpl implements APIApplicationServices { String applicationEndpoint = config.getFirstProperty(Constants.DCR_END_POINT); + log.error("=====createAndRetrieveApplicationCredentials=====5"); + JSONObject jsonObject = new JSONObject(); jsonObject.put("callbackUrl", Constants.EMPTY_STRING); jsonObject.put("clientName", Constants.CLIENT_NAME); @@ -91,14 +101,21 @@ public class APIApplicationServicesImpl implements APIApplicationServices { jsonObject.put("owner", serverUser); jsonObject.put("saasApp", true); + log.error("=====createAndRetrieveApplicationCredentials=====6"); + RequestBody requestBody = RequestBody.Companion.create(jsonObject.toString(), JSON); Request request = new Request.Builder() .url(applicationEndpoint) .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Credentials.basic(serverUser, serverPassword)) .post(requestBody) .build(); + + log.error("=====createAndRetrieveApplicationCredentials=====7"); + try { + log.error("=====createAndRetrieveApplicationCredentials=====8"); try (Response response = client.newCall(request).execute()) { + log.error("=====createAndRetrieveApplicationCredentials=====9"); return gson.fromJson(response.body().string(), APIApplicationKey.class); } } catch (IOException e) { @@ -108,6 +125,81 @@ public class APIApplicationServicesImpl implements APIApplicationServices { } } + @Override + public void createAndRetrieveApplicationCredentialsAndGenerateToken() + throws APIServicesException { + + log.error("=====createAndRetrieveApplicationCredentials=====1"); + + String serverUser = null; + String serverPassword = null; + try { + log.error("=====createAndRetrieveApplicationCredentials=====2"); + UserRealm userRealm = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm(); + String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + UserStoreManager userStoreManager = userRealm.getUserStoreManager(); + + createUserIfNotExists(Constants.RESERVED_USER_NAME, Constants.RESERVED_USER_PASSWORD, userStoreManager); + + if(tenantDomain.equals("carbon.super")) { + log.error("=====createAndRetrieveApplicationCredentials=====3"); + serverUser = config.getFirstProperty(Constants.SERVER_USER); + serverPassword = config.getFirstProperty(Constants.SERVER_PASSWORD); + } else { + log.error("=====createAndRetrieveApplicationCredentials=====4"); + serverUser = Constants.RESERVED_USER_NAME + "@" + tenantDomain; + serverPassword = Constants.RESERVED_USER_PASSWORD; + } + } catch (UserStoreException e) { + throw new RuntimeException(e); + } + + String applicationEndpoint = config.getFirstProperty(Constants.DCR_END_POINT); + + log.error("=====createAndRetrieveApplicationCredentials=====5"); + + 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", serverUser); + jsonObject.put("saasApp", true); + + log.error("=====createAndRetrieveApplicationCredentials=====6"); + + RequestBody requestBody = RequestBody.Companion.create(jsonObject.toString(), JSON); + Request request = new Request.Builder() + .url(applicationEndpoint) + .addHeader(Constants.AUTHORIZATION_HEADER_NAME, Credentials.basic(serverUser, serverPassword)) + .post(requestBody) + .build(); + + log.error("=====createAndRetrieveApplicationCredentials=====7"); + + try { + log.error("=====createAndRetrieveApplicationCredentials=====8"); + try (Response response = client.newCall(request).execute()) { + log.error("=====createAndRetrieveApplicationCredentials=====9"); + APIApplicationKey apiApplicationKey = gson.fromJson(response.body().string(), APIApplicationKey.class); + AccessTokenInfo accessTokenInfo = generateAccessTokenFromRegisteredApplication( + apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret()); + + PublisherRESTAPIServices publisherRESTAPIServices = new PublisherRESTAPIServicesImpl(); + + Scope[] scopes = publisherRESTAPIServices.getScopes(apiApplicationKey, accessTokenInfo); + + } catch (BadRequestException e) { + throw new RuntimeException(e); + } catch (UnexpectedResponseException e) { + throw new RuntimeException(e); + } + } catch (IOException e) { + msg = "Error occurred while processing the response"; + log.error(msg, e); + throw new APIServicesException(e); + } + } + @Override public AccessTokenInfo generateAccessTokenFromRegisteredApplication(String consumerKey, String consumerSecret) throws APIServicesException { diff --git a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/internal/TenantCreateObserver.java b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/internal/TenantCreateObserver.java index 47329ccf1a..395d9ceda6 100644 --- a/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/internal/TenantCreateObserver.java +++ b/components/device-mgt/io.entgra.device.mgt.core.device.mgt.core/src/main/java/io/entgra/device/mgt/core/device/mgt/core/internal/TenantCreateObserver.java @@ -46,12 +46,16 @@ import org.wso2.carbon.utils.multitenancy.MultitenantUtils; import java.security.SecureRandom; import java.util.Stack; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; /** * Load configuration files to tenant's registry. */ public class TenantCreateObserver extends AbstractAxis2ConfigurationContextObserver { private static final Log log = LogFactory.getLog(TenantCreateObserver.class); + private final ExecutorService executor = Executors.newSingleThreadExecutor(); + /** @@ -104,22 +108,26 @@ public class TenantCreateObserver extends AbstractAxis2ConfigurationContextObser // createUserIfNotExists("test_reserved_user", password, userStoreManager); + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + createApplication(tenantDomain); + } catch (TenantManagementException e) { + throw new RuntimeException(e); + } + } + }); + thread.start(); - PublisherRESTAPIServices publisherRESTAPIServices = new PublisherRESTAPIServicesImpl(); - APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); - APIApplicationKey apiApplicationKey = null; - AccessTokenInfo accessTokenInfo = null; - try { - apiApplicationKey = apiApplicationServices.createAndRetrieveApplicationCredentials(); - accessTokenInfo = apiApplicationServices.generateAccessTokenFromRegisteredApplication( - apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret()); - } catch (APIServicesException e) { - String errorMsg = "Error occurred while generating the API application"; - log.error(errorMsg, e); - throw new TenantManagementException(errorMsg, e); - } - Scope[] scopes = publisherRESTAPIServices.getScopes(apiApplicationKey, accessTokenInfo); +// executor.submit(() -> { +// try { +// createApplication(); +// } catch (TenantManagementException e) { +// throw new RuntimeException(e); +// } +// }); if (log.isDebugEnabled()) { @@ -130,17 +138,33 @@ public class TenantCreateObserver extends AbstractAxis2ConfigurationContextObser " is assigned to the role:" + User.DEFAULT_DEVICE_ADMIN + "." ); } - } catch (UserStoreException | TenantManagementException e) { + } catch (UserStoreException e) { log.error("Error occurred while creating roles for the tenant: " + tenantDomain + "."); - } catch (BadRequestException e) { - throw new RuntimeException(e); - } catch (UnexpectedResponseException e) { - throw new RuntimeException(e); - } catch (APIServicesException e) { - throw new RuntimeException(e); } } + + private void createApplication(String tenantDomain) throws TenantManagementException { + PrivilegedCarbonContext.startTenantFlow(); + PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(tenantDomain, true); + + PublisherRESTAPIServices publisherRESTAPIServices = new PublisherRESTAPIServicesImpl(); + APIApplicationServices apiApplicationServices = new APIApplicationServicesImpl(); + APIApplicationKey apiApplicationKey = null; + AccessTokenInfo accessTokenInfo = null; + try { + apiApplicationServices.createAndRetrieveApplicationCredentialsAndGenerateToken(); +// log.error("apiApplicationKey: " + apiApplicationKey.getClientId()); +// log.error("apiApplicationKey: " + apiApplicationKey.getClientSecret()); +// accessTokenInfo = apiApplicationServices.generateAccessTokenFromRegisteredApplication( +// apiApplicationKey.getClientId(), apiApplicationKey.getClientSecret()); + } catch (APIServicesException e) { + String errorMsg = "Error occurred while generating the API application"; + log.error(errorMsg, e); + throw new TenantManagementException(errorMsg, e); + } +// Scope[] scopes = publisherRESTAPIServices.getScopes(apiApplicationKey, accessTokenInfo); + } private void createUserIfNotExists(String username, String password, UserStoreManager userStoreManager) { try {