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 @@ + 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); }