diff options
| author | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2011-03-29 18:13:36 +0200 |
|---|---|---|
| committer | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2011-03-29 18:43:48 +0200 |
| commit | f840037c6a89587958c570ed44f87bc1b35e8ce3 (patch) | |
| tree | 8eab906e7e45a52aa5a627028563d780f1164ddd /lasso/id-ff | |
| parent | dac3f345adeb18c7f449da1a28314abedb8e3a16 (diff) | |
| download | lasso-f840037c6a89587958c570ed44f87bc1b35e8ce3.tar.gz lasso-f840037c6a89587958c570ed44f87bc1b35e8ce3.tar.xz lasso-f840037c6a89587958c570ed44f87bc1b35e8ce3.zip | |
[core] add a private constructor to build LassoProvider object from an xmlNode
I'm not sure of the need outside lasso so I will let this method private
for the moment. It's an helper method for the
lasso_server_load_federation method which traverses an
EntitiesDescriptor node to find all the EntityDescriptor contained
inside.
Diffstat (limited to 'lasso/id-ff')
| -rw-r--r-- | lasso/id-ff/provider.c | 53 | ||||
| -rw-r--r-- | lasso/id-ff/provider.h | 3 | ||||
| -rw-r--r-- | lasso/id-ff/providerprivate.h | 2 |
3 files changed, 41 insertions, 17 deletions
diff --git a/lasso/id-ff/provider.c b/lasso/id-ff/provider.c index 23f54eee..28763a8c 100644 --- a/lasso/id-ff/provider.c +++ b/lasso/id-ff/provider.c @@ -90,7 +90,7 @@ char *protocol_methods[LASSO_HTTP_METHOD_LAST] = { "", "-http", "-soap" }; -static gboolean _lasso_provider_load_metadata_from_doc(LassoProvider *provider, xmlDoc *doc); +static gboolean _lasso_provider_load_metadata_from_xmlnode(LassoProvider *provider, xmlNode *node); static int _lasso_provider_get_role_index(LassoProviderRole role); void _lasso_provider_add_metadata_value_for_role(LassoProvider *provider, LassoProviderRole role, const char *name, const char *value); @@ -974,6 +974,7 @@ gboolean _lasso_provider_load_metadata_from_buffer(LassoProvider *provider, const gchar *metadata, int length) { xmlDoc *doc; + xmlNode *node; gboolean rc = TRUE; lasso_return_val_if_fail(LASSO_IS_PROVIDER(provider), FALSE); @@ -984,7 +985,8 @@ _lasso_provider_load_metadata_from_buffer(LassoProvider *provider, const gchar * if (doc == NULL) { return FALSE; } - goto_cleanup_if_fail_with_rc (_lasso_provider_load_metadata_from_doc(provider, doc), FALSE); + node = xmlDocGetRootElement(doc); + goto_cleanup_if_fail_with_rc (_lasso_provider_load_metadata_from_xmlnode(provider, node), FALSE); lasso_assign_string(provider->metadata_filename, metadata); cleanup: lasso_release_doc(doc); @@ -1031,28 +1033,23 @@ lasso_provider_load_metadata(LassoProvider *provider, const gchar *path) } static gboolean -_lasso_provider_load_metadata_from_doc(LassoProvider *provider, xmlDoc *doc) +_lasso_provider_load_metadata_from_xmlnode(LassoProvider *provider, xmlNode *node) { + xmlDoc *doc = NULL; xmlXPathContext *xpathCtx; xmlXPathObject *xpathObj; - xmlNode *node; const char *xpath_idp = "/md:EntityDescriptor/md:IDPDescriptor"; const char *xpath_sp = "/md:EntityDescriptor/md:SPDescriptor"; const char *xpath_organization = "/md:EntityDescriptor/md:Organization"; xmlChar *providerID = NULL; g_return_val_if_fail(LASSO_IS_PROVIDER(provider), FALSE); - if (doc == NULL) { - warning("Metadata is not an XML document"); - return FALSE; - } - - node = xmlDocGetRootElement(doc); - if (node == NULL || node->ns == NULL) { - message (G_LOG_LEVEL_CRITICAL, "lasso_provider_load_metadata_from_doc: no root element"); - return FALSE; - } + g_return_val_if_fail(node != NULL && node->ns != NULL, FALSE); + g_return_val_if_fail (node->doc != NULL, FALSE); + /* In the future it could be necessary to handle node without a document, and to create one + * to hold them. */ + doc = node->doc; if (strcmp((char*)node->ns->href, LASSO_SAML2_METADATA_HREF) == 0) { gboolean result; @@ -1074,7 +1071,7 @@ _lasso_provider_load_metadata_from_doc(LassoProvider *provider, xmlDoc *doc) xpathObj = xmlXPathEvalExpression( (xmlChar*)"/md11:SPDescriptor|/md11:IDPDescriptor", xpathCtx); if (xpathObj->nodesetval == NULL || xpathObj->nodesetval->nodeNr == 0) { - message (G_LOG_LEVEL_CRITICAL, "lasso_saml20_provider_load_metadata_from_doc: no md12:EntityDescriptor or md11:SPDesriptor or md11:IDPDescriptor"); + message (G_LOG_LEVEL_CRITICAL, "lasso_saml20_provider_load_metadata_from_xmlnode: no md12:EntityDescriptor or md11:SPDesriptor or md11:IDPDescriptor"); xmlXPathFreeObject(xpathObj); xmlXPathFreeContext(xpathCtx); return FALSE; @@ -1725,3 +1722,29 @@ lasso_provider_match_conformance(LassoProvider *provider, LassoProvider *another return (conformance1 & conformance2) != 0; } + +LassoProvider* +lasso_provider_new_from_xmlnode(LassoProviderRole role, xmlNode *node) { + LassoProvider *provider = NULL, *ret = NULL; + + provider = (LassoProvider*)g_object_new(LASSO_TYPE_PROVIDER, NULL); + provider->role = role; + goto_cleanup_if_fail(_lasso_provider_load_metadata_from_xmlnode(provider, node)); + + if (!lasso_provider_load_public_key(provider, LASSO_PUBLIC_KEY_SIGNING)) { + message(G_LOG_LEVEL_WARNING, "Could not load public signing key of %s", + provider->ProviderID); + goto cleanup; + } + if (!lasso_provider_load_public_key(provider, LASSO_PUBLIC_KEY_ENCRYPTION)) { + message(G_LOG_LEVEL_WARNING, "Could not load public encryption key of %s", + provider->ProviderID); + goto cleanup; + } + + provider->private_data->encryption_mode = LASSO_ENCRYPTION_MODE_NONE; + lasso_transfer_gobject(ret, provider); +cleanup: + lasso_release_gobject(provider); + return ret; +} diff --git a/lasso/id-ff/provider.h b/lasso/id-ff/provider.h index c3566c00..3c66541e 100644 --- a/lasso/id-ff/provider.h +++ b/lasso/id-ff/provider.h @@ -134,7 +134,8 @@ typedef enum { LASSO_PROVIDER_ROLE_AUTHN_AUTHORITY = 4, LASSO_PROVIDER_ROLE_AUTHZ_AUTHORITY = 8, LASSO_PROVIDER_ROLE_ATTRIBUTE_AUTHORITY = 16, - LASSO_PROVIDER_ROLE_LAST = 17 + LASSO_PROVIDER_ROLE_LAST = 17, + LASSO_PROVIDER_ROLE_ALL = 31 } LassoProviderRole; diff --git a/lasso/id-ff/providerprivate.h b/lasso/id-ff/providerprivate.h index 1adce734..2c8d7139 100644 --- a/lasso/id-ff/providerprivate.h +++ b/lasso/id-ff/providerprivate.h @@ -94,7 +94,7 @@ int lasso_provider_verify_query_signature(LassoProvider *provider, const char *m void _lasso_provider_load_key_descriptor(LassoProvider *provider, xmlNode *key_descriptor); void _lasso_provider_add_metadata_value_for_role(LassoProvider *provider, LassoProviderRole role, const char *name, const char *value); - +LassoProvider* lasso_provider_new_from_xmlnode(LassoProviderRole role, xmlNode *node); #ifdef __cplusplus } |
