newSession and endSession work

This commit is contained in:
Andreas Steffen 2011-08-06 00:12:55 +02:00
parent c77af76807
commit 7ab854adf9
2 changed files with 90 additions and 26 deletions

View File

@ -39,18 +39,28 @@ struct private_tnc_ifmap_listener_t {
tnc_ifmap_listener_t public;
/**
* Axis2c environment
* Axis2/C environment
*/
axutil_env_t *env;
/**
* Axis2c service client
* Axis2 service client
*/
axis2_svc_client_t* svc_client;
/**
* SOAP Session ID
*/
char *session_id;
/**
* IF-MAP Publisher ID
*/
char *ifmap_publisher_id;
};
static axiom_node_t* build_request(private_tnc_ifmap_listener_t *this)
static axiom_node_t* newSession(private_tnc_ifmap_listener_t *this)
{
axiom_node_t *node = NULL;
axiom_element_t *el;
@ -62,6 +72,49 @@ static axiom_node_t* build_request(private_tnc_ifmap_listener_t *this)
return node;
}
static bool newSessionResult(private_tnc_ifmap_listener_t *this,
axiom_node_t *result)
{
axiom_node_t *node;
axiom_element_t *el;
axis2_char_t *attr;
bool success = FALSE;
node = axiom_node_get_first_child(result, this->env);
if (node && axiom_node_get_node_type(node, this->env) == AXIOM_ELEMENT)
{
el = (axiom_element_t *)axiom_node_get_data_element(node, this->env);
attr = axiom_element_get_attribute_value_by_name(el, this->env,
"session-id");
this->session_id = strdup(attr);
attr = axiom_element_get_attribute_value_by_name(el, this->env,
"ifmap-publisher-id");
this->ifmap_publisher_id = strdup(attr);
DBG1(DBG_TNC, "session-id: %s, ifmap-publisher-id: %s",
this->session_id, this->ifmap_publisher_id);
success = this->session_id && this->ifmap_publisher_id;
}
axiom_node_free_tree(result, this->env);
return success;
}
static axiom_node_t* endSession(private_tnc_ifmap_listener_t *this)
{
axiom_node_t *node = NULL;
axiom_element_t *el;
axiom_namespace_t *ns;
axiom_attribute_t *attr;
ns = axiom_namespace_create(this->env, IFMAP_NAMESPACE, "ifmap");
el = axiom_element_create(this->env, NULL, "endSession", ns, &node);
attr = axiom_attribute_create(this->env, "session-id", this->session_id, NULL);
axiom_element_add_attribute(el, this->env, attr, node);
return node;
}
METHOD(listener_t, child_updown, bool,
private_tnc_ifmap_listener_t *this, ike_sa_t *ike_sa, child_sa_t *child_sa,
bool up)
@ -82,6 +135,21 @@ METHOD(listener_t, child_updown, bool,
METHOD(tnc_ifmap_listener_t, destroy, void,
private_tnc_ifmap_listener_t *this)
{
if (this->session_id)
{
axiom_node_t *request, *result;
DBG2(DBG_TNC, "sending endSession");
request = endSession(this);
result = axis2_svc_client_send_receive(this->svc_client, this->env,
request);
if (!result)
{
DBG1(DBG_TNC, "endSession with MAP server failed");
}
free(this->session_id);
free(this->ifmap_publisher_id);
}
if (this->svc_client)
{
axis2_svc_client_free(this->svc_client, this->env);
@ -89,7 +157,7 @@ METHOD(tnc_ifmap_listener_t, destroy, void,
if (this->env)
{
axutil_env_free(this->env);
}
}
free(this);
}
@ -102,8 +170,7 @@ tnc_ifmap_listener_t *tnc_ifmap_listener_create()
axis2_char_t *server, *client_home, *username, *password, *auth_type;
axis2_endpoint_ref_t* endpoint_ref = NULL;
axis2_options_t *options = NULL;
axiom_node_t *request, *response, *node;
axiom_text_t *text;
axiom_node_t *request, *result;
client_home = lib->settings->get_str(lib->settings,
"charon.plugins.tnc-ifmap.client_home",
@ -119,7 +186,7 @@ tnc_ifmap_listener_t *tnc_ifmap_listener_create()
if (!username || !password)
{
DBG1(DBG_TNC, "IF-MAP client %s%s%s not defined",
DBG1(DBG_TNC, "MAP client %s%s%s not defined",
(!username) ? "username" : "",
(!username && ! password) ? " and " : "",
(!password) ? "password" : "");
@ -158,26 +225,18 @@ tnc_ifmap_listener_t *tnc_ifmap_listener_create()
axis2_svc_client_set_options(this->svc_client, this->env, options);
axis2_options_set_http_auth_info(options, this->env, username, password,
auth_type);
DBG1(DBG_TNC, "connecting as MAP client '%s' to MAP server at '%s'",
username, server);
request = build_request(this);
response = axis2_svc_client_send_receive(this->svc_client, this->env, request);
if (!response)
DBG2(DBG_TNC, "sending newSession");
request = newSession(this);
result = axis2_svc_client_send_receive(this->svc_client, this->env, request);
if (!result || !newSessionResult(this, result))
{
DBG1(DBG_TNC, "Session setup with IF-MAP server failed");
DBG1(DBG_TNC, "newSession with MAP server failed");
destroy(this);
return NULL;
}
node = axiom_node_get_first_child(response, this->env);
if (node && axiom_node_get_node_type(node, this->env) == AXIOM_TEXT)
{
text = (axiom_text_t *)axiom_node_get_data_element(node, this->env);
if (text)
{
DBG1(DBG_TNC, "response = '%s'",
axiom_text_get_value(text, this->env));
}
}
axiom_node_free_tree(response, this->env);
return &this->public;
}

View File

@ -45,8 +45,11 @@ METHOD(plugin_t, get_name, char*,
METHOD(plugin_t, destroy, void,
private_tnc_ifmap_plugin_t *this)
{
charon->bus->remove_listener(charon->bus, &this->listener->listener);
this->listener->destroy(this->listener);
if (this->listener)
{
charon->bus->remove_listener(charon->bus, &this->listener->listener);
this->listener->destroy(this->listener);
}
free(this);
}
@ -68,8 +71,10 @@ plugin_t *tnc_ifmap_plugin_create()
.listener = tnc_ifmap_listener_create(),
);
charon->bus->add_listener(charon->bus, &this->listener->listener);
if (this->listener)
{
charon->bus->add_listener(charon->bus, &this->listener->listener);
}
return &this->public.plugin;
}