summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lasso/Attic/protocols/logout_response.c12
-rw-r--r--lasso/id-ff/logout.c78
-rw-r--r--lasso/id-ff/logout.h15
-rw-r--r--lasso/id-ff/server.c23
4 files changed, 89 insertions, 39 deletions
diff --git a/lasso/Attic/protocols/logout_response.c b/lasso/Attic/protocols/logout_response.c
index 34bf824c..90d38a71 100644
--- a/lasso/Attic/protocols/logout_response.c
+++ b/lasso/Attic/protocols/logout_response.c
@@ -29,6 +29,18 @@
/* public methods */
/*****************************************************************************/
+xmlChar*
+lasso_logout_response_get_status_code_value(LassoLogoutResponse *response)
+{
+ LassoNodeClass *statusCode_class;
+ LassoNode *statusCode_node;
+
+ statusCode_node = lasso_node_get_child(response, "StatusCode", NULL);
+ statusCode_class = LASSO_NODE_GET_CLASS(statusCode_node);
+
+ return(statusCode_class->get_attr_value(statusCode_node, "Value"));
+}
+
/*****************************************************************************/
/* instance and class init functions */
/*****************************************************************************/
diff --git a/lasso/id-ff/logout.c b/lasso/id-ff/logout.c
index 0e3d199f..7a271408 100644
--- a/lasso/id-ff/logout.c
+++ b/lasso/id-ff/logout.c
@@ -28,6 +28,13 @@
/* public methods */
/*****************************************************************************/
+gchar *
+lasso_logout_dump(LassoLogout *logout)
+{
+ LassoProfileContext *profileContext;
+ gchar *dump;
+}
+
int
lasso_logout_build_request_msg(LassoLogout *logout)
{
@@ -40,13 +47,11 @@ lasso_logout_build_request_msg(LassoLogout *logout)
/* get the prototocol profile of the logout */
provider = lasso_server_get_provider(profileContext->server, profileContext->remote_providerID);
if(provider==NULL){
- printf("provider not found\n");
return(-1);
}
protocolProfile = lasso_provider_get_singleLogoutProtocolProfile(provider);
if(protocolProfile==NULL){
- printf("No protocol profile for logout request message\n");
return(-2);
}
@@ -67,7 +72,6 @@ lasso_logout_build_response_msg(LassoLogout *logout)
profileContext = LASSO_PROFILE_CONTEXT(logout);
- /* get the prototocol profile of the logout */
provider = lasso_server_get_provider(profileContext->server, profileContext->remote_providerID);
if(provider==NULL){
return(-1);
@@ -88,7 +92,7 @@ lasso_logout_build_response_msg(LassoLogout *logout)
gint
lasso_logout_init_request(LassoLogout *logout,
- xmlChar *remote_providerID)
+ gchar *remote_providerID)
{
LassoProfileContext *profileContext;
LassoNode *nameIdentifier;
@@ -101,8 +105,8 @@ lasso_logout_init_request(LassoLogout *logout,
/* get identity */
identity = lasso_user_get_identity(profileContext->user, profileContext->remote_providerID);
- if(!identity)
- return(1);
+ if(identity==NULL)
+ return(-1);
/* get the name identifier (!!! depend on the provider type : SP or IDP !!!)*/
switch(logout->provider_type){
@@ -120,8 +124,7 @@ lasso_logout_init_request(LassoLogout *logout,
}
if(!nameIdentifier){
- printf("error, name identifier not found\n");
- return(2);
+ return(-2);
}
/* build the request */
@@ -137,11 +140,14 @@ lasso_logout_init_request(LassoLogout *logout,
}
gint
-lasso_logout_handle_request(LassoLogout *logout, xmlChar *request_msg, gint request_method)
+lasso_logout_handle_request_msg(LassoLogout *logout,
+ gchar *request_msg,
+ lassoHttpMethods request_method)
{
LassoProfileContext *profileContext;
- xmlChar *statusCodeValue = lassoSamlStatusCodeSuccess;
- LassoNode *nameIdentifier;
+ LassoIdentity *identity;
+ LassoNode *nameIdentifier, *assertion;
+ xmlChar *remote_providerID;
profileContext = LASSO_PROFILE_CONTEXT(logout);
@@ -150,40 +156,56 @@ lasso_logout_handle_request(LassoLogout *logout, xmlChar *request_msg, gint requ
profileContext->request = lasso_logout_request_new_from_soap(request_msg);
break;
case lassoHttpMethodRedirect:
- printf("TODO, implement the redirect method\n");
+ profileContext->request = lasso_logout_request_new_from_query(request_msg);
break;
case lassoHttpMethodGet:
printf("TODO, implement the get method\n");
break;
default:
printf("error while parsing the request\n");
- return(0);
+ return(-1);
}
/* set LogoutResponse */
profileContext->response = lasso_logout_response_new(lasso_provider_get_providerID(LASSO_PROVIDER(profileContext->server)),
- statusCodeValue,
+ lassoSamlStatusCodeSuccess,
profileContext->request);
- /* Verify federation and */
- nameIdentifier = lasso_node_get_child(profileContext->request, "NameIdentifier", NULL);
- if(lasso_user_verify_federation(profileContext->user, nameIdentifier)==FALSE){
- // TODO : implement a simple method to set the status code value
-
+ nameIdentifier = lasso_logout_request_get_nameIdentifier(profileContext->response);
+ if(nameIdentifier==NULL){
+ return(-2);
+ }
+
+ remote_providerID = lasso_node_get_child_content(profileContext->request, "ProviderID", NULL);
+
+ /* Verify federation */
+ identity = lasso_user_get_identity(profileContext->user, remote_providerID);
+ if(identity==NULL){
+ return(-3);
+ }
+
+ if(lasso_identity_verify_nameIdentifier(identity, nameIdentifier)==FALSE){
+ return(-4);
}
/* verify authentication (if ok, delete assertion) */
- if(lasso_user_verify_authentication(profileContext->user, nameIdentifier)==FALSE){
- // TODO : implement verify authentication
+ assertion = lasso_user_get_assertion(profileContext->user, remote_providerID);
+ if(assertion==NULL){
+ return(-5);
}
- return(1);
+ /* TODO : verify the name identifier */
+
+ return(0);
}
gint
-lasso_logout_handle_response(LassoLogout *logout, xmlChar *response_msg, gint response_method)
+lasso_logout_handle_response_msg(LassoLogout *logout,
+ gchar *response_msg,
+ lassoHttpMethods response_method)
{
LassoProfileContext *profileContext;
+ xmlChar *statusCodeValue;
profileContext = LASSO_PROFILE_CONTEXT(logout);
@@ -193,11 +215,11 @@ lasso_logout_handle_response(LassoLogout *logout, xmlChar *response_msg, gint re
profileContext->response = lasso_logout_response_new_from_soap(response_msg);
}
- /* verify status code value */
- // TODO : do the developer needs to get the value of the status code with the level 2 of lasso ?
- // node = lasso_node_get_child(profileContext->response, "StatusCode", NULL);
- // statusCodeValue = lasso_node_get_attr_value(node, "Value");
-
+ statusCodeValue = lasso_logout_response_get_statusCodeValue(profileContext->response);
+ if(!xmlStrEqual(statusCodeValue, lassoSamlStatusCodeSuccess)){
+ return(-1);
+ }
+
return(0);
}
diff --git a/lasso/id-ff/logout.h b/lasso/id-ff/logout.h
index 7fa1b5b6..093467cd 100644
--- a/lasso/id-ff/logout.h
+++ b/lasso/id-ff/logout.h
@@ -58,16 +58,25 @@ struct _LassoLogoutClass {
};
LASSO_EXPORT GType lasso_logout_get_type (void);
+
LASSO_EXPORT LassoLogout *lasso_logout_new (LassoServer *server,
LassoUser *user,
gint provider_type);
LASSO_EXPORT gint lasso_logout_build_request_msg (LassoLogout *logout);
+
LASSO_EXPORT gint lasso_logout_build_response_msg (LassoLogout *logout);
+
LASSO_EXPORT gint lasso_logout_init_request (LassoLogout *logout,
- xmlChar *remote_providerID);
-LASSO_EXPORT gint lasso_logout_handle_request (LassoLogout *logout, xmlChar *request_msg, gint request_method);
-LASSO_EXPORT gint lasso_logout_handle_response (LassoLogout *logout, xmlChar *response_msg, gint response_method);
+ gchar *remote_providerID);
+
+LASSO_EXPORT gint lasso_logout_handle_request (LassoLogout *logout,
+ gchar *request_msg,
+ gint request_method);
+
+LASSO_EXPORT gint lasso_logout_handle_response (LassoLogout *logout,
+ gchar *response_msg,
+ gint response_method);
#ifdef __cplusplus
}
diff --git a/lasso/id-ff/server.c b/lasso/id-ff/server.c
index fa9a8ff5..edd1c8e4 100644
--- a/lasso/id-ff/server.c
+++ b/lasso/id-ff/server.c
@@ -72,6 +72,13 @@ lasso_server_dump(LassoServer *server)
}
void
+lasso_server_add_lasso_provider(LassoServer *server,
+ LassoProvider *provider)
+{
+ g_ptr_array_add(server->providers, provider);
+}
+
+void
lasso_server_add_provider(LassoServer *server,
gchar *metadata,
gchar *public_key,
@@ -220,14 +227,14 @@ lasso_server_new_from_dump(xmlChar *dump)
certificate = xmlGetProp(provider_xmlNode, LASSO_PROVIDER_CERTIFICATE_NODE);
/* add a new provider */
-/* provider = lasso_provider_new_metadata_xmlNode(metadata); */
-/* if(public_key){ */
-/* lasso_provider_set_public_key(provider, public_key); */
-/* } */
-/* if(certificate){ */
-/* lasso_provider_set_public_key(provider, certificate); */
-/* } */
-/* lasso_server_add_provider(server, provider); */
+ provider = lasso_provider_new_metadata_xmlNode(metadata);
+ if(public_key){
+ lasso_provider_set_public_key(provider, public_key);
+ }
+ if(certificate){
+ lasso_provider_set_public_key(provider, certificate);
+ }
+ lasso_server_add_lasso_provider(server, provider);
}
provider_xmlNode = provider_xmlNode->next;