OCStackResult UpdateAmsMgrContext(PEContext_t *context, const CAEndpoint_t *endpoint, const CARequestInfo_t *requestInfo) { OCStackResult ret = OC_STACK_ERROR; //The AmsMgr context endpoint and requestInfo will be free from , //AmsMgrAclReqCallback function if(context->amsMgrContext->endpoint) { OICFree(context->amsMgrContext->endpoint); context->amsMgrContext->endpoint = NULL; } context->amsMgrContext->endpoint = (CAEndpoint_t *)OICCalloc(1, sizeof(CAEndpoint_t )); VERIFY_NON_NULL(TAG, context->amsMgrContext->endpoint, ERROR); *context->amsMgrContext->endpoint = *endpoint; if(context->amsMgrContext->requestInfo) { FreeCARequestInfo(context->amsMgrContext->requestInfo); context->amsMgrContext->requestInfo = NULL; } context->amsMgrContext->requestInfo = CACloneRequestInfo(requestInfo); VERIFY_NON_NULL(TAG, context->amsMgrContext->requestInfo, ERROR); ret = OC_STACK_OK; exit: return ret; }
static OCStackApplicationResult AmsMgrAclReqCallback(void *ctx, OCDoHandle handle, OCClientResponse * clientResponse) { OC_LOG_V(INFO, TAG, "%s Begin", __func__ ); (void)handle; PEContext_t *context = (PEContext_t *) ctx; SRMAccessResponse_t rsps; if (!ctx || !clientResponse || !clientResponse->payload|| (PAYLOAD_TYPE_SECURITY != clientResponse->payload->type) || (clientResponse->result != OC_STACK_OK)) { SRMSendResponse(ACCESS_DENIED_AMS_SERVICE_ERROR); goto exit; } if (context->state != AWAITING_AMS_RESPONSE) { OC_LOG_V(ERROR, TAG, "%s Invalid State ", __func__); context->retVal = ACCESS_DENIED_AMS_SERVICE_ERROR; SRMSendResponse(context->retVal); return OC_STACK_DELETE_TRANSACTION; } // Verify before installing ACL if the ID of the sender of this ACL is an AMS //service that this device trusts. rsps = ACCESS_DENIED; if((UUID_LENGTH == clientResponse->identity.id_length) && memcmp(context->amsMgrContext->amsDeviceId.id, clientResponse->identity.id, sizeof(context->amsMgrContext->amsDeviceId.id)) == 0) { OCStackResult ret = InstallNewACL(((OCSecurityPayload*)clientResponse->payload)->securityData); VERIFY_SUCCESS(TAG, OC_STACK_OK == ret, ERROR); OC_LOG_V(INFO, TAG, "%s : Calling checkPermission", __func__); rsps = CheckPermission(context, &context->subject, context->resource, context->permission); VERIFY_SUCCESS(TAG, (true == IsAccessGranted(rsps)), ERROR); OC_LOG_V(INFO, TAG, "%sAccess granted, Calling SRMCallCARequestHandler", __func__); context->retVal = ACCESS_GRANTED; SRMSendResponse(context->retVal); return OC_STACK_DELETE_TRANSACTION; } exit: context->retVal = ACCESS_DENIED_AMS_SERVICE_ERROR; SRMSendResponse(context->retVal); FreeCARequestInfo(context->amsMgrContext->requestInfo); OICFree(context->amsMgrContext->endpoint); return OC_STACK_DELETE_TRANSACTION; }