2 #include "occloudprovisioning.h"
3 #include "oic_malloc.h"
4 #include "oic_string.h"
5 #include "srmutility.h"
6 #include "aclresource.h"
11 #define TAG "CLOUD-WRAPPER"
13 #define MAX_ID_LENGTH (64)
14 #define MAX_STRING_LENGTH (256)
16 #define UUID_EXAMPLE_1 "9cfbeb8e-5a1e-4d1c-9d01-2ae6fdb"
17 #define UUID_EXAMPLE_2 "123e4567-e89b-12d3-a456-4266554"
18 #define UUID_EXAMPLE_3 "987e6543-e21b-12d3-a456-4266554"
19 #define SUBJECT_ID_EXAMPLE "72616E64-5069-6E44-6576-557569643030"
21 #define ACL_ID_EXAMPLE "0f3d9f7fe5491d54077d"
22 #define ACE_ID_EXAMPLE "a0001"
24 #define ID_EXAMPLE_1 "78f98b4f25f21e2487e8"
25 #define ID_EXAMPLE_2 "6caa7009386290fd3681"
27 #define RESOURCE_URI_EXAMPLE "/a/light/0"
28 #define RESOURCE_TYPE_EXAMPLE "core.light"
29 #define INTERFACE_EXAMPLE "oic.if.baseline"
31 //in case of optional parameters absence should be sent NULL
32 #define OPTIONAL(str) (str[0] ? str : NULL)
35 * Skip special characters from stdin
37 static void skipSpecialCharacters()
39 for( ; 0x20<=getchar(); ); // for removing overflow garbages
40 // '0x20<=code' is character region
43 static bool readOptional(const char* description)
45 if (NULL == description)
50 printf("Do you want to Enter %s (y/n):\n", description);
56 skipSpecialCharacters();
60 case 'y': return true;
61 case 'n': return false;
62 default: printf("Wrong value entered. Please press 'y' or 'n'\n");
68 void readString(char* item, int length, const char* description, const char* example)
70 printf("Enter %s (f.e. %s):\n", description, example);
71 char template[8] = { 0 };
72 snprintf(template, sizeof(template), "%%%ds", length - 1);
73 scanf(template, item);
74 skipSpecialCharacters();
78 * Read user input (expect string value, but it is optional and can be skipped by user)
80 * @param[out] item string item to fill
81 * @param[in] length max allowed string length
82 * @param[in] description item description
83 * @param[in] example item example
85 static void readOptionalString(char* item, int length, const char* description, const char* example)
87 if (readOptional(description))
89 readString(item, length, description, example);
93 void readInteger(int* item, const char* description, const char* example)
95 printf("Enter %s (f.e. %s):\n", description, example);
97 skipSpecialCharacters();
101 * Read user input (expect array of strings)
103 * @param[out] list array of strings structure
104 * @param[in] length max allowed array item length
105 * @param[in] description whole array description
106 * @param[in] example array item example
108 static void readStringArray(stringArray_t *list, int length, const char* description, const char* example)
112 char hint[MAX_STRING_LENGTH] = { 0 };
114 snprintf(hint, sizeof(hint), "%s items count", description);
115 readInteger(&count, hint, "2");
124 item = OICCalloc(count, sizeof(char*));
131 for (i = 0; i < count; i++)
133 item[i] = OICCalloc(length, sizeof(char));
140 snprintf(hint, sizeof(hint), "%s %d item", description, i + 1);
141 readString(item[i], length, hint, example);
144 list->length = count;
148 //free already allocated memory here
149 for (int k = 0; k < i; k++)
157 * Read user input (expect array of strings)
158 * It is optional and can be skipped by user.
160 * @param[out] list array of strings structure
161 * @param[in] length max allowed array item length
162 * @param[in] description whole array description
163 * @param[in] example array item example
165 static void readOptionalStringArray(stringArray_t *list, int length, const char* description, const char* example)
167 if (readOptional(description))
169 readStringArray(list, length, description, example);
173 void printStringArray(stringArray_t *list)
177 OIC_LOG(INFO, TAG, "Received NULL list");
181 OIC_LOG_V(INFO, TAG, "List contains %zu items", list->length);
183 for (size_t i = 0; i < list->length; i++)
185 OIC_LOG_V(INFO, TAG, "item[%zu] = %s", i, list->array[i]);
189 void printInviteResponse(inviteResponse_t *in)
193 OIC_LOG(INFO, TAG, "Received NULL invitation response");
197 OIC_LOG(INFO, TAG, "Received next invite gid list:");
198 printStringArray(&in->invite.gidlist);
200 OIC_LOG(INFO, TAG, "Received next invite mid list:");
201 printStringArray(&in->invite.midlist);
203 OIC_LOG(INFO, TAG, "Received next invited gid list:");
204 printStringArray(&in->invited.gidlist);
206 OIC_LOG(INFO, TAG, "Received next invited mid list:");
207 printStringArray(&in->invited.midlist);
210 void clearInviteResponse(inviteResponse_t *in)
217 clearStringArray(&in->invite.gidlist);
218 clearStringArray(&in->invite.midlist);
220 clearStringArray(&in->invited.gidlist);
221 clearStringArray(&in->invited.midlist);
224 bool readFile(const char *name, OCByteString *out)
228 uint8_t *buffer = NULL;
232 file = fopen(name, "rb");
235 OIC_LOG_V(ERROR, TAG, "Unable to open file %s", name);
240 if (fseek(file, 0, SEEK_END))
242 OIC_LOG(ERROR, TAG, "Failed to SEEK_END");
246 length = ftell(file);
249 OIC_LOG(ERROR, TAG, "Failed to ftell");
253 if (fseek(file, 0, SEEK_SET))
255 OIC_LOG(ERROR, TAG, "Failed to SEEK_SET");
260 buffer = (uint8_t *)malloc(length);
263 OIC_LOG(ERROR, TAG, "Failed to allocate buffer");
267 //Read file contents into buffer
269 size_t realCount = fread(buffer, length, count, file);
270 if (realCount != count)
272 OIC_LOG_V(ERROR, TAG, "Read %d bytes %zu times instead of %zu", length, realCount, count);
286 * Frees particular cloudAce object
288 * @param[in] ace ace object to free
290 static void freeCloudAce(cloudAce_t *ace)
295 OicSecRsrc_t* rsrc = NULL;
296 OicSecRsrc_t* tmpRsrc = NULL;
297 LL_FOREACH_SAFE(ace->resources, rsrc, tmpRsrc)
299 LL_DELETE(ace->resources, rsrc);
307 * Deletes cloudAce list
309 * @param[in] ace aces list to delete
311 static void deleteCloudAceList(cloudAce_t *aces)
313 cloudAce_t *ace = NULL;
314 cloudAce_t *tmpAce = NULL;
315 LL_FOREACH_SAFE(aces, ace, tmpAce)
317 LL_DELETE(aces, ace);
322 OCStackResult OCWrapperCertificateIssueRequest(const OCDevAddr *endPoint, OCCloudResponseCB callback)
324 return OCCloudCertificateIssueRequest(NULL, endPoint, callback);
327 OCStackResult OCWrapperGetCRL(const OCDevAddr *endPoint, OCCloudResponseCB callback)
329 return OCCloudGetCRL(NULL, endPoint, callback);
332 OCStackResult OCWrapperPostCRL(const OCDevAddr *endPoint, OCCloudResponseCB callback)
334 OCStackResult result = OC_STACK_ERROR;
335 OCByteString crlData = {0, 0};
336 char filename[64] = {0};
337 char thisUpdate[16] = { 0 };
338 char nextUpdate[16] = { 0 };
339 stringArray_t serialNumbers = {0, 0};
341 readString(thisUpdate, sizeof(thisUpdate), "Crl's thisUpdate value", "20160727000000");
342 readString(nextUpdate, sizeof(nextUpdate), "Crl's nextUpdate value", "20161027000000");
343 readOptionalStringArray(&serialNumbers, 16, "Revoked serial numbers", "1234");
345 if (NULL == serialNumbers.array)
347 readString(filename, sizeof(filename),
348 "filename from which binary Crl in DER format will be read", "crl");
350 if (!readFile(filename, &crlData))
352 printf("Can't read crl from file %s\n", filename);
356 stringArray_t *rcsn = serialNumbers.array? &serialNumbers : NULL;
357 OCByteString *crl = crlData.bytes? &crlData : NULL;
359 result = OCCloudPostCRL(NULL, thisUpdate, nextUpdate, crl, rcsn,
362 clearStringArray(&serialNumbers);
363 OICFree(crlData.bytes);
368 OCStackResult OCWrapperAclIdGetByDevice(const OCDevAddr *endPoint, OCCloudResponseCB callback)
370 char di[MAX_ID_LENGTH] = { 0 };
372 readString(di, sizeof(di), "device id", UUID_EXAMPLE_1);
374 return OCCloudGetAclIdByDevice(NULL, di, endPoint, callback);
377 OCStackResult OCWrapperAclIdCreate(const OCDevAddr *endPoint, OCCloudResponseCB callback)
379 char oid[MAX_ID_LENGTH] = { 0 };
380 char di[MAX_ID_LENGTH] = { 0 };
382 readString(oid, sizeof(oid), "owner id", UUID_EXAMPLE_2);
383 readString(di, sizeof(di), "device id", UUID_EXAMPLE_1);
385 return OCCloudAclIdCreate(NULL, oid, di, endPoint, callback);
388 OCStackResult OCWrapperAclIdDelete(const OCDevAddr *endPoint, OCCloudResponseCB callback)
390 char aclid[MAX_ID_LENGTH] = { 0 };
392 readString(aclid, sizeof(aclid), "acl id", ACL_ID_EXAMPLE);
394 return OCCloudAclIdDelete(NULL, aclid, endPoint, callback);
397 OCStackResult OCWrapperAclIndividualGetInfo(const OCDevAddr *endPoint, OCCloudResponseCB callback)
399 char aclid[MAX_ID_LENGTH] = { 0 };
401 readString(aclid, sizeof(aclid), "acl id", ACL_ID_EXAMPLE);
403 return OCCloudAclIndividualGetInfo(NULL, aclid, endPoint, callback);
406 OCStackResult OCWrapperAclIndividualUpdateAce(const OCDevAddr *endPoint, OCCloudResponseCB callback)
408 OCStackResult result = OC_STACK_NO_MEMORY;
410 char aclid[MAX_ID_LENGTH] = { 0 };
411 readString(aclid, sizeof(aclid), "acl id", ACL_ID_EXAMPLE);
413 int acllist_count = 0;
414 readInteger(&acllist_count, "acl list count", "1");
416 cloudAce_t *aces = NULL;
418 for (int i = 0; i < acllist_count; i++)
420 cloudAce_t *ace = OICCalloc(1, sizeof(cloudAce_t));
423 OIC_LOG(ERROR, TAG, "Can't allocate memory for ace");
426 LL_APPEND(aces, ace);
428 char aceid[MAX_ID_LENGTH] = { 0 };
429 char subjectuuid[MAX_ID_LENGTH] = { 0 };
435 readString(subjectuuid, sizeof(subjectuuid), "subjectuuid", SUBJECT_ID_EXAMPLE);
436 } while (OC_STACK_OK != ConvertStrToUuid(subjectuuid, &ace->subjectuuid));
438 readInteger(&stype, "subject type", "0 – Device, 1 – User, 2 - Group");
439 readInteger(&permission, "permission", "6");
441 ace->aceId = OICStrdup(aceid);
443 ace->permission = permission;
445 int reslist_count = 0;
446 readInteger(&reslist_count, "resources list count", "1");
448 for (int i = 0; i < reslist_count; i++)
450 OicSecRsrc_t *res = OICCalloc(1, sizeof(OicSecRsrc_t));
453 OIC_LOG(ERROR, TAG, "Can't allocate memory for res");
456 LL_APPEND(ace->resources, res);
458 char href[32] = { 0 };
459 readString(href, sizeof(href), "href", RESOURCE_URI_EXAMPLE);
461 stringArray_t rt = {0, 0};
462 readStringArray(&rt, MAX_ID_LENGTH, "resource type", RESOURCE_TYPE_EXAMPLE);
464 stringArray_t _if = {0, 0};
465 readStringArray(&_if, MAX_ID_LENGTH, "interface", INTERFACE_EXAMPLE);
467 res->href = OICStrdup(href);
468 res->types = rt.array;
469 res->typeLen = rt.length;
470 res->interfaces = _if.array;
471 res->interfaceLen = _if.length;
475 result = OCCloudAclIndividualUpdateAce(NULL, aclid, aces, endPoint, callback);
477 deleteCloudAceList(aces);
481 OCStackResult OCWrapperAclIndividualUpdate(const OCDevAddr *endPoint, OCCloudResponseCB callback)
483 OCStackResult result = OC_STACK_NO_MEMORY;
485 char aclid[MAX_ID_LENGTH] = { 0 };
486 readString(aclid, sizeof(aclid), "acl id", ACL_ID_EXAMPLE);
488 cloudAce_t *ace = OICCalloc(1, sizeof(cloudAce_t));
491 OIC_LOG(ERROR, TAG, "Can't allocate memory for ace");
495 char aceid[MAX_ID_LENGTH] = { 0 };
496 char subjectuuid[MAX_ID_LENGTH] = { 0 };
500 readString(aceid, sizeof(aceid), "ace id", ACE_ID_EXAMPLE);
503 readString(subjectuuid, sizeof(subjectuuid), "subjectuuid", SUBJECT_ID_EXAMPLE);
504 } while (OC_STACK_OK != ConvertStrToUuid(subjectuuid, &ace->subjectuuid));
506 readInteger(&stype, "subject type", "0 – Device, 1 – User, 2 - Group");
507 readInteger(&permission, "permission", "6");
510 ace->permission = permission;
512 int reslist_count = 0;
513 readInteger(&reslist_count, "resources list count", "1");
515 for (int i = 0; i < reslist_count; i++)
517 OicSecRsrc_t *res = OICCalloc(1, sizeof(OicSecRsrc_t));
520 OIC_LOG(ERROR, TAG, "Can't allocate memory for res");
523 LL_APPEND(ace->resources, res);
525 char href[32] = { 0 };
526 readString(href, sizeof(href), "href", RESOURCE_URI_EXAMPLE);
528 stringArray_t rt = {0, 0};
529 readStringArray(&rt, MAX_ID_LENGTH, "resource type", RESOURCE_TYPE_EXAMPLE);
531 stringArray_t _if = {0, 0};
532 readStringArray(&_if, MAX_ID_LENGTH, "interface", INTERFACE_EXAMPLE);
534 res->href = OICStrdup(href);
535 res->types = rt.array;
536 res->typeLen = rt.length;
537 res->interfaces = _if.array;
538 res->interfaceLen = _if.length;
542 result = OCCloudAclIndividualUpdate(NULL, aclid,aceid, ace, endPoint, callback);
547 OCStackResult OCWrapperAclIndividualDelete(const OCDevAddr *endPoint, OCCloudResponseCB callback)
549 char aclid[MAX_ID_LENGTH] = { 0 };
551 readString(aclid, sizeof(aclid), "acl id", ACL_ID_EXAMPLE);
553 return OCCloudAclIndividualDelete(NULL, aclid, endPoint, callback);
556 OCStackResult OCWrapperAclIndividualDeleteAce(const OCDevAddr *endPoint, OCCloudResponseCB callback)
558 char aclid[MAX_ID_LENGTH] = { 0 };
559 char aceid[MAX_ID_LENGTH] = { 0 };
561 readString(aclid, sizeof(aclid), "acl id", ACL_ID_EXAMPLE);
562 readString(aceid, sizeof(aceid), "ace id", ACE_ID_EXAMPLE);
564 return OCCloudAclIndividualDeleteAce(NULL, aclid, aceid, endPoint, callback);
567 OCStackResult OCWrapperAclCreateGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
569 char gtype[16] = { 0 };
570 char gmid[MAX_ID_LENGTH] = { 0 };
572 readString(gtype, sizeof(gtype), "Group type value", "Public");
573 readOptionalString(gmid, sizeof(gmid), "group member id value", UUID_EXAMPLE_2);
575 return OCCloudAclCreateGroup(NULL, gtype, OPTIONAL(gmid), endPoint, callback);
578 OCStackResult OCWrapperAclFindMyGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
580 char mid[MAX_ID_LENGTH] = { 0 };
582 readOptionalString(mid, sizeof(mid), "member id value", UUID_EXAMPLE_2);
584 return OCCloudAclFindMyGroup(NULL, OPTIONAL(mid), endPoint, callback);
587 OCStackResult OCWrapperAclDeleteGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
589 char gid[MAX_ID_LENGTH] = { 0 };
590 char gmid[MAX_ID_LENGTH] = { 0 };
592 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
594 readOptionalString(gmid, sizeof(gmid), "group member id value", UUID_EXAMPLE_2);
596 return OCCloudAclDeleteGroup(NULL, gid, OPTIONAL(gmid), endPoint, callback);
599 OCStackResult OCWrapperAclJoinToInvitedGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
601 char gid[MAX_ID_LENGTH] = { 0 };
603 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
605 return OCCloudAclJoinToInvitedGroup(NULL, gid, endPoint, callback);
608 OCStackResult OCWrapperAclObserveGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
610 char gid[MAX_ID_LENGTH] = { 0 };
612 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
614 return OCCloudAclObserveGroup(NULL, gid, endPoint, callback);
617 OCStackResult OCWrapperAclShareDeviceIntoGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
619 OCStackResult result = OC_STACK_NO_MEMORY;
620 char gid[MAX_ID_LENGTH] = { 0 };
621 stringArray_t midlist = {0,0};
622 stringArray_t dilist = {0,0};
624 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
626 readStringArray(&midlist, MAX_ID_LENGTH, "member id list", UUID_EXAMPLE_2);
628 readStringArray(&dilist, MAX_ID_LENGTH, "device list", UUID_EXAMPLE_1);
630 result = OCCloudAclShareDeviceIntoGroup(NULL, gid, &midlist, &dilist, endPoint, callback);
632 clearStringArray(&midlist);
633 clearStringArray(&dilist);
638 OCStackResult OCWrapperAclDeleteDeviceFromGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
640 OCStackResult result = OC_STACK_NO_MEMORY;
641 char gid[MAX_ID_LENGTH] = { 0 };
642 stringArray_t midlist = {0,0};
643 stringArray_t dilist = {0,0};
645 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
647 readStringArray(&midlist, MAX_ID_LENGTH, "member id list", UUID_EXAMPLE_2);
649 readStringArray(&dilist, MAX_ID_LENGTH, "device list", UUID_EXAMPLE_1);
651 result = OCCloudAclDeleteDeviceFromGroup(NULL, gid, &midlist, &dilist, endPoint, callback);
653 clearStringArray(&midlist);
654 clearStringArray(&dilist);
659 OCStackResult OCWrapperAclGroupGetInfo(const OCDevAddr *endPoint, OCCloudResponseCB callback)
661 char gid[MAX_ID_LENGTH] = { 0 };
662 char mid[MAX_ID_LENGTH] = { 0 };
664 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
666 readOptionalString(mid, sizeof(mid), "member id value", UUID_EXAMPLE_2);
668 return OCCloudAclGroupGetInfo(NULL, gid, OPTIONAL(mid), endPoint, callback);
671 OCStackResult OCWrapperAclInviteUser(const OCDevAddr *endPoint, OCCloudResponseCB callback)
673 OCStackResult result = OC_STACK_NO_MEMORY;
674 char uid[MAX_ID_LENGTH] = { 0 };
675 stringArray_t midlist = {0,0};
676 stringArray_t gidlist = {0,0};
678 readOptionalString(uid, sizeof(uid), "user id value", UUID_EXAMPLE_2);
680 readStringArray(&gidlist, MAX_ID_LENGTH, "group id list", UUID_EXAMPLE_1);
682 readStringArray(&midlist, MAX_ID_LENGTH, "member id list", UUID_EXAMPLE_2);
684 result = OCCloudAclInviteUser(NULL, OPTIONAL(uid), &gidlist, &midlist, endPoint, callback);
686 clearStringArray(&midlist);
687 clearStringArray(&gidlist);
692 OCStackResult OCWrapperAclGetInvitation(const OCDevAddr *endPoint, OCCloudResponseCB callback)
694 char uid[MAX_ID_LENGTH] = { 0 };
696 readOptionalString(uid, sizeof(uid), "user uuid value", UUID_EXAMPLE_2);
698 return OCCloudAclGetInvitation(NULL, OPTIONAL(uid), endPoint, callback);
701 OCStackResult OCWrapperAclDeleteInvitation(const OCDevAddr *endPoint, OCCloudResponseCB callback)
703 char uid[MAX_ID_LENGTH] = { 0 };
704 char gid[MAX_ID_LENGTH] = { 0 };
706 readOptionalString(uid, sizeof(uid), "user uuid value", UUID_EXAMPLE_2);
707 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
709 return OCCloudAclDeleteInvitation(NULL, OPTIONAL(uid), gid, endPoint, callback);
712 OCStackResult OCWrapperAclCancelInvitation(const OCDevAddr *endPoint, OCCloudResponseCB callback)
714 char uid[MAX_ID_LENGTH] = { 0 };
715 char gid[MAX_ID_LENGTH] = { 0 };
716 char mid[MAX_ID_LENGTH] = { 0 };
718 readOptionalString(uid, sizeof(uid), "user uuid value", UUID_EXAMPLE_2);
720 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
721 readString(mid, sizeof(mid), "member id value", ID_EXAMPLE_1);
723 return OCCloudAclCancelInvitation(NULL, OPTIONAL(uid), gid, mid, endPoint, callback);
726 OCStackResult OCWrapperAclPolicyCheck(const OCDevAddr *endPoint, OCCloudResponseCB callback)
728 char sid[MAX_ID_LENGTH] = { 0 };
729 char di[MAX_ID_LENGTH] = { 0 };
731 char user_uri[32] = { 0 };
733 readString(sid, sizeof(sid), "subject id", UUID_EXAMPLE_1);
734 readString(di, sizeof(di), "device id", UUID_EXAMPLE_2);
735 readString(rm, sizeof(rm), "request method", "GET or POST or DELETE");
736 readString(user_uri, sizeof(user_uri), "request uri", RESOURCE_URI_EXAMPLE);
738 return OCCloudAclPolicyCheck(NULL, sid, di, rm, user_uri, endPoint, callback);