3 #include "oic_malloc.h"
8 #include "srmutility.h"
9 #include "cacommonutil.h"
10 #include "aclresource.h"
11 #include "ocpayloadcbor.h"
12 #include "payload_logging.h"
15 #define TAG "CLOUD-ACL-ID"
18 * ACL Id parse from received response
20 * @param[in] ctx context
21 * @param[out] data data required to external application
22 * @param[in] response peer response
23 * @return OCStackResult application result
25 static OCStackResult getAclIdFromResponse(void *ctx, void **data, OCClientResponse *response)
28 if (NULL == response->payload)
30 OIC_LOG(ERROR, TAG, "Receive NULL payload");
31 return OC_STACK_INVALID_PARAM;
36 if (!OCRepPayloadGetPropString((const OCRepPayload *)response->payload, OC_RSRVD_ACL_ID, &aclid))
38 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_ACL_ID);
39 return OC_STACK_MALFORMED_RESPONSE;
42 OIC_LOG_V(INFO, TAG, "Received Acl id = %s", aclid);
49 * ACL Id by device request received data handler
51 * @param[in] ctx context
52 * @param[out] data data required to external application
53 * @param[in] response peer response
54 * @return OCStackResult application result
56 static OCStackResult handleGetAclIdByDeviceResponse(void *ctx, void **data,
57 OCClientResponse *response)
59 return getAclIdFromResponse(ctx, data, response);
63 * ACL Id create request received data handler
65 * @param[in] ctx context
66 * @param[out] data data required to external application
67 * @param[in] response peer response
68 * @return OCStackResult application result
70 static OCStackResult handleAclIdCreateResponse(void *ctx, void **data, OCClientResponse *response)
72 return getAclIdFromResponse(ctx, data, response);
75 OCStackResult OCCloudGetAclIdByDevice(void* ctx,
77 const OCDevAddr *endPoint,
78 OCCloudResponseCB callback)
80 char uri[MAX_URI_LENGTH] = { 0 };
82 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endpoint", OC_STACK_INVALID_PARAM);
83 VERIFY_NON_NULL_RET(deviceId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
85 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s?%s=%s", DEFAULT_PREFIX,
86 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, OC_RSRVD_DEVICE_ID, deviceId);
88 OCCallbackData cbData;
89 fillCallbackData(&cbData, ctx, callback, handleGetAclIdByDeviceResponse, NULL);
91 return OCDoResource(NULL, OC_REST_GET, uri, NULL, NULL,
92 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
95 OCStackResult OCCloudAclIdCreate(void* ctx,
98 const OCDevAddr *endPoint,
99 OCCloudResponseCB callback)
101 char uri[MAX_URI_LENGTH] = { 0 };
103 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endpoint", OC_STACK_INVALID_PARAM);
104 VERIFY_NON_NULL_RET(ownerId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
105 VERIFY_NON_NULL_RET(deviceId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
107 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s?%s=%s&%s=%s", DEFAULT_PREFIX,
108 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL,
109 OC_RSRVD_OWNER_ID, ownerId, OC_RSRVD_DEVICE_ID, deviceId);
111 OCCallbackData cbData;
112 fillCallbackData(&cbData, ctx, callback, handleAclIdCreateResponse, NULL);
114 return OCDoResource(NULL, OC_REST_PUT, uri, NULL, NULL,
115 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
118 OCStackResult OCCloudAclIdDelete(void* ctx,
120 const OCDevAddr *endPoint,
121 OCCloudResponseCB callback)
123 char uri[MAX_URI_LENGTH] = { 0 };
125 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endpoint", OC_STACK_INVALID_PARAM);
126 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
128 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s?%s=%s", DEFAULT_PREFIX,
129 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, OC_RSRVD_ACL_ID, aclId);
131 OCCallbackData cbData;
132 fillCallbackData(&cbData, ctx, callback, NULL, NULL);
134 return OCDoResource(NULL, OC_REST_DELETE, uri, NULL, NULL,
135 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
139 * ACL Get Info received data handler
141 * @param[in] ctx context
142 * @param[out] data data required to external application
143 * @param[in] response peer response
144 * @return OCStackResult application result
146 static OCStackResult handleAclGetInfoResponse(void *ctx, void **data, OCClientResponse *response)
148 OCStackResult result = OC_STACK_OK;
149 uint8_t *cbor = NULL;
155 if (NULL == response->payload)
157 OIC_LOG(ERROR, TAG, "Receive NULL payload\n");
158 return OC_STACK_INVALID_PARAM;
161 result = OCConvertPayload(response->payload, &cbor, &size);
162 if (result != OC_STACK_OK)
164 OIC_LOG(ERROR, TAG, "Can't convert OCPayload to cbor");
168 OicSecAcl_t* acl = CBORPayloadToAcl2(cbor, size);
171 OIC_LOG(ERROR, TAG, "Can't parse CBOR payload");
177 result = InstallNewACL2(acl);
178 if (result != OC_STACK_OK)
180 OIC_LOG(ERROR, TAG, "Can't update ACL resource");
184 //can't delete acl because aces was added to gAcl
189 OCStackResult OCCloudAclIndividualGetInfo(void* ctx,
191 const OCDevAddr *endPoint,
192 OCCloudResponseCB callback)
194 char uri[MAX_URI_LENGTH] = { 0 };
196 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endpoint", OC_STACK_INVALID_PARAM);
197 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
199 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s/%s", DEFAULT_PREFIX,
200 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, aclId);
202 OCCallbackData cbData;
203 fillCallbackData(&cbData, ctx, callback, handleAclGetInfoResponse, NULL);
205 return OCDoResource(NULL, OC_REST_GET, uri, NULL, NULL,
206 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
209 OCStackResult OCCloudAclIndividualUpdateAce(void* ctx,
211 const cloudAce_t *aces,
212 const OCDevAddr *endPoint,
213 OCCloudResponseCB callback)
215 size_t dimensions[MAX_REP_ARRAY_DEPTH] = { 0 };
216 char uri[MAX_URI_LENGTH] = { 0 };
220 OCRepPayload **helperPayload = NULL;
221 OCRepPayload **helperPayload2 = NULL;
223 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endpoint", OC_STACK_INVALID_PARAM);
224 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
225 VERIFY_NON_NULL_RET(aces, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
227 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s/%s", DEFAULT_PREFIX,
228 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, aclId);
230 OCRepPayload *payload = OCRepPayloadCreate();
233 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for payload");
237 int acllist_count = 0;
238 //code below duplicates LL_COUNT, implemented in newer version of utlist.h
240 cloudAce_t *ace = (cloudAce_t*)aces;
248 helperPayload = OICCalloc(acllist_count, sizeof(OCRepPayload *));
251 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for helperPayload");
256 cloudAce_t *ace = NULL;
258 LL_FOREACH((cloudAce_t*)aces, ace)
260 OCRepPayload *payload = OCRepPayloadCreate();
263 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for helperPayload[i]");
266 helperPayload[i++] = payload;
269 if (OC_STACK_OK != ConvertUuidToStr(&ace->subjectuuid, &uuid))
271 OIC_LOG(ERROR, TAG, "Can't convert subjectuuid to string");
274 OCRepPayloadSetPropString(payload, OC_RSRVD_ACE_ID, ace->aceId);
275 OCRepPayloadSetPropString(payload, OC_RSRVD_SUBJECT_UUID, (const char *)uuid);
276 OCRepPayloadSetPropInt(payload, OC_RSRVD_SUBJECT_TYPE, ace->stype);
277 OCRepPayloadSetPropInt(payload, OC_RSRVD_PERMISSION_MASK, ace->permission);
281 int reslist_count = 0;
282 //code below duplicates LL_COUNT, implemented in newer version of utlist.h
284 OicSecRsrc_t *res = ace->resources;
292 helperPayload2 = OICCalloc(reslist_count, sizeof(OCRepPayload *));
299 OicSecRsrc_t *res = NULL;
301 LL_FOREACH(ace->resources, res)
303 OCRepPayload *payload = OCRepPayloadCreate();
306 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for helperPayload2[j]");
309 helperPayload2[j++] = payload;
311 OCRepPayloadSetPropString(payload, OC_RSRVD_HREF, res->href);
313 dimensions[0] = res->typeLen;
314 OCRepPayloadSetStringArray(payload, OC_RSRVD_RESOURCE_TYPE,
315 (const char **)res->types, dimensions);
317 dimensions[0] = res->interfaceLen;
318 OCRepPayloadSetStringArray(payload, OC_RSRVD_INTERFACE,
319 (const char **)res->interfaces, dimensions);
321 dimensions[0] = reslist_count;
322 OCRepPayloadSetPropObjectArray(payload, OC_RSRVD_RESOURCES,
323 (const OCRepPayload **)helperPayload2, dimensions);
325 dimensions[0] = acllist_count;
326 OCRepPayloadSetPropObjectArray(payload, OC_RSRVD_ACCESS_CONTROL_LIST,
327 (const OCRepPayload **)helperPayload, dimensions);
329 OCCallbackData cbData;
330 fillCallbackData(&cbData, ctx, callback, NULL, NULL);
332 OIC_LOG(DEBUG, TAG, "Next payload created:");
333 OIC_LOG_PAYLOAD(DEBUG, (OCPayload *)payload);
335 return OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
336 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
340 for (int k = 0; k < j; k++) OCRepPayloadDestroy(helperPayload2[k]);
341 OICFree(helperPayload2);
345 for (int k = 0; k < i; k++) OCRepPayloadDestroy(helperPayload[k]);
346 OICFree(helperPayload);
348 OCRepPayloadDestroy(payload);
349 return OC_STACK_NO_MEMORY;
352 OCStackResult OCCloudAclIndividualDelete(void* ctx,
354 const OCDevAddr *endPoint,
355 OCCloudResponseCB callback)
357 char uri[MAX_URI_LENGTH] = { 0 };
359 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endpoint", OC_STACK_INVALID_PARAM);
360 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
362 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s/%s", DEFAULT_PREFIX,
363 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, aclId);
365 OCCallbackData cbData;
366 fillCallbackData(&cbData, ctx, callback, NULL, NULL);
368 return OCDoResource(NULL, OC_REST_DELETE, uri, NULL, NULL,
369 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);