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 create request received data handler
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 handleAclIdCreateResponse(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;
44 OCStackResult OCCloudAclIdGetByDevice(void* ctx,
46 const OCDevAddr *endPoint,
47 OCCloudResponseCB callback)
49 char uri[MAX_URI_LENGTH] = { 0 };
51 VERIFY_NON_NULL_RET(deviceId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
53 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s?%s=%s", DEFAULT_PREFIX,
54 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, OC_RSRVD_DEVICE_ID, deviceId);
56 OCCallbackData cbData;
57 fillCallbackData(&cbData, ctx, callback, handleAclIdCreateResponse, NULL);
59 return OCDoResource(NULL, OC_REST_GET, uri, NULL, NULL,
60 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
63 OCStackResult OCCloudAclIdCreate(void* ctx,
66 const OCDevAddr *endPoint,
67 OCCloudResponseCB callback)
69 char uri[MAX_URI_LENGTH] = { 0 };
71 VERIFY_NON_NULL_RET(ownerId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
72 VERIFY_NON_NULL_RET(deviceId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
74 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s?%s=%s&%s=%s", DEFAULT_PREFIX,
75 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL,
76 OC_RSRVD_OWNER_ID, ownerId, OC_RSRVD_DEVICE_ID, deviceId);
78 OCCallbackData cbData;
79 fillCallbackData(&cbData, ctx, callback, handleAclIdCreateResponse, NULL);
81 return OCDoResource(NULL, OC_REST_PUT, uri, NULL, NULL,
82 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
85 OCStackResult OCCloudAclIdDelete(void* ctx,
87 const OCDevAddr *endPoint,
88 OCCloudResponseCB callback)
90 char uri[MAX_URI_LENGTH] = { 0 };
92 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
94 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s?%s=%s", DEFAULT_PREFIX,
95 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, OC_RSRVD_ACL_ID, aclId);
97 OCCallbackData cbData;
98 fillCallbackData(&cbData, ctx, callback, NULL, NULL);
100 return OCDoResource(NULL, OC_REST_DELETE, uri, NULL, NULL,
101 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
105 * ACL Get Info received data handler
107 * @param[in] ctx context
108 * @param[out] data data required to external application
109 * @param[in] response peer response
110 * @return OCStackResult application result
112 static OCStackResult handleAclGetInfoResponse(void *ctx, void **data, OCClientResponse *response)
114 OCStackResult result = OC_STACK_OK;
115 uint8_t *cbor = NULL;
121 if (NULL == response->payload)
123 OIC_LOG(ERROR, TAG, "Receive NULL payload\n");
124 return OC_STACK_INVALID_PARAM;
127 result = OCConvertPayload(response->payload, &cbor, &size);
128 if (result != OC_STACK_OK)
130 OIC_LOG(ERROR, TAG, "Can't convert OCPayload to cbor");
134 OicSecAcl_t* acl = CBORPayloadToAcl2(cbor, size);
137 OIC_LOG(ERROR, TAG, "Can't parse CBOR payload");
141 result = InstallNewACL2(acl);
142 if (result != OC_STACK_OK)
144 OIC_LOG(ERROR, TAG, "Can't update ACL resource");
148 //can't delete acl because aces was added to gAcl
153 OCStackResult OCCloudAclIndividualGetInfo(void* ctx,
155 const OCDevAddr *endPoint,
156 OCCloudResponseCB callback)
158 char uri[MAX_URI_LENGTH] = { 0 };
160 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
162 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s/%s", DEFAULT_PREFIX,
163 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, aclId);
165 OCCallbackData cbData;
166 fillCallbackData(&cbData, ctx, callback, handleAclGetInfoResponse, NULL);
168 return OCDoResource(NULL, OC_REST_GET, uri, NULL, NULL,
169 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
172 OCStackResult OCCloudAclIndividualUpdateAce(void* ctx,
174 const cloudAce_t *aces,
175 const OCDevAddr *endPoint,
176 OCCloudResponseCB callback)
178 size_t dimensions[MAX_REP_ARRAY_DEPTH] = { 0 };
179 char uri[MAX_URI_LENGTH] = { 0 };
183 OCRepPayload **helperPayload = NULL;
184 OCRepPayload **helperPayload2 = NULL;
186 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
187 VERIFY_NON_NULL_RET(aces, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
189 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s/%s", DEFAULT_PREFIX,
190 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, aclId);
192 OCRepPayload *payload = OCRepPayloadCreate();
195 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for payload");
199 int acllist_count = 0;
202 cloudAce_t *ace = (cloudAce_t *)&aces[acllist_count++];
210 helperPayload = OICCalloc(acllist_count, sizeof(OCRepPayload *));
213 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for helperPayload");
217 for (int i = 0; i < acllist_count; i++)
219 OCRepPayload *payload = OCRepPayloadCreate();
222 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for helperPayload[i]");
225 helperPayload[i] = payload;
227 const cloudAce_t *ace = &aces[i];
229 OCRepPayloadSetPropString(payload, OC_RSRVD_ACE_ID, ace->aceId);
230 OCRepPayloadSetPropString(payload, OC_RSRVD_SUBJECT_UUID, (const char *)ace->subjectuuid.id);
231 OCRepPayloadSetPropInt(payload, OC_RSRVD_SUBJECT_TYPE, ace->stype);
232 OCRepPayloadSetPropInt(payload, OC_RSRVD_PERMISSION_MASK, ace->permission);
234 int reslist_count = 0;
237 OicSecRsrc_t *res = &ace->resources[reslist_count++];
245 helperPayload2 = OICCalloc(reslist_count, sizeof(OCRepPayload *));
251 for (int j = 0; j < reslist_count; j++)
253 OCRepPayload *payload = OCRepPayloadCreate();
256 OIC_LOG_V(DEBUG, TAG, "Can't allocate memory for payload");
259 helperPayload2[j] = payload;
261 const OicSecRsrc_t *res = &ace->resources[j];
263 OCRepPayloadSetPropString(payload, OC_RSRVD_HREF, res->href);
265 dimensions[0] = res->typeLen;
266 OCRepPayloadSetStringArray(payload, OC_RSRVD_RESOURCE_TYPE,
267 (const char **)res->types, dimensions);
269 dimensions[0] = res->interfaceLen;
270 OCRepPayloadSetStringArray(payload, OC_RSRVD_INTERFACE,
271 (const char **)res->interfaces, dimensions);
273 dimensions[0] = reslist_count;
274 OCRepPayloadSetPropObjectArray(payload, OC_RSRVD_RESOURCES,
275 (const OCRepPayload **)helperPayload2, dimensions);
277 dimensions[0] = acllist_count;
278 OCRepPayloadSetPropObjectArray(payload, OC_RSRVD_ACCESS_CONTROL_LIST,
279 (const OCRepPayload **)helperPayload, dimensions);
281 OCCallbackData cbData;
282 fillCallbackData(&cbData, ctx, callback, NULL, NULL);
284 OIC_LOG(DEBUG, TAG, "Next payload created:");
285 OIC_LOG_PAYLOAD(DEBUG, (OCPayload *)payload);
287 return OCDoResource(NULL, OC_REST_POST, uri, NULL, (OCPayload *)payload,
288 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);
292 for (int k = 0; k < j; k++) OCRepPayloadDestroy(helperPayload2[k]);
293 OICFree(helperPayload2);
297 for (int k = 0; k < i; k++) OCRepPayloadDestroy(helperPayload[k]);
298 OICFree(helperPayload);
300 OCRepPayloadDestroy(payload);
301 return OC_STACK_NO_MEMORY;
304 OCStackResult OCCloudAclIndividualDelete(void* ctx,
306 const OCDevAddr *endPoint,
307 OCCloudResponseCB callback)
309 char uri[MAX_URI_LENGTH] = { 0 };
311 VERIFY_NON_NULL_RET(aclId, TAG, "NULL input param", OC_STACK_INVALID_PARAM);
313 snprintf(uri, MAX_URI_LENGTH, "%s%s:%d%s/%s", DEFAULT_PREFIX,
314 endPoint->addr, endPoint->port, OC_RSRVD_ACL_ID_URL, aclId);
316 OCCallbackData cbData;
317 fillCallbackData(&cbData, ctx, callback, NULL, NULL);
319 return OCDoResource(NULL, OC_REST_DELETE, uri, NULL, NULL,
320 CT_ADAPTER_TCP, OC_LOW_QOS, &cbData, NULL, 0);