From a9888b5cf7964ae111d160b06c3f9472ae2b9971 Mon Sep 17 00:00:00 2001 From: kamidu Date: Tue, 18 Apr 2017 10:58:51 +0530 Subject: [PATCH 1/4] adding device cloud header --- .../app/units/cdmf.unit.ui.title/title.hbs | 6 +++++- .../app/units/cdmf.unit.ui.title/title.js | 8 ++++++++ .../app/units/uuf.unit.favicon/favicon.hbs | 6 +++++- .../app/units/uuf.unit.favicon/favicon.js | 8 ++++++++ .../uuf.unit.favicon/public/img/cloud-favicon.png | Bin 0 -> 882 bytes 5 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.ui.title/title.js create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.favicon/favicon.js create mode 100644 components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.favicon/public/img/cloud-favicon.png diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.ui.title/title.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.ui.title/title.hbs index 5fbe77d385..f3f413e962 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.ui.title/title.hbs +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.ui.title/title.hbs @@ -17,5 +17,9 @@ }} {{#zone "title"}} - {{@unit.params.pageTitle}} | {{@app.conf.appName}} + {{#if isCloud}} + {{@unit.params.pageTitle}} | WSO2 Device Cloud + {{else}} + {{@unit.params.pageTitle}} | {{@app.conf.appName}} + {{/if}} {{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.ui.title/title.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.ui.title/title.js new file mode 100644 index 0000000000..76da4c18f0 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.ui.title/title.js @@ -0,0 +1,8 @@ +function onRequest(context) { + + var deviceMgtProps = require("/app/modules/conf-reader/main.js")["conf"]; + var viewModel = {}; + viewModel.isCloud = deviceMgtProps.isCloud; + return viewModel; + +} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.favicon/favicon.hbs b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.favicon/favicon.hbs index 8274b5e66f..4e56417553 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.favicon/favicon.hbs +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.favicon/favicon.hbs @@ -16,5 +16,9 @@ under the License. }} {{#zone "favicon"}} - + {{#if isCloud}} + + {{else}} + + {{/if}} {{/zone}} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.favicon/favicon.js b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.favicon/favicon.js new file mode 100644 index 0000000000..76da4c18f0 --- /dev/null +++ b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.favicon/favicon.js @@ -0,0 +1,8 @@ +function onRequest(context) { + + var deviceMgtProps = require("/app/modules/conf-reader/main.js")["conf"]; + var viewModel = {}; + viewModel.isCloud = deviceMgtProps.isCloud; + return viewModel; + +} \ No newline at end of file diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.favicon/public/img/cloud-favicon.png b/components/device-mgt/org.wso2.carbon.device.mgt.ui/src/main/resources/jaggeryapps/uuf-template-app/app/units/uuf.unit.favicon/public/img/cloud-favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..e9d327e61341679d4051e445a95396552b2d4bd7 GIT binary patch literal 882 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyEa{HEjtmSN`?>!lvVtU&J%W50 z7^>757#dm_7=8hT8eT9klo~KFyh>nTu$sZZAYL$MSD+10;$eVKh%1m@zH$v30t!L^ zP#nmBkZ=)*Vl6H0^2%x(8(T4P@%+MKh#*uOSW8D|kEfS6P#I7#BP+*OjjP&Dz*e5) zS+U&LYK0$jB5La!`8k-5r$~M4vHAD?`ev@A!&Pv7cL;_V3@nr!QyHljN+&oXX~cI)+j^sS0N)z4j$sW$m%{i$ay zCuHAz|GaF{g>QS;zj@}%&A`>}zT079Zke)ZnLy&K?Qgc|o__V=Sp|E-{Y`?qJGO0g zed4WJ$o}Aqz(#wCOPilFyjVH^@h`WD{mCzrT;?oc_&w!7a Date: Wed, 19 Apr 2017 22:05:25 +0530 Subject: [PATCH 2/4] Refactoring to use APIManager DCR This commit is done to refactor the Auth application creation process to use the APIManager Key manager client registration endpoint instead of IOT DCR endpoint. --- .../carbon/apimgt/handlers/beans/DCR.java | 28 ++++++++++++--- .../apimgt/handlers/utils/AuthConstants.java | 10 ++++++ .../carbon/apimgt/handlers/utils/Utils.java | 35 +++++++++---------- 3 files changed, 51 insertions(+), 22 deletions(-) diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/beans/DCR.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/beans/DCR.java index 4091afcb9e..ae5e42b59a 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/beans/DCR.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/beans/DCR.java @@ -24,14 +24,12 @@ package org.wso2.carbon.apimgt.handlers.beans; */ public class DCR { - // Owner of the application + private String callbackUrl; private String owner; - // Client name private String clientName; - // Oauth Grant type private String grantType; - // Scope of the token private String tokenScope; + private boolean isSaasApp; public String getOwner() { return owner; @@ -64,5 +62,27 @@ public class DCR { public void setTokenScope(String tokenScope) { this.tokenScope = tokenScope; } + + public boolean getIsSaasApp() { + return isSaasApp; + } + + public void setIsSaasApp(boolean isSaasApp) { + this.isSaasApp = isSaasApp; + } + + public String getCallbackUrl() { + return callbackUrl; + } + + public void setCallbackUrl(String callbackUrl) { + this.callbackUrl = callbackUrl; + } + + public String toJSON() { + return "{\"callbackUrl\": \"" + callbackUrl + "\",\"clientName\": \"" + clientName + "\", \"tokenScope\": " + + "\"" + tokenScope + "\", \"owner\": \"" + owner + "\"," + "\"grantType\": \"" + grantType + + "\", \"saasApp\" :" + isSaasApp + " }\n"; + } } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/utils/AuthConstants.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/utils/AuthConstants.java index 531c7c11d5..a1343c312b 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/utils/AuthConstants.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/utils/AuthConstants.java @@ -36,4 +36,14 @@ public class AuthConstants { public static final String MDM_SIGNATURE = "mdm-signature"; public static final String PROXY_MUTUAL_AUTH_HEADER = "proxy-mutual-auth-header"; public static final String ENCODED_PEM = "encoded-pem"; + public static final String CALLBACK_URL = ""; + public static final String CLIENT_NAME = "IOT-API-MANAGER"; + public static final String GRANT_TYPE = "refresh_token password client_credentials"; + public static final String TOKEN_SCOPE = "default"; + public static final String CONTENT_TYPE_HEADER = "Content-Type"; + public static final String CONTENT_TYPE = "application/json"; + public static final String AUTHORIZATION_HEADER = "Authorization"; + public static final String BASIC_AUTH_PREFIX = "Basic "; + public static final String CLIENT_ID = "clientId"; + public static final String CLIENT_SECRET = "clientSecret"; } diff --git a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/utils/Utils.java b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/utils/Utils.java index 3e66ed7edd..d3c8ad3a9f 100644 --- a/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/utils/Utils.java +++ b/components/apimgt-extensions/org.wso2.carbon.apimgt.handlers/src/main/java/org/wso2/carbon/apimgt/handlers/utils/Utils.java @@ -19,7 +19,6 @@ package org.wso2.carbon.apimgt.handlers.utils; -import com.google.gson.Gson; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.ws.security.util.Base64; @@ -118,8 +117,7 @@ public class Utils { tokenHeaders.put("Content-Type", "application/x-www-form-urlencoded"); RESTInvoker restInvoker = new RESTInvoker(); - RESTResponse response = restInvoker.invokePOST(tokenUrl, tokenHeaders, null, - null, tokenContent); + RESTResponse response = restInvoker.invokePOST(tokenUrl, tokenHeaders, null, null, tokenContent); if(log.isDebugEnabled()) { log.debug("Token response:" + response.getContent()); } @@ -144,31 +142,32 @@ public class Utils { private static void getClientSecretes(IOTServerConfiguration iotServerConfiguration) throws APIMCertificateMGTException { try { + String username = iotServerConfiguration.getUsername(); + String password = iotServerConfiguration.getPassword(); DCR dcr = new DCR(); dcr.setOwner(iotServerConfiguration.getUsername()); - dcr.setClientName("IOT-API-MANAGER"); - dcr.setGrantType("refresh_token password client_credentials"); - dcr.setTokenScope("default"); - Gson gson = new Gson(); - String dcrContent = gson.toJson(dcr); - Map drcHeaders = new HashMap(); - drcHeaders.put("Content-Type", "application/json"); + dcr.setClientName(AuthConstants.CLIENT_NAME); + dcr.setGrantType(AuthConstants.GRANT_TYPE); + dcr.setTokenScope(AuthConstants.TOKEN_SCOPE); + dcr.setCallbackUrl(AuthConstants.CALLBACK_URL); + dcr.setIsSaasApp(true); + String dcrContent = dcr.toJSON(); + Map dcrHeaders = new HashMap(); + String basicAuth = Base64.encode((username + ":" + password).getBytes()); + dcrHeaders.put(AuthConstants.CONTENT_TYPE_HEADER, AuthConstants.CONTENT_TYPE); + dcrHeaders.put(AuthConstants.AUTHORIZATION_HEADER, AuthConstants.BASIC_AUTH_PREFIX + basicAuth); URI dcrUrl = new URI(iotServerConfiguration.getDynamicClientRegistrationEndpoint()); RESTInvoker restInvoker = new RESTInvoker(); - RESTResponse response = restInvoker.invokePOST(dcrUrl, drcHeaders, null, - null, dcrContent); - + RESTResponse response = restInvoker.invokePOST(dcrUrl, dcrHeaders, null, null, dcrContent); if (log.isDebugEnabled()) { log.debug("DCR response :" + response.getContent()); } JSONObject jsonResponse = new JSONObject(response.getContent()); - clientId = jsonResponse.getString("client_id"); - clientSecret = jsonResponse.getString("client_secret"); + clientId = jsonResponse.getString(AuthConstants.CLIENT_ID); + clientSecret = jsonResponse.getString(AuthConstants.CLIENT_SECRET); } catch (JSONException e) { throw new APIMCertificateMGTException("Error occurred while converting the json to object", e); - } catch (IOException e) { - throw new APIMCertificateMGTException("Error occurred while trying to call DCR endpoint", e); - } catch (URISyntaxException e) { + } catch (IOException | URISyntaxException e) { throw new APIMCertificateMGTException("Error occurred while trying to call DCR endpoint", e); } From 273be79ca212bc4cee1e15ca5a3b0be656098c4f Mon Sep 17 00:00:00 2001 From: Harshan Liyanage Date: Thu, 20 Apr 2017 15:57:12 +0530 Subject: [PATCH 3/4] Resolving #695:Fix for Policy Delegation task is not starting for tenants in distributed setup --- .../impl/PolicyAdministratorPointImpl.java | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/impl/PolicyAdministratorPointImpl.java b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/impl/PolicyAdministratorPointImpl.java index 73e21e0303..50d58c3bf4 100644 --- a/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/impl/PolicyAdministratorPointImpl.java +++ b/components/policy-mgt/org.wso2.carbon.policy.mgt.core/src/main/java/org/wso2/carbon/policy/mgt/core/impl/PolicyAdministratorPointImpl.java @@ -144,33 +144,35 @@ public class PolicyAdministratorPointImpl implements PolicyAdministratorPoint { //Check whether the TaskType is already registered. If not we'll register it here. if (!registeredTaskTypes.contains(PolicyManagementConstants.DELEGATION_TASK_TYPE)) { taskService.registerTaskType(PolicyManagementConstants.DELEGATION_TASK_TYPE); - TaskInfo registeredTaskInfo = null; - // getTask method will throw a TaskException if the task is not registered. Hence we'll handle the - // exception and register the task. - try { - registeredTaskInfo = taskManager.getTask(taskName); - } catch (TaskException e) { + } + + TaskInfo registeredTaskInfo = null; + // getTask method will throw a TaskException if the task is not registered. Hence we'll handle the + // exception and register the task. + try { + registeredTaskInfo = taskManager.getTask(taskName); + } catch (TaskException e) { // No need of any specific logic to handle this exception as it is thrown if the task is not registered. - } finally { - // If registeredTaskInfo is null that means there's no registered delegation-task. - if (registeredTaskInfo == null) { - TaskInfo taskInfo = new TaskInfo(taskName, PolicyManagementConstants.DELEGATION_TASK_CLAZZ, - properties, triggerInfo); - taskManager.registerTask(taskInfo); - taskManager.scheduleTask(taskInfo.getName()); - } - } - } else { - if (!taskManager.isTaskScheduled(taskName)) { + } finally { + // If registeredTaskInfo is null that means there's no registered delegation-task. + if (registeredTaskInfo == null) { TaskInfo taskInfo = new TaskInfo(taskName, PolicyManagementConstants.DELEGATION_TASK_CLAZZ, - properties, triggerInfo); + properties, triggerInfo); + taskManager.registerTask(taskInfo); taskManager.scheduleTask(taskInfo.getName()); } else { - throw new PolicyManagementException("There is a task already running for policy changes. Please try " + - "to apply " + - "changes after few minutes."); + if (!taskManager.isTaskScheduled(taskName)) { + TaskInfo taskInfo = new TaskInfo(taskName, PolicyManagementConstants.DELEGATION_TASK_CLAZZ, + properties, triggerInfo); + taskManager.scheduleTask(taskInfo.getName()); + } else { + throw new PolicyManagementException("There is a task already running for policy changes. Please try " + + "to apply " + + "changes after few minutes."); + } } } + } catch (TaskException e) { String msg = "Error occurred while creating the policy delegation task for tenant " + PrivilegedCarbonContext. From e6b38fbdb45c97325034b805b1d2748ca827e51f Mon Sep 17 00:00:00 2001 From: Jasintha Date: Fri, 21 Apr 2017 14:49:09 +0530 Subject: [PATCH 4/4] Implemeting dynamic recivers and streams deployment into DAS --- .../org.wso2.carbon.device.mgt.api/pom.xml | 10 + .../DeviceTypePublisherAdminServiceImpl.java | 203 +++++++++++++++++- .../pom.xml | 7 + .../pom.xml | 2 +- pom.xml | 11 + 5 files changed, 231 insertions(+), 2 deletions(-) diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/pom.xml b/components/device-mgt/org.wso2.carbon.device.mgt.api/pom.xml index 1da060e76c..89efa0d2ba 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/pom.xml +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/pom.xml @@ -280,6 +280,16 @@ javax.ws.rs javax.ws.rs-api + + + org.wso2.carbon.analytics-common + org.wso2.carbon.event.receiver.stub + provided + + + org.wso2.carbon.analytics-common + org.wso2.carbon.event.stream.stub + provided org.wso2.carbon.commons diff --git a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/admin/DeviceTypePublisherAdminServiceImpl.java b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/admin/DeviceTypePublisherAdminServiceImpl.java index 0efa036da0..26e552d0e7 100644 --- a/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/admin/DeviceTypePublisherAdminServiceImpl.java +++ b/components/device-mgt/org.wso2.carbon.device.mgt.api/src/main/java/org/wso2/carbon/device/mgt/jaxrs/service/impl/admin/DeviceTypePublisherAdminServiceImpl.java @@ -18,6 +18,7 @@ */ package org.wso2.carbon.device.mgt.jaxrs.service.impl.admin; +import org.apache.axis2.AxisFault; import org.apache.axis2.client.Options; import org.apache.axis2.java.security.SSLProtocolSocketFactory; import org.apache.axis2.transport.http.HTTPConstants; @@ -27,6 +28,9 @@ import org.apache.commons.httpclient.protocol.Protocol; import org.apache.commons.httpclient.protocol.ProtocolSocketFactory; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; import org.wso2.carbon.application.mgt.stub.upload.CarbonAppUploaderStub; import org.wso2.carbon.application.mgt.stub.upload.types.carbon.UploadedFileItem; import org.wso2.carbon.base.ServerConfiguration; @@ -35,11 +39,16 @@ import org.wso2.carbon.core.util.Utils; import org.wso2.carbon.device.mgt.jaxrs.service.api.admin.DeviceTypePublisherAdminService; import org.wso2.carbon.device.mgt.jaxrs.util.DeviceMgtAPIUtils; import org.wso2.carbon.identity.jwt.client.extension.JWTClient; +import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientException; import org.wso2.carbon.registry.core.Registry; import org.wso2.carbon.registry.core.Resource; import org.wso2.carbon.registry.core.ResourceImpl; import org.wso2.carbon.registry.core.exceptions.RegistryException; +import org.wso2.carbon.user.api.UserStoreException; import org.wso2.carbon.utils.CarbonUtils; +import org.wso2.carbon.event.receiver.stub.EventReceiverAdminServiceStub; +import org.wso2.carbon.event.stream.stub.EventStreamAdminServiceStub; +import org.wso2.carbon.utils.multitenancy.MultitenantConstants; import javax.activation.DataHandler; import javax.net.ssl.KeyManagerFactory; @@ -51,6 +60,8 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Response; import java.io.*; +import java.nio.file.Files; +import java.rmi.RemoteException; import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; @@ -89,11 +100,15 @@ public class DeviceTypePublisherAdminServiceImpl implements DeviceTypePublisherA private static final String SSLV3 = "SSLv3"; + + private KeyStore keyStore; private KeyStore trustStore; private char[] keyStorePassword; private SSLContext sslContext; + private String tenantDomain; + private static final Log log = LogFactory.getLog(DeviceTypePublisherAdminServiceImpl.class); private static final String DEFAULT_RESOURCE_LOCATION = "/resources/devicetypes"; private static final String CAR_FILE_LOCATION = CarbonUtils.getCarbonHome() + File.separator + "repository" + @@ -105,10 +120,15 @@ public class DeviceTypePublisherAdminServiceImpl implements DeviceTypePublisherA private static final String IOT_MGT_HOST_NAME = "${iot.manager.host}"; private static final String DAS_URL = DEFAULT_HTTP_PROTOCOL + "://" + DAS_HOST_NAME + ":" + DAS_PORT + "/services/CarbonAppUploader" + "/"; + private static final String DAS_EVENT_RECEIVER_EP = DEFAULT_HTTP_PROTOCOL + "://" + DAS_HOST_NAME + + ":" + DAS_PORT + "/services/EventReceiverAdminService" + "/"; + private static final String IOT_MGT_URL = DEFAULT_HTTP_PROTOCOL + "://" + IOT_MGT_HOST_NAME + ":" + IOT_MGT_PORT + "/services/CarbonAppUploader" + "/"; private static final String MEDIA_TYPE_XML = "application/xml"; private static final String DEVICE_MANAGEMENT_TYPE = "device_management"; + private static final String TENANT_DOMAIN_PROPERTY = "\\$\\{tenant-domain\\}"; + @Override @POST @@ -117,7 +137,7 @@ public class DeviceTypePublisherAdminServiceImpl implements DeviceTypePublisherA try { //Getting the tenant Domain - String tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); + tenantDomain = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantDomain(); String username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUsername(); String tenantAdminUser = username + "@" + tenantDomain; @@ -187,6 +207,14 @@ public class DeviceTypePublisherAdminServiceImpl implements DeviceTypePublisherA registry.put(DEFAULT_RESOURCE_LOCATION + type + ".exist", resource); } } + + if(!tenantDomain.equals(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME)) { + publishDynamicEventReceivers(type, tenantDomain); + } + publishDynamicEventReceivers(type,MultitenantConstants.SUPER_TENANT_DOMAIN_NAME); + publishDynamicEventStream(type,MultitenantConstants.SUPER_TENANT_DOMAIN_NAME); + + } else { return Response.status(Response.Status.BAD_REQUEST) .entity("\"Error, Artifact does not exist.\"").build(); @@ -222,6 +250,179 @@ public class DeviceTypePublisherAdminServiceImpl implements DeviceTypePublisherA } } + + private void publishDynamicEventReceivers(String deviceType, String tenantDomain){ + + PrivilegedCarbonContext.getThreadLocalCarbonContext().startTenantFlow(); + PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(tenantDomain, true); + + try { + + EventReceiverAdminServiceStub receiverAdminServiceStub = new EventReceiverAdminServiceStub(Utils.replaceSystemProperty(DAS_EVENT_RECEIVER_EP)); + Options eventReciverOptions = receiverAdminServiceStub._getServiceClient().getOptions(); + if (eventReciverOptions == null) { + eventReciverOptions = new Options(); + } + String username=null; + if(!tenantDomain.equals(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME)) { + username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm() + .getRealmConfiguration().getAdminUserName()+"@"+tenantDomain; + }else { + username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm() + .getRealmConfiguration().getAdminUserName(); + } + + + JWTClient jwtClient = DeviceMgtAPIUtils.getJWTClientManagerService().getJWTClient(); + + String authValue = AUTHORIZATION_HEADER_VALUE + " " + new String(Base64.encodeBase64( + jwtClient.getJwtToken(username).getBytes())); + + List
list = new ArrayList
(); + Header httpHeader = new Header(); + httpHeader.setName(AUTHORIZATION_HEADER); + httpHeader.setValue(authValue); + list.add(httpHeader);//"https" + + eventReciverOptions.setProperty(HTTPConstants.HTTP_HEADERS, list); + eventReciverOptions.setProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER + , new Protocol(DEFAULT_HTTP_PROTOCOL + , (ProtocolSocketFactory) new SSLProtocolSocketFactory(sslContext) + , Integer.parseInt(Utils.replaceSystemProperty(DAS_PORT)))); + + receiverAdminServiceStub._getServiceClient().setOptions(eventReciverOptions); + + List receiversList = getReceiversList(deviceType); + for (String receiverContent:receiversList) { + receiverAdminServiceStub.deployEventReceiverConfiguration(receiverContent); + } + + } catch (AxisFault e) { + log.error("publishing dynamic event receiver is failed due to " + e.getMessage(), e); + } catch (RemoteException e) { + log.error("publishing dynamic event receiver is failed due to " + e.getMessage(), e); + } catch (IOException e) { + log.error("publishing dynamic event receiver is failed due to " + e.getMessage(), e); + } catch (JWTClientException e) { + log.error("publishing dynamic event receiver is failed due to " + e.getMessage(), e); + } catch (UserStoreException e) { + log.error("publishing dynamic event receiver is failed due to " + e.getMessage(), e); + } finally { + PrivilegedCarbonContext.endTenantFlow(); + } + } + + + private void publishDynamicEventStream(String deviceType, String tenantDomain){ + + PrivilegedCarbonContext.getThreadLocalCarbonContext().startTenantFlow(); + PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(tenantDomain, true); + + try { + + EventStreamAdminServiceStub eventStreamAdminServiceStub = new EventStreamAdminServiceStub(Utils.replaceSystemProperty(DAS_EVENT_RECEIVER_EP)); + Options eventReciverOptions = eventStreamAdminServiceStub._getServiceClient().getOptions(); + if (eventReciverOptions == null) { + eventReciverOptions = new Options(); + } + String username; + if(!tenantDomain.equals(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME)) { + username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm() + .getRealmConfiguration().getAdminUserName()+"@"+tenantDomain; + }else { + username = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm() + .getRealmConfiguration().getAdminUserName(); + } + + + JWTClient jwtClient = DeviceMgtAPIUtils.getJWTClientManagerService().getJWTClient(); + + String authValue = AUTHORIZATION_HEADER_VALUE + " " + new String(Base64.encodeBase64( + jwtClient.getJwtToken(username).getBytes())); + + List
list = new ArrayList
(); + Header httpHeader = new Header(); + httpHeader.setName(AUTHORIZATION_HEADER); + httpHeader.setValue(authValue); + list.add(httpHeader);//"https" + + eventReciverOptions.setProperty(HTTPConstants.HTTP_HEADERS, list); + eventReciverOptions.setProperty(HTTPConstants.CUSTOM_PROTOCOL_HANDLER + , new Protocol(DEFAULT_HTTP_PROTOCOL + , (ProtocolSocketFactory) new SSLProtocolSocketFactory(sslContext) + , Integer.parseInt(Utils.replaceSystemProperty(DAS_PORT)))); + + eventStreamAdminServiceStub._getServiceClient().setOptions(eventReciverOptions); + + List streamList = getStreamsList(deviceType); + for (String streamContent:streamList) { + JSONParser jsonParser = new JSONParser(); + JSONObject steamJson = (JSONObject)jsonParser.parse(streamContent); + String name = (String) steamJson.get("name"); + String version = (String) steamJson.get("version"); + String streamId = name +":"+version; + if(eventStreamAdminServiceStub.getStreamDefinitionAsString(streamId)==null) { + + eventStreamAdminServiceStub.addEventStreamDefinitionAsString(streamContent); + } + } + + } catch (AxisFault e) { + log.error("publishing dynamic event receiver is failed due to " + e.getMessage(), e); + } catch (RemoteException e) { + log.error("publishing dynamic event receiver is failed due to " + e.getMessage(), e); + } catch (IOException e) { + log.error("publishing dynamic event receiver is failed due to " + e.getMessage(), e); + } catch (JWTClientException e) { + log.error("publishing dynamic event receiver is failed due to " + e.getMessage(), e); + } catch (UserStoreException e) { + log.error("publishing dynamic event receiver is failed due to " + e.getMessage(), e); + } catch (ParseException e) { + log.error("publishing dynamic event receiver is failed due to " + e.getMessage(), e); + } finally { + PrivilegedCarbonContext.endTenantFlow(); + } + } + + + private List getReceiversList(String deviceType) throws IOException { + + File directory = new File(CAR_FILE_LOCATION + File.separator + deviceType+File.separator+"receiver"); + File[] receiverFiles = directory.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.toLowerCase().endsWith(".xml"); + } + }); + List receiverList = new ArrayList<>(); + for (File receiverFile:receiverFiles) { + String receiverContent =new String(Files.readAllBytes(receiverFile.toPath())); + receiverContent.replaceAll(TENANT_DOMAIN_PROPERTY,tenantDomain.toLowerCase()); + receiverList.add(receiverContent); + } + + return receiverList; + } + + private List getStreamsList(String deviceType) throws IOException { + + File directory = new File(CAR_FILE_LOCATION + File.separator + deviceType+File.separator+"streams"); + File[] receiverFiles = directory.listFiles(new FilenameFilter() { + @Override + public boolean accept(File dir, String name) { + return name.toLowerCase().endsWith(".json"); + } + }); + List streamList = new ArrayList<>(); + for (File StreamFile:receiverFiles) { + String receiverContent =new String(Files.readAllBytes(StreamFile.toPath())); + receiverContent.replaceAll(TENANT_DOMAIN_PROPERTY,tenantDomain.toLowerCase()); + streamList.add(receiverContent); + } + + return streamList; + } + private UploadedFileItem[] loadCappFromFileSystem(String deviceType) throws IOException { File directory = new File(CAR_FILE_LOCATION + File.separator + deviceType); diff --git a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/pom.xml b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/pom.xml index eb6658b4eb..40c2f628b0 100644 --- a/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/pom.xml +++ b/features/device-mgt/org.wso2.carbon.device.mgt.server.feature/pom.xml @@ -61,6 +61,10 @@ org.wso2.carbon.registry org.wso2.carbon.registry.indexing + + org.wso2.carbon.analytics-common + org.wso2.carbon.event.receiver.stub + @@ -134,6 +138,9 @@ org.wso2.orbit.com.fasterxml.jackson.core:jackson-annotations:${jackson-annotations.version} + + org.wso2.carbon.analytics-common:org.wso2.carbon.event.receiver.stub:${carbon.analytics.common.version} + diff --git a/features/jwt-client/org.wso2.carbon.identity.jwt.client.extension.feature/pom.xml b/features/jwt-client/org.wso2.carbon.identity.jwt.client.extension.feature/pom.xml index b59a9010db..fcd3b1e5ef 100644 --- a/features/jwt-client/org.wso2.carbon.identity.jwt.client.extension.feature/pom.xml +++ b/features/jwt-client/org.wso2.carbon.identity.jwt.client.extension.feature/pom.xml @@ -92,7 +92,7 @@ org.wso2.carbon.p2.category.type:server - org.eclipse.equinox.p2.type.group:false + org.eclipse.equinox.p2.type.group:true diff --git a/pom.xml b/pom.xml index 8332bd8f00..c882c88bc9 100644 --- a/pom.xml +++ b/pom.xml @@ -1513,6 +1513,16 @@ javassist ${javassist.version} + + org.wso2.carbon.analytics-common + org.wso2.carbon.event.receiver.stub + ${carbon.analytics.common.version} + + + org.wso2.carbon.analytics-common + org.wso2.carbon.event.stream.stub + ${carbon.analytics.common.version} + @@ -1821,6 +1831,7 @@ 5.1.3 [5.1.3,6.0.0) + 4.6.0 [4.4.8, 5.0.0)