From 75914aee4ecaf9cc6e4a9c4a5cfd4ddc17275546 Mon Sep 17 00:00:00 2001 From: Shabirmean Date: Sat, 21 May 2016 01:46:34 +0530 Subject: [PATCH] Changes to the VirtualFirealarm Agent + the API to enable token refresh upon expiration --- .../http/FireAlarmHTTPCommunicator.java | 53 ++-- .../mqtt/FireAlarmMQTTCommunicator.java | 2 +- .../agent/core/AgentConfiguration.java | 283 +++++++++--------- .../agent/core/AgentConstants.java | 176 +++++------ .../agent/core/AgentManager.java | 16 +- .../agent/core/AgentUtilOperations.java | 180 ++++++++++- .../main/resources/deviceConfig.properties | 2 +- .../impl/VirtualFireAlarmServiceImpl.java | 42 ++- .../util/VirtualFireAlarmUtilConstants.java | 20 ++ .../service/impl/util/ZipUtil.java | 53 +++- .../advanced_agent/deviceConfig.properties | 1 + 11 files changed, 526 insertions(+), 302 deletions(-) create mode 100644 components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/VirtualFireAlarmUtilConstants.java diff --git a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/communication/http/FireAlarmHTTPCommunicator.java b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/communication/http/FireAlarmHTTPCommunicator.java index 0f920e0d0..98dbc6dc7 100644 --- a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/communication/http/FireAlarmHTTPCommunicator.java +++ b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/communication/http/FireAlarmHTTPCommunicator.java @@ -23,12 +23,12 @@ import org.apache.commons.logging.LogFactory; import org.eclipse.jetty.http.HttpStatus; import org.eclipse.jetty.server.Request; import org.eclipse.jetty.server.handler.AbstractHandler; -import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportHandlerException; -import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportUtils; -import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.http.HTTPTransportHandler; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core.AgentConstants; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core.AgentManager; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.exception.AgentCoreOperationException; +import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportHandlerException; +import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportUtils; +import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.http.HTTPTransportHandler; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -191,21 +191,19 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler { private void executeDataPush(String pushDataPayload) { AgentManager agentManager = AgentManager.getInstance(); - int responseCode = -1; String pushDataEndPointURL = agentManager.getPushDataAPIEP(); - HttpURLConnection httpConnection = null; + HttpURLConnection httpConnection; + int responseCode = -1; try { httpConnection = TransportUtils.getHttpConnection(agentManager.getPushDataAPIEP()); httpConnection.setRequestMethod(AgentConstants.HTTP_POST); - httpConnection.setRequestProperty("Authorization", "Bearer " + - agentManager.getAgentConfigs().getAuthToken()); - httpConnection.setRequestProperty("Content-Type", - AgentConstants.APPLICATION_JSON_TYPE); + httpConnection.setRequestProperty("Authorization", + "Bearer " + agentManager.getAgentConfigs().getAuthToken()); + httpConnection.setRequestProperty("Content-Type", AgentConstants.APPLICATION_JSON); httpConnection.setDoOutput(true); - DataOutputStream dataOutPutWriter = new DataOutputStream( - httpConnection.getOutputStream()); + DataOutputStream dataOutPutWriter = new DataOutputStream(httpConnection.getOutputStream()); dataOutPutWriter.writeBytes(pushDataPayload); dataOutPutWriter.flush(); dataOutPutWriter.close(); @@ -225,39 +223,34 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler { } catch (IOException exception) { String errorMsg = "An IO error occurred whilst trying to get the response code from: " + - pushDataEndPointURL + " for a " + AgentConstants.HTTP_POST + - " " + "method."; + pushDataEndPointURL + " for a " + AgentConstants.HTTP_POST + " method."; log.error(AgentConstants.LOG_APPENDER + errorMsg); } catch (TransportHandlerException exception) { log.error(AgentConstants.LOG_APPENDER + - "Error encountered whilst trying to create HTTP-Connection " + - "to IoT-Server EP at: " + + "Error encountered whilst trying to create HTTP-Connection to IoT-Server EP at: " + pushDataEndPointURL); } if (responseCode == HttpStatus.CONFLICT_409 || responseCode == HttpStatus.PRECONDITION_FAILED_412) { log.warn(AgentConstants.LOG_APPENDER + - "DeviceIP is being Re-Registered due to Push-Data failure " + - "with response code: " + + "DeviceIP is being Re-Registered due to Push-Data failure with response code: " + responseCode); registerThisDevice(); } else if (responseCode != HttpStatus.NO_CONTENT_204) { if (log.isDebugEnabled()) { log.error(AgentConstants.LOG_APPENDER + "Status Code: " + responseCode + - " encountered whilst trying to Push-Device-Data to IoT " + - "Server at: " + + " encountered whilst trying to Push-Device-Data to IoT Server at: " + agentManager.getPushDataAPIEP()); } agentManager.updateAgentStatus(AgentConstants.SERVER_NOT_RESPONDING); } if (log.isDebugEnabled()) { - log.debug(AgentConstants.LOG_APPENDER + "Push-Data call with payload - " + - pushDataPayload + ", to IoT Server returned status " + - responseCode); + log.debug(AgentConstants.LOG_APPENDER + "Push-Data call with payload - " + pushDataPayload + + ", to IoT Server returned status " + responseCode); } } @@ -272,16 +265,14 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler { closeConnection(); } catch (Exception e) { if (log.isDebugEnabled()) { - log.warn(AgentConstants.LOG_APPENDER + - "Unable to 'STOP' HTTP server at port: " + port); + log.warn(AgentConstants.LOG_APPENDER + "Unable to 'STOP' HTTP server at port: " + port); } try { Thread.sleep(timeoutInterval); } catch (InterruptedException e1) { - log.error(AgentConstants.LOG_APPENDER + - "HTTP-Termination: Thread Sleep Interrupt " + - "Exception"); + log.error( + AgentConstants.LOG_APPENDER + "HTTP-Termination: Thread Sleep Interrupt Exception"); } } } @@ -398,8 +389,7 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler { } catch (TransportHandlerException e) { String errorMsg = "Protocol specific error occurred when trying to fetch an HTTPConnection to:" + - " " + - registerEndpointURLString; + " " + registerEndpointURLString; log.error(AgentConstants.LOG_APPENDER + errorMsg); throw new AgentCoreOperationException(); } @@ -419,8 +409,7 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler { } catch (IOException exception) { String errorMsg = "An IO error occurred whilst trying to get the response code from:" + - " " + - registerEndpointURLString + " for a " + AgentConstants.HTTP_POST + " method."; + " " + registerEndpointURLString + " for a " + AgentConstants.HTTP_POST + " method."; log.error(AgentConstants.LOG_APPENDER + errorMsg); throw new AgentCoreOperationException(errorMsg, exception); } @@ -436,7 +425,7 @@ public class FireAlarmHTTPCommunicator extends HTTPTransportHandler { /*------------------------------------------------------------------------------------------*/ /* Utility methods relevant to creating and sending HTTP requests to the Iot-Server */ - /*------------------------------------------------------------------------------------------*/ + /*------------------------------------------------------------------------------------------*/ /** * This method is used to get the IP of the device in which the agent is run on. diff --git a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/communication/mqtt/FireAlarmMQTTCommunicator.java b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/communication/mqtt/FireAlarmMQTTCommunicator.java index 665319d75..8db409b7e 100644 --- a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/communication/mqtt/FireAlarmMQTTCommunicator.java +++ b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/communication/mqtt/FireAlarmMQTTCommunicator.java @@ -35,7 +35,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; -//TODO:: Lincense heade, comments and SPECIFIC class name since its not generic +//TODO:: Lincence header, comments and SPECIFIC class name since its not generic public class FireAlarmMQTTCommunicator extends MQTTTransportHandler { private static final Log log = LogFactory.getLog(FireAlarmMQTTCommunicator.class); diff --git a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentConfiguration.java b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentConfiguration.java index 64b52b8b7..04939edbb 100644 --- a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentConfiguration.java +++ b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentConfiguration.java @@ -24,150 +24,159 @@ package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core; * downloading the device agent from the IoT-Server. */ public class AgentConfiguration { - private String tenantDomain; - private String deviceOwner; - private String deviceId; - private String deviceName; - private String controllerContext; - private String scepContext; - private String HTTPS_ServerEndpoint; - private String HTTP_ServerEndpoint; - private String apimGatewayEndpoint; - private String mqttBrokerEndpoint; - private String xmppServerEndpoint; - private String authMethod; - private String authToken; - private String refreshToken; - private int dataPushInterval; - private String xmppServerName; - - public String getTenantDomain() { - return tenantDomain; - } - - public void setTenantDomain(String tenantDomain) { - this.tenantDomain = tenantDomain; - } - - public String getDeviceOwner() { - return deviceOwner; - } - - public void setDeviceOwner(String deviceOwner) { - this.deviceOwner = deviceOwner; - } - - public String getDeviceId() { - return deviceId; - } - - public void setDeviceId(String deviceId) { - this.deviceId = deviceId; - } - - public String getDeviceName() { - return deviceName; - } - - public void setDeviceName(String deviceName) { - this.deviceName = deviceName; - } - - public String getControllerContext() { - return controllerContext; - } - - public void setControllerContext(String controllerContext) { - this.controllerContext = controllerContext; - } - - public String getHTTPS_ServerEndpoint() { - return HTTPS_ServerEndpoint; - } - - public void setHTTPS_ServerEndpoint(String HTTPS_ServerEndpoint) { - this.HTTPS_ServerEndpoint = HTTPS_ServerEndpoint; - } - - public String getHTTP_ServerEndpoint() { - return HTTP_ServerEndpoint; - } - - public void setHTTP_ServerEndpoint(String HTTP_ServerEndpoint) { - this.HTTP_ServerEndpoint = HTTP_ServerEndpoint; - } - - public String getApimGatewayEndpoint() { - return apimGatewayEndpoint; - } - - public void setApimGatewayEndpoint(String apimGatewayEndpoint) { - this.apimGatewayEndpoint = apimGatewayEndpoint; - } - - public String getMqttBrokerEndpoint() { - return mqttBrokerEndpoint; - } - - public void setMqttBrokerEndpoint(String mqttBrokerEndpoint) { - this.mqttBrokerEndpoint = mqttBrokerEndpoint; - } - - public String getXmppServerEndpoint() { - return xmppServerEndpoint; - } - - public void setXmppServerEndpoint(String xmppServerEndpoint) { - this.xmppServerEndpoint = xmppServerEndpoint; - } - - public String getAuthMethod() { - return authMethod; - } - - public void setAuthMethod(String authMethod) { - this.authMethod = authMethod; - } - - public String getAuthToken() { - return authToken; - } - - public void setAuthToken(String authToken) { - this.authToken = authToken; - } - - public String getRefreshToken() { - return refreshToken; - } + private String tenantDomain; + private String deviceOwner; + private String deviceId; + private String deviceName; + private String controllerContext; + private String scepContext; + private String HTTPS_ServerEndpoint; + private String HTTP_ServerEndpoint; + private String apimGatewayEndpoint; + private String mqttBrokerEndpoint; + private String xmppServerEndpoint; + private String apiApplicationKey; + private String authMethod; + private String authToken; + private String refreshToken; + private int dataPushInterval; + private String xmppServerName; + + public String getTenantDomain() { + return tenantDomain; + } + + public void setTenantDomain(String tenantDomain) { + this.tenantDomain = tenantDomain; + } + + public String getDeviceOwner() { + return deviceOwner; + } + + public void setDeviceOwner(String deviceOwner) { + this.deviceOwner = deviceOwner; + } + + public String getDeviceId() { + return deviceId; + } + + public void setDeviceId(String deviceId) { + this.deviceId = deviceId; + } + + public String getDeviceName() { + return deviceName; + } + + public void setDeviceName(String deviceName) { + this.deviceName = deviceName; + } + + public String getControllerContext() { + return controllerContext; + } + + public void setControllerContext(String controllerContext) { + this.controllerContext = controllerContext; + } + + public String getHTTPS_ServerEndpoint() { + return HTTPS_ServerEndpoint; + } + + public void setHTTPS_ServerEndpoint(String HTTPS_ServerEndpoint) { + this.HTTPS_ServerEndpoint = HTTPS_ServerEndpoint; + } + + public String getHTTP_ServerEndpoint() { + return HTTP_ServerEndpoint; + } + + public void setHTTP_ServerEndpoint(String HTTP_ServerEndpoint) { + this.HTTP_ServerEndpoint = HTTP_ServerEndpoint; + } + + public String getApimGatewayEndpoint() { + return apimGatewayEndpoint; + } + + public void setApimGatewayEndpoint(String apimGatewayEndpoint) { + this.apimGatewayEndpoint = apimGatewayEndpoint; + } + + public String getMqttBrokerEndpoint() { + return mqttBrokerEndpoint; + } + + public void setMqttBrokerEndpoint(String mqttBrokerEndpoint) { + this.mqttBrokerEndpoint = mqttBrokerEndpoint; + } + + public String getXmppServerEndpoint() { + return xmppServerEndpoint; + } + + public void setXmppServerEndpoint(String xmppServerEndpoint) { + this.xmppServerEndpoint = xmppServerEndpoint; + } + + public String getApiApplicationKey() { + return apiApplicationKey; + } + + public void setApiApplicationKey(String apiApplicationKey) { + this.apiApplicationKey = apiApplicationKey; + } + + public String getAuthMethod() { + return authMethod; + } + + public void setAuthMethod(String authMethod) { + this.authMethod = authMethod; + } + + public String getAuthToken() { + return authToken; + } - public void setRefreshToken(String refreshToken) { - this.refreshToken = refreshToken; - } + public void setAuthToken(String authToken) { + this.authToken = authToken; + } - public int getDataPushInterval() { - return dataPushInterval; - } + public String getRefreshToken() { + return refreshToken; + } - public void setDataPushInterval(int dataPushInterval) { - this.dataPushInterval = dataPushInterval; - } + public void setRefreshToken(String refreshToken) { + this.refreshToken = refreshToken; + } - public String getScepContext() { - return scepContext; - } + public int getDataPushInterval() { + return dataPushInterval; + } - public void setScepContext(String scepContext) { - this.scepContext = scepContext; - } + public void setDataPushInterval(int dataPushInterval) { + this.dataPushInterval = dataPushInterval; + } - public String getXmppServerName() { - return xmppServerName; - } + public String getScepContext() { + return scepContext; + } - public void setXmppServerName(String xmppServerName) { - this.xmppServerName = xmppServerName; - } + public void setScepContext(String scepContext) { + this.scepContext = scepContext; + } + + public String getXmppServerName() { + return xmppServerName; + } + + public void setXmppServerName(String xmppServerName) { + this.xmppServerName = xmppServerName; + } } diff --git a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentConstants.java b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentConstants.java index 681f4f2e6..ddf63b21d 100644 --- a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentConstants.java +++ b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentConstants.java @@ -19,94 +19,98 @@ package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core; public class AgentConstants { - public static final String DEVICE_TYPE = "virtual_firealarm"; - public static final String LOG_APPENDER = "AGENT_LOG:: "; - public static final String PROPERTIES_FILE_PATH = ""; - public static final int DEFAULT_RETRY_THREAD_INTERVAL = 5000; // time in millis - /* --------------------------------------------------------------------------------------- - IoT-Server specific information - --------------------------------------------------------------------------------------- */ - public static final String DEVICE_CONTROLLER_API_EP = "/virtual_firealarm/controller"; - public static final String DEVICE_ENROLLMENT_API_EP = "/scep"; - public static final String DEVICE_REGISTER_API_EP = "/register"; - public static final String DEVICE_PUSH_TEMPERATURE_API_EP = "/temperature"; - public static final String PUSH_DATA_PAYLOAD = - "{\"owner\":\"%s\",\"deviceId\":\"%s\",\"reply\":\"%s\",\"value\":\"%s\"}"; + public static final String DEVICE_TYPE = "virtual_firealarm"; + public static final String LOG_APPENDER = "AGENT_LOG:: "; + public static final String PROPERTIES_FILE_PATH = ""; + public static final int DEFAULT_RETRY_THREAD_INTERVAL = 5000; // time in millis + public static final String TOKEN_AUTHENTICATION_METHOD = "token"; + /* --------------------------------------------------------------------------------------- + IoT-Server specific information + --------------------------------------------------------------------------------------- */ + public static final String DEVICE_CONTROLLER_API_EP = "/virtual_firealarm/controller"; + public static final String DEVICE_ENROLLMENT_API_EP = "/scep"; + public static final String DEVICE_REGISTER_API_EP = "/register"; + public static final String DEVICE_PUSH_TEMPERATURE_API_EP = "/temperature"; + public static final String PUSH_DATA_PAYLOAD = + "{\"owner\":\"%s\",\"deviceId\":\"%s\",\"reply\":\"%s\",\"value\":\"%s\"}"; - public static final String PUSH_SIMULATION_DATA_PAYLOAD = - "{\"owner\":\"%s\",\"deviceId\":\"%s\",\"reply\":\"%s\",\"value\":\"%s\",\"isSimulated\":\"%s\",\"duration\":\"%s\",\"frequency\":\"%s\"}"; + public static final String PUSH_SIMULATION_DATA_PAYLOAD = + "{\"owner\":\"%s\",\"deviceId\":\"%s\",\"reply\":\"%s\",\"value\":\"%s\",\"isSimulated\":\"%s\"," + + "\"duration\":\"%s\",\"frequency\":\"%s\"}"; - public static final String AGENT_CONTROL_APP_EP = "/devicemgt/device/%s?id=%s"; - public static final String DEVICE_DETAILS_PAGE_EP = "/devicemgt/device/%s?id=%s"; - public static final String DEVICE_ANALYTICS_PAGE_URL = "/devicemgt/device/virtual_firealarm/analytics?deviceId=%s&deviceName=%s"; + public static final String AGENT_CONTROL_APP_EP = "/devicemgt/device/%s?id=%s"; + public static final String DEVICE_DETAILS_PAGE_EP = "/devicemgt/device/%s?id=%s"; + public static final String DEVICE_ANALYTICS_PAGE_URL = + "/devicemgt/device/virtual_firealarm/analytics?deviceId=%s&deviceName=%s"; - /* --------------------------------------------------------------------------------------- - HTTP Connection specific information for communicating with IoT-Server - --------------------------------------------------------------------------------------- */ - public static final String HTTP_POST = "POST"; - public static final String HTTP_GET = "GET"; - public static final String APPLICATION_JSON_TYPE = "application/json"; - public static final String REGISTERED = "Registered"; - public static final String NOT_REGISTERED = "Not-Registered"; - public static final String REGISTRATION_FAILED = "Registration Failed"; - public static final String RETRYING_TO_REGISTER = "Registration Failed. Re-trying.."; - public static final String SERVER_NOT_RESPONDING = "Server not responding.."; + /* --------------------------------------------------------------------------------------- + HTTP Connection specific information for communicating with IoT-Server + --------------------------------------------------------------------------------------- */ + public static final String HTTP_POST = "POST"; + public static final String HTTP_GET = "GET"; + public static final String AUTHORIZATION_HEADER = "Authorization"; + public static final String CONTENT_TYPE_HEADER = "Content-Type"; + public static final String APPLICATION_JSON = "application/json"; + public static final String X_WWW_FORM_URLENCODED = "x-www-form-urlencoded"; + public static final String REGISTERED = "Registered"; + public static final String NOT_REGISTERED = "Not-Registered"; + public static final String REGISTRATION_FAILED = "Registration Failed"; + public static final String RETRYING_TO_REGISTER = "Registration Failed. Re-trying.."; + public static final String SERVER_NOT_RESPONDING = "Server not responding.."; - /* --------------------------------------------------------------------------------------- - MQTT Connection specific information - --------------------------------------------------------------------------------------- */ - 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 String MQTT_SUBSCRIBE_TOPIC = "%s/" + DEVICE_TYPE + "/%s"; - public static final String MQTT_PUBLISH_TOPIC = "%s/" + DEVICE_TYPE + "/%s/publisher"; - /* --------------------------------------------------------------------------------------- - XMPP Connection specific information - --------------------------------------------------------------------------------------- */ - public static final String XMPP_ADMIN_ACCOUNT_UNAME = "admin"; - /* --------------------------------------------------------------------------------------- - Device/Agent specific properties to be read from the 'deviceConfig.properties' file - --------------------------------------------------------------------------------------- */ - public static final String AGENT_PROPERTIES_FILE_NAME = "deviceConfig.properties"; - public static final String TENANT_DOMAIN = "tenantDomain"; - public static final String DEVICE_OWNER_PROPERTY = "owner"; - public static final String DEVICE_ID_PROPERTY = "deviceId"; - public static final String DEVICE_NAME_PROPERTY = "device-name"; - public static final String DEVICE_CONTROLLER_CONTEXT_PROPERTY = "controller-context"; - public static final String DEVICE_SCEP_CONTEXT_PROPERTY = "scep-context"; - public static final String SERVER_HTTPS_EP_PROPERTY = "https-ep"; - public static final String SERVER_HTTP_EP_PROPERTY = "http-ep"; - public static final String APIM_GATEWAY_EP_PROPERTY = "apim-ep"; - public static final String MQTT_BROKER_EP_PROPERTY = "mqtt-ep"; - public static final String XMPP_SERVER_EP_PROPERTY = "xmpp-ep"; - public static final String XMPP_SERVER_NAME_PROPERTY = "xmpp-server-name"; - public static final String AUTH_METHOD_PROPERTY = "auth-method"; - public static final String AUTH_TOKEN_PROPERTY = "auth-token"; - public static final String REFRESH_TOKEN_PROPERTY = "refresh-token"; - public static final String NETWORK_INTERFACE_PROPERTY = "network-interface"; - public static final String PUSH_INTERVAL_PROPERTY = "push-interval"; - /* --------------------------------------------------------------------------------------- - Default values for the Device/Agent specific configurations listed above - --------------------------------------------------------------------------------------- */ - public static final String DEFAULT_NETWORK_INTERFACE = "en0"; - public static final int DEFAULT_DATA_PUBLISH_INTERVAL = 15; // seconds - public static final String DEFAULT_PROTOCOL = "MQTT"; - /* --------------------------------------------------------------------------------------- - Control Signal specific constants to match the request context - --------------------------------------------------------------------------------------- */ - public static final String BULB_CONTROL = "BULB"; - public static final String TEMPERATURE_CONTROL = "TEMPERATURE"; - public static final String POLICY_SIGNAL = "POLICY"; - public static final String HUMIDITY_CONTROL = "HUMIDITY"; - public static final String CONTROL_ON = "ON"; - public static final String CONTROL_OFF = "OFF"; - public static final String AUDIO_FILE_NAME = "fireAlarmSound.mid"; - /* --------------------------------------------------------------------------------------- - Communication protocol specific Strings - --------------------------------------------------------------------------------------- */ - public static final String TCP_PREFIX = "tcp://"; - public static final String HTTP_PREFIX = "http://"; - public static final String HTTPS_PREFIX = "https://"; - public static final String HTTP_PROTOCOL = "HTTP"; - public static final String MQTT_PROTOCOL = "MQTT"; - public static final String XMPP_PROTOCOL = "XMPP"; + /* --------------------------------------------------------------------------------------- + MQTT Connection specific information + --------------------------------------------------------------------------------------- */ + 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 String MQTT_SUBSCRIBE_TOPIC = "%s/" + DEVICE_TYPE + "/%s"; + public static final String MQTT_PUBLISH_TOPIC = "%s/" + DEVICE_TYPE + "/%s/publisher"; + + /* --------------------------------------------------------------------------------------- + Device/Agent specific properties to be read from the 'deviceConfig.properties' file + --------------------------------------------------------------------------------------- */ + public static final String AGENT_PROPERTIES_FILE_NAME = "deviceConfig.properties"; + public static final String TENANT_DOMAIN = "tenantDomain"; + public static final String DEVICE_OWNER_PROPERTY = "owner"; + public static final String DEVICE_ID_PROPERTY = "deviceId"; + public static final String DEVICE_NAME_PROPERTY = "device-name"; + public static final String DEVICE_CONTROLLER_CONTEXT_PROPERTY = "controller-context"; + public static final String DEVICE_SCEP_CONTEXT_PROPERTY = "scep-context"; + public static final String SERVER_HTTPS_EP_PROPERTY = "https-ep"; + public static final String SERVER_HTTP_EP_PROPERTY = "http-ep"; + public static final String APIM_GATEWAY_EP_PROPERTY = "apim-ep"; + public static final String MQTT_BROKER_EP_PROPERTY = "mqtt-ep"; + public static final String XMPP_SERVER_EP_PROPERTY = "xmpp-ep"; + public static final String XMPP_SERVER_NAME_PROPERTY = "xmpp-server-name"; + public static final String API_APPLICATION_KEY = "application-key"; + public static final String AUTH_METHOD_PROPERTY = "auth-method"; + public static final String AUTH_TOKEN_PROPERTY = "auth-token"; + public static final String REFRESH_TOKEN_PROPERTY = "refresh-token"; + public static final String NETWORK_INTERFACE_PROPERTY = "network-interface"; + public static final String PUSH_INTERVAL_PROPERTY = "push-interval"; + /* --------------------------------------------------------------------------------------- + Default values for the Device/Agent specific configurations listed above + --------------------------------------------------------------------------------------- */ + public static final String DEFAULT_NETWORK_INTERFACE = "en0"; + public static final int DEFAULT_DATA_PUBLISH_INTERVAL = 15; // seconds + public static final String DEFAULT_PROTOCOL = "MQTT"; + /* --------------------------------------------------------------------------------------- + Control Signal specific constants to match the request context + --------------------------------------------------------------------------------------- */ + public static final String BULB_CONTROL = "BULB"; + public static final String TEMPERATURE_CONTROL = "TEMPERATURE"; + public static final String POLICY_SIGNAL = "POLICY"; + public static final String HUMIDITY_CONTROL = "HUMIDITY"; + public static final String CONTROL_ON = "ON"; + public static final String CONTROL_OFF = "OFF"; + public static final String AUDIO_FILE_NAME = "fireAlarmSound.mid"; + /* --------------------------------------------------------------------------------------- + Communication protocol specific Strings + --------------------------------------------------------------------------------------- */ + public static final String TCP_PREFIX = "tcp://"; + public static final String HTTP_PREFIX = "http://"; + public static final String HTTPS_PREFIX = "https://"; + public static final String HTTP_PROTOCOL = "HTTP"; + public static final String MQTT_PROTOCOL = "MQTT"; + public static final String XMPP_PROTOCOL = "XMPP"; } diff --git a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentManager.java b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentManager.java index 4dca0913e..7ae5b0119 100644 --- a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentManager.java +++ b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentManager.java @@ -20,14 +20,14 @@ package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.communication.http.FireAlarmHTTPCommunicator; +import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.communication.mqtt.FireAlarmMQTTCommunicator; +import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.communication.xmpp.FireAlarmXMPPCommunicator; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.enrollment.EnrollmentManager; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.exception.AgentCoreOperationException; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportHandler; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportHandlerException; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportUtils; -import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.communication.http.FireAlarmHTTPCommunicator; -import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.communication.mqtt.FireAlarmMQTTCommunicator; -import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.communication.xmpp.FireAlarmXMPPCommunicator; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.virtual.VirtualHardwareManager; import java.util.ArrayList; @@ -217,12 +217,16 @@ public class AgentManager { /*------------------------------------------------------------------------------------------*/ /* Getter and Setter Methods for the private variables */ - /*------------------------------------------------------------------------------------------*/ + /*------------------------------------------------------------------------------------------*/ public void setRootPath(String rootPath) { this.rootPath = rootPath; } + public String getRootPath() { + return rootPath; + } + public void setDeviceReady(boolean deviceReady) { this.deviceReady = deviceReady; } @@ -324,6 +328,7 @@ public class AgentManager { /** * Get temperature reading from device + * * @return Temperature */ public int getTemperature() { @@ -332,9 +337,10 @@ public class AgentManager { /** * Get humidity reading from device + * * @return Humidity */ - public int getHumidity(){ + public int getHumidity() { return VirtualHardwareManager.getInstance().getHumidity(); } diff --git a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentUtilOperations.java b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentUtilOperations.java index 656ce8490..45003b55f 100644 --- a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentUtilOperations.java +++ b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/agent/core/AgentUtilOperations.java @@ -26,12 +26,18 @@ import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.enrollment.Enrollme import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.exception.AgentCoreOperationException; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.CommunicationUtils; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportHandlerException; +import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportUtils; -import java.io.File; +import java.io.BufferedReader; +import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.ProtocolException; import java.net.URL; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; @@ -67,18 +73,19 @@ public class AgentUtilOperations { Properties properties = new Properties(); InputStream propertiesInputStream = null; String propertiesFileName = AgentConstants.AGENT_PROPERTIES_FILE_NAME; + String rootPath = ""; try { ClassLoader loader = AgentUtilOperations.class.getClassLoader(); URL path = loader.getResource(propertiesFileName); System.out.println(path); - String root = path.getPath().replace("wso2-firealarm-virtual-agent.jar!/deviceConfig.properties", "") - .replace("jar:", "").replace("file:", ""); + rootPath = path.getPath().replace("wso2-firealarm-virtual-agent.jar!/deviceConfig.properties", "") + .replace("jar:", "").replace("file:", ""); - root = URLDecoder.decode(root, StandardCharsets.UTF_8.toString()); - agentManager.setRootPath(root); + rootPath = URLDecoder.decode(rootPath, StandardCharsets.UTF_8.toString()); + agentManager.setRootPath(rootPath); - String deviceConfigFilePath = root + AgentConstants.AGENT_PROPERTIES_FILE_NAME; + String deviceConfigFilePath = rootPath + AgentConstants.AGENT_PROPERTIES_FILE_NAME; propertiesInputStream = new FileInputStream(deviceConfigFilePath); //load a properties file from class path, inside static method @@ -108,6 +115,8 @@ public class AgentUtilOperations { AgentConstants.XMPP_SERVER_EP_PROPERTY)); iotServerConfigs.setXmppServerName(properties.getProperty( AgentConstants.XMPP_SERVER_NAME_PROPERTY)); + iotServerConfigs.setApiApplicationKey(properties.getProperty( + AgentConstants.API_APPLICATION_KEY)); iotServerConfigs.setAuthMethod(properties.getProperty( AgentConstants.AUTH_METHOD_PROPERTY)); iotServerConfigs.setAuthToken(properties.getProperty( @@ -138,6 +147,8 @@ public class AgentUtilOperations { iotServerConfigs.getXmppServerEndpoint()); log.info(AgentConstants.LOG_APPENDER + "Authentication Method: " + iotServerConfigs.getAuthMethod()); + log.info(AgentConstants.LOG_APPENDER + "Base64Encoded API Application Key: " + + iotServerConfigs.getApiApplicationKey()); log.info(AgentConstants.LOG_APPENDER + "Authentication Token: " + iotServerConfigs.getAuthToken()); log.info(AgentConstants.LOG_APPENDER + "Refresh Token: " + @@ -148,13 +159,13 @@ public class AgentUtilOperations { iotServerConfigs.getXmppServerName()); } catch (FileNotFoundException ex) { - String errorMsg = "[" + propertiesFileName + "] file not found at: " + AgentConstants.PROPERTIES_FILE_PATH; + String errorMsg = "[" + propertiesFileName + "] file not found at: " + rootPath; log.error(AgentConstants.LOG_APPENDER + errorMsg); throw new AgentCoreOperationException(errorMsg); } catch (IOException ex) { String errorMsg = "Error occurred whilst trying to fetch [" + propertiesFileName + "] from: " + - AgentConstants.PROPERTIES_FILE_PATH; + AgentConstants.PROPERTIES_FILE_PATH; log.error(AgentConstants.LOG_APPENDER + errorMsg); throw new AgentCoreOperationException(errorMsg); } finally { @@ -174,10 +185,6 @@ public class AgentUtilOperations { /** * This method constructs the URLs for each of the API Endpoints called by the device agent * Ex: Register API, Push-Data API - * - * @throws AgentCoreOperationException if any error occurs at socket level whilst trying to - * retrieve the deviceIP of the network-interface read - * from the configs file */ public static void initializeServerEndPoints() { AgentManager agentManager = AgentManager.getInstance(); @@ -265,6 +272,155 @@ public class AgentUtilOperations { return actualMessage; } + public static String getAuthenticationMethod() { + String authMethod = AgentManager.getInstance().getAgentConfigs().getAuthMethod(); + switch (authMethod) { + case AgentConstants.TOKEN_AUTHENTICATION_METHOD: + return AgentConstants.TOKEN_AUTHENTICATION_METHOD; + default: + return ""; + } + } + + + public static boolean refreshOAuthToken() throws AgentCoreOperationException { + + AgentManager agentManager = AgentManager.getInstance(); + String tokenEndpoint = agentManager.getAgentConfigs().getApimGatewayEndpoint() + "/token"; + HttpURLConnection httpConnection = null; + BufferedReader connectionBuffer = null; + String requestPayload; + String dataFromBuffer; + StringBuilder responseMessage = new StringBuilder(); + boolean refreshStatus = false; + + try { + httpConnection = TransportUtils.getHttpConnection(tokenEndpoint); + httpConnection.setRequestMethod(AgentConstants.HTTP_POST); + httpConnection.setRequestProperty(AgentConstants.AUTHORIZATION_HEADER, + "Bearer " + agentManager.getAgentConfigs().getApiApplicationKey()); + httpConnection.setRequestProperty(AgentConstants.CONTENT_TYPE_HEADER, AgentConstants.X_WWW_FORM_URLENCODED); + httpConnection.setDoOutput(true); + + String refreshToken = agentManager.getAgentConfigs().getRefreshToken(); + String applicationScope = "device_type_" + AgentConstants.DEVICE_TYPE + + " device_" + agentManager.getAgentConfigs().getDeviceId(); + + requestPayload = APIManagerTokenUtils.GRANT_TYPE + "=" + APIManagerTokenUtils.REFRESH_TOKEN + "&" + + APIManagerTokenUtils.REFRESH_TOKEN + "=" + refreshToken + "&" + + APIManagerTokenUtils.SCOPE + "=" + applicationScope; + + DataOutputStream dataOutPutWriter = new DataOutputStream(httpConnection.getOutputStream()); + dataOutPutWriter.writeBytes(requestPayload); + dataOutPutWriter.flush(); + dataOutPutWriter.close(); + + log.info(AgentConstants.LOG_APPENDER + "Request to refresh OAuth token was sent to [" + + httpConnection.getURL() + "] with payload [" + requestPayload + "]."); + log.info(AgentConstants.LOG_APPENDER + "Response [" + httpConnection.getResponseCode() + ":" + + httpConnection.getResponseMessage() + "] was received for token refresh attempt."); + + connectionBuffer = new BufferedReader(new InputStreamReader(httpConnection.getInputStream())); + + while ((dataFromBuffer = connectionBuffer.readLine()) != null) { + responseMessage.append(dataFromBuffer); + } + + log.info(AgentConstants.LOG_APPENDER + "Response [" + responseMessage + + "] was received for the token refresh call."); + + refreshStatus = updateExistingTokens(responseMessage.toString()); + + } catch (TransportHandlerException e) { + throw new AgentCoreOperationException(e); + } catch (ProtocolException e) { + String errorMsg = "Protocol specific error occurred when trying to set method to " + + AgentConstants.HTTP_POST + " for endpoint at: " + tokenEndpoint; + log.error(AgentConstants.LOG_APPENDER + errorMsg); + throw new AgentCoreOperationException(errorMsg, e); + + } catch (IOException e) { + String errorMsg = "An IO error occurred whilst trying to get the response code from: " + tokenEndpoint + + " for a HTTP " + AgentConstants.HTTP_POST + " call."; + log.error(AgentConstants.LOG_APPENDER + errorMsg); + throw new AgentCoreOperationException(errorMsg, e); + } finally { + if (connectionBuffer != null) { + try { + connectionBuffer.close(); + } catch (IOException e) { + log.error(AgentConstants.LOG_APPENDER + + "Error encounter whilst attempting to close buffer to connection at: " + + tokenEndpoint); + } + } + + if (httpConnection != null) { + httpConnection.disconnect(); + } + } + return refreshStatus; + } + + + private static boolean updateExistingTokens(String responseFromTokenEP) { + JSONObject jsonTokenObject = new JSONObject(responseFromTokenEP); + String newAccessToken = jsonTokenObject.get(APIManagerTokenUtils.ACCESS_TOKEN).toString(); + String newRefreshToken = jsonTokenObject.get(APIManagerTokenUtils.REFRESH_TOKEN).toString(); + + if (newAccessToken == null || newRefreshToken == null) { + log.error( + AgentConstants.LOG_APPENDER + "Neither Access-Token nor Refresh-Token was found in the response [" + + responseFromTokenEP + "]."); + return false; + } + + AgentManager.getInstance().getAgentConfigs().setAuthToken(newAccessToken); + AgentManager.getInstance().getAgentConfigs().setRefreshToken(newRefreshToken); + String deviceConfigFilePath = + AgentManager.getInstance().getRootPath() + AgentConstants.AGENT_PROPERTIES_FILE_NAME; + + Properties deviceProperties = new Properties(); + FileOutputStream fileOutputStream = null; + + try { + fileOutputStream = new FileOutputStream(deviceConfigFilePath); + deviceProperties.setProperty(AgentConstants.AUTH_TOKEN_PROPERTY, newAccessToken); + deviceProperties.setProperty(AgentConstants.REFRESH_TOKEN_PROPERTY, newRefreshToken); + deviceProperties.store(fileOutputStream, null); + + } catch (FileNotFoundException ex) { + String errorMsg = + "[" + AgentConstants.AGENT_PROPERTIES_FILE_NAME + "] file not found at: " + deviceConfigFilePath; + log.error(AgentConstants.LOG_APPENDER + errorMsg); + return false; + + } catch (IOException ex) { + String errorMsg = "Error occurred whilst trying to write to [" + AgentConstants.AGENT_PROPERTIES_FILE_NAME + + "] at: " + deviceConfigFilePath; + log.error(AgentConstants.LOG_APPENDER + errorMsg); + return false; + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e) { + log.error(AgentConstants.LOG_APPENDER + + "Error occurred whilst trying to close InputStream resource used to read the '" + + AgentConstants.AGENT_PROPERTIES_FILE_NAME + "' file"); + } + } + } + return true; + } + + + private class APIManagerTokenUtils { + public static final String GRANT_TYPE = "grant_type"; + public static final String ACCESS_TOKEN = "access_token"; + public static final String REFRESH_TOKEN = "refresh_token"; + public static final String SCOPE = "scope"; + } } diff --git a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/resources/deviceConfig.properties b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/resources/deviceConfig.properties index 4eba166c1..ba7e9922b 100644 --- a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/resources/deviceConfig.properties +++ b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/src/main/resources/deviceConfig.properties @@ -1,4 +1,4 @@ -# +ad# # Copyright (c) 2015, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/VirtualFireAlarmServiceImpl.java b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/VirtualFireAlarmServiceImpl.java index 324be52da..7080151d2 100644 --- a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/VirtualFireAlarmServiceImpl.java +++ b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/VirtualFireAlarmServiceImpl.java @@ -54,13 +54,27 @@ import org.wso2.carbon.identity.jwt.client.extension.dto.AccessTokenInfo; import org.wso2.carbon.identity.jwt.client.extension.exception.JWTClientException; import org.wso2.carbon.user.api.UserStoreException; -import javax.ws.rs.*; +import javax.ws.rs.Consumes; +import javax.ws.rs.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.security.PrivateKey; -import java.util.*; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.UUID; public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService { @@ -136,7 +150,8 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService { List deviceIdentifiers = new ArrayList<>(); deviceIdentifiers.add(new DeviceIdentifier(deviceId, VirtualFireAlarmConstants.DEVICE_TYPE)); - APIUtil.getDeviceManagementService().addOperation(VirtualFireAlarmConstants.DEVICE_TYPE, commandOp, deviceIdentifiers); + APIUtil.getDeviceManagementService().addOperation(VirtualFireAlarmConstants.DEVICE_TYPE, commandOp, + deviceIdentifiers); break; } return Response.ok().build(); @@ -319,14 +334,16 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService { scopes); String accessToken = accessTokenInfo.getAccessToken(); String refreshToken = accessTokenInfo.getRefreshToken(); - //adding registering data - XmppAccount newXmppAccount = new XmppAccount(); - newXmppAccount.setAccountName(deviceId); - newXmppAccount.setUsername(deviceId); - newXmppAccount.setPassword(accessToken); - newXmppAccount.setEmail(deviceId + "@" + APIUtil.getTenantDomainOftheUser()); + boolean status; if (XmppConfig.getInstance().isEnabled()) { + + XmppAccount newXmppAccount = new XmppAccount(); + newXmppAccount.setAccountName(deviceId); + newXmppAccount.setUsername(deviceId); + newXmppAccount.setPassword(accessToken); + newXmppAccount.setEmail(deviceId + "@" + APIUtil.getTenantDomainOftheUser()); + status = XmppServerClient.createAccount(newXmppAccount); if (!status) { String msg = "XMPP Account was not created for device - " + deviceId + " of owner - " + owner + @@ -335,14 +352,16 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService { throw new DeviceManagementException(msg); } } + status = register(deviceId, deviceName); if (!status) { String msg = "Error occurred while registering the device with " + "id: " + deviceId + " owner:" + owner; throw new DeviceManagementException(msg); } + ZipUtil ziputil = new ZipUtil(); - return ziputil.createZipFile(owner, APIUtil.getTenantDomainOftheUser(), sketchType, deviceId, - deviceName, accessToken, refreshToken); + return ziputil.createZipFile(owner, sketchType, deviceId, deviceName, apiApplicationKey.toString(), + accessToken, refreshToken); } private static String shortUUID() { @@ -350,5 +369,4 @@ public class VirtualFireAlarmServiceImpl implements VirtualFireAlarmService { long l = ByteBuffer.wrap(uuid.toString().getBytes(StandardCharsets.UTF_8)).getLong(); return Long.toString(l, Character.MAX_RADIX); } - } diff --git a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/VirtualFireAlarmUtilConstants.java b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/VirtualFireAlarmUtilConstants.java new file mode 100644 index 000000000..2f1fe8030 --- /dev/null +++ b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/VirtualFireAlarmUtilConstants.java @@ -0,0 +1,20 @@ +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 static final String TENANT_DOMAIN = "TENANT_DOMAIN"; + public static final String DEVICE_OWNER = "DEVICE_OWNER"; + public static final String DEVICE_ID = "DEVICE_ID"; + public static final String DEVICE_NAME = "DEVICE_NAME"; + public static final String HTTPS_EP = "HTTPS_EP"; + public static final String HTTP_EP = "HTTP_EP"; + public static final String APIM_EP = "APIM_EP"; + public static final String MQTT_EP = "MQTT_EP"; + public static final String XMPP_EP = "XMPP_EP"; + public static final String API_APPLICATION_KEY = "API_APPLICATION_KEY"; + public static final String DEVICE_TOKEN = "DEVICE_TOKEN"; + public static final String DEVICE_REFRESH_TOKEN = "DEVICE_REFRESH_TOKEN"; + public static final String SERVER_NAME = "SERVER_NAME"; +} diff --git a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/ZipUtil.java b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/ZipUtil.java index 4d7fed54c..07d055e16 100644 --- a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/ZipUtil.java +++ b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.api/src/main/java/org/wso2/carbon/device/mgt/iot/virtualfirealarm/service/impl/util/ZipUtil.java @@ -18,6 +18,11 @@ package org.wso2.carbon.device.mgt.iot.virtualfirealarm.service.impl.util; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.json.JSONObject; +import org.wso2.carbon.apimgt.application.extension.constants.ApiApplicationConstants; import org.wso2.carbon.device.mgt.common.DeviceManagementException; import org.wso2.carbon.device.mgt.iot.util.Utils; import org.wso2.carbon.device.mgt.iot.util.ZipArchive; @@ -35,6 +40,7 @@ import java.util.Map; */ public class ZipUtil { + private static final Log log = LogFactory.getLog(ZipUtil.class); private static final String HTTPS_PORT_PROPERTY = "httpsPort"; private static final String HTTP_PORT_PROPERTY = "httpPort"; @@ -42,12 +48,13 @@ public class ZipUtil { private static final String HTTPS_PROTOCOL_APPENDER = "https://"; private static final String HTTP_PROTOCOL_APPENDER = "http://"; - public ZipArchive createZipFile(String owner, String tenantDomain, String deviceType, - String deviceId, String deviceName, String token, - String refreshToken) throws DeviceManagementException { + public ZipArchive createZipFile(String owner, String deviceType, String deviceId, String deviceName, + String apiApplicationKey, String token, String refreshToken) + throws DeviceManagementException { String sketchFolder = "repository" + File.separator + "resources" + File.separator + "sketches"; - String archivesPath = CarbonUtils.getCarbonHome() + File.separator + sketchFolder + File.separator + "archives" + + String archivesPath = + CarbonUtils.getCarbonHome() + File.separator + sketchFolder + File.separator + "archives" + File.separator + deviceId; String templateSketchPath = sketchFolder + File.separator + deviceType; String iotServerIP; @@ -63,24 +70,29 @@ public class ZipUtil { if (mqttEndpoint.contains(LOCALHOST)) { mqttEndpoint = mqttEndpoint.replace(LOCALHOST, iotServerIP); } + String xmppEndpoint = XmppConfig.getInstance().getXmppServerIP() + ":" + XmppConfig.getInstance().getXmppServerPort(); if (xmppEndpoint.contains(LOCALHOST)) { xmppEndpoint = xmppEndpoint.replace(LOCALHOST, iotServerIP); } + + String base64EncodedApplicationKey = getBase64EncodedAPIAppKey(apiApplicationKey); + Map contextParams = new HashMap<>(); - contextParams.put("TENANT_DOMAIN", APIUtil.getTenantDomainOftheUser()); - contextParams.put("DEVICE_OWNER", owner); - contextParams.put("DEVICE_ID", deviceId); - contextParams.put("DEVICE_NAME", deviceName); - contextParams.put("HTTPS_EP", httpsServerEP); - contextParams.put("HTTP_EP", httpServerEP); - contextParams.put("APIM_EP", apimEndpoint); - contextParams.put("MQTT_EP", mqttEndpoint); - contextParams.put("XMPP_EP", "XMPP:" + xmppEndpoint); - contextParams.put("DEVICE_TOKEN", token); - contextParams.put("DEVICE_REFRESH_TOKEN", refreshToken); - contextParams.put("SERVER_NAME", XmppConfig.getInstance().getXmppServerName()); + contextParams.put(VirtualFireAlarmUtilConstants.TENANT_DOMAIN, APIUtil.getTenantDomainOftheUser()); + contextParams.put(VirtualFireAlarmUtilConstants.DEVICE_OWNER, owner); + contextParams.put(VirtualFireAlarmUtilConstants.DEVICE_ID, deviceId); + contextParams.put(VirtualFireAlarmUtilConstants.DEVICE_NAME, deviceName); + contextParams.put(VirtualFireAlarmUtilConstants.HTTPS_EP, httpsServerEP); + contextParams.put(VirtualFireAlarmUtilConstants.HTTP_EP, httpServerEP); + contextParams.put(VirtualFireAlarmUtilConstants.APIM_EP, apimEndpoint); + contextParams.put(VirtualFireAlarmUtilConstants.MQTT_EP, mqttEndpoint); + contextParams.put(VirtualFireAlarmUtilConstants.XMPP_EP, "XMPP:" + xmppEndpoint); + contextParams.put(VirtualFireAlarmUtilConstants.API_APPLICATION_KEY, base64EncodedApplicationKey); + contextParams.put(VirtualFireAlarmUtilConstants.DEVICE_TOKEN, token); + contextParams.put(VirtualFireAlarmUtilConstants.DEVICE_REFRESH_TOKEN, refreshToken); + contextParams.put(VirtualFireAlarmUtilConstants.SERVER_NAME, XmppConfig.getInstance().getXmppServerName()); ZipArchive zipFile; zipFile = Utils.getSketchArchive(archivesPath, templateSketchPath, contextParams, deviceName); return zipFile; @@ -88,4 +100,13 @@ public class ZipUtil { throw new DeviceManagementException("Zip File Creation Failed", e); } } + + private String getBase64EncodedAPIAppKey(String apiAppCredentialsAsJSONString) { + + JSONObject jsonObject = new JSONObject(apiAppCredentialsAsJSONString); + String consumerKey = jsonObject.get(ApiApplicationConstants.OAUTH_CLIENT_ID).toString(); + String consumerSecret = jsonObject.get(ApiApplicationConstants.OAUTH_CLIENT_SECRET).toString(); + String stringToEncode = consumerKey + ":" + consumerSecret; + return Base64.encodeBase64String(stringToEncode.getBytes()); + } } diff --git a/features/iot-plugins-feature/virtual-fire-alarm-plugin-feature/org.wso2.carbon.device.mgt.iot.virtualfirealarm.feature/src/main/resources/advanced_agent/deviceConfig.properties b/features/iot-plugins-feature/virtual-fire-alarm-plugin-feature/org.wso2.carbon.device.mgt.iot.virtualfirealarm.feature/src/main/resources/advanced_agent/deviceConfig.properties index 47a3a73a6..1ee0aa15f 100644 --- a/features/iot-plugins-feature/virtual-fire-alarm-plugin-feature/org.wso2.carbon.device.mgt.iot.virtualfirealarm.feature/src/main/resources/advanced_agent/deviceConfig.properties +++ b/features/iot-plugins-feature/virtual-fire-alarm-plugin-feature/org.wso2.carbon.device.mgt.iot.virtualfirealarm.feature/src/main/resources/advanced_agent/deviceConfig.properties @@ -28,6 +28,7 @@ apim-ep=${APIM_EP} mqtt-ep=${MQTT_EP} xmpp-ep=${XMPP_EP} auth-method=token +application-key=${API_APPLICATION_KEY} auth-token=${DEVICE_TOKEN} refresh-token=${DEVICE_REFRESH_TOKEN} push-interval=15