3 #include "oic_malloc.h"
8 #include "cacommonutil.h"
9 #include "aclresource.h"
10 #include "ocpayloadcbor.h"
11 #include "payload_logging.h"
13 #define TAG "CLOUD-ACL-ID"
16 * ACL Id parse from received response
18 * @param[in] ctx context
19 * @param[out] data data required to external application
20 * @param[in] response peer response
21 * @return OCStackResult application result
23 static OCStackResult getAclIdFromResponse(void *ctx, void **data, OCClientResponse *response)
26 if (NULL == response->payload)
28 OIC_LOG(ERROR, TAG, "Receive NULL payload");
29 return OC_STACK_INVALID_PARAM;
34 if (!OCRepPayloadGetPropString((const OCRepPayload *)response->payload, OC_RSRVD_ACL_ID, &aclid))
36 OIC_LOG_V(ERROR, TAG, "Can't get: %s", OC_RSRVD_ACL_ID);
37 return OC_STACK_MALFORMED_RESPONSE;
40 OIC_LOG_V(INFO, TAG, "Received Acl id = %s", aclid);
47 * ACL Id by device request received data handler
49 * @param[in] ctx context
50 * @param[out] data data required to external application
51 * @param[in] response peer response
52 * @return OCStackResult application result
54 static OCStackResult handleGetAclIdByDeviceResponse(void *ctx, void **data,
55 OCClientResponse *response)
57 return getAclIdFromResponse(ctx, data, response);
61 * ACL Id create request received data handler
63 * @param[in] ctx context
64 * @param[out] data data required to external application
65 * @param[in] response peer response
66 * @return OCStackResult application result
68 static OCStackResult handleAclIdCreateResponse(void *ctx, void **data, OCClientResponse *response)
70 return getAclIdFromResponse(ctx, data, response);
73 OCStackResult OCCloudGetAclIdByDevice(void* ctx,
75 const OCDevAddr *endPoint,
76 OCCloudResponseCB callback)
78 char uri[MAX_URI_LENGTH] = { 0 };
80 VERIFY_NON_NULL_RET(deviceId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
82 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s?%s=%s", DEFAULT_PREFIX,
83 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, OC_RSRVD_DEVICE_ID, deviceId);
85 OCCallbackData cbData;
86 fillCallbackData(&cbData, ctx, callback, handleGetAclIdByDeviceResponse, NULL);
88 return OCDoResource(NULL, OC_REST_GET, uri, NULL, NULL,
89 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
92 OCStackResult OCCloudAclIdCreate(void* ctx,
95 const OCDevAddr *endPoint,
96 OCCloudResponseCB callback)
98 char uri[MAX_URI_LENGTH] = { 0 };
100 VERIFY_NON_NULL_RET(ownerId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
101 VERIFY_NON_NULL_RET(deviceId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
103 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s?%s=%s&%s=%s", DEFAULT_PREFIX,
104 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL,
105 OC_RSRVD_OWNER_ID, ownerId, OC_RSRVD_DEVICE_ID, deviceId);
107 OCCallbackData cbData;
108 fillCallbackData(&cbData, ctx, callback, handleAclIdCreateResponse, NULL);
110 return OCDoResource(NULL, OC_REST_PUT, uri, NULL, NULL,
111 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
114 OCStackResult OCCloudAclIdDelete(void* ctx,
116 const OCDevAddr *endPoint,
117 OCCloudResponseCB callback)
119 char uri[MAX_URI_LENGTH] = { 0 };
121 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
123 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s?%s=%s", DEFAULT_PREFIX,
124 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, OC_RSRVD_ACL_ID, aclId);
126 OCCallbackData cbData;
127 fillCallbackData(&cbData, ctx, callback, NULL, NULL);
129 return OCDoResource(NULL, OC_REST_DELETE, uri, NULL, NULL,
130 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
134 * ACL Get Info received data handler
136 * @param[in] ctx context
137 * @param[out] data data required to external application
138 * @param[in] response peer response
139 * @return OCStackResult application result
141 static OCStackResult handleAclGetInfoResponse(void *ctx, void **data, OCClientResponse *response)
143 OCStackResult result = OC_STACK_OK;
144 uint8_t *cbor = NULL;
150 if (NULL == response->payload)
152 OIC_LOG(ERROR, TAG, "Receive NULL payload\n");
153 return OC_STACK_INVALID_PARAM;
156 result = OCConvertPayload(response->payload, &cbor, &size);
157 if (result != OC_STACK_OK)
159 OIC_LOG(ERROR, TAG, "Can't convert OCPayload to cbor");
163 OicSecAcl_t* acl = CBORPayloadToAcl2(cbor, size);
166 OIC_LOG(ERROR, TAG, "Can't parse CBOR payload");
170 result = InstallNewACL2(acl);
171 if (result != OC_STACK_OK)
173 OIC_LOG(ERROR, TAG, "Can't update ACL resource");
177 //can't delete acl because aces was added to gAcl
182 OCStackResult OCCloudAclIndividualGetInfo(void* ctx,
184 const OCDevAddr *endPoint,
185 OCCloudResponseCB callback)
187 char uri[MAX_URI_LENGTH] = { 0 };
189 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
191 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s/%s", DEFAULT_PREFIX,
192 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, aclId);
194 OCCallbackData cbData;
195 fillCallbackData(&cbData, ctx, callback, handleAclGetInfoResponse, NULL);
197 return OCDoResource(NULL, OC_REST_GET, uri, NULL, NULL,
198 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
201 OCStackResult OCCloudAclIndividualUpdateAce(void* ctx,
203 const cloudAce_t *aces,
204 const OCDevAddr *endPoint,
205 OCCloudResponseCB callback)
207 size_t dimensions[MAX_REP_ARRAY_DEPTH] = { 0 };
208 char uri[MAX_URI_LENGTH] = { 0 };
212 OCRepPayload **helperPayload = NULL;
213 OCRepPayload **helperPayload2 = NULL;
215 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
216 VERIFY_NON_NULL_RET(aces, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
218 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s/%s", DEFAULT_PREFIX,
219 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, aclId);
221 OCRepPayload *payload = OCRepPayloadCreate();
224 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for payload");
228 int acllist_count = 0;
231 cloudAce_t *ace = (cloudAce_t *)&aces[acllist_count++];
239 helperPayload = OICCalloc(acllist_count, sizeof(OCRepPayload *));
242 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for helperPayload");
246 for (int i = 0; i < acllist_count; i++)
248 OCRepPayload *payload = OCRepPayloadCreate();
251 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for helperPayload[i]");
254 helperPayload[i] = payload;
256 const cloudAce_t *ace = &aces[i];
258 OCRepPayloadSetPropString(payload, OC_RSRVD_ACE_ID, ace->aceId);
259 OCRepPayloadSetPropString(payload, OC_RSRVD_SUBJECT_UUID, (const char *)ace->subjectuuid.id);
260 OCRepPayloadSetPropInt(payload, OC_RSRVD_SUBJECT_TYPE, ace->stype);
261 OCRepPayloadSetPropInt(payload, OC_RSRVD_PERMISSION_MASK, ace->permission);
263 int reslist_count = 0;
266 OicSecRsrc_t *res = &ace->resources[reslist_count++];
274 helperPayload2 = OICCalloc(reslist_count, sizeof(OCRepPayload *));
280 for (int j = 0; j < reslist_count; j++)
282 OCRepPayload *payload = OCRepPayloadCreate();
285 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for payload");
288 helperPayload2[j] = payload;
290 const OicSecRsrc_t *res = &ace->resources[j];
292 OCRepPayloadSetPropString(payload, OC_RSRVD_HREF, res->href);
294 dimensions[0] = res->typeLen;
295 OCRepPayloadSetStringArray(payload, OC_RSRVD_RESOURCE_TYPE,
296 (const char **)res->types, dimensions);
298 dimensions[0] = res->interfaceLen;
299 OCRepPayloadSetStringArray(payload, OC_RSRVD_INTERFACE,
300 (const char **)res->interfaces, dimensions);
302 dimensions[0] = reslist_count;
303 OCRepPayloadSetPropObjectArray(payload, OC_RSRVD_RESOURCES,
304 (const OCRepPayload **)helperPayload2, dimensions);
306 dimensions[0] = acllist_count;
307 OCRepPayloadSetPropObjectArray(payload, OC_RSRVD_ACCESS_CONTROL_LIST,
308 (const OCRepPayload **)helperPayload, dimensions);
310 OCCallbackData cbData;
311 fillCallbackData(&cbData, ctx, callback, NULL, NULL);
313 OIC_LOG(DEBUG, TAG, "Next payload created:");
314 OIC_LOG_PAYLOAD(DEBUG, (OCPayload *)payload);
316 return OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
317 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
321 for (int k = 0; k < j; k++) OCRepPayloadDestroy(helperPayload2[k]);
322 OICFree(helperPayload2);
326 for (int k = 0; k < i; k++) OCRepPayloadDestroy(helperPayload[k]);
327 OICFree(helperPayload);
329 OCRepPayloadDestroy(payload);
330 return OC_STACK_NO_MEMORY;
333 OCStackResult OCCloudAclIndividualDelete(void* ctx,
335 const OCDevAddr *endPoint,
336 OCCloudResponseCB callback)
338 char uri[MAX_URI_LENGTH] = { 0 };
340 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
342 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s/%s", DEFAULT_PREFIX,
343 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, aclId);
345 OCCallbackData cbData;
346 fillCallbackData(&cbData, ctx, callback, NULL, NULL);
348 return OCDoResource(NULL, OC_REST_DELETE, uri, NULL, NULL,
349 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);