diff --git a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/pom.xml b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/pom.xml index 4ec107071..f3287ab2d 100644 --- a/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/pom.xml +++ b/components/iot-plugins/virtual-fire-alarm-plugin/org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.impl/pom.xml @@ -175,6 +175,13 @@ json + + commons-configuration + commons-configuration + 1.10 + + + 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 8db409b7e..5b24783e7 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 @@ -22,6 +22,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; +import org.eclipse.paho.client.mqttv3.MqttSecurityException; 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.core.AgentUtilOperations; @@ -42,6 +43,7 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler { private ScheduledExecutorService service = Executors.newScheduledThreadPool(2); private ScheduledFuture dataPushServiceHandler; + private static final String DEFAULT_PASSWORD = ""; public FireAlarmMQTTCommunicator(String deviceOwner, String deviceType, String mqttBrokerEndPoint, String subscribeTopic) { @@ -68,18 +70,23 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler { public void run() { while (!isConnected()) { try { - connectToQueue(); + connectToQueue(agentManager.getAgentConfigs().getAuthToken(), DEFAULT_PASSWORD); agentManager.updateAgentStatus("Connected to MQTT Queue"); } catch (TransportHandlerException e) { log.warn(AgentConstants.LOG_APPENDER + "Connection to MQTT Broker at: " + mqttBrokerEndPoint + " failed.\n Will retry in " + timeoutInterval + " milli-seconds."); - } - try{ - subscribeToQueue(); - agentManager.updateAgentStatus("Subscribed to MQTT Queue"); - publishDeviceData(); + if (e.getCause() != null && e.getCause() instanceof MqttSecurityException) { + refreshOAuthToken((MqttSecurityException) e.getCause()); + } + } + try { + if (isConnected()) { + subscribeToQueue(); + agentManager.updateAgentStatus("Subscribed to MQTT Queue"); + publishDeviceData(); + } } catch (TransportHandlerException e) { log.warn(AgentConstants.LOG_APPENDER + "Subscription to MQTT Broker at: " + mqttBrokerEndPoint + " failed"); @@ -100,6 +107,26 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler { connectorThread.start(); } + private void refreshOAuthToken(final MqttSecurityException exception) { + Runnable tokenRefresher = new Runnable() { + public void run() { + String authenticationMethod = AgentUtilOperations.getAuthenticationMethod(); + + try { + if (exception.getReasonCode() == MqttSecurityException.REASON_CODE_FAILED_AUTHENTICATION && + authenticationMethod.equals(AgentConstants.TOKEN_AUTHENTICATION_METHOD)) { + AgentUtilOperations.refreshOAuthToken(); + } + } catch (AgentCoreOperationException e1) { + log.error(AgentConstants.LOG_APPENDER + "Token Refresh Attempt Failed. " + e1); + } + } + }; + + Thread connectorThread = new Thread(tokenRefresher); + connectorThread.setDaemon(true); + connectorThread.start(); + } @Override public void processIncomingMessage(MqttMessage message, String... messageParams) { 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 ddf63b21d..3c661c6d7 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 @@ -27,7 +27,6 @@ public class AgentConstants { /* --------------------------------------------------------------------------------------- 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"; @@ -38,7 +37,6 @@ public class AgentConstants { "{\"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"; @@ -51,7 +49,7 @@ public class AgentConstants { 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 X_WWW_FORM_URLENCODED = "application/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"; @@ -113,4 +111,17 @@ public class AgentConstants { public static final String HTTP_PROTOCOL = "HTTP"; public static final String MQTT_PROTOCOL = "MQTT"; public static final String XMPP_PROTOCOL = "XMPP"; + public static final String PROTOCOL_PROPERTY = "Protocol"; + public static final String HOST_PROPERTY = "Host"; + public static final String PORT_PROPERTY = "Port"; + + /* --------------------------------------------------------------------------------------- + Keystore specific strings for the device trustStore + --------------------------------------------------------------------------------------- */ + public static final String DEVICE_KEYSTORE_TYPE = "JKS"; + public static final String DEVICE_KEYSTORE = "virtual_firealarm.jks"; + public static final String DEVICE_KEYSTORE_PASSWORD = "wso2@virtual_firealarm"; + public static final String DEVICE_PRIVATE_KEY_ALIAS = "virtual_firealarm_key"; + public static final String DEVICE_CERT_ALIAS = "virtual_firealarm_cert"; + public static final String SERVER_PUBLIC_KEY_ALIAS = "iotServer_key"; } 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 7ae5b0119..422ed85d0 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 @@ -74,18 +74,19 @@ public class AgentManager { public void init() { agentCommunicator = new HashMap<>(); - // Read IoT-Server specific configurations from the 'deviceConfig.properties' file try { this.agentConfigs = AgentUtilOperations.readIoTServerConfigs(); } catch (AgentCoreOperationException e) { - log.error("Reading device configuration from configd file failed:\n"); + log.error("Reading device configuration from configuration file failed:\n"); log.error(e); System.exit(0); } // Initialise IoT-Server URL endpoints from the configuration read from file AgentUtilOperations.initializeServerEndPoints(); + // Set the hostNameVerifier to the APIM-Server IPAddress to enable HTTPS handshake + AgentUtilOperations.setHTTPSConfigurations(); String analyticsPageContext = String.format(AgentConstants.DEVICE_ANALYTICS_PAGE_URL, agentConfigs.getDeviceId(), @@ -153,7 +154,9 @@ public class AgentManager { } try { - EnrollmentManager.getInstance().beginEnrollmentFlow(); + if (!EnrollmentManager.getInstance().isEnrolled()) { + EnrollmentManager.getInstance().beginEnrollmentFlow(); + } } catch (AgentCoreOperationException e) { log.error("Device Enrollment Failed:\n"); log.error(e); 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 45003b55f..7f407f5ca 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 @@ -19,8 +19,11 @@ package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core; import org.apache.commons.codec.binary.Base64; +import org.apache.commons.configuration.ConfigurationException; +import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.eclipse.jetty.http.HttpStatus; import org.json.JSONObject; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.enrollment.EnrollmentManager; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.exception.AgentCoreOperationException; @@ -28,11 +31,13 @@ import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.Communica import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportHandlerException; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportUtils; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLSession; 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; @@ -78,86 +83,91 @@ public class AgentUtilOperations { try { ClassLoader loader = AgentUtilOperations.class.getClassLoader(); URL path = loader.getResource(propertiesFileName); - System.out.println(path); - rootPath = path.getPath().replace("wso2-firealarm-virtual-agent.jar!/deviceConfig.properties", "") - .replace("jar:", "").replace("file:", ""); - - rootPath = URLDecoder.decode(rootPath, StandardCharsets.UTF_8.toString()); - agentManager.setRootPath(rootPath); - - String deviceConfigFilePath = rootPath + AgentConstants.AGENT_PROPERTIES_FILE_NAME; - propertiesInputStream = new FileInputStream(deviceConfigFilePath); - - //load a properties file from class path, inside static method - properties.load(propertiesInputStream); - - iotServerConfigs.setTenantDomain(properties.getProperty( - AgentConstants.TENANT_DOMAIN)); - iotServerConfigs.setDeviceOwner(properties.getProperty( - AgentConstants.DEVICE_OWNER_PROPERTY)); - iotServerConfigs.setDeviceId(properties.getProperty( - AgentConstants.DEVICE_ID_PROPERTY)); - iotServerConfigs.setDeviceName(properties.getProperty( - AgentConstants.DEVICE_NAME_PROPERTY)); - iotServerConfigs.setControllerContext(properties.getProperty( - AgentConstants.DEVICE_CONTROLLER_CONTEXT_PROPERTY)); - iotServerConfigs.setScepContext(properties.getProperty( - AgentConstants.DEVICE_SCEP_CONTEXT_PROPERTY)); - iotServerConfigs.setHTTPS_ServerEndpoint(properties.getProperty( - AgentConstants.SERVER_HTTPS_EP_PROPERTY)); - iotServerConfigs.setHTTP_ServerEndpoint(properties.getProperty( - AgentConstants.SERVER_HTTP_EP_PROPERTY)); - iotServerConfigs.setApimGatewayEndpoint(properties.getProperty( - AgentConstants.APIM_GATEWAY_EP_PROPERTY)); - iotServerConfigs.setMqttBrokerEndpoint(properties.getProperty( - AgentConstants.MQTT_BROKER_EP_PROPERTY)); - iotServerConfigs.setXmppServerEndpoint(properties.getProperty( - 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( - AgentConstants.AUTH_TOKEN_PROPERTY)); - iotServerConfigs.setRefreshToken(properties.getProperty( - AgentConstants.REFRESH_TOKEN_PROPERTY)); - iotServerConfigs.setDataPushInterval(Integer.parseInt(properties.getProperty( - AgentConstants.PUSH_INTERVAL_PROPERTY))); - - log.info(AgentConstants.LOG_APPENDER + "Tenant Domain: " + - iotServerConfigs.getTenantDomain()); - log.info(AgentConstants.LOG_APPENDER + "Device Owner: " + - iotServerConfigs.getDeviceOwner()); - log.info(AgentConstants.LOG_APPENDER + "Device ID: " + iotServerConfigs.getDeviceId()); - log.info(AgentConstants.LOG_APPENDER + "Device Name: " + - iotServerConfigs.getDeviceName()); - log.info(AgentConstants.LOG_APPENDER + "Device Controller Context: " + - iotServerConfigs.getControllerContext()); - log.info(AgentConstants.LOG_APPENDER + "IoT Server HTTPS EndPoint: " + - iotServerConfigs.getHTTPS_ServerEndpoint()); - log.info(AgentConstants.LOG_APPENDER + "IoT Server HTTP EndPoint: " + - iotServerConfigs.getHTTP_ServerEndpoint()); - log.info(AgentConstants.LOG_APPENDER + "API-Manager Gateway EndPoint: " + - iotServerConfigs.getApimGatewayEndpoint()); - log.info(AgentConstants.LOG_APPENDER + "MQTT Broker EndPoint: " + - iotServerConfigs.getMqttBrokerEndpoint()); - log.info(AgentConstants.LOG_APPENDER + "XMPP Server EndPoint: " + - 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: " + - iotServerConfigs.getRefreshToken()); - log.info(AgentConstants.LOG_APPENDER + "Data Push Interval: " + - iotServerConfigs.getDataPushInterval()); - log.info(AgentConstants.LOG_APPENDER + "XMPP Server Name: " + - iotServerConfigs.getXmppServerName()); + if (path != null) { + log.info(AgentConstants.LOG_APPENDER + path); + rootPath = path.getPath().replace("wso2-firealarm-virtual-agent.jar!/deviceConfig.properties", "") + .replace("jar:", "").replace("file:", ""); + + rootPath = URLDecoder.decode(rootPath, StandardCharsets.UTF_8.toString()); + agentManager.setRootPath(rootPath); + + String deviceConfigFilePath = rootPath + AgentConstants.AGENT_PROPERTIES_FILE_NAME; + propertiesInputStream = new FileInputStream(deviceConfigFilePath); + + //load a properties file from class path, inside static method + properties.load(propertiesInputStream); + + iotServerConfigs.setTenantDomain(properties.getProperty( + AgentConstants.TENANT_DOMAIN)); + iotServerConfigs.setDeviceOwner(properties.getProperty( + AgentConstants.DEVICE_OWNER_PROPERTY)); + iotServerConfigs.setDeviceId(properties.getProperty( + AgentConstants.DEVICE_ID_PROPERTY)); + iotServerConfigs.setDeviceName(properties.getProperty( + AgentConstants.DEVICE_NAME_PROPERTY)); + iotServerConfigs.setControllerContext(properties.getProperty( + AgentConstants.DEVICE_CONTROLLER_CONTEXT_PROPERTY)); + iotServerConfigs.setScepContext(properties.getProperty( + AgentConstants.DEVICE_SCEP_CONTEXT_PROPERTY)); + iotServerConfigs.setHTTPS_ServerEndpoint(properties.getProperty( + AgentConstants.SERVER_HTTPS_EP_PROPERTY)); + iotServerConfigs.setHTTP_ServerEndpoint(properties.getProperty( + AgentConstants.SERVER_HTTP_EP_PROPERTY)); + iotServerConfigs.setApimGatewayEndpoint(properties.getProperty( + AgentConstants.APIM_GATEWAY_EP_PROPERTY)); + iotServerConfigs.setMqttBrokerEndpoint(properties.getProperty( + AgentConstants.MQTT_BROKER_EP_PROPERTY)); + iotServerConfigs.setXmppServerEndpoint(properties.getProperty( + 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( + AgentConstants.AUTH_TOKEN_PROPERTY)); + iotServerConfigs.setRefreshToken(properties.getProperty( + AgentConstants.REFRESH_TOKEN_PROPERTY)); + iotServerConfigs.setDataPushInterval(Integer.parseInt(properties.getProperty( + AgentConstants.PUSH_INTERVAL_PROPERTY))); + + log.info(AgentConstants.LOG_APPENDER + "Tenant Domain: " + + iotServerConfigs.getTenantDomain()); + log.info(AgentConstants.LOG_APPENDER + "Device Owner: " + + iotServerConfigs.getDeviceOwner()); + log.info(AgentConstants.LOG_APPENDER + "Device ID: " + iotServerConfigs.getDeviceId()); + log.info(AgentConstants.LOG_APPENDER + "Device Name: " + + iotServerConfigs.getDeviceName()); + log.info(AgentConstants.LOG_APPENDER + "Device Controller Context: " + + iotServerConfigs.getControllerContext()); + log.info(AgentConstants.LOG_APPENDER + "IoT Server HTTPS EndPoint: " + + iotServerConfigs.getHTTPS_ServerEndpoint()); + log.info(AgentConstants.LOG_APPENDER + "IoT Server HTTP EndPoint: " + + iotServerConfigs.getHTTP_ServerEndpoint()); + log.info(AgentConstants.LOG_APPENDER + "API-Manager Gateway EndPoint: " + + iotServerConfigs.getApimGatewayEndpoint()); + log.info(AgentConstants.LOG_APPENDER + "MQTT Broker EndPoint: " + + iotServerConfigs.getMqttBrokerEndpoint()); + log.info(AgentConstants.LOG_APPENDER + "XMPP Server EndPoint: " + + 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: " + + iotServerConfigs.getRefreshToken()); + log.info(AgentConstants.LOG_APPENDER + "Data Push Interval: " + + iotServerConfigs.getDataPushInterval()); + log.info(AgentConstants.LOG_APPENDER + "XMPP Server Name: " + + iotServerConfigs.getXmppServerName()); + } else { + throw new AgentCoreOperationException( + "Failed to load path of resource [" + propertiesFileName + "] from this classpath."); + } } catch (FileNotFoundException ex) { String errorMsg = "[" + propertiesFileName + "] file not found at: " + rootPath; log.error(AgentConstants.LOG_APPENDER + errorMsg); @@ -216,6 +226,26 @@ public class AgentUtilOperations { log.info(AgentConstants.LOG_APPENDER + "Push-Data API EndPoint: " + pushDataEndPointURL); } + public static void setHTTPSConfigurations() { + String apimEndpoint = AgentManager.getInstance().getAgentConfigs().getApimGatewayEndpoint(); + System.setProperty("javax.net.ssl.trustStore", AgentConstants.DEVICE_KEYSTORE); + System.setProperty("javax.net.ssl.trustStorePassword", AgentConstants.DEVICE_KEYSTORE_PASSWORD); + + try { + final String apimHost = TransportUtils.getHostAndPort(apimEndpoint).get(AgentConstants.HOST_PROPERTY); + + HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return hostname.equals(apimHost); + } + }); + } catch (TransportHandlerException e) { + log.error(AgentConstants.LOG_APPENDER + + "Failed to set HTTPS HostNameVerifier to the APIMServer-Host using the APIM-Endpoint " + + "string [" + apimEndpoint + "]."); + log.error(AgentConstants.LOG_APPENDER + e); + } + } public static String prepareSecurePayLoad(String message) throws AgentCoreOperationException { PrivateKey devicePrivateKey = EnrollmentManager.getInstance().getPrivateKey(); @@ -234,7 +264,6 @@ public class AgentUtilOperations { jsonPayload.put(JSON_SIGNATURE_KEY, signedPayload); //below statements are temporary fix. jsonPayload.put(JSON_SERIAL_KEY, EnrollmentManager.getInstance().getSCEPCertificate().getSerialNumber()); - return jsonPayload.toString(); } @@ -282,26 +311,19 @@ public class AgentUtilOperations { } } - - public static boolean refreshOAuthToken() throws AgentCoreOperationException { + public static void refreshOAuthToken() throws AgentCoreOperationException { AgentManager agentManager = AgentManager.getInstance(); - String tokenEndpoint = agentManager.getAgentConfigs().getApimGatewayEndpoint() + "/token"; + String tokenEndpoint = agentManager.getAgentConfigs().getApimGatewayEndpoint(); + tokenEndpoint = tokenEndpoint + APIManagerTokenUtils.TOKEN_ENDPOINT; + 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(); @@ -310,6 +332,13 @@ public class AgentUtilOperations { APIManagerTokenUtils.REFRESH_TOKEN + "=" + refreshToken + "&" + APIManagerTokenUtils.SCOPE + "=" + applicationScope; + httpConnection = TransportUtils.getHttpConnection(tokenEndpoint); + httpConnection.setRequestMethod(AgentConstants.HTTP_POST); + httpConnection.setRequestProperty(AgentConstants.AUTHORIZATION_HEADER, + "Basic " + agentManager.getAgentConfigs().getApiApplicationKey()); + httpConnection.setRequestProperty(AgentConstants.CONTENT_TYPE_HEADER, AgentConstants.X_WWW_FORM_URLENCODED); + httpConnection.setDoOutput(true); + DataOutputStream dataOutPutWriter = new DataOutputStream(httpConnection.getOutputStream()); dataOutPutWriter.writeBytes(requestPayload); dataOutPutWriter.flush(); @@ -320,17 +349,19 @@ public class AgentUtilOperations { log.info(AgentConstants.LOG_APPENDER + "Response [" + httpConnection.getResponseCode() + ":" + httpConnection.getResponseMessage() + "] was received for token refresh attempt."); - connectionBuffer = new BufferedReader(new InputStreamReader(httpConnection.getInputStream())); + if (httpConnection.getResponseCode() == HttpStatus.OK_200) { + connectionBuffer = new BufferedReader(new InputStreamReader(httpConnection.getInputStream())); + while ((dataFromBuffer = connectionBuffer.readLine()) != null) { + responseMessage.append(dataFromBuffer); + } - while ((dataFromBuffer = connectionBuffer.readLine()) != null) { - responseMessage.append(dataFromBuffer); + log.info(AgentConstants.LOG_APPENDER + + "Response " + responseMessage + " was received for the token refresh call."); + updateExistingTokens(responseMessage.toString()); + } else { + log.info(AgentConstants.LOG_APPENDER + "There was an issue with refreshing the Access Token."); } - 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) { @@ -359,20 +390,18 @@ public class AgentUtilOperations { httpConnection.disconnect(); } } - return refreshStatus; } - - private static boolean updateExistingTokens(String responseFromTokenEP) { + private static void updateExistingTokens(String responseFromTokenEP) throws AgentCoreOperationException { 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; + String msg = + "Neither Access-Token nor Refresh-Token was found in the response [" + responseFromTokenEP + "]."; + log.error(AgentConstants.LOG_APPENDER + msg); + throw new AgentCoreOperationException(msg); } AgentManager.getInstance().getAgentConfigs().setAuthToken(newAccessToken); @@ -380,42 +409,21 @@ public class AgentUtilOperations { 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"); - } - } + PropertiesConfiguration propertyFileConfiguration = new PropertiesConfiguration(deviceConfigFilePath); + propertyFileConfiguration.setProperty(AgentConstants.AUTH_TOKEN_PROPERTY, newAccessToken); + propertyFileConfiguration.setProperty(AgentConstants.REFRESH_TOKEN_PROPERTY, newRefreshToken); + propertyFileConfiguration.save(); + } catch (ConfigurationException e) { + String msg = "Error occurred whilst trying to update the [" + AgentConstants.AGENT_PROPERTIES_FILE_NAME + + "] at: " + deviceConfigFilePath + " will the new tokens."; + log.error(AgentConstants.LOG_APPENDER + msg); + throw new AgentCoreOperationException(msg); } - return true; } - private class APIManagerTokenUtils { + public static final String TOKEN_ENDPOINT = "/oauth2/token"; public static final String GRANT_TYPE = "grant_type"; public static final String ACCESS_TOKEN = "access_token"; public static final String REFRESH_TOKEN = "refresh_token"; 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/enrollment/EnrollmentManager.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/enrollment/EnrollmentManager.java index 345743ac4..4132e503f 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/enrollment/EnrollmentManager.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/enrollment/EnrollmentManager.java @@ -44,18 +44,24 @@ import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core.AgentManager; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.exception.AgentCoreOperationException; import sun.security.x509.X509CertImpl; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.math.BigInteger; import java.net.MalformedURLException; import java.net.URL; +import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; +import java.security.KeyStore; +import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; import java.security.Security; +import java.security.UnrecoverableKeyException; import java.security.cert.CertStore; import java.security.cert.CertStoreException; import java.security.cert.Certificate; @@ -96,6 +102,7 @@ public class EnrollmentManager { private PublicKey publicKey; private PublicKey serverPublicKey; private X509Certificate SCEPCertificate; + private boolean isEnrolled = false; /** @@ -104,6 +111,7 @@ public class EnrollmentManager { */ private EnrollmentManager() { this.SCEPUrl = AgentManager.getInstance().getEnrollmentEP(); + setEnrollmentStatus(); } /** @@ -119,6 +127,58 @@ public class EnrollmentManager { } + public void setEnrollmentStatus() { + KeyStore keyStore; + + try { + keyStore = KeyStore.getInstance(AgentConstants.DEVICE_KEYSTORE_TYPE); + keyStore.load(new FileInputStream(AgentConstants.DEVICE_KEYSTORE), + AgentConstants.DEVICE_KEYSTORE_PASSWORD.toCharArray()); + + this.isEnrolled = (keyStore.containsAlias(AgentConstants.DEVICE_CERT_ALIAS) && + keyStore.containsAlias(AgentConstants.DEVICE_PRIVATE_KEY_ALIAS)); + + } catch (KeyStoreException e) { + log.error(AgentConstants.LOG_APPENDER + "An error occurred whilst accessing the device KeyStore '" + + AgentConstants.DEVICE_KEYSTORE + "' with keystore type [" + + AgentConstants.DEVICE_KEYSTORE_TYPE + "] to ensure enrollment status."); + log.error(AgentConstants.LOG_APPENDER + e); + log.warn(AgentConstants.LOG_APPENDER + "Device will be re-enrolled."); + return; + } catch (CertificateException | NoSuchAlgorithmException e) { + log.error(AgentConstants.LOG_APPENDER + "An error occurred whilst trying to [load] the device KeyStore '" + + AgentConstants.DEVICE_KEYSTORE + "'."); + log.error(AgentConstants.LOG_APPENDER + e); + log.warn(AgentConstants.LOG_APPENDER + "Device will be re-enrolled."); + return; + } catch (IOException e) { + log.error(AgentConstants.LOG_APPENDER + + "An error occurred whilst trying to load input stream with the keystore file: " + + AgentConstants.DEVICE_KEYSTORE); + log.error(AgentConstants.LOG_APPENDER + e); + log.warn(AgentConstants.LOG_APPENDER + "Device will be re-enrolled."); + return; + } + + try { + if (this.isEnrolled) { + this.SCEPCertificate = (X509Certificate) keyStore.getCertificate(AgentConstants.DEVICE_CERT_ALIAS); + this.privateKey = (PrivateKey) keyStore.getKey(AgentConstants.DEVICE_PRIVATE_KEY_ALIAS, + AgentConstants.DEVICE_KEYSTORE_PASSWORD.toCharArray()); + this.serverPublicKey = (PublicKey) keyStore.getKey(AgentConstants.SERVER_PUBLIC_KEY_ALIAS, + AgentConstants.DEVICE_KEYSTORE_PASSWORD + .toCharArray()); + this.publicKey = SCEPCertificate.getPublicKey(); + } + } catch (UnrecoverableKeyException | NoSuchAlgorithmException | KeyStoreException e) { + log.error(AgentConstants.LOG_APPENDER + "An error occurred whilst accessing the device KeyStore '" + + AgentConstants.DEVICE_KEYSTORE + "' to ensure enrollment status."); + log.error(AgentConstants.LOG_APPENDER + e); + log.warn(AgentConstants.LOG_APPENDER + "Device will be re-enrolled."); + this.isEnrolled = false; + } + } + /** * Method to control the entire enrollment flow. This method calls the method to create the Private-Public Key * Pair, calls the specific method to generate the Certificate-Sign-Request, creates a one time self signed @@ -181,14 +241,67 @@ public class EnrollmentManager { this.SCEPCertificate = getSignedCertificateFromServer(tmpCert, certSignRequest); this.serverPublicKey = initPublicKeyOfServer(); + storeCertificateToStore(AgentConstants.DEVICE_CERT_ALIAS, SCEPCertificate); + storeKeyToKeyStore(AgentConstants.DEVICE_PRIVATE_KEY_ALIAS, this.privateKey, SCEPCertificate); + storeKeyToKeyStore(AgentConstants.SERVER_PUBLIC_KEY_ALIAS, this.serverPublicKey, SCEPCertificate); + if (log.isDebugEnabled()) { + log.info(AgentConstants.LOG_APPENDER + + "SCEPCertificate, DevicePrivateKey, ServerPublicKey was saved to device keystore [" + + AgentConstants.DEVICE_KEYSTORE + "]"); log.info(AgentConstants.LOG_APPENDER + "TemporaryCertPublicKey:\n[\n" + tmpCert.getPublicKey() + "\n]\n"); log.info(AgentConstants.LOG_APPENDER + "ServerPublicKey:\n[\n" + serverPublicKey + "\n]\n"); } + } + private void storeCertificateToStore(String alias, Certificate certificate) { + KeyStore keyStore; + try { + keyStore = KeyStore.getInstance(AgentConstants.DEVICE_KEYSTORE_TYPE); + keyStore.load(new FileInputStream(AgentConstants.DEVICE_KEYSTORE), + AgentConstants.DEVICE_KEYSTORE_PASSWORD.toCharArray()); + + keyStore.setCertificateEntry(alias, certificate); + keyStore.store(new FileOutputStream(AgentConstants.DEVICE_KEYSTORE), + AgentConstants.DEVICE_KEYSTORE_PASSWORD.toCharArray()); + + } catch (KeyStoreException | CertificateException | NoSuchAlgorithmException | IOException e) { + log.error(AgentConstants.LOG_APPENDER + + "An error occurred whilst trying to store the Certificate received from the SCEP " + + "Enrollment."); + log.error(AgentConstants.LOG_APPENDER + e); + log.warn(AgentConstants.LOG_APPENDER + + "SCEP Certificate was not stored in the keystore; " + + "Hence the device will be re-enrolled during next restart."); + } } + private void storeKeyToKeyStore(String alias, Key cryptoKey, Certificate certInCertChain) { + KeyStore keyStore; + try { + keyStore = KeyStore.getInstance(AgentConstants.DEVICE_KEYSTORE_TYPE); + keyStore.load(new FileInputStream(AgentConstants.DEVICE_KEYSTORE), + AgentConstants.DEVICE_KEYSTORE_PASSWORD.toCharArray()); + + Certificate[] certChain = new Certificate[1]; + certChain[0] = certInCertChain; + + keyStore.setKeyEntry(alias, cryptoKey, AgentConstants.DEVICE_KEYSTORE_PASSWORD.toCharArray(), certChain); + keyStore.store(new FileOutputStream(AgentConstants.DEVICE_KEYSTORE), + AgentConstants.DEVICE_KEYSTORE_PASSWORD.toCharArray()); + + } catch (KeyStoreException | CertificateException | NoSuchAlgorithmException | IOException e) { + log.error(AgentConstants.LOG_APPENDER + + "An error occurred whilst trying to store the key with alias " + + "[" + alias + "] in the device keystore."); + log.error(AgentConstants.LOG_APPENDER + e); + log.warn(AgentConstants.LOG_APPENDER + + "Key [" + alias + "] was not stored in the keystore; " + + "Hence the device will be re-enrolled during next restart."); + } + } + /** * This method creates the Public-Private Key pair for the current client. * @@ -407,9 +520,9 @@ public class EnrollmentManager { return serverCertPublicKey; } - /** * Gets the Public-Key of the client. + * * @return the public key of the client. */ public PublicKey getPublicKey() { @@ -418,6 +531,7 @@ public class EnrollmentManager { /** * Gets the Private-Key of the client. + * * @return the private key of the client. */ public PrivateKey getPrivateKey() { @@ -426,6 +540,7 @@ public class EnrollmentManager { /** * Gets the SCEP-Certificate of the client. + * * @return the SCEP Certificate of the client. */ public X509Certificate getSCEPCertificate() { @@ -434,9 +549,19 @@ public class EnrollmentManager { /** * Gets the Public-Key of the Server. + * * @return the pubic key of the server. */ public PublicKey getServerPublicKey() { 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; + } } 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/transport/TransportUtils.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/transport/TransportUtils.java index 050b8a578..11ebc04bf 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/transport/TransportUtils.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/transport/TransportUtils.java @@ -20,6 +20,7 @@ package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core.AgentConstants; import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportHandlerException; import java.io.BufferedReader; @@ -67,9 +68,9 @@ public class TransportUtils { throw new TransportHandlerException(errorMsg); } - ipPortMap.put("Protocol", ipPortArray[0]); - ipPortMap.put("Host", ipPortArray[1].replace("/", "")); - ipPortMap.put("Port", ipPortArray[2]); + ipPortMap.put(AgentConstants.PROTOCOL_PROPERTY, ipPortArray[0]); + ipPortMap.put(AgentConstants.HOST_PROPERTY, ipPortArray[1].replace("/", "")); + ipPortMap.put(AgentConstants.PORT_PROPERTY, ipPortArray[2]); return ipPortMap; } @@ -99,8 +100,7 @@ public class TransportUtils { return !ipAddress.endsWith("."); } catch (NumberFormatException nfe) { - log.warn("The IP Address: " + ipAddress + " could not " + - "be validated against IPv4-style"); + log.warn("The IP Address: " + ipAddress + " could not be validated against IPv4-style"); return false; } } 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/transport/mqtt/MQTTTransportHandler.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/transport/mqtt/MQTTTransportHandler.java index e25324ea1..f7c6864c1 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/transport/mqtt/MQTTTransportHandler.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/transport/mqtt/MQTTTransportHandler.java @@ -52,7 +52,6 @@ import java.nio.charset.StandardCharsets; public abstract class MQTTTransportHandler implements MqttCallback, TransportHandler { private static final Log log = LogFactory.getLog(MQTTTransportHandler.class); - private static final String DEFAULT_PASSWORD = ""; public static final int DEFAULT_MQTT_QUALITY_OF_SERVICE = 0; private MqttClient client; @@ -82,8 +81,6 @@ public abstract class MQTTTransportHandler this.mqttBrokerEndPoint = mqttBrokerEndPoint; this.timeoutInterval = DEFAULT_TIMEOUT_INTERVAL; this.initSubscriber(); - options.setUserName(AgentManager.getInstance().getAgentConfigs().getAuthToken()); - options.setPassword(DEFAULT_PASSWORD.toCharArray()); } /** @@ -108,8 +105,6 @@ public abstract class MQTTTransportHandler this.mqttBrokerEndPoint = mqttBrokerEndPoint; this.timeoutInterval = intervalInMillis; this.initSubscriber(); - options.setUserName(AgentManager.getInstance().getAgentConfigs().getAuthToken()); - options.setPassword(DEFAULT_PASSWORD.toCharArray()); } public void setTimeoutInterval(int timeoutInterval) { @@ -156,6 +151,12 @@ public abstract class MQTTTransportHandler } + protected void connectToQueue(String username, String password) throws TransportHandlerException { + options.setUserName(username); + options.setPassword(password.toCharArray()); + connectToQueue(); + } + /** * Connects to the MQTT-Broker and if successfully established connection. * @@ -248,8 +249,7 @@ public abstract class MQTTTransportHandler try { client.publish(topic, payLoad.getBytes(StandardCharsets.UTF_8), qos, retained); if (log.isDebugEnabled()) { - log.debug("Message: " + payLoad + " to MQTT topic [" + topic + - "] published successfully"); + log.debug("Message: " + payLoad + " to MQTT topic [" + topic + "] published successfully"); } } catch (MqttException ex) { String errorMsg = @@ -267,8 +267,7 @@ public abstract class MQTTTransportHandler try { client.publish(topic, message); if (log.isDebugEnabled()) { - log.debug("Message: " + message.toString() + " to MQTT topic [" + topic + - "] published successfully"); + log.debug("Message: " + message.toString() + " to MQTT topic [" + topic + "] published successfully"); } } catch (MqttException ex) { //TODO:: Compulsory log of errors and remove formatted error @@ -291,8 +290,7 @@ public abstract class MQTTTransportHandler @Override public void connectionLost(Throwable throwable) { log.warn("Lost Connection for client: " + this.clientId + - " to " + this.mqttBrokerEndPoint + ".\nThis was due to - " + - throwable.getMessage()); + " to " + this.mqttBrokerEndPoint + ".\nThis was due to - " + throwable.getMessage()); Thread reconnectThread = new Thread() { public void run() { @@ -340,8 +338,7 @@ public abstract class MQTTTransportHandler } catch (MqttException e) { //TODO:: Throw errors log.error( - "Error occurred whilst trying to read the message from the MQTT delivery " + - "token."); + "Error occurred whilst trying to read the message from the MQTT delivery token."); } String topic = iMqttDeliveryToken.getTopics()[0]; String client = iMqttDeliveryToken.getClient().getClientId(); 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 07d055e16..36444611d 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 @@ -77,7 +77,7 @@ public class ZipUtil { xmppEndpoint = xmppEndpoint.replace(LOCALHOST, iotServerIP); } - String base64EncodedApplicationKey = getBase64EncodedAPIAppKey(apiApplicationKey); + String base64EncodedApplicationKey = getBase64EncodedAPIAppKey(apiApplicationKey).trim(); Map contextParams = new HashMap<>(); contextParams.put(VirtualFireAlarmUtilConstants.TENANT_DOMAIN, APIUtil.getTenantDomainOftheUser()); diff --git a/features/iot-plugins-feature/virtual-fire-alarm-plugin-feature/org.wso2.carbon.device.mgt.iot.virtualfirealarm.feature/src/main/resources/agent/deviceConfig.properties b/features/iot-plugins-feature/virtual-fire-alarm-plugin-feature/org.wso2.carbon.device.mgt.iot.virtualfirealarm.feature/src/main/resources/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/agent/deviceConfig.properties +++ b/features/iot-plugins-feature/virtual-fire-alarm-plugin-feature/org.wso2.carbon.device.mgt.iot.virtualfirealarm.feature/src/main/resources/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 diff --git a/features/iot-plugins-feature/virtual-fire-alarm-plugin-feature/org.wso2.carbon.device.mgt.iot.virtualfirealarm.feature/src/main/resources/agent/virtual_firealarm.jks b/features/iot-plugins-feature/virtual-fire-alarm-plugin-feature/org.wso2.carbon.device.mgt.iot.virtualfirealarm.feature/src/main/resources/agent/virtual_firealarm.jks new file mode 100644 index 000000000..7ce3e66ad Binary files /dev/null and b/features/iot-plugins-feature/virtual-fire-alarm-plugin-feature/org.wso2.carbon.device.mgt.iot.virtualfirealarm.feature/src/main/resources/agent/virtual_firealarm.jks differ