ConditionResponse Condition::evaluateFeatures(Request* req){ LOGD("[COND EVALUATE FEAT] 1 : %d",resource_attrs.size()); map<string,vector<match_info_str*> >::iterator it; vector<match_info_str*> my_features = (it = resource_attrs.find(API_FEATURE))!=resource_attrs.end() ? it->second : vector<match_info_str*>(); map<string, vector<string>* > requestResource_attrs = req->getResourceAttrs(); map<string, vector<string>* >::iterator rraIT = requestResource_attrs.find(API_FEATURE); vector<string>* req_features = (rraIT != requestResource_attrs.end()) ? rraIT->second : NULL; bool found; bool anyUndetermined = resource_attrs.find(API_FEATURE)!= resource_attrs.end() && requestResource_attrs.find(API_FEATURE) == requestResource_attrs.end(); if(combine == AND){ // find any No Match for(unsigned int j=0; req_features && j<my_features.size(); j++){ found = false; for(unsigned int i=0; i<req_features->size(); i++){ string mod_function = my_features[j]->mod_func; string s = (mod_function != "") ? modFunction(mod_function, req_features->at(i)) : req_features->at(i); if(equals(s,my_features[j]->value, string2strcmp_mode(my_features[j]->equal_func))) { found = true; break; } } if (found == false) return NO_MATCH; } if (anyUndetermined) return NOT_DETERMINED; else return MATCH; } else if(combine == OR){ // find any Match for(unsigned int j=0; req_features && j<my_features.size(); j++){ for(unsigned int i=0; i<req_features->size(); i++){ string mod_function = my_features[j]->mod_func; string s = (mod_function != "") ? modFunction(mod_function, req_features->at(i)) : req_features->at(i); if(equals(s,my_features[j]->value, string2strcmp_mode(my_features[j]->equal_func))) return MATCH; } } if (anyUndetermined) return NOT_DETERMINED; else return NO_MATCH; } // TODO: is that right? What should happen if policy is invalid? return NOT_DETERMINED; }
bool Subject::match(Request* req){ bool foundInBag = false; for(map<string,vector<match_info_str*> >::iterator it_policy=info.begin(); it_policy != info.end(); it_policy++){ // For Debug LOGD("[Subject] cerco in %s ",it_policy->first.data()); for(map<string,vector<string>* >::iterator it=req->getSubjectAttrs().begin(); it != req->getSubjectAttrs().end(); it++) LOGD("[Subject] req %s",it->first.data()); if(req->getSubjectAttrs().find(it_policy->first) != req->getSubjectAttrs().end()){ vector<string>* req_vet = req->getSubjectAttrs()[it_policy->first]; vector<match_info_str*> info_vet = it_policy->second; for(unsigned int j=0;j<info_vet.size(); j++){ //iteration on all policy's elements foundInBag = false; for(unsigned int i=0; !foundInBag && i<req_vet->size(); i++){ //iteration on request's elements. string mod_function = info_vet[j]->mod_func; LOGD("Subject.match() - mod_function=%s - req_vet=%s", mod_function.data(), req_vet->at(i).data()); string s = (mod_function != "") ? modFunction(mod_function, req_vet->at(i)) : req_vet->at(i); LOGD("[Subject] Confronto %s con %s ",s.data(),info_vet[j]->value.data()); if(equals(s, info_vet[j]->value, string2strcmp_mode(info_vet[j]->equal_func))){ foundInBag = true; LOGD("[Subject] Found subject-match for %s ",s.data()); } } if(!foundInBag) return false; } } else return false; } return true; }
ConditionResponse Condition::evaluateCapabilities(Request* req){ LOGD("condition: device-cap size %d",req->getResourceAttrs()["device-cap"]->size()); vector<match_info_str*> my_capabilities_params; vector<string>* req_capabilities_params = new vector<string>(); map<string, vector<string>* > requestResource_attrs = req->getResourceAttrs(); bool anyUndetermined = false; bool found; for(map<string, vector<match_info_str*> >::iterator it = resource_attrs.begin(); it!= resource_attrs.end(); it++) { if (it->first != API_FEATURE) { if(requestResource_attrs.find(it->first) == requestResource_attrs.end()) { LOGD("Capabilities %s undetermined ",it->first.data()); anyUndetermined = true; } else { LOGD("Capabilities %s determined ",it->first.data()); my_capabilities_params.insert(my_capabilities_params.end(), it->second.begin(), it->second.end()); } } } LOGD("[ANY CAP] %d", anyUndetermined); for(map<string, vector<string>* >::iterator itr = requestResource_attrs.begin(); itr!= requestResource_attrs.end(); itr++) { if (itr->first != API_FEATURE) { // LOGD("REQ Capabilities %s", itr->first.data()); // LOGD("REQ Capabilities size %d", itr->second->size()); req_capabilities_params->insert(req_capabilities_params->end(), itr->second->begin(), itr->second->end()); } } if(combine == AND){ // find any No Match LOGD("my_capabilities_params.size() %d",my_capabilities_params.size()); for(unsigned int j=0; j<my_capabilities_params.size(); j++){ found = false; LOGD("req_capabilities_params->size() %d",req_capabilities_params->size()); for(unsigned int i=0; i<req_capabilities_params->size(); i++){ string mod_function = my_capabilities_params[j]->mod_func; string s = (mod_function != "") ? modFunction(mod_function, req_capabilities_params->at(i)) : req_capabilities_params->at(i); LOGD("Confronto %s con %s",s.data(),my_capabilities_params[j]->value.data()); if(equals(s.data(),my_capabilities_params[j]->value.data(), string2strcmp_mode(my_capabilities_params[j]->equal_func))) // if(equals(req_capabilities_params->at(i).data(),my_capabilities_params[j]->value.data(), string2strcmp_mode(my_capabilities_params[j]->equal_func))) { LOGD("UGUALI"); found = true; break; } else LOGD("DIVERSI"); } if (found == false) return NO_MATCH; } if (anyUndetermined) return NOT_DETERMINED; else return MATCH; } else if(combine == OR){ // find any Match for(unsigned int j=0; j<my_capabilities_params.size(); j++){ for(unsigned int i=0; i<req_capabilities_params->size(); i++){ string mod_function = my_capabilities_params[j]->mod_func; string s = (mod_function != "") ? modFunction(mod_function, req_capabilities_params->at(i)) : req_capabilities_params->at(i); LOGD("Compare %s with %s",s.data(),my_capabilities_params[j]->value.data()); // LOGD("Compare %s with %s",req_capabilities_params->at(i).data(),my_capabilities_params[j]->value.data()); if(equals(s.data(),my_capabilities_params[j]->value.data(), string2strcmp_mode(my_capabilities_params[j]->equal_func))){ // if(equals(req_capabilities_params->at(i),my_capabilities_params[j]->value, string2strcmp_mode(my_capabilities_params[j]->equal_func))) return MATCH; } } } if (anyUndetermined) return NOT_DETERMINED; else return NO_MATCH; } // TODO: is that right? What should happen if policy invalid? return NOT_DETERMINED; }