mirror of
https://repository.entgra.net/community/device-mgt-plugins.git
synced 2025-09-16 23:42:15 +00:00
Modifications to the Token Refresh Flow & the Enrolment flow in the VFAlarm
This commit is contained in:
parent
75914aee4e
commit
a117ae37c7
@ -175,6 +175,13 @@
|
|||||||
<artifactId>json</artifactId>
|
<artifactId>json</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-configuration</groupId>
|
||||||
|
<artifactId>commons-configuration</artifactId>
|
||||||
|
<version>1.10</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -22,6 +22,7 @@ import org.apache.commons.logging.Log;
|
|||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.eclipse.paho.client.mqttv3.MqttException;
|
import org.eclipse.paho.client.mqttv3.MqttException;
|
||||||
import org.eclipse.paho.client.mqttv3.MqttMessage;
|
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.AgentConstants;
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core.AgentManager;
|
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core.AgentManager;
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core.AgentUtilOperations;
|
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 ScheduledExecutorService service = Executors.newScheduledThreadPool(2);
|
||||||
private ScheduledFuture<?> dataPushServiceHandler;
|
private ScheduledFuture<?> dataPushServiceHandler;
|
||||||
|
private static final String DEFAULT_PASSWORD = "";
|
||||||
|
|
||||||
public FireAlarmMQTTCommunicator(String deviceOwner, String deviceType,
|
public FireAlarmMQTTCommunicator(String deviceOwner, String deviceType,
|
||||||
String mqttBrokerEndPoint, String subscribeTopic) {
|
String mqttBrokerEndPoint, String subscribeTopic) {
|
||||||
@ -68,18 +70,23 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
|
|||||||
public void run() {
|
public void run() {
|
||||||
while (!isConnected()) {
|
while (!isConnected()) {
|
||||||
try {
|
try {
|
||||||
connectToQueue();
|
connectToQueue(agentManager.getAgentConfigs().getAuthToken(), DEFAULT_PASSWORD);
|
||||||
agentManager.updateAgentStatus("Connected to MQTT Queue");
|
agentManager.updateAgentStatus("Connected to MQTT Queue");
|
||||||
} catch (TransportHandlerException e) {
|
} catch (TransportHandlerException e) {
|
||||||
log.warn(AgentConstants.LOG_APPENDER + "Connection to MQTT Broker at: " + mqttBrokerEndPoint +
|
log.warn(AgentConstants.LOG_APPENDER + "Connection to MQTT Broker at: " + mqttBrokerEndPoint +
|
||||||
" failed.\n Will retry in " + timeoutInterval + " milli-seconds.");
|
" failed.\n Will retry in " + timeoutInterval + " milli-seconds.");
|
||||||
|
|
||||||
|
if (e.getCause() != null && e.getCause() instanceof MqttSecurityException) {
|
||||||
|
refreshOAuthToken((MqttSecurityException) e.getCause());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
try{
|
try {
|
||||||
subscribeToQueue();
|
if (isConnected()) {
|
||||||
agentManager.updateAgentStatus("Subscribed to MQTT Queue");
|
subscribeToQueue();
|
||||||
publishDeviceData();
|
agentManager.updateAgentStatus("Subscribed to MQTT Queue");
|
||||||
|
publishDeviceData();
|
||||||
|
}
|
||||||
} catch (TransportHandlerException e) {
|
} catch (TransportHandlerException e) {
|
||||||
log.warn(AgentConstants.LOG_APPENDER + "Subscription to MQTT Broker at: " +
|
log.warn(AgentConstants.LOG_APPENDER + "Subscription to MQTT Broker at: " +
|
||||||
mqttBrokerEndPoint + " failed");
|
mqttBrokerEndPoint + " failed");
|
||||||
@ -100,6 +107,26 @@ public class FireAlarmMQTTCommunicator extends MQTTTransportHandler {
|
|||||||
connectorThread.start();
|
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
|
@Override
|
||||||
public void processIncomingMessage(MqttMessage message, String... messageParams) {
|
public void processIncomingMessage(MqttMessage message, String... messageParams) {
|
||||||
|
|||||||
@ -27,7 +27,6 @@ public class AgentConstants {
|
|||||||
/* ---------------------------------------------------------------------------------------
|
/* ---------------------------------------------------------------------------------------
|
||||||
IoT-Server specific information
|
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_ENROLLMENT_API_EP = "/scep";
|
||||||
public static final String DEVICE_REGISTER_API_EP = "/register";
|
public static final String DEVICE_REGISTER_API_EP = "/register";
|
||||||
public static final String DEVICE_PUSH_TEMPERATURE_API_EP = "/temperature";
|
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\"," +
|
"{\"owner\":\"%s\",\"deviceId\":\"%s\",\"reply\":\"%s\",\"value\":\"%s\",\"isSimulated\":\"%s\"," +
|
||||||
"\"duration\":\"%s\",\"frequency\":\"%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_DETAILS_PAGE_EP = "/devicemgt/device/%s?id=%s";
|
||||||
public static final String DEVICE_ANALYTICS_PAGE_URL =
|
public static final String DEVICE_ANALYTICS_PAGE_URL =
|
||||||
"/devicemgt/device/virtual_firealarm/analytics?deviceId=%s&deviceName=%s";
|
"/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 AUTHORIZATION_HEADER = "Authorization";
|
||||||
public static final String CONTENT_TYPE_HEADER = "Content-Type";
|
public static final String CONTENT_TYPE_HEADER = "Content-Type";
|
||||||
public static final String APPLICATION_JSON = "application/json";
|
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 REGISTERED = "Registered";
|
||||||
public static final String NOT_REGISTERED = "Not-Registered";
|
public static final String NOT_REGISTERED = "Not-Registered";
|
||||||
public static final String REGISTRATION_FAILED = "Registration Failed";
|
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 HTTP_PROTOCOL = "HTTP";
|
||||||
public static final String MQTT_PROTOCOL = "MQTT";
|
public static final String MQTT_PROTOCOL = "MQTT";
|
||||||
public static final String XMPP_PROTOCOL = "XMPP";
|
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";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -74,18 +74,19 @@ public class AgentManager {
|
|||||||
public void init() {
|
public void init() {
|
||||||
|
|
||||||
agentCommunicator = new HashMap<>();
|
agentCommunicator = new HashMap<>();
|
||||||
|
|
||||||
// Read IoT-Server specific configurations from the 'deviceConfig.properties' file
|
// Read IoT-Server specific configurations from the 'deviceConfig.properties' file
|
||||||
try {
|
try {
|
||||||
this.agentConfigs = AgentUtilOperations.readIoTServerConfigs();
|
this.agentConfigs = AgentUtilOperations.readIoTServerConfigs();
|
||||||
} catch (AgentCoreOperationException e) {
|
} 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);
|
log.error(e);
|
||||||
System.exit(0);
|
System.exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialise IoT-Server URL endpoints from the configuration read from file
|
// Initialise IoT-Server URL endpoints from the configuration read from file
|
||||||
AgentUtilOperations.initializeServerEndPoints();
|
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,
|
String analyticsPageContext = String.format(AgentConstants.DEVICE_ANALYTICS_PAGE_URL,
|
||||||
agentConfigs.getDeviceId(),
|
agentConfigs.getDeviceId(),
|
||||||
@ -153,7 +154,9 @@ public class AgentManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
EnrollmentManager.getInstance().beginEnrollmentFlow();
|
if (!EnrollmentManager.getInstance().isEnrolled()) {
|
||||||
|
EnrollmentManager.getInstance().beginEnrollmentFlow();
|
||||||
|
}
|
||||||
} catch (AgentCoreOperationException e) {
|
} catch (AgentCoreOperationException e) {
|
||||||
log.error("Device Enrollment Failed:\n");
|
log.error("Device Enrollment Failed:\n");
|
||||||
log.error(e);
|
log.error(e);
|
||||||
|
|||||||
@ -19,8 +19,11 @@
|
|||||||
package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core;
|
package org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.core;
|
||||||
|
|
||||||
import org.apache.commons.codec.binary.Base64;
|
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.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.eclipse.jetty.http.HttpStatus;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.enrollment.EnrollmentManager;
|
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.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.TransportHandlerException;
|
||||||
import org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportUtils;
|
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.BufferedReader;
|
||||||
import java.io.DataOutputStream;
|
import java.io.DataOutputStream;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
@ -78,86 +83,91 @@ public class AgentUtilOperations {
|
|||||||
try {
|
try {
|
||||||
ClassLoader loader = AgentUtilOperations.class.getClassLoader();
|
ClassLoader loader = AgentUtilOperations.class.getClassLoader();
|
||||||
URL path = loader.getResource(propertiesFileName);
|
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());
|
if (path != null) {
|
||||||
agentManager.setRootPath(rootPath);
|
log.info(AgentConstants.LOG_APPENDER + path);
|
||||||
|
rootPath = path.getPath().replace("wso2-firealarm-virtual-agent.jar!/deviceConfig.properties", "")
|
||||||
|
.replace("jar:", "").replace("file:", "");
|
||||||
|
|
||||||
String deviceConfigFilePath = rootPath + AgentConstants.AGENT_PROPERTIES_FILE_NAME;
|
rootPath = URLDecoder.decode(rootPath, StandardCharsets.UTF_8.toString());
|
||||||
propertiesInputStream = new FileInputStream(deviceConfigFilePath);
|
agentManager.setRootPath(rootPath);
|
||||||
|
|
||||||
//load a properties file from class path, inside static method
|
String deviceConfigFilePath = rootPath + AgentConstants.AGENT_PROPERTIES_FILE_NAME;
|
||||||
properties.load(propertiesInputStream);
|
propertiesInputStream = new FileInputStream(deviceConfigFilePath);
|
||||||
|
|
||||||
iotServerConfigs.setTenantDomain(properties.getProperty(
|
//load a properties file from class path, inside static method
|
||||||
AgentConstants.TENANT_DOMAIN));
|
properties.load(propertiesInputStream);
|
||||||
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.setTenantDomain(properties.getProperty(
|
||||||
iotServerConfigs.getTenantDomain());
|
AgentConstants.TENANT_DOMAIN));
|
||||||
log.info(AgentConstants.LOG_APPENDER + "Device Owner: " +
|
iotServerConfigs.setDeviceOwner(properties.getProperty(
|
||||||
iotServerConfigs.getDeviceOwner());
|
AgentConstants.DEVICE_OWNER_PROPERTY));
|
||||||
log.info(AgentConstants.LOG_APPENDER + "Device ID: " + iotServerConfigs.getDeviceId());
|
iotServerConfigs.setDeviceId(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "Device Name: " +
|
AgentConstants.DEVICE_ID_PROPERTY));
|
||||||
iotServerConfigs.getDeviceName());
|
iotServerConfigs.setDeviceName(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "Device Controller Context: " +
|
AgentConstants.DEVICE_NAME_PROPERTY));
|
||||||
iotServerConfigs.getControllerContext());
|
iotServerConfigs.setControllerContext(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "IoT Server HTTPS EndPoint: " +
|
AgentConstants.DEVICE_CONTROLLER_CONTEXT_PROPERTY));
|
||||||
iotServerConfigs.getHTTPS_ServerEndpoint());
|
iotServerConfigs.setScepContext(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "IoT Server HTTP EndPoint: " +
|
AgentConstants.DEVICE_SCEP_CONTEXT_PROPERTY));
|
||||||
iotServerConfigs.getHTTP_ServerEndpoint());
|
iotServerConfigs.setHTTPS_ServerEndpoint(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "API-Manager Gateway EndPoint: " +
|
AgentConstants.SERVER_HTTPS_EP_PROPERTY));
|
||||||
iotServerConfigs.getApimGatewayEndpoint());
|
iotServerConfigs.setHTTP_ServerEndpoint(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "MQTT Broker EndPoint: " +
|
AgentConstants.SERVER_HTTP_EP_PROPERTY));
|
||||||
iotServerConfigs.getMqttBrokerEndpoint());
|
iotServerConfigs.setApimGatewayEndpoint(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "XMPP Server EndPoint: " +
|
AgentConstants.APIM_GATEWAY_EP_PROPERTY));
|
||||||
iotServerConfigs.getXmppServerEndpoint());
|
iotServerConfigs.setMqttBrokerEndpoint(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "Authentication Method: " +
|
AgentConstants.MQTT_BROKER_EP_PROPERTY));
|
||||||
iotServerConfigs.getAuthMethod());
|
iotServerConfigs.setXmppServerEndpoint(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "Base64Encoded API Application Key: " +
|
AgentConstants.XMPP_SERVER_EP_PROPERTY));
|
||||||
iotServerConfigs.getApiApplicationKey());
|
iotServerConfigs.setXmppServerName(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "Authentication Token: " +
|
AgentConstants.XMPP_SERVER_NAME_PROPERTY));
|
||||||
iotServerConfigs.getAuthToken());
|
iotServerConfigs.setApiApplicationKey(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "Refresh Token: " +
|
AgentConstants.API_APPLICATION_KEY));
|
||||||
iotServerConfigs.getRefreshToken());
|
iotServerConfigs.setAuthMethod(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "Data Push Interval: " +
|
AgentConstants.AUTH_METHOD_PROPERTY));
|
||||||
iotServerConfigs.getDataPushInterval());
|
iotServerConfigs.setAuthToken(properties.getProperty(
|
||||||
log.info(AgentConstants.LOG_APPENDER + "XMPP Server Name: " +
|
AgentConstants.AUTH_TOKEN_PROPERTY));
|
||||||
iotServerConfigs.getXmppServerName());
|
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) {
|
} catch (FileNotFoundException ex) {
|
||||||
String errorMsg = "[" + propertiesFileName + "] file not found at: " + rootPath;
|
String errorMsg = "[" + propertiesFileName + "] file not found at: " + rootPath;
|
||||||
log.error(AgentConstants.LOG_APPENDER + errorMsg);
|
log.error(AgentConstants.LOG_APPENDER + errorMsg);
|
||||||
@ -216,6 +226,26 @@ public class AgentUtilOperations {
|
|||||||
log.info(AgentConstants.LOG_APPENDER + "Push-Data API EndPoint: " + pushDataEndPointURL);
|
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 {
|
public static String prepareSecurePayLoad(String message) throws AgentCoreOperationException {
|
||||||
PrivateKey devicePrivateKey = EnrollmentManager.getInstance().getPrivateKey();
|
PrivateKey devicePrivateKey = EnrollmentManager.getInstance().getPrivateKey();
|
||||||
@ -234,7 +264,6 @@ public class AgentUtilOperations {
|
|||||||
jsonPayload.put(JSON_SIGNATURE_KEY, signedPayload);
|
jsonPayload.put(JSON_SIGNATURE_KEY, signedPayload);
|
||||||
//below statements are temporary fix.
|
//below statements are temporary fix.
|
||||||
jsonPayload.put(JSON_SERIAL_KEY, EnrollmentManager.getInstance().getSCEPCertificate().getSerialNumber());
|
jsonPayload.put(JSON_SERIAL_KEY, EnrollmentManager.getInstance().getSCEPCertificate().getSerialNumber());
|
||||||
|
|
||||||
return jsonPayload.toString();
|
return jsonPayload.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -282,26 +311,19 @@ public class AgentUtilOperations {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void refreshOAuthToken() throws AgentCoreOperationException {
|
||||||
public static boolean refreshOAuthToken() throws AgentCoreOperationException {
|
|
||||||
|
|
||||||
AgentManager agentManager = AgentManager.getInstance();
|
AgentManager agentManager = AgentManager.getInstance();
|
||||||
String tokenEndpoint = agentManager.getAgentConfigs().getApimGatewayEndpoint() + "/token";
|
String tokenEndpoint = agentManager.getAgentConfigs().getApimGatewayEndpoint();
|
||||||
|
tokenEndpoint = tokenEndpoint + APIManagerTokenUtils.TOKEN_ENDPOINT;
|
||||||
|
|
||||||
HttpURLConnection httpConnection = null;
|
HttpURLConnection httpConnection = null;
|
||||||
BufferedReader connectionBuffer = null;
|
BufferedReader connectionBuffer = null;
|
||||||
String requestPayload;
|
String requestPayload;
|
||||||
String dataFromBuffer;
|
String dataFromBuffer;
|
||||||
StringBuilder responseMessage = new StringBuilder();
|
StringBuilder responseMessage = new StringBuilder();
|
||||||
boolean refreshStatus = false;
|
|
||||||
|
|
||||||
try {
|
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 refreshToken = agentManager.getAgentConfigs().getRefreshToken();
|
||||||
String applicationScope = "device_type_" + AgentConstants.DEVICE_TYPE +
|
String applicationScope = "device_type_" + AgentConstants.DEVICE_TYPE +
|
||||||
" device_" + agentManager.getAgentConfigs().getDeviceId();
|
" device_" + agentManager.getAgentConfigs().getDeviceId();
|
||||||
@ -310,6 +332,13 @@ public class AgentUtilOperations {
|
|||||||
APIManagerTokenUtils.REFRESH_TOKEN + "=" + refreshToken + "&" +
|
APIManagerTokenUtils.REFRESH_TOKEN + "=" + refreshToken + "&" +
|
||||||
APIManagerTokenUtils.SCOPE + "=" + applicationScope;
|
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());
|
DataOutputStream dataOutPutWriter = new DataOutputStream(httpConnection.getOutputStream());
|
||||||
dataOutPutWriter.writeBytes(requestPayload);
|
dataOutPutWriter.writeBytes(requestPayload);
|
||||||
dataOutPutWriter.flush();
|
dataOutPutWriter.flush();
|
||||||
@ -320,17 +349,19 @@ public class AgentUtilOperations {
|
|||||||
log.info(AgentConstants.LOG_APPENDER + "Response [" + httpConnection.getResponseCode() + ":" +
|
log.info(AgentConstants.LOG_APPENDER + "Response [" + httpConnection.getResponseCode() + ":" +
|
||||||
httpConnection.getResponseMessage() + "] was received for token refresh attempt.");
|
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) {
|
log.info(AgentConstants.LOG_APPENDER +
|
||||||
responseMessage.append(dataFromBuffer);
|
"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) {
|
} catch (TransportHandlerException e) {
|
||||||
throw new AgentCoreOperationException(e);
|
throw new AgentCoreOperationException(e);
|
||||||
} catch (ProtocolException e) {
|
} catch (ProtocolException e) {
|
||||||
@ -359,20 +390,18 @@ public class AgentUtilOperations {
|
|||||||
httpConnection.disconnect();
|
httpConnection.disconnect();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return refreshStatus;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static void updateExistingTokens(String responseFromTokenEP) throws AgentCoreOperationException {
|
||||||
private static boolean updateExistingTokens(String responseFromTokenEP) {
|
|
||||||
JSONObject jsonTokenObject = new JSONObject(responseFromTokenEP);
|
JSONObject jsonTokenObject = new JSONObject(responseFromTokenEP);
|
||||||
String newAccessToken = jsonTokenObject.get(APIManagerTokenUtils.ACCESS_TOKEN).toString();
|
String newAccessToken = jsonTokenObject.get(APIManagerTokenUtils.ACCESS_TOKEN).toString();
|
||||||
String newRefreshToken = jsonTokenObject.get(APIManagerTokenUtils.REFRESH_TOKEN).toString();
|
String newRefreshToken = jsonTokenObject.get(APIManagerTokenUtils.REFRESH_TOKEN).toString();
|
||||||
|
|
||||||
if (newAccessToken == null || newRefreshToken == null) {
|
if (newAccessToken == null || newRefreshToken == null) {
|
||||||
log.error(
|
String msg =
|
||||||
AgentConstants.LOG_APPENDER + "Neither Access-Token nor Refresh-Token was found in the response [" +
|
"Neither Access-Token nor Refresh-Token was found in the response [" + responseFromTokenEP + "].";
|
||||||
responseFromTokenEP + "].");
|
log.error(AgentConstants.LOG_APPENDER + msg);
|
||||||
return false;
|
throw new AgentCoreOperationException(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
AgentManager.getInstance().getAgentConfigs().setAuthToken(newAccessToken);
|
AgentManager.getInstance().getAgentConfigs().setAuthToken(newAccessToken);
|
||||||
@ -380,42 +409,21 @@ public class AgentUtilOperations {
|
|||||||
String deviceConfigFilePath =
|
String deviceConfigFilePath =
|
||||||
AgentManager.getInstance().getRootPath() + AgentConstants.AGENT_PROPERTIES_FILE_NAME;
|
AgentManager.getInstance().getRootPath() + AgentConstants.AGENT_PROPERTIES_FILE_NAME;
|
||||||
|
|
||||||
Properties deviceProperties = new Properties();
|
|
||||||
FileOutputStream fileOutputStream = null;
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
fileOutputStream = new FileOutputStream(deviceConfigFilePath);
|
PropertiesConfiguration propertyFileConfiguration = new PropertiesConfiguration(deviceConfigFilePath);
|
||||||
deviceProperties.setProperty(AgentConstants.AUTH_TOKEN_PROPERTY, newAccessToken);
|
propertyFileConfiguration.setProperty(AgentConstants.AUTH_TOKEN_PROPERTY, newAccessToken);
|
||||||
deviceProperties.setProperty(AgentConstants.REFRESH_TOKEN_PROPERTY, newRefreshToken);
|
propertyFileConfiguration.setProperty(AgentConstants.REFRESH_TOKEN_PROPERTY, newRefreshToken);
|
||||||
deviceProperties.store(fileOutputStream, null);
|
propertyFileConfiguration.save();
|
||||||
|
} catch (ConfigurationException e) {
|
||||||
} catch (FileNotFoundException ex) {
|
String msg = "Error occurred whilst trying to update the [" + AgentConstants.AGENT_PROPERTIES_FILE_NAME +
|
||||||
String errorMsg =
|
"] at: " + deviceConfigFilePath + " will the new tokens.";
|
||||||
"[" + AgentConstants.AGENT_PROPERTIES_FILE_NAME + "] file not found at: " + deviceConfigFilePath;
|
log.error(AgentConstants.LOG_APPENDER + msg);
|
||||||
log.error(AgentConstants.LOG_APPENDER + errorMsg);
|
throw new AgentCoreOperationException(msg);
|
||||||
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 {
|
private class APIManagerTokenUtils {
|
||||||
|
public static final String TOKEN_ENDPOINT = "/oauth2/token";
|
||||||
public static final String GRANT_TYPE = "grant_type";
|
public static final String GRANT_TYPE = "grant_type";
|
||||||
public static final String ACCESS_TOKEN = "access_token";
|
public static final String ACCESS_TOKEN = "access_token";
|
||||||
public static final String REFRESH_TOKEN = "refresh_token";
|
public static final String REFRESH_TOKEN = "refresh_token";
|
||||||
|
|||||||
@ -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 org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.exception.AgentCoreOperationException;
|
||||||
import sun.security.x509.X509CertImpl;
|
import sun.security.x509.X509CertImpl;
|
||||||
|
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.math.BigInteger;
|
import java.math.BigInteger;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
import java.security.Key;
|
||||||
import java.security.KeyPair;
|
import java.security.KeyPair;
|
||||||
import java.security.KeyPairGenerator;
|
import java.security.KeyPairGenerator;
|
||||||
|
import java.security.KeyStore;
|
||||||
|
import java.security.KeyStoreException;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
import java.security.NoSuchProviderException;
|
import java.security.NoSuchProviderException;
|
||||||
import java.security.PrivateKey;
|
import java.security.PrivateKey;
|
||||||
import java.security.PublicKey;
|
import java.security.PublicKey;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.security.Security;
|
import java.security.Security;
|
||||||
|
import java.security.UnrecoverableKeyException;
|
||||||
import java.security.cert.CertStore;
|
import java.security.cert.CertStore;
|
||||||
import java.security.cert.CertStoreException;
|
import java.security.cert.CertStoreException;
|
||||||
import java.security.cert.Certificate;
|
import java.security.cert.Certificate;
|
||||||
@ -96,6 +102,7 @@ public class EnrollmentManager {
|
|||||||
private PublicKey publicKey;
|
private PublicKey publicKey;
|
||||||
private PublicKey serverPublicKey;
|
private PublicKey serverPublicKey;
|
||||||
private X509Certificate SCEPCertificate;
|
private X509Certificate SCEPCertificate;
|
||||||
|
private boolean isEnrolled = false;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -104,6 +111,7 @@ public class EnrollmentManager {
|
|||||||
*/
|
*/
|
||||||
private EnrollmentManager() {
|
private EnrollmentManager() {
|
||||||
this.SCEPUrl = AgentManager.getInstance().getEnrollmentEP();
|
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
|
* 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
|
* Pair, calls the specific method to generate the Certificate-Sign-Request, creates a one time self signed
|
||||||
@ -181,13 +241,66 @@ public class EnrollmentManager {
|
|||||||
this.SCEPCertificate = getSignedCertificateFromServer(tmpCert, certSignRequest);
|
this.SCEPCertificate = getSignedCertificateFromServer(tmpCert, certSignRequest);
|
||||||
this.serverPublicKey = initPublicKeyOfServer();
|
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()) {
|
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 + "TemporaryCertPublicKey:\n[\n" + tmpCert.getPublicKey() + "\n]\n");
|
||||||
log.info(AgentConstants.LOG_APPENDER + "ServerPublicKey:\n[\n" + serverPublicKey + "\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.
|
* This method creates the Public-Private Key pair for the current client.
|
||||||
@ -407,9 +520,9 @@ public class EnrollmentManager {
|
|||||||
return serverCertPublicKey;
|
return serverCertPublicKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the Public-Key of the client.
|
* Gets the Public-Key of the client.
|
||||||
|
*
|
||||||
* @return the public key of the client.
|
* @return the public key of the client.
|
||||||
*/
|
*/
|
||||||
public PublicKey getPublicKey() {
|
public PublicKey getPublicKey() {
|
||||||
@ -418,6 +531,7 @@ public class EnrollmentManager {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the Private-Key of the client.
|
* Gets the Private-Key of the client.
|
||||||
|
*
|
||||||
* @return the private key of the client.
|
* @return the private key of the client.
|
||||||
*/
|
*/
|
||||||
public PrivateKey getPrivateKey() {
|
public PrivateKey getPrivateKey() {
|
||||||
@ -426,6 +540,7 @@ public class EnrollmentManager {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the SCEP-Certificate of the client.
|
* Gets the SCEP-Certificate of the client.
|
||||||
|
*
|
||||||
* @return the SCEP Certificate of the client.
|
* @return the SCEP Certificate of the client.
|
||||||
*/
|
*/
|
||||||
public X509Certificate getSCEPCertificate() {
|
public X509Certificate getSCEPCertificate() {
|
||||||
@ -434,9 +549,19 @@ public class EnrollmentManager {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the Public-Key of the Server.
|
* Gets the Public-Key of the Server.
|
||||||
|
*
|
||||||
* @return the pubic key of the server.
|
* @return the pubic key of the server.
|
||||||
*/
|
*/
|
||||||
public PublicKey getServerPublicKey() {
|
public PublicKey getServerPublicKey() {
|
||||||
return serverPublicKey;
|
return serverPublicKey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks whether the device has already been enrolled with the SCEP Server.
|
||||||
|
*
|
||||||
|
* @return the enrollment status; 'TRUE' if already enrolled else 'FALSE'.
|
||||||
|
*/
|
||||||
|
public boolean isEnrolled() {
|
||||||
|
return isEnrolled;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
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 org.wso2.carbon.device.mgt.iot.virtualfirealarm.agent.transport.TransportHandlerException;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
@ -67,9 +68,9 @@ public class TransportUtils {
|
|||||||
throw new TransportHandlerException(errorMsg);
|
throw new TransportHandlerException(errorMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
ipPortMap.put("Protocol", ipPortArray[0]);
|
ipPortMap.put(AgentConstants.PROTOCOL_PROPERTY, ipPortArray[0]);
|
||||||
ipPortMap.put("Host", ipPortArray[1].replace("/", ""));
|
ipPortMap.put(AgentConstants.HOST_PROPERTY, ipPortArray[1].replace("/", ""));
|
||||||
ipPortMap.put("Port", ipPortArray[2]);
|
ipPortMap.put(AgentConstants.PORT_PROPERTY, ipPortArray[2]);
|
||||||
return ipPortMap;
|
return ipPortMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,8 +100,7 @@ public class TransportUtils {
|
|||||||
return !ipAddress.endsWith(".");
|
return !ipAddress.endsWith(".");
|
||||||
|
|
||||||
} catch (NumberFormatException nfe) {
|
} catch (NumberFormatException nfe) {
|
||||||
log.warn("The IP Address: " + ipAddress + " could not " +
|
log.warn("The IP Address: " + ipAddress + " could not be validated against IPv4-style");
|
||||||
"be validated against IPv4-style");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,7 +52,6 @@ import java.nio.charset.StandardCharsets;
|
|||||||
public abstract class MQTTTransportHandler
|
public abstract class MQTTTransportHandler
|
||||||
implements MqttCallback, TransportHandler<MqttMessage> {
|
implements MqttCallback, TransportHandler<MqttMessage> {
|
||||||
private static final Log log = LogFactory.getLog(MQTTTransportHandler.class);
|
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;
|
public static final int DEFAULT_MQTT_QUALITY_OF_SERVICE = 0;
|
||||||
|
|
||||||
private MqttClient client;
|
private MqttClient client;
|
||||||
@ -82,8 +81,6 @@ public abstract class MQTTTransportHandler
|
|||||||
this.mqttBrokerEndPoint = mqttBrokerEndPoint;
|
this.mqttBrokerEndPoint = mqttBrokerEndPoint;
|
||||||
this.timeoutInterval = DEFAULT_TIMEOUT_INTERVAL;
|
this.timeoutInterval = DEFAULT_TIMEOUT_INTERVAL;
|
||||||
this.initSubscriber();
|
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.mqttBrokerEndPoint = mqttBrokerEndPoint;
|
||||||
this.timeoutInterval = intervalInMillis;
|
this.timeoutInterval = intervalInMillis;
|
||||||
this.initSubscriber();
|
this.initSubscriber();
|
||||||
options.setUserName(AgentManager.getInstance().getAgentConfigs().getAuthToken());
|
|
||||||
options.setPassword(DEFAULT_PASSWORD.toCharArray());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setTimeoutInterval(int timeoutInterval) {
|
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.
|
* Connects to the MQTT-Broker and if successfully established connection.
|
||||||
*
|
*
|
||||||
@ -248,8 +249,7 @@ public abstract class MQTTTransportHandler
|
|||||||
try {
|
try {
|
||||||
client.publish(topic, payLoad.getBytes(StandardCharsets.UTF_8), qos, retained);
|
client.publish(topic, payLoad.getBytes(StandardCharsets.UTF_8), qos, retained);
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("Message: " + payLoad + " to MQTT topic [" + topic +
|
log.debug("Message: " + payLoad + " to MQTT topic [" + topic + "] published successfully");
|
||||||
"] published successfully");
|
|
||||||
}
|
}
|
||||||
} catch (MqttException ex) {
|
} catch (MqttException ex) {
|
||||||
String errorMsg =
|
String errorMsg =
|
||||||
@ -267,8 +267,7 @@ public abstract class MQTTTransportHandler
|
|||||||
try {
|
try {
|
||||||
client.publish(topic, message);
|
client.publish(topic, message);
|
||||||
if (log.isDebugEnabled()) {
|
if (log.isDebugEnabled()) {
|
||||||
log.debug("Message: " + message.toString() + " to MQTT topic [" + topic +
|
log.debug("Message: " + message.toString() + " to MQTT topic [" + topic + "] published successfully");
|
||||||
"] published successfully");
|
|
||||||
}
|
}
|
||||||
} catch (MqttException ex) {
|
} catch (MqttException ex) {
|
||||||
//TODO:: Compulsory log of errors and remove formatted error
|
//TODO:: Compulsory log of errors and remove formatted error
|
||||||
@ -291,8 +290,7 @@ public abstract class MQTTTransportHandler
|
|||||||
@Override
|
@Override
|
||||||
public void connectionLost(Throwable throwable) {
|
public void connectionLost(Throwable throwable) {
|
||||||
log.warn("Lost Connection for client: " + this.clientId +
|
log.warn("Lost Connection for client: " + this.clientId +
|
||||||
" to " + this.mqttBrokerEndPoint + ".\nThis was due to - " +
|
" to " + this.mqttBrokerEndPoint + ".\nThis was due to - " + throwable.getMessage());
|
||||||
throwable.getMessage());
|
|
||||||
|
|
||||||
Thread reconnectThread = new Thread() {
|
Thread reconnectThread = new Thread() {
|
||||||
public void run() {
|
public void run() {
|
||||||
@ -340,8 +338,7 @@ public abstract class MQTTTransportHandler
|
|||||||
} catch (MqttException e) {
|
} catch (MqttException e) {
|
||||||
//TODO:: Throw errors
|
//TODO:: Throw errors
|
||||||
log.error(
|
log.error(
|
||||||
"Error occurred whilst trying to read the message from the MQTT delivery " +
|
"Error occurred whilst trying to read the message from the MQTT delivery token.");
|
||||||
"token.");
|
|
||||||
}
|
}
|
||||||
String topic = iMqttDeliveryToken.getTopics()[0];
|
String topic = iMqttDeliveryToken.getTopics()[0];
|
||||||
String client = iMqttDeliveryToken.getClient().getClientId();
|
String client = iMqttDeliveryToken.getClient().getClientId();
|
||||||
|
|||||||
@ -77,7 +77,7 @@ public class ZipUtil {
|
|||||||
xmppEndpoint = xmppEndpoint.replace(LOCALHOST, iotServerIP);
|
xmppEndpoint = xmppEndpoint.replace(LOCALHOST, iotServerIP);
|
||||||
}
|
}
|
||||||
|
|
||||||
String base64EncodedApplicationKey = getBase64EncodedAPIAppKey(apiApplicationKey);
|
String base64EncodedApplicationKey = getBase64EncodedAPIAppKey(apiApplicationKey).trim();
|
||||||
|
|
||||||
Map<String, String> contextParams = new HashMap<>();
|
Map<String, String> contextParams = new HashMap<>();
|
||||||
contextParams.put(VirtualFireAlarmUtilConstants.TENANT_DOMAIN, APIUtil.getTenantDomainOftheUser());
|
contextParams.put(VirtualFireAlarmUtilConstants.TENANT_DOMAIN, APIUtil.getTenantDomainOftheUser());
|
||||||
|
|||||||
@ -28,6 +28,7 @@ apim-ep=${APIM_EP}
|
|||||||
mqtt-ep=${MQTT_EP}
|
mqtt-ep=${MQTT_EP}
|
||||||
xmpp-ep=${XMPP_EP}
|
xmpp-ep=${XMPP_EP}
|
||||||
auth-method=token
|
auth-method=token
|
||||||
|
application-key=${API_APPLICATION_KEY}
|
||||||
auth-token=${DEVICE_TOKEN}
|
auth-token=${DEVICE_TOKEN}
|
||||||
refresh-token=${DEVICE_REFRESH_TOKEN}
|
refresh-token=${DEVICE_REFRESH_TOKEN}
|
||||||
push-interval=15
|
push-interval=15
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user