1
/* $Id: provider.c,v 1.45 2004/09/01 09:59:53 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: Nicolas Clapies <nclapies@entrouvert.com>
9
* Valery Febvre <vfebvre@easter-eggs.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/provider.h>
27
#include <lasso/xml/errors.h>
29
struct _LassoProviderPrivate
31
gboolean dispose_has_run;
34
static GObjectClass *parent_class = NULL;
36
/*****************************************************************************/
38
/*****************************************************************************/
41
lasso_provider_copy(LassoProvider *provider)
45
g_return_val_if_fail(LASSO_IS_PROVIDER(provider), NULL);
47
copy = LASSO_PROVIDER(g_object_new(LASSO_TYPE_PROVIDER, NULL));
48
copy->metadata = lasso_node_copy(provider->metadata);
49
copy->public_key = g_strdup(provider->public_key);
50
copy->ca_certificate = g_strdup(provider->ca_certificate);
56
lasso_provider_destroy(LassoProvider *provider)
58
g_object_unref(G_OBJECT(provider));
62
lasso_provider_dump(LassoProvider *provider)
64
LassoNode *provider_node, *metadata_node;
65
LassoNodeClass *provider_class;
68
provider_node = lasso_node_new();
70
/* set the public key, ca_certificate, metadata */
71
provider_class = LASSO_NODE_GET_CLASS(provider_node);
72
provider_class->set_name(provider_node, LASSO_PROVIDER_NODE);
73
provider_class->set_ns(provider_node, lassoLassoHRef, NULL);
75
metadata_node = lasso_node_copy(provider->metadata);
76
provider_class->add_child(provider_node, metadata_node, FALSE);
77
lasso_node_destroy(metadata_node);
78
if(provider->public_key != NULL) {
79
provider_class->set_prop(provider_node, LASSO_PROVIDER_PUBLIC_KEY_NODE,
80
provider->public_key);
82
if(provider->ca_certificate != NULL) {
83
provider_class->set_prop(provider_node, LASSO_PROVIDER_CA_CERTIFICATE_NODE,
84
provider->ca_certificate);
86
provider_dump = lasso_node_export(provider_node);
88
lasso_node_destroy(provider_node);
94
lasso_provider_get_metadata_value(LassoProvider *provider,
95
lassoProviderType provider_type,
100
LassoNode *descriptor;
101
GError *tmp_err = NULL;
102
gchar *result = NULL;
104
if (err != NULL && *err != NULL) {
105
g_set_error(err, g_quark_from_string("Lasso"),
106
LASSO_PARAM_ERROR_CHECK_FAILED,
107
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
108
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
110
if (LASSO_IS_PROVIDER(provider) == FALSE) {
111
g_set_error(err, g_quark_from_string("Lasso"),
112
LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ,
113
lasso_strerror(LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ));
114
g_return_val_if_fail(LASSO_IS_PROVIDER(provider), NULL);
117
g_set_error(err, g_quark_from_string("Lasso"),
118
LASSO_PARAM_ERROR_INVALID_VALUE,
119
lasso_strerror(LASSO_PARAM_ERROR_INVALID_VALUE));
120
g_return_val_if_fail(name != NULL, NULL);
123
switch (provider_type) {
124
case lassoProviderTypeSp:
125
descriptor = lasso_node_get_child(provider->metadata,
126
"SPDescriptor", NULL, &tmp_err);
128
case lassoProviderTypeIdp:
129
descriptor = lasso_node_get_child(provider->metadata,
130
"IDPDescriptor", NULL, &tmp_err);
136
if (descriptor == NULL) {
137
g_propagate_error (err, tmp_err);
141
content = lasso_node_get_child_content(descriptor, name, NULL, &tmp_err);
142
lasso_node_destroy(descriptor);
144
if (content == NULL) {
145
g_propagate_error (err, tmp_err);
147
result = g_strdup(g_strstrip(content));
155
lasso_provider_get_assertionConsumerServiceURL(LassoProvider *provider,
156
lassoProviderType provider_type,
160
GError *tmp_err = NULL;
162
if (err != NULL && *err != NULL) {
163
g_set_error(err, g_quark_from_string("Lasso"),
164
LASSO_PARAM_ERROR_CHECK_FAILED,
165
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
166
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
169
value = lasso_provider_get_metadata_value(provider,
171
"AssertionConsumerServiceURL",
174
g_propagate_error (err, tmp_err);
181
lasso_provider_get_authnRequestsSigned(LassoProvider *provider,
185
GError *tmp_err = NULL;
187
if (err != NULL && *err != NULL) {
188
g_set_error(err, g_quark_from_string("Lasso"),
189
LASSO_PARAM_ERROR_CHECK_FAILED,
190
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
191
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
194
value = lasso_provider_get_metadata_value(provider,
196
"AuthnRequestsSigned",
199
g_propagate_error (err, tmp_err);
206
lasso_provider_get_federationTerminationNotificationProtocolProfile(LassoProvider *provider,
207
lassoProviderType provider_type,
211
GError *tmp_err = NULL;
213
if (err != NULL && *err != NULL) {
214
g_set_error(err, g_quark_from_string("Lasso"),
215
LASSO_PARAM_ERROR_CHECK_FAILED,
216
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
217
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
220
value = lasso_provider_get_metadata_value(provider,
222
"FederationTerminationNotificationProtocolProfile",
225
g_propagate_error (err, tmp_err);
232
lasso_provider_get_federationTerminationServiceReturnURL(LassoProvider *provider,
233
lassoProviderType provider_type,
237
GError *tmp_err = NULL;
239
if (err != NULL && *err != NULL) {
240
g_set_error(err, g_quark_from_string("Lasso"),
241
LASSO_PARAM_ERROR_CHECK_FAILED,
242
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
243
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
246
value = lasso_provider_get_metadata_value(provider,
248
"FederationTerminationServiceReturnURL",
251
g_propagate_error (err, tmp_err);
258
lasso_provider_get_federationTerminationServiceURL(LassoProvider *provider,
259
lassoProviderType provider_type,
263
GError *tmp_err = NULL;
265
if (err != NULL && *err != NULL) {
266
g_set_error(err, g_quark_from_string("Lasso"),
267
LASSO_PARAM_ERROR_CHECK_FAILED,
268
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
269
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
272
value = lasso_provider_get_metadata_value(provider,
274
"FederationTerminationServiceURL",
277
g_propagate_error (err, tmp_err);
284
lasso_provider_get_nameIdentifierMappingProtocolProfile(LassoProvider *provider,
285
lassoProviderType provider_type,
289
GError *tmp_err = NULL;
291
if (err != NULL && *err != NULL) {
292
g_set_error(err, g_quark_from_string("Lasso"),
293
LASSO_PARAM_ERROR_CHECK_FAILED,
294
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
295
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
298
value = lasso_provider_get_metadata_value(provider,
300
"NameIdentifierMappingProtocolProfile",
303
g_propagate_error (err, tmp_err);
310
lasso_provider_get_providerID(LassoProvider *provider)
312
LassoNode *descriptor;
316
descriptor = lasso_node_get_child(provider->metadata,
317
"EntityDescriptor", NULL, &err);
318
if (descriptor == NULL) {
319
message(G_LOG_LEVEL_CRITICAL, err->message);
324
value = lasso_node_get_attr_value(descriptor, "providerID", &err);
325
lasso_node_destroy(descriptor);
328
/* providerID attr is required */
329
message(G_LOG_LEVEL_CRITICAL, err->message);
337
lasso_provider_get_registerNameIdentifierProtocolProfile(LassoProvider *provider,
338
lassoProviderType provider_type,
342
GError *tmp_err = NULL;
344
if (err != NULL && *err != NULL) {
345
g_set_error(err, g_quark_from_string("Lasso"),
346
LASSO_PARAM_ERROR_CHECK_FAILED,
347
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
348
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
351
value = lasso_provider_get_metadata_value(provider,
353
"RegisterNameIdentifierProtocolProfile",
356
g_propagate_error (err, tmp_err);
363
lasso_provider_get_registerNameIdentifierServiceURL(LassoProvider *provider,
364
lassoProviderType provider_type,
368
GError *tmp_err = NULL;
370
if (err != NULL && *err != NULL) {
371
g_set_error(err, g_quark_from_string("Lasso"),
372
LASSO_PARAM_ERROR_CHECK_FAILED,
373
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
374
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
377
value = lasso_provider_get_metadata_value(provider,
379
"RegisterNameIdentifierServiceURL",
382
g_propagate_error (err, tmp_err);
389
lasso_provider_get_singleSignOnProtocolProfile(LassoProvider *provider,
393
GError *tmp_err = NULL;
395
if (err != NULL && *err != NULL) {
396
g_set_error(err, g_quark_from_string("Lasso"),
397
LASSO_PARAM_ERROR_CHECK_FAILED,
398
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
399
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
402
value = lasso_provider_get_metadata_value(provider,
403
lassoProviderTypeIdp,
404
"SingleSignOnProtocolProfile",
406
if (tmp_err != NULL) {
407
g_propagate_error (err, tmp_err);
414
lasso_provider_get_singleSignOnServiceURL(LassoProvider *provider,
418
GError *tmp_err = NULL;
420
if (err != NULL && *err != NULL) {
421
g_set_error(err, g_quark_from_string("Lasso"),
422
LASSO_PARAM_ERROR_CHECK_FAILED,
423
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
424
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
427
value = lasso_provider_get_metadata_value(provider,
428
lassoProviderTypeIdp,
429
"SingleSignOnServiceURL",
431
if (tmp_err != NULL) {
432
g_propagate_error (err, tmp_err);
439
lasso_provider_get_singleLogoutProtocolProfile(LassoProvider *provider,
440
lassoProviderType provider_type,
444
GError *tmp_err = NULL;
446
if (err != NULL && *err != NULL) {
447
g_set_error(err, g_quark_from_string("Lasso"),
448
LASSO_PARAM_ERROR_CHECK_FAILED,
449
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
450
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
453
value = lasso_provider_get_metadata_value(provider,
455
"SingleLogoutProtocolProfile",
458
g_propagate_error (err, tmp_err);
465
lasso_provider_get_singleLogoutServiceURL(LassoProvider *provider,
466
lassoProviderType provider_type,
470
GError *tmp_err = NULL;
472
if (err != NULL && *err != NULL) {
473
g_set_error(err, g_quark_from_string("Lasso"),
474
LASSO_PARAM_ERROR_CHECK_FAILED,
475
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
476
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
479
value = lasso_provider_get_metadata_value(provider,
481
"SingleLogoutServiceURL",
484
g_propagate_error (err, tmp_err);
491
lasso_provider_get_singleLogoutServiceReturnURL(LassoProvider *provider,
492
lassoProviderType provider_type,
496
GError *tmp_err = NULL;
498
if (err != NULL && *err != NULL) {
499
g_set_error(err, g_quark_from_string("Lasso"),
500
LASSO_PARAM_ERROR_CHECK_FAILED,
501
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
502
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
505
value = lasso_provider_get_metadata_value(provider,
507
"SingleLogoutServiceReturnURL",
510
g_propagate_error (err, tmp_err);
517
lasso_provider_get_soapEndpoint(LassoProvider *provider,
518
lassoProviderType provider_type,
522
GError *tmp_err = NULL;
524
if (err != NULL && *err != NULL) {
525
g_set_error(err, g_quark_from_string("Lasso"),
526
LASSO_PARAM_ERROR_CHECK_FAILED,
527
lasso_strerror(LASSO_PARAM_ERROR_CHECK_FAILED));
528
g_return_val_if_fail (err == NULL || *err == NULL, NULL);
531
value = lasso_provider_get_metadata_value(provider,
536
g_propagate_error (err, tmp_err);
543
lasso_provider_set_public_key(LassoProvider *provider,
546
provider->public_key = g_strdup(public_key);
550
lasso_provider_set_ca_certificate(LassoProvider *provider,
551
gchar *ca_certificate)
553
provider->ca_certificate = g_strdup(ca_certificate);
556
/*****************************************************************************/
557
/* private methods */
558
/*****************************************************************************/
560
static gchar *lasso_provider_get_direct_child_content(LassoProvider *provider,
566
node = lasso_node_get_child(LASSO_NODE(provider), name, NULL, NULL);
570
content = lasso_node_get_content(node, NULL);
571
lasso_node_destroy(node);
576
/*****************************************************************************/
577
/* overrided parent class methods */
578
/*****************************************************************************/
581
lasso_provider_dispose(LassoProvider *provider)
583
if (provider->private->dispose_has_run) {
586
provider->private->dispose_has_run = TRUE;
588
debug("Provider object 0x%x disposed ...\n", provider);
590
/* unref reference counted objects */
591
lasso_node_destroy(provider->metadata);
593
parent_class->dispose(G_OBJECT(provider));
597
lasso_provider_finalize(LassoProvider *provider)
599
debug("Provider object 0x%x finalized ...\n", provider);
601
g_free(provider->public_key);
602
g_free(provider->ca_certificate);
603
g_free(provider->private);
605
parent_class->finalize(G_OBJECT(provider));
608
/*****************************************************************************/
609
/* instance and class init functions */
610
/*****************************************************************************/
613
lasso_provider_instance_init(LassoProvider *provider)
615
provider->private = g_new (LassoProviderPrivate, 1);
616
provider->private->dispose_has_run = FALSE;
617
provider->metadata = NULL;
618
provider->public_key = NULL;
619
provider->ca_certificate = NULL;
623
lasso_provider_class_init(LassoProviderClass *class) {
624
GObjectClass *gobject_class = G_OBJECT_CLASS(class);
626
parent_class = g_type_class_peek_parent(class);
627
/* override parent class methods */
628
gobject_class->dispose = (void *)lasso_provider_dispose;
629
gobject_class->finalize = (void *)lasso_provider_finalize;
632
GType lasso_provider_get_type() {
633
static GType this_type = 0;
636
static const GTypeInfo this_info = {
637
sizeof (LassoProviderClass),
640
(GClassInitFunc) lasso_provider_class_init,
643
sizeof(LassoProvider),
645
(GInstanceInitFunc) lasso_provider_instance_init,
648
this_type = g_type_register_static(G_TYPE_OBJECT,
656
lasso_provider_new(gchar *metadata,
658
gchar *ca_certificate)
660
LassoProvider *provider;
662
provider = lasso_provider_new_metadata_filename(metadata);
663
if (provider != NULL) {
664
provider->public_key = g_strdup(public_key);
665
provider->ca_certificate = g_strdup(ca_certificate);
673
lasso_provider_new_from_metadata_node(LassoNode *metadata_node)
675
LassoProvider *provider;
677
provider = LASSO_PROVIDER(g_object_new(LASSO_TYPE_PROVIDER, NULL));
678
provider->metadata = lasso_node_copy(metadata_node);
684
lasso_provider_new_metadata_filename(gchar *metadata_filename)
686
LassoProvider *provider = NULL;
690
doc = xmlParseFile(metadata_filename);
692
/* get root element of doc and duplicate it */
693
root = xmlCopyNode(xmlDocGetRootElement(doc), 1);
696
provider = LASSO_PROVIDER(g_object_new(LASSO_TYPE_PROVIDER, NULL));
697
provider->metadata = lasso_node_new();
698
LASSO_NODE_GET_CLASS(provider->metadata)->set_xmlNode(provider->metadata, root);
701
message(G_LOG_LEVEL_CRITICAL,
702
"Failed to build LassoProvider: invalid metadata file.\n");