refactored IMV policy management
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
#include "imv_os_state.h"
|
||||
#include "imv_os_database.h"
|
||||
|
||||
#include <imcv.h>
|
||||
#include <imv/imv_agent.h>
|
||||
#include <imv/imv_msg.h>
|
||||
#include <ietf/ietf_attr.h>
|
||||
@@ -106,7 +107,7 @@ TNC_Result TNC_IMV_Initialize(TNC_IMVID imv_id,
|
||||
}
|
||||
|
||||
/* attach OS database co-located with IMV database */
|
||||
os_db = imv_os_database_create(imv_os->get_database(imv_os));
|
||||
os_db = imv_os_database_create(imcv_db);
|
||||
|
||||
return TNC_RESULT_SUCCESS;
|
||||
}
|
||||
@@ -119,8 +120,7 @@ TNC_Result TNC_IMV_NotifyConnectionChange(TNC_IMVID imv_id,
|
||||
TNC_ConnectionState new_state)
|
||||
{
|
||||
imv_state_t *state;
|
||||
imv_database_t *imv_db;
|
||||
int session_id;
|
||||
imv_session_t *session;
|
||||
|
||||
if (!imv_os)
|
||||
{
|
||||
@@ -133,11 +133,10 @@ TNC_Result TNC_IMV_NotifyConnectionChange(TNC_IMVID imv_id,
|
||||
state = imv_os_state_create(connection_id);
|
||||
return imv_os->create_state(imv_os, state);
|
||||
case TNC_CONNECTION_STATE_DELETE:
|
||||
imv_db = imv_os->get_database(imv_os);
|
||||
if (imv_db && imv_os->get_state(imv_os, connection_id, &state))
|
||||
if (imcv_db && imv_os->get_state(imv_os, connection_id, &state))
|
||||
{
|
||||
session_id = state->get_session_id(state);
|
||||
imv_db->policy_script(imv_db, session_id, FALSE);
|
||||
session = state->get_session(state);
|
||||
imcv_db->policy_script(imcv_db, session, FALSE);
|
||||
}
|
||||
return imv_os->delete_state(imv_os, connection_id);
|
||||
default:
|
||||
@@ -345,8 +344,8 @@ static TNC_Result receive_message(imv_state_t *state, imv_msg_t *in_msg)
|
||||
}
|
||||
case ITA_ATTR_DEVICE_ID:
|
||||
{
|
||||
imv_database_t *imv_db;
|
||||
int session_id, device_id;
|
||||
imv_session_t *session;
|
||||
int device_id;
|
||||
chunk_t value;
|
||||
|
||||
os_state->set_received(os_state, IMV_OS_ATTR_DEVICE_ID);
|
||||
@@ -354,11 +353,10 @@ static TNC_Result receive_message(imv_state_t *state, imv_msg_t *in_msg)
|
||||
value = attr->get_value(attr);
|
||||
DBG1(DBG_IMV, "device ID is %.*s", value.len, value.ptr);
|
||||
|
||||
imv_db = imv_os->get_database(imv_os);
|
||||
if (imv_db)
|
||||
if (imcv_db)
|
||||
{
|
||||
session_id = state->get_session_id(state);
|
||||
device_id = imv_db->add_device(imv_db, session_id, value);
|
||||
session = state->get_session(state);
|
||||
device_id = imcv_db->add_device(imcv_db, session, value);
|
||||
os_state->set_device_id(os_state, device_id);
|
||||
}
|
||||
break;
|
||||
@@ -383,16 +381,14 @@ static TNC_Result receive_message(imv_state_t *state, imv_msg_t *in_msg)
|
||||
if (os_name.len && os_version.len)
|
||||
{
|
||||
os_type_t os_type;
|
||||
imv_database_t *imv_db;
|
||||
|
||||
/* set the OS type, name and version */
|
||||
os_type = os_type_from_name(os_name);
|
||||
os_state->set_info(os_state,os_type, os_name, os_version);
|
||||
|
||||
imv_db = imv_os->get_database(imv_os);
|
||||
if (imv_db)
|
||||
if (imcv_db)
|
||||
{
|
||||
imv_db->add_product(imv_db, state->get_session_id(state),
|
||||
imcv_db->add_product(imcv_db, state->get_session(state),
|
||||
os_state->get_info(os_state, NULL, NULL, NULL));
|
||||
}
|
||||
}
|
||||
@@ -553,29 +549,24 @@ static pa_tnc_attr_t* build_attr_request(u_int received)
|
||||
/**
|
||||
* see section 3.8.8 of TCG TNC IF-IMV Specification 1.3
|
||||
*/
|
||||
TNC_Result TNC_IMV_BatchEnding(TNC_IMVID imv_id,
|
||||
TNC_ConnectionID connection_id)
|
||||
TNC_Result TNC_IMV_BatchEnding(TNC_IMVID imv_id, TNC_ConnectionID connection_id)
|
||||
{
|
||||
imv_msg_t *out_msg;
|
||||
imv_state_t *state;
|
||||
imv_database_t *imv_db;
|
||||
imv_workitem_t *workitem;
|
||||
imv_os_state_t *os_state;
|
||||
imv_os_handshake_state_t handshake_state;
|
||||
pa_tnc_attr_t *attr;
|
||||
TNC_Result result = TNC_RESULT_SUCCESS;
|
||||
enumerator_t *enumerator;
|
||||
imv_session_t *session;
|
||||
u_int received;
|
||||
char *result_str;
|
||||
bool fail;
|
||||
|
||||
if (!imv_os)
|
||||
{
|
||||
DBG1(DBG_IMV, "IMV \"%s\" has not been initialized", imv_name);
|
||||
return TNC_RESULT_NOT_INITIALIZED;
|
||||
}
|
||||
imv_db = imv_os->get_database(imv_os);
|
||||
|
||||
if (!imv_os->get_state(imv_os, connection_id, &state))
|
||||
{
|
||||
return TNC_RESULT_FATAL;
|
||||
@@ -583,6 +574,7 @@ TNC_Result TNC_IMV_BatchEnding(TNC_IMVID imv_id,
|
||||
os_state = (imv_os_state_t*)state;
|
||||
handshake_state = os_state->get_handshake_state(os_state);
|
||||
received = os_state->get_received(os_state);
|
||||
session = state->get_session(state);
|
||||
|
||||
/* create an empty out message - we might need it */
|
||||
out_msg = imv_msg_create(imv_os, state, connection_id, imv_id,
|
||||
@@ -604,10 +596,10 @@ TNC_Result TNC_IMV_BatchEnding(TNC_IMVID imv_id,
|
||||
((received & IMV_OS_ATTR_DEVICE_ID) ||
|
||||
(handshake_state == IMV_OS_STATE_ATTR_REQ)))
|
||||
{
|
||||
if (imv_db)
|
||||
if (imcv_db)
|
||||
{
|
||||
/* trigger the policy manager */
|
||||
imv_db->policy_script(imv_db, state->get_session_id(state), TRUE);
|
||||
imcv_db->policy_script(imcv_db, session, TRUE);
|
||||
}
|
||||
handshake_state = IMV_OS_STATE_POLICY_START;
|
||||
}
|
||||
@@ -638,138 +630,132 @@ TNC_Result TNC_IMV_BatchEnding(TNC_IMVID imv_id,
|
||||
os_state->set_handshake_state(os_state, handshake_state);
|
||||
}
|
||||
|
||||
if (handshake_state == IMV_OS_STATE_POLICY_START)
|
||||
if (handshake_state == IMV_OS_STATE_POLICY_START && session)
|
||||
{
|
||||
if (imv_db)
|
||||
enumerator = session->create_workitem_enumerator(session);
|
||||
if (enumerator)
|
||||
{
|
||||
enumerator = imv_db->create_workitem_enumerator(imv_db,
|
||||
state->get_session_id(state));
|
||||
if (!enumerator)
|
||||
{
|
||||
return TNC_RESULT_SUCCESS;
|
||||
}
|
||||
while (enumerator->enumerate(enumerator, &workitem))
|
||||
{
|
||||
if (workitem->get_imv_id(workitem) != 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
switch (workitem->get_type(workitem))
|
||||
{
|
||||
case IMV_WORKITEM_PACKAGES:
|
||||
attr = ietf_attr_attr_request_create(PEN_IETF,
|
||||
IETF_ATTR_INSTALLED_PACKAGES);
|
||||
out_msg->add_attribute(out_msg, attr);
|
||||
state->add_workitem(state, workitem);
|
||||
break;
|
||||
case IMV_WORKITEM_UNKNOWN_SOURCE:
|
||||
attr = ita_attr_get_settings_create(non_market_apps_str);
|
||||
out_msg->add_attribute(out_msg, attr);
|
||||
state->add_workitem(state, workitem);
|
||||
break;
|
||||
case IMV_WORKITEM_FORWARDING:
|
||||
case IMV_WORKITEM_DEFAULT_PWD:
|
||||
state->add_workitem(state, workitem);
|
||||
break;
|
||||
case IMV_WORKITEM_START:
|
||||
handshake_state = IMV_OS_STATE_WORKITEMS;
|
||||
/* fall through to default */
|
||||
default:
|
||||
workitem->destroy(workitem);
|
||||
continue;
|
||||
}
|
||||
workitem->set_imv_id(workitem, imv_id);
|
||||
}
|
||||
enumerator->destroy(enumerator);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO: define workitems without DB access */
|
||||
|
||||
handshake_state = IMV_OS_STATE_WORKITEMS;
|
||||
os_state->set_handshake_state(os_state, handshake_state);
|
||||
}
|
||||
os_state->set_handshake_state(os_state, handshake_state);
|
||||
}
|
||||
|
||||
if (handshake_state == IMV_OS_STATE_WORKITEMS)
|
||||
if (handshake_state == IMV_OS_STATE_WORKITEMS && session)
|
||||
{
|
||||
enumerator = state->create_workitem_enumerator(state);
|
||||
TNC_IMV_Evaluation_Result eval;
|
||||
TNC_IMV_Action_Recommendation rec;
|
||||
char buf[BUF_LEN], *result_str;
|
||||
bool fail;
|
||||
|
||||
enumerator = session->create_workitem_enumerator(session);
|
||||
while (enumerator->enumerate(enumerator, &workitem))
|
||||
{
|
||||
if (workitem->get_imv_id(workitem) != imv_id)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
eval = TNC_IMV_EVALUATION_RESULT_DONT_KNOW;
|
||||
|
||||
switch (workitem->get_type(workitem))
|
||||
{
|
||||
case IMV_WORKITEM_PACKAGES:
|
||||
{
|
||||
int count, count_update, count_blacklist, count_ok, ret;
|
||||
int count, count_update, count_blacklist, count_ok;
|
||||
|
||||
if (!(received & IMV_OS_ATTR_INSTALLED_PACKAGES) ||
|
||||
os_state->get_angel_count(os_state))
|
||||
{
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
os_state->get_count(os_state, &count, &count_update,
|
||||
&count_blacklist, &count_ok);
|
||||
fail = count_update || count_blacklist;
|
||||
ret = asprintf(&result_str, "processed %d packages: "
|
||||
eval = fail ? TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR :
|
||||
TNC_IMV_EVALUATION_RESULT_COMPLIANT;
|
||||
snprintf(buf, BUF_LEN, "processed %d packages: "
|
||||
"%d not updated, %d blacklisted, %d ok, "
|
||||
"%d not found",
|
||||
count, count_update, count_blacklist, count_ok,
|
||||
count - count_update - count_blacklist - count_ok);
|
||||
if (ret == -1)
|
||||
{
|
||||
result_str = strdup("");
|
||||
}
|
||||
|
||||
state->finalize_workitem(state, enumerator, workitem,
|
||||
result_str, fail ?
|
||||
TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR :
|
||||
TNC_IMV_EVALUATION_RESULT_COMPLIANT);
|
||||
free(result_str);
|
||||
result_str = buf;
|
||||
break;
|
||||
}
|
||||
case IMV_WORKITEM_UNKNOWN_SOURCE:
|
||||
if (!(received & IMV_OS_ATTR_SETTINGS))
|
||||
{
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
fail = os_state->get_os_settings(os_state) &
|
||||
OS_SETTINGS_UNKNOWN_SOURCE;
|
||||
eval = fail ? TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR :
|
||||
TNC_IMV_EVALUATION_RESULT_COMPLIANT;
|
||||
result_str = fail ? "unknown sources enabled" : "";
|
||||
|
||||
state->finalize_workitem(state, enumerator, workitem,
|
||||
result_str, fail ?
|
||||
TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR :
|
||||
TNC_IMV_EVALUATION_RESULT_COMPLIANT);
|
||||
break;
|
||||
case IMV_WORKITEM_FORWARDING:
|
||||
if (!(received & IMV_OS_ATTR_FORWARDING_ENABLED))
|
||||
{
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
fail = os_state->get_os_settings(os_state) &
|
||||
OS_SETTINGS_FWD_ENABLED;
|
||||
eval = fail ? TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR :
|
||||
TNC_IMV_EVALUATION_RESULT_COMPLIANT;
|
||||
result_str = fail ? "forwarding enabled" : "";
|
||||
|
||||
state->finalize_workitem(state, enumerator, workitem,
|
||||
result_str, fail ?
|
||||
TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR :
|
||||
TNC_IMV_EVALUATION_RESULT_COMPLIANT);
|
||||
break;
|
||||
case IMV_WORKITEM_DEFAULT_PWD:
|
||||
if (!(received & IMV_OS_ATTR_FACTORY_DEFAULT_PWD_ENABLED))
|
||||
{
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
fail = os_state->get_os_settings(os_state) &
|
||||
OS_SETTINGS_DEFAULT_PWD_ENABLED;
|
||||
eval = fail ? TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR :
|
||||
TNC_IMV_EVALUATION_RESULT_COMPLIANT;
|
||||
result_str = fail ? "default password enabled" : "";
|
||||
|
||||
state->finalize_workitem(state, enumerator, workitem,
|
||||
result_str, fail ?
|
||||
TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR :
|
||||
TNC_IMV_EVALUATION_RESULT_COMPLIANT);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
if (eval != TNC_IMV_EVALUATION_RESULT_DONT_KNOW)
|
||||
{
|
||||
session->remove_workitem(session, enumerator);
|
||||
rec = workitem->set_result(workitem, result_str, eval);
|
||||
state->update_recommendation(state, rec, eval);
|
||||
imcv_db->finalize_workitem(imcv_db, workitem);
|
||||
workitem->destroy(workitem);
|
||||
}
|
||||
}
|
||||
enumerator->destroy(enumerator);
|
||||
|
||||
/* finalized all workitems ? */
|
||||
if (state->get_workitem_count(state) == 0)
|
||||
if (session->get_workitem_count(session, imv_id) == 0)
|
||||
{
|
||||
result = out_msg->send_assessment(out_msg);
|
||||
out_msg->destroy(out_msg);
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
#include "imv/imv_reason_string.h"
|
||||
#include "imv/imv_remediation_string.h"
|
||||
|
||||
#include <tncif_policy.h>
|
||||
|
||||
#include <utils/debug.h>
|
||||
#include <collections/linked_list.h>
|
||||
|
||||
@@ -73,14 +75,9 @@ struct private_imv_os_state_t {
|
||||
chunk_t ar_id_value;
|
||||
|
||||
/**
|
||||
* Unique session ID
|
||||
* IMV database session associated with TNCCS connection
|
||||
*/
|
||||
int session_id;
|
||||
|
||||
/**
|
||||
* List of workitems
|
||||
*/
|
||||
linked_list_t *workitems;
|
||||
imv_session_t *session;
|
||||
|
||||
/**
|
||||
* IMV action recommendation
|
||||
@@ -357,133 +354,21 @@ METHOD(imv_state_t, get_ar_id, chunk_t,
|
||||
return this->ar_id_value;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, set_session_id, void,
|
||||
private_imv_os_state_t *this, int session_id)
|
||||
METHOD(imv_state_t, set_session, void,
|
||||
private_imv_os_state_t *this, imv_session_t *session)
|
||||
{
|
||||
this->session_id = session_id;
|
||||
this->session = session;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, get_session_id, int,
|
||||
METHOD(imv_state_t, get_session, imv_session_t*,
|
||||
private_imv_os_state_t *this)
|
||||
{
|
||||
return this->session_id;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, add_workitem, void,
|
||||
private_imv_os_state_t *this, imv_workitem_t *workitem)
|
||||
{
|
||||
this->workitems->insert_last(this->workitems, workitem);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, get_workitem_count, int,
|
||||
private_imv_os_state_t *this)
|
||||
{
|
||||
return this->workitems->get_count(this->workitems);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, create_workitem_enumerator, enumerator_t*,
|
||||
private_imv_os_state_t *this)
|
||||
{
|
||||
return this->workitems->create_enumerator(this->workitems);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, finalize_workitem, void,
|
||||
private_imv_os_state_t *this, enumerator_t *enumerator,
|
||||
imv_workitem_t *workitem, char *result, TNC_IMV_Evaluation_Result eval)
|
||||
{
|
||||
TNC_IMV_Action_Recommendation rec;
|
||||
|
||||
this->workitems->remove_at(this->workitems, enumerator);
|
||||
rec = workitem->set_result(workitem, result, eval);
|
||||
|
||||
/* Update overall evaluation result */
|
||||
switch (this->eval)
|
||||
{
|
||||
case TNC_IMV_EVALUATION_RESULT_COMPLIANT:
|
||||
switch (eval)
|
||||
{
|
||||
case TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR:
|
||||
case TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR:
|
||||
case TNC_IMV_EVALUATION_RESULT_ERROR:
|
||||
this->eval = eval;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MINOR:
|
||||
switch (eval)
|
||||
{
|
||||
case TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR:
|
||||
case TNC_IMV_EVALUATION_RESULT_ERROR:
|
||||
this->eval = eval;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case TNC_IMV_EVALUATION_RESULT_NONCOMPLIANT_MAJOR:
|
||||
switch (eval)
|
||||
{
|
||||
case TNC_IMV_EVALUATION_RESULT_ERROR:
|
||||
this->eval = eval;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case TNC_IMV_EVALUATION_RESULT_DONT_KNOW:
|
||||
this->eval = eval;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* Update overall action recommendation */
|
||||
switch (this->rec)
|
||||
{
|
||||
case TNC_IMV_ACTION_RECOMMENDATION_ALLOW:
|
||||
switch (rec)
|
||||
{
|
||||
case TNC_IMV_ACTION_RECOMMENDATION_NO_ACCESS:
|
||||
case TNC_IMV_ACTION_RECOMMENDATION_ISOLATE:
|
||||
this->rec = rec;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case TNC_IMV_ACTION_RECOMMENDATION_NO_ACCESS:
|
||||
switch (rec)
|
||||
{
|
||||
case TNC_IMV_ACTION_RECOMMENDATION_ISOLATE:
|
||||
this->rec = rec;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION:
|
||||
this->rec = rec;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* TODO update workitem in IMV database */
|
||||
|
||||
workitem->destroy(workitem);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, change_state, void,
|
||||
private_imv_os_state_t *this, TNC_ConnectionState new_state)
|
||||
{
|
||||
this->state = new_state;
|
||||
return this->session;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, get_recommendation, void,
|
||||
private_imv_os_state_t *this, TNC_IMV_Action_Recommendation *rec,
|
||||
TNC_IMV_Evaluation_Result *eval)
|
||||
TNC_IMV_Evaluation_Result *eval)
|
||||
{
|
||||
*rec = this->rec;
|
||||
*eval = this->eval;
|
||||
@@ -491,12 +376,26 @@ METHOD(imv_state_t, get_recommendation, void,
|
||||
|
||||
METHOD(imv_state_t, set_recommendation, void,
|
||||
private_imv_os_state_t *this, TNC_IMV_Action_Recommendation rec,
|
||||
TNC_IMV_Evaluation_Result eval)
|
||||
TNC_IMV_Evaluation_Result eval)
|
||||
{
|
||||
this->rec = rec;
|
||||
this->eval = eval;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, update_recommendation, void,
|
||||
private_imv_os_state_t *this, TNC_IMV_Action_Recommendation rec,
|
||||
TNC_IMV_Evaluation_Result eval)
|
||||
{
|
||||
this->rec = tncif_policy_update_recommendation(this->rec, rec);
|
||||
this->eval = tncif_policy_update_evaluation(this->eval, eval);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, change_state, void,
|
||||
private_imv_os_state_t *this, TNC_ConnectionState new_state)
|
||||
{
|
||||
this->state = new_state;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, get_reason_string, bool,
|
||||
private_imv_os_state_t *this, enumerator_t *language_enumerator,
|
||||
chunk_t *reason_string, char **reason_language)
|
||||
@@ -591,10 +490,9 @@ METHOD(imv_state_t, get_remediation_instructions, bool,
|
||||
METHOD(imv_state_t, destroy, void,
|
||||
private_imv_os_state_t *this)
|
||||
{
|
||||
DESTROY_IF(this->session);
|
||||
DESTROY_IF(this->reason_string);
|
||||
DESTROY_IF(this->remediation_string);
|
||||
this->workitems->destroy_offset(this->workitems,
|
||||
offsetof(imv_workitem_t, destroy));
|
||||
this->update_packages->destroy_function(this->update_packages, free);
|
||||
this->remove_packages->destroy_function(this->remove_packages, free);
|
||||
free(this->info);
|
||||
@@ -764,15 +662,12 @@ imv_state_t *imv_os_state_create(TNC_ConnectionID connection_id)
|
||||
.get_max_msg_len = _get_max_msg_len,
|
||||
.set_ar_id = _set_ar_id,
|
||||
.get_ar_id = _get_ar_id,
|
||||
.set_session_id = _set_session_id,
|
||||
.get_session_id = _get_session_id,
|
||||
.add_workitem = _add_workitem,
|
||||
.get_workitem_count = _get_workitem_count,
|
||||
.create_workitem_enumerator = _create_workitem_enumerator,
|
||||
.finalize_workitem = _finalize_workitem,
|
||||
.set_session = _set_session,
|
||||
.get_session = _get_session,
|
||||
.change_state = _change_state,
|
||||
.get_recommendation = _get_recommendation,
|
||||
.set_recommendation = _set_recommendation,
|
||||
.update_recommendation = _update_recommendation,
|
||||
.get_reason_string = _get_reason_string,
|
||||
.get_remediation_instructions = _get_remediation_instructions,
|
||||
.destroy = _destroy,
|
||||
@@ -797,7 +692,6 @@ imv_state_t *imv_os_state_create(TNC_ConnectionID connection_id)
|
||||
.rec = TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION,
|
||||
.eval = TNC_IMV_EVALUATION_RESULT_DONT_KNOW,
|
||||
.connection_id = connection_id,
|
||||
.workitems = linked_list_create(),
|
||||
.update_packages = linked_list_create(),
|
||||
.remove_packages = linked_list_create(),
|
||||
);
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
#include "imv/imv_reason_string.h"
|
||||
#include "imv/imv_remediation_string.h"
|
||||
|
||||
#include <tncif_policy.h>
|
||||
|
||||
#include <utils/lexparser.h>
|
||||
#include <utils/debug.h>
|
||||
|
||||
@@ -69,14 +71,9 @@ struct private_imv_scanner_state_t {
|
||||
chunk_t ar_id_value;
|
||||
|
||||
/**
|
||||
* Unique session ID
|
||||
* IMV database session associatied with TNCCS connection
|
||||
*/
|
||||
int session_id;
|
||||
|
||||
/**
|
||||
* List of workitems
|
||||
*/
|
||||
linked_list_t *workitems;
|
||||
imv_session_t *session;
|
||||
|
||||
/**
|
||||
* IMV action recommendation
|
||||
@@ -202,46 +199,16 @@ METHOD(imv_state_t, get_ar_id, chunk_t,
|
||||
return this->ar_id_value;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, set_session_id, void,
|
||||
private_imv_scanner_state_t *this, int session_id)
|
||||
METHOD(imv_state_t, set_session, void,
|
||||
private_imv_scanner_state_t *this, imv_session_t *session)
|
||||
{
|
||||
this->session_id = session_id;
|
||||
this->session = session;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, get_session_id, int,
|
||||
METHOD(imv_state_t, get_session, imv_session_t*,
|
||||
private_imv_scanner_state_t *this)
|
||||
{
|
||||
return this->session_id;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, add_workitem, void,
|
||||
private_imv_scanner_state_t *this, imv_workitem_t *workitem)
|
||||
{
|
||||
this->workitems->insert_last(this->workitems, workitem);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, get_workitem_count, int,
|
||||
private_imv_scanner_state_t *this)
|
||||
{
|
||||
return this->workitems->get_count(this->workitems);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, create_workitem_enumerator, enumerator_t*,
|
||||
private_imv_scanner_state_t *this)
|
||||
{
|
||||
return this->workitems->create_enumerator(this->workitems);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, finalize_workitem, void,
|
||||
private_imv_scanner_state_t *this, enumerator_t *enumerator,
|
||||
imv_workitem_t *workitem, char *result, TNC_IMV_Evaluation_Result eval)
|
||||
{
|
||||
TNC_IMV_Action_Recommendation rec;
|
||||
|
||||
this->workitems->remove_at(this->workitems, enumerator);
|
||||
rec = workitem->set_result(workitem, result, eval);
|
||||
/* TODO update workitem in IMV database */
|
||||
workitem->destroy(workitem);
|
||||
return this->session;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, change_state, void,
|
||||
@@ -252,7 +219,7 @@ METHOD(imv_state_t, change_state, void,
|
||||
|
||||
METHOD(imv_state_t, get_recommendation, void,
|
||||
private_imv_scanner_state_t *this, TNC_IMV_Action_Recommendation *rec,
|
||||
TNC_IMV_Evaluation_Result *eval)
|
||||
TNC_IMV_Evaluation_Result *eval)
|
||||
{
|
||||
*rec = this->rec;
|
||||
*eval = this->eval;
|
||||
@@ -260,12 +227,20 @@ METHOD(imv_state_t, get_recommendation, void,
|
||||
|
||||
METHOD(imv_state_t, set_recommendation, void,
|
||||
private_imv_scanner_state_t *this, TNC_IMV_Action_Recommendation rec,
|
||||
TNC_IMV_Evaluation_Result eval)
|
||||
TNC_IMV_Evaluation_Result eval)
|
||||
{
|
||||
this->rec = rec;
|
||||
this->eval = eval;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, update_recommendation, void,
|
||||
private_imv_scanner_state_t *this, TNC_IMV_Action_Recommendation rec,
|
||||
TNC_IMV_Evaluation_Result eval)
|
||||
{
|
||||
this->rec = tncif_policy_update_recommendation(this->rec, rec);
|
||||
this->eval = tncif_policy_update_evaluation(this->eval, eval);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, get_reason_string, bool,
|
||||
private_imv_scanner_state_t *this, enumerator_t *language_enumerator,
|
||||
chunk_t *reason_string, char **reason_language)
|
||||
@@ -317,10 +292,9 @@ METHOD(imv_state_t, get_remediation_instructions, bool,
|
||||
METHOD(imv_state_t, destroy, void,
|
||||
private_imv_scanner_state_t *this)
|
||||
{
|
||||
DESTROY_IF(this->session);
|
||||
DESTROY_IF(this->reason_string);
|
||||
DESTROY_IF(this->remediation_string);
|
||||
this->workitems->destroy_offset(this->workitems,
|
||||
offsetof(imv_workitem_t, destroy));
|
||||
this->violating_ports->destroy_function(this->violating_ports, free);
|
||||
free(this->ar_id_value.ptr);
|
||||
free(this);
|
||||
@@ -350,15 +324,12 @@ imv_state_t *imv_scanner_state_create(TNC_ConnectionID connection_id)
|
||||
.get_max_msg_len = _get_max_msg_len,
|
||||
.set_ar_id = _set_ar_id,
|
||||
.get_ar_id = _get_ar_id,
|
||||
.set_session_id = _set_session_id,
|
||||
.get_session_id = _get_session_id,
|
||||
.add_workitem = _add_workitem,
|
||||
.get_workitem_count = _get_workitem_count,
|
||||
.create_workitem_enumerator = _create_workitem_enumerator,
|
||||
.finalize_workitem = _finalize_workitem,
|
||||
.set_session = _set_session,
|
||||
.get_session= _get_session,
|
||||
.change_state = _change_state,
|
||||
.get_recommendation = _get_recommendation,
|
||||
.set_recommendation = _set_recommendation,
|
||||
.update_recommendation = _update_recommendation,
|
||||
.get_reason_string = _get_reason_string,
|
||||
.get_remediation_instructions = _get_remediation_instructions,
|
||||
.destroy = _destroy,
|
||||
@@ -369,7 +340,6 @@ imv_state_t *imv_scanner_state_create(TNC_ConnectionID connection_id)
|
||||
.rec = TNC_IMV_ACTION_RECOMMENDATION_NO_RECOMMENDATION,
|
||||
.eval = TNC_IMV_EVALUATION_RESULT_DONT_KNOW,
|
||||
.connection_id = connection_id,
|
||||
.workitems = linked_list_create(),
|
||||
.violating_ports = linked_list_create(),
|
||||
);
|
||||
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
#include "imv/imv_lang_string.h"
|
||||
#include "imv/imv_reason_string.h"
|
||||
|
||||
#include <tncif_policy.h>
|
||||
|
||||
#include <utils/lexparser.h>
|
||||
#include <collections/linked_list.h>
|
||||
#include <utils/debug.h>
|
||||
@@ -69,14 +71,9 @@ struct private_imv_test_state_t {
|
||||
chunk_t ar_id_value;
|
||||
|
||||
/**
|
||||
* Unique session ID
|
||||
* IMV database session associated with TNCCS connection
|
||||
*/
|
||||
int session_id;
|
||||
|
||||
/**
|
||||
* List of workitems
|
||||
*/
|
||||
linked_list_t *workitems;
|
||||
imv_session_t *session;
|
||||
|
||||
/**
|
||||
* IMV action recommendation
|
||||
@@ -180,46 +177,16 @@ METHOD(imv_state_t, get_ar_id, chunk_t,
|
||||
return this->ar_id_value;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, set_session_id, void,
|
||||
private_imv_test_state_t *this, int session_id)
|
||||
METHOD(imv_state_t, set_session, void,
|
||||
private_imv_test_state_t *this, imv_session_t *session)
|
||||
{
|
||||
this->session_id = session_id;
|
||||
this->session = session;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, get_session_id, int,
|
||||
METHOD(imv_state_t, get_session, imv_session_t*,
|
||||
private_imv_test_state_t *this)
|
||||
{
|
||||
return this->session_id;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, add_workitem, void,
|
||||
private_imv_test_state_t *this, imv_workitem_t *workitem)
|
||||
{
|
||||
this->workitems->insert_last(this->workitems, workitem);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, get_workitem_count, int,
|
||||
private_imv_test_state_t *this)
|
||||
{
|
||||
return this->workitems->get_count(this->workitems);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, create_workitem_enumerator, enumerator_t*,
|
||||
private_imv_test_state_t *this)
|
||||
{
|
||||
return this->workitems->create_enumerator(this->workitems);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, finalize_workitem, void,
|
||||
private_imv_test_state_t *this, enumerator_t *enumerator,
|
||||
imv_workitem_t *workitem, char *result, TNC_IMV_Evaluation_Result eval)
|
||||
{
|
||||
TNC_IMV_Action_Recommendation rec;
|
||||
|
||||
this->workitems->remove_at(this->workitems, enumerator);
|
||||
rec = workitem->set_result(workitem, result, eval);
|
||||
/* TODO update workitem in IMV database */
|
||||
workitem->destroy(workitem);
|
||||
return this->session;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, change_state, void,
|
||||
@@ -244,6 +211,14 @@ METHOD(imv_state_t, set_recommendation, void,
|
||||
this->eval = eval;
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, update_recommendation, void,
|
||||
private_imv_test_state_t *this, TNC_IMV_Action_Recommendation rec,
|
||||
TNC_IMV_Evaluation_Result eval)
|
||||
{
|
||||
this->rec = tncif_policy_update_recommendation(this->rec, rec);
|
||||
this->eval = tncif_policy_update_evaluation(this->eval, eval);
|
||||
}
|
||||
|
||||
METHOD(imv_state_t, get_reason_string, bool,
|
||||
private_imv_test_state_t *this, enumerator_t *language_enumerator,
|
||||
chunk_t *reason_string, char **reason_language)
|
||||
@@ -270,9 +245,8 @@ METHOD(imv_state_t, get_remediation_instructions, bool,
|
||||
METHOD(imv_state_t, destroy, void,
|
||||
private_imv_test_state_t *this)
|
||||
{
|
||||
DESTROY_IF(this->session);
|
||||
DESTROY_IF(this->reason_string);
|
||||
this->workitems->destroy_offset(this->workitems,
|
||||
offsetof(imv_workitem_t, destroy));
|
||||
this->imcs->destroy_function(this->imcs, free);
|
||||
free(this->ar_id_value.ptr);
|
||||
free(this);
|
||||
@@ -361,15 +335,12 @@ imv_state_t *imv_test_state_create(TNC_ConnectionID connection_id)
|
||||
.get_max_msg_len = _get_max_msg_len,
|
||||
.set_ar_id = _set_ar_id,
|
||||
.get_ar_id = _get_ar_id,
|
||||
.set_session_id = _set_session_id,
|
||||
.get_session_id = _get_session_id,
|
||||
.add_workitem = _add_workitem,
|
||||
.get_workitem_count = _get_workitem_count,
|
||||
.create_workitem_enumerator = _create_workitem_enumerator,
|
||||
.finalize_workitem = _finalize_workitem,
|
||||
.set_session = _set_session,
|
||||
.get_session = _get_session,
|
||||
.change_state = _change_state,
|
||||
.get_recommendation = _get_recommendation,
|
||||
.set_recommendation = _set_recommendation,
|
||||
.update_recommendation = _update_recommendation,
|
||||
.get_reason_string = _get_reason_string,
|
||||
.get_remediation_instructions = _get_remediation_instructions,
|
||||
.destroy = _destroy,
|
||||
|
||||
Reference in New Issue
Block a user