2 * Copyright (C) 2011 Andreas Steffen
3 * HSR Hochschule fuer Technik Rapperswil
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License as published by the
7 * Free Software Foundation; either version 2 of the License, or (at your
8 * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 #include "tnc_ifmap_listener.h"
19 #include <config/child_cfg.h>
21 #include <axis2_util.h>
22 #include <axis2_client.h>
23 #include <axiom_soap.h>
25 #define IFMAP_NAMESPACE "http://www.trustedcomputinggroup.org/2010/IFMAP/2"
26 #define IFMAP_LOGFILE "strongswan_ifmap.log"
27 #define IFMAP_SERVER "https://localhost:8443/"
29 typedef struct private_tnc_ifmap_listener_t private_tnc_ifmap_listener_t
;
32 * Private data of an tnc_ifmap_listener_t object.
34 struct private_tnc_ifmap_listener_t
{
37 * Public tnc_ifmap_listener_t interface.
39 tnc_ifmap_listener_t
public;
47 * Axis2 service client
49 axis2_svc_client_t
* svc_client
;
59 char *ifmap_publisher_id
;
63 static bool newSession(private_tnc_ifmap_listener_t
*this)
65 axiom_node_t
*request
, *result
, *node
;
67 axiom_namespace_t
*ns
;
68 axiom_attribute_t
*attr
;
70 axutil_qname_t
*qname
;
74 /* build newSession request */
75 ns
= axiom_namespace_create(this->env
, IFMAP_NAMESPACE
, "ifmap");
76 el
= axiom_element_create(this->env
, NULL
, "newSession", ns
, &request
);
77 attr
= axiom_attribute_create(this->env
, "max-poll-result-size", "1000000", NULL
);
78 axiom_element_add_attribute(el
, this->env
, attr
, request
);
80 /* send newSession request */
81 result
= axis2_svc_client_send_receive(this->svc_client
, this->env
, request
);
87 /* process newSessionResult */
88 node
= axiom_node_get_first_child(result
, this->env
);
89 if (node
&& axiom_node_get_node_type(node
, this->env
) == AXIOM_ELEMENT
)
91 el
= (axiom_element_t
*)axiom_node_get_data_element(node
, this->env
);
92 qname
= axiom_element_get_qname(el
, this->env
, node
);
93 success
= streq("newSessionResult",
94 axutil_qname_to_string(qname
, this->env
));
96 /* process the attributes */
99 value
= axiom_element_get_attribute_value_by_name(el
, this->env
,
101 this->session_id
= strdup(value
);
102 value
= axiom_element_get_attribute_value_by_name(el
, this->env
,
103 "ifmap-publisher-id");
104 this->ifmap_publisher_id
= strdup(value
);
106 DBG1(DBG_TNC
, "session-id: %s, ifmap-publisher-id: %s",
107 this->session_id
, this->ifmap_publisher_id
);
108 success
= this->session_id
&& this->ifmap_publisher_id
;
110 value
= axiom_element_get_attribute_value_by_name(el
, this->env
,
111 "max-poll-result-size");
114 DBG1(DBG_TNC
, "max-poll-result-size: %s", value
);
119 DBG1(DBG_TNC
, "%s", axiom_element_to_string(el
, this->env
, node
));
122 axiom_node_free_tree(result
, this->env
);
127 static bool purgePublisher(private_tnc_ifmap_listener_t
*this)
129 axiom_node_t
*request
, *result
, *node
;
131 axiom_namespace_t
*ns
;
132 axiom_attribute_t
*attr
;
133 axutil_qname_t
*qname
;
134 bool success
= FALSE
;
136 /* build purgePublisher request */
137 ns
= axiom_namespace_create(this->env
, IFMAP_NAMESPACE
, "ifmap");
138 el
= axiom_element_create(this->env
, NULL
, "purgePublisher", ns
,
140 attr
= axiom_attribute_create(this->env
, "session-id",
141 this->session_id
, NULL
);
142 axiom_element_add_attribute(el
, this->env
, attr
, request
);
143 attr
= axiom_attribute_create(this->env
, "ifmap-publisher-id",
144 this->ifmap_publisher_id
, NULL
);
145 axiom_element_add_attribute(el
, this->env
, attr
, request
);
147 /* send purgePublisher request */
148 result
= axis2_svc_client_send_receive(this->svc_client
, this->env
, request
);
154 /* process purgePublisherReceived */
155 node
= axiom_node_get_first_child(result
, this->env
);
156 if (node
&& axiom_node_get_node_type(node
, this->env
) == AXIOM_ELEMENT
)
158 el
= (axiom_element_t
*)axiom_node_get_data_element(node
, this->env
);
159 qname
= axiom_element_get_qname(el
, this->env
, node
);
160 success
= streq("purgePublisherReceived",
161 axutil_qname_to_string(qname
, this->env
));
164 DBG1(DBG_TNC
, "%s", axiom_element_to_string(el
, this->env
, node
));
167 axiom_node_free_tree(result
, this->env
);
172 static bool publish(private_tnc_ifmap_listener_t
*this)
174 axiom_node_t
*request
, *result
, *node
;
176 axiom_namespace_t
*ns
;
177 axiom_attribute_t
*attr
;
179 /* build publish request */
180 ns
= axiom_namespace_create(this->env
, IFMAP_NAMESPACE
, "ifmap");
181 el
= axiom_element_create(this->env
, NULL
, "publish", ns
, &request
);
182 attr
= axiom_attribute_create(this->env
, "session-id", this->session_id
, NULL
);
183 axiom_element_add_attribute(el
, this->env
, attr
, request
);
185 /* send publish request */
186 result
= axis2_svc_client_send_receive(this->svc_client
, this->env
, request
);
192 /* process publishReceived */
193 node
= axiom_node_get_first_child(result
, this->env
);
194 axiom_node_free_tree(result
, this->env
);
199 static bool endSession(private_tnc_ifmap_listener_t
*this)
201 axiom_node_t
*request
, *result
, *node
;
203 axiom_namespace_t
*ns
;
204 axiom_attribute_t
*attr
;
205 axutil_qname_t
*qname
;
206 bool success
= FALSE
;
208 /* build endSession request */
209 ns
= axiom_namespace_create(this->env
, IFMAP_NAMESPACE
, "ifmap");
210 el
= axiom_element_create(this->env
, NULL
, "endSession", ns
, &request
);
211 attr
= axiom_attribute_create(this->env
, "session-id", this->session_id
, NULL
);
212 axiom_element_add_attribute(el
, this->env
, attr
, request
);
214 /* send endSession request */
215 result
= axis2_svc_client_send_receive(this->svc_client
, this->env
, request
);
221 /* process endSessionResult */
222 node
= axiom_node_get_first_child(result
, this->env
);
223 if (node
&& axiom_node_get_node_type(node
, this->env
) == AXIOM_ELEMENT
)
225 el
= (axiom_element_t
*)axiom_node_get_data_element(node
, this->env
);
226 qname
= axiom_element_get_qname(el
, this->env
, node
);
227 success
= streq("endSessionResult",
228 axutil_qname_to_string(qname
, this->env
));
231 DBG1(DBG_TNC
, "%s", axiom_element_to_string(el
, this->env
, node
));
234 axiom_node_free_tree(result
, this->env
);
241 METHOD(listener_t
, child_updown
, bool,
242 private_tnc_ifmap_listener_t
*this, ike_sa_t
*ike_sa
, child_sa_t
*child_sa
,
245 traffic_selector_t
*my_ts
, *other_ts
;
246 enumerator_t
*enumerator
;
248 host_t
*vip
, *me
, *other
;
250 config
= child_sa
->get_config(child_sa
);
251 vip
= ike_sa
->get_virtual_ip(ike_sa
, TRUE
);
252 me
= ike_sa
->get_my_host(ike_sa
);
253 other
= ike_sa
->get_other_host(ike_sa
);
255 DBG2(DBG_TNC
, "sending publish");
258 DBG1(DBG_TNC
, "publish with MAP server failed");
264 METHOD(tnc_ifmap_listener_t
, destroy
, void,
265 private_tnc_ifmap_listener_t
*this)
267 if (this->session_id
)
269 DBG2(DBG_TNC
, "sending endSession");
270 if (!endSession(this))
272 DBG1(DBG_TNC
, "endSession with MAP server failed");
274 free(this->session_id
);
275 free(this->ifmap_publisher_id
);
277 if (this->svc_client
)
279 axis2_svc_client_free(this->svc_client
, this->env
);
283 axutil_env_free(this->env
);
291 tnc_ifmap_listener_t
*tnc_ifmap_listener_create()
293 private_tnc_ifmap_listener_t
*this;
294 axis2_char_t
*server
, *client_home
, *username
, *password
, *auth_type
;
295 axis2_endpoint_ref_t
* endpoint_ref
= NULL
;
296 axis2_options_t
*options
= NULL
;
298 client_home
= lib
->settings
->get_str(lib
->settings
,
299 "charon.plugins.tnc-ifmap.client_home",
300 AXIS2_GETENV("AXIS2C_HOME"));
301 server
= lib
->settings
->get_str(lib
->settings
,
302 "charon.plugins.tnc-ifmap.server", IFMAP_SERVER
);
303 auth_type
= lib
->settings
->get_str(lib
->settings
,
304 "charon.plugins.tnc-ifmap.auth_type", "Basic");
305 username
= lib
->settings
->get_str(lib
->settings
,
306 "charon.plugins.tnc-ifmap.username", NULL
);
307 password
= lib
->settings
->get_str(lib
->settings
,
308 "charon.plugins.tnc-ifmap.password", NULL
);
310 if (!username
|| !password
)
312 DBG1(DBG_TNC
, "MAP client %s%s%s not defined",
313 (!username
) ?
"username" : "",
314 (!username
&& ! password
) ?
" and " : "",
315 (!password
) ?
"password" : "");
321 .child_updown
= _child_updown
,
327 /* Create Axis2/C environment and options */
328 this->env
= axutil_env_create_all(IFMAP_LOGFILE
, AXIS2_LOG_LEVEL_TRACE
);
329 options
= axis2_options_create(this->env
);
331 /* Define the IF-MAP server as the to endpoint reference */
332 endpoint_ref
= axis2_endpoint_ref_create(this->env
, server
);
333 axis2_options_set_to(options
, this->env
, endpoint_ref
);
335 /* Create the axis2 service client */
336 this->svc_client
= axis2_svc_client_create(this->env
, client_home
);
337 if (!this->svc_client
)
339 DBG1(DBG_TNC
, "Error creating axis2 service client");
340 AXIS2_LOG_ERROR(this->env
->log
, AXIS2_LOG_SI
,
341 "Stub invoke FAILED: Error code: %d :: %s",
342 this->env
->error
->error_number
,
343 AXIS2_ERROR_GET_MESSAGE(this->env
->error
));
348 axis2_svc_client_set_options(this->svc_client
, this->env
, options
);
349 axis2_options_set_http_auth_info(options
, this->env
, username
, password
,
351 DBG1(DBG_TNC
, "connecting as MAP client '%s' to MAP server at '%s'",
354 DBG2(DBG_TNC
, "sending newSession");
355 if (!newSession(this))
357 DBG1(DBG_TNC
, "newSession with MAP server failed");
361 DBG2(DBG_TNC
, "sending purgePublisher");
362 if (!purgePublisher(this))
364 DBG1(DBG_TNC
, "purgePublisher with MAP server failed");
369 return &this->public;