implemented enforcement-report metadata

This commit is contained in:
Andreas Steffen
2011-08-12 13:16:02 +02:00
parent ae8a984b5a
commit 537205fa9d
3 changed files with 124 additions and 24 deletions
@@ -94,8 +94,23 @@ static bool reload_metadata(private_tnc_ifmap_listener_t *this)
METHOD(listener_t, ike_updown, bool,
private_tnc_ifmap_listener_t *this, ike_sa_t *ike_sa, bool up)
{
this->ifmap->publish_ike_sa(this->ifmap, ike_sa, up);
if (ike_sa->get_state(ike_sa) != IKE_CONNECTING)
{
this->ifmap->publish_ike_sa(this->ifmap, ike_sa, up);
}
return TRUE;
}
METHOD(listener_t, alert, bool,
private_tnc_ifmap_listener_t *this, ike_sa_t *ike_sa, alert_t alert,
va_list args)
{
if (alert == ALERT_PEER_AUTH_FAILED)
{
this->ifmap->publish_enforcement_report(this->ifmap,
ike_sa->get_other_host(ike_sa),
"block", "authentication failed");
}
return TRUE;
}
@@ -117,6 +132,7 @@ tnc_ifmap_listener_t *tnc_ifmap_listener_create(bool reload)
.public = {
.listener = {
.ike_updown = _ike_updown,
.alert = _alert,
},
.destroy = _destroy,
},
@@ -394,6 +394,40 @@ static axiom_node_t* create_capability(private_tnc_ifmap_soap_t *this,
return node;
}
/**
* Create enforcement-report metadata
*/
static axiom_node_t* create_enforcement_report(private_tnc_ifmap_soap_t *this,
char *action, char *reason)
{
axiom_element_t *el;
axiom_node_t *node, *node2, *node3, *node4;
axiom_namespace_t *ns_meta;
axiom_attribute_t *attr;
axiom_text_t *text;
el = axiom_element_create(this->env, NULL, "metadata", NULL, &node);
ns_meta = axiom_namespace_create(this->env, IFMAP_META_NS, "meta");
el = axiom_element_create(this->env, NULL, "enforcement-report", ns_meta,
&node2);
attr = axiom_attribute_create(this->env, "ifmap-cardinality",
"multiValue", NULL);
axiom_element_add_attribute(el, this->env, attr, node2);
axiom_node_add_child(node, this->env, node2);
el = axiom_element_create(this->env, NULL, "enforcement-action", NULL,
&node3);
axiom_node_add_child(node2, this->env, node3);
text = axiom_text_create(this->env, node3, action, &node4);
el = axiom_element_create(this->env, NULL, "enforcement-reason", NULL,
&node3);
axiom_node_add_child(node2, this->env, node3);
text = axiom_text_create(this->env, node3, reason, &node4);
return node;
}
/**
* Create delete filter
*/
@@ -415,13 +449,31 @@ static axiom_node_t* create_delete_filter(private_tnc_ifmap_soap_t *this,
return node;
}
/**
* Create a publish request
*/
static axiom_node_t* create_publish_request(private_tnc_ifmap_soap_t *this)
{
axiom_element_t *el;
axiom_node_t *request;
axiom_namespace_t *ns, *ns_meta;
axiom_attribute_t *attr;
ns = axiom_namespace_create(this->env, IFMAP_NS, "ifmap");
el = axiom_element_create(this->env, NULL, "publish", ns, &request);
ns_meta = axiom_namespace_create(this->env, IFMAP_META_NS, "meta");
axiom_element_declare_namespace(el, this->env, request, ns_meta);
attr = axiom_attribute_create(this->env, "session-id", this->session_id,
NULL);
axiom_element_add_attribute(el, this->env, attr, request);
return request;
}
METHOD(tnc_ifmap_soap_t, publish_ike_sa, bool,
private_tnc_ifmap_soap_t *this, ike_sa_t *ike_sa, bool up)
{
axiom_node_t *request, *node, *node2;
axiom_element_t *el;
axiom_namespace_t *ns, *ns_meta;
axiom_attribute_t *attr;
enumerator_t *e1, *e2;
auth_rule_t type;
@@ -445,14 +497,19 @@ METHOD(tnc_ifmap_soap_t, publish_ike_sa, bool,
}
/* build publish request */
ns = axiom_namespace_create(this->env, IFMAP_NS, "ifmap");
el = axiom_element_create(this->env, NULL, "publish", ns, &request);
ns_meta = axiom_namespace_create(this->env, IFMAP_META_NS, "meta");
axiom_element_declare_namespace(el, this->env, request, ns_meta);
attr = axiom_attribute_create(this->env, "session-id", this->session_id,
NULL);
axiom_element_add_attribute(el, this->env, attr, request);
request = create_publish_request(this);
/* delete any existing enforcement reports */
if (up)
{
node = create_delete_filter(this, "enforcement-report");
axiom_node_add_child(request, this->env, node);
axiom_node_add_child(node, this->env,
create_ip_address(this, host));
axiom_node_add_child(node, this->env,
create_device(this));
}
/**
* update or delete authenticated-as metadata
*/
@@ -468,7 +525,7 @@ METHOD(tnc_ifmap_soap_t, publish_ike_sa, bool,
/* add access-request, identity and [if up] metadata */
axiom_node_add_child(node, this->env,
create_access_request(this, ike_sa_id));
create_access_request(this, ike_sa_id));
axiom_node_add_child(node, this->env,
create_identity(this, id, is_user));
if (up)
@@ -584,27 +641,42 @@ METHOD(tnc_ifmap_soap_t, publish_device_ip, bool,
{
axiom_node_t *request, *node;
axiom_element_t *el;
axiom_namespace_t *ns, *ns_meta;
axiom_attribute_t *attr;
/* build publish request */
ns = axiom_namespace_create(this->env, IFMAP_NS, "ifmap");
el = axiom_element_create(this->env, NULL, "publish", ns, &request);
ns_meta = axiom_namespace_create(this->env, IFMAP_META_NS, "meta");
axiom_element_declare_namespace(el, this->env, request, ns_meta);
attr = axiom_attribute_create(this->env, "session-id", this->session_id,
NULL);
axiom_element_add_attribute(el, this->env, attr, request);
/* build publish update request */
request = create_publish_request(this);
el = axiom_element_create(this->env, NULL, "update", NULL, &node);
axiom_node_add_child(request, this->env, node);
/* add device, ip-address and metadata */
axiom_node_add_child(node, this->env,
create_device(this));
create_device(this));
axiom_node_add_child(node, this->env,
create_ip_address(this, host));
create_ip_address(this, host));
axiom_node_add_child(node, this->env,
create_metadata(this, "device-ip"));
create_metadata(this, "device-ip"));
/* send publish request and receive publishReceived */
return send_receive(this, "publish", request, "publishReceived", NULL);
}
METHOD(tnc_ifmap_soap_t, publish_enforcement_report, bool,
private_tnc_ifmap_soap_t *this, host_t *host, char *action, char *reason)
{
axiom_node_t *request, *node;
axiom_element_t *el;
/* build publish update request */
request = create_publish_request(this);
el = axiom_element_create(this->env, NULL, "update", NULL, &node);
axiom_node_add_child(request, this->env, node);
/* add ip-address and metadata */
axiom_node_add_child(node, this->env,
create_ip_address(this, host));
axiom_node_add_child(node, this->env,
create_device(this));
axiom_node_add_child(node, this->env,
create_enforcement_report(this, action, reason));
/* send publish request and receive publishReceived */
return send_receive(this, "publish", request, "publishReceived", NULL);
@@ -749,6 +821,7 @@ tnc_ifmap_soap_t *tnc_ifmap_soap_create()
.purgePublisher = _purgePublisher,
.publish_ike_sa = _publish_ike_sa,
.publish_device_ip = _publish_device_ip,
.publish_enforcement_report = _publish_enforcement_report,
.endSession = _endSession,
.destroy = _destroy,
},
@@ -63,6 +63,17 @@ struct tnc_ifmap_soap_t {
*/
bool (*publish_device_ip)(tnc_ifmap_soap_t *this, host_t *host);
/**
* Publish enforcement-report metadata
*
* @param host Host to be enforced
* @param action Enforcement action ("block" or "quarantine")
* @param reason Enforcement reason
* @return TRUE if command was successful
*/
bool (*publish_enforcement_report)(tnc_ifmap_soap_t *this, host_t *host,
char *action, char *reason);
/**
* Ends an IF-MAP session
*