#include "OCPlatform.h"
#include "ocstack.h"
#include "octypes.h"
+#ifdef __WITH_DTLS__
+#include "securevirtualresourcetypes.h"
+#include "OCProvisioningManager.hpp"
+#include "ocrandom.h"
+#endif
#include "escommon.h"
namespace Service
{
/**
- * @brief Properties of provisioning resource. It includes a provisioning status and last
+ * @brief Properties of easysetup resource. It includes a provisioning status and last
* error code.
*/
class EnrolleeStatus
*
* @return a provisioning status property of Enrollee
*/
- ProvStatus getProvStatus()
+ ProvStatus getProvStatus() const
{
if(m_rep.hasAttribute(OC_RSRVD_ES_PROVSTATUS))
{
*
* @return a last error code property of Enrollee.
*/
- ESErrorCode getLastErrCode()
+ ESErrorCode getLastErrCode() const
{
if(m_rep.hasAttribute(OC_RSRVD_ES_LAST_ERRORCODE))
{
};
/**
- * @brief Data class stored for Cloud server property provisioning
+ * @brief Data class stored for provisioning of coap cloud server properties
*/
class CloudProp
{
*/
CloudProp()
{
+ m_cloudID = "";
+ m_credID = 0;
}
CloudProp(const CloudProp& cloudProp) :
- m_rep(cloudProp.toOCRepresentation()), m_cloudID(cloudProp.getCloudID())
+ m_rep(cloudProp.toOCRepresentation()),
+ m_cloudID(cloudProp.getCloudID()),
+ m_credID(cloudProp.getCredID())
{
}
CloudProp(const CloudProp&& cloudProp) :
- m_rep(std::move(cloudProp.toOCRepresentation())), m_cloudID(cloudProp.getCloudID())
+ m_rep(std::move(cloudProp.toOCRepresentation())),
+ m_cloudID(cloudProp.getCloudID()),
+ m_credID(cloudProp.getCredID())
{
}
{
m_rep = rep;
m_cloudID = "";
+ m_credID = 0;
}
/**
- * Set CloudServer resource properties to be delivered to Enrollee
+ * Set CoapCloudConf resource properties to be delivered to Enrollee
*
* @param authCode Auth code issued by OAuth2.0-compatible account server
* @param authProvider Auth provider ID
}
/**
+ * Set CoapCloudConf resource properties with Access token to be delivered to Enrollee
+ *
+ * @param accessToken Access token which is given in a return of auth code issued by
+ * OAuth2.0-compatible account server
+ * @param tokenType Access token type, i.e. "bearer"
+ * @param authProvider Auth provider ID
+ * @param ciServer Cloud interface server URL which an Enrollee is going to registered
+ *
+ * @see OAUTH_TOKENTYPE
+ */
+ void setCloudPropWithAccessToken(string accessToken, OAUTH_TOKENTYPE tokenType,
+ string authProvider, string ciServer)
+ {
+ m_rep.setValue(OC_RSRVD_ES_ACCESSTOKEN, accessToken);
+ m_rep.setValue(OC_RSRVD_ES_ACCESSTOKEN_TYPE, tokenType);
+ m_rep.setValue(OC_RSRVD_ES_AUTHPROVIDER, authProvider);
+ m_rep.setValue(OC_RSRVD_ES_CISERVER, ciServer);
+ }
+
+ /**
* Set CloudServer's UUID
*
* @param cloudID Cloud Interface server's UUID
}
/**
+ * Get an access token to be delivered.
+ *
+ * @return an access token to be delivered.
+ */
+ std::string getAccessToken() const
+ {
+ if(m_rep.hasAttribute(OC_RSRVD_ES_ACCESSTOKEN))
+ {
+ return m_rep.getValue<std::string>(OC_RSRVD_ES_ACCESSTOKEN);
+ }
+ return std::string("");
+ }
+
+ /**
+ * Get an access token type to be delivered.
+ *
+ * @return an access token type to be delivered.
+ */
+ OAUTH_TOKENTYPE getAccessTokenType() const
+ {
+
+ if(m_rep.hasAttribute(OC_RSRVD_ES_ACCESSTOKEN_TYPE))
+ {
+ return static_cast<OAUTH_TOKENTYPE>(
+ m_rep.getValue<int>(OC_RSRVD_ES_ACCESSTOKEN_TYPE));
+ }
+ return NONE_OAUTH_TOKENTYPE;
+ }
+
+ /**
* Get OCRepresentation object
*
* @return OCRepresentation object
};
/**
- * @brief Data class stored for Device property provisioning which includes a WiFi
- * and device configuration provisioning
+ * @brief Data class stored for provisioning of Device properties which includes
+ * properties of WiFiConf resource and DevConf resource
*/
class DeviceProp
{
}
/**
- * Set WiFi resource properties to be delivered to Enrollee
+ * Set WiFiConf resource properties to be delivered to Enrollee
*
* @param ssid Ssid of the Enroller
* @param pwd Pwd of the Enrolle
}
/**
- * Set DevConf resource properties to be delivered to Enrollee
- *
- * @param language IETF language tag using ISO 639X
- * @param country ISO Country Code (ISO 3166-1 Alpha-2)
- */
- void setDevConfProp(string language, string country, string location)
- {
- m_rep.setValue(OC_RSRVD_ES_LANGUAGE, language);
- m_rep.setValue(OC_RSRVD_ES_COUNTRY, country);
- m_rep.setValue(OC_RSRVD_ES_LOCATION, location);
- }
-
- /**
* Get a SSID of Enroller
*
* @return a SSID of enroller
}
/**
- * Get a language to be set. A language is expressed in IETF language tag
- * using ISO 639X.
- *
- * @return a language to be set
- */
- std::string getLanguage() const
- {
- if(m_rep.hasAttribute(OC_RSRVD_ES_LANGUAGE))
- {
- return m_rep.getValue<std::string>(OC_RSRVD_ES_LANGUAGE);
- }
- return std::string("");
- }
-
- /**
- * Get a country to be set. A country is expressed in ISO Country Code
- * (ISO 3166-1 Alpha-2)
- *
- * @return a country to be set
- */
- std::string getCountry() const
- {
- if(m_rep.hasAttribute(OC_RSRVD_ES_COUNTRY))
- {
- return m_rep.getValue<std::string>(OC_RSRVD_ES_COUNTRY);
- }
- return std::string("");
- }
-
- /**
- * Get a location to be set. A location is GPS information
- *
- * @return a country to be set
- */
- std::string getLocation() const
- {
- if(m_rep.hasAttribute(OC_RSRVD_ES_MODELNUMBER))
- {
- return m_rep.getValue<std::string>(OC_RSRVD_ES_MODELNUMBER);
- }
- return std::string("");
- }
-
- /**
* Get OCRepresentation object
*
* @return OCRepresentation object
SecProvisioningStatus(string deviceUUID, ESResult result) :
m_devUUID(deviceUUID), m_result(result)
{
+#ifdef __WITH_DTLS__
+ m_selectedOTMethod = OIC_JUST_WORKS;
+ m_isMOTEnabled = false;
+ m_isOwned = false;
+ m_ownerID = {};
+#endif
+ }
+#ifdef __WITH_DTLS__
+ SecProvisioningStatus(std::shared_ptr<OCSecureResource> resource, ESResult result) :
+ m_result(result)
+ {
+ m_isMOTEnabled = false;
+ if(resource.get() != nullptr)
+ {
+ m_devUUID = resource->getDeviceID();
+ m_isOwned = resource->getOwnedStatus();
+#ifdef MULTIPLE_OWNER
+ m_isMOTEnabled = resource->isMOTEnabled();
+#endif
+
+ if( OC_STACK_OK != resource->getOTMethod(&m_selectedOTMethod) )
+ {
+ m_selectedOTMethod = OIC_OXM_COUNT; // Out-of-range
+ }
+
+ if(resource->getOwnedStatus())
+ {
+ char uuidString[UUID_STRING_SIZE] = {};
+ if(RAND_UUID_OK == OCConvertUuidToString(resource->getDevPtr()->doxm->owner.id, uuidString))
+ {
+ m_ownerID = uuidString;
+ }
+ else
+ {
+ m_ownerID = {};
+ }
+ }
+ }
+ }
+
+ OicSecOxm_t getSelectedOTMethod() const
+ {
+ return m_selectedOTMethod;
}
- const string getDeviceUUID()
+ bool isMOTEnabled() const
{
- return m_devUUID;
+ return m_isMOTEnabled;
}
+ bool isOwnedDevice() const
+ {
+ return m_isOwned;
+ }
+
+ const std::string getOwnerID()
+ {
+ return m_ownerID;
+ }
+#endif
+ const std::string getDeviceUUID()
+ {
+ return m_devUUID;
+ }
+ /**
+ * Get a result for about security provisioning is success or not.
+ *
+ * @return ::ES_OK\n
+ * ::ES_SEC_OPERATION_IS_NOT_SUPPORTED\n
+ * ::ES_SECURE_RESOURCE_DISCOVERY_FAILURE\n
+ * ::ES_OWNERSHIP_TRANSFER_FAILURE\n
+ * ::ES_ERROR\n
+ */
ESResult getESResult()
{
return m_result;
private:
string m_devUUID;
ESResult m_result;
+#ifdef __WITH_DTLS__
+ OicSecOxm_t m_selectedOTMethod;
+ bool m_isMOTEnabled;
+ bool m_isOwned;
+ std::string m_ownerID;
+#endif
};
/**
/**
* Constructor
* The expected OCRepresentation is one for collection resource and has several child
- * OCRepresentation object corresponding to WiFi, DevConf, and CloudServer resource's
- * representation.
+ * OCRepresentation object corresponding to WiFiConf, DevConf, and CoapCloudConf
+ * resources' representations.
*/
EnrolleeConf(const OCRepresentation& rep) :
- m_ProvRep(rep)
+ m_EasySetupRep(rep)
{
}
EnrolleeConf(const EnrolleeConf& enrolleeConf) :
- m_ProvRep(enrolleeConf.getProvResRep())
+ m_EasySetupRep(enrolleeConf.getEasySetupRep())
{
}
EnrolleeConf(const EnrolleeConf&& enrolleeConf) :
- m_ProvRep(std::move(enrolleeConf.getProvResRep()))
+ m_EasySetupRep(std::move(enrolleeConf.getEasySetupRep()))
{
}
*/
std::string getDeviceName() const
{
- std::vector<OCRepresentation> children = m_ProvRep.getChildren();
+ std::vector<OCRepresentation> children = m_EasySetupRep.getChildren();
for(auto child = children.begin(); child != children.end(); ++child)
{
if(child->getUri().find(OC_RSRVD_ES_URI_DEVCONF) != std::string::npos)
{
- if(child->hasAttribute(OC_RSRVD_ES_DEVNAME))
+ OCRepresentation rep;
+ if(child->hasAttribute(OC_RSRVD_REPRESENTATION))
{
- return child->getValue<std::string>(OC_RSRVD_ES_DEVNAME);
+ rep = child->getValue<OCRepresentation>(OC_RSRVD_REPRESENTATION);
+ }
+ else
+ {
+ return std::string("");
}
- }
- }
- return std::string("");
- }
- /**
- * Get a model number of Enrollee.
- *
- * @return a model number of Enrollee
- */
- std::string getModelNumber() const
- {
- std::vector<OCRepresentation> children = m_ProvRep.getChildren();
- for(auto child = children.begin(); child != children.end(); ++child)
- {
- if(child->getUri().find(OC_RSRVD_ES_URI_DEVCONF) != std::string::npos)
- {
- if(child->hasAttribute(OC_RSRVD_ES_MODELNUMBER))
+ if(rep.hasAttribute(OC_RSRVD_ES_DEVNAME))
{
- return child->getValue<std::string>(OC_RSRVD_ES_MODELNUMBER);
+ return rep.getValue<std::string>(OC_RSRVD_ES_DEVNAME);
}
}
}
vector<WIFI_MODE> modes;
modes.clear();
- std::vector<OCRepresentation> children = m_ProvRep.getChildren();
+ std::vector<OCRepresentation> children = m_EasySetupRep.getChildren();
for(auto child = children.begin(); child != children.end(); ++child)
{
- if(child->getUri().find(OC_RSRVD_ES_URI_WIFI) != std::string::npos)
+ if(child->getUri().find(OC_RSRVD_ES_URI_WIFICONF) != std::string::npos)
{
- if(child->hasAttribute(OC_RSRVD_ES_SUPPORTEDWIFIMODE))
+ OCRepresentation rep;
+ if(child->hasAttribute(OC_RSRVD_REPRESENTATION))
+ {
+ rep = child->getValue<OCRepresentation>(OC_RSRVD_REPRESENTATION);
+ }
+ else
+ {
+ return modes;
+ }
+
+ if(rep.hasAttribute(OC_RSRVD_ES_SUPPORTEDWIFIMODE))
{
- for(auto it : child->getValue
+ for(auto it : rep.getValue
<std::vector<int>>(OC_RSRVD_ES_SUPPORTEDWIFIMODE))
{
modes.push_back(static_cast<WIFI_MODE>(it));
*/
WIFI_FREQ getWiFiFreq() const
{
- std::vector<OCRepresentation> children = m_ProvRep.getChildren();
+ std::vector<OCRepresentation> children = m_EasySetupRep.getChildren();
for(auto child = children.begin(); child != children.end(); ++child)
{
- if(child->getUri().find(OC_RSRVD_ES_URI_WIFI) != std::string::npos)
+ if(child->getUri().find(OC_RSRVD_ES_URI_WIFICONF) != std::string::npos)
{
- if(child->hasAttribute(OC_RSRVD_ES_SUPPORTEDWIFIFREQ))
+ OCRepresentation rep;
+ if(child->hasAttribute(OC_RSRVD_REPRESENTATION))
+ {
+ rep = child->getValue<OCRepresentation>(OC_RSRVD_REPRESENTATION);
+ }
+ else
+ {
+ return WIFI_FREQ_NONE;
+ }
+
+ if(rep.hasAttribute(OC_RSRVD_ES_SUPPORTEDWIFIFREQ))
{
return static_cast<WIFI_FREQ>(
- child->getValue<int>(OC_RSRVD_ES_SUPPORTEDWIFIFREQ));
+ rep.getValue<int>(OC_RSRVD_ES_SUPPORTEDWIFIFREQ));
}
}
}
}
/**
+ * Get a provisioning status property of Enrollee.
+ *
+ * @return a provisioning status property of Enrollee
+ */
+ ProvStatus getProvStatus() const
+ {
+ OCRepresentation rep;
+ if(m_EasySetupRep.hasAttribute(OC_RSRVD_REPRESENTATION))
+ {
+ rep = m_EasySetupRep.getValue<OCRepresentation>(OC_RSRVD_REPRESENTATION);
+ }
+ else
+ {
+ return ES_STATE_INIT;
+ }
+
+ if(rep.hasAttribute(OC_RSRVD_ES_PROVSTATUS))
+ {
+ return static_cast<ProvStatus>(
+ rep.getValue<int>(OC_RSRVD_ES_PROVSTATUS));
+ }
+ return ES_STATE_INIT;
+ }
+
+ /**
+ * Get a last error code property of Enrollee.
+ *
+ * @return a last error code property of Enrollee.
+ */
+ ESErrorCode getLastErrCode() const
+ {
+ OCRepresentation rep;
+ if(m_EasySetupRep.hasAttribute(OC_RSRVD_REPRESENTATION))
+ {
+ rep = m_EasySetupRep.getValue<OCRepresentation>(OC_RSRVD_REPRESENTATION);
+ }
+ else
+ {
+ return ES_ERRCODE_NO_ERROR;
+ }
+
+ if(rep.hasAttribute(OC_RSRVD_ES_LAST_ERRORCODE))
+ {
+ return static_cast<ESErrorCode>(
+ rep.getValue<int>(OC_RSRVD_ES_LAST_ERRORCODE));
+ }
+ return ES_ERRCODE_NO_ERROR;
+ }
+
+ /**
* Get an accessibility to cloud server of an Enrollee
*
* @return an accessibility to cloud server of an Enrollee
*/
bool isCloudAccessible() const
{
- std::vector<OCRepresentation> children = m_ProvRep.getChildren();
+ std::vector<OCRepresentation> children = m_EasySetupRep.getChildren();
for(auto child = children.begin(); child != children.end(); ++child)
{
- if(child->getUri().find(OC_RSRVD_ES_URI_CLOUDSERVER) != std::string::npos)
+ for(auto rt : child->getResourceTypes())
{
- return true;
+ if(0 == rt.compare(OC_RSRVD_ES_RES_TYPE_COAPCLOUDCONF))
+ {
+ return true;
+ }
}
}
return false;
*
* @return OCRepresentation object
*/
- const OCRepresentation& getProvResRep() const
+ const OCRepresentation& getEasySetupRep() const
{
- return m_ProvRep;
+ return m_EasySetupRep;
}
protected:
- OCRepresentation m_ProvRep;
+ OCRepresentation m_EasySetupRep;
};
/**
/**
* Get a result of getting provisioning status and last error code of Enrollee
*
- * @return a result of getting provisioning status and last error code of Enrollee
- *
+ * @return ::ES_OK\n
+ * ::ES_COMMUNICATION_ERROR\n
+ * ::ES_ERROR\n
* @see ESResult
*/
ESResult getESResult()
/**
* Get a result of getting preconfiguration of Enrollee
*
- * @return a result of preconfiguration of Enrollee
+ * @return ::ES_OK\n
+ * ::ES_COMMUNICATION_ERROR\n
+ * ::ES_ERROR\n
*
* @see ESResult
*/
/**
* Get a result of Device property provisioning
*
- * @return a result of Device property provisioning
+ * @return ::ES_OK\n
+ * ::ES_COMMUNICATION_ERROR\n
+ * ::ES_ERROR\n
*
* @see ESResult
*/
/**
* Get a result of Cloud property provisioning
*
- * @return a result of Cloud property provisioning
+ * @return ::ES_OK\n
+ * ::ES_ENROLLEE_DISCOVERY_FAILURE\n
+ * ::ES_SECURE_RESOURCE_DISCOVERY_FAILURE\n
+ * ::ES_ACL_PROVISIONING_FAILURE\n
+ * ::ES_CERT_PROVISIONING_FAILURE\n
+ * ::ES_COMMUNICATION_ERROR\n
+ * ::ES_ERROR\n
+ *
+ * @see ESResult
+ */
+ ESResult getESResult()
+ {
+ return m_result;
+ }
+
+ private:
+ ESResult m_result;
+ };
+
+ /**
+ * Status object for connect API. This object is given to application
+ * when a response for 'Connect' request from Enrollee is arrived.
+ */
+ class ConnectRequestStatus
+ {
+ public:
+ /**
+ * Constructor
+ */
+ ConnectRequestStatus(ESResult result) :
+ m_result(result)
+ {
+ }
+
+ /**
+ * Get a result of Connect request
+ *
+ * @return ::ES_OK\n
+ * ::ES_COMMUNICATION_ERROR\n
+ * ::ES_ERROR\n
*
* @see ESResult
*/
ESResult m_result;
};
+ class ESOwnershipTransferData
+ {
+ public:
+#ifdef __WITH_DTLS__
+ ESOwnershipTransferData() :
+ m_MOTMethod(OIC_OXM_COUNT), m_preconfiguredPin("")
+ {
+ }
+
+ ESOwnershipTransferData(const ESOwnershipTransferData& data) :
+ m_MOTMethod(data.getMOTMethod()),
+ m_preconfiguredPin(data.getPreConfiguredPin())
+ {
+ }
+
+ ESResult setMOTMethod(OicSecOxm_t method)
+ {
+#ifdef MULTIPLE_OWNER
+ if(OIC_RANDOM_DEVICE_PIN != method)
+ {
+ return ES_ERROR;
+ }
+
+ m_MOTMethod = method;
+ return ES_OK;
+#else
+ (void) method;
+
+ return ES_ERROR;
+#endif
+ }
+
+ ESResult setMOTMethod(OicSecOxm_t method, const std::string& pin)
+ {
+#ifdef MULTIPLE_OWNER
+ if(OIC_PRECONFIG_PIN != method || pin.empty())
+ {
+ return ES_ERROR;
+ }
+
+ m_preconfiguredPin = pin;
+ m_MOTMethod = method;
+ return ES_OK;
+#else
+ (void) method;
+ (void) pin;
+
+ return ES_ERROR;
+#endif
+ }
+
+ OicSecOxm_t getMOTMethod() const
+ {
+ return m_MOTMethod;
+ }
+
+ std::string getPreConfiguredPin() const
+ {
+ return m_preconfiguredPin;
+ }
+
+ private:
+ OicSecOxm_t m_MOTMethod;
+ std::string m_preconfiguredPin;
+#endif
+ };
+
/**
* Callback function definition for providing Enrollee status
*/
typedef function< void(shared_ptr< CloudPropProvisioningStatus >) > CloudPropProvStatusCb;
/**
+ * Callback function definition for providing 'Connect' request status
+ */
+ typedef function< void(shared_ptr< ConnectRequestStatus >) > ConnectRequestStatusCb;
+
+
+ /**
* Callback function definition for providing Enrollee security provisioning status
*/
typedef function< void(shared_ptr<SecProvisioningStatus>) > SecurityProvStatusCb;
/**
+ * Callback function definition for providing Enrollee security provisioning status.
+ * This callback is an overloaded version of SecurityProvStatusCb, which has
+ * ESOwnershipTransferData as a return value.
+ */
+ typedef function< ESOwnershipTransferData(shared_ptr<SecProvisioningStatus>) >
+ SecurityProvStatusCbWithOption;
+
+ /**
* Callback definition to be invoked when the security stack expects a pin from application
*/
typedef function< void(string&) > SecurityPinCb;