diff options
| author | Frederic Peters <fpeters@entrouvert.com> | 2006-11-15 23:31:29 +0000 |
|---|---|---|
| committer | Frederic Peters <fpeters@entrouvert.com> | 2006-11-15 23:31:29 +0000 |
| commit | 42d3e91a21822eb3266c81a589fa84cff8c9f103 (patch) | |
| tree | 9d333e4f68a84e001f97a7bfd669a76926a1fd1a | |
| parent | da904e0bb3e7ffb9c4ca04008d4decc10c3d8a0e (diff) | |
correctly looks up assertionconsumerservice url, even with just the binding
| -rw-r--r-- | lasso/saml-2.0/login.c | 13 | ||||
| -rw-r--r-- | lasso/saml-2.0/provider.c | 66 |
2 files changed, 77 insertions, 2 deletions
diff --git a/lasso/saml-2.0/login.c b/lasso/saml-2.0/login.c index 806332bb..cde0e30c 100644 --- a/lasso/saml-2.0/login.c +++ b/lasso/saml-2.0/login.c @@ -1038,6 +1038,7 @@ lasso_saml20_login_get_assertion_consumer_service_url(LassoLogin *login, LassoProvider *remote_provider) { LassoSamlp2AuthnRequest *request; + char *url = NULL; request = LASSO_SAMLP2_AUTHN_REQUEST(LASSO_PROFILE(login)->request); @@ -1046,11 +1047,19 @@ lasso_saml20_login_get_assertion_consumer_service_url(LassoLogin *login, } if (request->AssertionConsumerServiceIndex != -1 || request->ProtocolBinding == NULL) { - return lasso_saml20_provider_get_assertion_consumer_service_url(remote_provider, + url = lasso_saml20_provider_get_assertion_consumer_service_url(remote_provider, request->AssertionConsumerServiceIndex); } - message(G_LOG_LEVEL_WARNING, "can't find assertion consumer service url"); + if (url == NULL && request->ProtocolBinding) { + url = lasso_saml20_provider_get_assertion_consumer_service_url_by_binding( + remote_provider, request->ProtocolBinding); + } + + if (url == NULL) { + message(G_LOG_LEVEL_WARNING, + "can't find assertion consumer service url (going for default)"); + } return lasso_saml20_provider_get_assertion_consumer_service_url(remote_provider, -1); } diff --git a/lasso/saml-2.0/provider.c b/lasso/saml-2.0/provider.c index ced8a9e2..6c950d63 100644 --- a/lasso/saml-2.0/provider.c +++ b/lasso/saml-2.0/provider.c @@ -267,6 +267,72 @@ lasso_saml20_provider_get_assertion_consumer_service_url(LassoProvider *provider return NULL; } +static void +add_assertion_consumer_url_to_list(gchar *key, gpointer value, GList **list) +{ + if (strncmp(key, "AssertionConsumerService", 24) == 0) + *list = g_list_append(*list, key); +} + + +gchar* +lasso_saml20_provider_get_assertion_consumer_service_url_by_binding(LassoProvider *provider, + gchar *binding) +{ + GHashTable *descriptor; + GList *l = NULL, *r = NULL; + char *sid; + char *name; + char *binding_s; + const char *possible_bindings[] = { + "SOAP", "HTTP-Artifact", "HTTP-Post", "HTTP-POST", NULL + }; + int i; + int lname; + + descriptor = provider->private_data->SPDescriptor; + if (descriptor == NULL) + return NULL; + + if (strcmp(binding, LASSO_SAML2_METADATA_BINDING_SOAP) == 0) { + binding_s = "SOAP"; + } else if (strcmp(binding, LASSO_SAML2_METADATA_BINDING_REDIRECT) == 0) { + binding_s = "HTTP-Redirect"; + } else if (strcmp(binding, LASSO_SAML2_METADATA_BINDING_POST) == 0) { + binding_s = "HTTP-POST"; + } else if (strcmp(binding, LASSO_SAML2_METADATA_BINDING_ARTIFACT) == 0) { + binding_s = "HTTP-Artifact"; + } else if (strcmp(binding, LASSO_SAML2_METADATA_BINDING_PAOS) == 0) { + binding_s = "PAOS"; + } + + if (binding_s == NULL) { + return NULL; + } + + g_hash_table_foreach(descriptor, (GHFunc)add_assertion_consumer_url_to_list, &r); + + name = g_strdup_printf("AssertionConsumerService %s ", binding_s); + lname = strlen(name); + for (l = r; l; l = g_list_next(l)) { + char *b = l->data; + if (strncmp(name, b, lname) == 0) { + l = g_hash_table_lookup(descriptor, b); + break; + } + } + g_free(name); + g_list_free(r); + + if (l) { + return g_strdup(l->data); + } + + return NULL; +} + + + gchar* lasso_saml20_provider_get_assertion_consumer_service_binding(LassoProvider *provider, int service_id) |
