static bool ValidateQuery(unsigned char * query) { // Send doxm resource data if the state of doxm resource // matches with the query parameters. // else send doxm resource data as NULL // TODO Remove this check and rely on Policy Engine // and Provisioning Mode to enforce provisioning-state // access rules. Eventually, the PE and PM code will // not send a request to the /doxm Entity Handler at all // if it should not respond. OC_LOG (INFO, TAG, PCF("In ValidateQuery")); if(NULL == gDoxm) { return false; } OicParseQueryIter_t parseIter = {0}; ParseQueryIterInit(query, &parseIter); while(GetNextQuery(&parseIter)) { if(strncasecmp((char *)parseIter.attrPos, OIC_JSON_OWNED_NAME, parseIter.attrLen) == 0) { if((strncasecmp((char *)parseIter.valPos, OIC_SEC_TRUE, parseIter.valLen) == 0) && (gDoxm->owned)) { return true; } else if((strncasecmp((char *)parseIter.valPos, OIC_SEC_FALSE, parseIter.valLen) == 0) && (!gDoxm->owned)) { return true; } } } return false; }
static bool ValidateQuery(const char * query) { // Send doxm resource data if the state of doxm resource // matches with the query parameters. // else send doxm resource data as NULL // TODO Remove this check and rely on Policy Engine // and Provisioning Mode to enforce provisioning-state // access rules. Eventually, the PE and PM code will // not send a request to the /doxm Entity Handler at all // if it should not respond. OIC_LOG (DEBUG, TAG, "In ValidateQuery"); if(NULL == gDoxm) { return false; } bool bOwnedQry = false; // does querystring contains 'owned' query ? bool bOwnedMatch = false; // does 'owned' query value matches with doxm.owned status? bool bDeviceIDQry = false; // does querystring contains 'deviceid' query ? bool bDeviceIDMatch = false; // does 'deviceid' query matches with doxm.deviceid ? OicParseQueryIter_t parseIter = {.attrPos = NULL}; ParseQueryIterInit((unsigned char*)query, &parseIter); while(GetNextQuery(&parseIter)) { if(strncasecmp((char *)parseIter.attrPos, OIC_JSON_OWNED_NAME, parseIter.attrLen) == 0) { bOwnedQry = true; if((strncasecmp((char *)parseIter.valPos, OIC_SEC_TRUE, parseIter.valLen) == 0) && (gDoxm->owned)) { bOwnedMatch = true; } else if((strncasecmp((char *)parseIter.valPos, OIC_SEC_FALSE, parseIter.valLen) == 0) && (!gDoxm->owned)) { bOwnedMatch = true; } } if(strncasecmp((char *)parseIter.attrPos, OIC_JSON_DEVICE_ID_NAME, parseIter.attrLen) == 0) { bDeviceIDQry = true; OicUuid_t subject = {.id={0}}; unsigned char base64Buff[sizeof(((OicUuid_t*)0)->id)] = {}; uint32_t outLen = 0; B64Result b64Ret = B64_OK; b64Ret = b64Decode((char *)parseIter.valPos, parseIter.valLen, base64Buff, sizeof(base64Buff), &outLen); VERIFY_SUCCESS(TAG, (B64_OK == b64Ret && outLen <= sizeof(subject.id)), ERROR); memcpy(subject.id, base64Buff, outLen); if(0 == memcmp(&gDoxm->deviceID.id, &subject.id, sizeof(gDoxm->deviceID.id))) { bDeviceIDMatch = true; } } }
void CCallback::ProcessCallbacks() { CMySQLQuery *Query = NULL; while( (Query = GetNextQuery()) != NULL) { CCallback *Callback = Query->Callback; if(Callback != NULL && (Callback->Name.length() > 0 || Query->OrmObject != NULL) ) { bool PassByReference = Query->Callback->IsInline; if(Query->OrmObject != NULL) { //orm, update the variables with the given result switch(Query->OrmQueryType) { case ORM_QUERYTYPE_SELECT: Query->OrmObject->ApplySelectResult(Query->Result); break; case ORM_QUERYTYPE_INSERT: Query->OrmObject->ApplyInsertResult(Query->Result); break; } } for (list<AMX *>::iterator a = m_AmxList.begin(), end = m_AmxList.end(); a != end; ++a) { AMX *amx = (*a); cell amx_Ret; int amx_Index; cell amx_MemoryAddress = -1; if (amx_FindPublic(amx, Callback->Name.c_str(), &amx_Index) == AMX_ERR_NONE) { CLog::Get()->StartCallback(Callback->Name.c_str()); int StringIndex = Callback->ParamFormat.length()-1; while(!Callback->Parameters.empty() && StringIndex >= 0) { switch(Callback->ParamFormat.at(StringIndex)) { case 'i': case 'd': { int val = 0; ConvertStrToInt(Callback->Parameters.top().c_str(), val); if(PassByReference == false) amx_Push(amx, (cell)val); else { cell tmpAddress; amx_PushArray(amx, &tmpAddress, NULL, (cell*)&val, 1); if(amx_MemoryAddress < NULL) amx_MemoryAddress = tmpAddress; } } break; case 'f': { float float_val = 0.0f; ConvertStrToFloat(Callback->Parameters.top().c_str(), float_val); cell FParam = amx_ftoc(float_val); if(PassByReference == false) amx_Push(amx, FParam); else { cell tmpAddress; amx_PushArray(amx, &tmpAddress, NULL, (cell*)&FParam, 1); if(amx_MemoryAddress < NULL) amx_MemoryAddress = tmpAddress; } } break; default: { cell tmpAddress; amx_PushString(amx, &tmpAddress, NULL, Callback->Parameters.top().c_str(), 0, 0); if(amx_MemoryAddress < NULL) amx_MemoryAddress = tmpAddress; } } StringIndex--; Callback->Parameters.pop(); } Query->ConnHandle->SetActiveResult(Query->Result); Query->Result = NULL; amx_Exec(amx, &amx_Ret, amx_Index); if (amx_MemoryAddress >= NULL) amx_Release(amx, amx_MemoryAddress); if(Query->ConnHandle->IsActiveResultSaved() == false) delete Query->ConnHandle->GetActiveResult(); Query->ConnHandle->SetActiveResult((CMySQLResult *)NULL); CLog::Get()->EndCallback(); break; //we have found our callback, exit loop } } } Query->Destroy(); } }