summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--bindings/overrides.xml1
-rw-r--r--lasso/id-ff/server.c6
-rw-r--r--lasso/id-ff/server.h2
-rw-r--r--lasso/saml-2.0/server.c12
-rw-r--r--lasso/saml-2.0/serverprivate.h2
-rw-r--r--tests/basic_tests.c8
6 files changed, 24 insertions, 7 deletions
diff --git a/bindings/overrides.xml b/bindings/overrides.xml
index 19c92a46..4d3fc62c 100644
--- a/bindings/overrides.xml
+++ b/bindings/overrides.xml
@@ -172,6 +172,7 @@
<func name="lasso_provider_new_from_dump" skip="java"/>
<!-- LassoServer -->
<func name="lasso_server_get_provider" return_owner="false" />
+ <func name="lasso_server_load_federation" skip="perl,java" />
<!-- IdWsf -->
<arg name="abstract" rename="abstract_" language="java"/>
<func name="lasso_personal_profile_service_new_full" rename="lasso_personal_profile_server_new_personal_profile_service_full"/>
diff --git a/lasso/id-ff/server.c b/lasso/id-ff/server.c
index 55bf772b..c398b3f6 100644
--- a/lasso/id-ff/server.c
+++ b/lasso/id-ff/server.c
@@ -758,6 +758,8 @@ lasso_server_get_encryption_private_key(LassoServer *server)
* on the metadata files (optional)
* @blacklisted_entity_ids:(allow-none)(element-type string): a list of EntityID which should not be
* loaded, can be NULL.
+ * @loaded_entity_ids:(transfer full)(element-type string)(allow-none): an output parameter for the
+ * list of the loaded EntityID, can be NULL.
*
* Load all the SAML 2.0 entities from @federation_file which contain a declaration for @role. If
* @trusted_roots is non-NULL, use it to check a signature on the metadata file.
@@ -775,7 +777,7 @@ lasso_server_get_encryption_private_key(LassoServer *server)
*/
lasso_error_t
lasso_server_load_federation(LassoServer *server, LassoProviderRole role, const gchar *federation_metadata, const gchar
- *trusted_roots, GList *blacklisted_entity_ids)
+ *trusted_roots, GList *blacklisted_entity_ids, GList **loaded_entity_ids)
{
xmlDoc *doc = NULL;
xmlNode *root = NULL;
@@ -808,7 +810,7 @@ lasso_server_load_federation(LassoServer *server, LassoProviderRole role, const
}
/* TODO: branch to the SAML2 version of this function */
if (lasso_strisequal((char*)root->ns->href, LASSO_SAML2_METADATA_HREF)) {
- lasso_check_good_rc(lasso_saml20_server_load_federation(server, role, root, blacklisted_entity_ids));
+ lasso_check_good_rc(lasso_saml20_server_load_federation(server, role, root, blacklisted_entity_ids, loaded_entity_ids));
} else {
/* TODO: iterate SPDescriptor and IDPDescriptor, choose which one to parse by looking at the role enum.
* */
diff --git a/lasso/id-ff/server.h b/lasso/id-ff/server.h
index 75abd438..77939cd8 100644
--- a/lasso/id-ff/server.h
+++ b/lasso/id-ff/server.h
@@ -104,7 +104,7 @@ LASSO_EXPORT lasso_error_t lasso_server_set_encryption_private_key_with_password
const gchar *filename_or_buffer, const gchar *password);
LASSO_EXPORT lasso_error_t lasso_server_load_federation(LassoServer *server, LassoProviderRole role,
- const gchar *federation_file, const gchar *trusted_roots, GList *blacklisted_entity_ids);
+ const gchar *federation_file, const gchar *trusted_roots, GList *blacklisted_entity_ids, GList **loaded_entity_ids);
#ifdef __cplusplus
}
diff --git a/lasso/saml-2.0/server.c b/lasso/saml-2.0/server.c
index 9b750701..cf105b89 100644
--- a/lasso/saml-2.0/server.c
+++ b/lasso/saml-2.0/server.c
@@ -103,10 +103,12 @@ _lasso_test_idp_descriptor(xmlNode *node) {
}
lasso_error_t
-lasso_saml20_server_load_federation(LassoServer *server, LassoProviderRole role, xmlNode *root_node, GList *blacklisted_entity_ids)
+lasso_saml20_server_load_federation(LassoServer *server, LassoProviderRole role, xmlNode *root_node, GList *blacklisted_entity_ids, GList **loaded_entity_ids)
{
xmlNode *child;
lasso_error_t rc = 0;
+ GList loaded = { .data = NULL, .next = NULL };
+ GList *loaded_end = &loaded;
child = xmlSecGetNextElementNode(root_node->children);
/* first parse the providers... */
@@ -134,10 +136,18 @@ lasso_saml20_server_load_federation(LassoServer *server, LassoProviderRole role,
lasso_release_gobject(provider);
goto next;
}
+ if (loaded_entity_ids) {
+ loaded_end->next = g_new0(GList, 1);
+ loaded_end->next->data = g_strdup(name);
+ loaded_end = loaded_end->next;
+ }
g_hash_table_insert(server->providers, name, provider);
}
next:
child = xmlSecGetNextElementNode(child->next);
}
+ if (loaded_entity_ids) {
+ *loaded_entity_ids = loaded.next;
+ }
return rc;
}
diff --git a/lasso/saml-2.0/serverprivate.h b/lasso/saml-2.0/serverprivate.h
index bb2838be..674ef6b5 100644
--- a/lasso/saml-2.0/serverprivate.h
+++ b/lasso/saml-2.0/serverprivate.h
@@ -34,7 +34,7 @@ extern "C" {
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, GList *blacklisted_entity_ids);
+ xmlNode *root_node, GList *blacklisted_entity_ids, GList **loaded_entity_ids);
#ifdef __cplusplus
}
diff --git a/tests/basic_tests.c b/tests/basic_tests.c
index 9eaabf9a..6d1ae89c 100644
--- a/tests/basic_tests.c
+++ b/tests/basic_tests.c
@@ -1945,6 +1945,7 @@ END_TEST
START_TEST(test13_test_lasso_server_load_federation)
{
LassoServer *server = NULL;
+ GList *loaded_entity_ids = NULL;
char *metadata_content;
GList blacklisted_1 = { .data = "https://identities.univ-jfc.fr/idp/prod", .next = NULL };
@@ -1956,8 +1957,11 @@ START_TEST(test13_test_lasso_server_load_federation)
check_true(g_file_get_contents(TESTSDATADIR "/renater-metadata.xml", &metadata_content,
NULL, NULL));
check_good_rc(lasso_server_load_federation(server, LASSO_PROVIDER_ROLE_IDP,
- metadata_content, TESTSDATADIR "/metadata-federation-renater.crt", &blacklisted_1));
- check_true(g_hash_table_size(server->providers) == 101);
+ metadata_content, TESTSDATADIR "/metadata-federation-renater.crt",
+ &blacklisted_1, &loaded_entity_ids));
+ check_equals(g_hash_table_size(server->providers), 101);
+ check_equals(g_list_length(loaded_entity_ids), 101);
+
lasso_release_string(metadata_content);
lasso_release_gobject(server);
}