summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederic Peters <fpeters@entrouvert.com>2006-10-29 12:27:36 +0000
committerFrederic Peters <fpeters@entrouvert.com>2006-10-29 12:27:36 +0000
commit42f573a9fcb1ea8db175cf61c8891e54895050d8 (patch)
tree447e2f5c930d05305060865b77437b4463915e69
parentf5ebbdfb9e1150198f5ead788d32f6c9b2295986 (diff)
started support for AssertionConsumerServiceIndex (as alternative to
ProtocolBinding) (used by zxid)
-rw-r--r--lasso/saml-2.0/login.c28
-rw-r--r--lasso/saml-2.0/provider.c34
-rw-r--r--lasso/saml-2.0/providerprivate.h2
-rw-r--r--lasso/xml/saml-2.0/samlp2_authn_request.c2
4 files changed, 63 insertions, 3 deletions
diff --git a/lasso/saml-2.0/login.c b/lasso/saml-2.0/login.c
index 3965bf79..487568ef 100644
--- a/lasso/saml-2.0/login.c
+++ b/lasso/saml-2.0/login.c
@@ -183,8 +183,32 @@ lasso_saml20_login_process_authn_request_msg(LassoLogin *login, const char *auth
protocol_binding = LASSO_SAMLP2_AUTHN_REQUEST(profile->request)->ProtocolBinding;
if (protocol_binding == NULL) {
- /* XXX: what does spec say when protocol binding is not set ? */
- message(G_LOG_LEVEL_WARNING, "undefined protocol binding");
+ /* protocol binding not set; will look into
+ * AssertionConsumingServiceIndex */
+ int service_index = LASSO_SAMLP2_AUTHN_REQUEST(
+ profile->request)->AssertionConsumerServiceIndex;
+ if (service_index == -1) {
+ /* XXX: what does spec say when protocol binding and
+ * attribute consuming service index are both unset ?
+ */
+ message(G_LOG_LEVEL_WARNING, "missing service index");
+ } else {
+ gchar *binding;
+ LassoProvider *remote_provider;
+
+ remote_provider = g_hash_table_lookup(profile->server->providers,
+ profile->remote_providerID);
+
+ binding = lasso_saml20_provider_get_assertion_consumer_service_binding(
+ remote_provider, service_index);
+ if (binding == NULL) {
+ message(G_LOG_LEVEL_WARNING, "can't find binding for index");
+ } else if (strcmp(binding, "HTTP-Artifact") == 0) {
+ login->protocolProfile = LASSO_LOGIN_PROTOCOL_PROFILE_BRWS_ART;
+ } else if (strcmp(binding, "HTTP-POST") == 0) {
+ login->protocolProfile = LASSO_LOGIN_PROTOCOL_PROFILE_BRWS_POST;
+ }
+ }
} else if (strcmp(protocol_binding, LASSO_SAML20_METADATA_BINDING_ARTIFACT) == 0) {
login->protocolProfile = LASSO_LOGIN_PROTOCOL_PROFILE_BRWS_ART;
} else if (strcmp(protocol_binding, LASSO_SAML20_METADATA_BINDING_POST) == 0) {
diff --git a/lasso/saml-2.0/provider.c b/lasso/saml-2.0/provider.c
index 57255409..8fc41cce 100644
--- a/lasso/saml-2.0/provider.c
+++ b/lasso/saml-2.0/provider.c
@@ -263,6 +263,40 @@ lasso_saml20_provider_get_assertion_consumer_service_url(LassoProvider *provider
return NULL;
}
+gchar*
+lasso_saml20_provider_get_assertion_consumer_service_binding(LassoProvider *provider,
+ int service_id)
+{
+ GHashTable *descriptor;
+ GList *l = NULL;
+ char *sid;
+ char *name;
+ char *binding;
+ const char *possible_bindings[] = {
+ "HTTP-Artifact", "HTTP-Post", "HTTP-POST", NULL
+ };
+ int i;
+
+ sid = g_strdup_printf("%d", service_id);
+
+ descriptor = provider->private_data->SPDescriptor;
+ if (descriptor == NULL)
+ return NULL;
+
+ for (i=0; possible_bindings[i]; i++) {
+ name = g_strdup_printf("AssertionConsumerService %s %s",
+ possible_bindings[i], sid);
+ l = g_hash_table_lookup(descriptor, name);
+ g_free(name);
+ if (l != NULL) {
+ return g_strdup(possible_bindings[i]);
+ }
+ }
+ return NULL;
+}
+
+
+
gboolean
lasso_saml20_provider_accept_http_method(LassoProvider *provider, LassoProvider *remote_provider,
LassoMdProtocolType protocol_type, LassoHttpMethod http_method,
diff --git a/lasso/saml-2.0/providerprivate.h b/lasso/saml-2.0/providerprivate.h
index 9660dc7a..9024a034 100644
--- a/lasso/saml-2.0/providerprivate.h
+++ b/lasso/saml-2.0/providerprivate.h
@@ -45,6 +45,8 @@ char* lasso_saml20_provider_build_artifact(LassoProvider *provider);
gchar* lasso_saml20_provider_get_assertion_consumer_service_url(LassoProvider *provider,
int service_id);
+gchar* lasso_saml20_provider_get_assertion_consumer_service_binding(LassoProvider *provider,
+ int service_id);
#ifdef __cplusplus
}
diff --git a/lasso/xml/saml-2.0/samlp2_authn_request.c b/lasso/xml/saml-2.0/samlp2_authn_request.c
index 11203b6d..a8daa457 100644
--- a/lasso/xml/saml-2.0/samlp2_authn_request.c
+++ b/lasso/xml/saml-2.0/samlp2_authn_request.c
@@ -126,7 +126,7 @@ instance_init(LassoSamlp2AuthnRequest *node)
node->ForceAuthn = FALSE;
node->IsPassive = FALSE;
node->ProtocolBinding = NULL;
- node->AssertionConsumerServiceIndex = 0;
+ node->AssertionConsumerServiceIndex = -1;
node->AssertionConsumerServiceURL = NULL;
node->AttributeConsumingServiceIndex = 0;
node->ProviderName = NULL;