01
- You can view all your connected devices at
+ You can view all your connected devices at
[Device Management] page.
02
- Select one of connected devices and check for available control
+ Select one of connected devices and check for available control
operations and monitor Real-Time data.
03
- You can also view analytics of the data published to IoT-Server by
+ You can also view analytics of the data published to IoT-Server by
navigating to Device Analytics page.
@@ -291,6 +296,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{#zone "topCss"}}
{{css "css/styles.css"}}
{{/zone}}
diff --git a/components/device-types/arduino-plugin/org.wso2.carbon.device.mgt.iot.arduino.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.arduino.type-view/type-view.js b/components/device-types/arduino-plugin/org.wso2.carbon.device.mgt.iot.arduino.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.arduino.type-view/type-view.js
new file mode 100644
index 000000000..efb12da30
--- /dev/null
+++ b/components/device-types/arduino-plugin/org.wso2.carbon.device.mgt.iot.arduino.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.arduino.type-view/type-view.js
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+function onRequest(context) {
+ var viewModel = {};
+ var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"];
+ var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"];
+ var url = devicemgtProps["httpsURL"] + "/api/device-mgt/v1.0/admin/devicetype/deploy/arduino/status";
+ serviceInvokers.XMLHttp.get(
+ url, function (responsePayload) {
+ var responseContent = responsePayload.status;
+ new Log().error(responseContent);
+ if ("204" == responsePayload.status) {
+ viewModel["displayStatus"] = "Display";
+ }
+ },
+ function (responsePayload) {
+ //do nothing.
+ }
+ );
+ return viewModel;
+}
\ No newline at end of file
diff --git a/components/device-types/arduino-plugin/org.wso2.carbon.device.mgt.iot.arduino.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.arduino.type-view/type-view.json b/components/device-types/arduino-plugin/org.wso2.carbon.device.mgt.iot.arduino.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.arduino.type-view/type-view.json
index 9eecd8f5b..688e93980 100644
--- a/components/device-types/arduino-plugin/org.wso2.carbon.device.mgt.iot.arduino.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.arduino.type-view/type-view.json
+++ b/components/device-types/arduino-plugin/org.wso2.carbon.device.mgt.iot.arduino.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.arduino.type-view/type-view.json
@@ -1,3 +1,3 @@
{
- "version": "1.0.0"
+ "version": "1.0.0"
}
\ No newline at end of file
diff --git a/components/device-types/arduino-plugin/pom.xml b/components/device-types/arduino-plugin/pom.xml
index f37fdec2a..fcc2813ba 100644
--- a/components/device-types/arduino-plugin/pom.xml
+++ b/components/device-types/arduino-plugin/pom.xml
@@ -22,7 +22,7 @@
org.wso2.carbon.devicemgt-pluginsdevice-types
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/device-types/pom.xml b/components/device-types/pom.xml
index f64171e44..70da8b69e 100644
--- a/components/device-types/pom.xml
+++ b/components/device-types/pom.xml
@@ -22,7 +22,7 @@
org.wso2.carbon.devicemgt-pluginscarbon-device-mgt-plugins-parent
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../../pom.xml
diff --git a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.analytics/pom.xml b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.analytics/pom.xml
index ec0649181..f3e5511d0 100644
--- a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.analytics/pom.xml
+++ b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.analytics/pom.xml
@@ -21,7 +21,7 @@
raspberrypi-pluginorg.wso2.carbon.devicemgt-plugins
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.analytics/src/main/resources/carbonapps/raspberrypi/raspberrypi_receiver/raspberrypi_receiver.xml b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.analytics/src/main/resources/carbonapps/raspberrypi/raspberrypi_receiver/raspberrypi_receiver.xml
index 9cd4a9eb4..1424b737e 100644
--- a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.analytics/src/main/resources/carbonapps/raspberrypi/raspberrypi_receiver/raspberrypi_receiver.xml
+++ b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.analytics/src/main/resources/carbonapps/raspberrypi/raspberrypi_receiver/raspberrypi_receiver.xml
@@ -18,10 +18,8 @@
-->
- carbon.super/raspberrypi/+/temperature
- admin
- admin
- org.wso2.carbon.device.mgt.input.adapter.mqtt.util.MQTTContentValidator
+ ${tenant-domain}/raspberrypi/+/temperature
+ iot-mqtttrue
diff --git a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/pom.xml b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/pom.xml
index a80de0fad..a20aa9f7f 100644
--- a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/pom.xml
+++ b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/pom.xml
@@ -21,7 +21,7 @@
raspberrypi-pluginorg.wso2.carbon.devicemgt-plugins
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/RaspberryPiService.java b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/RaspberryPiService.java
index 1f227e630..b048f72d5 100644
--- a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/RaspberryPiService.java
+++ b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/RaspberryPiService.java
@@ -39,7 +39,7 @@ import javax.ws.rs.core.Response;
}
),
tags = {
- @Tag(name = "raspberrypi", description = "")
+ @Tag(name = "raspberrypi,device_management", description = "")
}
)
@Scopes(
diff --git a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/RaspberryPiServiceImpl.java b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/RaspberryPiServiceImpl.java
index c0dec9973..fdd36862a 100644
--- a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/RaspberryPiServiceImpl.java
+++ b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/RaspberryPiServiceImpl.java
@@ -141,13 +141,14 @@ public class RaspberryPiServiceImpl implements RaspberryPiService {
@Produces("application/zip")
public Response downloadSketch(@QueryParam("deviceName") String deviceName, @QueryParam("sketchType") String sketchType) {
try {
- ZipArchive zipFile = createDownloadFile(APIUtil.getAuthenticatedUser(), deviceName, sketchType);
- Response.ResponseBuilder response = Response.ok(FileUtils.readFileToByteArray(zipFile.getZipFile()));
+ String username = APIUtil.getAuthenticatedUser() + "@" + PrivilegedCarbonContext
+ .getThreadLocalCarbonContext().getTenantDomain();
+ ZipArchive zipFile = createDownloadFile(username, deviceName, sketchType);
+ Response.ResponseBuilder response = Response.ok(zipFile.getZipFileContent());
response.status(Response.Status.OK);
response.type("application/zip");
response.header("Content-Disposition", "attachment; filename=\"" + zipFile.getFileName() + "\"");
Response resp = response.build();
- zipFile.getZipFile().delete();
return resp;
} catch (IllegalArgumentException ex) {
return Response.status(400).entity(ex.getMessage()).build();//bad request
@@ -160,9 +161,6 @@ public class RaspberryPiServiceImpl implements RaspberryPiService {
} catch (APIManagerException ex) {
log.error(ex.getMessage(), ex);
return Response.status(500).entity(ex.getMessage()).build();
- } catch (IOException ex) {
- log.error(ex.getMessage(), ex);
- return Response.status(500).entity(ex.getMessage()).build();
} catch (UserStoreException ex) {
log.error(ex.getMessage(), ex);
return Response.status(500).entity(ex.getMessage()).build();
@@ -206,7 +204,8 @@ public class RaspberryPiServiceImpl implements RaspberryPiService {
}
if (apiApplicationKey == null) {
String applicationUsername = PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm()
- .getRealmConfiguration().getAdminUserName();
+ .getRealmConfiguration().getAdminUserName() + "@" + PrivilegedCarbonContext
+ .getThreadLocalCarbonContext().getTenantDomain();
APIManagementProviderService apiManagementProviderService = APIUtil.getAPIManagementProviderService();
String[] tags = {RaspberrypiConstants.DEVICE_TYPE};
apiApplicationKey = apiManagementProviderService.generateAndRetrieveApplicationKeys(
diff --git a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/util/APIUtil.java b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/util/APIUtil.java
index fee581528..07f9b702c 100644
--- a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/util/APIUtil.java
+++ b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/util/APIUtil.java
@@ -17,7 +17,6 @@ import org.wso2.carbon.device.mgt.common.authorization.DeviceAccessAuthorization
import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfigurationManagementService;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
import org.wso2.carbon.device.mgt.iot.raspberrypi.service.impl.dto.SensorRecord;
-import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterService;
import org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService;
import java.util.ArrayList;
@@ -170,18 +169,6 @@ public class APIUtil {
return deviceAccessAuthorizationService;
}
- public static OutputEventAdapterService getOutputEventAdapterService() {
- PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
- OutputEventAdapterService outputEventAdapterService =
- (OutputEventAdapterService) ctx.getOSGiService(OutputEventAdapterService.class, null);
- if (outputEventAdapterService == null) {
- String msg = "Device Authorization service has not initialized.";
- log.error(msg);
- throw new IllegalStateException(msg);
- }
- return outputEventAdapterService;
- }
-
public static PlatformConfigurationManagementService getTenantConfigurationManagementService() {
PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
PlatformConfigurationManagementService tenantConfigurationManagementService =
diff --git a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/util/ZipArchive.java b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/util/ZipArchive.java
index eb5ed95da..2d955240e 100644
--- a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/util/ZipArchive.java
+++ b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/util/ZipArchive.java
@@ -18,23 +18,21 @@
package org.wso2.carbon.device.mgt.iot.raspberrypi.service.impl.util;
-import java.io.File;
-
/**
* This is an utility class to hold zip files.
*/
public class ZipArchive {
- private File zipFile = null;
+ private byte[] zipFileContent = null;
private String fileName = null;
- public ZipArchive(String fileName, File zipFile) {
+ public ZipArchive(String fileName, byte[] zipFile) {
this.fileName = fileName;
- this.zipFile = zipFile;
+ this.zipFileContent = zipFile;
}
- public File getZipFile() {
- return zipFile;
+ public byte[] getZipFileContent() {
+ return zipFileContent;
}
public String getFileName() {
diff --git a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/util/ZipUtil.java b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/util/ZipUtil.java
index e902609de..bb2a92b85 100644
--- a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/util/ZipUtil.java
+++ b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.api/src/main/java/org/wso2/carbon/device/mgt/iot/raspberrypi/service/impl/util/ZipUtil.java
@@ -18,27 +18,22 @@
package org.wso2.carbon.device.mgt.iot.raspberrypi.service.impl.util;
-import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.wso2.carbon.base.ServerConfiguration;
import org.wso2.carbon.core.util.Utils;
import org.wso2.carbon.device.mgt.common.DeviceManagementException;
import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationEntry;
import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationManagementException;
import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration;
import org.wso2.carbon.utils.CarbonUtils;
-import org.wso2.carbon.utils.NetworkUtils;
-import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
@@ -69,8 +64,6 @@ public class ZipUtil {
String refreshToken) throws DeviceManagementException {
String sketchFolder = "repository" + File.separator + "resources" + File.separator + "sketches";
- String archivesPath = CarbonUtils.getCarbonHome() + File.separator + sketchFolder + File.separator + "archives" +
- File.separator + deviceId;
String templateSketchPath = sketchFolder + File.separator + deviceType;
String iotServerIP;
@@ -117,7 +110,7 @@ public class ZipUtil {
contextParams.put("DEVICE_REFRESH_TOKEN", refreshToken);
ZipArchive zipFile;
- zipFile = getSketchArchive(archivesPath, templateSketchPath, contextParams, deviceName);
+ zipFile = getSketchArchive(templateSketchPath, contextParams, deviceName);
return zipFile;
} catch (IOException e) {
throw new DeviceManagementException("Zip File Creation Failed", e);
@@ -126,7 +119,7 @@ public class ZipUtil {
}
}
- public static String getServerUrl() {
+ private static String getServerUrl() {
try {
return org.apache.axis2.util.Utils.getIpAddress();
} catch (SocketException e) {
@@ -135,32 +128,26 @@ public class ZipUtil {
}
}
- private static ZipArchive getSketchArchive(String archivesPath, String templateSketchPath, Map contextParams
+ private ZipArchive getSketchArchive(String templateSketchPath, Map contextParams
, String zipFileName)
throws DeviceManagementException, IOException {
String sketchPath = CarbonUtils.getCarbonHome() + File.separator + templateSketchPath;
- FileUtils.deleteDirectory(new File(archivesPath));//clear directory
- FileUtils.deleteDirectory(new File(archivesPath + ".zip"));//clear zip
- if (!new File(archivesPath).mkdirs()) { //new dir
- String message = "Could not create directory at path: " + archivesPath;
- log.error(message);
- throw new DeviceManagementException(message);
- }
zipFileName = zipFileName + ".zip";
try {
Map> properties = getProperties(sketchPath + File.separator + "sketch" + ".properties");
List templateFiles = properties.get("templates");
+ List processTemplateFiles = new ArrayList<>();
for (String templateFile : templateFiles) {
- parseTemplate(templateSketchPath + File.separator + templateFile, archivesPath + File.separator + templateFile,
- contextParams);
+ TemplateFile tFile = new TemplateFile();
+ tFile.setContent(parseTemplate(templateSketchPath + File.separator + templateFile, contextParams));
+ tFile.setFileName(templateFile);
+ processTemplateFiles.add(tFile);
}
templateFiles.add("sketch.properties"); // ommit copying the props file
- copyFolder(new File(sketchPath), new File(archivesPath), templateFiles);
- createZipArchive(archivesPath);
- FileUtils.deleteDirectory(new File(archivesPath));
- File zip = new File(archivesPath + ".zip");
+
+ byte[] zip = createZipArchive(templateSketchPath, processTemplateFiles);
return new ZipArchive(zipFileName, zip);
} catch (IOException ex) {
throw new DeviceManagementException(
@@ -200,148 +187,124 @@ public class ZipUtil {
}
}
- private static void parseTemplate(String srcFile, String dstFile, Map contextParams) throws IOException {
+ private static String parseTemplate(String srcFile, Map contextParams) throws IOException {
//read from file
FileInputStream inputStream = null;
- FileOutputStream outputStream = null;
try {
inputStream = new FileInputStream(srcFile);
- outputStream = new FileOutputStream(dstFile);
String content = IOUtils.toString(inputStream, StandardCharsets.UTF_8.toString());
Iterator iterator = contextParams.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry mapEntry = (Map.Entry) iterator.next();
content = content.replaceAll("\\$\\{" + mapEntry.getKey() + "\\}", mapEntry.getValue().toString());
}
- IOUtils.write(content, outputStream, StandardCharsets.UTF_8.toString());
+ return content;
} finally {
if (inputStream != null) {
inputStream.close();
}
- if (outputStream != null) {
- outputStream.close();
- }
- }
- }
-
- private static void copyFolder(File src, File dest, List excludeFileNames) throws IOException {
-
- if (src.isDirectory()) {
- //if directory not exists, create it
- if (!dest.exists() && !dest.mkdirs()) {
- String message = "Could not create directory at path: " + dest;
- log.error(message);
- throw new IOException(message);
- }
- //list all the directory contents
- String files[] = src.list();
-
- if (files == null) {
- log.warn("There are no files insides the directory " + src.getAbsolutePath());
- return;
- }
-
- for (String file : files) {
- //construct the src and dest file structure
- File srcFile = new File(src, file);
- File destFile = new File(dest, file);
- //recursive copy
- copyFolder(srcFile, destFile, excludeFileNames);
- }
-
- } else {
- for (String fileName : excludeFileNames) {
- if (src.getName().equals(fileName)) {
- return;
- }
- }
- //if file, then copy it
- //Use bytes stream to support all file types
- InputStream in = null;
- OutputStream out = null;
-
- try {
- in = new FileInputStream(src);
- out = new FileOutputStream(dest);
-
- byte[] buffer = new byte[1024];
-
- int length;
- //copy the file content in bytes
- while ((length = in.read(buffer)) > 0) {
- out.write(buffer, 0, length);
- }
- } finally {
- if (in != null) {
- in.close();
- }
- if (out != null) {
- out.close();
- }
- }
}
}
- private static boolean createZipArchive(String srcFolder) throws IOException {
- BufferedInputStream origin = null;
+ private static byte[] createZipArchive(String srcFolder, List processTemplateFiles) throws IOException {
ZipOutputStream out = null;
-
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
- final int BUFFER = 2048;
- FileOutputStream dest = new FileOutputStream(new File(srcFolder + ".zip"));
- out = new ZipOutputStream(new BufferedOutputStream(dest));
- byte data[] = new byte[BUFFER];
+ out = new ZipOutputStream(new BufferedOutputStream(baos));
File subDir = new File(srcFolder);
String subdirList[] = subDir.list();
if (subdirList == null) {
log.warn("The sub directory " + subDir.getAbsolutePath() + " is empty");
- return false;
+ return null;
}
for (String sd : subdirList) {
// get a list of files from current directory
- File f = new File(srcFolder + "/" + sd);
+ File f = new File(srcFolder + File.separator + sd);
if (f.isDirectory()) {
String files[] = f.list();
if (files == null) {
log.warn("The current directory " + f.getAbsolutePath() + " is empty. Has no files");
- return false;
+ return null;
}
for (int i = 0; i < files.length; i++) {
- FileInputStream fi = new FileInputStream(srcFolder + "/" + sd + "/" + files[i]);
- origin = new BufferedInputStream(fi, BUFFER);
- ZipEntry entry = new ZipEntry(sd + "/" + files[i]);
- out.putNextEntry(entry);
- int count;
- while ((count = origin.read(data, 0, BUFFER)) != -1) {
- out.write(data, 0, count);
- out.flush();
+ boolean fileAdded = false;
+ for (TemplateFile templateFile : processTemplateFiles) {
+ if (files[i].equals(templateFile.getFileName())) {
+ ZipEntry entry = new ZipEntry(templateFile.getFileName());
+ out.putNextEntry(entry);
+ out.write(templateFile.getContent().getBytes());
+ out.closeEntry();
+ fileAdded = true;
+ break;
+ } else if (f.getName().equals("sketch.properties")) {
+ fileAdded = true;
+ break;
+ }
+ }
+ if (fileAdded) {
+ continue;
}
+ ZipEntry entry = new ZipEntry(sd + File.separator + files[i]);
+ out.putNextEntry(entry);
+ out.write(IOUtils.toByteArray(new FileInputStream(srcFolder + File.separator + sd
+ + File.separator + files[i])));
+ out.closeEntry();
}
} else //it is just a file
{
- FileInputStream fi = new FileInputStream(f);
- origin = new BufferedInputStream(fi, BUFFER);
+ boolean fileAdded = false;
+ for (TemplateFile templateFile : processTemplateFiles) {
+ if (f.getName().equals(templateFile.getFileName())) {
+ ZipEntry entry = new ZipEntry(templateFile.getFileName());
+ out.putNextEntry(entry);
+ out.write(templateFile.getContent().getBytes());
+ out.closeEntry();
+ fileAdded = true;
+ break;
+ } else if (f.getName().equals("sketch.properties")) {
+ fileAdded = true;
+ break;
+ }
+ }
+ if (fileAdded) {
+ continue;
+ }
ZipEntry entry = new ZipEntry(sd);
out.putNextEntry(entry);
- int count;
- while ((count = origin.read(data, 0, BUFFER)) != -1) {
- out.write(data, 0, count);
- out.flush();
- }
+ out.write(IOUtils.toByteArray(new FileInputStream(f)));
+ out.closeEntry();
}
}
- out.flush();
+ out.finish();
} finally {
- if (origin != null) {
- origin.close();
- }
if (out != null) {
out.close();
}
}
- return true;
+ return baos.toByteArray();
+ }
+
+ public class TemplateFile {
+ private String content;
+ private String fileName;
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
}
}
diff --git a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/pom.xml b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/pom.xml
index 8c832bbf3..d0d8f6d8d 100644
--- a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/pom.xml
+++ b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/pom.xml
@@ -23,7 +23,7 @@
raspberrypi-pluginorg.wso2.carbon.devicemgt-plugins
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.raspberrypi.type-view/public/js/download.js b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.raspberrypi.type-view/public/js/download.js
index f6b9f1e64..abd0a49f5 100644
--- a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.raspberrypi.type-view/public/js/download.js
+++ b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.raspberrypi.type-view/public/js/download.js
@@ -21,6 +21,8 @@ var modalPopupContainer = modalPopup + " .modal-content";
var modalPopupContent = modalPopup + " .modal-content";
var body = "body";
+var backendEndBasePath = "/api/device-mgt/v1.0";
+
/*
* set popup maximum height function.
*/
@@ -180,4 +182,31 @@ function doAction(data) {
hidePopup();
});
}
+}
+
+function artifactUpload() {
+ var contentType = "application/json";
+
+ var urix = backendEndBasePath + "/admin/devicetype/deploy/raspberrypi";
+ var defaultStatusClasses = "fw fw-stack-1x";
+ var content = $("#raspberrypi-statistic-response-template").find(".content");
+ var title = content.find("#title");
+ var statusIcon = content.find("#status-icon");
+ var data = {}
+ invokerUtil.post(urix, data, function (data) {
+ title.html("Deploying statistic artifacts. Please wait...");
+ statusIcon.attr("class", defaultStatusClasses + " fw-check");
+ $(modalPopupContent).html(content.html());
+ showPopup();
+ setTimeout(function () {
+ hidePopup();
+ location.reload(true);
+ }, 5000);
+
+ }, function (jqXHR) {
+ title.html("Failed to deploy artifacts, Please contact administrator.");
+ statusIcon.attr("class", defaultStatusClasses + " fw-error");
+ $(modalPopupContent).html(content.html());
+ showPopup();
+ }, contentType);
}
\ No newline at end of file
diff --git a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.raspberrypi.type-view/type-view.hbs b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.raspberrypi.type-view/type-view.hbs
index 8b645b36a..000e232a4 100644
--- a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.raspberrypi.type-view/type-view.hbs
+++ b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.raspberrypi.type-view/type-view.hbs
@@ -61,6 +61,10 @@
Download Agent
+ {{#if displayStatus}}
+ Deploy Analytics Artifacts
+ {{/if}}
+
Click here for latest instructions and
troubleshooting.
@@ -275,6 +279,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{#zone "topCss"}}
{{css "css/styles.css"}}
{{/zone}}
diff --git a/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.raspberrypi.type-view/type-view.js b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.raspberrypi.type-view/type-view.js
new file mode 100644
index 000000000..ef40e6ebe
--- /dev/null
+++ b/components/device-types/raspberrypi-plugin/org.wso2.carbon.device.mgt.iot.raspberrypi.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.raspberrypi.type-view/type-view.js
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+function onRequest(context){
+ var viewModel = {};
+ var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"];
+ var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"];
+ var url = devicemgtProps["httpsURL"] + "/api/device-mgt/v1.0/admin/devicetype/deploy/raspberrypi/status";
+ serviceInvokers.XMLHttp.get(
+ url, function (responsePayload) {
+ var responseContent = responsePayload.status;
+ new Log().error(responseContent);
+ if ("204" == responsePayload.status) {
+ viewModel["displayStatus"] = "Display";
+ }
+ },
+ function (responsePayload) {
+ //do nothing.
+ }
+ );
+ return viewModel;
+}
\ No newline at end of file
diff --git a/components/device-types/raspberrypi-plugin/pom.xml b/components/device-types/raspberrypi-plugin/pom.xml
index 15fec876b..df73d46e8 100644
--- a/components/device-types/raspberrypi-plugin/pom.xml
+++ b/components/device-types/raspberrypi-plugin/pom.xml
@@ -22,7 +22,7 @@
org.wso2.carbon.devicemgt-pluginsdevice-types
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.impl/pom.xml b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.impl/pom.xml
index d739f8d11..c734bcc8c 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.impl/pom.xml
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.impl/pom.xml
@@ -23,7 +23,7 @@
virtual-fire-alarm-pluginorg.wso2.carbon.devicemgt-plugins
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/pom.xml b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/pom.xml
index ec91a2e5d..890d96bd3 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/pom.xml
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/pom.xml
@@ -23,7 +23,7 @@
virtual-fire-alarm-pluginorg.wso2.carbon.devicemgt-plugins
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.analytics/pom.xml b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.analytics/pom.xml
index 436d77892..0d2033256 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.analytics/pom.xml
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.analytics/pom.xml
@@ -21,7 +21,7 @@
virtual-fire-alarm-pluginorg.wso2.carbon.devicemgt-plugins
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.analytics/src/main/resources/carbonapps/virtualfirealarm/virtualfirealarm_receiver/virtualfirealarm_receiver.xml b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.analytics/src/main/resources/carbonapps/virtualfirealarm/virtualfirealarm_receiver/virtualfirealarm_receiver.xml
index 7f7b3cf7f..d46fc1a56 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.analytics/src/main/resources/carbonapps/virtualfirealarm/virtualfirealarm_receiver/virtualfirealarm_receiver.xml
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.analytics/src/main/resources/carbonapps/virtualfirealarm/virtualfirealarm_receiver/virtualfirealarm_receiver.xml
@@ -18,10 +18,8 @@
-->
- carbon.super/virtual_firealarm/+/temperature
- admin
- admin
- org.wso2.carbon.device.mgt.input.adapter.mqtt.util.MQTTContentValidator
+ ${tenant-domain}/virtual_firealarm/+/temperature
+ iot-mqtttrue
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/pom.xml b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/pom.xml
index 024ef6b57..f9de24275 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/pom.xml
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/pom.xml
@@ -21,7 +21,7 @@
virtual-fire-alarm-pluginorg.wso2.carbon.devicemgt-plugins
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
@@ -51,18 +51,6 @@
-
- org.wso2.carbon.devicemgt
- org.wso2.carbon.device.mgt.analytics.data.publisher
- provided
-
-
- org.apache.axis2.wso2
- axis2-client
-
-
-
-
org.wso2.carbon.devicemgtorg.wso2.carbon.certificate.mgt.core
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/VirtualFireAlarmService.java b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/VirtualFireAlarmService.java
index 6585280f0..2726948d2 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/VirtualFireAlarmService.java
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/VirtualFireAlarmService.java
@@ -45,7 +45,7 @@ import javax.ws.rs.core.Response;
}
),
tags = {
- @Tag(name = "virtual_firealarm", description = "")
+ @Tag(name = "virtual_firealarm,device_management", description = "")
}
)
@Scopes(
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/VirtualFireAlarmServiceImpl.java b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/VirtualFireAlarmServiceImpl.java
index f5bb1d84b..faec317e0 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/VirtualFireAlarmServiceImpl.java
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/VirtualFireAlarmServiceImpl.java
@@ -58,15 +58,11 @@ import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
-import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
-import java.security.PrivateKey;
import java.util.ArrayList;
import java.util.Date;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
import java.util.Properties;
import java.util.UUID;
@@ -134,40 +130,6 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService {
}
}
- @PUT
- @Path("device/{deviceId}/policy")
- public Response updatePolicy(@PathParam("deviceId") String deviceId, @QueryParam("protocol") String protocol,
- @FormParam("policy") String policy) {
- String protocolString = protocol.toUpperCase();
- if (log.isDebugEnabled()) {
- log.debug("Sending request to update-policy of device [" + deviceId + "] via " + protocolString);
- }
- try {
- if (!APIUtil.getDeviceAccessAuthorizationService().isUserAuthorized(
- new DeviceIdentifier(deviceId, VirtualFireAlarmConstants.DEVICE_TYPE),
- DeviceGroupConstants.Permissions.DEFAULT_MANAGE_POLICIES_PERMISSIONS)) {
- return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build();
- }
- String actualMessage = VirtualFireAlarmConstants.POLICY_CONTEXT + ":" + policy;
- Map dynamicProperties = new HashMap<>();
- String publishTopic = APIUtil.getTenantDomainOftheUser() + "/"
- + VirtualFireAlarmConstants.DEVICE_TYPE + "/" + deviceId;
- dynamicProperties.put(VirtualFireAlarmConstants.ADAPTER_TOPIC_PROPERTY, publishTopic);
- dynamicProperties.put(VirtualFireAlarmConstants.JID_PROPERTY_KEY,
- deviceId + "@" + XmppConfig.getInstance().getServerName());
- dynamicProperties.put(VirtualFireAlarmConstants.SUBJECT_PROPERTY_KEY, "POLICTY-REQUEST");
- dynamicProperties.put(VirtualFireAlarmConstants.MESSAGE_TYPE_PROPERTY_KEY,
- VirtualFireAlarmConstants.CHAT_PROPERTY_KEY);
- APIUtil.getOutputEventAdapterService().publish(VirtualFireAlarmConstants.XMPP_ADAPTER_NAME,
- dynamicProperties, actualMessage);
- return Response.ok().build();
- } catch (DeviceAccessAuthorizationException e) {
- log.error(e.getErrorMessage(), e);
- return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
- }
- }
-
-
@Path("device/stats/{deviceId}")
@GET
@Consumes("application/json")
@@ -206,13 +168,14 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService {
public Response downloadSketch(@QueryParam("deviceName") String deviceName,
@QueryParam("sketchType") String sketchType) {
try {
- ZipArchive zipFile = createDownloadFile(APIUtil.getAuthenticatedUser(), deviceName, sketchType);
- Response.ResponseBuilder response = Response.ok(FileUtils.readFileToByteArray(zipFile.getZipFile()));
+ String user = APIUtil.getAuthenticatedUser() + "@" + PrivilegedCarbonContext.getThreadLocalCarbonContext()
+ .getTenantDomain();
+ ZipArchive zipFile = createDownloadFile(user, deviceName, sketchType);
+ Response.ResponseBuilder response = Response.ok(zipFile.getZipFileContent());
response.status(Response.Status.OK);
response.type("application/zip");
response.header("Content-Disposition", "attachment; filename=\"" + zipFile.getFileName() + "\"");
Response resp = response.build();
- zipFile.getZipFile().delete();
return resp;
} catch (IllegalArgumentException ex) {
return Response.status(400).entity(ex.getMessage()).build();//bad request
@@ -225,9 +188,6 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService {
} catch (APIManagerException ex) {
log.error(ex.getMessage(), ex);
return Response.status(500).entity(ex.getMessage()).build();
- } catch (IOException ex) {
- log.error(ex.getMessage(), ex);
- return Response.status(500).entity(ex.getMessage()).build();
} catch (UserStoreException ex) {
log.error(ex.getMessage(), ex);
return Response.status(500).entity(ex.getMessage()).build();
@@ -276,7 +236,8 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService {
if (apiApplicationKey == null) {
String applicationUsername =
PrivilegedCarbonContext.getThreadLocalCarbonContext().getUserRealm().getRealmConfiguration()
- .getAdminUserName();
+ .getAdminUserName() + "@" + PrivilegedCarbonContext.getThreadLocalCarbonContext()
+ .getTenantDomain();
APIManagementProviderService apiManagementProviderService = APIUtil.getAPIManagementProviderService();
String[] tags = {VirtualFireAlarmConstants.DEVICE_TYPE};
apiApplicationKey = apiManagementProviderService.generateAndRetrieveApplicationKeys(
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/APIUtil.java b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/APIUtil.java
index d302e7281..bbcf1acef 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/APIUtil.java
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/APIUtil.java
@@ -16,7 +16,6 @@ import org.wso2.carbon.device.mgt.common.authorization.DeviceAccessAuthorization
import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfigurationManagementService;
import org.wso2.carbon.device.mgt.core.service.DeviceManagementProviderService;
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.dto.SensorRecord;
-import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterService;
import org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService;
import java.util.ArrayList;
@@ -169,18 +168,6 @@ public class APIUtil {
return deviceAccessAuthorizationService;
}
- public static OutputEventAdapterService getOutputEventAdapterService() {
- PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
- OutputEventAdapterService outputEventAdapterService =
- (OutputEventAdapterService) ctx.getOSGiService(OutputEventAdapterService.class, null);
- if (outputEventAdapterService == null) {
- String msg = "Device Authorization service has not initialized.";
- log.error(msg);
- throw new IllegalStateException(msg);
- }
- return outputEventAdapterService;
- }
-
public static PlatformConfigurationManagementService getTenantConfigurationManagementService() {
PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
PlatformConfigurationManagementService tenantConfigurationManagementService =
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/ZipArchive.java b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/ZipArchive.java
index 22fda92b3..2152a5e36 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/ZipArchive.java
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/ZipArchive.java
@@ -18,23 +18,23 @@
package org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util;
-import java.io.File;
+import java.util.zip.ZipOutputStream;
/**
* This is an utility class to hold zip files.
*/
public class ZipArchive {
- private File zipFile = null;
+ private byte[] zipFileContent = null;
private String fileName = null;
- public ZipArchive(String fileName, File zipFile) {
+ public ZipArchive(String fileName, byte[] zipFile) {
this.fileName = fileName;
- this.zipFile = zipFile;
+ this.zipFileContent = zipFile;
}
- public File getZipFile() {
- return zipFile;
+ public byte[] getZipFileContent() {
+ return zipFileContent;
}
public String getFileName() {
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/ZipUtil.java b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/ZipUtil.java
index e9bcb6c60..496d5eb5a 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/ZipUtil.java
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/ZipUtil.java
@@ -19,7 +19,6 @@
package org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util;
import org.apache.commons.codec.binary.Base64;
-import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -33,14 +32,12 @@ import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.xmpp.XmppConfig;
import org.wso2.carbon.utils.CarbonUtils;
-import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
@@ -59,24 +56,18 @@ import java.util.zip.ZipOutputStream;
public class ZipUtil {
private static final Log log = LogFactory.getLog(ZipUtil.class);
- private static final String HTTPS_PORT_PROPERTY = "httpsPort";
- private static final String HTTP_PORT_PROPERTY = "httpPort";
private static final String LOCALHOST = "localhost";
private static final String HTTPS_PROTOCOL_URL = "https://${iot.gateway.host}:${iot.gateway.https.port}";
private static final String HTTP_PROTOCOL_URL = "http://${iot.gateway.host}:${iot.gateway.http.port}";
private static final String CONFIG_TYPE = "general";
private static final String DEFAULT_MQTT_ENDPOINT = "tcp://${mqtt.broker.host}:${mqtt.broker.port}";
- public static final String HOST_NAME = "HostName";
public ZipArchive createZipFile(String owner, String deviceType, String deviceId, String deviceName,
String apiApplicationKey, String token, String refreshToken)
throws DeviceManagementException {
String sketchFolder = "repository" + File.separator + "resources" + File.separator + "sketches";
- String archivesPath =
- CarbonUtils.getCarbonHome() + File.separator + sketchFolder + File.separator + "archives" +
- File.separator + deviceId;
String templateSketchPath = sketchFolder + File.separator + deviceType;
String iotServerIP;
@@ -141,7 +132,7 @@ public class ZipUtil {
? "" : XmppConfig.getInstance().getJid());
ZipArchive zipFile;
- zipFile = getSketchArchive(archivesPath, templateSketchPath, contextParams, deviceName);
+ zipFile = getSketchArchive(templateSketchPath, contextParams, deviceName);
return zipFile;
} catch (IOException e) {
throw new DeviceManagementException("Zip File Creation Failed", e);
@@ -159,7 +150,7 @@ public class ZipUtil {
return Base64.encodeBase64String(stringToEncode.getBytes());
}
- public static String getServerUrl() {
+ private static String getServerUrl() {
try {
return org.apache.axis2.util.Utils.getIpAddress();
} catch (SocketException e) {
@@ -168,33 +159,27 @@ public class ZipUtil {
}
}
- public static ZipArchive getSketchArchive(String archivesPath, String templateSketchPath, Map contextParams
+ private ZipArchive getSketchArchive(String templateSketchPath, Map contextParams
, String zipFileName)
throws DeviceManagementException, IOException {
String sketchPath = CarbonUtils.getCarbonHome() + File.separator + templateSketchPath;
- FileUtils.deleteDirectory(new File(archivesPath));//clear directory
- FileUtils.deleteDirectory(new File(archivesPath + ".zip"));//clear zip
- if (!new File(archivesPath).mkdirs()) { //new dir
- String message = "Could not create directory at path: " + archivesPath;
- log.error(message);
- throw new DeviceManagementException(message);
- }
zipFileName = zipFileName + ".zip";
try {
Map> properties = getProperties(sketchPath + File.separator + "sketch" + ".properties");
List templateFiles = properties.get("templates");
+ List processTemplateFiles = new ArrayList<>();
for (String templateFile : templateFiles) {
- parseTemplate(templateSketchPath + File.separator + templateFile, archivesPath + File.separator + templateFile,
- contextParams);
+ TemplateFile tFile = new TemplateFile();
+ tFile.setContent(parseTemplate(templateSketchPath + File.separator + templateFile, contextParams));
+ tFile.setFileName(templateFile);
+ processTemplateFiles.add(tFile);
}
templateFiles.add("sketch.properties"); // ommit copying the props file
- copyFolder(new File(sketchPath), new File(archivesPath), templateFiles);
- createZipArchive(archivesPath);
- FileUtils.deleteDirectory(new File(archivesPath));
- File zip = new File(archivesPath + ".zip");
- return new org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util.ZipArchive(zipFileName, zip);
+
+ byte[] zip = createZipArchive(templateSketchPath, processTemplateFiles);
+ return new ZipArchive(zipFileName, zip);
} catch (IOException ex) {
throw new DeviceManagementException(
"Error occurred when trying to read property " + "file sketch.properties", ex);
@@ -206,9 +191,7 @@ public class ZipUtil {
InputStream input = null;
try {
-
input = new FileInputStream(propertyFilePath);
-
// load a properties file
prop.load(input);
Map> properties = new HashMap>();
@@ -235,148 +218,124 @@ public class ZipUtil {
}
}
- private static void parseTemplate(String srcFile, String dstFile, Map contextParams) throws IOException {
+ private static String parseTemplate(String srcFile, Map contextParams) throws IOException {
//read from file
FileInputStream inputStream = null;
- FileOutputStream outputStream = null;
try {
inputStream = new FileInputStream(srcFile);
- outputStream = new FileOutputStream(dstFile);
String content = IOUtils.toString(inputStream, StandardCharsets.UTF_8.toString());
Iterator iterator = contextParams.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry mapEntry = (Map.Entry) iterator.next();
content = content.replaceAll("\\$\\{" + mapEntry.getKey() + "\\}", mapEntry.getValue().toString());
}
- IOUtils.write(content, outputStream, StandardCharsets.UTF_8.toString());
+ return content;
} finally {
if (inputStream != null) {
inputStream.close();
}
- if (outputStream != null) {
- outputStream.close();
- }
}
}
- private static void copyFolder(File src, File dest, List excludeFileNames) throws IOException {
-
- if (src.isDirectory()) {
- //if directory not exists, create it
- if (!dest.exists() && !dest.mkdirs()) {
- String message = "Could not create directory at path: " + dest;
- log.error(message);
- throw new IOException(message);
- }
- //list all the directory contents
- String files[] = src.list();
-
- if (files == null) {
- log.warn("There are no files insides the directory " + src.getAbsolutePath());
- return;
- }
-
- for (String file : files) {
- //construct the src and dest file structure
- File srcFile = new File(src, file);
- File destFile = new File(dest, file);
- //recursive copy
- copyFolder(srcFile, destFile, excludeFileNames);
- }
-
- } else {
- for (String fileName : excludeFileNames) {
- if (src.getName().equals(fileName)) {
- return;
- }
- }
- //if file, then copy it
- //Use bytes stream to support all file types
- InputStream in = null;
- OutputStream out = null;
-
- try {
- in = new FileInputStream(src);
- out = new FileOutputStream(dest);
-
- byte[] buffer = new byte[1024];
-
- int length;
- //copy the file content in bytes
- while ((length = in.read(buffer)) > 0) {
- out.write(buffer, 0, length);
- }
- } finally {
- if (in != null) {
- in.close();
- }
- if (out != null) {
- out.close();
- }
- }
- }
- }
-
- private static boolean createZipArchive(String srcFolder) throws IOException {
- BufferedInputStream origin = null;
+ private static byte[] createZipArchive(String srcFolder, List processTemplateFiles) throws IOException {
ZipOutputStream out = null;
-
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
- final int BUFFER = 2048;
- FileOutputStream dest = new FileOutputStream(new File(srcFolder + ".zip"));
- out = new ZipOutputStream(new BufferedOutputStream(dest));
- byte data[] = new byte[BUFFER];
+ out = new ZipOutputStream(new BufferedOutputStream(baos));
File subDir = new File(srcFolder);
String subdirList[] = subDir.list();
if (subdirList == null) {
log.warn("The sub directory " + subDir.getAbsolutePath() + " is empty");
- return false;
+ return null;
}
for (String sd : subdirList) {
// get a list of files from current directory
- File f = new File(srcFolder + "/" + sd);
+ File f = new File(srcFolder + File.separator + sd);
if (f.isDirectory()) {
String files[] = f.list();
if (files == null) {
log.warn("The current directory " + f.getAbsolutePath() + " is empty. Has no files");
- return false;
+ return null;
}
for (int i = 0; i < files.length; i++) {
- FileInputStream fi = new FileInputStream(srcFolder + "/" + sd + "/" + files[i]);
- origin = new BufferedInputStream(fi, BUFFER);
- ZipEntry entry = new ZipEntry(sd + "/" + files[i]);
- out.putNextEntry(entry);
- int count;
- while ((count = origin.read(data, 0, BUFFER)) != -1) {
- out.write(data, 0, count);
- out.flush();
+ boolean fileAdded = false;
+ for (TemplateFile templateFile : processTemplateFiles) {
+ if (files[i].equals(templateFile.getFileName())) {
+ ZipEntry entry = new ZipEntry(templateFile.getFileName());
+ out.putNextEntry(entry);
+ out.write(templateFile.getContent().getBytes());
+ out.closeEntry();
+ fileAdded = true;
+ break;
+ } else if (f.getName().equals("sketch.properties")) {
+ fileAdded = true;
+ break;
+ }
}
+ if (fileAdded) {
+ continue;
+ }
+ ZipEntry entry = new ZipEntry(sd + File.separator + files[i]);
+ out.putNextEntry(entry);
+ out.write(IOUtils.toByteArray(new FileInputStream(srcFolder + File.separator + sd
+ + File.separator + files[i])));
+ out.closeEntry();
}
} else //it is just a file
{
- FileInputStream fi = new FileInputStream(f);
- origin = new BufferedInputStream(fi, BUFFER);
+ boolean fileAdded = false;
+ for (TemplateFile templateFile : processTemplateFiles) {
+ if (f.getName().equals(templateFile.getFileName())) {
+ ZipEntry entry = new ZipEntry(templateFile.getFileName());
+ out.putNextEntry(entry);
+ out.write(templateFile.getContent().getBytes());
+ out.closeEntry();
+ fileAdded = true;
+ break;
+ } else if (f.getName().equals("sketch.properties")) {
+ fileAdded = true;
+ break;
+ }
+ }
+ if (fileAdded) {
+ continue;
+ }
ZipEntry entry = new ZipEntry(sd);
out.putNextEntry(entry);
- int count;
- while ((count = origin.read(data, 0, BUFFER)) != -1) {
- out.write(data, 0, count);
- out.flush();
- }
+ out.write(IOUtils.toByteArray(new FileInputStream(f)));
+ out.closeEntry();
}
}
- out.flush();
+ out.finish();
} finally {
- if (origin != null) {
- origin.close();
- }
if (out != null) {
out.close();
}
}
- return true;
+ return baos.toByteArray();
+ }
+
+ public class TemplateFile {
+ private String content;
+ private String fileName;
+
+ public String getContent() {
+ return content;
+ }
+
+ public void setContent(String content) {
+ this.content = content;
+ }
+
+ public String getFileName() {
+ return fileName;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
}
}
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/util/Utils.java b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/util/Utils.java
deleted file mode 100644
index 586de223c..000000000
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/util/Utils.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2016, 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.device.mgt.iot.virtualfirealarm.service.impl.util.util;
-
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.wso2.carbon.base.ServerConfiguration;
-import org.wso2.carbon.device.mgt.common.DeviceManagementException;
-import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util.ZipArchive;
-import org.wso2.carbon.utils.CarbonUtils;
-import org.wso2.carbon.utils.NetworkUtils;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.SocketException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-/**
- * Provides utility methods required by the device type plugins.
- */
-public class Utils {
-
- public static final String HOST_NAME = "HostName";
- private static final Log log = LogFactory.getLog(Utils.class);
-
-
-
-}
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.scep.api/pom.xml b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.scep.api/pom.xml
deleted file mode 100644
index ea477f5eb..000000000
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.scep.api/pom.xml
+++ /dev/null
@@ -1,199 +0,0 @@
-
-
-
-
-
- virtual-fire-alarm-plugin
- org.wso2.carbon.devicemgt-plugins
- 3.0.6-SNAPSHOT
- ../pom.xml
-
-
- 4.0.0
- org.wso2.carbon.device.mgt.iot.virtualfirealarm.scep.api
- war
- WSO2 Carbon - IoT Server SCEP Server API
- WSO2 Carbon - Virtual FireAlarm SCEP Server API Implementation
- http://wso2.org
-
-
-
-
- org.wso2.carbon.devicemgt
- org.wso2.carbon.device.mgt.common
- provided
-
-
- org.wso2.carbon.devicemgt
- org.wso2.carbon.device.mgt.core
- provided
-
-
- org.apache.axis2.wso2
- axis2-client
-
-
-
-
-
- org.wso2.carbon.devicemgt
- org.wso2.carbon.certificate.mgt.core
- provided
-
-
- commons-codec
- commons-codec
-
-
-
-
-
-
-
- org.apache.cxf
- cxf-rt-frontend-jaxws
- provided
-
-
- org.apache.cxf
- cxf-rt-frontend-jaxrs
- provided
-
-
- org.apache.cxf
- cxf-rt-transports-http
- provided
-
-
-
-
- org.codehaus.jackson
- jackson-core-asl
-
-
- org.codehaus.jackson
- jackson-jaxrs
-
-
- javax
- javaee-web-api
- provided
-
-
- javax.ws.rs
- jsr311-api
- provided
-
-
- commons-httpclient.wso2
- commons-httpclient
- provided
-
-
-
- org.wso2.carbon
- org.wso2.carbon.utils
- provided
-
-
- org.bouncycastle.wso2
- bcprov-jdk15on
-
-
- org.wso2.carbon
- org.wso2.carbon.user.api
-
-
- org.wso2.carbon
- org.wso2.carbon.queuing
-
-
- org.wso2.carbon
- org.wso2.carbon.base
-
-
- org.apache.axis2.wso2
- axis2
-
-
- org.igniterealtime.smack.wso2
- smack
-
-
- org.igniterealtime.smack.wso2
- smackx
-
-
- jaxen
- jaxen
-
-
- commons-fileupload.wso2
- commons-fileupload
-
-
- org.apache.ant.wso2
- ant
-
-
- org.apache.ant.wso2
- ant
-
-
- commons-httpclient.wso2
- commons-httpclient
-
-
- org.eclipse.equinox
- javax.servlet
-
-
- org.wso2.carbon
- org.wso2.carbon.registry.api
-
-
-
-
-
- commons-codec
- commons-codec
-
-
-
-
-
-
-
- maven-compiler-plugin
-
- UTF-8
-
- ${wso2.maven.compiler.target}
-
-
-
- maven-war-plugin
-
- virtual_firealarm_scep
-
-
-
-
-
-
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/pom.xml b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/pom.xml
index 7fbe10a02..be4b79b20 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/pom.xml
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/pom.xml
@@ -23,7 +23,7 @@
virtual-fire-alarm-pluginorg.wso2.carbon.devicemgt-plugins
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.realtime.analytics-view/analytics-view.js b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.realtime.analytics-view/analytics-view.js
index 7aaad19c6..5c34b9331 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.realtime.analytics-view/analytics-view.js
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.realtime.analytics-view/analytics-view.js
@@ -39,4 +39,4 @@ function onRequest(context) {
+ "deviceId=" + device.deviceIdentifier + "&deviceType=" + device.type + "&websocketToken=" + token;
}
return {"device": device, "websocketEndpoint": websocketEndpoint};
-}
\ No newline at end of file
+}
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.type-view/public/js/download.js b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.type-view/public/js/download.js
index 991796825..a667ef4cc 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.type-view/public/js/download.js
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.type-view/public/js/download.js
@@ -21,6 +21,8 @@ var modalPopupContainer = modalPopup + " .modal-content";
var modalPopupContent = modalPopup + " .modal-content";
var body = "body";
+var backendEndBasePath = "/api/device-mgt/v1.0";
+
/*
* Set popup maximum height function.
*/
@@ -132,4 +134,31 @@ function doAction(data) {
hideAgentDownloadPopup();
});
}
+}
+
+function artifactUpload() {
+ var contentType = "application/json";
+
+ var urix = backendEndBasePath + "/admin/devicetype/deploy/virtual_firealarm";
+ var defaultStatusClasses = "fw fw-stack-1x";
+ var content = $("#virtualfirealarm-statistic-response-template").find(".content");
+ var title = content.find("#title");
+ var statusIcon = content.find("#status-icon");
+ var data = {}
+ invokerUtil.post(urix, data, function (data) {
+ title.html("Deploying statistic artifacts. Please wait...");
+ statusIcon.attr("class", defaultStatusClasses + " fw-check");
+ $(modalPopupContent).html(content.html());
+ showPopup();
+ setTimeout(function () {
+ hidePopup();
+ location.reload(true);
+ }, 5000);
+
+ }, function (jqXHR) {
+ title.html("Failed to deploy artifacts, Please contact administrator.");
+ statusIcon.attr("class", defaultStatusClasses + " fw-error");
+ $(modalPopupContent).html(content.html());
+ showPopup();
+ }, contentType);
}
\ No newline at end of file
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.type-view/type-view.hbs b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.type-view/type-view.hbs
index c37a9b9c0..922ace659 100644
--- a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.type-view/type-view.hbs
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.type-view/type-view.hbs
@@ -54,6 +54,10 @@
Download Agent
+ {{#if displayStatus}}
+ Deploy Analytics Artifacts
+ {{/if}}
+
Click [ here ] for latest instructions and
troubleshooting.
@@ -260,6 +264,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{#zone "topCss"}}
{{css "css/styles.css"}}
{{/zone}}
diff --git a/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.type-view/type-view.js b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.type-view/type-view.js
new file mode 100644
index 000000000..ea24f499c
--- /dev/null
+++ b/components/device-types/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.virtual_firealarm.type-view/type-view.js
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2016, 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.
+ */
+
+function onRequest(context){
+ var viewModel = {};
+ var devicemgtProps = require("/app/modules/conf-reader/main.js")["conf"];
+ var serviceInvokers = require("/app/modules/oauth/token-protected-service-invokers.js")["invokers"];
+ var url = devicemgtProps["httpsURL"] + "/api/device-mgt/v1.0/admin/devicetype/deploy/virtual_firealarm/status";
+ serviceInvokers.XMLHttp.get(
+ url, function (responsePayload) {
+ var responseContent = responsePayload.status;
+ new Log().error(responseContent);
+ if ("204" == responsePayload.status) {
+ viewModel["displayStatus"] = "Display";
+ }
+ },
+ function (responsePayload) {
+ //do nothing.
+ }
+ );
+ return viewModel;
+}
\ No newline at end of file
diff --git a/components/device-types/virtual-fire-alarm-plugin/pom.xml b/components/device-types/virtual-fire-alarm-plugin/pom.xml
index 935d73e49..f55d5fb32 100644
--- a/components/device-types/virtual-fire-alarm-plugin/pom.xml
+++ b/components/device-types/virtual-fire-alarm-plugin/pom.xml
@@ -22,7 +22,7 @@
org.wso2.carbon.devicemgt-pluginsdevice-types
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.osgiconnector/pom.xml b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.osgiconnector/pom.xml
index f81aedf64..749323340 100644
--- a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.osgiconnector/pom.xml
+++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.osgiconnector/pom.xml
@@ -18,7 +18,7 @@
org.wso2.carbon.devicemgt-pluginsappm-connector
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/pom.xml b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/pom.xml
index 95489a87c..34d79be58 100644
--- a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/pom.xml
+++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/pom.xml
@@ -18,7 +18,7 @@
org.wso2.carbon.devicemgt-pluginsappm-connector
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
@@ -27,6 +27,7 @@
bundleWSO2 Carbon - App Manager WSO2 MDM REST Connector Componenthttp://maven.apache.org
+
@@ -51,6 +52,8 @@
${project.artifactId}org.wso2.carbon.appmgt.mdm.restconnector.internal
+ org.osgi.framework,
+ org.osgi.service.component,
org.wso2.carbon.appmgt.mobile.utils.*,
org.wso2.carbon.appmgt.mobile.mdm.*,
org.wso2.carbon.appmgt.mobile.interfaces.*,
@@ -62,7 +65,11 @@
feign.auth,
feign.codec,
feign.gson,
- *;resolution:=optional
+ org.json.simple.*,
+ org.wso2.carbon.appmgt.mobile.beans,
+ org.wso2.carbon.context,
+ javax.net.ssl,
+ feign.slf4j
!org.wso2.carbon.appmgt.mdm.restconnector.internal,
@@ -70,8 +77,7 @@
jsr311-api,
- feign-jaxrs,
- org.wso2.carbon.device.mgt.common
+ feign-jaxrs
@@ -80,38 +86,14 @@
-
- commons-io.wso2
- commons-io
- com.googlecode.json-simple.wso2json-simple
-
- com.googlecode.plist
- dd-plist
- org.wso2.carbonorg.wso2.carbon.logging
-
- org.apache.felix
- org.apache.felix.scr
-
-
- org.wso2.carbon
- org.wso2.carbon.ndatasource.core
-
-
- org.wso2.carbon.governance
- org.wso2.carbon.governance.api
-
-
- org.wso2.carbon.appmgt
- org.wso2.carbon.appmgt.mobile
- org.wso2.carbon.devicemgtorg.wso2.carbon.identity.jwt.client.extension
@@ -136,21 +118,14 @@
io.swaggerswagger-jaxrs
-
- org.wso2.carbon.devicemgt
- org.wso2.carbon.device.mgt.common
-
-
- org.apache.ws.commons.axiom
- axiom-api
-
-
- org.apache.ws.commons.axiom
- axiom-impl
-
-
-
-
+
+ org.wso2.carbon.appmgt
+ org.wso2.carbon.appmgt.mobile
+
+
+ io.github.openfeign
+ feign-slf4j
+
diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/ApplicationOperationsImpl.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/ApplicationOperationsImpl.java
index 4f3580165..a049c3fab 100644
--- a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/ApplicationOperationsImpl.java
+++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/ApplicationOperationsImpl.java
@@ -17,16 +17,22 @@
*/
package org.wso2.carbon.appmgt.mdm.restconnector;
+import feign.Client;
import feign.Feign;
+import feign.Logger;
+import feign.Request;
+import feign.Response;
import feign.gson.GsonDecoder;
import feign.gson.GsonEncoder;
import feign.jaxrs.JAXRSContract;
+import feign.slf4j.Slf4jLogger;
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.appmgt.mdm.restconnector.authorization.client.OAuthRequestInterceptor;
+import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.Activity;
import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.ApplicationManagementAdminService;
import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.ApplicationWrapper;
import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.DeviceManagementAdminService;
@@ -42,8 +48,16 @@ import org.wso2.carbon.appmgt.mobile.mdm.Device;
import org.wso2.carbon.appmgt.mobile.utils.MobileApplicationException;
import org.wso2.carbon.appmgt.mobile.utils.MobileConfigurations;
import org.wso2.carbon.context.PrivilegedCarbonContext;
-import org.wso2.carbon.device.mgt.common.operation.mgt.Activity;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -62,13 +76,13 @@ public class ApplicationOperationsImpl implements ApplicationOperations {
public ApplicationOperationsImpl() {
String authorizationConfigManagerServerURL = AuthorizationConfigurationManager.getInstance().getServerURL();
OAuthRequestInterceptor oAuthRequestInterceptor = new OAuthRequestInterceptor();
- deviceManagementAdminService = Feign.builder()
- .requestInterceptor(oAuthRequestInterceptor)
+ deviceManagementAdminService = Feign.builder().client(getSSLClient()).logger(new Slf4jLogger()).logLevel(
+ Logger.Level.FULL).requestInterceptor(oAuthRequestInterceptor)
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
.target(DeviceManagementAdminService.class,
authorizationConfigManagerServerURL + CDMF_SERVER_BASE_CONTEXT);
- applicationManagementAdminService = Feign.builder()
- .requestInterceptor(oAuthRequestInterceptor)
+ applicationManagementAdminService = Feign.builder().client(getSSLClient()).logger(new Slf4jLogger()).logLevel(
+ Logger.Level.FULL).requestInterceptor(oAuthRequestInterceptor)
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
.target(ApplicationManagementAdminService.class,
authorizationConfigManagerServerURL + CDMF_SERVER_BASE_CONTEXT);
@@ -271,4 +285,37 @@ public class ApplicationOperationsImpl implements ApplicationOperations {
log.error(errorMessage);
}
}
+
+ private static Client getSSLClient() {
+ return new Client.Default(getTrustedSSLSocketFactory(), new HostnameVerifier() {
+ @Override
+ public boolean verify(String s, SSLSession sslSession) {
+ return true;
+ }
+ });
+ }
+
+ private static SSLSocketFactory getTrustedSSLSocketFactory() {
+ try {
+ TrustManager[] trustAllCerts = new TrustManager[]{
+ new X509TrustManager() {
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+ public void checkClientTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ public void checkServerTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ }
+ };
+ SSLContext sc = SSLContext.getInstance("SSL");
+ sc.init(null, trustAllCerts, new java.security.SecureRandom());
+ return sc.getSocketFactory();
+ } catch (KeyManagementException | NoSuchAlgorithmException e) {
+ return null;
+ }
+ }
+
}
\ No newline at end of file
diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/OAuthRequestInterceptor.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/OAuthRequestInterceptor.java
index 48bf79df8..9c4f80b71 100755
--- a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/OAuthRequestInterceptor.java
+++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/OAuthRequestInterceptor.java
@@ -17,13 +17,20 @@
*/
package org.wso2.carbon.appmgt.mdm.restconnector.authorization.client;
+import feign.Client;
import feign.Feign;
+import feign.Logger;
+import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
+import feign.Response;
import feign.auth.BasicAuthRequestInterceptor;
import feign.gson.GsonDecoder;
import feign.gson.GsonEncoder;
import feign.jaxrs.JAXRSContract;
+import feign.slf4j.Slf4jLogger;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.appmgt.mdm.restconnector.Constants;
import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.AccessTokenInfo;
import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.ApiApplicationKey;
@@ -33,6 +40,16 @@ import org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto.TokenIs
import org.wso2.carbon.appmgt.mdm.restconnector.config.AuthorizationConfigurationManager;
import org.wso2.carbon.appmgt.mdm.restconnector.internal.AuthorizationDataHolder;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+
/**
* This is a request interceptor to add oauth token header.
*/
@@ -46,6 +63,8 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
private static final String REFRESH_GRANT_TYPE = "refresh_token";
private ApiApplicationRegistrationService apiApplicationRegistrationService;
private TokenIssuerService tokenIssuerService;
+ private static Log log = LogFactory.getLog(OAuthRequestInterceptor.class);
+
/**
* Creates an interceptor that authenticates all requests.
@@ -54,8 +73,8 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
refreshTimeOffset = AuthorizationConfigurationManager.getInstance().getTokenRefreshTimeOffset();
String username = AuthorizationConfigurationManager.getInstance().getUserName();
String password = AuthorizationConfigurationManager.getInstance().getPassword();
- apiApplicationRegistrationService = Feign.builder().requestInterceptor(
- new BasicAuthRequestInterceptor(username, password))
+ apiApplicationRegistrationService = Feign.builder().client(getSSLClient()).logger(new Slf4jLogger()).logLevel(
+ Logger.Level.FULL).requestInterceptor(new BasicAuthRequestInterceptor(username, password))
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
.target(ApiApplicationRegistrationService.class,
AuthorizationConfigurationManager.getInstance().getServerURL() +
@@ -82,8 +101,8 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
String consumerSecret = apiApplicationKey.getConsumerSecret();
String username = AuthorizationConfigurationManager.getInstance().getUserName();
String password = AuthorizationConfigurationManager.getInstance().getPassword();
- tokenIssuerService = Feign.builder().requestInterceptor(
- new BasicAuthRequestInterceptor(consumerKey, consumerSecret))
+ tokenIssuerService = Feign.builder().client(getSSLClient()).logger(new Slf4jLogger()).logLevel(Logger.Level.FULL)
+ .requestInterceptor(new BasicAuthRequestInterceptor(consumerKey, consumerSecret))
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
.target(TokenIssuerService.class, AuthorizationConfigurationManager.getInstance().getTokenApiURL());
tokenInfo = tokenIssuerService.getToken(PASSWORD_GRANT_TYPE, username, password);
@@ -98,4 +117,37 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
String headerValue = Constants.RestConstants.BEARER + tokenInfo.getAccess_token();
template.header(Constants.RestConstants.AUTHORIZATION, headerValue);
}
+
+ private static Client getSSLClient() {
+ return new Client.Default(getTrustedSSLSocketFactory(), new HostnameVerifier() {
+ @Override
+ public boolean verify(String s, SSLSession sslSession) {
+ return true;
+ }
+ });
+ }
+
+ private static SSLSocketFactory getTrustedSSLSocketFactory() {
+ try {
+ TrustManager[] trustAllCerts = new TrustManager[]{
+ new X509TrustManager() {
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+ public void checkClientTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ public void checkServerTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ }
+ };
+ SSLContext sc = SSLContext.getInstance("SSL");
+ sc.init(null, trustAllCerts, new java.security.SecureRandom());
+ return sc.getSocketFactory();
+ } catch (KeyManagementException | NoSuchAlgorithmException e) {
+ return null;
+ }
+ }
+
}
diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/Activity.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/Activity.java
new file mode 100644
index 000000000..b373a1c63
--- /dev/null
+++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/Activity.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2016, 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.appmgt.mdm.restconnector.authorization.client.dto;
+
+
+public class Activity {
+
+ public enum Type {
+ CONFIG, MESSAGE, INFO, COMMAND, PROFILE, POLICY
+ }
+ private String activityId;
+ private String code;
+ private Type type;
+ private String createdTimeStamp;
+
+ public String getActivityId() {
+ return activityId;
+ }
+
+ public void setActivityId(String activityId) {
+ this.activityId = activityId;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public Type getType() {
+ return type;
+ }
+
+ public void setType(Type type) {
+ this.type = type;
+ }
+
+ public String getCreatedTimeStamp() {
+ return createdTimeStamp;
+ }
+
+ public void setCreatedTimeStamp(String createdTimeStamp) {
+ this.createdTimeStamp = createdTimeStamp;
+ }
+}
+
diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApplicationManagementAdminService.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApplicationManagementAdminService.java
index 3b390a7a8..e48e8e5c1 100644
--- a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApplicationManagementAdminService.java
+++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/ApplicationManagementAdminService.java
@@ -17,7 +17,6 @@
*/
package org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto;
-import org.wso2.carbon.device.mgt.common.operation.mgt.Activity;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/BasePaginatedResult.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/BasePaginatedResult.java
deleted file mode 100644
index 64527d32f..000000000
--- a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/BasePaginatedResult.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (c) 2017, 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.appmgt.mdm.restconnector.authorization.client.dto;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModelProperty;
-
-/**
- * Number of Resources.
- */
-public class BasePaginatedResult {
- @ApiModelProperty(value = "Number of total resources.", example = "2")
- @JsonProperty("count")
- private int count;
-
- public int getCount() {
- return count;
- }
-
- public void setCount(int count) {
- this.count = count;
- }
-}
\ No newline at end of file
diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/Device.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/Device.java
index 24916c1fa..96af8865a 100644
--- a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/Device.java
+++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/Device.java
@@ -17,10 +17,7 @@
*/
package org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto;
-import org.wso2.carbon.device.mgt.common.Feature;
-
import java.io.Serializable;
-import java.util.List;
/**
* The DTO class of device.
@@ -37,15 +34,6 @@ public class Device implements Serializable {
public Device() {
}
- public Device(String name, String type, String description, String deviceId, EnrolmentInfo enrolmentInfo,
- List features, List properties) {
- this.name = name;
- this.type = type;
- this.description = description;
- this.deviceIdentifier = deviceId;
- this.enrolmentInfo = enrolmentInfo;
- }
-
public int getId() {
return id;
}
@@ -130,22 +118,4 @@ public class Device implements Serializable {
"]" +
"]";
}
-
- @Override
- public boolean equals(Object o) {
- if (this == o)
- return true;
- if (!(o instanceof org.wso2.carbon.device.mgt.common.Device))
- return false;
-
- org.wso2.carbon.device.mgt.common.Device device = (org.wso2.carbon.device.mgt.common.Device) o;
-
- return getDeviceIdentifier().equals(device.getDeviceIdentifier());
-
- }
-
- @Override
- public int hashCode() {
- return getDeviceIdentifier().hashCode();
- }
}
diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/DeviceList.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/DeviceList.java
index cbb866175..6470910c2 100644
--- a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/DeviceList.java
+++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/authorization/client/dto/DeviceList.java
@@ -17,17 +17,21 @@
*/
package org.wso2.carbon.appmgt.mdm.restconnector.authorization.client.dto;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import io.swagger.annotations.ApiModelProperty;
-
import java.util.ArrayList;
import java.util.List;
-public class DeviceList extends BasePaginatedResult {
+public class DeviceList {
private List devices = new ArrayList<>();
+ private int count;
+
+ public int getCount() {
+ return count;
+ }
+
+ public void setCount(int count) {
+ this.count = count;
+ }
- @ApiModelProperty(value = "List of devices returned")
- @JsonProperty("devices")
public List getList() {
return devices;
}
diff --git a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/internal/MDMComponent.java b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/internal/MDMComponent.java
index e1830d425..2c1e6b2f1 100644
--- a/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/internal/MDMComponent.java
+++ b/components/extensions/appm-connector/org.wso2.carbon.appmgt.mdm.restconnector/src/main/java/org/wso2/carbon/appmgt/mdm/restconnector/internal/MDMComponent.java
@@ -53,4 +53,4 @@ public class MDMComponent {
log.debug("WSO2MDM MDM Component deactivated");
}
}
-}
\ No newline at end of file
+}
diff --git a/components/extensions/appm-connector/pom.xml b/components/extensions/appm-connector/pom.xml
index 2cba956a1..09f659c5b 100644
--- a/components/extensions/appm-connector/pom.xml
+++ b/components/extensions/appm-connector/pom.xml
@@ -22,7 +22,7 @@
org.wso2.carbon.devicemgt-pluginsextensions
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/pom.xml b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/pom.xml
index a86b13a8d..4ac83c610 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/pom.xml
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/pom.xml
@@ -20,7 +20,7 @@
org.wso2.carbon.devicemgt-pluginscdmf-transport-adapters
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../../pom.xml4.0.0
@@ -33,6 +33,18 @@
+
+ org.apache.felix
+ maven-scr-plugin
+
+
+ generate-scr-descriptor
+
+ scr
+
+
+
+ org.apache.maven.pluginsmaven-surefire-plugin
@@ -45,12 +57,48 @@
${project.artifactId}${project.artifactId}
+
+ org.wso2.carbon.device.mgt.input.adapter.extension.internal,
+ org.wso2.carbon.device.mgt.input.adapter.extension.internal.*
+
- org.wso2.carbon.device.mgt.input.adapter.extension.*
+ org.wso2.carbon.device.mgt.input.adapter.extension.*,
+ !org.wso2.carbon.device.mgt.input.adapter.extension.internal,
+
+ org.osgi.framework,
+ org.osgi.service.component,
+ com.jayway.jsonpath,
+ org.apache.commons.logging,
+ org.json.simple,
+ org.json.simple.parser
+
+
+
+
+ org.wso2.carbon
+ org.wso2.carbon.logging
+
+
+ com.googlecode.json-simple.wso2
+ json-simple
+
+
+ com.jayway.jsonpath
+ json-path
+
+
+ org.eclipse.osgi
+ org.eclipse.osgi
+
+
+ org.eclipse.osgi
+ org.eclipse.osgi.services
+
+
\ No newline at end of file
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/ContentTransformer.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/ContentTransformer.java
index d86aaaab5..8c3b3033f 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/ContentTransformer.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/ContentTransformer.java
@@ -25,6 +25,11 @@ import java.util.Map;
*/
public interface ContentTransformer {
+ /**
+ * This returns the type of ContentTransformer.
+ */
+ String getType();
+
/**
* This is used to transform the receiver content
* @param message message to be format
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/ContentValidator.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/ContentValidator.java
index d01536c5a..e3e81c471 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/ContentValidator.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/ContentValidator.java
@@ -24,6 +24,13 @@ import java.util.Map;
* This interface will be triggered to validate the stream content before publishing.
*/
public interface ContentValidator {
+
+ /**
+ * this returns the unique name of ContentValidatorType.
+ * @return
+ */
+ String getType();
+
/**
* @param dynamicParameter that message.
* @return ContentInfo.
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/InputAdapterExtensionService.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/InputAdapterExtensionService.java
new file mode 100644
index 000000000..28046b73b
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/InputAdapterExtensionService.java
@@ -0,0 +1,34 @@
+package org.wso2.carbon.device.mgt.input.adapter.extension;
+
+/**
+ * This hold the input adapter extension service.
+ */
+public interface InputAdapterExtensionService {
+
+ /**
+ * return content validator for the given type.
+ * @param type type of the content validator
+ * @return content validator for the given type.
+ */
+ ContentValidator getContentValidator(String type);
+
+ /**
+ * return default content validator for the given type.
+ * @return default content validator for the given type.
+ */
+ ContentValidator getDefaultContentValidator();
+
+ /**
+ * return content transformer for the given type.
+ * @param type of the content transfomer
+ * @return content transformer for the given type.
+ */
+ ContentTransformer getContentTransformer(String type);
+
+ /**
+ * return default content transformer for the given type.
+ * @return default content transformer for the given type.
+ */
+ ContentTransformer getDefaultContentTransformer();
+
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/InputAdapterExtensionServiceImpl.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/InputAdapterExtensionServiceImpl.java
new file mode 100644
index 000000000..5d1d33448
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/InputAdapterExtensionServiceImpl.java
@@ -0,0 +1,31 @@
+package org.wso2.carbon.device.mgt.input.adapter.extension;
+
+import org.wso2.carbon.device.mgt.input.adapter.extension.internal.InputAdapterServiceDataHolder;
+
+/**
+ * This hold the input adapter extension service implementation.
+ */
+public class InputAdapterExtensionServiceImpl implements InputAdapterExtensionService {
+ private static final String DEFAULT = "default";
+
+
+ @Override
+ public ContentValidator getContentValidator(String type) {
+ return InputAdapterServiceDataHolder.getInstance().getContentValidatorMap().get(type);
+ }
+
+ @Override
+ public ContentValidator getDefaultContentValidator() {
+ return InputAdapterServiceDataHolder.getInstance().getContentValidatorMap().get(DEFAULT);
+ }
+
+ @Override
+ public ContentTransformer getContentTransformer(String type) {
+ return InputAdapterServiceDataHolder.getInstance().getContentTransformerMap().get(type);
+ }
+
+ @Override
+ public ContentTransformer getDefaultContentTransformer() {
+ return InputAdapterServiceDataHolder.getInstance().getContentTransformerMap().get(DEFAULT);
+ }
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/internal/InputAdapterServiceComponent.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/internal/InputAdapterServiceComponent.java
new file mode 100644
index 000000000..b7370fa3a
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/internal/InputAdapterServiceComponent.java
@@ -0,0 +1,96 @@
+/*
+* 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.device.mgt.input.adapter.extension.internal;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.osgi.service.component.ComponentContext;
+import org.wso2.carbon.device.mgt.input.adapter.extension.ContentTransformer;
+import org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator;
+import org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionService;
+import org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionServiceImpl;
+import org.wso2.carbon.device.mgt.input.adapter.extension.transformer.DefaultContentTransformer;
+import org.wso2.carbon.device.mgt.input.adapter.extension.validator.DefaultContentValidator;
+import org.wso2.carbon.device.mgt.input.adapter.extension.validator.HTTPContentValidator;
+import org.wso2.carbon.device.mgt.input.adapter.extension.validator.MQTTContentValidator;
+
+/**
+ * @scr.component name="input.adapter.extension.adapterService.component" immediate="true"
+ * @scr.reference name="InputAdapterServiceComponent.service"
+ * interface="org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator"
+ * cardinality="0..n"
+ * policy="dynamic"
+ * bind="setContentValidator"
+ * unbind="unsetContentValidator"
+ * * @scr.reference name="InputAdapterServiceComponent.service"
+ * interface="org.wso2.carbon.device.mgt.input.adapter.extension.ContentTransformer"
+ * cardinality="0..n"
+ * policy="dynamic"
+ * bind="setContentTransformer"
+ * unbind="unsetContentTransformer"
+ */
+public class InputAdapterServiceComponent {
+
+ private static final Log log = LogFactory.getLog(
+ InputAdapterServiceComponent.class);
+
+ protected void activate(ComponentContext context) {
+ try {
+ if (log.isDebugEnabled()) {
+ log.debug("Successfully deployed the input adapter extension service");
+ }
+
+ InputAdapterServiceDataHolder.getInstance().addContentTransformer(new DefaultContentTransformer());
+ InputAdapterServiceDataHolder.getInstance().addContentValidator(new DefaultContentValidator());
+ InputAdapterServiceDataHolder.getInstance().addContentValidator(new HTTPContentValidator());
+ InputAdapterServiceDataHolder.getInstance().addContentValidator(new MQTTContentValidator());
+
+ context.getBundleContext().registerService(InputAdapterExtensionService.class,
+ new InputAdapterExtensionServiceImpl(), null);
+ } catch (RuntimeException e) {
+ log.error("Can not create the input adapter service ", e);
+ }
+ }
+
+ protected void setContentValidator(ContentValidator contentValidator) {
+ if (log.isDebugEnabled()) {
+ log.debug("Setting ContentValidator Service");
+ }
+ InputAdapterServiceDataHolder.getInstance().addContentValidator(contentValidator);
+ }
+
+ protected void unsetContentValidator(ContentValidator contentValidator) {
+ if (log.isDebugEnabled()) {
+ log.debug("Un-setting ContentValidator Service");
+ }
+ }
+
+ protected void setContentTransformer(ContentTransformer contentTransformer) {
+ if (log.isDebugEnabled()) {
+ log.debug("Setting contentTransformer Service");
+ }
+ InputAdapterServiceDataHolder.getInstance().addContentTransformer(contentTransformer);
+ }
+
+ protected void unsetContentValidator(ContentTransformer contentTransformer) {
+ if (log.isDebugEnabled()) {
+ log.debug("Un-setting ContentTransformer Service");
+ }
+ }
+
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/internal/InputAdapterServiceDataHolder.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/internal/InputAdapterServiceDataHolder.java
new file mode 100644
index 000000000..fc299ae26
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/internal/InputAdapterServiceDataHolder.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * 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.
+ */
+package org.wso2.carbon.device.mgt.input.adapter.extension.internal;
+
+import org.wso2.carbon.device.mgt.input.adapter.extension.ContentTransformer;
+import org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * common place to hold some OSGI service references.
+ */
+public class InputAdapterServiceDataHolder {
+
+ private static InputAdapterServiceDataHolder inputAdapterServiceDataHolder = new InputAdapterServiceDataHolder();
+ private static Map contentValidatorMap = new HashMap<>();
+ private static Map contentTransformerMap = new HashMap<>();
+
+ private InputAdapterServiceDataHolder() {
+ }
+
+ public static InputAdapterServiceDataHolder getInstance() {
+ return inputAdapterServiceDataHolder;
+ }
+
+ public Map getContentValidatorMap() {
+ return contentValidatorMap;
+ }
+
+ public void addContentValidator(ContentValidator contentValidator) {
+ InputAdapterServiceDataHolder.contentValidatorMap.put(contentValidator.getType(), contentValidator);
+ }
+
+ public Map getContentTransformerMap() {
+ return contentTransformerMap;
+ }
+
+ public void addContentTransformer(ContentTransformer contentTransformer) {
+ InputAdapterServiceDataHolder.contentTransformerMap.put(contentTransformer.getType(), contentTransformer);
+ }
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/DefaultContentTransformer.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/transformer/DefaultContentTransformer.java
similarity index 74%
rename from components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/DefaultContentTransformer.java
rename to components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/transformer/DefaultContentTransformer.java
index 9e0f5f256..fe73bd37f 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/DefaultContentTransformer.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/transformer/DefaultContentTransformer.java
@@ -16,14 +16,22 @@
* under the License.
*/
-package org.wso2.carbon.device.mgt.input.adapter.extension;
+package org.wso2.carbon.device.mgt.input.adapter.extension.transformer;
+
+import org.wso2.carbon.device.mgt.input.adapter.extension.ContentTransformer;
import java.util.Map;
/**
* This holds the default implementation of ContentTransformer
*/
-public class DefaultContentTransformer implements ContentTransformer{
+public class DefaultContentTransformer implements ContentTransformer {
+ private static final String DEFAULT_CONTENT_VALIDATOR = "default";
+
+ @Override
+ public String getType() {
+ return DEFAULT_CONTENT_VALIDATOR;
+ }
@Override
public Object transform(Object message, Map dynamicProperties) {
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/DefaultContentValidator.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/DefaultContentValidator.java
similarity index 73%
rename from components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/DefaultContentValidator.java
rename to components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/DefaultContentValidator.java
index 3e507b10d..2493c0dd8 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/DefaultContentValidator.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/DefaultContentValidator.java
@@ -16,7 +16,10 @@
* under the License.
*/
-package org.wso2.carbon.device.mgt.input.adapter.extension;
+package org.wso2.carbon.device.mgt.input.adapter.extension.validator;
+
+import org.wso2.carbon.device.mgt.input.adapter.extension.ContentInfo;
+import org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator;
import java.util.Map;
@@ -24,6 +27,12 @@ import java.util.Map;
* This holds the default implementation of content validator interface.
*/
public class DefaultContentValidator implements ContentValidator {
+ private static final String DEFAULT_TYPE = "default";
+
+ @Override
+ public String getType() {
+ return DEFAULT_TYPE;
+ }
@Override
public ContentInfo validate(Object message, Map dynamicParams) {
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/HTTPContentValidator.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/HTTPContentValidator.java
new file mode 100644
index 000000000..fe548099a
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/HTTPContentValidator.java
@@ -0,0 +1,87 @@
+/*
+* Copyright (c) 2016, 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.device.mgt.input.adapter.extension.validator;
+
+import com.jayway.jsonpath.JsonPath;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.json.simple.JSONArray;
+import org.json.simple.parser.JSONParser;
+import org.json.simple.parser.ParseException;
+import org.wso2.carbon.device.mgt.input.adapter.extension.ContentInfo;
+import org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator;
+
+import java.util.List;
+import java.util.Map;
+
+public class HTTPContentValidator implements ContentValidator {
+ private static final Log log = LogFactory.getLog(HTTPContentValidator.class);
+ private static String JSON_ARRAY_START_CHAR = "[";
+ private static String CDMF_SCOPE_PREFIX = "cdmf";
+ private static String CDMF_SCOPE_SEPERATOR = "/";
+ private static String CDMF_HTTP_CONTENT_VALIDATOR = "iot-http";
+ public static final String DEVICE_ID_JSON_PATH = "event.metaData.deviceId";
+
+ @Override
+ public String getType() {
+ return CDMF_HTTP_CONTENT_VALIDATOR;
+ }
+
+ @Override
+ public ContentInfo validate(Object msgPayload, Map dynamicParams) {
+ String deviceId = (String) dynamicParams.get("deviceId");
+ String msg = (String) msgPayload;
+ String deviceIdJsonPath = DEVICE_ID_JSON_PATH;
+ boolean status;
+ if (msg.startsWith(JSON_ARRAY_START_CHAR)) {
+ status = processMultipleEvents(msg, deviceId, deviceIdJsonPath);
+ } else {
+ status = processSingleEvent(msg, deviceId, deviceIdJsonPath);
+ }
+ return new ContentInfo(status, msg);
+ }
+
+ private boolean processSingleEvent(String msg, String deviceIdFromTopic, String deviceIdJsonPath) {
+ Object res = JsonPath.read(msg, deviceIdJsonPath);
+ String deviceIdFromContent = (res != null) ? res.toString() : "";
+ if (deviceIdFromContent.equals(deviceIdFromTopic)) {
+ return true;
+ }
+ return false;
+ }
+
+ private boolean processMultipleEvents(String msg, String deviceIdFromTopic, String deviceIdJsonPath) {
+ try {
+ JSONParser jsonParser = new JSONParser();
+ JSONArray jsonArray = (JSONArray) jsonParser.parse(msg);
+ boolean status = false;
+ for (int i = 0; i < jsonArray.size(); i++) {
+ status = processSingleEvent(jsonArray.get(i).toString(), deviceIdFromTopic, deviceIdJsonPath);
+ if (!status) {
+ return status;
+ }
+ }
+ return status;
+ } catch (ParseException e) {
+ log.error("Invalid input " + msg, e);
+ return false;
+ }
+ }
+
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTContentValidator.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/MQTTContentValidator.java
similarity index 81%
rename from components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTContentValidator.java
rename to components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/MQTTContentValidator.java
index a3de8ffa9..fdd4c34cf 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTContentValidator.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.extension/src/main/java/org/wso2/carbon/device/mgt/input/adapter/extension/validator/MQTTContentValidator.java
@@ -16,7 +16,7 @@
* under the License.
*/
-package org.wso2.carbon.device.mgt.input.adapter.mqtt.util;
+package org.wso2.carbon.device.mgt.input.adapter.extension.validator;
import com.jayway.jsonpath.JsonPath;
import org.apache.commons.logging.Log;
@@ -32,13 +32,23 @@ import java.util.Map;
public class MQTTContentValidator implements ContentValidator {
private static final String JSON_ARRAY_START_CHAR = "[";
private static final Log log = LogFactory.getLog(MQTTContentValidator.class);
+ private static final String CDMF_MQTT_CONTENT_VALIDATOR = "iot-mqtt";
+ public static final String DEVICE_ID_JSON_PATH = "event.metaData.deviceId";
+ public static final String DEVICE_TYPE_JSON_PATH = "event.metaData.deviceId";
+ public static final String TOPIC = "topic";
+ public static final int DEVICE_ID_TOPIC_HIERARCHY_INDEX = 2;
+
+ @Override
+ public String getType() {
+ return null;
+ }
@Override
public ContentInfo validate(Object msgPayload, Map dynamicParams) {
- String topic = (String) dynamicParams.get(MQTTEventAdapterConstants.TOPIC);
+ String topic = (String) dynamicParams.get(TOPIC);
String topics[] = topic.split("/");
- String deviceIdJsonPath = MQTTEventAdapterConstants.DEVICE_ID_JSON_PATH;
- int deviceIdInTopicHierarchyLevelIndex = MQTTEventAdapterConstants.DEVICE_ID_TOPIC_HIERARCHY_INDEX;
+ String deviceIdJsonPath = DEVICE_ID_JSON_PATH;
+ int deviceIdInTopicHierarchyLevelIndex = DEVICE_ID_TOPIC_HIERARCHY_INDEX;
String deviceIdFromTopic = topics[deviceIdInTopicHierarchyLevelIndex];
boolean status;
String message = (String) msgPayload;
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/pom.xml b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/pom.xml
index 282f33f64..6a42b3f56 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/pom.xml
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/pom.xml
@@ -20,7 +20,7 @@
org.wso2.carbon.devicemgt-pluginscdmf-transport-adapters
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../../pom.xml
@@ -76,6 +76,26 @@
commons-pool.wso2commons-pool
+
+ io.github.openfeign
+ feign-core
+
+
+ io.github.openfeign
+ feign-jaxrs
+
+
+ io.github.openfeign
+ feign-gson
+
+
+ javax.ws.rs
+ jsr311-api
+
+
+ io.github.openfeign
+ feign-slf4j
+
@@ -117,7 +137,6 @@
org.wso2.carbon.event.input.adapter.core,
org.wso2.carbon.event.input.adapter.core.*,
javax.xml.namespace; version=0.0.0,
- com.jayway.jsonpath.*,
com.nimbusds.jose,
com.nimbusds.jose.crypto,
com.nimbusds.jwt,
@@ -130,9 +149,29 @@
org.wso2.carbon.user.core.service,
org.wso2.carbon.user.core.tenant,
org.apache.commons.pool,
- org.apache.commons.pool.impl
+ org.apache.commons.pool.impl,
+ feign,
+ feign.auth,
+ feign.codec,
+ feign.gson,
+ org.wso2.carbon.device.mgt.input.adapter.extension,
+ org.apache.axiom.util.base64,
+ org.apache.axis2.*,
+ org.apache.commons.httpclient.*,
+ org.apache.commons.logging,
+ org.apache.log4j,
+ org.wso2.carbon.context,
+ org.wso2.carbon.core.util,
+ org.wso2.carbon.identity.oauth2.*,
+ org.wso2.carbon.utils,
+ org.wso2.carbon.utils.multitenancy,
+ javax.net.ssl,
+ feign.slf4j
- *
+
+ jsr311-api,
+ feign-jaxrs
+
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/HTTPEventAdapterFactory.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/HTTPEventAdapterFactory.java
index b46117f65..c12e24a6a 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/HTTPEventAdapterFactory.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/HTTPEventAdapterFactory.java
@@ -76,12 +76,12 @@ public class HTTPEventAdapterFactory extends InputEventAdapterFactory {
propertyList.add(exposedTransportsProperty);
//Content Validator details
- Property contentValidator = new Property(HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME);
+ Property contentValidator = new Property(HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_TYPE);
contentValidator.setDisplayName(
- resourceBundle.getString(HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME));
+ resourceBundle.getString(HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_TYPE));
contentValidator.setRequired(false);
contentValidator.setHint(
- resourceBundle.getString(HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME_HINT));
+ resourceBundle.getString(HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_TYPE_HINT));
contentValidator.setDefaultValue(HTTPEventAdapterConstants.DEFAULT);
propertyList.add(contentValidator);
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/HTTPMessageServlet.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/HTTPMessageServlet.java
index 3d5351b30..afda05edf 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/HTTPMessageServlet.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/HTTPMessageServlet.java
@@ -18,11 +18,13 @@ package org.wso2.carbon.device.mgt.input.adapter.http;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.context.PrivilegedCarbonContext;
+import org.wso2.carbon.device.mgt.input.adapter.http.authorization.DeviceAuthorizer;
+import org.wso2.carbon.device.mgt.input.adapter.http.internal.InputAdapterServiceDataHolder;
import org.wso2.carbon.device.mgt.input.adapter.http.oauth.OAuthAuthenticator;
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentInfo;
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentTransformer;
-import org.wso2.carbon.device.mgt.input.adapter.extension.DefaultContentTransformer;
-import org.wso2.carbon.device.mgt.input.adapter.extension.DefaultContentValidator;
+import org.wso2.carbon.device.mgt.input.adapter.extension.transformer.DefaultContentTransformer;
+import org.wso2.carbon.device.mgt.input.adapter.extension.validator.DefaultContentValidator;
import org.wso2.carbon.device.mgt.input.adapter.http.exception.HTTPContentInitializationException;
import org.wso2.carbon.device.mgt.input.adapter.http.jwt.JWTAuthenticator;
import org.wso2.carbon.device.mgt.input.adapter.http.util.AuthenticationInfo;
@@ -58,6 +60,7 @@ public class HTTPMessageServlet extends HttpServlet {
private String exposedTransports;
private static JWTAuthenticator jwtAuthenticator;
private static OAuthAuthenticator oAuthAuthenticator;
+ private static DeviceAuthorizer deviceAuthorizer;
public HTTPMessageServlet(InputEventAdapterListener eventAdaptorListener, int tenantId,
InputEventAdapterConfiguration eventAdapterConfiguration,
@@ -67,48 +70,29 @@ public class HTTPMessageServlet extends HttpServlet {
this.exposedTransports = eventAdapterConfiguration.getProperties().get(
HTTPEventAdapterConstants.EXPOSED_TRANSPORTS);
- String className = eventAdapterConfiguration.getProperties().get(
- HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME);
- if (HTTPEventAdapterConstants.DEFAULT.equals(className)) {
- contentValidator = new DefaultContentValidator();
+ String contentValidatorType = eventAdapterConfiguration.getProperties().get(
+ HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_TYPE);
+ if (contentValidatorType == null || HTTPEventAdapterConstants.DEFAULT.equals(contentValidatorType)) {
+ contentValidator = InputAdapterServiceDataHolder.getInputAdapterExtensionService()
+ .getDefaultContentValidator();
} else {
- try {
- Class extends ContentValidator> contentValidatorClass = Class.forName(className)
- .asSubclass(ContentValidator.class);
- contentValidator = contentValidatorClass.newInstance();
- } catch (ClassNotFoundException e) {
- throw new HTTPContentInitializationException(
- "Unable to find the class validator: " + className, e);
- } catch (InstantiationException e) {
- throw new HTTPContentInitializationException(
- "Unable to create an instance of :" + className, e);
- } catch (IllegalAccessException e) {
- throw new HTTPContentInitializationException("Access of the instance in not allowed.", e);
- }
+ contentValidator = InputAdapterServiceDataHolder.getInputAdapterExtensionService()
+ .getContentValidator(contentValidatorType);
}
String contentTransformerClassName = eventAdapterConfiguration.getProperties().get(
HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_TRANSFORMER_CLASSNAME);
- if (contentTransformerClassName != null && contentTransformerClassName.equals(HTTPEventAdapterConstants.DEFAULT)) {
- contentTransformer = new DefaultContentTransformer();
- } else if (contentTransformerClassName != null && !contentTransformerClassName.isEmpty()) {
- try {
- Class extends ContentTransformer> contentTransformerClass = Class.forName(contentTransformerClassName)
- .asSubclass(ContentTransformer.class);
- contentTransformer = contentTransformerClass.newInstance();
- } catch (ClassNotFoundException e) {
- throw new HTTPContentInitializationException(
- "Unable to find the class transformer: " + contentTransformerClassName, e);
- } catch (InstantiationException e) {
- throw new HTTPContentInitializationException(
- "Unable to create an instance of :" + contentTransformerClassName, e);
- } catch (IllegalAccessException e) {
- throw new HTTPContentInitializationException("Access of the instance in not allowed.", e);
- }
+ if (contentTransformerClassName == null || contentTransformerClassName.equals(HTTPEventAdapterConstants.DEFAULT)) {
+ contentTransformer = InputAdapterServiceDataHolder.getInputAdapterExtensionService()
+ .getDefaultContentTransformer();
+ } else {
+ contentTransformer = InputAdapterServiceDataHolder.getInputAdapterExtensionService()
+ .getContentTransformer(contentValidatorType);
}
jwtAuthenticator = new JWTAuthenticator();
oAuthAuthenticator = new OAuthAuthenticator(globalProperties);
+ deviceAuthorizer = new DeviceAuthorizer(globalProperties);
}
@Override
@@ -177,14 +161,24 @@ public class HTTPMessageServlet extends HttpServlet {
paramMap.put(HTTPEventAdapterConstants.USERNAME_TAG, authenticationInfo.getUsername());
paramMap.put(HTTPEventAdapterConstants.TENANT_DOMAIN_TAG, authenticationInfo.getTenantDomain());
paramMap.put(HTTPEventAdapterConstants.SCOPE_TAG, authenticationInfo.getScopes());
- if (contentValidator != null && contentTransformer != null) {
- data = (String) contentTransformer.transform(data, paramMap);
- ContentInfo contentInfo = contentValidator.validate(data, paramMap);
- if (contentInfo != null && contentInfo.isValidContent()) {
- HTTPEventAdapter.executorService.submit(new HTTPRequestProcessor(eventAdaptorListener,
- (String) contentInfo.getMessage(), tenantId));
- }
- }
+ String deviceId = (String) paramMap.get("deviceId");
+ String deviceType = (String) paramMap.get("deviceType");
+ if (deviceAuthorizer.isAuthorized(authenticationInfo, deviceId, deviceType)) {
+ if (contentValidator != null && contentTransformer != null) {
+ data = (String) contentTransformer.transform(data, paramMap);
+ ContentInfo contentInfo = contentValidator.validate(data, paramMap);
+ if (contentInfo != null && contentInfo.isValidContent()) {
+ HTTPEventAdapter.executorService.submit(new HTTPRequestProcessor(eventAdaptorListener,
+ (String) contentInfo
+ .getMessage(),
+ tenantId));
+ }
+ }
+ } else {
+ if (log.isDebugEnabled()) {
+ log.debug("Unauthorized device with device id" + deviceId + " and device type" + deviceType);
+ }
+ }
}
}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/DeviceAuthorizer.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/DeviceAuthorizer.java
new file mode 100644
index 000000000..c6e195254
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/DeviceAuthorizer.java
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 2016, 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.device.mgt.input.adapter.http.authorization;
+
+import feign.Client;
+import feign.Feign;
+import feign.FeignException;
+import feign.Logger;
+import feign.Request;
+import feign.Response;
+import feign.gson.GsonDecoder;
+import feign.gson.GsonEncoder;
+import feign.jaxrs.JAXRSContract;
+import feign.slf4j.Slf4jLogger;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.OAuthRequestInterceptor;
+import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.AuthorizationRequest;
+import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.DeviceAccessAuthorizationAdminService;
+import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.DeviceAuthorizationResult;
+import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.DeviceIdentifier;
+import org.wso2.carbon.device.mgt.input.adapter.http.util.AuthenticationInfo;
+import org.wso2.carbon.device.mgt.input.adapter.http.util.PropertyUtils;
+import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterException;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * This authorizer crossvalidates the request with device id and device type.
+ */
+public class DeviceAuthorizer {
+
+ private static DeviceAccessAuthorizationAdminService deviceAccessAuthorizationAdminService;
+ private static final String CDMF_SERVER_BASE_CONTEXT = "/api/device-mgt/v1.0";
+ private static final String DEVICE_MGT_SERVER_URL = "deviceMgtServerUrl";
+ private static Log log = LogFactory.getLog(DeviceAuthorizer.class);
+
+ public DeviceAuthorizer(Map globalProperties) {
+ try {
+ deviceAccessAuthorizationAdminService = Feign.builder().client(getSSLClient()).logger(new Slf4jLogger())
+ .logLevel(Logger.Level.FULL).requestInterceptor(new OAuthRequestInterceptor(globalProperties))
+ .contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
+ .target(DeviceAccessAuthorizationAdminService.class, getDeviceMgtServerUrl(globalProperties)
+ + CDMF_SERVER_BASE_CONTEXT);
+ } catch (InputEventAdapterException e) {
+ log.error("Invalid value for deviceMgtServerUrl in globalProperties.");
+ }
+ }
+
+
+ public boolean isAuthorized(AuthenticationInfo authenticationInfo, String deviceId, String deviceType) {
+
+ if (deviceId != null && !deviceId.isEmpty() && deviceType != null && !deviceType.isEmpty()) {
+
+ AuthorizationRequest authorizationRequest = new AuthorizationRequest();
+ authorizationRequest.setTenantDomain(authenticationInfo.getTenantDomain());
+ authorizationRequest.setUsername(authenticationInfo.getUsername());
+ DeviceIdentifier deviceIdentifier = new DeviceIdentifier();
+ deviceIdentifier.setId(deviceId);
+ deviceIdentifier.setType(deviceType);
+ List deviceIdentifiers = new ArrayList<>();
+ deviceIdentifiers.add(deviceIdentifier);
+ authorizationRequest.setDeviceIdentifiers(deviceIdentifiers);
+ try {
+ DeviceAuthorizationResult deviceAuthorizationResult =
+ deviceAccessAuthorizationAdminService.isAuthorized(authorizationRequest);
+ List devices = deviceAuthorizationResult.getAuthorizedDevices();
+ if (devices != null && devices.size() > 0) {
+ DeviceIdentifier authorizedDevice = devices.get(0);
+ if (authorizedDevice.getId().equals(deviceId) && authorizedDevice.getType().equals(deviceType)) {
+ return true;
+ }
+ }
+ } catch (FeignException e) {
+ log.error(e.getMessage(), e);
+ }
+ }
+ return false;
+ }
+
+ private String getDeviceMgtServerUrl(Map properties) throws InputEventAdapterException {
+ String deviceMgtServerUrl = PropertyUtils.replaceProperty(properties.get(DEVICE_MGT_SERVER_URL));
+ if (deviceMgtServerUrl == null || deviceMgtServerUrl.isEmpty()) {
+ log.error("deviceMgtServerUrl can't be empty ");
+ }
+ return deviceMgtServerUrl;
+ }
+
+ private static Client getSSLClient() {
+ return new Client.Default(getTrustedSSLSocketFactory(), new HostnameVerifier() {
+ @Override
+ public boolean verify(String s, SSLSession sslSession) {
+ return true;
+ }
+ });
+ }
+
+ private static SSLSocketFactory getTrustedSSLSocketFactory() {
+ try {
+ TrustManager[] trustAllCerts = new TrustManager[]{
+ new X509TrustManager() {
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+ public void checkClientTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ public void checkServerTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ }
+ };
+ SSLContext sc = SSLContext.getInstance("SSL");
+ sc.init(null, trustAllCerts, new java.security.SecureRandom());
+ return sc.getSocketFactory();
+ } catch (KeyManagementException | NoSuchAlgorithmException e) {
+ return null;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/OAuthRequestInterceptor.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/OAuthRequestInterceptor.java
new file mode 100755
index 000000000..0c6eff5d8
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/OAuthRequestInterceptor.java
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * 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.
+ *
+ */
+
+package org.wso2.carbon.device.mgt.input.adapter.http.authorization.client;
+
+import feign.Client;
+import feign.Feign;
+import feign.Logger;
+import feign.Request;
+import feign.RequestInterceptor;
+import feign.RequestTemplate;
+import feign.Response;
+import feign.auth.BasicAuthRequestInterceptor;
+import feign.gson.GsonDecoder;
+import feign.gson.GsonEncoder;
+import feign.jaxrs.JAXRSContract;
+import feign.slf4j.Slf4jLogger;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.AccessTokenInfo;
+import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.ApiApplicationKey;
+import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.ApiApplicationRegistrationService;
+import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.ApiRegistrationProfile;
+import org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto.TokenIssuerService;
+import org.wso2.carbon.device.mgt.input.adapter.http.util.PropertyUtils;
+import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterException;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Map;
+
+/**
+ * This is a request interceptor to add oauth token header.
+ */
+public class OAuthRequestInterceptor implements RequestInterceptor {
+
+ private AccessTokenInfo tokenInfo;
+ private long refreshTimeOffset;
+ private static final String API_APPLICATION_REGISTRATION_CONTEXT = "/api-application-registration";
+ private static final String DEVICE_MANAGEMENT_SERVICE_TAG[] = {"device_management"};
+ private static final String APPLICATION_NAME = "websocket-app";
+ private static final String PASSWORD_GRANT_TYPE = "password";
+ private static final String REFRESH_GRANT_TYPE = "refresh_token";
+ private static final String REQUIRED_SCOPE = "perm:authorization:verify";
+ private ApiApplicationRegistrationService apiApplicationRegistrationService;
+ private TokenIssuerService tokenIssuerService;
+
+ private static Log log = LogFactory.getLog(OAuthRequestInterceptor.class);
+
+ private static final String CONNECTION_USERNAME = "username";
+ private static final String CONNECTION_PASSWORD = "password";
+ private static final String TOKEN_REFRESH_TIME_OFFSET = "tokenRefreshTimeOffset";
+ private static final String TOKEN_SCOPES = "scopes";
+ private static final String DEVICE_MGT_SERVER_URL = "deviceMgtServerUrl";
+ private static final String TOKEN_ENDPOINT_CONTEXT = "tokenUrl";
+ private static String username;
+ private static String password;
+ private static String tokenEndpoint;
+ private static String deviceMgtServerUrl;
+ private static String scopes;
+ private static Map globalProperties;
+
+
+ /**
+ * Creates an interceptor that authenticates all requests.
+ */
+ public OAuthRequestInterceptor(Map globalProperties) {
+ this.globalProperties = globalProperties;
+ try {
+ deviceMgtServerUrl = getDeviceMgtServerUrl(globalProperties);
+ refreshTimeOffset = getRefreshTimeOffset(globalProperties) * 1000;
+ username = getUsername(globalProperties);
+ password = getPassword(globalProperties);
+ tokenEndpoint = getTokenEndpoint(globalProperties);
+ apiApplicationRegistrationService = Feign.builder().client(getSSLClient()).logger(new Slf4jLogger()).logLevel(
+ Logger.Level.FULL).requestInterceptor(new BasicAuthRequestInterceptor(username, password))
+ .contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
+ .target(ApiApplicationRegistrationService.class,
+ deviceMgtServerUrl + API_APPLICATION_REGISTRATION_CONTEXT);
+ } catch (InputEventAdapterException e) {
+ log.error("Invalid url: deviceMgtServerUrl" + deviceMgtServerUrl + " or tokenEndpoint:" + tokenEndpoint,
+ e);
+ }
+ }
+
+ @Override
+ public void apply(RequestTemplate template) {
+ if (tokenInfo == null) {
+ //had to do on demand initialization due to start up error.
+ ApiRegistrationProfile apiRegistrationProfile = new ApiRegistrationProfile();
+ apiRegistrationProfile.setApplicationName(APPLICATION_NAME);
+ apiRegistrationProfile.setIsAllowedToAllDomains(false);
+ apiRegistrationProfile.setIsMappingAnExistingOAuthApp(false);
+ apiRegistrationProfile.setTags(DEVICE_MANAGEMENT_SERVICE_TAG);
+ ApiApplicationKey apiApplicationKey = apiApplicationRegistrationService.register(apiRegistrationProfile);
+ String consumerKey = apiApplicationKey.getConsumerKey();
+ String consumerSecret = apiApplicationKey.getConsumerSecret();
+ tokenIssuerService = Feign.builder().client(getSSLClient())
+ .logger(new Slf4jLogger()).logLevel(Logger.Level.FULL)
+ .requestInterceptor(new BasicAuthRequestInterceptor(consumerKey, consumerSecret))
+ .contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
+ .target(TokenIssuerService.class, tokenEndpoint);
+ tokenInfo = tokenIssuerService.getToken(PASSWORD_GRANT_TYPE, username, password, REQUIRED_SCOPE);
+ tokenInfo.setExpires_in(System.currentTimeMillis() + (tokenInfo.getExpires_in() * 1000));
+ }
+ synchronized(this) {
+ if (System.currentTimeMillis() + refreshTimeOffset > tokenInfo.getExpires_in()) {
+ tokenInfo = tokenIssuerService.getToken(REFRESH_GRANT_TYPE, tokenInfo.getRefresh_token());
+ tokenInfo.setExpires_in(System.currentTimeMillis() + tokenInfo.getExpires_in());
+ }
+ }
+ String headerValue = "Bearer " + tokenInfo.getAccess_token();
+ template.header("Authorization", headerValue);
+ }
+
+ private String getUsername(Map globalProperties) {
+ String username = globalProperties.get(CONNECTION_USERNAME);
+ if (username == null || username.isEmpty()) {
+ log.error("username can't be empty ");
+ }
+ return username;
+ }
+
+ private String getPassword(Map globalProperties) {
+ String password = globalProperties.get(CONNECTION_PASSWORD);;
+ if (password == null || password.isEmpty()) {
+ log.error("password can't be empty ");
+ }
+ return password;
+ }
+
+ private String getDeviceMgtServerUrl(Map globalProperties) throws InputEventAdapterException {
+ String deviceMgtServerUrl = globalProperties.get(DEVICE_MGT_SERVER_URL);
+ if (deviceMgtServerUrl == null || deviceMgtServerUrl.isEmpty()) {
+ log.error("deviceMgtServerUrl can't be empty ");
+ }
+ return PropertyUtils.replaceProperty(deviceMgtServerUrl);
+ }
+
+ private String getTokenEndpoint(Map globalProperties) throws InputEventAdapterException {
+ String tokenEndpoint = globalProperties.get(TOKEN_ENDPOINT_CONTEXT);
+ if ( tokenEndpoint.isEmpty()) {
+ log.error("tokenEndpoint can't be empty ");
+ }
+ return PropertyUtils.replaceProperty(tokenEndpoint);
+ }
+
+ private long getRefreshTimeOffset(Map globalProperties) {
+ long refreshTimeOffset = 100;
+ try {
+ refreshTimeOffset = Long.parseLong(globalProperties.get(TOKEN_REFRESH_TIME_OFFSET));
+ } catch (NumberFormatException e) {
+ log.error("refreshTimeOffset should be a number", e);
+ }
+ return refreshTimeOffset;
+ }
+
+ private static Client getSSLClient() {
+ return new Client.Default(getTrustedSSLSocketFactory(), new HostnameVerifier() {
+ @Override
+ public boolean verify(String s, SSLSession sslSession) {
+ return true;
+ }
+ });
+ }
+
+ private static SSLSocketFactory getTrustedSSLSocketFactory() {
+ try {
+ TrustManager[] trustAllCerts = new TrustManager[]{
+ new X509TrustManager() {
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+ public void checkClientTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ public void checkServerTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ }
+ };
+ SSLContext sc = SSLContext.getInstance("SSL");
+ sc.init(null, trustAllCerts, new java.security.SecureRandom());
+ return sc.getSocketFactory();
+ } catch (KeyManagementException | NoSuchAlgorithmException e) {
+ return null;
+ }
+ }
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/AccessTokenInfo.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/AccessTokenInfo.java
new file mode 100755
index 000000000..a935d8587
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/AccessTokenInfo.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * 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.
+ *
+ */
+
+package org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto;
+
+/**
+ * This hold access token info that returned from the api call
+ */
+public class AccessTokenInfo {
+ public String token_type;
+ public long expires_in;
+ public String refresh_token;
+ public String access_token;
+
+ public String getToken_type() {
+ return token_type;
+ }
+
+ public void setToken_type(String token_type) {
+ this.token_type = token_type;
+ }
+
+ public long getExpires_in() {
+ return expires_in;
+ }
+
+ public void setExpires_in(long expires_in) {
+ this.expires_in = expires_in;
+ }
+
+ public String getRefresh_token() {
+ return refresh_token;
+ }
+
+ public void setRefresh_token(String refresh_token) {
+ this.refresh_token = refresh_token;
+ }
+
+ public String getAccess_token() {
+ return access_token;
+ }
+
+ public void setAccess_token(String access_token) {
+ this.access_token = access_token;
+ }
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/ApiApplicationKey.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/ApiApplicationKey.java
new file mode 100644
index 000000000..cfc32a4be
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/ApiApplicationKey.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2016, 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.device.mgt.input.adapter.http.authorization.client.dto;
+
+/**
+ * This holds api application consumer key and secret.
+ */
+public class ApiApplicationKey {
+ private String client_id;
+ private String client_secret;
+
+ public String getConsumerKey() {
+ return this.client_id;
+ }
+
+ public void setClient_id(String consumerKey) {
+ this.client_id = consumerKey;
+ }
+
+ public String getConsumerSecret() {
+ return this.client_secret;
+ }
+
+ public void setClient_secret(String consumerSecret) {
+ this.client_secret = consumerSecret;
+ }
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/ApiApplicationRegistrationService.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/ApiApplicationRegistrationService.java
new file mode 100755
index 000000000..b8e216305
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/ApiApplicationRegistrationService.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * 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.
+ *
+ */
+package org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+/**
+ * This is the application registration service that exposed for apimApplicationRegistration
+ */
+
+@Path("/register")
+public interface ApiApplicationRegistrationService {
+
+ /**
+ * This method is used to register api application
+ *
+ * @param registrationProfile contains the necessary attributes that are needed in order to register an app.
+ */
+ @POST
+ @Produces(MediaType.APPLICATION_JSON)
+ @Consumes(MediaType.APPLICATION_JSON)
+ ApiApplicationKey register(ApiRegistrationProfile registrationProfile);
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/ApiRegistrationProfile.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/ApiRegistrationProfile.java
new file mode 100755
index 000000000..51748f4a3
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/ApiRegistrationProfile.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * 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.
+ *
+ */
+
+package org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto;
+
+
+/**
+ * This class represents the data that are required to register
+ * the oauth application.
+ */
+public class ApiRegistrationProfile {
+
+ public String applicationName;
+ public String tags[];
+ public boolean isAllowedToAllDomains;
+ public String consumerKey;
+ public String consumerSecret;
+ public boolean isMappingAnExistingOAuthApp;
+
+ public String getApplicationName() {
+ return applicationName;
+ }
+
+ public void setApplicationName(String applicationName) {
+ this.applicationName = applicationName;
+ }
+
+ public String[] getTags() {
+ return tags;
+ }
+
+ public void setTags(String[] tags) {
+ this.tags = tags;
+ }
+
+ public boolean isAllowedToAllDomains() {
+ return isAllowedToAllDomains;
+ }
+
+ public void setIsAllowedToAllDomains(boolean isAllowedToAllDomains) {
+ this.isAllowedToAllDomains = isAllowedToAllDomains;
+ }
+
+ public boolean isMappingAnExistingOAuthApp() {
+ return isMappingAnExistingOAuthApp;
+ }
+
+ public void setIsMappingAnExistingOAuthApp(boolean isMappingAnExistingOAuthApp) {
+ this.isMappingAnExistingOAuthApp = isMappingAnExistingOAuthApp;
+ }
+
+ public String getConsumerKey() {
+ return consumerKey;
+ }
+
+ public void setConsumerKey(String consumerKey) {
+ this.consumerKey = consumerKey;
+ }
+
+ public String getConsumerSecret() {
+ return consumerSecret;
+ }
+
+ public void setConsumerSecret(String consumerSecret) {
+ this.consumerSecret = consumerSecret;
+ }
+}
\ No newline at end of file
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/AuthorizationRequest.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/AuthorizationRequest.java
new file mode 100644
index 000000000..8703e6d1a
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/AuthorizationRequest.java
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * 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.
+ *
+ */
+package org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto;
+
+import java.util.List;
+
+/**
+ * DTO of the authorization request
+ */
+public class AuthorizationRequest {
+
+ String tenantDomain;
+ String username;
+ List deviceIdentifiers;
+ List permissions;
+
+ public String getTenantDomain() {
+ return tenantDomain;
+ }
+
+ public void setTenantDomain(String tenantDomain) {
+ this.tenantDomain = tenantDomain;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public List getDeviceIdentifiers() {
+ return deviceIdentifiers;
+ }
+
+ public void setDeviceIdentifiers(List deviceIdentifiers) {
+ this.deviceIdentifiers = deviceIdentifiers;
+ }
+
+ public List getPermissions() {
+ return permissions;
+ }
+
+ public void setPermissions(List permissions) {
+ this.permissions = permissions;
+ }
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/DeviceAccessAuthorizationAdminService.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/DeviceAccessAuthorizationAdminService.java
new file mode 100644
index 000000000..9c4c74140
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/DeviceAccessAuthorizationAdminService.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2016, 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.device.mgt.input.adapter.http.authorization.client.dto;
+
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+
+@Produces(MediaType.APPLICATION_JSON)
+@Consumes(MediaType.APPLICATION_JSON)
+@Path("/admin/authorization")
+/**
+ * This interface provided the definition of the device - user access verification service.
+ */
+public interface DeviceAccessAuthorizationAdminService {
+
+ @POST
+ @Produces(MediaType.APPLICATION_JSON)
+ @Consumes(MediaType.APPLICATION_JSON)
+ DeviceAuthorizationResult isAuthorized(AuthorizationRequest authorizationRequest);
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/DeviceAuthorizationResult.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/DeviceAuthorizationResult.java
new file mode 100644
index 000000000..2a27ba6b1
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/DeviceAuthorizationResult.java
@@ -0,0 +1,56 @@
+/*
+ * 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.device.mgt.input.adapter.http.authorization.client.dto;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Represents a DeviceAuthorizationResult including a list of authorized devices and a list of unauthorized devices.
+ */
+public class DeviceAuthorizationResult {
+
+ private List authorizedDevices = new ArrayList<>();
+ private List unauthorizedDevices = new ArrayList<>();
+
+ public List getAuthorizedDevices() {
+ return authorizedDevices;
+ }
+
+ public void setAuthorizedDevices(List authorizedDevices) {
+ this.authorizedDevices = authorizedDevices;
+ }
+
+ public void setUnauthorizedDevices(
+ List unauthorizedDevices) {
+ this.unauthorizedDevices = unauthorizedDevices;
+ }
+
+ public void addAuthorizedDevice(DeviceIdentifier deviceIdentifier) {
+ authorizedDevices.add(deviceIdentifier);
+ }
+
+ public List getUnauthorizedDevices() {
+ return unauthorizedDevices;
+ }
+
+ public void addUnauthorizedDevice(DeviceIdentifier deviceIdentifier) {
+ unauthorizedDevices.add(deviceIdentifier);
+ }
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/DeviceIdentifier.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/DeviceIdentifier.java
new file mode 100644
index 000000000..872af37f9
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/DeviceIdentifier.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2014, 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.device.mgt.input.adapter.http.authorization.client.dto;
+
+import java.io.Serializable;
+
+/**
+ * DTO of the device identifier
+ */
+public class DeviceIdentifier implements Serializable{
+
+ private String id;
+ private String type;
+
+ public DeviceIdentifier() {}
+
+ public DeviceIdentifier(String id, String type) {
+ this.id = id;
+ this.type = type;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type.toLowerCase();
+ }
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/OAuthApplicationInfo.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/OAuthApplicationInfo.java
new file mode 100755
index 000000000..b396c863d
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/OAuthApplicationInfo.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * 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.
+ *
+ */
+
+package org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto;
+
+/**
+ * This class represents an OAuth application populated with necessary data.
+ */
+public class OAuthApplicationInfo {
+
+ public String client_id;
+ public String client_name;
+ public String callback_url;
+ public String client_secret;
+
+ public String getClient_id() {
+ return client_id;
+ }
+
+ public void setClient_id(String client_id) {
+ this.client_id = client_id;
+ }
+
+ public String getClient_name() {
+ return client_name;
+ }
+
+ public void setClient_name(String client_name) {
+ this.client_name = client_name;
+ }
+
+ public String getCallback_url() {
+ return callback_url;
+ }
+
+ public void setCallback_url(String callback_url) {
+ this.callback_url = callback_url;
+ }
+
+ public String getClient_secret() {
+ return client_secret;
+ }
+
+ public void setClient_secret(String client_secret) {
+ this.client_secret = client_secret;
+ }
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/RegisterInfo.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/RegisterInfo.java
new file mode 100755
index 000000000..4bb046b48
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/RegisterInfo.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * 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.
+ *
+ */
+
+package org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto;
+
+/**
+ * This holds the data related to registration.
+ */
+public class RegisterInfo {
+
+ private boolean isRegistered;
+ private String msg;
+
+ public boolean isRegistered() {
+ return isRegistered;
+ }
+
+ public void setIsRegistered(boolean isRegistered) {
+ this.isRegistered = isRegistered;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/RegistrationProfile.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/RegistrationProfile.java
new file mode 100755
index 000000000..0ed5cfbe3
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/RegistrationProfile.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * 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.
+ *
+ */
+package org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto;
+
+
+/**
+ * This class represents the data that are required to register
+ * the oauth application.
+ */
+public class RegistrationProfile {
+
+ public String callbackUrl;
+ public String clientName;
+ public String tokenScope;
+ public String owner;
+ public String grantType;
+ public String applicationType;
+
+ public String getCallbackUrl() {
+ return callbackUrl;
+ }
+
+ public void setCallbackUrl(String callBackUrl) {
+ this.callbackUrl = callBackUrl;
+ }
+
+ public String getClientName() {
+ return clientName;
+ }
+
+ public void setClientName(String clientName) {
+ this.clientName = clientName;
+ }
+
+ public String getTokenScope() {
+ return tokenScope;
+ }
+
+ public void setTokenScope(String tokenScope) {
+ this.tokenScope = tokenScope;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ public String getGrantType() {
+ return grantType;
+ }
+
+ public void setGrantType(String grantType) {
+ this.grantType = grantType;
+ }
+
+ public String getApplicationType() {
+ return applicationType;
+ }
+
+ public void setApplicationType(String applicationType) {
+ this.applicationType = applicationType;
+ }
+
+}
\ No newline at end of file
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/TokenIssuerService.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/TokenIssuerService.java
new file mode 100755
index 000000000..950d05291
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/authorization/client/dto/TokenIssuerService.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * 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.
+ *
+ */
+/*
+ * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * 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.
+ *
+ */
+package org.wso2.carbon.device.mgt.input.adapter.http.authorization.client.dto;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+
+/**
+ * This hold the api defintion that is used as a contract with netflix feign.
+ */
+public interface TokenIssuerService {
+
+ @POST
+ @Produces(MediaType.APPLICATION_JSON)
+ @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+ AccessTokenInfo getToken(@QueryParam("grant_type") String grant, @QueryParam("username") String username,
+ @QueryParam("password") String password);
+
+ @POST
+ @Produces(MediaType.APPLICATION_JSON)
+ @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+ AccessTokenInfo getToken(@QueryParam("grant_type") String grant, @QueryParam("username") String username,
+ @QueryParam("password") String password, @QueryParam("scope") String scopes);
+
+ @POST
+ @Produces(MediaType.APPLICATION_JSON)
+ @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+ AccessTokenInfo getToken(@QueryParam("grant_type") String grant, @QueryParam("refresh_token") String refreshToken);
+}
\ No newline at end of file
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/internal/InputAdapterServiceComponent.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/internal/InputAdapterServiceComponent.java
index 7e5688838..cd3876c8f 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/internal/InputAdapterServiceComponent.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/internal/InputAdapterServiceComponent.java
@@ -21,6 +21,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.http.HttpService;
+import org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionService;
import org.wso2.carbon.device.mgt.input.adapter.http.HTTPEventAdapterFactory;
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterFactory;
import org.wso2.carbon.user.core.service.RealmService;
@@ -29,9 +30,19 @@ import org.wso2.carbon.user.core.service.RealmService;
* @scr.component name="input.iot.http.AdapterService.component" immediate="true"
* @scr.reference name="user.realmservice.default"
* interface="org.wso2.carbon.user.core.service.RealmService" cardinality="1..1"
- * policy="dynamic" bind="setRealmService" unbind="unsetRealmService"
+ * policy="dynamic"
+ * bind="setRealmService"
+ * unbind="unsetRealmService"
* @scr.reference name="http.service" interface="org.osgi.service.http.HttpService"
- * cardinality="1..1" policy="dynamic" bind="setHttpService" unbind="unsetHttpService"
+ * cardinality="1..1"
+ * policy="dynamic"
+ * bind="setHttpService"
+ * unbind="unsetHttpService"
+ * @scr.reference name="input.extension.service" interface="org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionService"
+ * cardinality="1..1"
+ * policy="dynamic"
+ * bind="setInputAdapterExtensionService"
+ * unbind="unsetInputAdapterExtensionService"
*/
public class InputAdapterServiceComponent {
@@ -67,4 +78,12 @@ public class InputAdapterServiceComponent {
InputAdapterServiceDataHolder.registerHTTPService(null);
}
+ protected void setInputAdapterExtensionService(InputAdapterExtensionService inputAdapterExtensionService) {
+ InputAdapterServiceDataHolder.setInputAdapterExtensionService(inputAdapterExtensionService);
+ }
+
+ protected void unsetInputAdapterExtensionService(InputAdapterExtensionService inputAdapterExtensionService) {
+ InputAdapterServiceDataHolder.setInputAdapterExtensionService(null);
+ }
+
}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/internal/InputAdapterServiceDataHolder.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/internal/InputAdapterServiceDataHolder.java
index 6f1969e6d..e521f2c3c 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/internal/InputAdapterServiceDataHolder.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/internal/InputAdapterServiceDataHolder.java
@@ -15,6 +15,7 @@
package org.wso2.carbon.device.mgt.input.adapter.http.internal;
import org.osgi.service.http.HttpService;
+import org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionService;
import org.wso2.carbon.user.core.service.RealmService;
/**
@@ -24,6 +25,7 @@ public final class InputAdapterServiceDataHolder {
private static RealmService realmService;
private static HttpService httpService;
+ private static InputAdapterExtensionService inputAdapterExtensionService;
private InputAdapterServiceDataHolder() {
}
@@ -46,5 +48,12 @@ public final class InputAdapterServiceDataHolder {
return httpService;
}
+ public static void setInputAdapterExtensionService(InputAdapterExtensionService inputAdapterExtensionService) {
+ InputAdapterServiceDataHolder.inputAdapterExtensionService = inputAdapterExtensionService;
+ }
+
+ public static InputAdapterExtensionService getInputAdapterExtensionService() {
+ return inputAdapterExtensionService;
+ }
}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/util/HTTPContentValidator.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/util/HTTPContentValidator.java
deleted file mode 100644
index d8085d5b5..000000000
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/util/HTTPContentValidator.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
-* Copyright (c) 2016, 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.device.mgt.input.adapter.http.util;
-
-import com.jayway.jsonpath.JsonPath;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.json.simple.JSONArray;
-import org.json.simple.parser.JSONParser;
-import org.json.simple.parser.ParseException;
-import org.wso2.carbon.device.mgt.input.adapter.extension.ContentInfo;
-import org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator;
-
-import java.util.List;
-import java.util.Map;
-
-public class HTTPContentValidator implements ContentValidator {
- private static final Log log = LogFactory.getLog(HTTPContentValidator.class);
- private static String JSON_ARRAY_START_CHAR = "[";
- private static String CDMF_SCOPE_PREFIX = "cdmf";
- private static String CDMF_SCOPE_SEPERATOR = "/";
-
- @Override
- public ContentInfo validate(Object msgPayload, Map dynamicParams) {
- String deviceId = (String) dynamicParams.get("deviceId");
- String deviceType = (String) dynamicParams.get("deviceType");
- String msg = (String) msgPayload;
- String deviceIdJsonPath = HTTPEventAdapterConstants.DEVICE_ID_JSON_PATH;
- boolean status;
- if (status = isValidDevice(deviceId, deviceType, dynamicParams)) {
- if (msg.startsWith(JSON_ARRAY_START_CHAR)) {
- status = processMultipleEvents(msg, deviceId, deviceIdJsonPath);
- } else {
- status = processSingleEvent(msg, deviceId, deviceIdJsonPath);
- }
- }
- return new ContentInfo(status, msg);
- }
-
- private boolean processSingleEvent(String msg, String deviceIdFromTopic, String deviceIdJsonPath) {
- Object res = JsonPath.read(msg, deviceIdJsonPath);
- String deviceIdFromContent = (res != null) ? res.toString() : "";
- if (deviceIdFromContent.equals(deviceIdFromTopic)) {
- return true;
- }
- return false;
- }
-
- private boolean processMultipleEvents(String msg, String deviceIdFromTopic, String deviceIdJsonPath) {
- try {
- JSONParser jsonParser = new JSONParser();
- JSONArray jsonArray = (JSONArray) jsonParser.parse(msg);
- boolean status = false;
- for (int i = 0; i < jsonArray.size(); i++) {
- status = processSingleEvent(jsonArray.get(i).toString(), deviceIdFromTopic, deviceIdJsonPath);
- if (!status) {
- return status;
- }
- }
- return status;
- } catch (ParseException e) {
- log.error("Invalid input " + msg, e);
- return false;
- }
- }
-
- private boolean isValidDevice(String deviceId, String deviceType, Map dynamicParams) {
- List scopes = (List) dynamicParams.get(HTTPEventAdapterConstants.SCOPE_TAG);
- if (scopes != null) {
- for (String scope : scopes) {
- if (scope.startsWith(CDMF_SCOPE_PREFIX)) {
- String deviceIdInfo[] = scope.split(CDMF_SCOPE_SEPERATOR);
- if (deviceIdInfo.length == 3) {
- if (deviceId.equals(deviceIdInfo[2]) && deviceType.equals(deviceIdInfo[1])) {
- return true;
- }
- }
- }
- }
- }
- return false;
- }
-}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/util/HTTPEventAdapterConstants.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/util/HTTPEventAdapterConstants.java
index c5d88a975..7fe46450a 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/util/HTTPEventAdapterConstants.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/util/HTTPEventAdapterConstants.java
@@ -48,27 +48,17 @@ public final class HTTPEventAdapterConstants {
public static final int DEFAULT_HTTP_PORT = 9763;
public static final int DEFAULT_HTTPS_PORT = 9443;
public static final String MAXIMUM_TOTAL_HTTP_CONNECTION = "maximumTotalHttpConnection";
- public static final String MAXIMUM_TOTAL_HTTP_CONNECTION_HINT = "maximumTotalHttpConnection.hint";
public static final String MAXIMUM_HTTP_CONNECTION_PER_HOST = "maximumHttpConnectionPerHost";
- public static final String MAXIMUM_HTTP_CONNECTION_PER_HOST_HINT = "maximumHttpConnectionPerHost.hint";
- public static final String TOKEN_VALIDATION_ENDPOINT_URL = "keymanagerUrl";
+ public static final String TOKEN_VALIDATION_ENDPOINT_URL = "tokenValidationUrl";
public static final String TOKEN_VALIDATION_POST_FIX = "/services/OAuth2TokenValidationService";
public static final String USERNAME = "username";
- public static final String USERNAME_HINT = "username.hint";
public static final String PASSWORD = "password";
- public static final String PASSWORD_HINT = "password.hint";
- public static final String DEFAULT_STRING = "default";
- public static final String MAX_HTTP_CONNECTION = "2";
- public static final String MAX_TOTAL_HTTP_CONNECTION = "100";
public static final String TENANT_DOMAIN_TAG = "tenantDomain";
public static final String USERNAME_TAG = "username";
public static final String SCOPE_TAG = "scopes";
- public static final String PAYLOAD_TAG = "payload";
- public static final String DEVICE_ID_JSON_PATH = "event.metaData.deviceId";
- public static final String ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME = "contentValidator";
- public static final String ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME_HINT = "contentValidator.hint";
+ public static final String ADAPTER_CONF_CONTENT_VALIDATOR_TYPE = "contentValidator";
+ public static final String ADAPTER_CONF_CONTENT_VALIDATOR_TYPE_HINT = "contentValidator.hint";
public static final String DEFAULT = "default";
- public static final String HTTP_CONTENT_VALIDATION_DEFAULT_PARAMETERS = "";
public static final String ADAPTER_CONF_CONTENT_TRANSFORMER_CLASSNAME = "contentTransformer";
public static final String ADAPTER_CONF_CONTENT_TRANSFORMER_CLASSNAME_HINT = "contentTransformer.hint";
}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/util/PropertyUtils.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/util/PropertyUtils.java
new file mode 100644
index 000000000..d6f442cdd
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/java/org/wso2/carbon/device/mgt/input/adapter/http/util/PropertyUtils.java
@@ -0,0 +1,45 @@
+/*
+* Copyright (c) 2016, 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.device.mgt.input.adapter.http.util;
+
+import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterException;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class PropertyUtils {
+
+ //This method is only used if the mb features are within DAS.
+ public static String replaceProperty(String urlWithPlaceholders) throws InputEventAdapterException {
+ String regex = "\\$\\{(.*?)\\}";
+ Pattern pattern = Pattern.compile(regex);
+ Matcher matchPattern = pattern.matcher(urlWithPlaceholders);
+ while (matchPattern.find()) {
+ String sysPropertyName = matchPattern.group(1);
+ String sysPropertyValue = System.getProperty(sysPropertyName);
+ if (sysPropertyValue != null && !sysPropertyName.isEmpty()) {
+ urlWithPlaceholders = urlWithPlaceholders.replaceAll("\\$\\{(" + sysPropertyName + ")\\}", sysPropertyValue);
+ } else {
+ throw new InputEventAdapterException("System property - " + sysPropertyName
+ + " is not defined, hence cannot resolve : " + urlWithPlaceholders);
+ }
+ }
+ return urlWithPlaceholders;
+ }
+}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/resources/org/wso2/carbon/device/mgt/input/adapter/http/i18n/Resources.properties b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/resources/org/wso2/carbon/device/mgt/input/adapter/http/i18n/Resources.properties
index d21d20917..0b17e3b53 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/resources/org/wso2/carbon/device/mgt/input/adapter/http/i18n/Resources.properties
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.http/src/main/resources/org/wso2/carbon/device/mgt/input/adapter/http/i18n/Resources.properties
@@ -23,6 +23,6 @@ http.usage.tips_mid2=/endpoints/<event_receiver_name>For oth
http.usage.tips_mid3=/endpoints/t/<tenant_domain>/<event_receiver_name> https://localhost:
http.usage.tips_postfix=/endpoints/t/<tenant_domain>/<event_receiver_name>
contentValidator=contentValidator
-contentValidator.hint=Class Name of the content Validation or 'default' to set default class, required to implement (if required)
+contentValidator.hint=Type of the content Validation or 'default' to set default impl, required to implement (if required)
contentTransformer=contentTransformer
-contentTransformer.hint=Class Name of the content transformer or 'default' to set default class, required to implement (if required)
\ No newline at end of file
+contentTransformer.hint=Type of the content transformer or 'default' to set default type, required to implement (if required)
\ No newline at end of file
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/pom.xml b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/pom.xml
index 2ca1248e4..75e06262b 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/pom.xml
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/pom.xml
@@ -20,7 +20,7 @@
org.wso2.carbon.devicemgt-pluginscdmf-transport-adapters
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../../pom.xml4.0.0
@@ -32,6 +32,10 @@
http://wso2.org
+
+ commons-codec.wso2
+ commons-codec
+ org.wso2.carbon.analytics-commonorg.wso2.carbon.event.input.adapter.core
@@ -72,6 +76,10 @@
org.wso2.carbon.devicemgt-pluginsorg.wso2.carbon.device.mgt.input.adapter.extension
+
+ org.wso2.carbon.devicemgt
+ org.wso2.carbon.identity.jwt.client.extension
+
@@ -124,9 +132,20 @@
org.apache.http.client.methods;version="${httpclient.version.range}",
org.apache.http.impl.client;version="${httpclient.version.range}",
org.json.simple.*,
- com.jayway.jsonpath.*
+ com.jayway.jsonpath.*,
+ org.wso2.carbon.identity.jwt.client.extension.*,
+ javax.net.ssl,
+ org.apache.commons.codec.binary,
+ org.apache.commons.logging,
+ org.apache.http.entity,
+ org.osgi.framework,
+ org.osgi.service.component,
+ org.osgi.service.http,
+ org.wso2.carbon.context,
+ org.wso2.carbon.core,
+ org.wso2.carbon.device.mgt.input.adapter.extension,
+ org.wso2.carbon.user.api
- *
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/MQTTEventAdapter.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/MQTTEventAdapter.java
index a2ddfd446..f6b80dc79 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/MQTTEventAdapter.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/MQTTEventAdapter.java
@@ -42,7 +42,6 @@ public class MQTTEventAdapter implements InputEventAdapter {
private MQTTAdapterListener mqttAdapterListener;
private MQTTBrokerConnectionConfiguration mqttBrokerConnectionConfiguration;
-
public MQTTEventAdapter(InputEventAdapterConfiguration eventAdapterConfiguration,
Map globalProperties) {
this.eventAdapterConfiguration = eventAdapterConfiguration;
@@ -53,7 +52,6 @@ public class MQTTEventAdapter implements InputEventAdapter {
public void init(InputEventAdapterListener eventAdapterListener) throws InputEventAdapterException {
this.eventAdapterListener = eventAdapterListener;
try {
-
mqttBrokerConnectionConfiguration = new MQTTBrokerConnectionConfiguration(eventAdapterConfiguration
,globalProperties);
mqttAdapterListener = new MQTTAdapterListener(mqttBrokerConnectionConfiguration
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/MQTTEventAdapterFactory.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/MQTTEventAdapterFactory.java
index 5212b029d..f5f93b17a 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/MQTTEventAdapterFactory.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/MQTTEventAdapterFactory.java
@@ -65,12 +65,12 @@ public class MQTTEventAdapterFactory extends InputEventAdapterFactory {
//Content Validator details
- Property contentValidator = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME);
+ Property contentValidator = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_TYPE);
contentValidator.setDisplayName(
- resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME));
+ resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_TYPE));
contentValidator.setRequired(false);
contentValidator.setHint(
- resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME_HINT));
+ resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_TYPE_HINT));
contentValidator.setDefaultValue(MQTTEventAdapterConstants.DEFAULT);
propertyList.add(contentValidator);
@@ -78,7 +78,7 @@ public class MQTTEventAdapterFactory extends InputEventAdapterFactory {
Property userName = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME);
userName.setDisplayName(
resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME));
- userName.setRequired(true);
+ userName.setRequired(false);
userName.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME_HINT));
propertyList.add(userName);
@@ -86,7 +86,7 @@ public class MQTTEventAdapterFactory extends InputEventAdapterFactory {
Property password = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD);
userName.setDisplayName(
resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD));
- userName.setRequired(true);
+ userName.setRequired(false);
userName.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD_HINT));
propertyList.add(password);
@@ -108,12 +108,12 @@ public class MQTTEventAdapterFactory extends InputEventAdapterFactory {
propertyList.add(clearSession);
//Content Transformer details
- Property contentTransformer = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_TRANSFORMER_CLASSNAME);
+ Property contentTransformer = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_TRANSFORMER_TYPE);
contentTransformer.setDisplayName(
- resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_TRANSFORMER_CLASSNAME));
+ resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_TRANSFORMER_TYPE));
contentTransformer.setRequired(false);
contentTransformer.setHint(
- resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_TRANSFORMER_CLASSNAME_HINT));
+ resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_TRANSFORMER_TYPE_HINT));
contentTransformer.setDefaultValue(MQTTEventAdapterConstants.DEFAULT);
propertyList.add(contentTransformer);
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/internal/InputAdapterServiceComponent.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/internal/InputAdapterServiceComponent.java
index d02b8d356..e281a7dae 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/internal/InputAdapterServiceComponent.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/internal/InputAdapterServiceComponent.java
@@ -21,11 +21,23 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.http.HttpService;
+import org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionService;
import org.wso2.carbon.device.mgt.input.adapter.mqtt.MQTTEventAdapterFactory;
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterFactory;
+import org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService;
/**
* @scr.component name="input.iot.mqtt.AdapterService.component" immediate="true"
+ * @scr.reference name="input.extension.service" interface="org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionService"
+ * cardinality="1..1"
+ * policy="dynamic"
+ * bind="setInputAdapterExtensionService"
+ * unbind="unsetInputAdapterExtensionService"
+ * @scr.reference name="jwt.client.service" interface="org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService"
+ * cardinality="1..1"
+ * policy="dynamic"
+ * bind="setJWTClientManagerService"
+ * unbind="unsetJWTClientManagerService"
*/
public class InputAdapterServiceComponent {
@@ -52,4 +64,20 @@ public class InputAdapterServiceComponent {
InputAdapterServiceDataHolder.registerHTTPService(null);
}
+ protected void setInputAdapterExtensionService(InputAdapterExtensionService inputAdapterExtensionService) {
+ InputAdapterServiceDataHolder.setInputAdapterExtensionService(inputAdapterExtensionService);
+ }
+
+ protected void unsetInputAdapterExtensionService(InputAdapterExtensionService inputAdapterExtensionService) {
+ InputAdapterServiceDataHolder.setInputAdapterExtensionService(null);
+ }
+
+ protected void setJWTClientManagerService(JWTClientManagerService jwtClientManagerService) {
+ InputAdapterServiceDataHolder.setJwtClientManagerService(jwtClientManagerService);
+ }
+
+ protected void unsetJWTClientManagerService(JWTClientManagerService jwtClientManagerService) {
+ InputAdapterServiceDataHolder.setJwtClientManagerService(null);
+ }
+
}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/internal/InputAdapterServiceDataHolder.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/internal/InputAdapterServiceDataHolder.java
index 5335ddfb4..72fdbe245 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/internal/InputAdapterServiceDataHolder.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/internal/InputAdapterServiceDataHolder.java
@@ -15,6 +15,8 @@
package org.wso2.carbon.device.mgt.input.adapter.mqtt.internal;
import org.osgi.service.http.HttpService;
+import org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionService;
+import org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService;
/**
* common place to hold some OSGI service references.
@@ -22,6 +24,8 @@ import org.osgi.service.http.HttpService;
public final class InputAdapterServiceDataHolder {
private static HttpService httpService;
+ private static InputAdapterExtensionService inputAdapterExtensionService;
+ private static JWTClientManagerService jwtClientManagerService;
private InputAdapterServiceDataHolder() {
}
@@ -35,5 +39,20 @@ public final class InputAdapterServiceDataHolder {
return httpService;
}
+ public static void setInputAdapterExtensionService(InputAdapterExtensionService inputAdapterExtensionService) {
+ InputAdapterServiceDataHolder.inputAdapterExtensionService = inputAdapterExtensionService;
+ }
+ public static InputAdapterExtensionService getInputAdapterExtensionService() {
+ return inputAdapterExtensionService;
+ }
+
+ public static JWTClientManagerService getJwtClientManagerService() {
+ return jwtClientManagerService;
+ }
+
+ public static void setJwtClientManagerService(
+ JWTClientManagerService jwtClientManagerService) {
+ InputAdapterServiceDataHolder.jwtClientManagerService = jwtClientManagerService;
+ }
}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTAdapterListener.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTAdapterListener.java
index 96546c3ad..dbfc79c9c 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTAdapterListener.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTAdapterListener.java
@@ -21,14 +21,11 @@ import org.apache.commons.codec.binary.Base64;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
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.BasicHeader;
-import org.apache.http.message.BasicNameValuePair;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;
import org.json.simple.JSONObject;
@@ -39,11 +36,13 @@ import org.wso2.carbon.core.ServerStatus;
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentInfo;
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentTransformer;
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator;
-import org.wso2.carbon.device.mgt.input.adapter.extension.DefaultContentTransformer;
-import org.wso2.carbon.device.mgt.input.adapter.extension.DefaultContentValidator;
+import org.wso2.carbon.device.mgt.input.adapter.mqtt.internal.InputAdapterServiceDataHolder;
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterListener;
import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterRuntimeException;
-import org.wso2.carbon.device.mgt.input.adapter.mqtt.exception.MQTTContentInitializationException;
+import org.wso2.carbon.identity.jwt.client.extension.dto.AccessTokenInfo;
+import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientException;
+import org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService;
+import org.wso2.carbon.user.api.UserStoreException;
import java.io.IOException;
import java.net.MalformedURLException;
@@ -51,9 +50,7 @@ import java.net.URL;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
public class MQTTAdapterListener implements MqttCallback, Runnable {
@@ -83,7 +80,7 @@ public class MQTTAdapterListener implements MqttCallback, Runnable {
this.mqttBrokerConnectionConfiguration = mqttBrokerConnectionConfiguration;
this.cleanSession = mqttBrokerConnectionConfiguration.isCleanSession();
int keepAlive = mqttBrokerConnectionConfiguration.getKeepAlive();
- this.topic = topic;
+ this.topic = PropertyUtils.replaceTenantDomainProperty(topic);
this.eventAdapterListener = inputEventAdapterListener;
this.tenantId = tenantId;
@@ -102,43 +99,23 @@ public class MQTTAdapterListener implements MqttCallback, Runnable {
// Set this wrapper as the callback handler
mqttClient.setCallback(this);
- String contentValidatorClassName = this.mqttBrokerConnectionConfiguration.getContentValidatorClassName();
+ String contentValidatorType = this.mqttBrokerConnectionConfiguration.getContentValidatorType();
- if (contentValidatorClassName != null && contentValidatorClassName.equals(MQTTEventAdapterConstants.DEFAULT)) {
- contentValidator = new DefaultContentValidator();
- } else if (contentValidatorClassName != null && !contentValidatorClassName.isEmpty()) {
- try {
- Class extends ContentValidator> contentValidatorClass = Class.forName(contentValidatorClassName)
- .asSubclass(ContentValidator.class);
- contentValidator = contentValidatorClass.newInstance();
- } catch (ClassNotFoundException e) {
- throw new MQTTContentInitializationException(
- "Unable to find the class validator: " + contentValidatorClassName, e);
- } catch (InstantiationException e) {
- throw new MQTTContentInitializationException(
- "Unable to create an instance of :" + contentValidatorClassName, e);
- } catch (IllegalAccessException e) {
- throw new MQTTContentInitializationException("Access of the instance in not allowed.", e);
- }
+ if (contentValidatorType == null || contentValidatorType.equals(MQTTEventAdapterConstants.DEFAULT)) {
+ contentValidator = InputAdapterServiceDataHolder.getInputAdapterExtensionService()
+ .getDefaultContentValidator();
+ } else {
+ contentValidator = InputAdapterServiceDataHolder.getInputAdapterExtensionService()
+ .getContentValidator(contentValidatorType);
}
- String contentTransformerClassName = this.mqttBrokerConnectionConfiguration.getContentTransformerClassName();
- if (contentTransformerClassName != null && contentTransformerClassName.equals(MQTTEventAdapterConstants.DEFAULT)) {
- contentTransformer = new DefaultContentTransformer();
- } else if (contentTransformerClassName != null && !contentTransformerClassName.isEmpty()) {
- try {
- Class extends ContentTransformer> contentTransformerClass = Class.forName(contentTransformerClassName)
- .asSubclass(ContentTransformer.class);
- contentTransformer = contentTransformerClass.newInstance();
- } catch (ClassNotFoundException e) {
- throw new MQTTContentInitializationException(
- "Unable to find the class transfoer: " + contentTransformerClassName, e);
- } catch (InstantiationException e) {
- throw new MQTTContentInitializationException(
- "Unable to create an instance of :" + contentTransformerClassName, e);
- } catch (IllegalAccessException e) {
- throw new MQTTContentInitializationException("Access of the instance in not allowed.", e);
- }
+ String contentTransformerType = this.mqttBrokerConnectionConfiguration.getContentTransformerType();
+ if (contentTransformerType == null || contentTransformerType.equals(MQTTEventAdapterConstants.DEFAULT)) {
+ contentTransformer = InputAdapterServiceDataHolder.getInputAdapterExtensionService()
+ .getDefaultContentTransformer();
+ } else {
+ contentTransformer = InputAdapterServiceDataHolder.getInputAdapterExtensionService()
+ .getContentTransformer(contentTransformerType);
}
} catch (MqttException e) {
log.error("Exception occurred while subscribing to MQTT broker at "
@@ -165,8 +142,16 @@ public class MQTTAdapterListener implements MqttCallback, Runnable {
registrationProfile.setGrantType(MQTTEventAdapterConstants.GRANT_TYPE);
registrationProfile.setOwner(username);
registrationProfile.setTokenScope(MQTTEventAdapterConstants.TOKEN_SCOPE);
- registrationProfile.setClientName(MQTTEventAdapterConstants.APPLICATION_NAME_PREFIX
- + mqttBrokerConnectionConfiguration.getAdapterName() + "_" + tenantId);
+ if (!mqttBrokerConnectionConfiguration.isGlobalCredentailSet()) {
+ registrationProfile.setClientName(MQTTEventAdapterConstants.APPLICATION_NAME_PREFIX
+ + mqttBrokerConnectionConfiguration.getAdapterName() +
+ "_" + tenantId);
+ registrationProfile.setIsSaasApp(false);
+ } else {
+ registrationProfile.setClientName(MQTTEventAdapterConstants.APPLICATION_NAME_PREFIX
+ + mqttBrokerConnectionConfiguration.getAdapterName());
+ registrationProfile.setIsSaasApp(true);
+ }
String jsonString = registrationProfile.toJSON();
StringEntity requestEntity = new StringEntity(jsonString, ContentType.APPLICATION_JSON);
postMethod.setEntity(requestEntity);
@@ -192,8 +177,10 @@ public class MQTTAdapterListener implements MqttCallback, Runnable {
}
} catch (MalformedURLException e) {
log.error("Invalid dcrUrl : " + dcrUrlString);
- } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException | IOException e) {
- log.error("Failed to create an https connection.", e);
+ } catch (JWTClientException | UserStoreException e) {
+ log.error("Failed to create an oauth token with jwt grant type.", e);
+ } catch (NoSuchAlgorithmException |KeyManagementException |KeyStoreException | IOException e) {
+ log.error("Failed to create a http connection.", e);
}
}
}
@@ -287,34 +274,26 @@ public class MQTTAdapterListener implements MqttCallback, Runnable {
}
private String getToken(String clientId, String clientSecret)
- throws IOException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException, ParseException {
- URL tokenEndpoint = new URL(mqttBrokerConnectionConfiguration.getTokenUrl());
- HttpClient httpClient = MQTTUtil.getHttpClient(tokenEndpoint.getProtocol());
- HttpPost postMethod = new HttpPost(tokenEndpoint.toString());
-
- List nameValuePairs = new ArrayList<>();
- nameValuePairs.add(new BasicNameValuePair(MQTTEventAdapterConstants.GRANT_TYPE_PARAM_NAME,
- MQTTEventAdapterConstants.PASSWORD_GRANT_TYPE));
- nameValuePairs.add(new BasicNameValuePair(MQTTEventAdapterConstants.PASSWORD_GRANT_TYPE_USERNAME,
- mqttBrokerConnectionConfiguration.getUsername()));
- nameValuePairs.add(new BasicNameValuePair(MQTTEventAdapterConstants.PASSWORD_GRANT_TYPE_PASSWORD,
- mqttBrokerConnectionConfiguration.getPassword()));
- String scopes = mqttBrokerConnectionConfiguration.getBrokerScopes();
- if (scopes != null && !scopes.isEmpty()) {
- nameValuePairs.add(new BasicNameValuePair(MQTTEventAdapterConstants.PASSWORD_GRANT_TYPE_SCOPES, scopes));
- }
+ throws UserStoreException, JWTClientException {
+ PrivilegedCarbonContext.startTenantFlow();
+ PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenantId, true);
+ try {
+ String scopes = mqttBrokerConnectionConfiguration.getBrokerScopes();
+ String username = mqttBrokerConnectionConfiguration.getUsername();
+ if (mqttBrokerConnectionConfiguration.isGlobalCredentailSet()) {
+ username = PrivilegedCarbonContext.getThreadLocalCarbonContext()
+ .getUserRealm().getRealmConfiguration().getAdminUserName() + "@" + PrivilegedCarbonContext
+ .getThreadLocalCarbonContext().getTenantDomain(true);
+ }
- postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));
- postMethod.addHeader("Authorization", "Basic " + getBase64Encode(clientId, clientSecret));
- postMethod.addHeader("Content-Type", "application/x-www-form-urlencoded");
- HttpResponse httpResponse = httpClient.execute(postMethod);
- String response = MQTTUtil.getResponseString(httpResponse);
- if (log.isDebugEnabled()) {
- log.debug(response);
+ JWTClientManagerService jwtClientManagerService =
+ InputAdapterServiceDataHolder.getJwtClientManagerService();
+ AccessTokenInfo accessTokenInfo = jwtClientManagerService.getJWTClient().getAccessToken(
+ clientId, clientSecret, username, scopes);
+ return accessTokenInfo.getAccessToken();
+ } finally {
+ PrivilegedCarbonContext.endTenantFlow();
}
- JSONParser jsonParser = new JSONParser();
- JSONObject jsonObject = (JSONObject) jsonParser.parse(response);
- return (String) jsonObject.get(MQTTEventAdapterConstants.ACCESS_TOKEN_GRANT_TYPE_PARAM_NAME);
}
private String getBase64Encode(String key, String value) {
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTBrokerConnectionConfiguration.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTBrokerConnectionConfiguration.java
index 59ef8a3b4..3685c245f 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTBrokerConnectionConfiguration.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTBrokerConnectionConfiguration.java
@@ -34,10 +34,10 @@ public class MQTTBrokerConnectionConfiguration {
private int keepAlive;
private String brokerUrl;
private String dcrUrl;
- private String tokenUrl;
- private String contentValidatorClassName;
- private String contentTransformerClassName;
+ private String contentValidatorType;
+ private String contentTransformerType;
private String adapterName;
+ private boolean globalCredentailSet;
public String getBrokerScopes() {
return brokerScopes;
@@ -67,16 +67,16 @@ public class MQTTBrokerConnectionConfiguration {
return keepAlive;
}
- public String getContentValidatorClassName() {
- return contentValidatorClassName;
+ public String getContentValidatorType() {
+ return contentValidatorType;
}
- public String getContentTransformerClassName() {
- return contentTransformerClassName;
+ public String getContentTransformerType() {
+ return contentTransformerType;
}
- public String getTokenUrl() {
- return tokenUrl;
+ public boolean isGlobalCredentailSet() {
+ return globalCredentailSet;
}
public String getAdapterName() {
@@ -89,6 +89,11 @@ public class MQTTBrokerConnectionConfiguration {
adapterName = eventAdapterConfiguration.getName();
this.username = eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME);
this.password = eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD);
+ if ((username == null || username.isEmpty()) && (password == null || password.isEmpty())) {
+ username = globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME);
+ password = globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD);
+ globalCredentailSet = true;
+ }
this.brokerScopes = eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_SCOPES);
if (brokerScopes == null) {
this.brokerScopes = MQTTEventAdapterConstants.EMPTY_STRING;
@@ -100,10 +105,8 @@ public class MQTTBrokerConnectionConfiguration {
this.brokerUrl = PropertyUtils.replaceMqttProperty(url);
this.dcrUrl = PropertyUtils
.replaceMqttProperty(globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_DCR_URL));
- this.tokenUrl = PropertyUtils
- .replaceMqttProperty(globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_TOKEN_URL));
- this.contentValidatorClassName = eventAdapterConfiguration.getProperties()
- .get(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME);
+ this.contentValidatorType = eventAdapterConfiguration.getProperties()
+ .get(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_TYPE);
this.cleanSession = Boolean.parseBoolean(eventAdapterConfiguration.getProperties()
.get(MQTTEventAdapterConstants.ADAPTER_CONF_CLEAN_SESSION));
//If global properties are available those will be assigned else constant values will be assigned
@@ -112,7 +115,7 @@ public class MQTTBrokerConnectionConfiguration {
} else {
keepAlive = MQTTEventAdapterConstants.ADAPTER_CONF_DEFAULT_KEEP_ALIVE;
}
- this.contentTransformerClassName = eventAdapterConfiguration.getProperties()
- .get(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_TRANSFORMER_CLASSNAME);
+ this.contentTransformerType = eventAdapterConfiguration.getProperties()
+ .get(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_TRANSFORMER_TYPE);
}
}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTEventAdapterConstants.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTEventAdapterConstants.java
index f21abd29b..dc0e45413 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTEventAdapterConstants.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/MQTTEventAdapterConstants.java
@@ -35,10 +35,10 @@ public class MQTTEventAdapterConstants {
public static final String ADAPTER_CONF_DCR_URL = "dcrUrl";
public static final String ADAPTER_CONF_TOKEN_URL = "tokenUrl";
public static final String ADAPTER_CONF_DCR_URL_HINT = "dcrUrl.hint";
- public static final String ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME = "contentValidator";
- public static final String ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME_HINT = "contentValidator.hint";
- public static final String ADAPTER_CONF_CONTENT_TRANSFORMER_CLASSNAME = "contentTransformer";
- public static final String ADAPTER_CONF_CONTENT_TRANSFORMER_CLASSNAME_HINT = "contentTransformer.hint";
+ public static final String ADAPTER_CONF_CONTENT_VALIDATOR_TYPE = "contentValidator";
+ public static final String ADAPTER_CONF_CONTENT_VALIDATOR_TYPE_HINT = "contentValidator.hint";
+ public static final String ADAPTER_CONF_CONTENT_TRANSFORMER_TYPE = "contentTransformer";
+ public static final String ADAPTER_CONF_CONTENT_TRANSFORMER_TYPE_HINT = "contentTransformer.hint";
public static final String ADAPTER_MESSAGE_TOPIC = "topic";
public static final String ADAPTER_MESSAGE_TOPIC_HINT = "topic.hint";
public static final String ADAPTER_CONF_CLIENTID = "clientId";
@@ -53,7 +53,7 @@ public class MQTTEventAdapterConstants {
public static final String EMPTY_STRING = "";
public static final String GRANT_TYPE_PARAM_NAME = "grant_type";
- public static final String GRANT_TYPE = "password refresh_token";
+ public static final String GRANT_TYPE = "password refresh_token urn:ietf:params:oauth:grant-type:jwt-bearer";
public static final String TOKEN_SCOPE = "production";
public static final String APPLICATION_NAME_PREFIX = "InputAdapter_";
public static final String CLIENT_ID = "clientId";
@@ -63,15 +63,7 @@ public class MQTTEventAdapterConstants {
public static final String MQTT_CONTENT_VALIDATION_DEFAULT_PARAMETERS = "";
public static final String TOPIC = "topic";
public static final String PAYLOAD = "payload";
- public static final String DEVICE_ID_JSON_PATH = "event.metaData.deviceId";
- public static final String DEVICE_TYPE_JSON_PATH = "event.metaData.deviceId";
- public static final int DEVICE_ID_TOPIC_HIERARCHY_INDEX = 2;
public static final String AUTHORIZATION_HEADER_NAME = "Authorization";
public static final String AUTHORIZATION_HEADER_VALUE_PREFIX = "Basic ";
- public static final String PASSWORD_GRANT_TYPE = "password";
- public static final String PASSWORD_GRANT_TYPE_USERNAME = "username";
- public static final String PASSWORD_GRANT_TYPE_PASSWORD = "password";
- public static final String PASSWORD_GRANT_TYPE_SCOPES = "scopes";
- public static final String ACCESS_TOKEN_GRANT_TYPE_PARAM_NAME = "access_token";
}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/PropertyUtils.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/PropertyUtils.java
index 91a512b79..682a292f7 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/PropertyUtils.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/PropertyUtils.java
@@ -18,12 +18,14 @@
package org.wso2.carbon.device.mgt.input.adapter.mqtt.util;
+import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class PropertyUtils {
+ private static final String TENANT_DOMAIN_PROPERTY = "\\$\\{tenant-domain\\}";
//This method is only used if the mb features are within DAS.
static String replaceMqttProperty(String urlWithPlaceholders) throws InputEventAdapterException {
@@ -42,4 +44,10 @@ class PropertyUtils {
}
return urlWithPlaceholders;
}
+
+ public static String replaceTenantDomainProperty (String urlWithPlaceholders) {
+ urlWithPlaceholders = urlWithPlaceholders.replaceAll(TENANT_DOMAIN_PROPERTY, PrivilegedCarbonContext
+ .getThreadLocalCarbonContext().getTenantDomain(true));
+ return urlWithPlaceholders;
+ }
}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/RegistrationProfile.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/RegistrationProfile.java
index f5445f170..fddc8e534 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/RegistrationProfile.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/input/adapter/mqtt/util/RegistrationProfile.java
@@ -12,6 +12,7 @@ public class RegistrationProfile {
private String owner;
private String grantType;
private String applicationType;
+ private boolean isSaasApp;
private static final String TAG = RegistrationProfile.class.getSimpleName();
@@ -63,11 +64,19 @@ public class RegistrationProfile {
this.applicationType = applicationType;
}
- public String toJSON() {
+ public boolean isSaasApp() {
+ return isSaasApp;
+ }
+
+ public void setIsSaasApp(boolean isSaasApp) {
+ this.isSaasApp = isSaasApp;
+ }
+
+ public String toJSON() {
String jsonString =
"{\"callbackUrl\": \"" + callbackUrl + "\",\"clientName\": \"" + clientName + "\", \"tokenScope\": " +
"\"" + tokenScope + "\", \"owner\": \"" + owner + "\"," + "\"grantType\": \"" + grantType +
- "\", \"saasApp\" :false }\n";
+ "\", \"saasApp\" :" + isSaasApp + " }\n";
return jsonString;
}
}
\ No newline at end of file
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/resources/org/wso2/carbon/device/mgt/input/adapter/mqtt/i18n/Resources.properties b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/resources/org/wso2/carbon/device/mgt/input/adapter/mqtt/i18n/Resources.properties
index 38cfcf7c6..aee8d9a4c 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/resources/org/wso2/carbon/device/mgt/input/adapter/mqtt/i18n/Resources.properties
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.mqtt/src/main/resources/org/wso2/carbon/device/mgt/input/adapter/mqtt/i18n/Resources.properties
@@ -27,14 +27,12 @@ password=Password
password.hint=Password of the user for the broker (if required)
scopes=Scopes
scopes.hint=Scopes required to connect to broker (if required)
-dcrUrl=dcrUrl
-dcrUrl.hint=dynamic client registration endpoint URL to create application (if required) eg: https://localhost:9443/dynamic-client-web/register
contentValidator=contentValidation
-contentValidator.hint=Class Name of the content Validation or 'default' to set default class, required to implement (if required)
+contentValidator.hint=Type of the content Validation or 'default' to set default type, required to implement (if required)
url.hint=MQTT broker url tcp://localhost:1883
cleanSession=Clean Session
cleanSession.hint=Persist topic subscriptions and ack positions across client sessions
keepAlive=Keep Alive (In seconds)
events.duplicated.in.cluster=Is events duplicated in cluster
contentTransformer=contentTransformer
-contentTransformer.hint=Class Name of the content transformer or 'default' to set default class, required to implement (if required)
\ No newline at end of file
+contentTransformer.hint=Type of the content transformer or 'default' to set default type, required to implement (if required)
\ No newline at end of file
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/pom.xml b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/pom.xml
index b125b2459..1f1b6d602 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/pom.xml
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/pom.xml
@@ -20,7 +20,7 @@
org.wso2.carbon.devicemgt-pluginscdmf-transport-adapters
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../../pom.xml4.0.0
@@ -116,9 +116,16 @@
org.jivesoftware.smack.*,
org.apache.log4j,
org.wso2.carbon.base,
- org.wso2.carbon.core.util
+ org.wso2.carbon.core.util,
+ org.apache.commons.logging,
+ org.osgi.framework,
+ org.osgi.service.component,
+ org.osgi.service.http,
+ org.wso2.carbon.context,
+ org.wso2.carbon.core,
+ org.wso2.carbon.device.mgt.input.adapter.extension,
+ org.wso2.carbon.user.core.service
- *
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/java/org/wso2/carbon/device/mgt/input/adapter/xmpp/internal/InputAdapterServiceComponent.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/java/org/wso2/carbon/device/mgt/input/adapter/xmpp/internal/InputAdapterServiceComponent.java
index 32db2049b..4099c23f3 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/java/org/wso2/carbon/device/mgt/input/adapter/xmpp/internal/InputAdapterServiceComponent.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/java/org/wso2/carbon/device/mgt/input/adapter/xmpp/internal/InputAdapterServiceComponent.java
@@ -21,6 +21,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.service.component.ComponentContext;
import org.osgi.service.http.HttpService;
+import org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionService;
import org.wso2.carbon.device.mgt.input.adapter.xmpp.XMPPEventAdapterFactory;
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterFactory;
import org.wso2.carbon.user.core.service.RealmService;
@@ -30,6 +31,11 @@ import org.wso2.carbon.user.core.service.RealmService;
* @scr.reference name="user.realmservice.default"
* interface="org.wso2.carbon.user.core.service.RealmService" cardinality="1..1"
* policy="dynamic" bind="setRealmService" unbind="unsetRealmService"
+ * @scr.reference name="input.extension.service" interface="org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionService"
+ * cardinality="1..1"
+ * policy="dynamic"
+ * bind="setInputAdapterExtensionService"
+ * unbind="unsetInputAdapterExtensionService"
*/
public class InputAdapterServiceComponent {
@@ -64,4 +70,12 @@ public class InputAdapterServiceComponent {
InputAdapterServiceDataHolder.registerHTTPService(null);
}
+ protected void setInputAdapterExtensionService(InputAdapterExtensionService inputAdapterExtensionService) {
+ InputAdapterServiceDataHolder.setInputAdapterExtensionService(inputAdapterExtensionService);
+ }
+
+ protected void unsetInputAdapterExtensionService(InputAdapterExtensionService inputAdapterExtensionService) {
+ InputAdapterServiceDataHolder.setInputAdapterExtensionService(null);
+ }
+
}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/java/org/wso2/carbon/device/mgt/input/adapter/xmpp/internal/InputAdapterServiceDataHolder.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/java/org/wso2/carbon/device/mgt/input/adapter/xmpp/internal/InputAdapterServiceDataHolder.java
index 38296aea8..f2c92c898 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/java/org/wso2/carbon/device/mgt/input/adapter/xmpp/internal/InputAdapterServiceDataHolder.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/java/org/wso2/carbon/device/mgt/input/adapter/xmpp/internal/InputAdapterServiceDataHolder.java
@@ -15,6 +15,7 @@
package org.wso2.carbon.device.mgt.input.adapter.xmpp.internal;
import org.osgi.service.http.HttpService;
+import org.wso2.carbon.device.mgt.input.adapter.extension.InputAdapterExtensionService;
import org.wso2.carbon.user.core.service.RealmService;
/**
@@ -24,6 +25,7 @@ public final class InputAdapterServiceDataHolder {
private static RealmService realmService;
private static HttpService httpService;
+ private static InputAdapterExtensionService inputAdapterExtensionService;
private InputAdapterServiceDataHolder() {
}
@@ -46,5 +48,12 @@ public final class InputAdapterServiceDataHolder {
return httpService;
}
+ public static void setInputAdapterExtensionService(InputAdapterExtensionService inputAdapterExtensionService) {
+ InputAdapterServiceDataHolder.inputAdapterExtensionService = inputAdapterExtensionService;
+ }
+
+ public static InputAdapterExtensionService getInputAdapterExtensionService() {
+ return inputAdapterExtensionService;
+ }
}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/java/org/wso2/carbon/device/mgt/input/adapter/xmpp/util/XMPPAdapterListener.java b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/java/org/wso2/carbon/device/mgt/input/adapter/xmpp/util/XMPPAdapterListener.java
index 2dd10098a..3203ba586 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/java/org/wso2/carbon/device/mgt/input/adapter/xmpp/util/XMPPAdapterListener.java
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/java/org/wso2/carbon/device/mgt/input/adapter/xmpp/util/XMPPAdapterListener.java
@@ -21,7 +21,6 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.PacketListener;
-import org.jivesoftware.smack.ReconnectionManager;
import org.jivesoftware.smack.SmackConfiguration;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
@@ -36,9 +35,10 @@ import org.wso2.carbon.core.ServerStatus;
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentInfo;
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentTransformer;
import org.wso2.carbon.device.mgt.input.adapter.extension.ContentValidator;
-import org.wso2.carbon.device.mgt.input.adapter.extension.DefaultContentTransformer;
-import org.wso2.carbon.device.mgt.input.adapter.extension.DefaultContentValidator;
+import org.wso2.carbon.device.mgt.input.adapter.extension.transformer.DefaultContentTransformer;
+import org.wso2.carbon.device.mgt.input.adapter.extension.validator.DefaultContentValidator;
import org.wso2.carbon.device.mgt.input.adapter.xmpp.exception.XMPPContentInitializationException;
+import org.wso2.carbon.device.mgt.input.adapter.xmpp.internal.InputAdapterServiceDataHolder;
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterListener;
import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterRuntimeException;
import java.util.HashMap;
@@ -58,55 +58,27 @@ public class XMPPAdapterListener implements Runnable {
private InputEventAdapterListener eventAdapterListener = null;
-
public XMPPAdapterListener(XMPPServerConnectionConfiguration xmppServerConnectionConfiguration,
InputEventAdapterListener inputEventAdapterListener, int tenantId) {
this.xmppServerConnectionConfiguration = xmppServerConnectionConfiguration;
this.eventAdapterListener = inputEventAdapterListener;
this.tenantId = tenantId;
- try {
- String contentValidatorClassName = this.xmppServerConnectionConfiguration.getContentValidatorClassName();
- if (contentValidatorClassName != null && contentValidatorClassName.equals(XMPPEventAdapterConstants.DEFAULT)) {
- contentValidator = new DefaultContentValidator();
- } else if (contentValidatorClassName != null && !contentValidatorClassName.isEmpty()) {
- try {
- Class extends ContentValidator> contentValidatorClass = Class.forName(contentValidatorClassName)
- .asSubclass(ContentValidator.class);
- contentValidator = contentValidatorClass.newInstance();
- } catch (ClassNotFoundException e) {
- throw new XMPPContentInitializationException(
- "Unable to find the class validator: " + contentValidatorClassName, e);
- } catch (InstantiationException e) {
- throw new XMPPContentInitializationException(
- "Unable to create an instance of :" + contentValidatorClassName, e);
- } catch (IllegalAccessException e) {
- throw new XMPPContentInitializationException("Access of the instance in not allowed.", e);
- }
- }
+ String contentValidatorType = this.xmppServerConnectionConfiguration.getContentValidatorClassName();
+ if (contentValidatorType == null || contentValidatorType.equals(XMPPEventAdapterConstants.DEFAULT)) {
+ contentValidator = InputAdapterServiceDataHolder.getInputAdapterExtensionService().getDefaultContentValidator();
+ } else {
+ contentValidator = InputAdapterServiceDataHolder.getInputAdapterExtensionService()
+ .getContentValidator(contentValidatorType);
+ }
- String contentTransformerClassName = this.xmppServerConnectionConfiguration.getContentTransformerClassName();
- if (contentTransformerClassName != null && contentTransformerClassName.equals(XMPPEventAdapterConstants.DEFAULT)) {
- contentTransformer = new DefaultContentTransformer();
- } else if (contentTransformerClassName != null && !contentTransformerClassName.isEmpty()) {
- try {
- Class extends ContentTransformer> contentTransformerClass = Class.forName(contentTransformerClassName)
- .asSubclass(ContentTransformer.class);
- contentTransformer = contentTransformerClass.newInstance();
- } catch (ClassNotFoundException e) {
- throw new XMPPContentInitializationException(
- "Unable to find the class transformer: " + contentTransformerClassName, e);
- } catch (InstantiationException e) {
- throw new XMPPContentInitializationException(
- "Unable to create an instance of :" + contentTransformerClassName, e);
- } catch (IllegalAccessException e) {
- throw new XMPPContentInitializationException("Access of the instance in not allowed.", e);
- }
- }
- } catch (Throwable e) {
- log.error("Exception occurred while subscribing to MQTT broker at "
- + xmppServerConnectionConfiguration.getHost());
- throw new InputEventAdapterRuntimeException(e);
+ String contentTransformerType = this.xmppServerConnectionConfiguration.getContentTransformerClassName();
+ if (contentTransformer == null || contentTransformerType.equals(XMPPEventAdapterConstants.DEFAULT)) {
+ this.contentTransformer = InputAdapterServiceDataHolder.getInputAdapterExtensionService()
+ .getDefaultContentTransformer();
+ } else {
+ this.contentTransformer = InputAdapterServiceDataHolder.getInputAdapterExtensionService()
+ .getContentTransformer(contentTransformerType);
}
}
diff --git a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/resources/org/wso2/carbon/device/mgt/input/adapter/xmpp/i18n/Resources.properties b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/resources/org/wso2/carbon/device/mgt/input/adapter/xmpp/i18n/Resources.properties
index ac6b7f1e1..7c63ed55d 100644
--- a/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/resources/org/wso2/carbon/device/mgt/input/adapter/xmpp/i18n/Resources.properties
+++ b/components/extensions/cdmf-transport-adapters/input/org.wso2.carbon.device.mgt.input.adapter.xmpp/src/main/resources/org/wso2/carbon/device/mgt/input/adapter/xmpp/i18n/Resources.properties
@@ -29,8 +29,8 @@ timeoutInterval.hint=used by listeners to the server and for reconnection schedu
resource=Resource
resource.hint=specific to the XMPP-Account to which the login is made to.
contentValidator=contentValidation
-contentValidator.hint=Class Name of the content Validation or 'default' to set default class, required to implement (if required)
+contentValidator.hint=Type of the content Validation or 'default' to set default type, required to implement (if required)
jid=jid
jid.hint=JID - XMPP Account Name.
contentTransformer=contentTransformer
-contentTransformer.hint=Class Name of the content transformer or 'default' to set default class, required to implement (if required)
\ No newline at end of file
+contentTransformer.hint=Type of the content transformer or 'default' to set default type, required to implement (if required)
\ No newline at end of file
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/pom.xml b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/pom.xml
index 8c29a6cae..c35581e67 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/pom.xml
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/pom.xml
@@ -20,7 +20,7 @@
org.wso2.carbon.devicemgt-pluginscdmf-transport-adapters
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../../pom.xml4.0.0
@@ -33,6 +33,10 @@
http://wso2.org
+
+ commons-codec.wso2
+ commons-codec
+ org.wso2.carbon.analytics-commonorg.wso2.carbon.event.output.adapter.core
@@ -61,6 +65,10 @@
com.googlecode.json-simple.wso2json-simple
+
+ org.wso2.carbon.devicemgt
+ org.wso2.carbon.identity.jwt.client.extension
+
@@ -121,7 +129,9 @@
org.apache.commons.codec.binary,
org.apache.http.client.entity,
org.apache.http.message,
- org.apache.commons.ssl
+ org.apache.commons.ssl,
+ org.wso2.carbon.identity.jwt.client.extension.*,
+ org.wso2.carbon.user.api
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/MQTTEventAdapter.java b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/MQTTEventAdapter.java
index a87fddf58..fbc9c015d 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/MQTTEventAdapter.java
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/MQTTEventAdapter.java
@@ -122,7 +122,7 @@ public class MQTTEventAdapter implements OutputEventAdapter {
String clientId = eventAdapterConfiguration.getStaticProperties().get(
MQTTEventAdapterConstants.ADAPTER_CONF_CLIENTID);
qos = eventAdapterConfiguration.getStaticProperties().get(MQTTEventAdapterConstants.ADAPTER_MESSAGE_QOS);
- mqttAdapterPublisher = new MQTTAdapterPublisher(mqttBrokerConnectionConfiguration, clientId);
+ mqttAdapterPublisher = new MQTTAdapterPublisher(mqttBrokerConnectionConfiguration, clientId, tenantId);
}
@Override
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/MQTTEventAdapterFactory.java b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/MQTTEventAdapterFactory.java
index 9275ec20d..1c8cd43de 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/MQTTEventAdapterFactory.java
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/MQTTEventAdapterFactory.java
@@ -56,19 +56,20 @@ public class MQTTEventAdapterFactory extends OutputEventAdapterFactory {
//Broker Username
Property userName = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME);
userName.setDisplayName(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME));
- userName.setRequired(true);
+ userName.setRequired(false);
userName.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME_HINT));
//Broker Password
Property password = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD);
password.setDisplayName(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD));
- password.setRequired(true);
+ password.setRequired(false);
password.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD_HINT));
//Broker Connection Scopes
Property scopes = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_SCOPES);
scopes.setDisplayName(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_SCOPES));
- scopes.setRequired(true);
+ scopes.setRequired(false);
+ scopes.setDefaultValue("default");
scopes.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_SCOPES_HINT));
// set clientId
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/internal/MQTTEventAdapterServiceComponent.java b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/internal/MQTTEventAdapterServiceComponent.java
index 80784a4ce..d7ff9d9ed 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/internal/MQTTEventAdapterServiceComponent.java
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/internal/MQTTEventAdapterServiceComponent.java
@@ -22,10 +22,15 @@ import org.apache.commons.logging.LogFactory;
import org.osgi.service.component.ComponentContext;
import org.wso2.carbon.device.mgt.output.adapter.mqtt.MQTTEventAdapterFactory;
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterFactory;
-
+import org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService;
/**
* @scr.component component.name="output.Mqtt.AdapterService.component" immediate="true"
+ * @scr.reference name="jwt.client.service" interface="org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService"
+ * cardinality="1..1"
+ * policy="dynamic"
+ * bind="setJWTClientManagerService"
+ * unbind="unsetJWTClientManagerService"
*/
public class MQTTEventAdapterServiceComponent {
@@ -48,4 +53,12 @@ public class MQTTEventAdapterServiceComponent {
}
}
+ protected void setJWTClientManagerService(JWTClientManagerService jwtClientManagerService) {
+ OutputAdapterServiceDataHolder.setJwtClientManagerService(jwtClientManagerService);
+ }
+
+ protected void unsetJWTClientManagerService(JWTClientManagerService jwtClientManagerService) {
+ OutputAdapterServiceDataHolder.setJwtClientManagerService(null);
+ }
+
}
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/internal/OutputAdapterServiceDataHolder.java b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/internal/OutputAdapterServiceDataHolder.java
new file mode 100644
index 000000000..9cda29113
--- /dev/null
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/internal/OutputAdapterServiceDataHolder.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2016, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+ *
+ * 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.
+ */
+package org.wso2.carbon.device.mgt.output.adapter.mqtt.internal;
+
+import org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService;
+
+/**
+ * common place to hold some OSGI service references.
+ */
+public final class OutputAdapterServiceDataHolder {
+
+ private static JWTClientManagerService jwtClientManagerService;
+
+ public static JWTClientManagerService getJwtClientManagerService() {
+ return jwtClientManagerService;
+ }
+
+ public static void setJwtClientManagerService(
+ JWTClientManagerService jwtClientManagerService) {
+ OutputAdapterServiceDataHolder.jwtClientManagerService = jwtClientManagerService;
+ }
+}
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/MQTTAdapterPublisher.java b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/MQTTAdapterPublisher.java
index 79188e840..38f078ff7 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/MQTTAdapterPublisher.java
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/MQTTAdapterPublisher.java
@@ -21,14 +21,11 @@ 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.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.BasicHeader;
-import org.apache.http.message.BasicNameValuePair;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
@@ -38,9 +35,14 @@ import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.wso2.carbon.context.PrivilegedCarbonContext;
+import org.wso2.carbon.device.mgt.output.adapter.mqtt.internal.OutputAdapterServiceDataHolder;
import org.wso2.carbon.event.output.adapter.core.exception.ConnectionUnavailableException;
import org.wso2.carbon.event.output.adapter.core.exception.OutputEventAdapterException;
import org.wso2.carbon.event.output.adapter.core.exception.OutputEventAdapterRuntimeException;
+import org.wso2.carbon.identity.jwt.client.extension.dto.AccessTokenInfo;
+import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientException;
+import org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService;
+import org.wso2.carbon.user.api.UserStoreException;
import java.io.IOException;
import java.net.MalformedURLException;
@@ -48,8 +50,6 @@ import java.net.URL;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
-import java.util.ArrayList;
-import java.util.List;
/**
* MQTT publisher related configuration initialization and publishing capabilties are implemented here.
@@ -60,8 +60,11 @@ public class MQTTAdapterPublisher {
private MqttClient mqttClient;
private MQTTBrokerConnectionConfiguration mqttBrokerConnectionConfiguration;
String clientId;
+ int tenantId;
- public MQTTAdapterPublisher(MQTTBrokerConnectionConfiguration mqttBrokerConnectionConfiguration, String clientId) {
+ public MQTTAdapterPublisher(MQTTBrokerConnectionConfiguration mqttBrokerConnectionConfiguration, String clientId
+ , int tenantId) {
+ this.tenantId = tenantId;
if (clientId == null || clientId.trim().isEmpty()) {
this.clientId = MqttClient.generateClientId();
}
@@ -146,7 +149,6 @@ public class MQTTAdapterPublisher {
String password = this.mqttBrokerConnectionConfiguration.getPassword();
String dcrUrlString = this.mqttBrokerConnectionConfiguration.getDcrUrl();
- int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
if (dcrUrlString != null && !dcrUrlString.isEmpty()) {
try {
URL dcrUrl = new URL(dcrUrlString);
@@ -157,8 +159,16 @@ public class MQTTAdapterPublisher {
registrationProfile.setGrantType(MQTTEventAdapterConstants.GRANT_TYPE);
registrationProfile.setOwner(username);
registrationProfile.setTokenScope(MQTTEventAdapterConstants.TOKEN_SCOPE);
- registrationProfile.setClientName(MQTTEventAdapterConstants.APPLICATION_NAME_PREFIX
- + mqttBrokerConnectionConfiguration.getAdapterName() + "_" + tenantId);
+ if (!mqttBrokerConnectionConfiguration.isGlobalCredentailSet()) {
+ registrationProfile.setClientName(MQTTEventAdapterConstants.APPLICATION_NAME_PREFIX
+ + mqttBrokerConnectionConfiguration.getAdapterName() +
+ "_" + tenantId);
+ registrationProfile.setIsSaasApp(false);
+ } else {
+ registrationProfile.setClientName(MQTTEventAdapterConstants.APPLICATION_NAME_PREFIX
+ + mqttBrokerConnectionConfiguration.getAdapterName());
+ registrationProfile.setIsSaasApp(true);
+ }
String jsonString = registrationProfile.toJSON();
StringEntity requestEntity = new StringEntity(jsonString, ContentType.APPLICATION_JSON);
postMethod.setEntity(requestEntity);
@@ -186,40 +196,34 @@ public class MQTTAdapterPublisher {
throw new OutputEventAdapterRuntimeException("Invalid dcrUrl : " + dcrUrlString);
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException | IOException e) {
throw new OutputEventAdapterRuntimeException("Failed to create an https connection.", e);
+ } catch (JWTClientException | UserStoreException e) {
+ log.error("Failed to create an oauth token with jwt grant type.", e);
}
}
throw new OutputEventAdapterRuntimeException("Invalid configuration for mqtt publisher");
}
private String getToken(String clientId, String clientSecret)
- throws IOException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException, ParseException {
- URL tokenEndpoint = new URL(mqttBrokerConnectionConfiguration.getTokenUrl());
- HttpClient httpClient = MQTTUtil.getHttpClient(tokenEndpoint.getProtocol());
- HttpPost postMethod = new HttpPost(tokenEndpoint.toString());
-
- List nameValuePairs = new ArrayList<>();
- nameValuePairs.add(new BasicNameValuePair(MQTTEventAdapterConstants.GRANT_TYPE_PARAM_NAME,
- MQTTEventAdapterConstants.PASSWORD_GRANT_TYPE));
- nameValuePairs.add(new BasicNameValuePair(MQTTEventAdapterConstants.PASSWORD_GRANT_TYPE_USERNAME,
- mqttBrokerConnectionConfiguration.getUsername()));
- nameValuePairs.add(new BasicNameValuePair(MQTTEventAdapterConstants.PASSWORD_GRANT_TYPE_PASSWORD,
- mqttBrokerConnectionConfiguration.getPassword()));
- String scopes = mqttBrokerConnectionConfiguration.getScopes();
- if (scopes != null && !scopes.isEmpty()) {
- nameValuePairs.add(new BasicNameValuePair(MQTTEventAdapterConstants.PASSWORD_GRANT_TYPE_SCOPES, scopes));
- }
+ throws UserStoreException, JWTClientException {
+ PrivilegedCarbonContext.startTenantFlow();
+ PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenantId, true);
+ try {
+ String scopes = mqttBrokerConnectionConfiguration.getScopes();
+ String username = mqttBrokerConnectionConfiguration.getUsername();
+ if (mqttBrokerConnectionConfiguration.isGlobalCredentailSet()) {
+ username = PrivilegedCarbonContext.getThreadLocalCarbonContext()
+ .getUserRealm().getRealmConfiguration().getAdminUserName() + "@" + PrivilegedCarbonContext
+ .getThreadLocalCarbonContext().getTenantDomain(true);
+ }
- postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));
- postMethod.addHeader("Authorization", "Basic " + getBase64Encode(clientId, clientSecret));
- postMethod.addHeader("Content-Type", "application/x-www-form-urlencoded");
- HttpResponse httpResponse = httpClient.execute(postMethod);
- String response = MQTTUtil.getResponseString(httpResponse);
- if (log.isDebugEnabled()) {
- log.debug(response);
+ JWTClientManagerService jwtClientManagerService =
+ OutputAdapterServiceDataHolder.getJwtClientManagerService();
+ AccessTokenInfo accessTokenInfo = jwtClientManagerService.getJWTClient().getAccessToken(
+ clientId, clientSecret, username, scopes);
+ return accessTokenInfo.getAccessToken();
+ } finally {
+ PrivilegedCarbonContext.endTenantFlow();
}
- JSONParser jsonParser = new JSONParser();
- JSONObject jsonObject = (JSONObject) jsonParser.parse(response);
- return (String) jsonObject.get(MQTTEventAdapterConstants.ACCESS_TOKEN_GRANT_TYPE_PARAM_NAME);
}
private String getBase64Encode(String key, String value) {
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/MQTTBrokerConnectionConfiguration.java b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/MQTTBrokerConnectionConfiguration.java
index b88d9d18b..2bbd394ab 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/MQTTBrokerConnectionConfiguration.java
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/MQTTBrokerConnectionConfiguration.java
@@ -33,6 +33,8 @@ public class MQTTBrokerConnectionConfiguration {
private String tokenUrl;
private boolean cleanSession = true;
private int keepAlive;
+ private boolean globalCredentailSet;
+
public String getTokenUrl() {
return tokenUrl;
}
@@ -69,11 +71,20 @@ public class MQTTBrokerConnectionConfiguration {
return adapterName;
}
+ public boolean isGlobalCredentailSet() {
+ return globalCredentailSet;
+ }
+
public MQTTBrokerConnectionConfiguration(OutputEventAdapterConfiguration eventAdapterConfiguration,
Map globalProperties) {
adapterName = eventAdapterConfiguration.getName();
this.username = eventAdapterConfiguration.getStaticProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME);
this.password = eventAdapterConfiguration.getStaticProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD);
+ if ((username == null || username.isEmpty()) && (password == null || password.isEmpty())) {
+ username = globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME);
+ password = globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD);
+ globalCredentailSet = true;
+ }
String url = eventAdapterConfiguration .getStaticProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_URL);
if (url == null || url.isEmpty()) {
url = globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_URL);
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/MQTTEventAdapterConstants.java b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/MQTTEventAdapterConstants.java
index 732af141c..1f2bbdd38 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/MQTTEventAdapterConstants.java
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/MQTTEventAdapterConstants.java
@@ -58,7 +58,7 @@ public final class MQTTEventAdapterConstants {
public static final String DEFAULT_CALLBACK = "";
public static final String DEFAULT_PASSWORD = "";
- public static final String GRANT_TYPE = "password";
+ public static final String GRANT_TYPE = "urn:ietf:params:oauth:grant-type:jwt-bearer";
public static final String TOKEN_SCOPE = "production";
public static final String APPLICATION_NAME_PREFIX = "OutputAdapter_";
public static final String CLIENT_ID = "clientId";
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/PropertyUtils.java b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/PropertyUtils.java
index deda48085..f77279934 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/PropertyUtils.java
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/PropertyUtils.java
@@ -21,10 +21,10 @@ package org.wso2.carbon.device.mgt.output.adapter.mqtt.util;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-class PropertyUtils {
+public class PropertyUtils {
//This method is only used if the mb features are within DAS.
- static String replaceMqttProperty(String urlWithPlaceholders) {
+ public static String replaceMqttProperty(String urlWithPlaceholders) {
String regex = "\\$\\{(.*?)\\}";
Pattern pattern = Pattern.compile(regex);
Matcher matchPattern = pattern.matcher(urlWithPlaceholders);
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/RegistrationProfile.java b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/RegistrationProfile.java
index 0a4d93125..ef9249bd6 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/RegistrationProfile.java
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.mqtt/src/main/java/org/wso2/carbon/device/mgt/output/adapter/mqtt/util/RegistrationProfile.java
@@ -12,6 +12,7 @@ public class RegistrationProfile {
private String owner;
private String grantType;
private String applicationType;
+ private boolean isSaasApp;
private static final String TAG = RegistrationProfile.class.getSimpleName();
@@ -63,11 +64,19 @@ public class RegistrationProfile {
this.applicationType = applicationType;
}
- public String toJSON() {
+ public boolean isSaasApp() {
+ return isSaasApp;
+ }
+
+ public void setIsSaasApp(boolean isSaasApp) {
+ this.isSaasApp = isSaasApp;
+ }
+
+ public String toJSON() {
String jsonString =
"{\"callbackUrl\": \"" + callbackUrl + "\",\"clientName\": \"" + clientName + "\", \"tokenScope\": " +
"\"" + tokenScope + "\", \"owner\": \"" + owner + "\"," + "\"grantType\": \"" + grantType +
- "\", \"saasApp\" :false }\n";
+ "\", \"saasApp\" : " + isSaasApp + " }\n";
return jsonString;
}
}
\ No newline at end of file
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket.endpoint/pom.xml b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket.endpoint/pom.xml
index a4246e7d4..d46e3f2b6 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket.endpoint/pom.xml
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket.endpoint/pom.xml
@@ -22,7 +22,7 @@
org.wso2.carbon.devicemgt-pluginscdmf-transport-adapters
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../../pom.xml
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/pom.xml b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/pom.xml
index b86ab8f08..1bfefbceb 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/pom.xml
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/pom.xml
@@ -21,7 +21,7 @@
org.wso2.carbon.devicemgt-pluginscdmf-transport-adapters
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../../pom.xml
@@ -95,6 +95,10 @@
javax.ws.rsjsr311-api
+
+ io.github.openfeign
+ feign-slf4j
+
@@ -169,7 +173,9 @@
feign.auth,
feign.codec,
feign.gson,
- javax.cache
+ javax.cache,
+ javax.net.ssl,
+ feign.slf4j
*
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/src/main/java/org/wso2/carbon/device/mgt/output/adapter/websocket/authorization/DeviceAuthorizer.java b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/src/main/java/org/wso2/carbon/device/mgt/output/adapter/websocket/authorization/DeviceAuthorizer.java
index 0edea4d1e..c4c40856e 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/src/main/java/org/wso2/carbon/device/mgt/output/adapter/websocket/authorization/DeviceAuthorizer.java
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/src/main/java/org/wso2/carbon/device/mgt/output/adapter/websocket/authorization/DeviceAuthorizer.java
@@ -17,11 +17,16 @@
*/
package org.wso2.carbon.device.mgt.output.adapter.websocket.authorization;
+import feign.Client;
import feign.Feign;
import feign.FeignException;
+import feign.Logger;
+import feign.Request;
+import feign.Response;
import feign.gson.GsonDecoder;
import feign.gson.GsonEncoder;
import feign.jaxrs.JAXRSContract;
+import feign.slf4j.Slf4jLogger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.output.adapter.websocket.authentication.AuthenticationInfo;
@@ -35,7 +40,16 @@ import org.wso2.carbon.device.mgt.output.adapter.websocket.util.PropertyUtils;
import org.wso2.carbon.device.mgt.output.adapter.websocket.util.WebSocketSessionRequest;
import org.wso2.carbon.event.output.adapter.core.exception.OutputEventAdapterException;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
import javax.websocket.Session;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -52,7 +66,7 @@ public class DeviceAuthorizer implements Authorizer {
private static final String STAT_PERMISSION = "statsPermission";
private static final String DEVICE_ID = "deviceId";
private static final String DEVICE_TYPE = "deviceType";
- private static Log logger = LogFactory.getLog(DeviceAuthorizer.class);
+ private static Log log = LogFactory.getLog(DeviceAuthorizer.class);
private static List statPermissions;
public DeviceAuthorizer() {
@@ -67,13 +81,13 @@ public class DeviceAuthorizer implements Authorizer {
}
}
try {
- deviceAccessAuthorizationAdminService = Feign.builder()
- .requestInterceptor(new OAuthRequestInterceptor(globalProperties))
+ deviceAccessAuthorizationAdminService = Feign.builder().client(getSSLClient()).logger(new Slf4jLogger())
+ .logLevel(Logger.Level.FULL).requestInterceptor(new OAuthRequestInterceptor(globalProperties))
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
.target(DeviceAccessAuthorizationAdminService.class, getDeviceMgtServerUrl(globalProperties)
+ CDMF_SERVER_BASE_CONTEXT);
} catch (OutputEventAdapterException e) {
- logger.error("Invalid value for deviceMgtServerUrl in globalProperties.");
+ log.error("Invalid value for deviceMgtServerUrl in globalProperties.");
}
}
@@ -109,7 +123,7 @@ public class DeviceAuthorizer implements Authorizer {
}
}
} catch (FeignException e) {
- logger.error(e.getMessage(), e);
+ log.error(e.getMessage(), e);
}
}
return false;
@@ -118,7 +132,7 @@ public class DeviceAuthorizer implements Authorizer {
private String getDeviceMgtServerUrl(Map properties) throws OutputEventAdapterException {
String deviceMgtServerUrl = PropertyUtils.replaceProperty(properties.get(DEVICE_MGT_SERVER_URL));
if (deviceMgtServerUrl == null || deviceMgtServerUrl.isEmpty()) {
- logger.error("deviceMgtServerUrl can't be empty ");
+ log.error("deviceMgtServerUrl can't be empty ");
}
return deviceMgtServerUrl;
}
@@ -130,4 +144,36 @@ public class DeviceAuthorizer implements Authorizer {
}
return null;
}
+
+ private static Client getSSLClient() {
+ return new Client.Default(getTrustedSSLSocketFactory(), new HostnameVerifier() {
+ @Override
+ public boolean verify(String s, SSLSession sslSession) {
+ return true;
+ }
+ });
+ }
+
+ private static SSLSocketFactory getTrustedSSLSocketFactory() {
+ try {
+ TrustManager[] trustAllCerts = new TrustManager[]{
+ new X509TrustManager() {
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+ public void checkClientTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ public void checkServerTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ }
+ };
+ SSLContext sc = SSLContext.getInstance("SSL");
+ sc.init(null, trustAllCerts, new java.security.SecureRandom());
+ return sc.getSocketFactory();
+ } catch (KeyManagementException | NoSuchAlgorithmException e) {
+ return null;
+ }
+ }
}
\ No newline at end of file
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/src/main/java/org/wso2/carbon/device/mgt/output/adapter/websocket/authorization/client/OAuthRequestInterceptor.java b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/src/main/java/org/wso2/carbon/device/mgt/output/adapter/websocket/authorization/client/OAuthRequestInterceptor.java
index ffae0b797..e6f38d281 100755
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/src/main/java/org/wso2/carbon/device/mgt/output/adapter/websocket/authorization/client/OAuthRequestInterceptor.java
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/src/main/java/org/wso2/carbon/device/mgt/output/adapter/websocket/authorization/client/OAuthRequestInterceptor.java
@@ -14,13 +14,18 @@
package org.wso2.carbon.device.mgt.output.adapter.websocket.authorization.client;
+import feign.Client;
import feign.Feign;
+import feign.Logger;
+import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
+import feign.Response;
import feign.auth.BasicAuthRequestInterceptor;
import feign.gson.GsonDecoder;
import feign.gson.GsonEncoder;
import feign.jaxrs.JAXRSContract;
+import feign.slf4j.Slf4jLogger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.device.mgt.output.adapter.websocket.authorization.client.dto.AccessTokenInfo;
@@ -31,6 +36,15 @@ import org.wso2.carbon.device.mgt.output.adapter.websocket.authorization.client.
import org.wso2.carbon.device.mgt.output.adapter.websocket.util.PropertyUtils;
import org.wso2.carbon.event.output.adapter.core.exception.OutputEventAdapterException;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
import java.util.Map;
/**
@@ -49,7 +63,7 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
private ApiApplicationRegistrationService apiApplicationRegistrationService;
private TokenIssuerService tokenIssuerService;
- private static Log logger = LogFactory.getLog(OAuthRequestInterceptor.class);
+ private static Log log = LogFactory.getLog(OAuthRequestInterceptor.class);
private static final String CONNECTION_USERNAME = "username";
private static final String CONNECTION_PASSWORD = "password";
@@ -73,17 +87,17 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
this.globalProperties = globalProperties;
try {
deviceMgtServerUrl = getDeviceMgtServerUrl(globalProperties);
- refreshTimeOffset = getRefreshTimeOffset(globalProperties);
+ refreshTimeOffset = getRefreshTimeOffset(globalProperties) * 1000;
username = getUsername(globalProperties);
password = getPassword(globalProperties);
tokenEndpoint = getTokenEndpoint(globalProperties);
- apiApplicationRegistrationService = Feign.builder().requestInterceptor(
- new BasicAuthRequestInterceptor(username, password))
+ apiApplicationRegistrationService = Feign.builder().client(getSSLClient()).logger(new Slf4jLogger())
+ .logLevel(Logger.Level.FULL).requestInterceptor(new BasicAuthRequestInterceptor(username, password))
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
.target(ApiApplicationRegistrationService.class,
deviceMgtServerUrl + API_APPLICATION_REGISTRATION_CONTEXT);
} catch (OutputEventAdapterException e) {
- logger.error("Invalid url: deviceMgtServerUrl" + deviceMgtServerUrl + " or tokenEndpoint:" + tokenEndpoint,
+ log.error("Invalid url: deviceMgtServerUrl" + deviceMgtServerUrl + " or tokenEndpoint:" + tokenEndpoint,
e);
}
}
@@ -100,12 +114,12 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
ApiApplicationKey apiApplicationKey = apiApplicationRegistrationService.register(apiRegistrationProfile);
String consumerKey = apiApplicationKey.getConsumerKey();
String consumerSecret = apiApplicationKey.getConsumerSecret();
- tokenIssuerService = Feign.builder().requestInterceptor(
- new BasicAuthRequestInterceptor(consumerKey, consumerSecret))
+ tokenIssuerService = Feign.builder().client(getSSLClient()).logger(new Slf4jLogger()).logLevel(Logger.Level.FULL)
+ .requestInterceptor(new BasicAuthRequestInterceptor(consumerKey, consumerSecret))
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
.target(TokenIssuerService.class, tokenEndpoint);
tokenInfo = tokenIssuerService.getToken(PASSWORD_GRANT_TYPE, username, password, REQUIRED_SCOPE);
- tokenInfo.setExpires_in(System.currentTimeMillis() + tokenInfo.getExpires_in());
+ tokenInfo.setExpires_in(System.currentTimeMillis() + (tokenInfo.getExpires_in() * 1000));
}
synchronized(this) {
if (System.currentTimeMillis() + refreshTimeOffset > tokenInfo.getExpires_in()) {
@@ -120,7 +134,7 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
private String getUsername(Map globalProperties) {
String username = globalProperties.get(CONNECTION_USERNAME);
if (username == null || username.isEmpty()) {
- logger.error("username can't be empty ");
+ log.error("username can't be empty ");
}
return username;
}
@@ -128,7 +142,7 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
private String getPassword(Map globalProperties) {
String password = globalProperties.get(CONNECTION_PASSWORD);;
if (password == null || password.isEmpty()) {
- logger.error("password can't be empty ");
+ log.error("password can't be empty ");
}
return password;
}
@@ -136,7 +150,7 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
private String getDeviceMgtServerUrl(Map globalProperties) throws OutputEventAdapterException {
String deviceMgtServerUrl = globalProperties.get(DEVICE_MGT_SERVER_URL);
if (deviceMgtServerUrl == null || deviceMgtServerUrl.isEmpty()) {
- logger.error("deviceMgtServerUrl can't be empty ");
+ log.error("deviceMgtServerUrl can't be empty ");
}
return PropertyUtils.replaceProperty(deviceMgtServerUrl);
}
@@ -144,7 +158,7 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
private String getTokenEndpoint(Map globalProperties) throws OutputEventAdapterException {
String tokenEndpoint = globalProperties.get(TOKEN_ENDPOINT_CONTEXT);
if ( tokenEndpoint.isEmpty()) {
- logger.error("tokenEndpoint can't be empty ");
+ log.error("tokenEndpoint can't be empty ");
}
return PropertyUtils.replaceProperty(tokenEndpoint);
}
@@ -154,9 +168,41 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
try {
refreshTimeOffset = Long.parseLong(globalProperties.get(TOKEN_REFRESH_TIME_OFFSET));
} catch (NumberFormatException e) {
- logger.error("refreshTimeOffset should be a number", e);
+ log.error("refreshTimeOffset should be a number", e);
}
return refreshTimeOffset;
}
+ private static Client getSSLClient() {
+ return new Client.Default(getTrustedSSLSocketFactory(), new HostnameVerifier() {
+ @Override
+ public boolean verify(String s, SSLSession sslSession) {
+ return true;
+ }
+ });
+ }
+
+ private static SSLSocketFactory getTrustedSSLSocketFactory() {
+ try {
+ TrustManager[] trustAllCerts = new TrustManager[]{
+ new X509TrustManager() {
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+ public void checkClientTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ public void checkServerTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ }
+ };
+ SSLContext sc = SSLContext.getInstance("SSL");
+ sc.init(null, trustAllCerts, new java.security.SecureRandom());
+ return sc.getSocketFactory();
+ } catch (KeyManagementException | NoSuchAlgorithmException e) {
+ return null;
+ }
+ }
+
}
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/src/main/java/org/wso2/carbon/device/mgt/output/adapter/websocket/constants/WebsocketConstants.java b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/src/main/java/org/wso2/carbon/device/mgt/output/adapter/websocket/constants/WebsocketConstants.java
index 6391fa07d..c5c3c01f2 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/src/main/java/org/wso2/carbon/device/mgt/output/adapter/websocket/constants/WebsocketConstants.java
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.websocket/src/main/java/org/wso2/carbon/device/mgt/output/adapter/websocket/constants/WebsocketConstants.java
@@ -29,7 +29,7 @@ public class WebsocketConstants {
public static final String SCOPE_IDENTIFIER = "scopes";
public static final String MAXIMUM_TOTAL_HTTP_CONNECTION = "maximumTotalHttpConnection";
public static final String MAXIMUM_HTTP_CONNECTION_PER_HOST = "maximumHttpConnectionPerHost";
- public static final String TOKEN_VALIDATION_ENDPOINT_URL = "keymanagerUrl";
+ public static final String TOKEN_VALIDATION_ENDPOINT_URL = "tokenValidationUrl";
public static final String TOKEN_VALIDATION_CONTEX = "/services/OAuth2TokenValidationService";
public static final String USERNAME = "username";
public static final String PASSWORD = "password";
diff --git a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.xmpp/pom.xml b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.xmpp/pom.xml
index 3029e8abd..a83083cb3 100644
--- a/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.xmpp/pom.xml
+++ b/components/extensions/cdmf-transport-adapters/output/org.wso2.carbon.device.mgt.output.adapter.xmpp/pom.xml
@@ -20,7 +20,7 @@
org.wso2.carbon.devicemgt-pluginscdmf-transport-adapters
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../../pom.xml
diff --git a/components/extensions/cdmf-transport-adapters/pom.xml b/components/extensions/cdmf-transport-adapters/pom.xml
index bf715c897..8a9b56627 100644
--- a/components/extensions/cdmf-transport-adapters/pom.xml
+++ b/components/extensions/cdmf-transport-adapters/pom.xml
@@ -22,7 +22,7 @@
org.wso2.carbon.devicemgt-pluginsextensions
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/extensions/mb-extensions/org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization/pom.xml b/components/extensions/mb-extensions/org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization/pom.xml
index 7885a389a..947d4f022 100644
--- a/components/extensions/mb-extensions/org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization/pom.xml
+++ b/components/extensions/mb-extensions/org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization/pom.xml
@@ -22,7 +22,7 @@
org.wso2.carbon.devicemgt-pluginsmb-extensions
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
@@ -78,6 +78,10 @@
org.wso2.carbonjavax.cache.wso2
+
+ io.github.openfeign
+ feign-slf4j
+
@@ -123,7 +127,9 @@
javax.xml.namespace,
javax.xml.stream,
org.wso2.carbon.base,
- org.wso2.carbon.utils
+ org.wso2.carbon.utils,
+ javax.net.ssl,
+ feign.slf4j
jsr311-api,
diff --git a/components/extensions/mb-extensions/org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization/src/main/java/org/wso2/carbon/andes/extensions/device/mgt/mqtt/authorization/DeviceAccessBasedMQTTAuthorizer.java b/components/extensions/mb-extensions/org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization/src/main/java/org/wso2/carbon/andes/extensions/device/mgt/mqtt/authorization/DeviceAccessBasedMQTTAuthorizer.java
index 0b9806962..6fd2c3464 100644
--- a/components/extensions/mb-extensions/org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization/src/main/java/org/wso2/carbon/andes/extensions/device/mgt/mqtt/authorization/DeviceAccessBasedMQTTAuthorizer.java
+++ b/components/extensions/mb-extensions/org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization/src/main/java/org/wso2/carbon/andes/extensions/device/mgt/mqtt/authorization/DeviceAccessBasedMQTTAuthorizer.java
@@ -18,11 +18,16 @@
package org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization;
+import feign.Client;
import feign.Feign;
import feign.FeignException;
+import feign.Logger;
+import feign.Request;
+import feign.Response;
import feign.gson.GsonDecoder;
import feign.gson.GsonEncoder;
import feign.jaxrs.JAXRSContract;
+import feign.slf4j.Slf4jLogger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dna.mqtt.moquette.server.IAuthorizer;
@@ -43,8 +48,16 @@ import org.wso2.carbon.user.api.UserStoreException;
import javax.cache.Cache;
import javax.cache.CacheConfiguration;
-import javax.cache.CacheManager;
import javax.cache.Caching;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
@@ -58,7 +71,7 @@ import java.util.concurrent.TimeUnit;
public class DeviceAccessBasedMQTTAuthorizer implements IAuthorizer {
private static final String UI_EXECUTE = "ui.execute";
- private static Log logger = LogFactory.getLog(DeviceAccessBasedMQTTAuthorizer.class);
+ private static Log log = LogFactory.getLog(DeviceAccessBasedMQTTAuthorizer.class);
AuthorizationConfigurationManager MQTTAuthorizationConfiguration;
private static final String CDMF_SERVER_BASE_CONTEXT = "/api/device-mgt/v1.0";
private static final String CACHE_MANAGER_NAME = "mqttAuthorizationCacheManager";
@@ -68,8 +81,8 @@ public class DeviceAccessBasedMQTTAuthorizer implements IAuthorizer {
public DeviceAccessBasedMQTTAuthorizer() {
this.MQTTAuthorizationConfiguration = AuthorizationConfigurationManager.getInstance();
- deviceAccessAuthorizationAdminService = Feign.builder()
- .requestInterceptor(new OAuthRequestInterceptor())
+ deviceAccessAuthorizationAdminService = Feign.builder().client(getSSLClient()).logger(new Slf4jLogger())
+ .logLevel(Logger.Level.FULL).requestInterceptor(new OAuthRequestInterceptor())
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
.target(DeviceAccessAuthorizationAdminService.class,
MQTTAuthorizationConfiguration.getDeviceMgtServerUrl() + CDMF_SERVER_BASE_CONTEXT);
@@ -108,7 +121,7 @@ public class DeviceAccessBasedMQTTAuthorizer implements IAuthorizer {
}
return false;
} catch (FeignException e) {
- logger.error(e.getMessage(), e);
+ log.error(e.getMessage(), e);
return false;
}
}
@@ -151,7 +164,7 @@ public class DeviceAccessBasedMQTTAuthorizer implements IAuthorizer {
}
}
} catch (FeignException e) {
- logger.error(e.getMessage(), e);
+ log.error(e.getMessage(), e);
}
} finally {
PrivilegedCarbonContext.endTenantFlow();
@@ -195,7 +208,7 @@ public class DeviceAccessBasedMQTTAuthorizer implements IAuthorizer {
userRealm.getAuthorizationManager().isUserAuthorized(username, permission, action);
} catch (UserStoreException e) {
String errorMsg = String.format("Unable to authorize the user : %s", username);
- logger.error(errorMsg, e);
+ log.error(errorMsg, e);
return false;
} finally {
PrivilegedCarbonContext.endTenantFlow();
@@ -224,4 +237,36 @@ public class DeviceAccessBasedMQTTAuthorizer implements IAuthorizer {
}
}
+ private static Client getSSLClient() {
+ return new Client.Default(getTrustedSSLSocketFactory(), new HostnameVerifier() {
+ @Override
+ public boolean verify(String s, SSLSession sslSession) {
+ return true;
+ }
+ });
+ }
+
+ private static SSLSocketFactory getTrustedSSLSocketFactory() {
+ try {
+ TrustManager[] trustAllCerts = new TrustManager[]{
+ new X509TrustManager() {
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+ public void checkClientTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ public void checkServerTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ }
+ };
+ SSLContext sc = SSLContext.getInstance("SSL");
+ sc.init(null, trustAllCerts, new java.security.SecureRandom());
+ return sc.getSocketFactory();
+ } catch (KeyManagementException | NoSuchAlgorithmException e) {
+ return null;
+ }
+ }
+
}
\ No newline at end of file
diff --git a/components/extensions/mb-extensions/org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization/src/main/java/org/wso2/carbon/andes/extensions/device/mgt/mqtt/authorization/client/OAuthRequestInterceptor.java b/components/extensions/mb-extensions/org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization/src/main/java/org/wso2/carbon/andes/extensions/device/mgt/mqtt/authorization/client/OAuthRequestInterceptor.java
index f6cbd1c30..5f860985d 100755
--- a/components/extensions/mb-extensions/org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization/src/main/java/org/wso2/carbon/andes/extensions/device/mgt/mqtt/authorization/client/OAuthRequestInterceptor.java
+++ b/components/extensions/mb-extensions/org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization/src/main/java/org/wso2/carbon/andes/extensions/device/mgt/mqtt/authorization/client/OAuthRequestInterceptor.java
@@ -14,15 +14,22 @@
package org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization.client;
+import feign.Client;
import feign.Feign;
+import feign.Logger;
+import feign.Request;
import feign.RequestInterceptor;
import feign.RequestTemplate;
+import feign.Response;
import feign.auth.BasicAuthRequestInterceptor;
import feign.codec.EncodeException;
import feign.codec.Encoder;
import feign.gson.GsonDecoder;
import feign.gson.GsonEncoder;
import feign.jaxrs.JAXRSContract;
+import feign.slf4j.Slf4jLogger;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization.client.dto.AccessTokenInfo;
import org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization.client.dto.ApiApplicationKey;
import org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization.client.dto.ApiApplicationRegistrationService;
@@ -30,6 +37,16 @@ import org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization.client.dto
import org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization.client.dto.TokenIssuerService;
import org.wso2.carbon.andes.extensions.device.mgt.mqtt.authorization.config.AuthorizationConfigurationManager;
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSession;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+
/**
* This is a request interceptor to add oauth token header.
*/
@@ -45,16 +62,17 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
private static final String REQUIRED_SCOPE = "perm:authorization:verify";
private ApiApplicationRegistrationService apiApplicationRegistrationService;
private TokenIssuerService tokenIssuerService;
+ private static Log log = LogFactory.getLog(OAuthRequestInterceptor.class);
/**
* Creates an interceptor that authenticates all requests.
*/
public OAuthRequestInterceptor() {
- refreshTimeOffset = AuthorizationConfigurationManager.getInstance().getTokenRefreshTimeOffset();
+ refreshTimeOffset = AuthorizationConfigurationManager.getInstance().getTokenRefreshTimeOffset() * 1000;
String username = AuthorizationConfigurationManager.getInstance().getUsername();
String password = AuthorizationConfigurationManager.getInstance().getPassword();
- apiApplicationRegistrationService = Feign.builder().requestInterceptor(
- new BasicAuthRequestInterceptor(username, password))
+ apiApplicationRegistrationService = Feign.builder().client(getSSLClient()).logger(new Slf4jLogger()).logLevel(
+ Logger.Level.FULL).requestInterceptor(new BasicAuthRequestInterceptor(username, password))
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
.target(ApiApplicationRegistrationService.class,
AuthorizationConfigurationManager.getInstance().getDeviceMgtServerUrl() +
@@ -75,13 +93,13 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
String consumerSecret = apiApplicationKey.getConsumerSecret();
String username = AuthorizationConfigurationManager.getInstance().getUsername();
String password = AuthorizationConfigurationManager.getInstance().getPassword();
- tokenIssuerService = Feign.builder().requestInterceptor(
- new BasicAuthRequestInterceptor(consumerKey, consumerSecret))
+ tokenIssuerService = Feign.builder().client(getSSLClient()).logger(new Slf4jLogger()).logLevel(Logger.Level.FULL)
+ .requestInterceptor(new BasicAuthRequestInterceptor(consumerKey, consumerSecret))
.contract(new JAXRSContract()).encoder(new GsonEncoder()).decoder(new GsonDecoder())
.target(TokenIssuerService.class,
AuthorizationConfigurationManager.getInstance().getTokenEndpoint());
tokenInfo = tokenIssuerService.getToken(PASSWORD_GRANT_TYPE, username, password, REQUIRED_SCOPE);
- tokenInfo.setExpires_in(System.currentTimeMillis() + tokenInfo.getExpires_in());
+ tokenInfo.setExpires_in(System.currentTimeMillis() + (tokenInfo.getExpires_in() * 1000));
}
synchronized (this) {
if (System.currentTimeMillis() + refreshTimeOffset > tokenInfo.getExpires_in()) {
@@ -93,4 +111,36 @@ public class OAuthRequestInterceptor implements RequestInterceptor {
template.header("Authorization", headerValue);
}
+ private static Client getSSLClient() {
+ return new Client.Default(getTrustedSSLSocketFactory(), new HostnameVerifier() {
+ @Override
+ public boolean verify(String s, SSLSession sslSession) {
+ return true;
+ }
+ });
+ }
+
+ private static SSLSocketFactory getTrustedSSLSocketFactory() {
+ try {
+ TrustManager[] trustAllCerts = new TrustManager[]{
+ new X509TrustManager() {
+ public java.security.cert.X509Certificate[] getAcceptedIssuers() {
+ return null;
+ }
+ public void checkClientTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ public void checkServerTrusted(
+ java.security.cert.X509Certificate[] certs, String authType) {
+ }
+ }
+ };
+ SSLContext sc = SSLContext.getInstance("SSL");
+ sc.init(null, trustAllCerts, new java.security.SecureRandom());
+ return sc.getSocketFactory();
+ } catch (KeyManagementException | NoSuchAlgorithmException e) {
+ return null;
+ }
+ }
+
}
diff --git a/components/extensions/mb-extensions/pom.xml b/components/extensions/mb-extensions/pom.xml
index e920fde00..72982c9dd 100644
--- a/components/extensions/mb-extensions/pom.xml
+++ b/components/extensions/mb-extensions/pom.xml
@@ -22,7 +22,7 @@
org.wso2.carbon.devicemgt-pluginsextensions
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/extensions/pom.xml b/components/extensions/pom.xml
index 7c1457b78..b06e94acb 100644
--- a/components/extensions/pom.xml
+++ b/components/extensions/pom.xml
@@ -22,7 +22,7 @@
org.wso2.carbon.devicemgt-pluginscarbon-device-mgt-plugins-parent
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../../pom.xml
diff --git a/components/extensions/siddhi-extensions/org.wso2.extension.siddhi.execution.json/pom.xml b/components/extensions/siddhi-extensions/org.wso2.extension.siddhi.execution.json/pom.xml
index c90a2dabb..1defbead7 100644
--- a/components/extensions/siddhi-extensions/org.wso2.extension.siddhi.execution.json/pom.xml
+++ b/components/extensions/siddhi-extensions/org.wso2.extension.siddhi.execution.json/pom.xml
@@ -20,7 +20,7 @@
org.wso2.carbon.devicemgt-pluginssiddhi-extensions
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/extensions/siddhi-extensions/pom.xml b/components/extensions/siddhi-extensions/pom.xml
index 25332b34f..fc308eb39 100644
--- a/components/extensions/siddhi-extensions/pom.xml
+++ b/components/extensions/siddhi-extensions/pom.xml
@@ -22,7 +22,7 @@
org.wso2.carbon.devicemgt-pluginsextensions
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.analytics/pom.xml b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.analytics/pom.xml
index 99cb9be3b..ef809db23 100644
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.analytics/pom.xml
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.analytics/pom.xml
@@ -21,7 +21,7 @@
org.wso2.carbon.devicemgt-pluginsandroid-plugin
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/pom.xml b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/pom.xml
index b21b40149..27acc9263 100644
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/pom.xml
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/pom.xml
@@ -21,7 +21,7 @@
android-pluginorg.wso2.carbon.devicemgt-plugins
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementAdminService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementAdminService.java
index 78bb83361..f3c3c72b1 100644
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementAdminService.java
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementAdminService.java
@@ -58,7 +58,7 @@ import java.util.List;
}
),
tags = {
- @Tag(name = "android", description = "")
+ @Tag(name = "android,device_management", description = "")
}
)
@Path("/admin/devices")
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementService.java
index 5c7df5f1f..bb172a619 100644
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementService.java
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceManagementService.java
@@ -56,7 +56,7 @@ import java.util.List;
}
),
tags = {
- @Tag(name = "android", description = "")
+ @Tag(name = "android,device_management", description = "")
}
)
@Api(value = "Android Device Management",
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceTypeConfigurationService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceTypeConfigurationService.java
index 63f9fa4b4..5e2440941 100644
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceTypeConfigurationService.java
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/DeviceTypeConfigurationService.java
@@ -55,7 +55,7 @@ import javax.ws.rs.core.Response;
}
),
tags = {
- @Tag(name = "android", description = "")
+ @Tag(name = "android,device_management", description = "")
}
)
@Api(value = "Android Configuration Management", description = "This API carries all the resource used to mange the Android platform configurations.")
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/EventReceiverService.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/EventReceiverService.java
index 86a6df265..93b914a5f 100644
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/EventReceiverService.java
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/EventReceiverService.java
@@ -53,7 +53,7 @@ import javax.ws.rs.core.Response;
}
),
tags = {
- @Tag(name = "android", description = "")
+ @Tag(name = "android,device_management", description = "")
}
)
@Api(value = "Event Receiver", description = "Event publishing/retrieving related APIs. To enable event publishing/retrieving you need to" +
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementServiceImpl.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementServiceImpl.java
index e59fac68a..9efe83656 100644
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementServiceImpl.java
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/services/impl/DeviceManagementServiceImpl.java
@@ -20,15 +20,14 @@ package org.wso2.carbon.mdm.services.android.services.impl;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.wso2.carbon.device.mgt.common.Device;
-import org.wso2.carbon.device.mgt.common.DeviceIdentifier;
-import org.wso2.carbon.device.mgt.common.DeviceManagementConstants;
-import org.wso2.carbon.device.mgt.common.DeviceManagementException;
+import org.wso2.carbon.device.mgt.common.*;
import org.wso2.carbon.device.mgt.common.app.mgt.Application;
import org.wso2.carbon.device.mgt.common.app.mgt.ApplicationManagementException;
import org.wso2.carbon.device.mgt.common.notification.mgt.NotificationManagementException;
import org.wso2.carbon.device.mgt.common.operation.mgt.Operation;
import org.wso2.carbon.device.mgt.common.operation.mgt.OperationManagementException;
+import org.wso2.carbon.device.mgt.core.operation.mgt.CommandOperation;
+import org.wso2.carbon.device.mgt.core.util.DeviceManagerUtil;
import org.wso2.carbon.mdm.services.android.bean.ErrorResponse;
import org.wso2.carbon.mdm.services.android.bean.wrapper.AndroidApplication;
import org.wso2.carbon.mdm.services.android.bean.wrapper.AndroidDevice;
@@ -219,7 +218,25 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
device.setProperties(androidDevice.getProperties());
boolean status = AndroidAPIUtils.getDeviceManagementService().enrollDevice(device);
+ if (status) {
+ List deviceIdentifiers = new ArrayList<>();
+ deviceIdentifiers.add(new DeviceIdentifier(androidDevice.getDeviceIdentifier(), device.getType()));
+
+ List taskOperaions = new ArrayList<>();
+ taskOperaions.add(AndroidConstants.OperationCodes.APPLICATION_LIST);
+ taskOperaions.add(AndroidConstants.OperationCodes.DEVICE_INFO);
+ taskOperaions.add(AndroidConstants.OperationCodes.DEVICE_LOCATION);
+ for (String str : taskOperaions) {
+ CommandOperation operation = new CommandOperation();
+ operation.setEnabled(true);
+ operation.setType(Operation.Type.COMMAND);
+ operation.setCode(str);
+ AndroidAPIUtils.getDeviceManagementService().
+ addOperation(DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID,
+ operation, deviceIdentifiers);
+ }
+ }
PolicyManagerService policyManagerService = AndroidAPIUtils.getPolicyManagerService();
policyManagerService.getEffectivePolicy(new DeviceIdentifier(androidDevice.getDeviceIdentifier(), device.getType()));
if (status) {
@@ -249,6 +266,20 @@ public class DeviceManagementServiceImpl implements DeviceManagementService {
log.error(msg, e);
throw new UnexpectedServerErrorException(
new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build());
+ } catch (OperationManagementException e) {
+ String msg = "Error occurred while enforcing default enrollment policy upon android " +
+ "', which carries the id '" +
+ androidDevice.getDeviceIdentifier() + "'";
+ log.error(msg, e);
+ throw new UnexpectedServerErrorException(
+ new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build());
+ } catch (InvalidDeviceException e) {
+ String msg = "Error occurred while enforcing default enrollment policy upon android " +
+ "', which carries the id '" +
+ androidDevice.getDeviceIdentifier() + "'";
+ log.error(msg, e);
+ throw new UnexpectedServerErrorException(
+ new ErrorResponse.ErrorResponseBuilder().setCode(500l).setMessage(msg).build());
}
}
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidAPIUtils.java b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidAPIUtils.java
index 65b7c60b9..e14b57dad 100644
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidAPIUtils.java
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/java/org/wso2/carbon/mdm/services/android/util/AndroidAPIUtils.java
@@ -106,7 +106,7 @@ public class AndroidAPIUtils {
// PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
// GCMService gcmService = (GCMService) ctx.getOSGiService(GCMService.class, null);
// if (gcmService == null) {
-// String msg = "GCM service has not initialized.";
+// String msg = "FCM service has not initialized.";
// log.error(msg);
// throw new IllegalStateException(msg);
// }
@@ -143,7 +143,7 @@ public class AndroidAPIUtils {
DeviceManagementConstants.MobileDeviceTypes.MOBILE_DEVICE_TYPE_ANDROID, operation, deviceIdentifiers);
// if (activity != null) {
// GCMService gcmService = getGCMService();
-// if (gcmService.isGCMEnabled()) {
+// if (gcmService.isFCMEnabled()) {
// List deviceIDList = deviceIDHolder.getValidDeviceIDList();
// List devices = new ArrayList(deviceIDList.size());
// for (DeviceIdentifier deviceIdentifier : deviceIDList) {
@@ -471,6 +471,8 @@ public class AndroidAPIUtils {
getProperty(prop.getValue(), "PASSCODE_ENABLED"));
deviceInfo.getDeviceDetailsMap().put("operator",
getProperty(prop.getValue(), "OPERATOR"));
+ deviceInfo.getDeviceDetailsMap().put("PhoneNumber",
+ getProperty(prop.getValue(), "PHONE_NUMBER"));
}
}
}
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/WEB-INF/web.xml b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/WEB-INF/web.xml
index b22bd2b5d..b62410431 100644
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/WEB-INF/web.xml
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.api/src/main/webapp/WEB-INF/web.xml
@@ -50,6 +50,10 @@
doAuthenticationtrue
+
+ isSharedWithAllTenants
+ true
+
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/pom.xml b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/pom.xml
index 027b1a800..b85ba7105 100644
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/pom.xml
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/pom.xml
@@ -23,13 +23,13 @@
android-pluginorg.wso2.carbon.devicemgt-plugins
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOT../pom.xml4.0.0org.wso2.carbon.device.mgt.mobile.android.ui
- 3.0.12-SNAPSHOT
+ 3.0.15-SNAPSHOTWSO2 Carbon - Mobile Android UIpom
@@ -58,4 +58,4 @@
-
\ No newline at end of file
+
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/conf/config.json b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/conf/config.json
index 9cd1e64b4..c52e88276 100755
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/conf/config.json
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/conf/config.json
@@ -14,7 +14,8 @@
"apiManagerClientAppRegistrationServiceURL": "%https.ip%/api-application-registration/register/tenants",
"grantType": "password refresh_token urn:ietf:params:oauth:grant-type:saml2-bearer",
"tokenScope": "admin",
- "callbackUrl": "%https.ip%/api/device-mgt/v1.0"
+ "callbackUrl": "%https.ip%/api/device-mgt/v1.0",
+ "samlGrantTypeName": "urn:ietf:params:oauth:grant-type:saml2-bearer"
},
"tokenServiceURL": "%https.ip%/oauth2/token"
},
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/modules/business-controllers/operation.js b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/modules/business-controllers/operation.js
index e96ffcdec..e97e0afb9 100755
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/modules/business-controllers/operation.js
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/modules/business-controllers/operation.js
@@ -60,7 +60,7 @@ var operationModule = function () {
feature["description"] = features[i].description;
feature["deviceType"] = deviceType;
feature["params"] = [];
- var metaData = features[i].metadataEntries;
+ var metaData = features[i].metadataEntries;
if (metaData) {
for (var j = 0; j < metaData.length; j++) {
feature["params"].push(metaData[j].value);
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/modules/oauth/token-handler-utils.js b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/modules/oauth/token-handler-utils.js
index 2ed241d0d..614e79bb8 100755
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/modules/oauth/token-handler-utils.js
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/modules/oauth/token-handler-utils.js
@@ -214,8 +214,8 @@ var utils = function () {
// calling oauth provider token service endpoint
var requestURL = deviceMgtProps["oauthProvider"]["tokenServiceURL"];
- var requestPayload = "grant_type=urn:ietf:params:oauth:grant-type:saml2-bearer&" +
- "assertion=" + encodeURIComponent(encodedAssertion) + "&scope=" + scopes;
+ var requestPayload = "grant_type=" + + deviceMgtProps["oauthProvider"]["appRegistration"]["samlGrantTypeName"]
+ + "&" + "assertion=" + encodeURIComponent(encodedAssertion) + "&scope=" + scopes;
var xhr = new XMLHttpRequest();
xhr.open("POST", requestURL, false);
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/pages/mdm.page.enrollments.android.download-agent/public/asset/android-agent.apk b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/pages/mdm.page.enrollments.android.download-agent/public/asset/android-agent.apk
index 6f5ead8bc..de63c0634 100644
Binary files a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/pages/mdm.page.enrollments.android.download-agent/public/asset/android-agent.apk and b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/android-web-agent/app/pages/mdm.page.enrollments.android.download-agent/public/asset/android-agent.apk differ
diff --git a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.device-view/device-view.hbs b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.device-view/device-view.hbs
index 4b2dfe84a..0577d7482 100644
--- a/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.device-view/device-view.hbs
+++ b/components/mobile-plugins/android-plugin/org.wso2.carbon.device.mgt.mobile.android.ui/src/main/resources/jaggeryapps/devicemgt/app/units/cdmf.unit.device.type.android.device-view/device-view.hbs
@@ -364,16 +364,18 @@