reformulated recommendation policies
This commit is contained in:
@@ -31,6 +31,11 @@ struct recommendation_entry_t {
|
|||||||
*/
|
*/
|
||||||
TNC_IMVID id;
|
TNC_IMVID id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Received a recommendation message from this IMV?
|
||||||
|
*/
|
||||||
|
bool have_recommendation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Action Recommendation provided by IMV instance
|
* Action Recommendation provided by IMV instance
|
||||||
*/
|
*/
|
||||||
@@ -76,6 +81,7 @@ METHOD(recommendations_t, provide_recommendation, TNC_Result,
|
|||||||
if (entry->id == id)
|
if (entry->id == id)
|
||||||
{
|
{
|
||||||
found = TRUE;
|
found = TRUE;
|
||||||
|
entry->have_recommendation = TRUE;
|
||||||
entry->rec = rec;
|
entry->rec = rec;
|
||||||
entry->eval = eval;
|
entry->eval = eval;
|
||||||
break;
|
break;
|
||||||
@@ -109,8 +115,7 @@ METHOD(recommendations_t, have_recommendation, bool,
|
|||||||
enumerator = this->recs->create_enumerator(this->recs);
|
enumerator = this->recs->create_enumerator(this->recs);
|
||||||
while (enumerator->enumerate(enumerator, &entry))
|
while (enumerator->enumerate(enumerator, &entry))
|
||||||
{
|
{
|
||||||
if (entry->rec == TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION ||
|
if (!entry->have_recommendation)
|
||||||
entry->eval == TNC_IMV_EVALUATION_RESULT_DONT_KNOW)
|
|
||||||
{
|
{
|
||||||
incomplete = TRUE;
|
incomplete = TRUE;
|
||||||
break;
|
break;
|
||||||
@@ -120,94 +125,118 @@ METHOD(recommendations_t, have_recommendation, bool,
|
|||||||
final_rec = entry->rec;
|
final_rec = entry->rec;
|
||||||
final_eval = entry->eval;
|
final_eval = entry->eval;
|
||||||
first = FALSE;
|
first = FALSE;
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
switch (policy)
|
switch (policy)
|
||||||
{
|
{
|
||||||
case RECOMMENDATION_POLICY_DEFAULT:
|
case RECOMMENDATION_POLICY_DEFAULT:
|
||||||
/* Consolidate action recommendations */
|
switch (entry->rec)
|
||||||
if (entry->rec == TNC_IMV_ACTION_RECOMMENDATION_NO_ACCESS)
|
|
||||||
{
|
{
|
||||||
final_rec = TNC_IMV_ACTION_RECOMMENDATION_NO_ACCESS;
|
case TNC_IMV_ACTION_RECOMMENDATION_NO_ACCESS:
|
||||||
|
final_rec = entry->rec;
|
||||||
|
break;
|
||||||
|
case TNC_IMV_ACTION_RECOMMENDATION_ISOLATE:
|
||||||
|
if (final_rec != TNC_IMV_ACTION_RECOMMENDATION_NO_ACCESS)
|
||||||
|
{
|
||||||
|
final_rec = entry->rec;
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case TNC_IMV_ACTION_RECOMMENDATION_ALLOW:
|
||||||
|
if (final_rec == TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION)
|
||||||
|
{
|
||||||
|
final_rec = entry->rec;
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (entry->rec == TNC_IMV_ACTION_RECOMMENDATION_ISOLATE &&
|
switch (entry->eval)
|
||||||
final_rec != TNC_IMV_ACTION_RECOMMENDATION_NO_ACCESS)
|
|
||||||
{
|
{
|
||||||
final_rec = TNC_IMV_ACTION_RECOMMENDATION_ISOLATE;
|
case TNC_IMV_EVALUATION_RESULT_ERROR:
|
||||||
}
|
final_eval = entry->eval;
|
||||||
else
|
break;
|
||||||
{
|
case TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR:
|
||||||
final_rec = TNC_IMV_ACTION_RECOMMENDATION_ALLOW;
|
if (final_eval != TNC_IMV_EVALUATION_RESULT_ERROR)
|
||||||
}
|
{
|
||||||
|
final_eval = entry->eval;
|
||||||
/* Consolidate evaluation results */
|
}
|
||||||
if (entry->eval == TNC_IMV_EVALUATION_RESULT_ERROR)
|
break;
|
||||||
{
|
case TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR:
|
||||||
final_eval = TNC_IMV_EVALUATION_RESULT_ERROR;
|
if (final_eval != TNC_IMV_EVALUATION_RESULT_ERROR &&
|
||||||
}
|
final_eval != TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR)
|
||||||
else if (entry->eval == TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR &&
|
{
|
||||||
final_eval != TNC_IMV_EVALUATION_RESULT_ERROR)
|
final_eval = entry->eval;
|
||||||
{
|
}
|
||||||
final_eval = TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR;
|
break;
|
||||||
}
|
case TNC_IMV_EVALUATION_RESULT_COMPLIANT:
|
||||||
else if (entry->eval == TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR &&
|
if (final_eval == TNC_IMV_EVALUATION_RESULT_DONT_KNOW)
|
||||||
final_eval != TNC_IMV_EVALUATION_RESULT_ERROR &&
|
{
|
||||||
final_eval != TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR)
|
final_eval = entry->eval;
|
||||||
{
|
}
|
||||||
final_eval = TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR;
|
break;
|
||||||
}
|
case TNC_IMV_EVALUATION_RESULT_DONT_KNOW:
|
||||||
else if (entry->eval == TNC_IMV_EVALUATION_RESULT_COMPLIANT)
|
break;
|
||||||
{
|
|
||||||
final_eval = TNC_IMV_EVALUATION_RESULT_COMPLIANT;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case RECOMMENDATION_POLICY_ALL:
|
case RECOMMENDATION_POLICY_ALL:
|
||||||
/* Consolidate action recommendations */
|
|
||||||
if (entry->rec != final_rec)
|
if (entry->rec != final_rec)
|
||||||
{
|
{
|
||||||
final_rec = TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION;
|
final_rec = TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Consolidate evaluation results */
|
|
||||||
if (entry->eval != final_eval)
|
if (entry->eval != final_eval)
|
||||||
{
|
{
|
||||||
final_eval = TNC_IMV_EVALUATION_RESULT_DONT_KNOW;
|
final_eval = TNC_IMV_EVALUATION_RESULT_DONT_KNOW;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case RECOMMENDATION_POLICY_ANY:
|
|
||||||
/* Consolidate action recommendations */
|
|
||||||
if (entry->rec == TNC_IMV_ACTION_RECOMMENDATION_ALLOW)
|
|
||||||
{
|
|
||||||
final_rec = TNC_IMV_ACTION_RECOMMENDATION_ALLOW;
|
|
||||||
}
|
|
||||||
else if (entry->rec == TNC_IMV_ACTION_RECOMMENDATION_ISOLATE &&
|
|
||||||
final_rec != TNC_IMV_ACTION_RECOMMENDATION_ALLOW)
|
|
||||||
{
|
|
||||||
final_rec = TNC_IMV_ACTION_RECOMMENDATION_ISOLATE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
final_rec = TNC_IMV_ACTION_RECOMMENDATION_NO_ACCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Consolidate evaluation results */
|
case RECOMMENDATION_POLICY_ANY:
|
||||||
if (entry->eval == TNC_IMV_EVALUATION_RESULT_COMPLIANT)
|
switch (entry->rec)
|
||||||
{
|
{
|
||||||
final_eval = TNC_IMV_EVALUATION_RESULT_COMPLIANT;
|
case TNC_IMV_ACTION_RECOMMENDATION_ALLOW:
|
||||||
|
final_rec = entry->rec;
|
||||||
|
break;
|
||||||
|
case TNC_IMV_ACTION_RECOMMENDATION_ISOLATE:
|
||||||
|
if (final_rec != TNC_IMV_ACTION_RECOMMENDATION_ALLOW)
|
||||||
|
{
|
||||||
|
final_rec = entry->rec;
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case TNC_IMV_ACTION_RECOMMENDATION_NO_ACCESS:
|
||||||
|
if (final_rec == TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION)
|
||||||
|
{
|
||||||
|
final_rec = entry->rec;
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (entry->eval == TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR &&
|
switch (entry->eval)
|
||||||
final_eval != TNC_IMV_EVALUATION_RESULT_COMPLIANT)
|
|
||||||
{
|
{
|
||||||
final_eval = TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR;
|
case TNC_IMV_EVALUATION_RESULT_COMPLIANT:
|
||||||
}
|
final_eval = entry->eval;
|
||||||
else if (entry->eval == TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR &&
|
break;
|
||||||
final_eval != TNC_IMV_EVALUATION_RESULT_COMPLIANT &&
|
case TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR:
|
||||||
final_eval != TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR)
|
if (final_eval != TNC_IMV_EVALUATION_RESULT_COMPLIANT)
|
||||||
{
|
{
|
||||||
final_eval = TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR;
|
final_eval = entry->eval;
|
||||||
}
|
}
|
||||||
else if (entry->eval == TNC_IMV_EVALUATION_RESULT_ERROR)
|
break;
|
||||||
{
|
case TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR:
|
||||||
final_eval = TNC_IMV_EVALUATION_RESULT_ERROR;
|
if (final_eval != TNC_IMV_EVALUATION_RESULT_COMPLIANT &&
|
||||||
|
final_eval != TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR)
|
||||||
|
{
|
||||||
|
final_eval = entry->eval;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TNC_IMV_EVALUATION_RESULT_ERROR:
|
||||||
|
if (final_eval == TNC_IMV_EVALUATION_RESULT_DONT_KNOW)
|
||||||
|
{
|
||||||
|
final_eval = entry->eval;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TNC_IMV_EVALUATION_RESULT_DONT_KNOW:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -254,6 +283,7 @@ recommendations_t* tnc_imv_recommendations_create(linked_list_t *imv_list)
|
|||||||
{
|
{
|
||||||
entry = malloc_thing(recommendation_entry_t);
|
entry = malloc_thing(recommendation_entry_t);
|
||||||
entry->id = imv->get_id(imv);
|
entry->id = imv->get_id(imv);
|
||||||
|
entry->have_recommendation = FALSE;
|
||||||
entry->rec = TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION;
|
entry->rec = TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION;
|
||||||
entry->eval = TNC_IMV_EVALUATION_RESULT_DONT_KNOW;
|
entry->eval = TNC_IMV_EVALUATION_RESULT_DONT_KNOW;
|
||||||
this->recs->insert_last(this->recs, entry);
|
this->recs->insert_last(this->recs, entry);
|
||||||
|
|||||||
Reference in New Issue
Block a user