3 #include "occloudprovisioning.h"
4 #include "OCCloudProvisioning.h"
5 #include "oic_malloc.h"
6 #include "oic_string.h"
9 #define TAG "CLOUD-WRAPPER"
11 #define MAX_ID_LENGTH (64)
12 #define MAX_STRING_LENGTH (256)
14 #define UUID_EXAMPLE_1 "9cfbeb8e-5a1e-4d1c-9d01-2ae6fdb"
15 #define UUID_EXAMPLE_2 "123e4567-e89b-12d3-a456-4266554"
16 #define UUID_EXAMPLE_3 "987e6543-e21b-12d3-a456-4266554"
17 #define SUBJECT_ID_EXAMPLE "72616E64-5069-6E44-6576-557569643030"
19 #define ACL_ID_EXAMPLE "0f3d9f7fe5491d54077d"
20 #define ACE_ID_EXAMPLE "a0001"
22 #define ID_EXAMPLE_1 "78f98b4f25f21e2487e8"
23 #define ID_EXAMPLE_2 "6caa7009386290fd3681"
25 #define RESOURCE_URI_EXAMPLE "/a/light/0"
26 #define RESOURCE_TYPE_EXAMPLE "core.light"
27 #define INTERFACE_EXAMPLE "oic.if.baseline"
29 //in case of optional parameters absence should be sent NULL
30 #define OPTIONAL(str) (str[0] ? str : NULL)
34 static bool readOptional(const char* description)
36 if (NULL == description)
41 printf("Do you want to Enter %s (y/n):\n", description);
51 case 'y': return true;
52 case 'n': return false;
53 default: printf("Wrong value entered. Please press 'y' or 'n'\n");
60 * Read user input (expect string value)
62 * @param[out] item string item to fill
63 * @param[in] length max allowed string length
64 * @param[in] description item description
65 * @param[in] example item example
67 void readString(char* item, int length, const char* description, const char* example)
69 printf("Enter %s (f.e. %s):\n", description, example);
71 snprintf(temp, sizeof(temp), "%%%ds", length - 1);
77 * Read user input (expect string value, but it is optional and can be skipped by user)
79 * @param[out] item string item to fill
80 * @param[in] length max allowed string length
81 * @param[in] description item description
82 * @param[in] example item example
84 static void readOptionalString(char* item, int length, const char* description, const char* example)
86 if (readOptional(description))
88 readString(item, length, description, example);
93 * Read user input (expect integer value)
95 * @param[out] item integer item to fill
96 * @param[in] description item description
97 * @param[in] example item example
99 void readInteger(int* item, const char* description, const char* example)
101 printf("Enter %s (f.e. %s):\n", description, example);
107 * Read user input (expect array of strings)
109 * @param[out] list array of strings structure
110 * @param[in] length max allowed array item length
111 * @param[in] description whole array description
112 * @param[in] example array item example
114 static void readStringArray(stringArray_t *list, int length, const char* description, const char* example)
118 char hint[MAX_STRING_LENGTH] = { 0 };
120 snprintf(hint, sizeof(hint), "%s items count", description);
121 readInteger(&count, hint, "2");
130 item = (char**)OICCalloc(count, sizeof(char*));
137 for (i = 0; i < count; i++)
139 item[i] = (char*)OICCalloc(length, sizeof(char));
146 snprintf(hint, sizeof(hint), "%s %d item", description, i + 1);
147 readString(item[i], length, hint, example);
150 list->length = (size_t)count;
154 //free already allocated memory here
155 for (int k = 0; k < i; k++)
163 * Read user input (expect array of strings)
164 * It is optional and can be skipped by user.
166 * @param[out] list array of strings structure
167 * @param[in] length max allowed array item length
168 * @param[in] description whole array description
169 * @param[in] example array item example
171 static void readOptionalStringArray(stringArray_t *list, int length, const char* description, const char* example)
173 if (readOptional(description))
175 readStringArray(list, length, description, example);
180 * Copies whole binary file to crl variable
182 * @param[in] list array of strings structure
183 * @param[out] crl byte array to fill
184 * @return negative error code
186 static int ReadFile(const char *name, OCByteString *crl)
190 uint8_t *buffer = NULL;
195 file = fopen(name, "rb");
198 OIC_LOG_V(ERROR, TAG, "Unable to open file %s", name);
203 result = fseek(file, 0, SEEK_END);
206 OIC_LOG(ERROR, TAG, "Failed to SEEK_END");
210 length = ftell(file);
213 OIC_LOG(ERROR, TAG, "Failed to ftell");
217 result = fseek(file, 0, SEEK_SET);
220 OIC_LOG(ERROR, TAG, "Failed to SEEK_SET");
225 buffer = (uint8_t *)malloc(length);
228 OIC_LOG(ERROR, TAG, "Failed to allocate buffer");
232 //Read file contents into buffer
233 realLen = fread(buffer, length, 1, file);
234 if (realLen != (size_t)length)
236 OIC_LOG_V(ERROR, TAG, "Length mismatch: read %zu instead of %d bytes", realLen, length);
241 crl->len = (size_t)length;
249 OCStackResult OCWrapperCertificateIssueRequest(OCCloudProvisioning& ptr, ResponseCallBack callback)
251 return ptr.requestCertificate(callback);
254 OCStackResult OCWrapperGetCRL(OCCloudProvisioning& ptr, ResponseCallBack callback)
256 return ptr.getCRL(callback);
259 OCStackResult OCWrapperPostCRL(OCCloudProvisioning& ptr, ResponseCallBack callback)
261 OCStackResult result = OC_STACK_ERROR;
262 OCByteString crlData = {0, 0};
263 char filename[64] = {0};
264 char thisUpdate[16] = { 0 };
265 char nextUpdate[16] = { 0 };
266 stringArray_t serialNumbers = {0, 0};
267 stringArray_t *rcsn = 0;
268 OCByteString *crl = 0;
270 readString(thisUpdate, sizeof(thisUpdate), "Crl's thisUpdate value", "20160727000000");
271 readString(nextUpdate, sizeof(nextUpdate), "Crl's nextUpdate value", "20161027000000");
272 readOptionalStringArray(&serialNumbers, 16, "Revoked serial numbers", "1234");
274 if (NULL == serialNumbers.array)
276 readString(filename, sizeof(filename),
277 "filename from which binary Crl in DER format will be read", "crl");
279 if (ReadFile(filename, &crlData))
281 printf("Can't read crl from file %s\n", filename);
285 rcsn = serialNumbers.array? &serialNumbers : NULL;
286 crl = crlData.bytes? &crlData : NULL;
288 result = ptr.postCRL(thisUpdate, nextUpdate, crl, rcsn,
291 clearStringArray(&serialNumbers);
292 OICFree(crlData.bytes);
297 OCStackResult OCWrapperAclIdGetByDevice(OCCloudProvisioning& ptr, AclIdResponseCallBack callback)
299 char di[MAX_ID_LENGTH] = { 0 };
301 readString(di, sizeof(di), "device id", UUID_EXAMPLE_1);
303 return ptr.getAclIdByDevice(di, callback);
306 OCStackResult OCWrapperAclIdCreate(const OCDevAddr *endPoint, OCCloudResponseCB callback)
308 char oid[MAX_ID_LENGTH] = { 0 };
309 char di[MAX_ID_LENGTH] = { 0 };
311 readString(oid, sizeof(oid), "owner id", UUID_EXAMPLE_2);
312 readString(di, sizeof(di), "device id", UUID_EXAMPLE_1);
314 return OCCloudAclIdCreate(NULL, oid, di, endPoint, callback);
317 OCStackResult OCWrapperAclIdDelete(const OCDevAddr *endPoint, OCCloudResponseCB callback)
319 char aclid[MAX_ID_LENGTH] = { 0 };
321 readString(aclid, sizeof(aclid), "acl id", ACL_ID_EXAMPLE);
323 return OCCloudAclIdDelete(NULL, aclid, endPoint, callback);
326 OCStackResult OCWrapperAclIndividualGetInfo(OCCloudProvisioning& ptr, ResponseCallBack callback)
328 char aclid[MAX_ID_LENGTH] = { 0 };
330 readString(aclid, sizeof(aclid), "acl id", ACL_ID_EXAMPLE);
332 return ptr.getIndividualAclInfo(aclid, callback);
335 OCStackResult OCWrapperAclIndividualUpdateAce(const OCDevAddr *endPoint, OCCloudResponseCB callback)
337 OCStackResult result = OC_STACK_NO_MEMORY;
339 cloudAce_t *aces = NULL;
341 char aclid[MAX_ID_LENGTH] = { 0 };
342 readString(aclid, sizeof(aclid), "ace id", ACL_ID_EXAMPLE);
344 int acllist_count = 0;
345 readInteger(&acllist_count, "acl list count", "1");
346 if (0 >= acllist_count)
348 OIC_LOG(ERROR, TAG, "Wrong number of aclList");
352 aces = (cloudAce_t*)OICCalloc(acllist_count, sizeof(cloudAce_t));
355 OIC_LOG(ERROR, TAG, "Can't allocate memory for aces");
359 for (i = 0; i < acllist_count; i++)
361 cloudAce_t *ace = &aces[i];
362 if (i != acllist_count - 1) ace->next = &aces[i + 1];
364 char aceid[MAX_ID_LENGTH] = { 0 };
365 char subjectuuid[MAX_ID_LENGTH] = { 0 };
369 readString(aceid, sizeof(aceid), "ace id", ACE_ID_EXAMPLE);
370 readString(subjectuuid, sizeof(subjectuuid), "subjectuuid", SUBJECT_ID_EXAMPLE);
371 readInteger(&stype, "subject type", "0 – Device, 1 – User, 2 - Group");
372 readInteger(&permission, "permission", "6");
374 ace->aceId = OICStrdup(aceid);
376 ace->permission = permission;
377 memcpy(&ace->subjectuuid, subjectuuid, sizeof(OicUuid_t));
379 int reslist_count = 0;
380 readInteger(&reslist_count, "resources list count", "1");
382 ace->resources = (OicSecRsrc_t*)OICCalloc(reslist_count, sizeof(OicSecRsrc_t));
385 OIC_LOG(ERROR, TAG, "Can't allocate memory for resources");
389 for (j = 0; j < reslist_count; j++)
391 OicSecRsrc_t *res = &ace->resources[j];
392 if (j != reslist_count - 1) res->next = &ace->resources[j + 1];
394 char href[32] = { 0 };
395 readString(href, sizeof(href), "href", RESOURCE_URI_EXAMPLE);
397 stringArray_t rt = {0, 0};
398 readStringArray(&rt, MAX_ID_LENGTH, "resource type", RESOURCE_TYPE_EXAMPLE);
400 stringArray_t _if = {0, 0};
401 readStringArray(&_if, MAX_ID_LENGTH, "interface", INTERFACE_EXAMPLE);
403 res->href = OICStrdup(href);
404 res->types = rt.array;
405 res->typeLen = rt.length;
406 res->interfaces = _if.array;
407 res->interfaceLen = _if.length;
411 result = OCCloudAclIndividualUpdateAce(NULL, aclid, aces, endPoint, callback);
415 for (int k = 0; k < i; k++)
417 cloudAce_t *ace = &aces[k];
422 for (int l = 0; l < j; l++)
424 OicSecRsrc_t *res = &ace->resources[l];
427 stringArray_t rt { res->types, res->typeLen};
428 clearStringArray(&rt);
430 stringArray_t _if {res->interfaces, res->interfaceLen};
431 clearStringArray(&_if);
440 OCStackResult OCWrapperAclIndividualDelete(const OCDevAddr *endPoint, OCCloudResponseCB callback)
442 char aclid[MAX_ID_LENGTH] = { 0 };
444 readString(aclid, sizeof(aclid), "acl id", ACL_ID_EXAMPLE);
446 return OCCloudAclIndividualDelete(NULL, aclid, endPoint, callback);
449 OCStackResult OCWrapperAclCreateGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
451 char gtype[16] = { 0 };
452 char gmid[MAX_ID_LENGTH] = { 0 };
454 readString(gtype, sizeof(gtype), "Group type value", "Public");
455 readOptionalString(gmid, sizeof(gmid), "group member id value", UUID_EXAMPLE_2);
457 return OCCloudAclCreateGroup(NULL, gtype, OPTIONAL(gmid), endPoint, callback);
460 OCStackResult OCWrapperAclFindMyGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
462 char mid[MAX_ID_LENGTH] = { 0 };
464 readOptionalString(mid, sizeof(mid), "member id value", UUID_EXAMPLE_2);
466 return OCCloudAclFindMyGroup(NULL, OPTIONAL(mid), endPoint, callback);
469 OCStackResult OCWrapperAclDeleteGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
471 char gid[MAX_ID_LENGTH] = { 0 };
472 char gmid[MAX_ID_LENGTH] = { 0 };
474 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
476 readOptionalString(gmid, sizeof(gmid), "group member id value", UUID_EXAMPLE_2);
478 return OCCloudAclDeleteGroup(NULL, gid, OPTIONAL(gmid), endPoint, callback);
481 OCStackResult OCWrapperAclJoinToInvitedGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
483 char gid[MAX_ID_LENGTH] = { 0 };
485 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
487 return OCCloudAclJoinToInvitedGroup(NULL, gid, endPoint, callback);
490 OCStackResult OCWrapperAclObserveGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
492 char gid[MAX_ID_LENGTH] = { 0 };
494 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
496 return OCCloudAclObserveGroup(NULL, gid, endPoint, callback);
499 OCStackResult OCWrapperAclShareDeviceIntoGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
501 OCStackResult result = OC_STACK_NO_MEMORY;
502 char gid[MAX_ID_LENGTH] = { 0 };
503 stringArray_t midlist = {0,0};
504 stringArray_t dilist = {0,0};
506 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
508 readStringArray(&midlist, MAX_ID_LENGTH, "member id list", UUID_EXAMPLE_2);
510 readStringArray(&dilist, MAX_ID_LENGTH, "device list", UUID_EXAMPLE_1);
512 result = OCCloudAclShareDeviceIntoGroup(NULL, gid, &midlist, &dilist, endPoint, callback);
514 clearStringArray(&midlist);
515 clearStringArray(&dilist);
520 OCStackResult OCWrapperAclDeleteDeviceFromGroup(const OCDevAddr *endPoint, OCCloudResponseCB callback)
522 OCStackResult result = OC_STACK_NO_MEMORY;
523 char gid[MAX_ID_LENGTH] = { 0 };
524 stringArray_t midlist = {0,0};
525 stringArray_t dilist = {0,0};
527 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
529 readStringArray(&midlist, MAX_ID_LENGTH, "member id list", UUID_EXAMPLE_2);
531 readStringArray(&dilist, MAX_ID_LENGTH, "device list", UUID_EXAMPLE_1);
533 result = OCCloudAclDeleteDeviceFromGroup(NULL, gid, &midlist, &dilist, endPoint, callback);
535 clearStringArray(&midlist);
536 clearStringArray(&dilist);
541 OCStackResult OCWrapperAclGroupGetInfo(const OCDevAddr *endPoint, OCCloudResponseCB callback)
543 char gid[MAX_ID_LENGTH] = { 0 };
544 char mid[MAX_ID_LENGTH] = { 0 };
546 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
548 readOptionalString(mid, sizeof(mid), "member id value", UUID_EXAMPLE_2);
550 return OCCloudAclGroupGetInfo(NULL, gid, OPTIONAL(mid), endPoint, callback);
553 OCStackResult OCWrapperAclInviteUser(const OCDevAddr *endPoint, OCCloudResponseCB callback)
555 OCStackResult result = OC_STACK_NO_MEMORY;
556 char uid[MAX_ID_LENGTH] = { 0 };
557 stringArray_t midlist = {0,0};
558 stringArray_t gidlist = {0,0};
560 readOptionalString(uid, sizeof(uid), "user id value", UUID_EXAMPLE_2);
562 readStringArray(&gidlist, MAX_ID_LENGTH, "group id list", UUID_EXAMPLE_1);
564 readStringArray(&midlist, MAX_ID_LENGTH, "member id list", UUID_EXAMPLE_2);
566 result = OCCloudAclInviteUser(NULL, OPTIONAL(uid), &gidlist, &midlist, endPoint, callback);
568 clearStringArray(&midlist);
569 clearStringArray(&gidlist);
574 OCStackResult OCWrapperAclGetInvitation(const OCDevAddr *endPoint, OCCloudResponseCB callback)
576 char uid[MAX_ID_LENGTH] = { 0 };
578 readOptionalString(uid, sizeof(uid), "user uuid value", UUID_EXAMPLE_2);
580 return OCCloudAclGetInvitation(NULL, OPTIONAL(uid), endPoint, callback);
583 OCStackResult OCWrapperAclDeleteInvitation(const OCDevAddr *endPoint, OCCloudResponseCB callback)
585 char uid[MAX_ID_LENGTH] = { 0 };
586 char gid[MAX_ID_LENGTH] = { 0 };
588 readOptionalString(uid, sizeof(uid), "user uuid value", UUID_EXAMPLE_2);
589 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
591 return OCCloudAclDeleteInvitation(NULL, OPTIONAL(uid), gid, endPoint, callback);
594 OCStackResult OCWrapperAclCancelInvitation(const OCDevAddr *endPoint, OCCloudResponseCB callback)
596 char uid[MAX_ID_LENGTH] = { 0 };
597 char gid[MAX_ID_LENGTH] = { 0 };
598 char mid[MAX_ID_LENGTH] = { 0 };
600 readOptionalString(uid, sizeof(uid), "user uuid value", UUID_EXAMPLE_2);
602 readString(gid, sizeof(gid), "Group id value", ID_EXAMPLE_1);
603 readString(mid, sizeof(mid), "member id value", ID_EXAMPLE_1);
605 return OCCloudAclCancelInvitation(NULL, OPTIONAL(uid), gid, mid, endPoint, callback);
608 OCStackResult OCWrapperAclPolicyCheck(const OCDevAddr *endPoint, OCCloudResponseCB callback)
610 char sid[MAX_ID_LENGTH] = { 0 };
611 char di[MAX_ID_LENGTH] = { 0 };
613 char user_uri[32] = { 0 };
615 readString(sid, sizeof(sid), "subject id", UUID_EXAMPLE_1);
616 readString(di, sizeof(di), "device id", UUID_EXAMPLE_2);
617 readString(rm, sizeof(rm), "request method", "GET or POST or DELETE");
618 readString(user_uri, sizeof(user_uri), "request uri", RESOURCE_URI_EXAMPLE);
620 return OCCloudAclPolicyCheck(NULL, sid, di, rm, user_uri, endPoint, callback);