2 #include "occloudprovisioning.h"
3 #include "oic_malloc.h"
4 #include "oic_string.h"
8 #define TAG "CLOUD-WRAPPER"
10 #define MAX_ID_LENGTH (64)
11 #define MAX_STRING_LENGTH (256)
13 #define UUID_EXAMPLE_1 "9cfbeb8e-5a1e-4d1c-9d01-2ae6fdb"
14 #define UUID_EXAMPLE_2 "123e4567-e89b-12d3-a456-4266554"
15 #define UUID_EXAMPLE_3 "987e6543-e21b-12d3-a456-4266554"
16 #define SUBJECT_ID_EXAMPLE "72616E64-5069-6E44-6576-557569643030"
18 #define ACL_ID_EXAMPLE "0f3d9f7fe5491d54077d"
19 #define ACE_ID_EXAMPLE "a0001"
21 #define ID_EXAMPLE_1 "78f98b4f25f21e2487e8"
22 #define ID_EXAMPLE_2 "6caa7009386290fd3681"
24 #define RESOURCE_URI_EXAMPLE "/a/light/0"
25 #define RESOURCE_TYPE_EXAMPLE "core.light"
26 #define INTERFACE_EXAMPLE "oic.if.baseline"
28 //in case of optional parameters absence should be sent NULL
29 #define OPTIONAL(str) (str[0] ? str : NULL)
31 static bool readOptional(const char* description)
33 if (NULL == description)
38 printf("Do you want to Enter %s (y/n):\n", description);
48 case 'y': return true;
49 case 'n': return false;
50 default: printf("Wrong value entered. Please press 'y' or 'n'\n");
56 void readString(char* item, int length, const char* description, const char* example)
58 printf("Enter %s (f.e. %s):\n", description, example);
59 char template[8] = { 0 };
60 snprintf(template, sizeof(template), "%%%ds", length - 1);
61 scanf(template, item);
66 * Read user input (expect string value, but it is optional and can be skipped by user)
68 * @param[out] item string item to fill
69 * @param[in] length max allowed string length
70 * @param[in] description item description
71 * @param[in] example item example
73 static void readOptionalString(char* item, int length, const char* description, const char* example)
75 if (readOptional(description))
77 readString(item, length, description, example);
81 void readInteger(int* item, const char* description, const char* example)
83 printf("Enter %s (f.e. %s):\n", description, example);
89 * Read user input (expect array of strings)
91 * @param[out] list array of strings structure
92 * @param[in] length max allowed array item length
93 * @param[in] description whole array description
94 * @param[in] example array item example
96 static void readStringArray(stringArray_t *list, int length, const char* description, const char* example)
100 char hint[MAX_STRING_LENGTH] = { 0 };
102 snprintf(hint, sizeof(hint), "%s items count", description);
103 readInteger(&count, hint, "2");
112 item = OICCalloc(count, sizeof(char*));
119 for (i = 0; i < count; i++)
121 item[i] = OICCalloc(length, sizeof(char));
128 snprintf(hint, sizeof(hint), "%s %d item", description, i + 1);
129 readString(item[i], length, hint, example);
132 list->length = count;
136 //free already allocated memory here
137 for (int k = 0; k < i; k++)
145 * Read user input (expect array of strings)
146 * It is optional and can be skipped by user.
148 * @param[out] list array of strings structure
149 * @param[in] length max allowed array item length
150 * @param[in] description whole array description
151 * @param[in] example array item example
153 static void readOptionalStringArray(stringArray_t *list, int length, const char* description, const char* example)
155 if (readOptional(description))
157 readStringArray(list, length, description, example);
162 * Copies whole binary file to crl variable
164 * @param[in] list array of strings structure
165 * @param[out] crl byte array to fill
166 * @return negative error code
168 static int ReadFile(const char *name, OCByteString *crl)
172 uint8_t *buffer = NULL;
176 file = fopen(name, "rb");
179 OIC_LOG_V(ERROR, TAG, "Unable to open file %s", name);
184 result = fseek(file, 0, SEEK_END);
187 OIC_LOG(ERROR, TAG, "Failed to SEEK_END");
191 length = ftell(file);
194 OIC_LOG(ERROR, TAG, "Failed to ftell");
198 result = fseek(file, 0, SEEK_SET);
201 OIC_LOG(ERROR, TAG, "Failed to SEEK_SET");
206 buffer = (uint8_t *)malloc(length);
209 OIC_LOG(ERROR, TAG, "Failed to allocate buffer");
213 //Read file contents into buffer
214 size_t realLen = fread(buffer, length, 1, file);
215 if (realLen != (size_t)length)
217 OIC_LOG_V(ERROR, TAG, "Length mismatch: read %zu instead of %d bytes", realLen, length);
230 OCStackResult OCWrapperCertificateIssueRequest(const OCDevAddr *endPoint, OCCloudResponseCB callback)
232 return OCCloudCertificateIssueRequest(NULL, endPoint, callback);
235 OCStackResult OCWrapperGetCRL(const OCDevAddr *endPoint, OCCloudResponseCB callback)
237 return OCCloudGetCRL(NULL, endPoint, callback);
240 OCStackResult OCWrapperPostCRL(const OCDevAddr *endPoint, OCCloudResponseCB callback)
242 OCStackResult result = OC_STACK_ERROR;
243 OCByteString crlData = {0, 0};
244 char filename[64] = {0};
245 char thisUpdate[16] = { 0 };
246 char nextUpdate[16] = { 0 };
247 stringArray_t serialNumbers = {0, 0};
249 readString(thisUpdate, sizeof(thisUpdate), "Crl's thisUpdate value", "20160727000000");
250 readString(nextUpdate, sizeof(nextUpdate), "Crl's nextUpdate value", "20161027000000");
251 readOptionalStringArray(&serialNumbers, 16, "Revoked serial numbers", "1234");
253 if (NULL == serialNumbers.array)
255 readString(filename, sizeof(filename),
256 "filename from which binary Crl in DER format will be read", "crl");
258 if (ReadFile(filename, &crlData))
260 printf("Can't read crl from file %s\n", filename);
264 stringArray_t *rcsn = serialNumbers.array? &serialNumbers : NULL;
265 OCByteString *crl = crlData.bytes? &crlData : NULL;
267 result = OCCloudPostCRL(NULL, thisUpdate, nextUpdate, crl, rcsn,
270 clearStringArray(&serialNumbers);
271 OICFree(crlData.bytes);
276 OCStackResult OCWrapperAclIdGetByDevice(const OCDevAddr *endPoint, OCCloudResponseCB callback)
278 char di[MAX_ID_LENGTH] = { 0 };
280 readString(di, sizeof(di), "device id", UUID_EXAMPLE_1);
282 return OCCloudAclIdGetByDevice(NULL, di, endPoint, callback);
285 OCStackResult OCWrapperAclIdCreate(const OCDevAddr *endPoint, OCCloudResponseCB callback)
287 char oid[MAX_ID_LENGTH] = { 0 };
288 char di[MAX_ID_LENGTH] = { 0 };
290 readString(oid, sizeof(oid), "owner id", UUID_EXAMPLE_2);
291 readString(di, sizeof(di), "device id", UUID_EXAMPLE_1);
293 return OCCloudAclIdCreate(NULL, oid, di, endPoint, callback);
296 OCStackResult OCWrapperAclIdDelete(const OCDevAddr *endPoint, OCCloudResponseCB callback)
298 char aclid[MAX_ID_LENGTH] = { 0 };
300 readString(aclid, sizeof(aclid), "acl id", ACL_ID_EXAMPLE);
302 return OCCloudAclIdDelete(NULL, aclid, endPoint, callback);
305 OCStackResult OCWrapperAclIndividualGetInfo(const OCDevAddr *endPoint, OCCloudResponseCB callback)
307 char aclid[MAX_ID_LENGTH] = { 0 };
309 readString(aclid, sizeof(aclid), "acl id", ACL_ID_EXAMPLE);
311 return OCCloudAclIndividualGetInfo(NULL, aclid, endPoint, callback);
314 OCStackResult OCWrapperAclIndividualUpdateAce(const OCDevAddr *endPoint, OCCloudResponseCB callback)
316 OCStackResult result = OC_STACK_NO_MEMORY;
319 char aclid[MAX_ID_LENGTH] = { 0 };
320 readString(aclid, sizeof(aclid), "ace id", ACL_ID_EXAMPLE);
322 int acllist_count = 0;
323 readInteger(&acllist_count, "acl list count", "1");
325 cloudAce_t *aces = OICCalloc(acllist_count, sizeof(cloudAce_t));
328 OIC_LOG(ERROR, TAG, "Can't allocate memory for aces");
332 for (i = 0; i < acllist_count; i++)
334 cloudAce_t *ace = &aces[i];
335 if (i != acllist_count - 1) ace->next = &aces[i + 1];
337 char aceid[MAX_ID_LENGTH] = { 0 };
338 char subjectuuid[MAX_ID_LENGTH] = { 0 };
342 readString(aceid, sizeof(aceid), "ace id", ACE_ID_EXAMPLE);
343 readString(subjectuuid, sizeof(subjectuuid), "subjectuuid", SUBJECT_ID_EXAMPLE);
344 readInteger(&stype, "subject type", "0 – Device, 1 – User, 2 - Group");
345 readInteger(&permission, "permission", "6");
347 ace->aceId = OICStrdup(aceid);
349 ace->permission = permission;
350 memcpy(&ace->subjectuuid, subjectuuid, sizeof(OicUuid_t));
352 int reslist_count = 0;
353 readInteger(&reslist_count, "resources list count", "1");
355 ace->resources = OICCalloc(reslist_count, sizeof(OicSecRsrc_t));
358 OIC_LOG(ERROR, TAG, "Can't allocate memory for resources");
362 for (j = 0; j < reslist_count; j++)
364 OicSecRsrc_t *res = &ace->resources[j];
365 if (j != reslist_count - 1) res->next = &ace->resources[j + 1];
367 char href[32] = { 0 };
368 readString(href, sizeof(href), "href", RESOURCE_URI_EXAMPLE);
370 stringArray_t rt = {0, 0};
371 readStringArray(&rt, MAX_ID_LENGTH, "resource type", RESOURCE_TYPE_EXAMPLE);
373 stringArray_t _if = {0, 0};
374 readStringArray(&_if, MAX_ID_LENGTH, "interface", INTERFACE_EXAMPLE);
376 res->href = OICStrdup(href);
377 res->types = rt.array;
378 res->typeLen = rt.length;
379 res->interfaces = _if.array;
380 res->interfaceLen = _if.length;
384 result = OCCloudAclIndividualUpdateAce(NULL, aclid, aces, endPoint, callback);
388 for (int k = 0; k < i; k++)
390 cloudAce_t *ace = &aces[k];
395 for (int l = 0; l < j; l++)
397 OicSecRsrc_t *res = &ace->resources[l];
400 stringArray_t rt = {.array = res->types, .length = res->typeLen};
401 clearStringArray(&rt);
403 stringArray_t _if = {.array = res->interfaces, .length = res->interfaceLen};
404 clearStringArray(&_if);
413 OCStackResult OCWrapperAclIndividualDelete(const OCDevAddr *endPoint, OCCloudResponseCB callback)
415 char aclid[MAX_ID_LENGTH] = { 0 };
417 readString(aclid, sizeof(aclid), "acl id", ACL_ID_EXAMPLE);
419 return OCCloudAclIndividualDelete(NULL, aclid, endPoint, callback);
422 OCStackResult OCWrapperAclCreateGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
424 char gtype[16] = { 0 };
425 char gmid[MAX_ID_LENGTH] = { 0 };
427 readString(gtype, sizeof(gtype), "Group type value", "Public");
428 readOptionalString(gmid, sizeof(gmid), "group member id value", UUID_EXAMPLE_2);
430 return OCCloudAclCreateGroup(NULL, gtype, OPTIONAL(gmid), endPoint, callback);
433 OCStackResult OCWrapperAclFindMyGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
435 char mid[MAX_ID_LENGTH] = { 0 };
437 readOptionalString(mid, sizeof(mid), "member id value", UUID_EXAMPLE_2);
439 return OCCloudAclFindMyGroup(NULL, OPTIONAL(mid), endPoint, callback);
442 OCStackResult OCWrapperAclDeleteGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
444 char gid[MAX_ID_LENGTH] = { 0 };
445 char gmid[MAX_ID_LENGTH] = { 0 };
447 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
449 readOptionalString(gmid, sizeof(gmid), "group member id value", UUID_EXAMPLE_2);
451 return OCCloudAclDeleteGroup(NULL, gid, OPTIONAL(gmid), endPoint, callback);
454 OCStackResult OCWrapperAclJoinToInvitedGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
456 char gid[MAX_ID_LENGTH] = { 0 };
458 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
460 return OCCloudAclJoinToInvitedGroup(NULL, gid, endPoint, callback);
463 OCStackResult OCWrapperAclObserveGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
465 char gid[MAX_ID_LENGTH] = { 0 };
467 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
469 return OCCloudAclObserveGroup(NULL, gid, endPoint, callback);
472 OCStackResult OCWrapperAclShareDeviceIntoGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
474 OCStackResult result = OC_STACK_NO_MEMORY;
475 char gid[MAX_ID_LENGTH] = { 0 };
476 stringArray_t midlist = {0,0};
477 stringArray_t dilist = {0,0};
479 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
481 readStringArray(&midlist, MAX_ID_LENGTH, "member id list", UUID_EXAMPLE_2);
483 readStringArray(&dilist, MAX_ID_LENGTH, "device list", UUID_EXAMPLE_1);
485 result = OCCloudAclShareDeviceIntoGroup(NULL, gid, &midlist, &dilist, endPoint, callback);
487 clearStringArray(&midlist);
488 clearStringArray(&dilist);
493 OCStackResult OCWrapperAclDeleteDeviceFromGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
495 OCStackResult result = OC_STACK_NO_MEMORY;
496 char gid[MAX_ID_LENGTH] = { 0 };
497 stringArray_t midlist = {0,0};
498 stringArray_t dilist = {0,0};
500 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
502 readStringArray(&midlist, MAX_ID_LENGTH, "member id list", UUID_EXAMPLE_2);
504 readStringArray(&dilist, MAX_ID_LENGTH, "device list", UUID_EXAMPLE_1);
506 result = OCCloudAclDeleteDeviceFromGroup(NULL, gid, &midlist, &dilist, endPoint, callback);
508 clearStringArray(&midlist);
509 clearStringArray(&dilist);
514 OCStackResult OCWrapperAclGroupGetInfo(const OCDevAddr *endPoint, OCCloudResponseCB callback)
516 char gid[MAX_ID_LENGTH] = { 0 };
517 char mid[MAX_ID_LENGTH] = { 0 };
519 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
521 readOptionalString(mid, sizeof(mid), "member id value", UUID_EXAMPLE_2);
523 return OCCloudAclGroupGetInfo(NULL, gid, OPTIONAL(mid), endPoint, callback);
526 OCStackResult OCWrapperAclInviteUser(const OCDevAddr *endPoint, OCCloudResponseCB callback)
528 OCStackResult result = OC_STACK_NO_MEMORY;
529 char uid[MAX_ID_LENGTH] = { 0 };
530 stringArray_t midlist = {0,0};
531 stringArray_t gidlist = {0,0};
533 readOptionalString(uid, sizeof(uid), "user id value", UUID_EXAMPLE_2);
535 readStringArray(&gidlist, MAX_ID_LENGTH, "group id list", UUID_EXAMPLE_1);
537 readStringArray(&midlist, MAX_ID_LENGTH, "member id list", UUID_EXAMPLE_2);
539 result = OCCloudAclInviteUser(NULL, OPTIONAL(uid), &gidlist, &midlist, endPoint, callback);
541 clearStringArray(&midlist);
542 clearStringArray(&gidlist);
547 OCStackResult OCWrapperAclGetInvitation(const OCDevAddr *endPoint, OCCloudResponseCB callback)
549 char uid[MAX_ID_LENGTH] = { 0 };
551 readOptionalString(uid, sizeof(uid), "user uuid value", UUID_EXAMPLE_2);
553 return OCCloudAclGetInvitation(NULL, OPTIONAL(uid), endPoint, callback);
556 OCStackResult OCWrapperAclDeleteInvitation(const OCDevAddr *endPoint, OCCloudResponseCB callback)
558 char uid[MAX_ID_LENGTH] = { 0 };
559 char gid[MAX_ID_LENGTH] = { 0 };
561 readOptionalString(uid, sizeof(uid), "user uuid value", UUID_EXAMPLE_2);
562 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
564 return OCCloudAclDeleteInvitation(NULL, OPTIONAL(uid), gid, endPoint, callback);
567 OCStackResult OCWrapperAclCancelInvitation(const OCDevAddr *endPoint, OCCloudResponseCB callback)
569 char uid[MAX_ID_LENGTH] = { 0 };
570 char gid[MAX_ID_LENGTH] = { 0 };
571 char mid[MAX_ID_LENGTH] = { 0 };
573 readOptionalString(uid, sizeof(uid), "user uuid value", UUID_EXAMPLE_2);
575 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
576 readString(mid, sizeof(mid), "member id value", ID_EXAMPLE_1);
578 return OCCloudAclCancelInvitation(NULL, OPTIONAL(uid), gid, mid, endPoint, callback);
581 OCStackResult OCWrapperAclPolicyCheck(const OCDevAddr *endPoint, OCCloudResponseCB callback)
583 char sid[MAX_ID_LENGTH] = { 0 };
584 char di[MAX_ID_LENGTH] = { 0 };
586 char user_uri[32] = { 0 };
588 readString(sid, sizeof(sid), "subject id", UUID_EXAMPLE_1);
589 readString(di, sizeof(di), "device id", UUID_EXAMPLE_2);
590 readString(rm, sizeof(rm), "request method", "GET or POST or DELETE");
591 readString(user_uri, sizeof(user_uri), "request uri", RESOURCE_URI_EXAMPLE);
593 return OCCloudAclPolicyCheck(NULL, sid, di, rm, user_uri, endPoint, callback);