1 /* *****************************************************************
3 * Copyright 2015 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * *****************************************************************/
22 #include "srmutility.h"
24 #include "OCProvisioningManager.h"
28 OCStackResult OCSecure::provisionInit(const std::string& dbPath)
31 auto cLock = OCPlatform_impl::Instance().csdkLock().lock();
35 std::lock_guard<std::recursive_mutex> lock(*cLock);
36 result = OCInitPM(dbPath.c_str());
40 oclog() <<"Mutex not found";
41 result = OC_STACK_ERROR;
47 OCStackResult OCSecure::discoverUnownedDevices(unsigned short timeout,
51 OCProvisionDev_t *pDevList = nullptr, *pCurDev = nullptr, *tmp = nullptr;
52 auto csdkLock = OCPlatform_impl::Instance().csdkLock();
53 auto cLock = csdkLock.lock();
57 std::lock_guard<std::recursive_mutex> lock(*cLock);
58 result = OCDiscoverUnownedDevices(timeout, &pDevList);
59 if (result == OC_STACK_OK)
61 // Create DeviceList of OCSecureResource's
66 list.push_back(std::shared_ptr<OCSecureResource>(
67 new OCSecureResource(csdkLock, pCurDev)));
68 pCurDev = pCurDev->next;
74 oclog() <<"Unowned device discovery failed!";
79 oclog() <<"Mutex not found";
80 result = OC_STACK_ERROR;
86 OCStackResult OCSecure::discoverOwnedDevices(unsigned short timeout,
90 OCProvisionDev_t *pDevList = nullptr, *pCurDev = nullptr, *tmp = nullptr;
91 auto csdkLock = OCPlatform_impl::Instance().csdkLock();
92 auto cLock = csdkLock.lock();
96 std::lock_guard<std::recursive_mutex> lock(*cLock);
97 result = OCDiscoverOwnedDevices(timeout, &pDevList);
98 if (result == OC_STACK_OK)
104 list.push_back(std::shared_ptr<OCSecureResource>(
105 new OCSecureResource(csdkLock, pCurDev)));
106 pCurDev = pCurDev->next;
112 oclog() <<"Owned device discovery failed!";
117 oclog() <<"Mutex not found";
118 result = OC_STACK_ERROR;
124 OCStackResult OCSecure::discoverSecureResource(unsigned short timeout,
125 const std::string& host,
126 OCConnectivityType connType,
129 OCStackResult result;
130 OCProvisionDev_t *pDevList = nullptr, *pCurDev = nullptr, *tmp = nullptr;
131 auto csdkLock = OCPlatform_impl::Instance().csdkLock();
132 auto cLock = csdkLock.lock();
136 std::lock_guard<std::recursive_mutex> lock(*cLock);
137 result = OCDiscoverSecureResource(timeout, host.c_str(), connType, &pDevList);
138 if (result == OC_STACK_OK)
144 list.push_back(std::shared_ptr<OCSecureResource>(
145 new OCSecureResource(csdkLock, pCurDev)));
146 pCurDev = pCurDev->next;
152 oclog() <<"Secure resource discovery failed!";
153 result = OC_STACK_ERROR;
158 oclog() <<"Mutex not found";
159 result = OC_STACK_ERROR;
165 OCStackResult OCSecure::setOwnerTransferCallbackData(OicSecOxm_t oxm,
166 OTMCallbackData_t* callbackData, InputPinCallback inputPin)
168 if (NULL == callbackData || oxm >= OIC_OXM_COUNT)
170 oclog() <<"Invalid callbackData or OXM type";
171 return OC_STACK_INVALID_PARAM;
174 if ((OIC_RANDOM_DEVICE_PIN == oxm) && !inputPin)
176 oclog() <<"for OXM type DEVICE_PIN, inputPin callback can't be null";
177 return OC_STACK_INVALID_PARAM;
180 OCStackResult result;
181 auto cLock = OCPlatform_impl::Instance().csdkLock().lock();
185 std::lock_guard<std::recursive_mutex> lock(*cLock);
186 result = OCSetOwnerTransferCallbackData(oxm, callbackData);
187 if (result == OC_STACK_OK && (OIC_RANDOM_DEVICE_PIN == oxm))
189 SetInputPinCB(inputPin);
194 oclog() <<"Mutex not found";
195 result = OC_STACK_ERROR;
202 OCStackResult OCSecure::getDevInfoFromNetwork(unsigned short timeout,
203 DeviceList_t &ownedDevList,
204 DeviceList_t &unownedDevList)
206 OCStackResult result = OC_STACK_OK;
207 OCProvisionDev_t *owned = nullptr, *unowned = nullptr, *tmp = nullptr, *dev = nullptr;
208 auto csdkLock = OCPlatform_impl::Instance().csdkLock();
209 auto cLock = csdkLock.lock();
213 std::lock_guard<std::recursive_mutex> lock(*cLock);
215 result = OCGetDevInfoFromNetwork(timeout, &owned, &unowned);
217 if (result == OC_STACK_OK)
223 ownedDevList.push_back(std::shared_ptr<OCSecureResource>(
224 new OCSecureResource(csdkLock, dev)));
233 unownedDevList.push_back(std::shared_ptr<OCSecureResource>(
234 new OCSecureResource(csdkLock, dev)));
242 oclog() <<"Mutex not found";
243 result = OC_STACK_ERROR;
249 OCStackResult OCSecure::setDisplayPinCB(GeneratePinCallback displayPin)
253 oclog() <<"displayPin can't be null";
254 return OC_STACK_INVALID_PARAM;
257 OCStackResult result = OC_STACK_OK;
258 auto cLock = OCPlatform_impl::Instance().csdkLock().lock();
262 std::lock_guard<std::recursive_mutex> lock(*cLock);
263 SetGeneratePinCB(displayPin);
267 oclog() <<"Mutex not found";
268 result = OC_STACK_ERROR;
274 OCStackResult OCSecure::removeDeviceWithUuid(unsigned short waitTimeForOwnedDeviceDiscovery,
276 ResultCallBack resultCallback)
280 oclog() << "Result calback can't be null";
281 return OC_STACK_INVALID_CALLBACK;
284 OCStackResult result;
285 auto cLock = OCPlatform_impl::Instance().csdkLock().lock();
289 ProvisionContext* context = new ProvisionContext(resultCallback);
291 std::lock_guard<std::recursive_mutex> lock(*cLock);
294 result = ConvertStrToUuid(uuid.c_str(), &targetDev);
295 if(OC_STACK_OK == result)
297 result = OCRemoveDeviceWithUuid(static_cast<void*>(context), waitTimeForOwnedDeviceDiscovery,
298 &targetDev, &OCSecureResource::callbackWrapper);
302 oclog() <<"Can not convert struuid to uuid";
307 oclog() <<"Mutex not found";
308 result = OC_STACK_ERROR;
314 void OCSecureResource::callbackWrapper(void* ctx, int nOfRes, OCProvisionResult_t *arr, bool hasError)
316 PMResultList_t *results = nullptr;
317 ProvisionContext* context = static_cast<ProvisionContext*>(ctx);
321 results = new PMResultList_t;
323 catch (std::bad_alloc& e)
325 oclog() <<"Bad alloc exception";
329 for (int i = 0; i < nOfRes; i++)
331 results->push_back(arr[i]);
334 std::thread exec(context->callback, results, hasError);
340 OCSecureResource::OCSecureResource(): m_csdkLock(std::weak_ptr<std::recursive_mutex>()),
345 OCSecureResource::OCSecureResource(std::weak_ptr<std::recursive_mutex> csdkLock,
346 OCProvisionDev_t *dPtr)
347 :m_csdkLock(csdkLock), devPtr(dPtr)
351 OCSecureResource::~OCSecureResource()
355 OCDeleteDiscoveredDevices(devPtr);
359 OCStackResult OCSecureResource::doOwnershipTransfer(ResultCallBack resultCallback)
363 oclog() <<"Result callback can't be null";
364 return OC_STACK_INVALID_CALLBACK;
367 OCStackResult result;
368 auto cLock = m_csdkLock.lock();
372 ProvisionContext* context = new ProvisionContext(resultCallback);
374 std::lock_guard<std::recursive_mutex> lock(*cLock);
375 result = OCDoOwnershipTransfer(static_cast<void*>(context),
376 devPtr, &OCSecureResource::callbackWrapper);
380 oclog() <<"Mutex not found";
381 result = OC_STACK_ERROR;
386 OCStackResult OCSecureResource::provisionACL( const OicSecAcl_t* acl,
387 ResultCallBack resultCallback)
391 oclog() <<"ACL can't be null";
392 return OC_STACK_INVALID_PARAM;
396 oclog() <<"result callback can not be null";
397 return OC_STACK_INVALID_CALLBACK;
400 OCStackResult result;
401 auto cLock = m_csdkLock.lock();
405 ProvisionContext* context = new ProvisionContext(resultCallback);
407 std::lock_guard<std::recursive_mutex> lock(*cLock);
408 result = OCProvisionACL(static_cast<void*>(context),
409 devPtr, const_cast<OicSecAcl_t*>(acl),
410 &OCSecureResource::callbackWrapper);
414 oclog() <<"Mutex not found";
415 result = OC_STACK_ERROR;
420 OCStackResult OCSecureResource::provisionCredentials(const Credential &cred,
421 const OCSecureResource &device2, ResultCallBack resultCallback)
425 oclog() << "Result calback can't be null";
426 return OC_STACK_INVALID_CALLBACK;
429 OCStackResult result;
430 auto cLock = m_csdkLock.lock();
434 ProvisionContext* context = new ProvisionContext(resultCallback);
436 std::lock_guard<std::recursive_mutex> lock(*cLock);
437 result = OCProvisionCredentials(static_cast<void*>(context),
438 cred.getCredentialType(),
439 cred.getCredentialKeySize(),
440 devPtr, device2.getDevPtr(),
441 &OCSecureResource::callbackWrapper);
445 oclog() <<"Mutex not found";
446 result = OC_STACK_ERROR;
451 OCStackResult OCSecureResource::provisionPairwiseDevices(const Credential &cred,
452 const OicSecAcl_t* acl1, const OCSecureResource &device2, const OicSecAcl_t* acl2,
453 ResultCallBack resultCallback)
457 oclog() << "Result callback can not be null";
458 return OC_STACK_INVALID_CALLBACK;
461 OCStackResult result;
462 auto cLock = m_csdkLock.lock();
466 ProvisionContext* context = new ProvisionContext(resultCallback);
468 std::lock_guard<std::recursive_mutex> lock(*cLock);
469 result = OCProvisionPairwiseDevices(static_cast<void*>(context),
470 cred.getCredentialType(),
471 cred.getCredentialKeySize(),
472 devPtr, const_cast<OicSecAcl_t*>(acl1),
473 device2.getDevPtr(), const_cast<OicSecAcl_t*>(acl2),
474 &OCSecureResource::callbackWrapper);
478 oclog() <<"Mutex not found";
479 result = OC_STACK_ERROR;
484 OCStackResult OCSecureResource::unlinkDevices(const OCSecureResource &device2,
485 ResultCallBack resultCallback)
489 oclog() << "Result calback can't be null";
490 return OC_STACK_INVALID_CALLBACK;
493 OCStackResult result;
494 auto cLock = m_csdkLock.lock();
498 ProvisionContext* context = new ProvisionContext(resultCallback);
500 std::lock_guard<std::recursive_mutex> lock(*cLock);
502 result = OCUnlinkDevices(static_cast<void*>(context),
503 devPtr, device2.getDevPtr(), &OCSecureResource::callbackWrapper);
507 oclog() <<"Mutex not found";
508 result = OC_STACK_ERROR;
513 OCStackResult OCSecureResource::removeDevice(unsigned short waitTimeForOwnedDeviceDiscovery,
514 ResultCallBack resultCallback)
518 oclog() << "Result calback can't be null";
519 return OC_STACK_INVALID_CALLBACK;
522 OCStackResult result;
523 auto cLock = m_csdkLock.lock();
527 ProvisionContext* context = new ProvisionContext(resultCallback);
529 std::lock_guard<std::recursive_mutex> lock(*cLock);
531 result = OCRemoveDevice(static_cast<void*>(context), waitTimeForOwnedDeviceDiscovery,
532 devPtr, &OCSecureResource::callbackWrapper);
536 oclog() <<"Mutex not found";
537 result = OC_STACK_ERROR;
542 OCStackResult OCSecureResource::getLinkedDevices(UuidList_t &uuidList)
544 OCStackResult result;
545 size_t numOfDevices = -1;
546 auto devUuid = devPtr->doxm->deviceID;
547 auto cLock = m_csdkLock.lock();
551 std::lock_guard<std::recursive_mutex> lock(*cLock);
553 OCUuidList_t* linkedDevs = nullptr, *tmp = nullptr;
554 result = OCGetLinkedStatus(&devUuid, &linkedDevs, &numOfDevices);
555 if (result == OC_STACK_OK)
557 for (tmp = linkedDevs; tmp; tmp = tmp->next)
559 uuidList.push_back(tmp->dev);
561 OCDeleteUuidList(linkedDevs);
566 oclog() <<"Mutex not found";
567 result = OC_STACK_ERROR;
572 OCStackResult OCSecureResource::provisionDirectPairing( const OicSecPconf_t* pconf,
573 ResultCallBack resultCallback)
577 oclog() <<"PCONF can't be null";
578 return OC_STACK_INVALID_PARAM;
582 oclog() <<"result callback can not be null";
583 return OC_STACK_INVALID_CALLBACK;
586 OCStackResult result;
587 auto cLock = m_csdkLock.lock();
591 ProvisionContext* context = new ProvisionContext(resultCallback);
593 std::lock_guard<std::recursive_mutex> lock(*cLock);
594 result = OCProvisionDirectPairing(static_cast<void*>(context),
595 devPtr, const_cast<OicSecPconf_t*>(pconf),
596 &OCSecureResource::callbackWrapper);
600 oclog() <<"Mutex not found";
601 result = OC_STACK_ERROR;
606 std::string OCSecureResource::getDeviceID()
608 std::ostringstream deviceId("");
609 char *devID = nullptr;
611 validateSecureResource();
613 if (OC_STACK_OK == ConvertUuidToStr(&(devPtr->doxm->deviceID), &devID))
620 oclog() <<"Can not convert uuid to struuid";
622 return deviceId.str();
625 OCProvisionDev_t* OCSecureResource::getDevPtr() const
630 std::string OCSecureResource::getDevAddr()
632 validateSecureResource();
633 std::string ipAddr(devPtr->endpoint.addr);
637 int OCSecureResource::getDeviceStatus()
639 validateSecureResource();
640 return (int)devPtr->devStatus;
643 bool OCSecureResource::getOwnedStatus()
645 validateSecureResource();
646 return devPtr->doxm->owned;
649 void OCSecureResource::validateSecureResource()
653 throw OCException("Incomplete secure resource", OC_STACK_RESOURCE_ERROR);