1
/* $Id: logout_response.c,v 1.33 2004/09/04 10:36:32 fpeters Exp $
3
* Lasso - A free implementation of the Liberty Alliance specifications.
5
* Copyright (C) 2004 Entr'ouvert
6
* http://lasso.entrouvert.org
8
* Authors: Valery Febvre <vfebvre@easter-eggs.com>
9
* Nicolas Clapies <nclapies@entrouvert.com>
11
* This program is free software; you can redistribute it and/or modify
12
* it under the terms of the GNU General Public License as published by
13
* the Free Software Foundation; either version 2 of the License, or
14
* (at your option) any later version.
16
* This program is distributed in the hope that it will be useful,
17
* but WITHOUT ANY WARRANTY; without even the implied warranty of
18
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19
* GNU General Public License for more details.
21
* You should have received a copy of the GNU General Public License
22
* along with this program; if not, write to the Free Software
23
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26
#include <lasso/protocols/logout_response.h>
28
/*****************************************************************************/
30
/*****************************************************************************/
33
lasso_logout_response_get_status_code_value(LassoLogoutResponse *response)
35
LassoNode *status_code;
39
status_code = lasso_node_get_child(LASSO_NODE(response), "StatusCode",
41
if (status_code != NULL) {
42
value = lasso_node_get_attr_value(status_code, "Value", &err);
43
lasso_node_destroy(status_code);
45
message(G_LOG_LEVEL_WARNING, err->message);
54
message(G_LOG_LEVEL_WARNING, "No StatusCode element found in Response.\n");
59
/*****************************************************************************/
60
/* instance and class init functions */
61
/*****************************************************************************/
64
lasso_logout_response_instance_init(LassoLogoutResponse *response)
69
lasso_logout_response_class_init(LassoLogoutResponseClass *class)
73
GType lasso_logout_response_get_type() {
74
static GType this_type = 0;
77
static const GTypeInfo this_info = {
78
sizeof (LassoLogoutResponseClass),
81
(GClassInitFunc) lasso_logout_response_class_init,
84
sizeof(LassoLogoutResponse),
86
(GInstanceInitFunc) lasso_logout_response_instance_init,
89
this_type = g_type_register_static(LASSO_TYPE_LIB_LOGOUT_RESPONSE,
90
"LassoLogoutResponse",
97
lasso_logout_response_new(gchar *providerID,
98
const gchar *statusCodeValue,
100
lassoSignatureType sign_type,
101
lassoSignatureMethod sign_method)
103
LassoNode *response, *ss, *ssc;
104
xmlChar *inResponseTo, *request_providerID, *request_relayState;
107
response = LASSO_NODE(g_object_new(LASSO_TYPE_LOGOUT_RESPONSE, NULL));
109
/* Set ONLY required elements/attributes */
111
id = lasso_build_unique_id(32);
112
lasso_samlp_response_abstract_set_responseID(LASSO_SAMLP_RESPONSE_ABSTRACT(response),
113
(const xmlChar *)id);
116
lasso_samlp_response_abstract_set_majorVersion(LASSO_SAMLP_RESPONSE_ABSTRACT(response),
117
lassoLibMajorVersion);
119
lasso_samlp_response_abstract_set_minorVersion(LASSO_SAMLP_RESPONSE_ABSTRACT(response),
120
lassoLibMinorVersion);
122
time = lasso_get_current_time();
123
lasso_samlp_response_abstract_set_issueInstant(LASSO_SAMLP_RESPONSE_ABSTRACT(response),
124
(const xmlChar *)time);
127
/* set the signature template */
128
if (sign_type != lassoSignatureTypeNone) {
129
lasso_samlp_response_abstract_set_signature_tmpl(LASSO_SAMLP_RESPONSE_ABSTRACT(response),
135
lasso_lib_status_response_set_providerID(LASSO_LIB_STATUS_RESPONSE(response),
138
inResponseTo = lasso_node_get_attr_value(request, "RequestID", NULL);
139
lasso_samlp_response_abstract_set_inResponseTo(LASSO_SAMLP_RESPONSE_ABSTRACT(response),
141
xmlFree(inResponseTo);
143
request_providerID = lasso_node_get_child_content(request, "ProviderID", NULL, NULL);
144
lasso_samlp_response_abstract_set_recipient(LASSO_SAMLP_RESPONSE_ABSTRACT(response),
146
xmlFree(request_providerID);
148
request_relayState = lasso_node_get_child_content(request, "RelayState", NULL, NULL);
149
if (request_relayState != NULL) {
150
lasso_lib_status_response_set_relayState(LASSO_LIB_STATUS_RESPONSE(response),
152
xmlFree(request_relayState);
155
ss = lasso_samlp_status_new();
156
ssc = lasso_samlp_status_code_new();
157
lasso_samlp_status_code_set_value(LASSO_SAMLP_STATUS_CODE(ssc),
159
lasso_samlp_status_set_statusCode(LASSO_SAMLP_STATUS(ss),
160
LASSO_SAMLP_STATUS_CODE(ssc));
161
lasso_lib_status_response_set_status(LASSO_LIB_STATUS_RESPONSE(response),
162
LASSO_SAMLP_STATUS(ss));
163
lasso_node_destroy(ssc);
164
lasso_node_destroy(ss);
170
lasso_logout_response_new_from_dump(gchar *buffer)
174
response = LASSO_NODE(g_object_new(LASSO_TYPE_LOGOUT_RESPONSE, NULL));
175
lasso_node_import(response, buffer);
181
lasso_logout_response_new_from_query(gchar *query)
183
LassoNode *response, *ss, *ssc;
187
response = LASSO_NODE(g_object_new(LASSO_TYPE_LOGOUT_RESPONSE, NULL));
189
gd = lasso_query_to_dict(query);
191
g_object_unref(response);
196
str = lasso_g_ptr_array_index((GPtrArray *)g_datalist_get_data(&gd, "ResponseID"), 0);
198
g_datalist_clear(&gd);
199
g_object_unref(response);
202
lasso_samlp_response_abstract_set_responseID(LASSO_SAMLP_RESPONSE_ABSTRACT(response), str);
205
str = lasso_g_ptr_array_index((GPtrArray *)g_datalist_get_data(&gd, "MajorVersion"), 0);
207
g_datalist_clear(&gd);
208
g_object_unref(response);
211
lasso_samlp_response_abstract_set_majorVersion(LASSO_SAMLP_RESPONSE_ABSTRACT(response), str);
214
lasso_samlp_response_abstract_set_minorVersion(LASSO_SAMLP_RESPONSE_ABSTRACT(response),
215
lasso_g_ptr_array_index((GPtrArray *)g_datalist_get_data(&gd, "MinorVersion"), 0));
218
str = lasso_g_ptr_array_index((GPtrArray *)g_datalist_get_data(&gd, "IssueInstant"), 0);
220
g_datalist_clear(&gd);
221
g_object_unref(response);
224
lasso_samlp_response_abstract_set_issueInstant(LASSO_SAMLP_RESPONSE_ABSTRACT(response), str);
227
str = lasso_g_ptr_array_index((GPtrArray *)g_datalist_get_data(&gd, "InResponseTo"), 0);
229
g_datalist_clear(&gd);
230
g_object_unref(response);
233
lasso_samlp_response_abstract_set_inResponseTo(LASSO_SAMLP_RESPONSE_ABSTRACT(response), str);
236
str = lasso_g_ptr_array_index((GPtrArray *)g_datalist_get_data(&gd, "Recipient"), 0);
238
g_datalist_clear(&gd);
239
g_object_unref(response);
242
lasso_samlp_response_abstract_set_recipient(LASSO_SAMLP_RESPONSE_ABSTRACT(response), str);
245
str = lasso_g_ptr_array_index((GPtrArray *)g_datalist_get_data(&gd, "ProviderID"), 0);
247
g_datalist_clear(&gd);
248
g_object_unref(response);
251
lasso_lib_status_response_set_providerID(LASSO_LIB_STATUS_RESPONSE(response), str);
254
str = lasso_g_ptr_array_index((GPtrArray *)g_datalist_get_data(&gd, "Value"), 0);
256
g_datalist_clear(&gd);
257
g_object_unref(response);
260
ss = lasso_samlp_status_new();
261
ssc = lasso_samlp_status_code_new();
262
lasso_samlp_status_code_set_value(LASSO_SAMLP_STATUS_CODE(ssc),
264
lasso_samlp_status_set_statusCode(LASSO_SAMLP_STATUS(ss),
265
LASSO_SAMLP_STATUS_CODE(ssc));
266
lasso_lib_status_response_set_status(LASSO_LIB_STATUS_RESPONSE(response),
267
LASSO_SAMLP_STATUS(ss));
268
lasso_node_destroy(ssc);
269
lasso_node_destroy(ss);
273
str = lasso_g_ptr_array_index((GPtrArray *)g_datalist_get_data(&gd, "RelayState"), 0);
275
lasso_lib_status_response_set_relayState(LASSO_LIB_STATUS_RESPONSE(response), str);
277
g_datalist_clear(&gd);
283
lasso_logout_response_new_from_soap(gchar *buffer)
286
LassoNode *envelope, *lassoNode_response;
287
xmlNodePtr xmlNode_response;
288
LassoNodeClass *class;
290
response = LASSO_NODE(g_object_new(LASSO_TYPE_LOGOUT_RESPONSE, NULL));
292
envelope = lasso_node_new_from_dump(buffer);
293
if(envelope == NULL) {
294
message(G_LOG_LEVEL_WARNING, "Error while parsing the soap msg\n");
298
lassoNode_response = lasso_node_get_child(envelope, "LogoutResponse",
300
if(lassoNode_response == NULL) {
301
message(G_LOG_LEVEL_WARNING, "LogoutResponse node not found\n");
304
class = LASSO_NODE_GET_CLASS(lassoNode_response);
305
xmlNode_response = xmlCopyNode(class->get_xmlNode(LASSO_NODE(lassoNode_response)), 1);
306
lasso_node_destroy(lassoNode_response);
308
class = LASSO_NODE_GET_CLASS(response);
309
class->set_xmlNode(LASSO_NODE(response), xmlNode_response);
310
lasso_node_destroy(envelope);
316
lasso_logout_response_new_from_xml(gchar *buffer)
319
LassoNode *lassoNode_response;
320
xmlNodePtr xmlNode_response;
321
LassoNodeClass *class;
323
response = LASSO_NODE(g_object_new(LASSO_TYPE_LOGOUT_RESPONSE, NULL));
325
lassoNode_response = lasso_node_new_from_dump(buffer);
326
class = LASSO_NODE_GET_CLASS(lassoNode_response);
327
xmlNode_response = xmlCopyNode(class->get_xmlNode(LASSO_NODE(lassoNode_response)), 1);
328
class = LASSO_NODE_GET_CLASS(response);
329
class->set_xmlNode(LASSO_NODE(response), xmlNode_response);
330
lasso_node_destroy(lassoNode_response);
336
lasso_logout_response_new_from_export(gchar *buffer,
337
lassoNodeExportType export_type)
341
g_return_val_if_fail(buffer != NULL, NULL);
344
case lassoNodeExportTypeQuery:
345
response = lasso_logout_response_new_from_query(buffer);
347
case lassoNodeExportTypeSoap:
348
response = lasso_logout_response_new_from_soap(buffer);
350
case lassoNodeExportTypeXml:
351
response = lasso_logout_response_new_from_xml(buffer);
354
message(G_LOG_LEVEL_WARNING, "Invalid export type\n");