summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Dauvergne <bdauvergne@entrouvert.com>2011-03-29 18:06:57 +0200
committerBenjamin Dauvergne <bdauvergne@entrouvert.com>2011-03-29 18:43:47 +0200
commitdac3f345adeb18c7f449da1a28314abedb8e3a16 (patch)
treecfe220e656ff66adb7ae5e4c67348eac979b51b2
parent8df7a0022c90b39ed2da8685d882a20d8d9b9c02 (diff)
downloadlasso-dac3f345adeb18c7f449da1a28314abedb8e3a16.tar.gz
lasso-dac3f345adeb18c7f449da1a28314abedb8e3a16.tar.xz
lasso-dac3f345adeb18c7f449da1a28314abedb8e3a16.zip
[saml2] add and internal method to load a federation metadata file
It only loads one kind of provider (idp or sp). It's currently impossible for a provider to have the two roles at the same time toward a given LassoServer object, i.e. the current service is a service provider or an identity provider, it cannot be the two at the same time.
-rw-r--r--lasso/saml-2.0/server.c51
-rw-r--r--lasso/saml-2.0/serverprivate.h1
2 files changed, 52 insertions, 0 deletions
diff --git a/lasso/saml-2.0/server.c b/lasso/saml-2.0/server.c
index 4c7a758f..84bc7ef4 100644
--- a/lasso/saml-2.0/server.c
+++ b/lasso/saml-2.0/server.c
@@ -22,11 +22,14 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <xmlsec/xmltree.h>
+
#include "../utils.h"
#include "../xml/private.h"
#include "serverprivate.h"
#include "../id-ff/serverprivate.h"
#include "../id-ff/providerprivate.h"
+#include "../xml/saml-2.0/saml2_xsd.h"
int
@@ -84,3 +87,51 @@ lasso_saml20_server_load_affiliation(LassoServer *server, xmlNode *node)
return 0;
}
+
+static gboolean
+_lasso_test_sp_descriptor(xmlNode *node) {
+ return xmlSecFindChild(node,
+ BAD_CAST LASSO_SAML2_METADATA_ELEMENT_SP_SSO_DESCRIPTOR,
+ BAD_CAST LASSO_SAML2_METADATA_HREF) != NULL;
+}
+
+static gboolean
+_lasso_test_idp_descriptor(xmlNode *node) {
+ return xmlSecFindChild(node,
+ BAD_CAST LASSO_SAML2_METADATA_ELEMENT_IDP_SSO_DESCRIPTOR,
+ BAD_CAST LASSO_SAML2_METADATA_HREF) != NULL;
+}
+
+lasso_error_t
+lasso_saml20_server_load_federation(LassoServer *server, LassoProviderRole role, xmlNode *root_node)
+{
+ xmlNode *child;
+ lasso_error_t rc = 0;
+
+ child = xmlSecGetNextElementNode(root_node->children);
+ /* first parse the providers... */
+ while (child) {
+ if (! xmlSecCheckNodeName(child,
+ BAD_CAST LASSO_SAML2_METADATA_ELEMENT_ENTITY_DESCRIPTOR,
+ BAD_CAST LASSO_SAML2_METADATA_HREF)) {
+ goto next;
+ }
+ if (role == LASSO_PROVIDER_ROLE_IDP && ! _lasso_test_idp_descriptor(child)) {
+ goto next;
+ }
+ if (role == LASSO_PROVIDER_ROLE_SP && ! _lasso_test_sp_descriptor(child)) {
+ goto next;
+ }
+ LassoProvider *provider;
+
+ provider = lasso_provider_new_from_xmlnode(role, child);
+ if (provider) {
+ char *name = g_strdup(provider->ProviderID);
+
+ g_hash_table_insert(server->providers, name, provider);
+ }
+next:
+ child = xmlSecGetNextElementNode(child->next);
+ }
+ return rc;
+}
diff --git a/lasso/saml-2.0/serverprivate.h b/lasso/saml-2.0/serverprivate.h
index 335a45dc..27d25716 100644
--- a/lasso/saml-2.0/serverprivate.h
+++ b/lasso/saml-2.0/serverprivate.h
@@ -33,6 +33,7 @@ extern "C" {
#include "../id-ff/server.h"
int lasso_saml20_server_load_affiliation(LassoServer *server, xmlNode *node);
+lasso_error_t lasso_saml20_server_load_federation(LassoServer *server, LassoProviderRole role, xmlNode *root_node);
#ifdef __cplusplus
}