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(endPoint, TAG, "NULL endpoint", OC_STACK_INVALID_PARAM);
81 VERIFY_NON_NULL_RET(deviceId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
83 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s?%s=%s", DEFAULT_PREFIX,
84 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, OC_RSRVD_DEVICE_ID, deviceId);
86 OCCallbackData cbData;
87 fillCallbackData(&cbData, ctx, callback, handleGetAclIdByDeviceResponse, NULL);
89 return OCDoResource(NULL, OC_REST_GET, uri, NULL, NULL,
90 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
93 OCStackResult OCCloudAclIdCreate(void* ctx,
96 const OCDevAddr *endPoint,
97 OCCloudResponseCB callback)
99 char uri[MAX_URI_LENGTH] = { 0 };
101 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endpoint", OC_STACK_INVALID_PARAM);
102 VERIFY_NON_NULL_RET(ownerId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
103 VERIFY_NON_NULL_RET(deviceId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
105 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s?%s=%s&%s=%s", DEFAULT_PREFIX,
106 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL,
107 OC_RSRVD_OWNER_ID, ownerId, OC_RSRVD_DEVICE_ID, deviceId);
109 OCCallbackData cbData;
110 fillCallbackData(&cbData, ctx, callback, handleAclIdCreateResponse, NULL);
112 return OCDoResource(NULL, OC_REST_PUT, uri, NULL, NULL,
113 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
116 OCStackResult OCCloudAclIdDelete(void* ctx,
118 const OCDevAddr *endPoint,
119 OCCloudResponseCB callback)
121 char uri[MAX_URI_LENGTH] = { 0 };
123 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endpoint", OC_STACK_INVALID_PARAM);
124 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
126 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s?%s=%s", DEFAULT_PREFIX,
127 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, OC_RSRVD_ACL_ID, aclId);
129 OCCallbackData cbData;
130 fillCallbackData(&cbData, ctx, callback, NULL, NULL);
132 return OCDoResource(NULL, OC_REST_DELETE, uri, NULL, NULL,
133 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
137 * ACL Get Info received data handler
139 * @param[in] ctx context
140 * @param[out] data data required to external application
141 * @param[in] response peer response
142 * @return OCStackResult application result
144 static OCStackResult handleAclGetInfoResponse(void *ctx, void **data, OCClientResponse *response)
146 OCStackResult result = OC_STACK_OK;
147 uint8_t *cbor = NULL;
153 if (NULL == response->payload)
155 OIC_LOG(ERROR, TAG, "Receive NULL payload\n");
156 return OC_STACK_INVALID_PARAM;
159 result = OCConvertPayload(response->payload, &cbor, &size);
160 if (result != OC_STACK_OK)
162 OIC_LOG(ERROR, TAG, "Can't convert OCPayload to cbor");
166 OicSecAcl_t* acl = CBORPayloadToAcl2(cbor, size);
169 OIC_LOG(ERROR, TAG, "Can't parse CBOR payload");
173 result = InstallNewACL2(acl);
174 if (result != OC_STACK_OK)
176 OIC_LOG(ERROR, TAG, "Can't update ACL resource");
180 //can't delete acl because aces was added to gAcl
185 OCStackResult OCCloudAclIndividualGetInfo(void* ctx,
187 const OCDevAddr *endPoint,
188 OCCloudResponseCB callback)
190 char uri[MAX_URI_LENGTH] = { 0 };
192 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endpoint", OC_STACK_INVALID_PARAM);
193 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
195 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s/%s", DEFAULT_PREFIX,
196 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, aclId);
198 OCCallbackData cbData;
199 fillCallbackData(&cbData, ctx, callback, handleAclGetInfoResponse, NULL);
201 return OCDoResource(NULL, OC_REST_GET, uri, NULL, NULL,
202 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
205 OCStackResult OCCloudAclIndividualUpdateAce(void* ctx,
207 const cloudAce_t *aces,
208 const OCDevAddr *endPoint,
209 OCCloudResponseCB callback)
211 size_t dimensions[MAX_REP_ARRAY_DEPTH] = { 0 };
212 char uri[MAX_URI_LENGTH] = { 0 };
216 OCRepPayload **helperPayload = NULL;
217 OCRepPayload **helperPayload2 = NULL;
219 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endpoint", OC_STACK_INVALID_PARAM);
220 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
221 VERIFY_NON_NULL_RET(aces, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
223 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s/%s", DEFAULT_PREFIX,
224 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, aclId);
226 OCRepPayload *payload = OCRepPayloadCreate();
229 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for payload");
233 int acllist_count = 0;
236 cloudAce_t *ace = (cloudAce_t *)&aces[acllist_count++];
244 helperPayload = OICCalloc(acllist_count, sizeof(OCRepPayload *));
247 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for helperPayload");
251 for (int i = 0; i < acllist_count; i++)
253 OCRepPayload *payload = OCRepPayloadCreate();
256 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for helperPayload[i]");
259 helperPayload[i] = payload;
261 const cloudAce_t *ace = &aces[i];
263 OCRepPayloadSetPropString(payload, OC_RSRVD_ACE_ID, ace->aceId);
264 OCRepPayloadSetPropString(payload, OC_RSRVD_SUBJECT_UUID, (const char *)ace->subjectuuid.id);
265 OCRepPayloadSetPropInt(payload, OC_RSRVD_SUBJECT_TYPE, ace->stype);
266 OCRepPayloadSetPropInt(payload, OC_RSRVD_PERMISSION_MASK, ace->permission);
268 int reslist_count = 0;
271 OicSecRsrc_t *res = &ace->resources[reslist_count++];
279 helperPayload2 = OICCalloc(reslist_count, sizeof(OCRepPayload *));
285 for (int j = 0; j < reslist_count; j++)
287 OCRepPayload *payload = OCRepPayloadCreate();
290 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for payload");
293 helperPayload2[j] = payload;
295 const OicSecRsrc_t *res = &ace->resources[j];
297 OCRepPayloadSetPropString(payload, OC_RSRVD_HREF, res->href);
299 dimensions[0] = res->typeLen;
300 OCRepPayloadSetStringArray(payload, OC_RSRVD_RESOURCE_TYPE,
301 (const char **)res->types, dimensions);
303 dimensions[0] = res->interfaceLen;
304 OCRepPayloadSetStringArray(payload, OC_RSRVD_INTERFACE,
305 (const char **)res->interfaces, dimensions);
307 dimensions[0] = reslist_count;
308 OCRepPayloadSetPropObjectArray(payload, OC_RSRVD_RESOURCES,
309 (const OCRepPayload **)helperPayload2, dimensions);
311 dimensions[0] = acllist_count;
312 OCRepPayloadSetPropObjectArray(payload, OC_RSRVD_ACCESS_CONTROL_LIST,
313 (const OCRepPayload **)helperPayload, dimensions);
315 OCCallbackData cbData;
316 fillCallbackData(&cbData, ctx, callback, NULL, NULL);
318 OIC_LOG(DEBUG, TAG, "Next payload created:");
319 OIC_LOG_PAYLOAD(DEBUG, (OCPayload *)payload);
321 return OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
322 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
326 for (int k = 0; k < j; k++) OCRepPayloadDestroy(helperPayload2[k]);
327 OICFree(helperPayload2);
331 for (int k = 0; k < i; k++) OCRepPayloadDestroy(helperPayload[k]);
332 OICFree(helperPayload);
334 OCRepPayloadDestroy(payload);
335 return OC_STACK_NO_MEMORY;
338 OCStackResult OCCloudAclIndividualDelete(void* ctx,
340 const OCDevAddr *endPoint,
341 OCCloudResponseCB callback)
343 char uri[MAX_URI_LENGTH] = { 0 };
345 VERIFY_NON_NULL_RET(endPoint, TAG, "NULL endpoint", OC_STACK_INVALID_PARAM);
346 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
348 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s/%s", DEFAULT_PREFIX,
349 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, aclId);
351 OCCallbackData cbData;
352 fillCallbackData(&cbData, ctx, callback, NULL, NULL);
354 return OCDoResource(NULL, OC_REST_DELETE, uri, NULL, NULL,
355 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);