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 * Axis2c service client
49 axis2_svc_client_t
* svc_client
;
53 static axiom_node_t
* build_request(private_tnc_ifmap_listener_t
*this)
55 axiom_node_t
*node
= NULL
;
57 axiom_namespace_t
*ns
;
59 ns
= axiom_namespace_create(this->env
, IFMAP_NAMESPACE
, "ifmap");
60 el
= axiom_element_create(this->env
, NULL
, "newSession", ns
, &node
);
65 METHOD(listener_t
, child_updown
, bool,
66 private_tnc_ifmap_listener_t
*this, ike_sa_t
*ike_sa
, child_sa_t
*child_sa
,
69 traffic_selector_t
*my_ts
, *other_ts
;
70 enumerator_t
*enumerator
;
72 host_t
*vip
, *me
, *other
;
74 config
= child_sa
->get_config(child_sa
);
75 vip
= ike_sa
->get_virtual_ip(ike_sa
, TRUE
);
76 me
= ike_sa
->get_my_host(ike_sa
);
77 other
= ike_sa
->get_other_host(ike_sa
);
82 METHOD(tnc_ifmap_listener_t
, destroy
, void,
83 private_tnc_ifmap_listener_t
*this)
87 axis2_svc_client_free(this->svc_client
, this->env
);
91 axutil_env_free(this->env
);
99 tnc_ifmap_listener_t
*tnc_ifmap_listener_create()
101 private_tnc_ifmap_listener_t
*this;
102 axis2_char_t
*server
, *client_home
, *username
, *password
, *auth_type
;
103 axis2_endpoint_ref_t
* endpoint_ref
= NULL
;
104 axis2_options_t
*options
= NULL
;
105 axiom_node_t
*request
, *response
, *node
;
108 client_home
= lib
->settings
->get_str(lib
->settings
,
109 "charon.plugins.tnc-ifmap.client_home",
110 AXIS2_GETENV("AXIS2C_HOME"));
111 server
= lib
->settings
->get_str(lib
->settings
,
112 "charon.plugins.tnc-ifmap.server", IFMAP_SERVER
);
113 auth_type
= lib
->settings
->get_str(lib
->settings
,
114 "charon.plugins.tnc-ifmap.auth_type", "Basic");
115 username
= lib
->settings
->get_str(lib
->settings
,
116 "charon.plugins.tnc-ifmap.username", NULL
);
117 password
= lib
->settings
->get_str(lib
->settings
,
118 "charon.plugins.tnc-ifmap.password", NULL
);
120 if (!username
|| !password
)
122 DBG1(DBG_TNC
, "IF-MAP client %s%s%s not defined",
123 (!username
) ?
"username" : "",
124 (!username
&& ! password
) ?
" and " : "",
125 (!password
) ?
"password" : "");
131 .child_updown
= _child_updown
,
137 /* Create Axis2/C environment and options */
138 this->env
= axutil_env_create_all(IFMAP_LOGFILE
, AXIS2_LOG_LEVEL_TRACE
);
139 options
= axis2_options_create(this->env
);
141 /* Define the IF-MAP server as the to endpoint reference */
142 endpoint_ref
= axis2_endpoint_ref_create(this->env
, server
);
143 axis2_options_set_to(options
, this->env
, endpoint_ref
);
145 /* Create the axis2 service client */
146 this->svc_client
= axis2_svc_client_create(this->env
, client_home
);
147 if (!this->svc_client
)
149 DBG1(DBG_TNC
, "Error creating axis2 service client");
150 AXIS2_LOG_ERROR(this->env
->log
, AXIS2_LOG_SI
,
151 "Stub invoke FAILED: Error code: %d :: %s",
152 this->env
->error
->error_number
,
153 AXIS2_ERROR_GET_MESSAGE(this->env
->error
));
158 axis2_svc_client_set_options(this->svc_client
, this->env
, options
);
159 axis2_options_set_http_auth_info(options
, this->env
, username
, password
,
162 request
= build_request(this);
163 response
= axis2_svc_client_send_receive(this->svc_client
, this->env
, request
);
166 DBG1(DBG_TNC
, "Session setup with IF-MAP server failed");
170 node
= axiom_node_get_first_child(response
, this->env
);
171 if (node
&& axiom_node_get_node_type(node
, this->env
) == AXIOM_TEXT
)
173 text
= (axiom_text_t
*)axiom_node_get_data_element(node
, this->env
);
176 DBG1(DBG_TNC
, "response = '%s'",
177 axiom_text_get_value(text
, this->env
));
180 axiom_node_free_tree(response
, this->env
);
182 return &this->public;