mirror of
https://repository.entgra.net/community/device-mgt-plugins.git
synced 2025-09-16 23:42:15 +00:00
Merge branch 'release-3.0.x' of https://github.com/wso2/carbon-device-mgt-plugins into windows10
This commit is contained in:
commit
b44fccaade
@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>iot-analytics</artifactId>
|
<artifactId>iot-analytics</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>iot-analytics</artifactId>
|
<artifactId>iot-analytics</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>iot-analytics</artifactId>
|
<artifactId>iot-analytics</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>analytics</artifactId>
|
<artifactId>analytics</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>carbon-device-mgt-plugins-parent</artifactId>
|
<artifactId>carbon-device-mgt-plugins-parent</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>androidsense-plugin</artifactId>
|
<artifactId>androidsense-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -21,10 +21,8 @@
|
|||||||
<from eventAdapterType="oauth-mqtt">
|
<from eventAdapterType="oauth-mqtt">
|
||||||
<property name="topic">carbon.super/android_sense/+/data</property>
|
<property name="topic">carbon.super/android_sense/+/data</property>
|
||||||
<property name="username">admin</property>
|
<property name="username">admin</property>
|
||||||
|
<property name="password">admin</property>
|
||||||
<property name="contentValidator">org.wso2.carbon.device.mgt.input.adapter.mqtt.util.MQTTContentValidator</property>
|
<property name="contentValidator">org.wso2.carbon.device.mgt.input.adapter.mqtt.util.MQTTContentValidator</property>
|
||||||
<property name="contentTransformer">default</property>
|
|
||||||
<property name="dcrUrl">https://${iot.core.host}:${iot.core.https.port}/dynamic-client-web/register</property>
|
|
||||||
<property name="url">tcp://${mqtt.broker.host}:${mqtt.broker.port}</property>
|
|
||||||
<property name="cleanSession">true</property>
|
<property name="cleanSession">true</property>
|
||||||
</from>
|
</from>
|
||||||
<mapping customMapping="disable" type="json"/>
|
<mapping customMapping="disable" type="json"/>
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>androidsense-plugin</artifactId>
|
<artifactId>androidsense-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
@ -156,6 +156,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.wso2.carbon.devicemgt</groupId>
|
<groupId>org.wso2.carbon.devicemgt</groupId>
|
||||||
<artifactId>org.wso2.carbon.apimgt.annotations</artifactId>
|
<artifactId>org.wso2.carbon.apimgt.annotations</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>androidsense-plugin</artifactId>
|
<artifactId>androidsense-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>device-types</artifactId>
|
<artifactId>device-types</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>arduino-plugin</artifactId>
|
<artifactId>arduino-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -18,14 +18,7 @@
|
|||||||
-->
|
-->
|
||||||
<eventReceiver name="arduino_receiver" statistics="disable" trace="disable" xmlns="http://wso2.org/carbon/eventreceiver">
|
<eventReceiver name="arduino_receiver" statistics="disable" trace="disable" xmlns="http://wso2.org/carbon/eventreceiver">
|
||||||
<from eventAdapterType="oauth-http">
|
<from eventAdapterType="oauth-http">
|
||||||
<property name="maximumHttpConnectionPerHost">2</property>
|
|
||||||
<property name="username">admin</property>
|
|
||||||
<property name="contentValidator">org.wso2.carbon.device.mgt.input.adapter.http.util.HTTPContentValidator</property>
|
<property name="contentValidator">org.wso2.carbon.device.mgt.input.adapter.http.util.HTTPContentValidator</property>
|
||||||
<property name="contentTransformer">default</property>
|
|
||||||
<property name="transports">all</property>
|
|
||||||
<property name="maximumTotalHttpConnection">100</property>
|
|
||||||
<property name="tokenValidationEndpointUrl">https://localhost:${dcr.endpoint.port}/services/OAuth2TokenValidationService</property>
|
|
||||||
<property name="password">admin</property>
|
|
||||||
</from>
|
</from>
|
||||||
<mapping customMapping="disable" type="json"/>
|
<mapping customMapping="disable" type="json"/>
|
||||||
<to streamName="org.wso2.iot.arduino" version="1.0.0"/>
|
<to streamName="org.wso2.iot.arduino" version="1.0.0"/>
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>arduino-plugin</artifactId>
|
<artifactId>arduino-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
@ -144,6 +144,7 @@
|
|||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.wso2.carbon.devicemgt</groupId>
|
<groupId>org.wso2.carbon.devicemgt</groupId>
|
||||||
<artifactId>org.wso2.carbon.apimgt.annotations</artifactId>
|
<artifactId>org.wso2.carbon.apimgt.annotations</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|||||||
@ -23,7 +23,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>arduino-plugin</artifactId>
|
<artifactId>arduino-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>device-types</artifactId>
|
<artifactId>device-types</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>carbon-device-mgt-plugins-parent</artifactId>
|
<artifactId>carbon-device-mgt-plugins-parent</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>raspberrypi-plugin</artifactId>
|
<artifactId>raspberrypi-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -20,10 +20,8 @@
|
|||||||
<from eventAdapterType="oauth-mqtt">
|
<from eventAdapterType="oauth-mqtt">
|
||||||
<property name="topic">carbon.super/raspberrypi/+/temperature</property>
|
<property name="topic">carbon.super/raspberrypi/+/temperature</property>
|
||||||
<property name="username">admin</property>
|
<property name="username">admin</property>
|
||||||
|
<property name="password">admin</property>
|
||||||
<property name="contentValidator">org.wso2.carbon.device.mgt.input.adapter.mqtt.util.MQTTContentValidator</property>
|
<property name="contentValidator">org.wso2.carbon.device.mgt.input.adapter.mqtt.util.MQTTContentValidator</property>
|
||||||
<property name="contentTransformer">default</property>
|
|
||||||
<property name="dcrUrl">https://${iot.core.host}:${iot.core.https.port}/dynamic-client-web/register</property>
|
|
||||||
<property name="url">tcp://${mqtt.broker.host}:${mqtt.broker.port}</property>
|
|
||||||
<property name="cleanSession">true</property>
|
<property name="cleanSession">true</property>
|
||||||
</from>
|
</from>
|
||||||
<mapping customMapping="disable" type="json"/>
|
<mapping customMapping="disable" type="json"/>
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>raspberrypi-plugin</artifactId>
|
<artifactId>raspberrypi-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -23,7 +23,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>raspberrypi-plugin</artifactId>
|
<artifactId>raspberrypi-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>device-types</artifactId>
|
<artifactId>device-types</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -23,7 +23,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -191,7 +191,10 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
int currentTemperature = agentManager.getTemperature();
|
int currentTemperature = agentManager.getTemperature();
|
||||||
String message = "PUBLISHER:" + AgentConstants.TEMPERATURE_CONTROL + ":" + currentTemperature;
|
String message = "{\"event\": {\"metaData\": {\"owner\": \"" + AgentManager
|
||||||
|
.getInstance().getAgentConfigs().getDeviceOwner() + "\",\"deviceId\": \"" + AgentManager
|
||||||
|
.getInstance().getAgentConfigs().getDeviceId() + "\",\"time\": " +
|
||||||
|
"0},\"payloadData\": { \"temperature\": " + currentTemperature + "} }}";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String payLoad = AgentUtilOperations.prepareSecurePayLoad(message);
|
String payLoad = AgentUtilOperations.prepareSecurePayLoad(message);
|
||||||
|
|||||||
@ -189,7 +189,10 @@ public class FireAlarmXMPPCommunicator extends XMPPTransportHandler {
|
|||||||
try {
|
try {
|
||||||
int currentTemperature = agentManager.getTemperature();
|
int currentTemperature = agentManager.getTemperature();
|
||||||
|
|
||||||
String message = AgentConstants.TEMPERATURE_CONTROL + ":" + currentTemperature;
|
String message = "{\"event\": {\"metaData\": {\"owner\": \"" + AgentManager
|
||||||
|
.getInstance().getAgentConfigs().getDeviceOwner() + "\",\"deviceId\": \"" + AgentManager
|
||||||
|
.getInstance().getAgentConfigs().getDeviceId() + "\",\"time\": " +
|
||||||
|
"0},\"payloadData\": { \"temperature\": " + currentTemperature + "} }}";
|
||||||
String payLoad = AgentUtilOperations.prepareSecurePayLoad(message);
|
String payLoad = AgentUtilOperations.prepareSecurePayLoad(message);
|
||||||
|
|
||||||
xmppMessage.setTo(xmppAdminJID);
|
xmppMessage.setTo(xmppAdminJID);
|
||||||
|
|||||||
@ -58,7 +58,7 @@ public class AgentConstants {
|
|||||||
public static final int DEFAULT_MQTT_RECONNECTION_INTERVAL = 2; // time in seconds
|
public static final int DEFAULT_MQTT_RECONNECTION_INTERVAL = 2; // time in seconds
|
||||||
public static final int DEFAULT_MQTT_QUALITY_OF_SERVICE = 0;
|
public static final int DEFAULT_MQTT_QUALITY_OF_SERVICE = 0;
|
||||||
public static final String MQTT_SUBSCRIBE_TOPIC = "%s/" + DEVICE_TYPE + "/%s";
|
public static final String MQTT_SUBSCRIBE_TOPIC = "%s/" + DEVICE_TYPE + "/%s";
|
||||||
public static final String MQTT_PUBLISH_TOPIC = "%s/" + DEVICE_TYPE + "/%s/publisher";
|
public static final String MQTT_PUBLISH_TOPIC = "%s/" + DEVICE_TYPE + "/%s/temperature";
|
||||||
/* ---------------------------------------------------------------------------------------
|
/* ---------------------------------------------------------------------------------------
|
||||||
XMPP Connection specific information
|
XMPP Connection specific information
|
||||||
--------------------------------------------------------------------------------------- */
|
--------------------------------------------------------------------------------------- */
|
||||||
|
|||||||
@ -168,13 +168,13 @@ public class AgentManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
// try {
|
||||||
EnrollmentManager.getInstance().beginEnrollmentFlow();
|
// EnrollmentManager.getInstance().beginEnrollmentFlow();
|
||||||
} catch (AgentCoreOperationException e) {
|
// } catch (AgentCoreOperationException e) {
|
||||||
log.error("Device Enrollment Failed:\n");
|
// log.error("Device Enrollment Failed:\n");
|
||||||
e.printStackTrace();
|
// e.printStackTrace();
|
||||||
System.exit(0);
|
// System.exit(0);
|
||||||
}
|
// }
|
||||||
|
|
||||||
//Start agent communication
|
//Start agent communication
|
||||||
agentCommunicator.get(protocol).connect();
|
agentCommunicator.get(protocol).connect();
|
||||||
|
|||||||
@ -241,59 +241,67 @@ public class AgentUtilOperations {
|
|||||||
|
|
||||||
|
|
||||||
public static String prepareSecurePayLoad(String message) throws AgentCoreOperationException {
|
public static String prepareSecurePayLoad(String message) throws AgentCoreOperationException {
|
||||||
PrivateKey devicePrivateKey = EnrollmentManager.getInstance().getPrivateKey();
|
if (EnrollmentManager.getInstance().isEnrolled()) {
|
||||||
String encodedMessage = Base64.encodeBase64String(message.getBytes());
|
PrivateKey devicePrivateKey = EnrollmentManager.getInstance().getPrivateKey();
|
||||||
String signedPayload;
|
String encodedMessage = Base64.encodeBase64String(message.getBytes());
|
||||||
try {
|
String signedPayload;
|
||||||
signedPayload = CommunicationUtils.signMessage(encodedMessage, devicePrivateKey);
|
try {
|
||||||
} catch (TransportHandlerException e) {
|
signedPayload = CommunicationUtils.signMessage(encodedMessage, devicePrivateKey);
|
||||||
String errorMsg = "Error occurred whilst trying to sign encrypted message of: [" + message + "]";
|
} catch (TransportHandlerException e) {
|
||||||
log.error(errorMsg);
|
String errorMsg = "Error occurred whilst trying to sign encrypted message of: [" + message + "]";
|
||||||
throw new AgentCoreOperationException(errorMsg, e);
|
log.error(errorMsg);
|
||||||
|
throw new AgentCoreOperationException(errorMsg, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
JSONObject jsonPayload = new JSONObject();
|
||||||
|
jsonPayload.put(JSON_MESSAGE_KEY, encodedMessage);
|
||||||
|
jsonPayload.put(JSON_SIGNATURE_KEY, signedPayload);
|
||||||
|
//below statements are temporary fix.
|
||||||
|
jsonPayload.put(JSON_SERIAL_KEY, EnrollmentManager.getInstance().getSCEPCertificate().getSerialNumber());
|
||||||
|
|
||||||
|
return jsonPayload.toString();
|
||||||
|
} else {
|
||||||
|
return message;
|
||||||
}
|
}
|
||||||
|
|
||||||
JSONObject jsonPayload = new JSONObject();
|
|
||||||
jsonPayload.put(JSON_MESSAGE_KEY, encodedMessage);
|
|
||||||
jsonPayload.put(JSON_SIGNATURE_KEY, signedPayload);
|
|
||||||
//below statements are temporary fix.
|
|
||||||
jsonPayload.put(JSON_SERIAL_KEY, EnrollmentManager.getInstance().getSCEPCertificate().getSerialNumber());
|
|
||||||
|
|
||||||
return jsonPayload.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static String extractMessageFromPayload(String message) throws AgentCoreOperationException {
|
public static String extractMessageFromPayload(String message) throws AgentCoreOperationException {
|
||||||
String actualMessage;
|
if (EnrollmentManager.getInstance().isEnrolled()) {
|
||||||
|
String actualMessage;
|
||||||
|
|
||||||
PublicKey serverPublicKey = EnrollmentManager.getInstance().getServerPublicKey();
|
PublicKey serverPublicKey = EnrollmentManager.getInstance().getServerPublicKey();
|
||||||
JSONObject jsonPayload = new JSONObject(message);
|
JSONObject jsonPayload = new JSONObject(message);
|
||||||
Object encodedMessage = jsonPayload.get(JSON_MESSAGE_KEY);
|
Object encodedMessage = jsonPayload.get(JSON_MESSAGE_KEY);
|
||||||
Object signedPayload = jsonPayload.get(JSON_SIGNATURE_KEY);
|
Object signedPayload = jsonPayload.get(JSON_SIGNATURE_KEY);
|
||||||
boolean verification;
|
boolean verification;
|
||||||
|
|
||||||
if (encodedMessage != null && signedPayload != null) {
|
if (encodedMessage != null && signedPayload != null) {
|
||||||
try {
|
try {
|
||||||
verification = CommunicationUtils.verifySignature(
|
verification = CommunicationUtils.verifySignature(
|
||||||
encodedMessage.toString(), signedPayload.toString(), serverPublicKey);
|
encodedMessage.toString(), signedPayload.toString(), serverPublicKey);
|
||||||
} catch (TransportHandlerException e) {
|
} catch (TransportHandlerException e) {
|
||||||
String errorMsg =
|
String errorMsg =
|
||||||
"Error occurred whilst trying to verify signature on received message: [" + message + "]";
|
"Error occurred whilst trying to verify signature on received message: [" + message + "]";
|
||||||
log.error(errorMsg);
|
log.error(errorMsg);
|
||||||
throw new AgentCoreOperationException(errorMsg, e);
|
throw new AgentCoreOperationException(errorMsg, e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
String errorMsg = "The received message is in an INVALID format. " +
|
||||||
|
"Need to be JSON - {\"Msg\":\"<ENCRYPTED_MSG>\", \"Sig\":\"<SIGNED_MSG>\"}.";
|
||||||
|
throw new AgentCoreOperationException(errorMsg);
|
||||||
}
|
}
|
||||||
|
if (verification) {
|
||||||
|
actualMessage = new String(Base64.decodeBase64(encodedMessage.toString()), StandardCharsets.UTF_8);
|
||||||
|
} else {
|
||||||
|
String errorMsg = "Could not verify payload signature. The message was not signed by a valid client";
|
||||||
|
log.error(errorMsg);
|
||||||
|
throw new AgentCoreOperationException(errorMsg);
|
||||||
|
}
|
||||||
|
return actualMessage;
|
||||||
} else {
|
} else {
|
||||||
String errorMsg = "The received message is in an INVALID format. " +
|
return message;
|
||||||
"Need to be JSON - {\"Msg\":\"<ENCRYPTED_MSG>\", \"Sig\":\"<SIGNED_MSG>\"}.";
|
|
||||||
throw new AgentCoreOperationException(errorMsg);
|
|
||||||
}
|
}
|
||||||
if (verification) {
|
|
||||||
actualMessage = new String(Base64.decodeBase64(encodedMessage.toString()), StandardCharsets.UTF_8);
|
|
||||||
} else {
|
|
||||||
String errorMsg = "Could not verify payload signature. The message was not signed by a valid client";
|
|
||||||
log.error(errorMsg);
|
|
||||||
throw new AgentCoreOperationException(errorMsg);
|
|
||||||
}
|
|
||||||
return actualMessage;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String formatMessage(String message) {
|
public static String formatMessage(String message) {
|
||||||
|
|||||||
@ -96,6 +96,7 @@ public class EnrollmentManager {
|
|||||||
private PublicKey publicKey;
|
private PublicKey publicKey;
|
||||||
private PublicKey serverPublicKey;
|
private PublicKey serverPublicKey;
|
||||||
private X509Certificate SCEPCertificate;
|
private X509Certificate SCEPCertificate;
|
||||||
|
private boolean isEnrolled = false;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -443,4 +444,13 @@ public class EnrollmentManager {
|
|||||||
public PublicKey getServerPublicKey() {
|
public PublicKey getServerPublicKey() {
|
||||||
return serverPublicKey;
|
return serverPublicKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the device has already been enrolled with the SCEP Server.
|
||||||
|
*
|
||||||
|
* @return the enrollment status; 'TRUE' if already enrolled else 'FALSE'.
|
||||||
|
*/
|
||||||
|
public boolean isEnrolled() {
|
||||||
|
return isEnrolled;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,7 +23,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -208,7 +208,10 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
int currentTemperature = agentManager.getTemperature();
|
int currentTemperature = agentManager.getTemperature();
|
||||||
String message = "PUBLISHER:" + AgentConstants.TEMPERATURE_CONTROL + ":" + currentTemperature;
|
String message = "{\"event\": {\"metaData\": {\"owner\": \"" + AgentManager
|
||||||
|
.getInstance().getAgentConfigs().getDeviceOwner() + "\",\"deviceId\": \"" + AgentManager
|
||||||
|
.getInstance().getAgentConfigs().getDeviceId() + "\",\"time\": " +
|
||||||
|
"0},\"payloadData\": { \"temperature\": " + currentTemperature + "} }}";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String payLoad = AgentUtilOperations.prepareSecurePayLoad(message);
|
String payLoad = AgentUtilOperations.prepareSecurePayLoad(message);
|
||||||
|
|||||||
@ -189,8 +189,10 @@ public class FireAlarmXMPPCommunicator extends XMPPTransportHandler {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
int currentTemperature = agentManager.getTemperature();
|
int currentTemperature = agentManager.getTemperature();
|
||||||
|
String message = "{\"event\": {\"metaData\": {\"owner\": \"" + AgentManager
|
||||||
String message = AgentConstants.TEMPERATURE_CONTROL + ":" + currentTemperature;
|
.getInstance().getAgentConfigs().getDeviceOwner() + "\",\"deviceId\": \"" + AgentManager
|
||||||
|
.getInstance().getAgentConfigs().getDeviceId() + "\",\"time\": " +
|
||||||
|
"0},\"payloadData\": { \"temperature\": " + currentTemperature + "} }}";
|
||||||
String payLoad = AgentUtilOperations.prepareSecurePayLoad(message);
|
String payLoad = AgentUtilOperations.prepareSecurePayLoad(message);
|
||||||
|
|
||||||
xmppMessage.setTo(xmppAdminJID);
|
xmppMessage.setTo(xmppAdminJID);
|
||||||
|
|||||||
@ -62,7 +62,7 @@ public class AgentConstants {
|
|||||||
public static final int DEFAULT_MQTT_RECONNECTION_INTERVAL = 2; // time in seconds
|
public static final int DEFAULT_MQTT_RECONNECTION_INTERVAL = 2; // time in seconds
|
||||||
public static final int DEFAULT_MQTT_QUALITY_OF_SERVICE = 0;
|
public static final int DEFAULT_MQTT_QUALITY_OF_SERVICE = 0;
|
||||||
public static final String MQTT_SUBSCRIBE_TOPIC = "%s/" + DEVICE_TYPE + "/%s";
|
public static final String MQTT_SUBSCRIBE_TOPIC = "%s/" + DEVICE_TYPE + "/%s";
|
||||||
public static final String MQTT_PUBLISH_TOPIC = "%s/" + DEVICE_TYPE + "/%s/publisher";
|
public static final String MQTT_PUBLISH_TOPIC = "%s/" + DEVICE_TYPE + "/%s/temperature";
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------------------
|
/* ---------------------------------------------------------------------------------------
|
||||||
Device/Agent specific properties to be read from the 'deviceConfig.properties' file
|
Device/Agent specific properties to be read from the 'deviceConfig.properties' file
|
||||||
|
|||||||
@ -153,15 +153,15 @@ public class AgentManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
// try {
|
||||||
if (!EnrollmentManager.getInstance().isEnrolled()) {
|
// if (!EnrollmentManager.getInstance().isEnrolled()) {
|
||||||
EnrollmentManager.getInstance().beginEnrollmentFlow();
|
// EnrollmentManager.getInstance().beginEnrollmentFlow();
|
||||||
}
|
// }
|
||||||
} catch (AgentCoreOperationException e) {
|
// } catch (AgentCoreOperationException e) {
|
||||||
log.error("Device Enrollment Failed:\n");
|
// log.error("Device Enrollment Failed:\n");
|
||||||
log.error(e);
|
// log.error(e);
|
||||||
System.exit(0);
|
// System.exit(0);
|
||||||
}
|
// }
|
||||||
|
|
||||||
//Start agent communication
|
//Start agent communication
|
||||||
agentCommunicator.get(protocol).connect();
|
agentCommunicator.get(protocol).connect();
|
||||||
|
|||||||
@ -250,57 +250,65 @@ public class AgentUtilOperations {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static String prepareSecurePayLoad(String message) throws AgentCoreOperationException {
|
public static String prepareSecurePayLoad(String message) throws AgentCoreOperationException {
|
||||||
PrivateKey devicePrivateKey = EnrollmentManager.getInstance().getPrivateKey();
|
if (EnrollmentManager.getInstance().isEnrolled()) {
|
||||||
String encodedMessage = Base64.encodeBase64String(message.getBytes());
|
PrivateKey devicePrivateKey = EnrollmentManager.getInstance().getPrivateKey();
|
||||||
String signedPayload;
|
String encodedMessage = Base64.encodeBase64String(message.getBytes());
|
||||||
try {
|
String signedPayload;
|
||||||
signedPayload = CommunicationUtils.signMessage(encodedMessage, devicePrivateKey);
|
|
||||||
} catch (TransportHandlerException e) {
|
|
||||||
String errorMsg = "Error occurred whilst trying to sign encrypted message of: [" + message + "]";
|
|
||||||
log.error(errorMsg);
|
|
||||||
throw new AgentCoreOperationException(errorMsg, e);
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONObject jsonPayload = new JSONObject();
|
|
||||||
jsonPayload.put(JSON_MESSAGE_KEY, encodedMessage);
|
|
||||||
jsonPayload.put(JSON_SIGNATURE_KEY, signedPayload);
|
|
||||||
//below statements are temporary fix.
|
|
||||||
jsonPayload.put(JSON_SERIAL_KEY, EnrollmentManager.getInstance().getSCEPCertificate().getSerialNumber());
|
|
||||||
return jsonPayload.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String extractMessageFromPayload(String message) throws AgentCoreOperationException {
|
|
||||||
String actualMessage;
|
|
||||||
|
|
||||||
PublicKey serverPublicKey = EnrollmentManager.getInstance().getServerPublicKey();
|
|
||||||
JSONObject jsonPayload = new JSONObject(message);
|
|
||||||
Object encodedMessage = jsonPayload.get(JSON_MESSAGE_KEY);
|
|
||||||
Object signedPayload = jsonPayload.get(JSON_SIGNATURE_KEY);
|
|
||||||
boolean verification;
|
|
||||||
|
|
||||||
if (encodedMessage != null && signedPayload != null) {
|
|
||||||
try {
|
try {
|
||||||
verification = CommunicationUtils.verifySignature(
|
signedPayload = CommunicationUtils.signMessage(encodedMessage, devicePrivateKey);
|
||||||
encodedMessage.toString(), signedPayload.toString(), serverPublicKey);
|
|
||||||
} catch (TransportHandlerException e) {
|
} catch (TransportHandlerException e) {
|
||||||
String errorMsg =
|
String errorMsg = "Error occurred whilst trying to sign encrypted message of: [" + message + "]";
|
||||||
"Error occurred whilst trying to verify signature on received message: [" + message + "]";
|
|
||||||
log.error(errorMsg);
|
log.error(errorMsg);
|
||||||
throw new AgentCoreOperationException(errorMsg, e);
|
throw new AgentCoreOperationException(errorMsg, e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JSONObject jsonPayload = new JSONObject();
|
||||||
|
jsonPayload.put(JSON_MESSAGE_KEY, encodedMessage);
|
||||||
|
jsonPayload.put(JSON_SIGNATURE_KEY, signedPayload);
|
||||||
|
//below statements are temporary fix.
|
||||||
|
jsonPayload.put(JSON_SERIAL_KEY, EnrollmentManager.getInstance().getSCEPCertificate().getSerialNumber());
|
||||||
|
return jsonPayload.toString();
|
||||||
} else {
|
} else {
|
||||||
String errorMsg = "The received message is in an INVALID format. " +
|
return message;
|
||||||
"Need to be JSON - {\"Msg\":\"<ENCRYPTED_MSG>\", \"Sig\":\"<SIGNED_MSG>\"}.";
|
|
||||||
throw new AgentCoreOperationException(errorMsg);
|
|
||||||
}
|
}
|
||||||
if (verification) {
|
}
|
||||||
actualMessage = new String(Base64.decodeBase64(encodedMessage.toString()), StandardCharsets.UTF_8);
|
|
||||||
|
public static String extractMessageFromPayload(String message) throws AgentCoreOperationException {
|
||||||
|
if (EnrollmentManager.getInstance().isEnrolled()) {
|
||||||
|
String actualMessage;
|
||||||
|
|
||||||
|
PublicKey serverPublicKey = EnrollmentManager.getInstance().getServerPublicKey();
|
||||||
|
JSONObject jsonPayload = new JSONObject(message);
|
||||||
|
Object encodedMessage = jsonPayload.get(JSON_MESSAGE_KEY);
|
||||||
|
Object signedPayload = jsonPayload.get(JSON_SIGNATURE_KEY);
|
||||||
|
boolean verification;
|
||||||
|
|
||||||
|
if (encodedMessage != null && signedPayload != null) {
|
||||||
|
try {
|
||||||
|
verification = CommunicationUtils.verifySignature(
|
||||||
|
encodedMessage.toString(), signedPayload.toString(), serverPublicKey);
|
||||||
|
} catch (TransportHandlerException e) {
|
||||||
|
String errorMsg =
|
||||||
|
"Error occurred whilst trying to verify signature on received message: [" + message + "]";
|
||||||
|
log.error(errorMsg);
|
||||||
|
throw new AgentCoreOperationException(errorMsg, e);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
String errorMsg = "The received message is in an INVALID format. " +
|
||||||
|
"Need to be JSON - {\"Msg\":\"<ENCRYPTED_MSG>\", \"Sig\":\"<SIGNED_MSG>\"}.";
|
||||||
|
throw new AgentCoreOperationException(errorMsg);
|
||||||
|
}
|
||||||
|
if (verification) {
|
||||||
|
actualMessage = new String(Base64.decodeBase64(encodedMessage.toString()), StandardCharsets.UTF_8);
|
||||||
|
} else {
|
||||||
|
String errorMsg = "Could not verify payload signature. The message was not signed by a valid client";
|
||||||
|
log.error(errorMsg);
|
||||||
|
throw new AgentCoreOperationException(errorMsg);
|
||||||
|
}
|
||||||
|
return actualMessage;
|
||||||
} else {
|
} else {
|
||||||
String errorMsg = "Could not verify payload signature. The message was not signed by a valid client";
|
return message;
|
||||||
log.error(errorMsg);
|
|
||||||
throw new AgentCoreOperationException(errorMsg);
|
|
||||||
}
|
}
|
||||||
return actualMessage;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String getAuthenticationMethod() {
|
public static String getAuthenticationMethod() {
|
||||||
|
|||||||
@ -111,7 +111,7 @@ public class EnrollmentManager {
|
|||||||
*/
|
*/
|
||||||
private EnrollmentManager() {
|
private EnrollmentManager() {
|
||||||
this.SCEPUrl = AgentManager.getInstance().getEnrollmentEP();
|
this.SCEPUrl = AgentManager.getInstance().getEnrollmentEP();
|
||||||
setEnrollmentStatus();
|
//setEnrollmentStatus();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -0,0 +1,38 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<project name="create-virtual-firealarm-capps" default="zip" basedir=".">
|
||||||
|
|
||||||
|
<property name="project-name" value="${ant.project.name}"/>
|
||||||
|
<property name="target-dir" value="target/carbonapps"/>
|
||||||
|
<property name="src-dir" value="src/main/resources/carbonapps"/>
|
||||||
|
|
||||||
|
<property name="Virtual_firealarm_dir" value="virtualfirealarm"/>
|
||||||
|
|
||||||
|
<target name="clean">
|
||||||
|
<delete dir="${target-dir}" />
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="zip" depends="clean">
|
||||||
|
<mkdir dir="${target-dir}"/>
|
||||||
|
<zip destfile="${target-dir}/${Virtual_firealarm_dir}.car">
|
||||||
|
<zipfileset dir="${src-dir}/${Virtual_firealarm_dir}"/>
|
||||||
|
</zip>
|
||||||
|
</target>
|
||||||
|
</project>
|
||||||
@ -0,0 +1,75 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
||||||
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
|
<relativePath>../pom.xml</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<artifactId>org.wso2.carbon.device.mgt.iot.virtualfirealarm.analytics</artifactId>
|
||||||
|
<name>WSO2 Carbon - IoT Server Virtual Firealarm Analytics capp</name>
|
||||||
|
<packaging>pom</packaging>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-antrun-plugin</artifactId>
|
||||||
|
<version>1.7</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>process-resources</phase>
|
||||||
|
<configuration>
|
||||||
|
<target>
|
||||||
|
<ant antfile="build.xml" target="zip" />
|
||||||
|
</target>
|
||||||
|
</configuration>
|
||||||
|
<goals>
|
||||||
|
<goal>run</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<artifactId>maven-assembly-plugin</artifactId>
|
||||||
|
<version>2.5.5</version>
|
||||||
|
<configuration>
|
||||||
|
<finalName>${project.artifactId}-${carbon.devicemgt.plugins.version}</finalName>
|
||||||
|
<appendAssemblyId>false</appendAssemblyId>
|
||||||
|
<descriptors>
|
||||||
|
<descriptor>src/assembly/src.xml</descriptor>
|
||||||
|
</descriptors>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>create-archive</id>
|
||||||
|
<phase>package</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>single</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
</project>
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<assembly
|
||||||
|
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
|
||||||
|
<id>src</id>
|
||||||
|
<formats>
|
||||||
|
<format>zip</format>
|
||||||
|
</formats>
|
||||||
|
<includeBaseDirectory>false</includeBaseDirectory>
|
||||||
|
<baseDirectory>${basedir}/src</baseDirectory>
|
||||||
|
<fileSets>
|
||||||
|
<fileSet>
|
||||||
|
<directory>${basedir}/target/carbonapps</directory>
|
||||||
|
<outputDirectory>/</outputDirectory>
|
||||||
|
<useDefaultExcludes>true</useDefaultExcludes>
|
||||||
|
</fileSet>
|
||||||
|
</fileSets>
|
||||||
|
</assembly>
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<artifacts>
|
||||||
|
<artifact name="virtualfirealarm" version="1.0.0" type="carbon/application">
|
||||||
|
<dependency artifact="virtualfirealarm_stream" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/>
|
||||||
|
<dependency artifact="virtualfirealarm_receiver" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/>
|
||||||
|
<dependency artifact="virtualfirealarm_execution" version="1.0.0" include="true" serverRole="DataAnalyticsServer"/>
|
||||||
|
</artifact>
|
||||||
|
</artifacts>
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<artifact name="virtualfirealarm_execution" version="1.0.0" type="event/execution-plan" serverRole="DataAnalyticsServer">
|
||||||
|
<file>virtualfirealarm_execution.siddhiql</file>
|
||||||
|
</artifact>
|
||||||
|
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
/* Enter a unique ExecutionPlan */
|
||||||
|
@Plan:name('virtualfirealarm_execution')
|
||||||
|
|
||||||
|
/* Enter a unique description for ExecutionPlan */
|
||||||
|
-- @Plan:description('virtualfirealarm_execution')
|
||||||
|
|
||||||
|
/* define streams/tables and write queries here ... */
|
||||||
|
|
||||||
|
@Import('org.wso2.iot.virtualfirealarm:1.0.0')
|
||||||
|
define stream virtualfirealarm (meta_owner string, meta_deviceId string, meta_time long, temperature float);
|
||||||
|
|
||||||
|
@Export('org.wso2.iot.devices.temperature:1.0.0')
|
||||||
|
define stream temperature (meta_owner string, meta_deviceType string, meta_deviceId string, meta_time long, temperature float);
|
||||||
|
|
||||||
|
from virtualfirealarm
|
||||||
|
select meta_owner, 'virtual_firealarm' as meta_deviceType, meta_deviceId, time:timestampInMilliseconds() as meta_time, temperature
|
||||||
|
insert into temperature;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<artifact name="virtualfirealarm_receiver" version="1.0.0" type="event/receiver" serverRole="DataAnalyticsServer">
|
||||||
|
<file>virtualfirealarm_receiver.xml</file>
|
||||||
|
</artifact>
|
||||||
@ -0,0 +1,29 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
<eventReceiver name="virtualfirealarm_receiver" statistics="disable" trace="disable" xmlns="http://wso2.org/carbon/eventreceiver">
|
||||||
|
<from eventAdapterType="oauth-mqtt">
|
||||||
|
<property name="topic">carbon.super/virtual_firealarm/+/temperature</property>
|
||||||
|
<property name="username">admin</property>
|
||||||
|
<property name="password">admin</property>
|
||||||
|
<property name="contentValidator">org.wso2.carbon.device.mgt.input.adapter.mqtt.util.MQTTContentValidator</property>
|
||||||
|
<property name="cleanSession">true</property>
|
||||||
|
</from>
|
||||||
|
<mapping customMapping="disable" type="json"/>
|
||||||
|
<to streamName="org.wso2.iot.virtualfirealarm" version="1.0.0"/>
|
||||||
|
</eventReceiver>
|
||||||
@ -0,0 +1,23 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
~ 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.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<artifact name= "virtualfirealarm_stream" version="1.0.0" type="event/stream" serverRole="DataAnalyticsServer">
|
||||||
|
<file>org.wso2.iot.virtualfirealarm_1.0.0.json</file>
|
||||||
|
</artifact>
|
||||||
|
|
||||||
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "org.wso2.iot.virtualfirealarm",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"nickName": "virtual_firealarm",
|
||||||
|
"description": "Temperature data received from the virtual_firealarm",
|
||||||
|
"metaData": [
|
||||||
|
{"name":"owner","type":"STRING"},
|
||||||
|
{"name":"deviceId","type":"STRING"},
|
||||||
|
{"name":"time","type":"LONG"}
|
||||||
|
],
|
||||||
|
"payloadData": [
|
||||||
|
{
|
||||||
|
"name": "temperature","type": "FLOAT"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
@ -235,14 +235,10 @@
|
|||||||
<artifactId>org.wso2.carbon.device.mgt.extensions</artifactId>
|
<artifactId>org.wso2.carbon.device.mgt.extensions</artifactId>
|
||||||
<scope>provided</scope>
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
|
||||||
<artifactId>org.wso2.carbon.device.mgt.iot.virtualfirealarm.plugin</artifactId>
|
|
||||||
<scope>provided</scope>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.wso2.carbon.devicemgt</groupId>
|
<groupId>org.wso2.carbon.devicemgt</groupId>
|
||||||
<artifactId>org.wso2.carbon.apimgt.annotations</artifactId>
|
<artifactId>org.wso2.carbon.apimgt.annotations</artifactId>
|
||||||
|
<scope>provided</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@ -18,7 +18,6 @@
|
|||||||
|
|
||||||
package org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl;
|
package org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl;
|
||||||
|
|
||||||
import org.apache.commons.codec.binary.Base64;
|
|
||||||
import org.apache.commons.io.FileUtils;
|
import org.apache.commons.io.FileUtils;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
@ -35,18 +34,15 @@ import org.wso2.carbon.device.mgt.common.group.mgt.DeviceGroupConstants;
|
|||||||
import org.wso2.carbon.device.mgt.common.operation.mgt.Operation;
|
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.common.operation.mgt.OperationManagementException;
|
||||||
import org.wso2.carbon.device.mgt.core.operation.mgt.CommandOperation;
|
import org.wso2.carbon.device.mgt.core.operation.mgt.CommandOperation;
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.plugin.constants.VirtualFireAlarmConstants;
|
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.constants.VirtualFireAlarmConstants;
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.plugin.exception.VirtualFirealarmDeviceMgtPluginException;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.plugin.impl.VirtualFirealarmSecurityManager;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.plugin.xmpp.XmppAccount;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.plugin.xmpp.XmppConfig;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.plugin.xmpp.XmppServerClient;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.dto.SensorRecord;
|
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.dto.SensorRecord;
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.exception.VirtualFireAlarmException;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util.APIUtil;
|
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util.APIUtil;
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util.VirtualFireAlarmServiceUtils;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util.ZipArchive;
|
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util.ZipArchive;
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util.ZipUtil;
|
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util.ZipUtil;
|
||||||
|
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.xmpp.VirtualFirealarmXMPPException;
|
||||||
|
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.xmpp.XmppAccount;
|
||||||
|
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.xmpp.XmppConfig;
|
||||||
|
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.xmpp.XmppServerClient;
|
||||||
import org.wso2.carbon.identity.jwt.client.extension.JWTClient;
|
import org.wso2.carbon.identity.jwt.client.extension.JWTClient;
|
||||||
import org.wso2.carbon.identity.jwt.client.extension.dto.AccessTokenInfo;
|
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.exception.JWTClientException;
|
||||||
@ -76,11 +72,8 @@ import java.util.UUID;
|
|||||||
|
|
||||||
public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService {
|
public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService {
|
||||||
|
|
||||||
private static final String XMPP_PROTOCOL = "XMPP";
|
|
||||||
private static final String MQTT_PROTOCOL = "MQTT";
|
|
||||||
private static final String KEY_TYPE = "PRODUCTION";
|
private static final String KEY_TYPE = "PRODUCTION";
|
||||||
private static ApiApplicationKey apiApplicationKey;
|
private static ApiApplicationKey apiApplicationKey;
|
||||||
private static final String DEVICE_MGT_SCOPE_IDENTIFIER = "device-mgt";
|
|
||||||
private static Log log = LogFactory.getLog(VirtualFireAlarmServiceImpl.class);
|
private static Log log = LogFactory.getLog(VirtualFireAlarmServiceImpl.class);
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@ -103,10 +96,7 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService {
|
|||||||
return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build();
|
return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build();
|
||||||
}
|
}
|
||||||
String resource = VirtualFireAlarmConstants.BULB_CONTEXT.replace("/", "");
|
String resource = VirtualFireAlarmConstants.BULB_CONTEXT.replace("/", "");
|
||||||
PrivateKey serverPrivateKey = VirtualFirealarmSecurityManager.getServerPrivateKey();
|
|
||||||
String actualMessage = resource + ":" + switchToState;
|
String actualMessage = resource + ":" + switchToState;
|
||||||
String encryptedMsg = VirtualFireAlarmServiceUtils.prepareSecurePayLoad(actualMessage,
|
|
||||||
serverPrivateKey);
|
|
||||||
String publishTopic = APIUtil.getTenantDomainOftheUser() + "/"
|
String publishTopic = APIUtil.getTenantDomainOftheUser() + "/"
|
||||||
+ VirtualFireAlarmConstants.DEVICE_TYPE + "/" + deviceId;
|
+ VirtualFireAlarmConstants.DEVICE_TYPE + "/" + deviceId;
|
||||||
|
|
||||||
@ -114,7 +104,7 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService {
|
|||||||
commandOp.setCode("buzz");
|
commandOp.setCode("buzz");
|
||||||
commandOp.setType(Operation.Type.COMMAND);
|
commandOp.setType(Operation.Type.COMMAND);
|
||||||
commandOp.setEnabled(true);
|
commandOp.setEnabled(true);
|
||||||
commandOp.setPayLoad(encryptedMsg);
|
commandOp.setPayLoad(actualMessage);
|
||||||
|
|
||||||
Properties props = new Properties();
|
Properties props = new Properties();
|
||||||
props.setProperty(VirtualFireAlarmConstants.MQTT_ADAPTER_TOPIC_PROPERTY_NAME, publishTopic);
|
props.setProperty(VirtualFireAlarmConstants.MQTT_ADAPTER_TOPIC_PROPERTY_NAME, publishTopic);
|
||||||
@ -137,10 +127,6 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService {
|
|||||||
} catch (DeviceAccessAuthorizationException e) {
|
} catch (DeviceAccessAuthorizationException e) {
|
||||||
log.error(e.getErrorMessage(), e);
|
log.error(e.getErrorMessage(), e);
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
|
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
|
||||||
} catch (VirtualFireAlarmException e) {
|
|
||||||
String errorMsg = "Preparing Secure payload failed for device - [" + deviceId + "]";
|
|
||||||
log.error(errorMsg);
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
|
|
||||||
} catch (OperationManagementException e) {
|
} catch (OperationManagementException e) {
|
||||||
String msg = "Error occurred while executing command operation upon ringing the buzzer";
|
String msg = "Error occurred while executing command operation upon ringing the buzzer";
|
||||||
log.error(msg, e);
|
log.error(msg, e);
|
||||||
@ -162,37 +148,22 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService {
|
|||||||
DeviceGroupConstants.Permissions.DEFAULT_MANAGE_POLICIES_PERMISSIONS)) {
|
DeviceGroupConstants.Permissions.DEFAULT_MANAGE_POLICIES_PERMISSIONS)) {
|
||||||
return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build();
|
return Response.status(Response.Status.UNAUTHORIZED.getStatusCode()).build();
|
||||||
}
|
}
|
||||||
PrivateKey serverPrivateKey = VirtualFirealarmSecurityManager.getServerPrivateKey();
|
|
||||||
String actualMessage = VirtualFireAlarmConstants.POLICY_CONTEXT + ":" + policy;
|
String actualMessage = VirtualFireAlarmConstants.POLICY_CONTEXT + ":" + policy;
|
||||||
String encryptedMsg = VirtualFireAlarmServiceUtils.prepareSecurePayLoad(actualMessage,
|
|
||||||
serverPrivateKey);
|
|
||||||
Map<String, String> dynamicProperties = new HashMap<>();
|
Map<String, String> dynamicProperties = new HashMap<>();
|
||||||
switch (protocolString) {
|
String publishTopic = APIUtil.getTenantDomainOftheUser() + "/"
|
||||||
case XMPP_PROTOCOL:
|
+ VirtualFireAlarmConstants.DEVICE_TYPE + "/" + deviceId;
|
||||||
dynamicProperties.put(VirtualFireAlarmConstants.JID_PROPERTY_KEY,
|
dynamicProperties.put(VirtualFireAlarmConstants.ADAPTER_TOPIC_PROPERTY, publishTopic);
|
||||||
deviceId + "@" + XmppConfig.getInstance().getServerName());
|
dynamicProperties.put(VirtualFireAlarmConstants.JID_PROPERTY_KEY,
|
||||||
dynamicProperties.put(VirtualFireAlarmConstants.SUBJECT_PROPERTY_KEY, "POLICTY-REQUEST");
|
deviceId + "@" + XmppConfig.getInstance().getServerName());
|
||||||
dynamicProperties.put(VirtualFireAlarmConstants.MESSAGE_TYPE_PROPERTY_KEY,
|
dynamicProperties.put(VirtualFireAlarmConstants.SUBJECT_PROPERTY_KEY, "POLICTY-REQUEST");
|
||||||
VirtualFireAlarmConstants.CHAT_PROPERTY_KEY);
|
dynamicProperties.put(VirtualFireAlarmConstants.MESSAGE_TYPE_PROPERTY_KEY,
|
||||||
APIUtil.getOutputEventAdapterService().publish(VirtualFireAlarmConstants.XMPP_ADAPTER_NAME,
|
VirtualFireAlarmConstants.CHAT_PROPERTY_KEY);
|
||||||
dynamicProperties, encryptedMsg);
|
APIUtil.getOutputEventAdapterService().publish(VirtualFireAlarmConstants.XMPP_ADAPTER_NAME,
|
||||||
break;
|
dynamicProperties, actualMessage);
|
||||||
default:
|
|
||||||
|
|
||||||
String publishTopic = APIUtil.getTenantDomainOftheUser() + "/"
|
|
||||||
+ VirtualFireAlarmConstants.DEVICE_TYPE + "/" + deviceId;
|
|
||||||
dynamicProperties.put(VirtualFireAlarmConstants.ADAPTER_TOPIC_PROPERTY, publishTopic);
|
|
||||||
APIUtil.getOutputEventAdapterService().publish(VirtualFireAlarmConstants.MQTT_ADAPTER_NAME,
|
|
||||||
dynamicProperties, encryptedMsg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return Response.ok().build();
|
return Response.ok().build();
|
||||||
} catch (DeviceAccessAuthorizationException e) {
|
} catch (DeviceAccessAuthorizationException e) {
|
||||||
log.error(e.getErrorMessage(), e);
|
log.error(e.getErrorMessage(), e);
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
|
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
|
||||||
} catch (VirtualFireAlarmException e) {
|
|
||||||
log.error(e);
|
|
||||||
return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,7 +231,7 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService {
|
|||||||
} catch (UserStoreException ex) {
|
} catch (UserStoreException ex) {
|
||||||
log.error(ex.getMessage(), ex);
|
log.error(ex.getMessage(), ex);
|
||||||
return Response.status(500).entity(ex.getMessage()).build();
|
return Response.status(500).entity(ex.getMessage()).build();
|
||||||
} catch (VirtualFirealarmDeviceMgtPluginException ex) {
|
} catch (VirtualFirealarmXMPPException ex) {
|
||||||
log.error(ex.getMessage(), ex);
|
log.error(ex.getMessage(), ex);
|
||||||
return Response.status(500).entity(ex.getMessage()).build();
|
return Response.status(500).entity(ex.getMessage()).build();
|
||||||
}
|
}
|
||||||
@ -294,7 +265,7 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService {
|
|||||||
|
|
||||||
private ZipArchive createDownloadFile(String owner, String deviceName, String sketchType)
|
private ZipArchive createDownloadFile(String owner, String deviceName, String sketchType)
|
||||||
throws DeviceManagementException, APIManagerException, JWTClientException,
|
throws DeviceManagementException, APIManagerException, JWTClientException,
|
||||||
UserStoreException, VirtualFirealarmDeviceMgtPluginException {
|
UserStoreException, VirtualFirealarmXMPPException {
|
||||||
//create new device id
|
//create new device id
|
||||||
String deviceId = shortUUID();
|
String deviceId = shortUUID();
|
||||||
boolean status = register(deviceId, deviceName);
|
boolean status = register(deviceId, deviceName);
|
||||||
|
|||||||
@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* 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.iot.virtualfirealarm.service.impl.constants;
|
||||||
|
|
||||||
|
public class VirtualFireAlarmConstants {
|
||||||
|
public final static String DEVICE_TYPE = "virtual_firealarm";
|
||||||
|
public final static String DEVICE_PLUGIN_DEVICE_NAME = "DEVICE_NAME";
|
||||||
|
public final static String DEVICE_PLUGIN_DEVICE_ID = "VIRTUAL_FIREALARM_DEVICE_ID";
|
||||||
|
public final static String STATE_ON = "ON";
|
||||||
|
public final static String STATE_OFF = "OFF";
|
||||||
|
|
||||||
|
public static final String URL_PREFIX = "http://";
|
||||||
|
public static final String BULB_CONTEXT = "BULB";
|
||||||
|
public static final String POLICY_CONTEXT = "POLICY";
|
||||||
|
|
||||||
|
//sensor events sumerized table name for temperature
|
||||||
|
public static final String TEMPERATURE_EVENT_TABLE = "DEVICE_TEMPERATURE_SUMMARY";
|
||||||
|
public final static String DEVICE_TYPE_PROVIDER_DOMAIN = "carbon.super";
|
||||||
|
|
||||||
|
//mqtt tranport related constants
|
||||||
|
public static final String MQTT_ADAPTER_NAME = "virtual_firealarm_mqtt";
|
||||||
|
public static final String MQTT_ADAPTER_TYPE = "oauth-mqtt";
|
||||||
|
public static final String ADAPTER_TOPIC_PROPERTY = "topic";
|
||||||
|
public static final String MQTT_PORT = "\\$\\{mqtt.broker.port\\}";
|
||||||
|
public static final String MQTT_BROKER_HOST = "\\$\\{mqtt.broker.host\\}";
|
||||||
|
public static final String CARBON_CONFIG_PORT_OFFSET = "Ports.Offset";
|
||||||
|
public static final String DEFAULT_CARBON_LOCAL_IP_PROPERTY = "carbon.local.ip";
|
||||||
|
public static final int CARBON_DEFAULT_PORT_OFFSET = 0;
|
||||||
|
public static final int DEFAULT_MQTT_PORT = 1886;
|
||||||
|
|
||||||
|
//xmpp transport related constants
|
||||||
|
public static final String XMPP_ADAPTER_NAME = "virtual_firealarm_xmpp";
|
||||||
|
public static final String XMPP_ADAPTER_TYPE = "xmpp";
|
||||||
|
public static final String PASSWORD_PROPERTY_KEY = "password";
|
||||||
|
public static final String JID_PROPERTY_KEY = "jid";
|
||||||
|
public static final String CLIENT_JID_PROPERTY_KEY = "xmpp.client.jid";
|
||||||
|
public static final String SUBJECT_PROPERTY_KEY = "xmpp.client.subject";
|
||||||
|
public static final String MESSAGE_TYPE_PROPERTY_KEY = "xmpp.client.messageType";
|
||||||
|
public static final String CHAT_PROPERTY_KEY = "chat";
|
||||||
|
|
||||||
|
public static final String USERNAME_PROPERTY_KEY = "username";
|
||||||
|
public static final String DCR_PROPERTY_KEY = "dcrUrl";
|
||||||
|
public static final String BROKER_URL_PROPERTY_KEY = "url";
|
||||||
|
public static final String SCOPES_PROPERTY_KEY = "scopes";
|
||||||
|
public static final String QOS_PROPERTY_KEY = "qos";
|
||||||
|
public static final String CLIENT_ID_PROPERTY_KEY = "qos";
|
||||||
|
public static final String CLEAR_SESSION_PROPERTY_KEY = "clearSession";
|
||||||
|
public static final String TOPIC = "topic";
|
||||||
|
public static final String SUBSCRIBED_TOPIC = "carbon.super/virtual_firealarm/+/publisher";
|
||||||
|
|
||||||
|
public static final String CONTENT_VALIDATION = "contentValidator";
|
||||||
|
public static final String CONTENT_TRANSFORMATION = "contentTransformer";
|
||||||
|
public static final String RESOURCE = "resource";
|
||||||
|
|
||||||
|
public static final String JSON_SERIAL_KEY = "SerialNumber";
|
||||||
|
public static final String TEMPERATURE_STREAM_DEFINITION = "org.wso2.iot.devices.temperature";
|
||||||
|
public static final String JSON_MESSAGE_KEY = "Msg";
|
||||||
|
public static final String JSON_SIGNATURE_KEY = "Sig";
|
||||||
|
|
||||||
|
public static final String HOST_KEY = "host";
|
||||||
|
public static final String PORT_KEY = "port";
|
||||||
|
|
||||||
|
public static final String SERVER_NAME = "serverName";
|
||||||
|
|
||||||
|
public static final String MQTT_ADAPTER_TOPIC_PROPERTY_NAME = "mqtt.adapter.topic";
|
||||||
|
|
||||||
|
public static final String APIM_APPLICATION_TOKEN_VALIDITY_PERIOD = "3600";
|
||||||
|
}
|
||||||
@ -1,51 +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;
|
|
||||||
|
|
||||||
import org.apache.commons.codec.binary.Base64;
|
|
||||||
import org.json.JSONObject;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.plugin.exception.VirtualFirealarmDeviceMgtPluginException;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.plugin.impl.VirtualFirealarmSecurityManager;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.exception.VirtualFireAlarmException;
|
|
||||||
|
|
||||||
import java.lang.*;
|
|
||||||
import java.security.PrivateKey;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class VirtualFireAlarmServiceUtils {
|
|
||||||
|
|
||||||
private static final String JSON_MESSAGE_KEY = "Msg";
|
|
||||||
private static final String JSON_SIGNATURE_KEY = "Sig";
|
|
||||||
|
|
||||||
public static String prepareSecurePayLoad(String message, PrivateKey signatureKey) throws VirtualFireAlarmException {
|
|
||||||
try {
|
|
||||||
message = Base64.encodeBase64String(message.getBytes());
|
|
||||||
String signedPayload = VirtualFirealarmSecurityManager.signMessage(message, signatureKey);
|
|
||||||
JSONObject jsonPayload = new JSONObject();
|
|
||||||
jsonPayload.put(JSON_MESSAGE_KEY, message);
|
|
||||||
jsonPayload.put(JSON_SIGNATURE_KEY, signedPayload);
|
|
||||||
return jsonPayload.toString();
|
|
||||||
} catch (VirtualFirealarmDeviceMgtPluginException e) {
|
|
||||||
throw new VirtualFireAlarmException(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,6 +1,5 @@
|
|||||||
package org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util;
|
package org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util;
|
||||||
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.plugin.xmpp.XmppConfig;
|
|
||||||
|
|
||||||
public class VirtualFireAlarmUtilConstants {
|
public class VirtualFireAlarmUtilConstants {
|
||||||
|
|
||||||
|
|||||||
@ -30,7 +30,7 @@ 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.ConfigurationEntry;
|
||||||
import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationManagementException;
|
import org.wso2.carbon.device.mgt.common.configuration.mgt.ConfigurationManagementException;
|
||||||
import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration;
|
import org.wso2.carbon.device.mgt.common.configuration.mgt.PlatformConfiguration;
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.plugin.xmpp.XmppConfig;
|
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.xmpp.XmppConfig;
|
||||||
import org.wso2.carbon.utils.CarbonUtils;
|
import org.wso2.carbon.utils.CarbonUtils;
|
||||||
import org.wso2.carbon.utils.NetworkUtils;
|
import org.wso2.carbon.utils.NetworkUtils;
|
||||||
|
|
||||||
|
|||||||
@ -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.iot.virtualfirealarm.service.impl.xmpp;
|
||||||
|
|
||||||
|
|
||||||
|
public class VirtualFirealarmXMPPException extends Exception{
|
||||||
|
|
||||||
|
private String errorMessage;
|
||||||
|
|
||||||
|
public String getErrorMessage() {
|
||||||
|
return errorMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setErrorMessage(String errorMessage) {
|
||||||
|
this.errorMessage = errorMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public VirtualFirealarmXMPPException(String msg, Exception nestedEx) {
|
||||||
|
super(msg, nestedEx);
|
||||||
|
setErrorMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public VirtualFirealarmXMPPException(String message, Throwable cause) {
|
||||||
|
super(message, cause);
|
||||||
|
setErrorMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public VirtualFirealarmXMPPException(String msg) {
|
||||||
|
super(msg);
|
||||||
|
setErrorMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
public VirtualFirealarmXMPPException() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
public VirtualFirealarmXMPPException(Throwable cause) {
|
||||||
|
super(cause);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
* 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.iot.virtualfirealarm.service.impl.xmpp;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* holds the information related to account that needs to be created on xmpp server.
|
||||||
|
*/
|
||||||
|
public class XmppAccount {
|
||||||
|
|
||||||
|
private String username;
|
||||||
|
private String password;
|
||||||
|
private String accountName;
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAccountName() {
|
||||||
|
return accountName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAccountName(String accountName) {
|
||||||
|
this.accountName = accountName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getEmail() {
|
||||||
|
return email;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmail(String email) {
|
||||||
|
this.email = email;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* 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.iot.virtualfirealarm.service.impl.xmpp;
|
||||||
|
|
||||||
|
import org.apache.commons.logging.Log;
|
||||||
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Properties;
|
||||||
|
|
||||||
|
public class XmppConfig {
|
||||||
|
|
||||||
|
private String host;
|
||||||
|
private int port;
|
||||||
|
private String username;
|
||||||
|
private String password;
|
||||||
|
private String serverName;
|
||||||
|
private boolean enabled;
|
||||||
|
private String jid;
|
||||||
|
private static XmppConfig xmppConfig = new XmppConfig();
|
||||||
|
private static final Log log = LogFactory.getLog(XmppConfig.class);
|
||||||
|
private static final String ENABLED = "enabled";
|
||||||
|
private static final String USERNAME = "username";
|
||||||
|
private static final String PASSWORD = "password";
|
||||||
|
private static final String HOST = "host";
|
||||||
|
private static final String PORT = "port";
|
||||||
|
private static final String SERVERNAME = "serverName";
|
||||||
|
private static final String JID = "jid";
|
||||||
|
|
||||||
|
private XmppConfig() {
|
||||||
|
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
|
||||||
|
InputStream input = classLoader.getResourceAsStream("../xmpp.properties");
|
||||||
|
Properties properties = new Properties();
|
||||||
|
try {
|
||||||
|
properties.load(input);
|
||||||
|
enabled = Boolean.parseBoolean(properties.getProperty(ENABLED, "false"));
|
||||||
|
host = properties.getProperty(HOST);
|
||||||
|
port = Integer.parseInt(properties.getProperty(PORT));
|
||||||
|
username = properties.getProperty(USERNAME);
|
||||||
|
password = properties.getProperty(PASSWORD);
|
||||||
|
serverName = properties.getProperty(SERVERNAME);
|
||||||
|
jid = properties.getProperty(JID);
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error("Failed to load xmpp config properties.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static XmppConfig getInstance() {
|
||||||
|
return xmppConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getHost() {
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHost(String host) {
|
||||||
|
this.host = host;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPort() {
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPort(int port) {
|
||||||
|
this.port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getUsername() {
|
||||||
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUsername(String username) {
|
||||||
|
this.username = username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPassword(String password) {
|
||||||
|
this.password = password;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getServerName() {
|
||||||
|
return serverName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setServerName(String serverName) {
|
||||||
|
this.serverName = serverName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEnabled() {
|
||||||
|
return enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEnabled(boolean enabled) {
|
||||||
|
this.enabled = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getJid() {
|
||||||
|
return jid;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setJid(String jid) {
|
||||||
|
this.jid = jid;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* 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.iot.virtualfirealarm.service.impl.xmpp;
|
||||||
|
|
||||||
|
import org.jivesoftware.smack.AccountManager;
|
||||||
|
import org.jivesoftware.smack.ConnectionConfiguration;
|
||||||
|
import org.jivesoftware.smack.XMPPConnection;
|
||||||
|
import org.jivesoftware.smack.XMPPException;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
public class XmppServerClient {
|
||||||
|
|
||||||
|
public static boolean createAccount(XmppAccount xmppAccount) throws VirtualFirealarmXMPPException {
|
||||||
|
if (XmppConfig.getInstance().isEnabled()) {
|
||||||
|
if (xmppAccount != null) {
|
||||||
|
try {
|
||||||
|
ConnectionConfiguration config = new ConnectionConfiguration(XmppConfig.getInstance().getHost(),
|
||||||
|
XmppConfig.getInstance().getPort(),
|
||||||
|
"Accounts");
|
||||||
|
XMPPConnection xmppConnection = new XMPPConnection(config);
|
||||||
|
xmppConnection.connect();
|
||||||
|
xmppConnection.login(XmppConfig.getInstance().getUsername(), XmppConfig.getInstance().getPassword());
|
||||||
|
AccountManager accountManager = xmppConnection.getAccountManager();
|
||||||
|
Map<String, String> attributes = new HashMap<>();
|
||||||
|
attributes.put("username", xmppAccount.getUsername());
|
||||||
|
attributes.put("password", xmppAccount.getPassword());
|
||||||
|
attributes.put("email", xmppAccount.getEmail());
|
||||||
|
attributes.put("name", xmppAccount.getAccountName());
|
||||||
|
accountManager.createAccount(xmppAccount.getUsername(), xmppAccount.getPassword(), attributes);
|
||||||
|
xmppConnection.disconnect();
|
||||||
|
return true;
|
||||||
|
} catch (XMPPException e) {
|
||||||
|
if (e.getXMPPError().getCode() == 409) {
|
||||||
|
//AccountAlreadyExist
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
throw new VirtualFirealarmXMPPException(
|
||||||
|
"XMPP account creation failed. Error: " + e.getLocalizedMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
throw new VirtualFirealarmXMPPException("Invalid XMPP attributes");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -35,4 +35,6 @@
|
|||||||
<param-value>true</param-value>
|
<param-value>true</param-value>
|
||||||
</context-param>
|
</context-param>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</web-app>
|
</web-app>
|
||||||
@ -0,0 +1,25 @@
|
|||||||
|
#
|
||||||
|
# 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.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
|
||||||
|
#[XMPP-Configurations]
|
||||||
|
enabled=false
|
||||||
|
username=admin
|
||||||
|
password=admin
|
||||||
|
host=localhost
|
||||||
|
port=5222
|
||||||
|
serverName=localhost
|
||||||
|
jid=admin@localhost
|
||||||
@ -23,7 +23,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -21,7 +21,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -1,65 +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.scep.service.impl;
|
|
||||||
|
|
||||||
import javax.ws.rs.GET;
|
|
||||||
import javax.ws.rs.POST;
|
|
||||||
import javax.ws.rs.Path;
|
|
||||||
import javax.ws.rs.QueryParam;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
|
|
||||||
public interface VirtualFireAlarmScepServer {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is an API called/used by the SCEP Client of the VirtualFirealarm device in its SCEP enrollment process.
|
|
||||||
* This acts as the endpoint exposed as part of the SCEP-Server for use by a SCEP Client. This is one of the two
|
|
||||||
* method-signatures that takes different parameters according to the SCEP-Operation executed by the SCEP-Client
|
|
||||||
* of the enrolling device. The API supports 2 SCEP Operations [GetCACert] and [GetCACaps].
|
|
||||||
* <p/>
|
|
||||||
* Operation [GetCACert] returns the CA cert of the SCEP-Server for the device to verify its authenticity.
|
|
||||||
* Operation [GetCACaps] returns the CA Capabilities of the SCEP-Server.
|
|
||||||
*
|
|
||||||
* @param operation the SCEP operation requested by the client. [GetCACert] or [GetCACaps]
|
|
||||||
* @param message any messages pertaining to the requested SCEP Operation.
|
|
||||||
* @return an HTTP Response object with either the CA-Cert or the CA-Capabilities according to the operation.
|
|
||||||
*/
|
|
||||||
@GET
|
|
||||||
@Path("scep")
|
|
||||||
Response scepRequest(@QueryParam("operation") String operation, @QueryParam("message") String message);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This is an API called/used by the SCEP Client of the VirtualFirealarm device in its SCEP enrollment process.
|
|
||||||
* This acts as the endpoint exposed as part of the SCEP-Server for use by a SCEP Client. This is one of the two
|
|
||||||
* method-signatures that takes different parameters according to the SCEP-Operation executed by the SCEP-Client
|
|
||||||
* of the enrolling device. This API supports the SCEP Operation [PKIOperation].
|
|
||||||
* <p/>
|
|
||||||
* Operation [PKIOperation] returns a certificate generated by the SCEP-Server for the enrolling device.
|
|
||||||
*
|
|
||||||
* @param operation the final SCEP operation executed in the enrollment process - which is [PKIOperation]
|
|
||||||
* @param inputStream an input stream consisting of the Certificate-Signing-Request (CSR) from the device.
|
|
||||||
* @return an HTTP Response object with the signed certificate for the device by the CA of the SCEP Server.
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("scep")
|
|
||||||
Response scepRequestPost(@QueryParam("operation") String operation, InputStream inputStream);
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,136 +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.scep.service.impl;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
import org.wso2.carbon.certificate.mgt.core.dto.SCEPResponse;
|
|
||||||
import org.wso2.carbon.certificate.mgt.core.exception.KeystoreException;
|
|
||||||
import org.wso2.carbon.certificate.mgt.core.service.CertificateManagementService;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.scep.service.impl.exception.VirtualFireAlarmException;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.scep.service.impl.util.scep.ContentType;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.scep.service.impl.util.scep.SCEPOperation;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.scep.service.impl.util.VirtualFireAlarmServiceUtils;
|
|
||||||
|
|
||||||
import javax.ws.rs.GET;
|
|
||||||
import javax.ws.rs.POST;
|
|
||||||
import javax.ws.rs.Path;
|
|
||||||
import javax.ws.rs.QueryParam;
|
|
||||||
import javax.ws.rs.core.MediaType;
|
|
||||||
import javax.ws.rs.core.Response;
|
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
@SuppressWarnings("Non-Annoted WebService")
|
|
||||||
public class VirtualFireAlarmScepServerImpl implements VirtualFireAlarmScepServer {
|
|
||||||
|
|
||||||
private static Log log = LogFactory.getLog(VirtualFireAlarmScepServerImpl.class);
|
|
||||||
|
|
||||||
@GET
|
|
||||||
@Path("scep")
|
|
||||||
public Response scepRequest(@QueryParam("operation") String operation, @QueryParam("message") String message) {
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("Invoking SCEP operation " + operation);
|
|
||||||
}
|
|
||||||
if (SCEPOperation.GET_CA_CERT.getValue().equals(operation)) {
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("Invoking GetCACert");
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
CertificateManagementService certificateManagementService =
|
|
||||||
VirtualFireAlarmServiceUtils.getCertificateManagementService();
|
|
||||||
SCEPResponse scepResponse = certificateManagementService.getCACertSCEP();
|
|
||||||
Response.ResponseBuilder responseBuilder;
|
|
||||||
switch (scepResponse.getResultCriteria()) {
|
|
||||||
case CA_CERT_FAILED:
|
|
||||||
log.error("CA cert failed");
|
|
||||||
responseBuilder = Response.serverError();
|
|
||||||
break;
|
|
||||||
case CA_CERT_RECEIVED:
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("CA certificate received in GetCACert");
|
|
||||||
}
|
|
||||||
responseBuilder = Response.ok(scepResponse.getEncodedResponse(),
|
|
||||||
ContentType.X_X509_CA_CERT);
|
|
||||||
break;
|
|
||||||
case CA_RA_CERT_RECEIVED:
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("CA and RA certificates received in GetCACert");
|
|
||||||
}
|
|
||||||
responseBuilder = Response.ok(scepResponse.getEncodedResponse(),
|
|
||||||
ContentType.X_X509_CA_RA_CERT);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
log.error("Invalid SCEP request");
|
|
||||||
responseBuilder = Response.serverError();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return responseBuilder.build();
|
|
||||||
} catch (VirtualFireAlarmException e) {
|
|
||||||
log.error("Error occurred while enrolling the VirtualFireAlarm device", e);
|
|
||||||
} catch (KeystoreException e) {
|
|
||||||
log.error("Keystore error occurred while enrolling the VirtualFireAlarm device", e);
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (SCEPOperation.GET_CA_CAPS.getValue().equals(operation)) {
|
|
||||||
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("Invoking GetCACaps");
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
CertificateManagementService certificateManagementService = VirtualFireAlarmServiceUtils.
|
|
||||||
getCertificateManagementService();
|
|
||||||
byte caCaps[] = certificateManagementService.getCACapsSCEP();
|
|
||||||
|
|
||||||
return Response.ok(caCaps, MediaType.TEXT_PLAIN).build();
|
|
||||||
|
|
||||||
} catch (VirtualFireAlarmException e) {
|
|
||||||
log.error("Error occurred while enrolling the device", e);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
log.error("Invalid SCEP operation " + operation);
|
|
||||||
}
|
|
||||||
return Response.serverError().build();
|
|
||||||
}
|
|
||||||
|
|
||||||
@POST
|
|
||||||
@Path("scep")
|
|
||||||
public Response scepRequestPost(@QueryParam("operation") String operation, InputStream inputStream) {
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("Invoking SCEP operation " + operation);
|
|
||||||
}
|
|
||||||
if (SCEPOperation.PKI_OPERATION.getValue().equals(operation)) {
|
|
||||||
if (log.isDebugEnabled()) {
|
|
||||||
log.debug("Invoking PKIOperation");
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
CertificateManagementService certificateManagementService = VirtualFireAlarmServiceUtils.
|
|
||||||
getCertificateManagementService();
|
|
||||||
byte pkiMessage[] = certificateManagementService.getPKIMessageSCEP(inputStream);
|
|
||||||
return Response.ok(pkiMessage, ContentType.X_PKI_MESSAGE).build();
|
|
||||||
} catch (VirtualFireAlarmException e) {
|
|
||||||
log.error("Error occurred while enrolling the device", e);
|
|
||||||
} catch (KeystoreException e) {
|
|
||||||
log.error("Keystore error occurred while enrolling the device", e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Response.serverError().build();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.iot.virtualfirealarm.scep.service.impl.exception;
|
|
||||||
|
|
||||||
public class VirtualFireAlarmException extends Exception {
|
|
||||||
private static final long serialVersionUID = 118512086957330189L;
|
|
||||||
|
|
||||||
public VirtualFireAlarmException(String errorMessage) {
|
|
||||||
super(errorMessage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public VirtualFireAlarmException(String errorMessage, Throwable throwable) {
|
|
||||||
super(errorMessage, throwable);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,103 +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.scep.service.impl.util;
|
|
||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
|
||||||
import org.apache.commons.logging.LogFactory;
|
|
||||||
import org.wso2.carbon.certificate.mgt.core.exception.KeystoreException;
|
|
||||||
import org.wso2.carbon.certificate.mgt.core.service.CertificateManagementService;
|
|
||||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.scep.service.impl.exception.VirtualFireAlarmException;
|
|
||||||
|
|
||||||
import java.lang.*;
|
|
||||||
import java.security.PublicKey;
|
|
||||||
import java.security.cert.X509Certificate;
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
public class VirtualFireAlarmServiceUtils {
|
|
||||||
private static final Log log = LogFactory.getLog(VirtualFireAlarmServiceUtils.class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return
|
|
||||||
* @throws VirtualFireAlarmException
|
|
||||||
*/
|
|
||||||
public static CertificateManagementService getCertificateManagementService() throws VirtualFireAlarmException {
|
|
||||||
|
|
||||||
PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
|
|
||||||
CertificateManagementService certificateManagementService = (CertificateManagementService)
|
|
||||||
ctx.getOSGiService(CertificateManagementService.class, null);
|
|
||||||
|
|
||||||
if (certificateManagementService == null) {
|
|
||||||
String msg = "EnrollmentService is not initialized";
|
|
||||||
log.error(msg);
|
|
||||||
throw new VirtualFireAlarmException(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
return certificateManagementService;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @param deviceId
|
|
||||||
* @return
|
|
||||||
* @throws VirtualFireAlarmException
|
|
||||||
*/
|
|
||||||
public static PublicKey getDevicePublicKey(String deviceId) throws VirtualFireAlarmException {
|
|
||||||
PublicKey clientPublicKey;
|
|
||||||
String alias = "";
|
|
||||||
|
|
||||||
try {
|
|
||||||
alias += deviceId.hashCode();
|
|
||||||
|
|
||||||
CertificateManagementService certificateManagementService =
|
|
||||||
VirtualFireAlarmServiceUtils.getCertificateManagementService();
|
|
||||||
X509Certificate clientCertificate = (X509Certificate) certificateManagementService.getCertificateByAlias(
|
|
||||||
alias);
|
|
||||||
clientPublicKey = clientCertificate.getPublicKey();
|
|
||||||
|
|
||||||
} catch (VirtualFireAlarmException e) {
|
|
||||||
String errorMsg = "Could not retrieve CertificateManagementService from the runtime.";
|
|
||||||
if(log.isDebugEnabled()){
|
|
||||||
log.debug(errorMsg);
|
|
||||||
}
|
|
||||||
throw new VirtualFireAlarmException(errorMsg, e);
|
|
||||||
} catch (KeystoreException e) {
|
|
||||||
String errorMsg;
|
|
||||||
if (e.getMessage().contains("NULL_CERT")) {
|
|
||||||
errorMsg = "The Device-View page might have been accessed prior to the device being started.";
|
|
||||||
if(log.isDebugEnabled()){
|
|
||||||
log.debug(errorMsg);
|
|
||||||
}
|
|
||||||
throw new VirtualFireAlarmException(errorMsg, e);
|
|
||||||
} else {
|
|
||||||
errorMsg = "An error occurred whilst trying to retrieve certificate for deviceId [" + deviceId +
|
|
||||||
"] with alias: [" + alias + "]";
|
|
||||||
if(log.isDebugEnabled()){
|
|
||||||
log.debug(errorMsg);
|
|
||||||
}
|
|
||||||
throw new VirtualFireAlarmException(errorMsg, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return clientPublicKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,26 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.iot.virtualfirealarm.scep.service.impl.util.scep;
|
|
||||||
|
|
||||||
public class ContentType {
|
|
||||||
public static final String X_PKI_MESSAGE = "application/x-pki-message";
|
|
||||||
public static final String X_X509_CA_CERT = "application/x-x509-ca-cert";
|
|
||||||
public static final String X_X509_CA_RA_CERT = "application/x-x509-ca-ra-cert";
|
|
||||||
}
|
|
||||||
|
|
||||||
@ -1,39 +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.scep.service.impl.util.scep;
|
|
||||||
|
|
||||||
public enum SCEPOperation {
|
|
||||||
GET_CA_CERT("GetCACert"),
|
|
||||||
GET_CA_CAPS("GetCACaps"),
|
|
||||||
PKI_OPERATION("PKIOperation");
|
|
||||||
|
|
||||||
private String value;
|
|
||||||
|
|
||||||
private SCEPOperation(String value) {
|
|
||||||
this.setValue(value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getValue() {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setValue(String value) {
|
|
||||||
this.value = value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,33 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
~ Copyright 2005-2013 WSO2, Inc. (http://wso2.com)
|
|
||||||
~
|
|
||||||
~ Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
~ you may not use this file except in compliance with the License.
|
|
||||||
~ You may obtain a copy of the License at
|
|
||||||
~
|
|
||||||
~ http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
~
|
|
||||||
~ Unless required by applicable law or agreed to in writing, software
|
|
||||||
~ distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
~ See the License for the specific language governing permissions and
|
|
||||||
~ limitations under the License.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!--
|
|
||||||
This file defines class loading policy of the whole container. But this behaviour can be overridden by individual webapps by putting this file into the META-INF/ directory.
|
|
||||||
-->
|
|
||||||
<Classloading xmlns="http://wso2.org/projects/as/classloading">
|
|
||||||
|
|
||||||
<!-- Parent-first or child-first. Default behaviour is child-first.-->
|
|
||||||
<ParentFirst>false</ParentFirst>
|
|
||||||
|
|
||||||
<!--
|
|
||||||
Default environments that contains provides to all the webapps. This can be overridden by individual webapps by specifing required environments
|
|
||||||
Tomcat environment is the default and every webapps gets it even if they didn't specify it.
|
|
||||||
e.g. If a webapps requires CXF, they will get both Tomcat and CXF.
|
|
||||||
-->
|
|
||||||
<Environments>CXF,Carbon</Environments>
|
|
||||||
</Classloading>
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<!--
|
|
||||||
~ 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.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
|
|
||||||
xmlns="http://www.springframework.org/schema/beans"
|
|
||||||
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
|
|
||||||
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">
|
|
||||||
|
|
||||||
<jaxrs:server id="VirtualFireAlarmScepServer" address="/">
|
|
||||||
<jaxrs:serviceBeans>
|
|
||||||
<bean id="VirtualFireAlarmScepServerService"
|
|
||||||
class="org.wso2.carbon.device.mgt.iot.virtualfirealarm.scep.service.impl.VirtualFireAlarmScepServerImpl">
|
|
||||||
</bean>
|
|
||||||
</jaxrs:serviceBeans>
|
|
||||||
<jaxrs:providers>
|
|
||||||
<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"/>
|
|
||||||
</jaxrs:providers>
|
|
||||||
</jaxrs:server>
|
|
||||||
|
|
||||||
</beans>
|
|
||||||
|
|
||||||
@ -1,38 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<web-app version="2.5"
|
|
||||||
xmlns="http://java.sun.com/xml/ns/javaee"
|
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
||||||
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
|
|
||||||
metadata-complete="true">
|
|
||||||
<display-name>WSO2 IoT Server</display-name>
|
|
||||||
<description>WSO2 IoT Server</description>
|
|
||||||
|
|
||||||
<servlet>
|
|
||||||
<servlet-name>CXFServlet</servlet-name>
|
|
||||||
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
|
|
||||||
<load-on-startup>1</load-on-startup>
|
|
||||||
</servlet>
|
|
||||||
<servlet-mapping>
|
|
||||||
<servlet-name>CXFServlet</servlet-name>
|
|
||||||
<url-pattern>/*</url-pattern>
|
|
||||||
</servlet-mapping>
|
|
||||||
<context-param>
|
|
||||||
<param-name>isAdminService</param-name>
|
|
||||||
<param-value>false</param-value>
|
|
||||||
</context-param>
|
|
||||||
<context-param>
|
|
||||||
<param-name>doAuthentication</param-name>
|
|
||||||
<param-value>false</param-value>
|
|
||||||
</context-param>
|
|
||||||
<context-param>
|
|
||||||
<param-name>isSharedWithAllTenants</param-name>
|
|
||||||
<param-value>true</param-value>
|
|
||||||
</context-param>
|
|
||||||
|
|
||||||
<!--publish to apim-->
|
|
||||||
<context-param>
|
|
||||||
<param-name>managed-api-enabled</param-name>
|
|
||||||
<param-value>false</param-value>
|
|
||||||
</context-param>
|
|
||||||
|
|
||||||
</web-app>
|
|
||||||
@ -23,7 +23,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
<artifactId>virtual-fire-alarm-plugin</artifactId>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>device-types</artifactId>
|
<artifactId>device-types</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
@ -38,7 +38,7 @@
|
|||||||
<module>org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.impl</module>
|
<module>org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.advanced.impl</module>
|
||||||
<module>org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl</module>
|
<module>org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl</module>
|
||||||
<module>org.wso2.carbon.device.mgt.iot.virtualfirealarm.api</module>
|
<module>org.wso2.carbon.device.mgt.iot.virtualfirealarm.api</module>
|
||||||
<module>org.wso2.carbon.device.mgt.iot.virtualfirealarm.scep.api</module>
|
<module>org.wso2.carbon.device.mgt.iot.virtualfirealarm.analytics</module>
|
||||||
</modules>
|
</modules>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
@ -18,7 +18,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>appm-connector</artifactId>
|
<artifactId>appm-connector</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -22,7 +22,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>extensions</artifactId>
|
<artifactId>extensions</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../pom.xml</relativePath>
|
<relativePath>../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>cdmf-transport-adapters</artifactId>
|
<artifactId>cdmf-transport-adapters</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>cdmf-transport-adapters</artifactId>
|
<artifactId>cdmf-transport-adapters</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
|
|
||||||
|
|||||||
@ -186,7 +186,7 @@ public final class HTTPEventAdapter implements InputEventAdapter {
|
|||||||
"HttpService not available, Error in registering endpoint " + endpoint);
|
"HttpService not available, Error in registering endpoint " + endpoint);
|
||||||
}
|
}
|
||||||
httpService.registerServlet(endpoint, new HTTPMessageServlet(eventAdaptorListener, tenantId,
|
httpService.registerServlet(endpoint, new HTTPMessageServlet(eventAdaptorListener, tenantId,
|
||||||
eventAdapterConfiguration),
|
eventAdapterConfiguration, globalProperties),
|
||||||
new Hashtable(), httpService.createDefaultHttpContext());
|
new Hashtable(), httpService.createDefaultHttpContext());
|
||||||
} catch (ServletException | NamespaceException e) {
|
} catch (ServletException | NamespaceException e) {
|
||||||
throw new InputEventAdapterRuntimeException("Error in registering endpoint " + endpoint, e);
|
throw new InputEventAdapterRuntimeException("Error in registering endpoint " + endpoint, e);
|
||||||
|
|||||||
@ -66,7 +66,7 @@ public class HTTPEventAdapterFactory extends InputEventAdapterFactory {
|
|||||||
|
|
||||||
// Transport Exposed
|
// Transport Exposed
|
||||||
Property exposedTransportsProperty = new Property(HTTPEventAdapterConstants.EXPOSED_TRANSPORTS);
|
Property exposedTransportsProperty = new Property(HTTPEventAdapterConstants.EXPOSED_TRANSPORTS);
|
||||||
exposedTransportsProperty.setRequired(true);
|
exposedTransportsProperty.setRequired(false);
|
||||||
exposedTransportsProperty.setDisplayName(
|
exposedTransportsProperty.setDisplayName(
|
||||||
resourceBundle.getString(HTTPEventAdapterConstants.EXPOSED_TRANSPORTS));
|
resourceBundle.getString(HTTPEventAdapterConstants.EXPOSED_TRANSPORTS));
|
||||||
exposedTransportsProperty.setOptions(
|
exposedTransportsProperty.setOptions(
|
||||||
@ -75,45 +75,6 @@ public class HTTPEventAdapterFactory extends InputEventAdapterFactory {
|
|||||||
exposedTransportsProperty.setDefaultValue(HTTPEventAdapterConstants.ALL);
|
exposedTransportsProperty.setDefaultValue(HTTPEventAdapterConstants.ALL);
|
||||||
propertyList.add(exposedTransportsProperty);
|
propertyList.add(exposedTransportsProperty);
|
||||||
|
|
||||||
// OAUTH validation endpoint admin service username
|
|
||||||
Property username = new Property(HTTPEventAdapterConstants.USERNAME);
|
|
||||||
username.setRequired(true);
|
|
||||||
username.setDisplayName(resourceBundle.getString(HTTPEventAdapterConstants.USERNAME));
|
|
||||||
username.setHint(resourceBundle.getString(HTTPEventAdapterConstants.USERNAME_HINT));
|
|
||||||
propertyList.add(username);
|
|
||||||
|
|
||||||
// OAUTH validation endpoint admin service password
|
|
||||||
Property password = new Property(HTTPEventAdapterConstants.PASSWORD);
|
|
||||||
password.setRequired(true);
|
|
||||||
password.setDisplayName(resourceBundle.getString(HTTPEventAdapterConstants.PASSWORD));
|
|
||||||
password.setHint(resourceBundle.getString(HTTPEventAdapterConstants.PASSWORD_HINT));
|
|
||||||
propertyList.add(password);
|
|
||||||
|
|
||||||
// OAUTH validation endpoint
|
|
||||||
Property tokenValidationEndpoint = new Property(HTTPEventAdapterConstants.TOKEN_VALIDATION_ENDPOINT_URL);
|
|
||||||
tokenValidationEndpoint.setRequired(true);
|
|
||||||
tokenValidationEndpoint.setDisplayName(resourceBundle.getString(HTTPEventAdapterConstants.TOKEN_VALIDATION_ENDPOINT_URL));
|
|
||||||
tokenValidationEndpoint.setHint(resourceBundle.getString(HTTPEventAdapterConstants.TOKEN_VALIDATION_ENDPOINT_URL_HINT));
|
|
||||||
propertyList.add(tokenValidationEndpoint);
|
|
||||||
|
|
||||||
Property maximumHttpConnectionPerHost = new Property(HTTPEventAdapterConstants.MAXIMUM_HTTP_CONNECTION_PER_HOST);
|
|
||||||
maximumHttpConnectionPerHost.setRequired(true);
|
|
||||||
maximumHttpConnectionPerHost.setDisplayName(resourceBundle.getString(
|
|
||||||
HTTPEventAdapterConstants.MAXIMUM_HTTP_CONNECTION_PER_HOST));
|
|
||||||
maximumHttpConnectionPerHost.setHint(resourceBundle.getString(
|
|
||||||
HTTPEventAdapterConstants.MAXIMUM_HTTP_CONNECTION_PER_HOST_HINT));
|
|
||||||
maximumHttpConnectionPerHost.setDefaultValue(HTTPEventAdapterConstants.MAX_HTTP_CONNECTION);
|
|
||||||
propertyList.add(maximumHttpConnectionPerHost);
|
|
||||||
|
|
||||||
Property maxTotalHttpConnection = new Property(HTTPEventAdapterConstants.MAXIMUM_TOTAL_HTTP_CONNECTION);
|
|
||||||
maxTotalHttpConnection.setRequired(true);
|
|
||||||
maxTotalHttpConnection.setDisplayName(resourceBundle.getString(
|
|
||||||
HTTPEventAdapterConstants.MAXIMUM_TOTAL_HTTP_CONNECTION));
|
|
||||||
maxTotalHttpConnection.setHint(resourceBundle.getString(
|
|
||||||
HTTPEventAdapterConstants.MAXIMUM_TOTAL_HTTP_CONNECTION_HINT));
|
|
||||||
maxTotalHttpConnection.setDefaultValue(HTTPEventAdapterConstants.MAX_TOTAL_HTTP_CONNECTION);
|
|
||||||
propertyList.add(maxTotalHttpConnection);
|
|
||||||
|
|
||||||
//Content Validator details
|
//Content Validator details
|
||||||
Property contentValidator = new Property(HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME);
|
Property contentValidator = new Property(HTTPEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME);
|
||||||
contentValidator.setDisplayName(
|
contentValidator.setDisplayName(
|
||||||
|
|||||||
@ -60,7 +60,8 @@ public class HTTPMessageServlet extends HttpServlet {
|
|||||||
private static OAuthAuthenticator oAuthAuthenticator;
|
private static OAuthAuthenticator oAuthAuthenticator;
|
||||||
|
|
||||||
public HTTPMessageServlet(InputEventAdapterListener eventAdaptorListener, int tenantId,
|
public HTTPMessageServlet(InputEventAdapterListener eventAdaptorListener, int tenantId,
|
||||||
InputEventAdapterConfiguration eventAdapterConfiguration) {
|
InputEventAdapterConfiguration eventAdapterConfiguration,
|
||||||
|
Map<String, String> globalProperties) {
|
||||||
this.eventAdaptorListener = eventAdaptorListener;
|
this.eventAdaptorListener = eventAdaptorListener;
|
||||||
this.tenantId = tenantId;
|
this.tenantId = tenantId;
|
||||||
this.exposedTransports = eventAdapterConfiguration.getProperties().get(
|
this.exposedTransports = eventAdapterConfiguration.getProperties().get(
|
||||||
@ -107,7 +108,7 @@ public class HTTPMessageServlet extends HttpServlet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
jwtAuthenticator = new JWTAuthenticator();
|
jwtAuthenticator = new JWTAuthenticator();
|
||||||
oAuthAuthenticator = new OAuthAuthenticator(eventAdapterConfiguration);
|
oAuthAuthenticator = new OAuthAuthenticator(globalProperties);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -36,6 +36,7 @@ import org.wso2.carbon.utils.multitenancy.MultitenantUtils;
|
|||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.rmi.RemoteException;
|
import java.rmi.RemoteException;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@ -51,8 +52,8 @@ public class OAuthAuthenticator {
|
|||||||
private static final String AUTHORIZATION_HEADER = "Authorization";
|
private static final String AUTHORIZATION_HEADER = "Authorization";
|
||||||
private static Log log = LogFactory.getLog(OAuthAuthenticator.class);
|
private static Log log = LogFactory.getLog(OAuthAuthenticator.class);
|
||||||
|
|
||||||
public OAuthAuthenticator(InputEventAdapterConfiguration eventAdapterConfiguration) {
|
public OAuthAuthenticator(Map<String, String> globalProperties) {
|
||||||
this.stubs = new GenericObjectPool(new OAuthTokenValidaterStubFactory(eventAdapterConfiguration));
|
this.stubs = new GenericObjectPool(new OAuthTokenValidaterStubFactory(globalProperties));
|
||||||
}
|
}
|
||||||
|
|
||||||
public AuthenticationInfo authenticate(HttpServletRequest req) {
|
public AuthenticationInfo authenticate(HttpServletRequest req) {
|
||||||
|
|||||||
@ -34,7 +34,6 @@ import org.apache.commons.pool.BasePoolableObjectFactory;
|
|||||||
import org.apache.log4j.Logger;
|
import org.apache.log4j.Logger;
|
||||||
import org.wso2.carbon.core.util.Utils;
|
import org.wso2.carbon.core.util.Utils;
|
||||||
import org.wso2.carbon.device.mgt.input.adapter.http.oauth.exception.OAuthTokenValidationException;
|
import org.wso2.carbon.device.mgt.input.adapter.http.oauth.exception.OAuthTokenValidationException;
|
||||||
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterConfiguration;
|
|
||||||
import org.wso2.carbon.device.mgt.input.adapter.http.util.HTTPEventAdapterConstants;
|
import org.wso2.carbon.device.mgt.input.adapter.http.util.HTTPEventAdapterConstants;
|
||||||
import org.wso2.carbon.identity.oauth2.stub.OAuth2TokenValidationServiceStub;
|
import org.wso2.carbon.identity.oauth2.stub.OAuth2TokenValidationServiceStub;
|
||||||
|
|
||||||
@ -42,6 +41,7 @@ import java.io.IOException;
|
|||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.security.GeneralSecurityException;
|
import java.security.GeneralSecurityException;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This follows object pool pattern to manage the stub for oauth validation service.
|
* This follows object pool pattern to manage the stub for oauth validation service.
|
||||||
@ -49,11 +49,11 @@ import java.security.GeneralSecurityException;
|
|||||||
public class OAuthTokenValidaterStubFactory extends BasePoolableObjectFactory {
|
public class OAuthTokenValidaterStubFactory extends BasePoolableObjectFactory {
|
||||||
private static final Logger log = Logger.getLogger(OAuthTokenValidaterStubFactory.class);
|
private static final Logger log = Logger.getLogger(OAuthTokenValidaterStubFactory.class);
|
||||||
private HttpClient httpClient;
|
private HttpClient httpClient;
|
||||||
InputEventAdapterConfiguration eventAdapterConfiguration;
|
Map<String, String> globalProperties;
|
||||||
|
|
||||||
|
|
||||||
public OAuthTokenValidaterStubFactory(InputEventAdapterConfiguration eventAdapterConfiguration) {
|
public OAuthTokenValidaterStubFactory(Map<String, String> globalProperties) {
|
||||||
this.eventAdapterConfiguration = eventAdapterConfiguration;
|
this.globalProperties = globalProperties;
|
||||||
this.httpClient = createHttpClient();
|
this.httpClient = createHttpClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,9 +92,10 @@ public class OAuthTokenValidaterStubFactory extends BasePoolableObjectFactory {
|
|||||||
private OAuth2TokenValidationServiceStub generateStub() throws OAuthTokenValidationException {
|
private OAuth2TokenValidationServiceStub generateStub() throws OAuthTokenValidationException {
|
||||||
OAuth2TokenValidationServiceStub stub;
|
OAuth2TokenValidationServiceStub stub;
|
||||||
try {
|
try {
|
||||||
URL hostURL = new URL(Utils.replaceSystemProperty(eventAdapterConfiguration.getProperties().get(
|
URL hostURL = new URL(Utils.replaceSystemProperty(globalProperties.get(
|
||||||
HTTPEventAdapterConstants.TOKEN_VALIDATION_ENDPOINT_URL)));
|
HTTPEventAdapterConstants.TOKEN_VALIDATION_ENDPOINT_URL)
|
||||||
if (hostURL != null) {
|
+ HTTPEventAdapterConstants.TOKEN_VALIDATION_POST_FIX));
|
||||||
|
if (hostURL != null) {
|
||||||
stub = new OAuth2TokenValidationServiceStub(hostURL.toString());
|
stub = new OAuth2TokenValidationServiceStub(hostURL.toString());
|
||||||
if (stub != null) {
|
if (stub != null) {
|
||||||
ServiceClient client = stub._getServiceClient();
|
ServiceClient client = stub._getServiceClient();
|
||||||
@ -104,10 +105,8 @@ public class OAuthTokenValidaterStubFactory extends BasePoolableObjectFactory {
|
|||||||
HttpTransportProperties.Authenticator auth =
|
HttpTransportProperties.Authenticator auth =
|
||||||
new HttpTransportProperties.Authenticator();
|
new HttpTransportProperties.Authenticator();
|
||||||
auth.setPreemptiveAuthentication(true);
|
auth.setPreemptiveAuthentication(true);
|
||||||
String username = eventAdapterConfiguration.getProperties().get(HTTPEventAdapterConstants
|
String username = globalProperties.get(HTTPEventAdapterConstants.USERNAME);
|
||||||
.USERNAME);
|
String password = globalProperties.get(HTTPEventAdapterConstants.PASSWORD);
|
||||||
String password = eventAdapterConfiguration.getProperties().get(HTTPEventAdapterConstants
|
|
||||||
.PASSWORD);
|
|
||||||
auth.setPassword(username);
|
auth.setPassword(username);
|
||||||
auth.setUsername(password);
|
auth.setUsername(password);
|
||||||
Options options = client.getOptions();
|
Options options = client.getOptions();
|
||||||
@ -151,8 +150,7 @@ public class OAuthTokenValidaterStubFactory extends BasePoolableObjectFactory {
|
|||||||
*/
|
*/
|
||||||
private EasySSLProtocolSocketFactory createProtocolSocketFactory() throws OAuthTokenValidationException {
|
private EasySSLProtocolSocketFactory createProtocolSocketFactory() throws OAuthTokenValidationException {
|
||||||
try {
|
try {
|
||||||
EasySSLProtocolSocketFactory easySSLPSFactory = new EasySSLProtocolSocketFactory();
|
return new EasySSLProtocolSocketFactory();
|
||||||
return easySSLPSFactory;
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
String errorMsg = "Failed to initiate EasySSLProtocolSocketFactory.";
|
String errorMsg = "Failed to initiate EasySSLProtocolSocketFactory.";
|
||||||
throw new OAuthTokenValidationException(errorMsg, e);
|
throw new OAuthTokenValidationException(errorMsg, e);
|
||||||
@ -170,9 +168,9 @@ public class OAuthTokenValidaterStubFactory extends BasePoolableObjectFactory {
|
|||||||
*/
|
*/
|
||||||
private HttpClient createHttpClient() {
|
private HttpClient createHttpClient() {
|
||||||
HttpConnectionManagerParams params = new HttpConnectionManagerParams();
|
HttpConnectionManagerParams params = new HttpConnectionManagerParams();
|
||||||
params.setDefaultMaxConnectionsPerHost(Integer.parseInt(eventAdapterConfiguration.getProperties().get(
|
params.setDefaultMaxConnectionsPerHost(Integer.parseInt(globalProperties.get(
|
||||||
HTTPEventAdapterConstants.MAXIMUM_HTTP_CONNECTION_PER_HOST)));
|
HTTPEventAdapterConstants.MAXIMUM_HTTP_CONNECTION_PER_HOST)));
|
||||||
params.setMaxTotalConnections(Integer.parseInt(eventAdapterConfiguration.getProperties().get(
|
params.setMaxTotalConnections(Integer.parseInt(globalProperties.get(
|
||||||
HTTPEventAdapterConstants.MAXIMUM_TOTAL_HTTP_CONNECTION)));
|
HTTPEventAdapterConstants.MAXIMUM_TOTAL_HTTP_CONNECTION)));
|
||||||
HttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
|
HttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();
|
||||||
connectionManager.setParams(params);
|
connectionManager.setParams(params);
|
||||||
|
|||||||
@ -51,8 +51,8 @@ public final class HTTPEventAdapterConstants {
|
|||||||
public static final String MAXIMUM_TOTAL_HTTP_CONNECTION_HINT = "maximumTotalHttpConnection.hint";
|
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 = "maximumHttpConnectionPerHost";
|
||||||
public static final String MAXIMUM_HTTP_CONNECTION_PER_HOST_HINT = "maximumHttpConnectionPerHost.hint";
|
public static final String MAXIMUM_HTTP_CONNECTION_PER_HOST_HINT = "maximumHttpConnectionPerHost.hint";
|
||||||
public static final String TOKEN_VALIDATION_ENDPOINT_URL = "tokenValidationEndpointUrl";
|
public static final String TOKEN_VALIDATION_ENDPOINT_URL = "keymanagerUrl";
|
||||||
public static final String TOKEN_VALIDATION_ENDPOINT_URL_HINT = "tokenValidationEndpointUrl.hint";
|
public static final String TOKEN_VALIDATION_POST_FIX = "/services/OAuth2TokenValidationService";
|
||||||
public static final String USERNAME = "username";
|
public static final String USERNAME = "username";
|
||||||
public static final String USERNAME_HINT = "username.hint";
|
public static final String USERNAME_HINT = "username.hint";
|
||||||
public static final String PASSWORD = "password";
|
public static final String PASSWORD = "password";
|
||||||
|
|||||||
@ -22,16 +22,6 @@ http.usage.tips_mid1=/endpoints/<event_receiver_name></i></br> <
|
|||||||
http.usage.tips_mid2=/endpoints/<event_receiver_name></i></br></br>For other tenants:</br> <i>http://localhost:
|
http.usage.tips_mid2=/endpoints/<event_receiver_name></i></br></br>For other tenants:</br> <i>http://localhost:
|
||||||
http.usage.tips_mid3=/endpoints/t/<tenant_domain>/<event_receiver_name></i></br> <i>https://localhost:
|
http.usage.tips_mid3=/endpoints/t/<tenant_domain>/<event_receiver_name></i></br> <i>https://localhost:
|
||||||
http.usage.tips_postfix=/endpoints/t/<tenant_domain>/<event_receiver_name></i>
|
http.usage.tips_postfix=/endpoints/t/<tenant_domain>/<event_receiver_name></i>
|
||||||
tokenValidationEndpointUrl=tokenEndpointUrl
|
|
||||||
tokenValidationEndpointUrl.hint=OAUTH Token Validation Endpoint
|
|
||||||
username=username
|
|
||||||
username.hint=username of the user to connect to the admin services
|
|
||||||
password=password
|
|
||||||
password.hint=password of the user to connect to the admin services.
|
|
||||||
maximumTotalHttpConnection=maximumTotalHttpConnection
|
|
||||||
maximumTotalHttpConnection.hint=Maximum Total connection to be made with the endpoint
|
|
||||||
maximumHttpConnectionPerHost=maximumHttpConnectionPerHost
|
|
||||||
maximumHttpConnectionPerHost.hint=Maximum Http connection per host.
|
|
||||||
contentValidator=contentValidator
|
contentValidator=contentValidator
|
||||||
contentValidator.hint=Class Name of the content Validation or 'default' to set default class, required to implement (if required)
|
contentValidator.hint=Class Name of the content Validation or 'default' to set default class, required to implement (if required)
|
||||||
contentTransformer=contentTransformer
|
contentTransformer=contentTransformer
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>cdmf-transport-adapters</artifactId>
|
<artifactId>cdmf-transport-adapters</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
@ -60,10 +60,6 @@
|
|||||||
<groupId>com.googlecode.json-simple.wso2</groupId>
|
<groupId>com.googlecode.json-simple.wso2</groupId>
|
||||||
<artifactId>json-simple</artifactId>
|
<artifactId>json-simple</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.wso2.carbon.devicemgt</groupId>
|
|
||||||
<artifactId>org.wso2.carbon.identity.jwt.client.extension</artifactId>
|
|
||||||
</dependency>
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.jayway.jsonpath</groupId>
|
<groupId>com.jayway.jsonpath</groupId>
|
||||||
<artifactId>json-path</artifactId>
|
<artifactId>json-path</artifactId>
|
||||||
@ -128,7 +124,6 @@
|
|||||||
org.apache.http.client.methods;version="${httpclient.version.range}",
|
org.apache.http.client.methods;version="${httpclient.version.range}",
|
||||||
org.apache.http.impl.client;version="${httpclient.version.range}",
|
org.apache.http.impl.client;version="${httpclient.version.range}",
|
||||||
org.json.simple.*,
|
org.json.simple.*,
|
||||||
org.wso2.carbon.identity.jwt.client.extension.*,
|
|
||||||
com.jayway.jsonpath.*
|
com.jayway.jsonpath.*
|
||||||
</Import-Package>
|
</Import-Package>
|
||||||
<DynamicImport-Package>*</DynamicImport-Package>
|
<DynamicImport-Package>*</DynamicImport-Package>
|
||||||
|
|||||||
@ -53,29 +53,13 @@ public class MQTTEventAdapter implements InputEventAdapter {
|
|||||||
public void init(InputEventAdapterListener eventAdapterListener) throws InputEventAdapterException {
|
public void init(InputEventAdapterListener eventAdapterListener) throws InputEventAdapterException {
|
||||||
this.eventAdapterListener = eventAdapterListener;
|
this.eventAdapterListener = eventAdapterListener;
|
||||||
try {
|
try {
|
||||||
int keepAlive;
|
|
||||||
|
|
||||||
//If global properties are available those will be assigned else constant values will be assigned
|
|
||||||
if (globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_KEEP_ALIVE) != null) {
|
|
||||||
keepAlive = Integer.parseInt((globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_KEEP_ALIVE)));
|
|
||||||
} else {
|
|
||||||
keepAlive = MQTTEventAdapterConstants.ADAPTER_CONF_DEFAULT_KEEP_ALIVE;
|
|
||||||
}
|
|
||||||
mqttBrokerConnectionConfiguration = new MQTTBrokerConnectionConfiguration(
|
|
||||||
eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_URL),
|
|
||||||
eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME),
|
|
||||||
eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_SCOPES),
|
|
||||||
eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_DCR_URL),
|
|
||||||
eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_CLEAN_SESSION),
|
|
||||||
keepAlive,
|
|
||||||
eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME),
|
|
||||||
eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_TRANSFORMER_CLASSNAME)
|
|
||||||
);
|
|
||||||
mqttAdapterListener = new MQTTAdapterListener(mqttBrokerConnectionConfiguration,
|
|
||||||
eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_MESSAGE_TOPIC),
|
|
||||||
eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_CLIENTID),
|
|
||||||
eventAdapterListener, PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId());
|
|
||||||
|
|
||||||
|
mqttBrokerConnectionConfiguration = new MQTTBrokerConnectionConfiguration(eventAdapterConfiguration
|
||||||
|
,globalProperties);
|
||||||
|
mqttAdapterListener = new MQTTAdapterListener(mqttBrokerConnectionConfiguration
|
||||||
|
,eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_MESSAGE_TOPIC)
|
||||||
|
,eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_CLIENTID)
|
||||||
|
,eventAdapterListener, PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId());
|
||||||
} catch (Throwable t) {
|
} catch (Throwable t) {
|
||||||
throw new InputEventAdapterException(t.getMessage(), t);
|
throw new InputEventAdapterException(t.getMessage(), t);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -59,16 +59,10 @@ public class MQTTEventAdapterFactory extends InputEventAdapterFactory {
|
|||||||
//Broker Url
|
//Broker Url
|
||||||
Property brokerUrl = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_URL);
|
Property brokerUrl = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_URL);
|
||||||
brokerUrl.setDisplayName(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_URL));
|
brokerUrl.setDisplayName(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_URL));
|
||||||
brokerUrl.setRequired(true);
|
brokerUrl.setRequired(false);
|
||||||
brokerUrl.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_URL_HINT));
|
brokerUrl.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_URL_HINT));
|
||||||
propertyList.add(brokerUrl);
|
propertyList.add(brokerUrl);
|
||||||
|
|
||||||
//DCR endpoint details
|
|
||||||
Property dcrUrl = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_DCR_URL);
|
|
||||||
dcrUrl.setDisplayName(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_DCR_URL));
|
|
||||||
dcrUrl.setRequired(false);
|
|
||||||
dcrUrl.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_DCR_URL_HINT));
|
|
||||||
propertyList.add(dcrUrl);
|
|
||||||
|
|
||||||
//Content Validator details
|
//Content Validator details
|
||||||
Property contentValidator = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME);
|
Property contentValidator = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME);
|
||||||
@ -84,10 +78,18 @@ public class MQTTEventAdapterFactory extends InputEventAdapterFactory {
|
|||||||
Property userName = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME);
|
Property userName = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME);
|
||||||
userName.setDisplayName(
|
userName.setDisplayName(
|
||||||
resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME));
|
resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME));
|
||||||
userName.setRequired(false);
|
userName.setRequired(true);
|
||||||
userName.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME_HINT));
|
userName.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME_HINT));
|
||||||
propertyList.add(userName);
|
propertyList.add(userName);
|
||||||
|
|
||||||
|
//Broker Password
|
||||||
|
Property password = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD);
|
||||||
|
userName.setDisplayName(
|
||||||
|
resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD));
|
||||||
|
userName.setRequired(true);
|
||||||
|
userName.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD_HINT));
|
||||||
|
propertyList.add(password);
|
||||||
|
|
||||||
//Broker Required Scopes.
|
//Broker Required Scopes.
|
||||||
Property scopes = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_SCOPES);
|
Property scopes = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_SCOPES);
|
||||||
scopes.setDisplayName(
|
scopes.setDisplayName(
|
||||||
|
|||||||
@ -23,13 +23,9 @@ import org.osgi.service.component.ComponentContext;
|
|||||||
import org.osgi.service.http.HttpService;
|
import org.osgi.service.http.HttpService;
|
||||||
import org.wso2.carbon.device.mgt.input.adapter.mqtt.MQTTEventAdapterFactory;
|
import org.wso2.carbon.device.mgt.input.adapter.mqtt.MQTTEventAdapterFactory;
|
||||||
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterFactory;
|
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterFactory;
|
||||||
import org.wso2.carbon.user.core.service.RealmService;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @scr.component name="input.iot.mqtt.AdapterService.component" immediate="true"
|
* @scr.component name="input.iot.mqtt.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"
|
|
||||||
*/
|
*/
|
||||||
public class InputAdapterServiceComponent {
|
public class InputAdapterServiceComponent {
|
||||||
|
|
||||||
@ -48,14 +44,6 @@ public class InputAdapterServiceComponent {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setRealmService(RealmService realmService) {
|
|
||||||
InputAdapterServiceDataHolder.registerRealmService(realmService);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void unsetRealmService(RealmService realmService) {
|
|
||||||
InputAdapterServiceDataHolder.registerRealmService(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void setHttpService(HttpService httpService) {
|
protected void setHttpService(HttpService httpService) {
|
||||||
InputAdapterServiceDataHolder.registerHTTPService(httpService);
|
InputAdapterServiceDataHolder.registerHTTPService(httpService);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,28 +15,17 @@
|
|||||||
package org.wso2.carbon.device.mgt.input.adapter.mqtt.internal;
|
package org.wso2.carbon.device.mgt.input.adapter.mqtt.internal;
|
||||||
|
|
||||||
import org.osgi.service.http.HttpService;
|
import org.osgi.service.http.HttpService;
|
||||||
import org.wso2.carbon.user.core.service.RealmService;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* common place to hold some OSGI service references.
|
* common place to hold some OSGI service references.
|
||||||
*/
|
*/
|
||||||
public final class InputAdapterServiceDataHolder {
|
public final class InputAdapterServiceDataHolder {
|
||||||
|
|
||||||
private static RealmService realmService;
|
|
||||||
private static HttpService httpService;
|
private static HttpService httpService;
|
||||||
|
|
||||||
private InputAdapterServiceDataHolder() {
|
private InputAdapterServiceDataHolder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void registerRealmService(
|
|
||||||
RealmService realmService) {
|
|
||||||
InputAdapterServiceDataHolder.realmService = realmService;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static RealmService getRealmService() {
|
|
||||||
return realmService;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void registerHTTPService(
|
public static void registerHTTPService(
|
||||||
HttpService httpService) {
|
HttpService httpService) {
|
||||||
InputAdapterServiceDataHolder.httpService = httpService;
|
InputAdapterServiceDataHolder.httpService = httpService;
|
||||||
|
|||||||
@ -17,13 +17,18 @@
|
|||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.input.adapter.mqtt.util;
|
package org.wso2.carbon.device.mgt.input.adapter.mqtt.util;
|
||||||
|
|
||||||
|
import org.apache.commons.codec.binary.Base64;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
|
import org.apache.http.NameValuePair;
|
||||||
import org.apache.http.client.HttpClient;
|
import org.apache.http.client.HttpClient;
|
||||||
|
import org.apache.http.client.entity.UrlEncodedFormEntity;
|
||||||
import org.apache.http.client.methods.HttpPost;
|
import org.apache.http.client.methods.HttpPost;
|
||||||
import org.apache.http.entity.ContentType;
|
import org.apache.http.entity.ContentType;
|
||||||
import org.apache.http.entity.StringEntity;
|
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.*;
|
||||||
import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;
|
import org.eclipse.paho.client.mqttv3.persist.MqttDefaultFilePersistence;
|
||||||
import org.json.simple.JSONObject;
|
import org.json.simple.JSONObject;
|
||||||
@ -39,9 +44,6 @@ import org.wso2.carbon.device.mgt.input.adapter.extension.DefaultContentValidato
|
|||||||
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterListener;
|
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterListener;
|
||||||
import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterRuntimeException;
|
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.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 java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
@ -49,7 +51,9 @@ import java.net.URL;
|
|||||||
import java.security.KeyManagementException;
|
import java.security.KeyManagementException;
|
||||||
import java.security.KeyStoreException;
|
import java.security.KeyStoreException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public class MQTTAdapterListener implements MqttCallback, Runnable {
|
public class MQTTAdapterListener implements MqttCallback, Runnable {
|
||||||
@ -144,16 +148,14 @@ public class MQTTAdapterListener implements MqttCallback, Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void startListener() throws MqttException {
|
public void startListener() throws MqttException {
|
||||||
if (this.mqttBrokerConnectionConfiguration.getBrokerUsername() != null &&
|
if (this.mqttBrokerConnectionConfiguration.getUsername() != null &&
|
||||||
this.mqttBrokerConnectionConfiguration.getDcrUrl() != null) {
|
this.mqttBrokerConnectionConfiguration.getDcrUrl() != null) {
|
||||||
String username = this.mqttBrokerConnectionConfiguration.getBrokerUsername();
|
String username = this.mqttBrokerConnectionConfiguration.getUsername();
|
||||||
|
String password = this.mqttBrokerConnectionConfiguration.getPassword();
|
||||||
String dcrUrlString = this.mqttBrokerConnectionConfiguration.getDcrUrl();
|
String dcrUrlString = this.mqttBrokerConnectionConfiguration.getDcrUrl();
|
||||||
String scopes = this.mqttBrokerConnectionConfiguration.getBrokerScopes();
|
String scopes = this.mqttBrokerConnectionConfiguration.getBrokerScopes();
|
||||||
//getJWT Client Parameters.
|
//getJWT Client Parameters.
|
||||||
if (dcrUrlString != null && !dcrUrlString.isEmpty()) {
|
if (dcrUrlString != null && !dcrUrlString.isEmpty()) {
|
||||||
PrivilegedCarbonContext.startTenantFlow();
|
|
||||||
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenantId, true);
|
|
||||||
PrivilegedCarbonContext.getThreadLocalCarbonContext().setUsername(username);
|
|
||||||
try {
|
try {
|
||||||
URL dcrUrl = new URL(dcrUrlString);
|
URL dcrUrl = new URL(dcrUrlString);
|
||||||
HttpClient httpClient = MQTTUtil.getHttpClient(dcrUrl.getProtocol());
|
HttpClient httpClient = MQTTUtil.getHttpClient(dcrUrl.getProtocol());
|
||||||
@ -163,11 +165,15 @@ public class MQTTAdapterListener implements MqttCallback, Runnable {
|
|||||||
registrationProfile.setGrantType(MQTTEventAdapterConstants.GRANT_TYPE);
|
registrationProfile.setGrantType(MQTTEventAdapterConstants.GRANT_TYPE);
|
||||||
registrationProfile.setOwner(username);
|
registrationProfile.setOwner(username);
|
||||||
registrationProfile.setTokenScope(MQTTEventAdapterConstants.TOKEN_SCOPE);
|
registrationProfile.setTokenScope(MQTTEventAdapterConstants.TOKEN_SCOPE);
|
||||||
registrationProfile.setApplicationType(MQTTEventAdapterConstants.APPLICATION_TYPE);
|
registrationProfile.setClientName(MQTTEventAdapterConstants.APPLICATION_NAME_PREFIX
|
||||||
registrationProfile.setClientName(username + "_" + tenantId);
|
+ mqttBrokerConnectionConfiguration.getAdapterName() + "_" + tenantId);
|
||||||
String jsonString = registrationProfile.toJSON();
|
String jsonString = registrationProfile.toJSON();
|
||||||
StringEntity requestEntity = new StringEntity(jsonString, ContentType.APPLICATION_JSON);
|
StringEntity requestEntity = new StringEntity(jsonString, ContentType.APPLICATION_JSON);
|
||||||
postMethod.setEntity(requestEntity);
|
postMethod.setEntity(requestEntity);
|
||||||
|
String basicAuth = getBase64Encode(username, password);
|
||||||
|
postMethod.setHeader(new BasicHeader(MQTTEventAdapterConstants.AUTHORIZATION_HEADER_NAME,
|
||||||
|
MQTTEventAdapterConstants.AUTHORIZATION_HEADER_VALUE_PREFIX +
|
||||||
|
basicAuth));
|
||||||
HttpResponse httpResponse = httpClient.execute(postMethod);
|
HttpResponse httpResponse = httpClient.execute(postMethod);
|
||||||
if (httpResponse != null) {
|
if (httpResponse != null) {
|
||||||
String response = MQTTUtil.getResponseString(httpResponse);
|
String response = MQTTUtil.getResponseString(httpResponse);
|
||||||
@ -177,16 +183,10 @@ public class MQTTAdapterListener implements MqttCallback, Runnable {
|
|||||||
JSONObject jsonPayload = (JSONObject) jsonParser.parse(response);
|
JSONObject jsonPayload = (JSONObject) jsonParser.parse(response);
|
||||||
String clientId = (String) jsonPayload.get(MQTTEventAdapterConstants.CLIENT_ID);
|
String clientId = (String) jsonPayload.get(MQTTEventAdapterConstants.CLIENT_ID);
|
||||||
String clientSecret = (String) jsonPayload.get(MQTTEventAdapterConstants.CLIENT_SECRET);
|
String clientSecret = (String) jsonPayload.get(MQTTEventAdapterConstants.CLIENT_SECRET);
|
||||||
JWTClientManagerService jwtClientManagerService = MQTTUtil.getJWTClientManagerService();
|
connectionOptions.setUserName(getToken(clientId, clientSecret));
|
||||||
AccessTokenInfo accessTokenInfo = jwtClientManagerService.getJWTClient().getAccessToken(
|
|
||||||
clientId, clientSecret, username, scopes);
|
|
||||||
connectionOptions.setUserName(accessTokenInfo.getAccessToken());
|
|
||||||
}
|
}
|
||||||
} catch (ParseException e) {
|
} catch (ParseException e) {
|
||||||
String msg = "error occurred while parsing client credential payload";
|
String msg = "error occurred while parsing generating token for the adapter";
|
||||||
log.error(msg, e);
|
|
||||||
} catch (JWTClientException e) {
|
|
||||||
String msg = "error occurred while parsing the response from JWT Client";
|
|
||||||
log.error(msg, e);
|
log.error(msg, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -194,8 +194,6 @@ public class MQTTAdapterListener implements MqttCallback, Runnable {
|
|||||||
log.error("Invalid dcrUrl : " + dcrUrlString);
|
log.error("Invalid dcrUrl : " + dcrUrlString);
|
||||||
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException | IOException e) {
|
} catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException | IOException e) {
|
||||||
log.error("Failed to create an https connection.", e);
|
log.error("Failed to create an https connection.", e);
|
||||||
} finally {
|
|
||||||
PrivilegedCarbonContext.endTenantFlow();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -287,4 +285,39 @@ public class MQTTAdapterListener implements MqttCallback, Runnable {
|
|||||||
public boolean isConnectionInitialized() {
|
public boolean isConnectionInitialized() {
|
||||||
return connectionInitialized;
|
return connectionInitialized;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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<NameValuePair> 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
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) {
|
||||||
|
return new String(Base64.encodeBase64((key + ":" + value).getBytes()));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,28 +17,38 @@
|
|||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.input.adapter.mqtt.util;
|
package org.wso2.carbon.device.mgt.input.adapter.mqtt.util;
|
||||||
|
|
||||||
|
import org.wso2.carbon.event.input.adapter.core.InputEventAdapterConfiguration;
|
||||||
import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterException;
|
import org.wso2.carbon.event.input.adapter.core.exception.InputEventAdapterException;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This holds the configurations related to MQTT Broker.
|
* This holds the configurations related to MQTT Broker.
|
||||||
*/
|
*/
|
||||||
public class MQTTBrokerConnectionConfiguration {
|
public class MQTTBrokerConnectionConfiguration {
|
||||||
|
|
||||||
private String brokerUsername = null;
|
private String username = null;
|
||||||
|
private String password = null;
|
||||||
private String brokerScopes = null;
|
private String brokerScopes = null;
|
||||||
private boolean cleanSession = true;
|
private boolean cleanSession = true;
|
||||||
private int keepAlive;
|
private int keepAlive;
|
||||||
private String brokerUrl;
|
private String brokerUrl;
|
||||||
private String dcrUrl;
|
private String dcrUrl;
|
||||||
|
private String tokenUrl;
|
||||||
private String contentValidatorClassName;
|
private String contentValidatorClassName;
|
||||||
private String contentTransformerClassName;
|
private String contentTransformerClassName;
|
||||||
|
private String adapterName;
|
||||||
|
|
||||||
public String getBrokerScopes() {
|
public String getBrokerScopes() {
|
||||||
return brokerScopes;
|
return brokerScopes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getBrokerUsername() {
|
public String getUsername() {
|
||||||
return brokerUsername;
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isCleanSession() {
|
public boolean isCleanSession() {
|
||||||
@ -65,21 +75,44 @@ public class MQTTBrokerConnectionConfiguration {
|
|||||||
return contentTransformerClassName;
|
return contentTransformerClassName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MQTTBrokerConnectionConfiguration(String brokerUrl, String brokerUsername, String brokerScopes,
|
public String getTokenUrl() {
|
||||||
String dcrUrl, String cleanSession, int keepAlive,
|
return tokenUrl;
|
||||||
String contentValidatorClassName, String contentTransformerClassName) throws InputEventAdapterException {
|
}
|
||||||
this.brokerUsername = brokerUsername;
|
|
||||||
this.brokerScopes = brokerScopes;
|
public String getAdapterName() {
|
||||||
|
return adapterName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MQTTBrokerConnectionConfiguration(InputEventAdapterConfiguration eventAdapterConfiguration,
|
||||||
|
Map<String, String> globalProperties) throws InputEventAdapterException {
|
||||||
|
|
||||||
|
adapterName = eventAdapterConfiguration.getName();
|
||||||
|
this.username = eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME);
|
||||||
|
this.password = eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD);
|
||||||
|
this.brokerScopes = eventAdapterConfiguration.getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_SCOPES);
|
||||||
if (brokerScopes == null) {
|
if (brokerScopes == null) {
|
||||||
this.brokerScopes = MQTTEventAdapterConstants.EMPTY_STRING;
|
this.brokerScopes = MQTTEventAdapterConstants.EMPTY_STRING;
|
||||||
}
|
}
|
||||||
this.brokerUrl = PropertyUtils.replaceMqttProperty(brokerUrl);
|
String url = eventAdapterConfiguration .getProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_URL);
|
||||||
this.dcrUrl = PropertyUtils.replaceMqttProperty(dcrUrl);
|
if (url == null || url.isEmpty()) {
|
||||||
this.contentValidatorClassName = contentValidatorClassName;
|
url = globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_URL);
|
||||||
if (cleanSession != null) {
|
|
||||||
this.cleanSession = Boolean.parseBoolean(cleanSession);
|
|
||||||
}
|
}
|
||||||
this.keepAlive = keepAlive;
|
this.brokerUrl = PropertyUtils.replaceMqttProperty(url);
|
||||||
this.contentTransformerClassName = contentTransformerClassName;
|
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.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
|
||||||
|
if (globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_KEEP_ALIVE) != null) {
|
||||||
|
keepAlive = Integer.parseInt((globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_KEEP_ALIVE)));
|
||||||
|
} else {
|
||||||
|
keepAlive = MQTTEventAdapterConstants.ADAPTER_CONF_DEFAULT_KEEP_ALIVE;
|
||||||
|
}
|
||||||
|
this.contentTransformerClassName = eventAdapterConfiguration.getProperties()
|
||||||
|
.get(MQTTEventAdapterConstants.ADAPTER_CONF_CONTENT_TRANSFORMER_CLASSNAME);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,10 +27,13 @@ public class MQTTEventAdapterConstants {
|
|||||||
public static final String ADAPTER_CONF_URL = "url";
|
public static final String ADAPTER_CONF_URL = "url";
|
||||||
public static final String ADAPTER_CONF_USERNAME = "username";
|
public static final String ADAPTER_CONF_USERNAME = "username";
|
||||||
public static final String ADAPTER_CONF_USERNAME_HINT = "username.hint";
|
public static final String ADAPTER_CONF_USERNAME_HINT = "username.hint";
|
||||||
|
public static final String ADAPTER_CONF_PASSWORD = "password";
|
||||||
|
public static final String ADAPTER_CONF_PASSWORD_HINT = "password.hint";
|
||||||
public static final String ADAPTER_CONF_SCOPES = "scopes";
|
public static final String ADAPTER_CONF_SCOPES = "scopes";
|
||||||
public static final String ADAPTER_CONF_SCOPES_HINT = "scopes.hint";
|
public static final String ADAPTER_CONF_SCOPES_HINT = "scopes.hint";
|
||||||
public static final String ADAPTER_CONF_URL_HINT = "url.hint";
|
public static final String ADAPTER_CONF_URL_HINT = "url.hint";
|
||||||
public static final String ADAPTER_CONF_DCR_URL = "dcrUrl";
|
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_DCR_URL_HINT = "dcrUrl.hint";
|
||||||
public static final String ADAPTER_CONF_CONTENT_VALIDATOR_CLASSNAME = "contentValidator";
|
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_CLASSNAME_HINT = "contentValidator.hint";
|
||||||
@ -49,11 +52,12 @@ public class MQTTEventAdapterConstants {
|
|||||||
public static final int RECONNECTION_PROGRESS_FACTOR = 2;
|
public static final int RECONNECTION_PROGRESS_FACTOR = 2;
|
||||||
|
|
||||||
public static final String EMPTY_STRING = "";
|
public static final String EMPTY_STRING = "";
|
||||||
public static final String GRANT_TYPE = "urn:ietf:params:oauth:grant-type:jwt-bearer refresh_token";
|
public static final String GRANT_TYPE_PARAM_NAME = "grant_type";
|
||||||
|
public static final String GRANT_TYPE = "password refresh_token";
|
||||||
public static final String TOKEN_SCOPE = "production";
|
public static final String TOKEN_SCOPE = "production";
|
||||||
public static final String APPLICATION_TYPE = "device";
|
public static final String APPLICATION_NAME_PREFIX = "InputAdapter_";
|
||||||
public static final String CLIENT_ID = "client_id";
|
public static final String CLIENT_ID = "clientId";
|
||||||
public static final String CLIENT_SECRET = "client_secret";
|
public static final String CLIENT_SECRET = "clientSecret";
|
||||||
public static final String CLIENT_NAME = "client_name";
|
public static final String CLIENT_NAME = "client_name";
|
||||||
public static final String DEFAULT = "default";
|
public static final String DEFAULT = "default";
|
||||||
public static final String MQTT_CONTENT_VALIDATION_DEFAULT_PARAMETERS = "";
|
public static final String MQTT_CONTENT_VALIDATION_DEFAULT_PARAMETERS = "";
|
||||||
@ -62,4 +66,12 @@ public class MQTTEventAdapterConstants {
|
|||||||
public static final String DEVICE_ID_JSON_PATH = "event.metaData.deviceId";
|
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 DEVICE_TYPE_JSON_PATH = "event.metaData.deviceId";
|
||||||
public static final int DEVICE_ID_TOPIC_HIERARCHY_INDEX = 2;
|
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";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,8 +27,6 @@ import org.apache.http.conn.ssl.SSLContextBuilder;
|
|||||||
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
|
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
|
||||||
import org.apache.http.impl.client.HttpClients;
|
import org.apache.http.impl.client.HttpClients;
|
||||||
import org.apache.http.util.EntityUtils;
|
import org.apache.http.util.EntityUtils;
|
||||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
|
||||||
import org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -84,16 +82,4 @@ public class MQTTUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JWTClientManagerService getJWTClientManagerService() {
|
|
||||||
PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
|
|
||||||
JWTClientManagerService jwtClientManagerService =
|
|
||||||
(JWTClientManagerService) ctx.getOSGiService(JWTClientManagerService.class, null);
|
|
||||||
if (jwtClientManagerService == null) {
|
|
||||||
String msg = "JWT management service has not initialized.";
|
|
||||||
log.error(msg);
|
|
||||||
throw new IllegalStateException(msg);
|
|
||||||
}
|
|
||||||
return jwtClientManagerService;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,9 +20,11 @@ topic=Topic
|
|||||||
topic.hint=Topic subscribed
|
topic.hint=Topic subscribed
|
||||||
clientId=Client Id
|
clientId=Client Id
|
||||||
clientId.hint=client identifier is used by the server to identify a client when it reconnects, It used for durable subscriptions or reliable delivery of messages is required.
|
clientId.hint=client identifier is used by the server to identify a client when it reconnects, It used for durable subscriptions or reliable delivery of messages is required.
|
||||||
url=Broker Url
|
url=Broker Url (Not required), If it is not provided then it will connect to the default broker.
|
||||||
username=Username
|
username=Username
|
||||||
username.hint=Username of the broker (if required)
|
username.hint=Username of the broker (if required)
|
||||||
|
password=Password
|
||||||
|
password.hint=Password of the user for the broker (if required)
|
||||||
scopes=Scopes
|
scopes=Scopes
|
||||||
scopes.hint=Scopes required to connect to broker (if required)
|
scopes.hint=Scopes required to connect to broker (if required)
|
||||||
dcrUrl=dcrUrl
|
dcrUrl=dcrUrl
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>cdmf-transport-adapters</artifactId>
|
<artifactId>cdmf-transport-adapters</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
|||||||
@ -20,7 +20,7 @@
|
|||||||
<parent>
|
<parent>
|
||||||
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
<groupId>org.wso2.carbon.devicemgt-plugins</groupId>
|
||||||
<artifactId>cdmf-transport-adapters</artifactId>
|
<artifactId>cdmf-transport-adapters</artifactId>
|
||||||
<version>3.0.5-SNAPSHOT</version>
|
<version>3.0.6-SNAPSHOT</version>
|
||||||
<relativePath>../../pom.xml</relativePath>
|
<relativePath>../../pom.xml</relativePath>
|
||||||
</parent>
|
</parent>
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
@ -61,10 +61,6 @@
|
|||||||
<groupId>com.googlecode.json-simple.wso2</groupId>
|
<groupId>com.googlecode.json-simple.wso2</groupId>
|
||||||
<artifactId>json-simple</artifactId>
|
<artifactId>json-simple</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>org.wso2.carbon.devicemgt</groupId>
|
|
||||||
<artifactId>org.wso2.carbon.identity.jwt.client.extension</artifactId>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<build>
|
<build>
|
||||||
<plugins>
|
<plugins>
|
||||||
@ -122,7 +118,10 @@
|
|||||||
org.osgi.framework,
|
org.osgi.framework,
|
||||||
org.osgi.service.component,
|
org.osgi.service.component,
|
||||||
org.wso2.carbon.context,
|
org.wso2.carbon.context,
|
||||||
org.wso2.carbon.identity.jwt.client.extension.*
|
org.apache.commons.codec.binary,
|
||||||
|
org.apache.http.client.entity,
|
||||||
|
org.apache.http.message,
|
||||||
|
org.apache.commons.ssl
|
||||||
</Import-Package>
|
</Import-Package>
|
||||||
</instructions>
|
</instructions>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@ -118,19 +118,7 @@ public class MQTTEventAdapter implements OutputEventAdapter {
|
|||||||
@Override
|
@Override
|
||||||
public void connect() {
|
public void connect() {
|
||||||
MQTTBrokerConnectionConfiguration mqttBrokerConnectionConfiguration =
|
MQTTBrokerConnectionConfiguration mqttBrokerConnectionConfiguration =
|
||||||
new MQTTBrokerConnectionConfiguration(eventAdapterConfiguration.getStaticProperties()
|
new MQTTBrokerConnectionConfiguration(eventAdapterConfiguration, globalProperties);
|
||||||
.get(MQTTEventAdapterConstants.ADAPTER_CONF_URL),
|
|
||||||
eventAdapterConfiguration.getStaticProperties()
|
|
||||||
.get(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME),
|
|
||||||
eventAdapterConfiguration.getStaticProperties()
|
|
||||||
.get(MQTTEventAdapterConstants.ADAPTER_CONF_DCR_URL),
|
|
||||||
eventAdapterConfiguration.getStaticProperties()
|
|
||||||
.get(MQTTEventAdapterConstants.ADAPTER_CONF_SCOPES),
|
|
||||||
connectionKeepAliveInterval,
|
|
||||||
eventAdapterConfiguration.getStaticProperties()
|
|
||||||
.get(MQTTEventAdapterConstants.ADAPTER_CONF_CLEAN_SESSION)
|
|
||||||
);
|
|
||||||
|
|
||||||
String clientId = eventAdapterConfiguration.getStaticProperties().get(
|
String clientId = eventAdapterConfiguration.getStaticProperties().get(
|
||||||
MQTTEventAdapterConstants.ADAPTER_CONF_CLIENTID);
|
MQTTEventAdapterConstants.ADAPTER_CONF_CLIENTID);
|
||||||
qos = eventAdapterConfiguration.getStaticProperties().get(MQTTEventAdapterConstants.ADAPTER_MESSAGE_QOS);
|
qos = eventAdapterConfiguration.getStaticProperties().get(MQTTEventAdapterConstants.ADAPTER_MESSAGE_QOS);
|
||||||
|
|||||||
@ -50,7 +50,7 @@ public class MQTTEventAdapterFactory extends OutputEventAdapterFactory {
|
|||||||
//Broker Url
|
//Broker Url
|
||||||
Property brokerUrl = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_URL);
|
Property brokerUrl = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_URL);
|
||||||
brokerUrl.setDisplayName(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_URL));
|
brokerUrl.setDisplayName(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_URL));
|
||||||
brokerUrl.setRequired(true);
|
brokerUrl.setRequired(false);
|
||||||
brokerUrl.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_URL_HINT));
|
brokerUrl.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_URL_HINT));
|
||||||
|
|
||||||
//Broker Username
|
//Broker Username
|
||||||
@ -59,11 +59,11 @@ public class MQTTEventAdapterFactory extends OutputEventAdapterFactory {
|
|||||||
userName.setRequired(true);
|
userName.setRequired(true);
|
||||||
userName.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME_HINT));
|
userName.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME_HINT));
|
||||||
|
|
||||||
//Broker dcr URL
|
//Broker Password
|
||||||
Property dcrUrl = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_DCR_URL);
|
Property password = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD);
|
||||||
dcrUrl.setDisplayName(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_DCR_URL));
|
password.setDisplayName(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD));
|
||||||
dcrUrl.setRequired(true);
|
password.setRequired(true);
|
||||||
dcrUrl.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_DCR_URL_HINT));
|
password.setHint(resourceBundle.getString(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD_HINT));
|
||||||
|
|
||||||
//Broker Connection Scopes
|
//Broker Connection Scopes
|
||||||
Property scopes = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_SCOPES);
|
Property scopes = new Property(MQTTEventAdapterConstants.ADAPTER_CONF_SCOPES);
|
||||||
@ -95,10 +95,10 @@ public class MQTTEventAdapterFactory extends OutputEventAdapterFactory {
|
|||||||
|
|
||||||
staticPropertyList.add(brokerUrl);
|
staticPropertyList.add(brokerUrl);
|
||||||
staticPropertyList.add(userName);
|
staticPropertyList.add(userName);
|
||||||
staticPropertyList.add(dcrUrl);
|
|
||||||
staticPropertyList.add(scopes);
|
staticPropertyList.add(scopes);
|
||||||
staticPropertyList.add(clearSession);
|
staticPropertyList.add(clearSession);
|
||||||
staticPropertyList.add(qos);
|
staticPropertyList.add(qos);
|
||||||
|
staticPropertyList.add(password);
|
||||||
return staticPropertyList;
|
return staticPropertyList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -19,11 +19,16 @@ package org.wso2.carbon.device.mgt.output.adapter.mqtt.util;
|
|||||||
|
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.apache.commons.ssl.Base64;
|
||||||
import org.apache.http.HttpResponse;
|
import org.apache.http.HttpResponse;
|
||||||
|
import org.apache.http.NameValuePair;
|
||||||
import org.apache.http.client.HttpClient;
|
import org.apache.http.client.HttpClient;
|
||||||
|
import org.apache.http.client.entity.UrlEncodedFormEntity;
|
||||||
import org.apache.http.client.methods.HttpPost;
|
import org.apache.http.client.methods.HttpPost;
|
||||||
import org.apache.http.entity.ContentType;
|
import org.apache.http.entity.ContentType;
|
||||||
import org.apache.http.entity.StringEntity;
|
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.MqttClient;
|
||||||
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
|
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
|
||||||
import org.eclipse.paho.client.mqttv3.MqttException;
|
import org.eclipse.paho.client.mqttv3.MqttException;
|
||||||
@ -36,9 +41,6 @@ import org.wso2.carbon.context.PrivilegedCarbonContext;
|
|||||||
import org.wso2.carbon.event.output.adapter.core.exception.ConnectionUnavailableException;
|
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.OutputEventAdapterException;
|
||||||
import org.wso2.carbon.event.output.adapter.core.exception.OutputEventAdapterRuntimeException;
|
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 java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
@ -46,6 +48,8 @@ import java.net.URL;
|
|||||||
import java.security.KeyManagementException;
|
import java.security.KeyManagementException;
|
||||||
import java.security.KeyStoreException;
|
import java.security.KeyStoreException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MQTT publisher related configuration initialization and publishing capabilties are implemented here.
|
* MQTT publisher related configuration initialization and publishing capabilties are implemented here.
|
||||||
@ -77,10 +81,8 @@ public class MQTTAdapterPublisher {
|
|||||||
MqttConnectOptions connectionOptions = new MqttConnectOptions();
|
MqttConnectOptions connectionOptions = new MqttConnectOptions();
|
||||||
connectionOptions.setCleanSession(cleanSession);
|
connectionOptions.setCleanSession(cleanSession);
|
||||||
connectionOptions.setKeepAliveInterval(keepAlive);
|
connectionOptions.setKeepAliveInterval(keepAlive);
|
||||||
if (mqttBrokerConnectionConfiguration.getBrokerUsername() != null) {
|
if (mqttBrokerConnectionConfiguration.getUsername() != null) {
|
||||||
connectionOptions.setUserName(getToken(mqttBrokerConnectionConfiguration.getBrokerUsername(),
|
connectionOptions.setUserName(getToken());
|
||||||
mqttBrokerConnectionConfiguration.getDcrUrl(),
|
|
||||||
mqttBrokerConnectionConfiguration.getScopes()));
|
|
||||||
connectionOptions.setPassword(MQTTEventAdapterConstants.DEFAULT_PASSWORD.toCharArray());
|
connectionOptions.setPassword(MQTTEventAdapterConstants.DEFAULT_PASSWORD.toCharArray());
|
||||||
}
|
}
|
||||||
// Construct an MQTT blocking mode client
|
// Construct an MQTT blocking mode client
|
||||||
@ -139,7 +141,11 @@ public class MQTTAdapterPublisher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getToken(String username, String dcrUrlString, String scopes) {
|
private String getToken() {
|
||||||
|
String username = this.mqttBrokerConnectionConfiguration.getUsername();
|
||||||
|
String password = this.mqttBrokerConnectionConfiguration.getPassword();
|
||||||
|
String dcrUrlString = this.mqttBrokerConnectionConfiguration.getDcrUrl();
|
||||||
|
|
||||||
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
int tenantId = PrivilegedCarbonContext.getThreadLocalCarbonContext().getTenantId(true);
|
||||||
if (dcrUrlString != null && !dcrUrlString.isEmpty()) {
|
if (dcrUrlString != null && !dcrUrlString.isEmpty()) {
|
||||||
try {
|
try {
|
||||||
@ -147,32 +153,34 @@ public class MQTTAdapterPublisher {
|
|||||||
HttpClient httpClient = MQTTUtil.getHttpClient(dcrUrl.getProtocol());
|
HttpClient httpClient = MQTTUtil.getHttpClient(dcrUrl.getProtocol());
|
||||||
HttpPost postMethod = new HttpPost(dcrUrlString);
|
HttpPost postMethod = new HttpPost(dcrUrlString);
|
||||||
RegistrationProfile registrationProfile = new RegistrationProfile();
|
RegistrationProfile registrationProfile = new RegistrationProfile();
|
||||||
registrationProfile.setCallbackUrl(MQTTEventAdapterConstants.DEFAULT_CALLBACK);
|
registrationProfile.setCallbackUrl(MQTTEventAdapterConstants.EMPTY_STRING);
|
||||||
registrationProfile.setGrantType(MQTTEventAdapterConstants.GRANT_TYPE);
|
registrationProfile.setGrantType(MQTTEventAdapterConstants.GRANT_TYPE);
|
||||||
registrationProfile.setOwner(username);
|
registrationProfile.setOwner(username);
|
||||||
registrationProfile.setTokenScope(MQTTEventAdapterConstants.TOKEN_SCOPE);
|
registrationProfile.setTokenScope(MQTTEventAdapterConstants.TOKEN_SCOPE);
|
||||||
registrationProfile.setApplicationType(MQTTEventAdapterConstants.APPLICATION_TYPE);
|
registrationProfile.setClientName(MQTTEventAdapterConstants.APPLICATION_NAME_PREFIX
|
||||||
registrationProfile.setClientName(username + "_" + tenantId);
|
+ mqttBrokerConnectionConfiguration.getAdapterName() + "_" + tenantId);
|
||||||
String jsonString = registrationProfile.toJSON();
|
String jsonString = registrationProfile.toJSON();
|
||||||
StringEntity requestEntity = new StringEntity(jsonString, ContentType.APPLICATION_JSON);
|
StringEntity requestEntity = new StringEntity(jsonString, ContentType.APPLICATION_JSON);
|
||||||
postMethod.setEntity(requestEntity);
|
postMethod.setEntity(requestEntity);
|
||||||
|
String basicAuth = getBase64Encode(username, password);
|
||||||
|
postMethod.setHeader(new BasicHeader(MQTTEventAdapterConstants.AUTHORIZATION_HEADER_NAME,
|
||||||
|
MQTTEventAdapterConstants.AUTHORIZATION_HEADER_VALUE_PREFIX +
|
||||||
|
basicAuth));
|
||||||
HttpResponse httpResponse = httpClient.execute(postMethod);
|
HttpResponse httpResponse = httpClient.execute(postMethod);
|
||||||
String response = MQTTUtil.getResponseString(httpResponse);
|
if (httpResponse != null) {
|
||||||
try {
|
String response = MQTTUtil.getResponseString(httpResponse);
|
||||||
JSONParser jsonParser = new JSONParser();
|
try {
|
||||||
JSONObject jsonPayload = (JSONObject) jsonParser.parse(response);
|
if (response != null) {
|
||||||
String clientId = (String) jsonPayload.get(MQTTEventAdapterConstants.CLIENT_ID);
|
JSONParser jsonParser = new JSONParser();
|
||||||
String clientSecret = (String) jsonPayload.get(MQTTEventAdapterConstants.CLIENT_SECRET);
|
JSONObject jsonPayload = (JSONObject) jsonParser.parse(response);
|
||||||
JWTClientManagerService jwtClientManagerService = MQTTUtil.getJWTClientManagerService();
|
String clientId = (String) jsonPayload.get(MQTTEventAdapterConstants.CLIENT_ID);
|
||||||
AccessTokenInfo accessTokenInfo = jwtClientManagerService.getJWTClient().getAccessToken(
|
String clientSecret = (String) jsonPayload.get(MQTTEventAdapterConstants.CLIENT_SECRET);
|
||||||
clientId, clientSecret, username, scopes);
|
return getToken(clientId, clientSecret);
|
||||||
return accessTokenInfo.getAccessToken();
|
}
|
||||||
} catch (ParseException e) {
|
} catch (ParseException e) {
|
||||||
String msg = "error occurred while parsing client credential payload";
|
String msg = "error occurred while parsing generating token for the adapter";
|
||||||
throw new OutputEventAdapterRuntimeException(msg, e);
|
log.error(msg, e);
|
||||||
} catch (JWTClientException e) {
|
}
|
||||||
String msg = "error occurred while parsing the response from JWT Client";
|
|
||||||
throw new OutputEventAdapterRuntimeException(msg, e);
|
|
||||||
}
|
}
|
||||||
} catch (MalformedURLException e) {
|
} catch (MalformedURLException e) {
|
||||||
throw new OutputEventAdapterRuntimeException("Invalid dcrUrl : " + dcrUrlString);
|
throw new OutputEventAdapterRuntimeException("Invalid dcrUrl : " + dcrUrlString);
|
||||||
@ -183,4 +191,39 @@ public class MQTTAdapterPublisher {
|
|||||||
throw new OutputEventAdapterRuntimeException("Invalid configuration for mqtt publisher");
|
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<NameValuePair> 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));
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
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) {
|
||||||
|
return new String(Base64.encodeBase64((key + ":" + value).getBytes()));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,14 +17,25 @@
|
|||||||
*/
|
*/
|
||||||
package org.wso2.carbon.device.mgt.output.adapter.mqtt.util;
|
package org.wso2.carbon.device.mgt.output.adapter.mqtt.util;
|
||||||
|
|
||||||
|
import org.wso2.carbon.event.output.adapter.core.OutputEventAdapterConfiguration;
|
||||||
|
import org.wso2.carbon.event.output.adapter.core.exception.OutputEventAdapterException;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class MQTTBrokerConnectionConfiguration {
|
public class MQTTBrokerConnectionConfiguration {
|
||||||
|
|
||||||
private String brokerUsername;
|
private String adapterName;
|
||||||
|
private String username;
|
||||||
|
private String password;
|
||||||
private String dcrUrl;
|
private String dcrUrl;
|
||||||
private String scopes;
|
private String scopes;
|
||||||
private String brokerUrl;
|
private String brokerUrl;
|
||||||
|
private String tokenUrl;
|
||||||
private boolean cleanSession = true;
|
private boolean cleanSession = true;
|
||||||
private int keepAlive;
|
private int keepAlive;
|
||||||
|
public String getTokenUrl() {
|
||||||
|
return tokenUrl;
|
||||||
|
}
|
||||||
|
|
||||||
public String getDcrUrl() {
|
public String getDcrUrl() {
|
||||||
return dcrUrl;
|
return dcrUrl;
|
||||||
@ -34,8 +45,12 @@ public class MQTTBrokerConnectionConfiguration {
|
|||||||
return scopes;
|
return scopes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getBrokerUsername() {
|
public String getUsername() {
|
||||||
return brokerUsername;
|
return username;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPassword() {
|
||||||
|
return password;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isCleanSession() {
|
public boolean isCleanSession() {
|
||||||
@ -50,15 +65,35 @@ public class MQTTBrokerConnectionConfiguration {
|
|||||||
return keepAlive;
|
return keepAlive;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MQTTBrokerConnectionConfiguration(String brokerUrl, String brokerUsername,
|
public String getAdapterName() {
|
||||||
String dcrUrl, String scopes, int keepAlive, String cleanSession) {
|
return adapterName;
|
||||||
this.brokerUsername = brokerUsername;
|
}
|
||||||
this.dcrUrl = dcrUrl;
|
|
||||||
this.scopes = scopes;
|
public MQTTBrokerConnectionConfiguration(OutputEventAdapterConfiguration eventAdapterConfiguration,
|
||||||
this.brokerUrl = brokerUrl;
|
Map<String, String> globalProperties) {
|
||||||
this.keepAlive = keepAlive;
|
adapterName = eventAdapterConfiguration.getName();
|
||||||
if (cleanSession != null) {
|
this.username = eventAdapterConfiguration.getStaticProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_USERNAME);
|
||||||
this.cleanSession = Boolean.parseBoolean(cleanSession);
|
this.password = eventAdapterConfiguration.getStaticProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_PASSWORD);
|
||||||
|
String url = eventAdapterConfiguration .getStaticProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_URL);
|
||||||
|
if (url == null || url.isEmpty()) {
|
||||||
|
url = globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_URL);
|
||||||
|
}
|
||||||
|
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.scopes = eventAdapterConfiguration.getStaticProperties().get(MQTTEventAdapterConstants.ADAPTER_CONF_SCOPES);
|
||||||
|
if (scopes == null) {
|
||||||
|
this.scopes = MQTTEventAdapterConstants.EMPTY_STRING;
|
||||||
|
}
|
||||||
|
this.cleanSession = Boolean.parseBoolean(eventAdapterConfiguration.getStaticProperties()
|
||||||
|
.get(MQTTEventAdapterConstants.ADAPTER_CONF_CLEAN_SESSION));
|
||||||
|
//If global properties are available those will be assigned else constant values will be assigned
|
||||||
|
if (globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_KEEP_ALIVE) != null) {
|
||||||
|
keepAlive = Integer.parseInt((globalProperties.get(MQTTEventAdapterConstants.ADAPTER_CONF_KEEP_ALIVE)));
|
||||||
|
} else {
|
||||||
|
keepAlive = MQTTEventAdapterConstants.ADAPTER_CONF_DEFAULT_KEEP_ALIVE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -27,8 +27,10 @@ public final class MQTTEventAdapterConstants {
|
|||||||
public static final String ADAPTER_CONF_URL = "url";
|
public static final String ADAPTER_CONF_URL = "url";
|
||||||
public static final String ADAPTER_CONF_USERNAME = "username";
|
public static final String ADAPTER_CONF_USERNAME = "username";
|
||||||
public static final String ADAPTER_CONF_USERNAME_HINT = "username.hint";
|
public static final String ADAPTER_CONF_USERNAME_HINT = "username.hint";
|
||||||
|
public static final String ADAPTER_CONF_PASSWORD = "password";
|
||||||
|
public static final String ADAPTER_CONF_PASSWORD_HINT = "password.hint";
|
||||||
public static final String ADAPTER_CONF_DCR_URL = "dcrUrl";
|
public static final String ADAPTER_CONF_DCR_URL = "dcrUrl";
|
||||||
public static final String ADAPTER_CONF_DCR_URL_HINT = "dcrUrl.hint";
|
public static final String ADAPTER_CONF_TOKEN_URL = "tokenUrl";
|
||||||
public static final String ADAPTER_CONF_SCOPES = "scopes";
|
public static final String ADAPTER_CONF_SCOPES = "scopes";
|
||||||
public static final String ADAPTER_CONF_SCOPES_HINT = "scopes.hint";
|
public static final String ADAPTER_CONF_SCOPES_HINT = "scopes.hint";
|
||||||
public static final String ADAPTER_CONF_URL_HINT = "url.hint";
|
public static final String ADAPTER_CONF_URL_HINT = "url.hint";
|
||||||
@ -41,6 +43,9 @@ public final class MQTTEventAdapterConstants {
|
|||||||
public static final String ADAPTER_TEMP_DIRECTORY_NAME = "java.io.tmpdir";
|
public static final String ADAPTER_TEMP_DIRECTORY_NAME = "java.io.tmpdir";
|
||||||
public static final String ADAPTER_CONF_CLIENTID = "clientId";
|
public static final String ADAPTER_CONF_CLIENTID = "clientId";
|
||||||
public static final String ADAPTER_CONF_CLIENTID_HINT = "clientId.hint";
|
public static final String ADAPTER_CONF_CLIENTID_HINT = "clientId.hint";
|
||||||
|
public static final String EMPTY_STRING = "";
|
||||||
|
public static final String ADAPTER_CONF_KEEP_ALIVE = "keepAlive";
|
||||||
|
public static final int ADAPTER_CONF_DEFAULT_KEEP_ALIVE = 60000;
|
||||||
|
|
||||||
public static final int DEFAULT_MIN_THREAD_POOL_SIZE = 8;
|
public static final int DEFAULT_MIN_THREAD_POOL_SIZE = 8;
|
||||||
public static final int DEFAULT_MAX_THREAD_POOL_SIZE = 100;
|
public static final int DEFAULT_MAX_THREAD_POOL_SIZE = 100;
|
||||||
@ -53,9 +58,19 @@ public final class MQTTEventAdapterConstants {
|
|||||||
|
|
||||||
public static final String DEFAULT_CALLBACK = "";
|
public static final String DEFAULT_CALLBACK = "";
|
||||||
public static final String DEFAULT_PASSWORD = "";
|
public static final String DEFAULT_PASSWORD = "";
|
||||||
public static final String GRANT_TYPE = "urn:ietf:params:oauth:grant-type:jwt-bearer refresh_token";
|
public static final String GRANT_TYPE = "password";
|
||||||
public static final String TOKEN_SCOPE = "production";
|
public static final String TOKEN_SCOPE = "production";
|
||||||
public static final String APPLICATION_TYPE = "device";
|
public static final String APPLICATION_NAME_PREFIX = "OutputAdapter_";
|
||||||
public static final String CLIENT_ID = "client_id";
|
public static final String CLIENT_ID = "clientId";
|
||||||
public static final String CLIENT_SECRET = "client_secret";
|
public static final String CLIENT_SECRET = "clientSecret";
|
||||||
|
|
||||||
|
|
||||||
|
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";
|
||||||
|
public static final String GRANT_TYPE_PARAM_NAME = "grant_type";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,7 +28,6 @@ import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
|
|||||||
import org.apache.http.impl.client.HttpClients;
|
import org.apache.http.impl.client.HttpClients;
|
||||||
import org.apache.http.util.EntityUtils;
|
import org.apache.http.util.EntityUtils;
|
||||||
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
import org.wso2.carbon.context.PrivilegedCarbonContext;
|
||||||
import org.wso2.carbon.identity.jwt.client.extension.service.JWTClientManagerService;
|
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -85,15 +84,4 @@ public class MQTTUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JWTClientManagerService getJWTClientManagerService() {
|
|
||||||
PrivilegedCarbonContext ctx = PrivilegedCarbonContext.getThreadLocalCarbonContext();
|
|
||||||
JWTClientManagerService jwtClientManagerService =
|
|
||||||
(JWTClientManagerService) ctx.getOSGiService(JWTClientManagerService.class, null);
|
|
||||||
if (jwtClientManagerService == null) {
|
|
||||||
String msg = "JWT management service has not initialized.";
|
|
||||||
log.error(msg);
|
|
||||||
throw new IllegalStateException(msg);
|
|
||||||
}
|
|
||||||
return jwtClientManagerService;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,40 @@
|
|||||||
|
/*
|
||||||
|
* 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.output.adapter.mqtt.util;
|
||||||
|
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
class PropertyUtils {
|
||||||
|
|
||||||
|
//This method is only used if the mb features are within DAS.
|
||||||
|
static String replaceMqttProperty(String urlWithPlaceholders) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return urlWithPlaceholders;
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user