summaryrefslogtreecommitdiffstats
path: root/lasso/id-ff
diff options
context:
space:
mode:
authorBenjamin Dauvergne <bdauvergne@entrouvert.com>2011-03-29 18:13:36 +0200
committerBenjamin Dauvergne <bdauvergne@entrouvert.com>2011-03-29 18:43:48 +0200
commitf840037c6a89587958c570ed44f87bc1b35e8ce3 (patch)
tree8eab906e7e45a52aa5a627028563d780f1164ddd /lasso/id-ff
parentdac3f345adeb18c7f449da1a28314abedb8e3a16 (diff)
downloadlasso-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.c53
-rw-r--r--lasso/id-ff/provider.h3
-rw-r--r--lasso/id-ff/providerprivate.h2
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
}