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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}