summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Peters <fpeters@entrouvert.com>2006-11-15 23:31:29 +0000
committerFrederic Peters <fpeters@entrouvert.com>2006-11-15 23:31:29 +0000
commit42d3e91a21822eb3266c81a589fa84cff8c9f103 (patch)
tree9d333e4f68a84e001f97a7bfd669a76926a1fd1a
parentda904e0bb3e7ffb9c4ca04008d4decc10c3d8a0e (diff)
correctly looks up assertionconsumerservice url, even with just the binding
-rw-r--r--lasso/saml-2.0/login.c13
-rw-r--r--lasso/saml-2.0/provider.c66
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)