summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lasso/Attic/protocols/logout_request.c28
-rw-r--r--lasso/id-ff/logout.c42
2 files changed, 48 insertions, 22 deletions
diff --git a/lasso/Attic/protocols/logout_request.c b/lasso/Attic/protocols/logout_request.c
index 8b7a8ffe..0f769107 100644
--- a/lasso/Attic/protocols/logout_request.c
+++ b/lasso/Attic/protocols/logout_request.c
@@ -170,7 +170,6 @@ lasso_logout_request_new_from_query(gchar *query)
/* MajorVersion */
str = lasso_g_ptr_array_index((GPtrArray *)g_datalist_get_data(&gd, "MajorVersion"), 0);
-
lasso_samlp_request_abstract_set_majorVersion(LASSO_SAMLP_REQUEST_ABSTRACT(request), str);
if (str == NULL) {
g_datalist_clear(&gd);
@@ -275,6 +274,29 @@ lasso_logout_request_new_from_soap(gchar *buffer)
return(request);
}
+static LassoNode *
+lasso_logout_request_new_from_xml(gchar *buffer)
+{
+ LassoNode *request;
+ LassoNode *logout_request_node, *lassoNode_request;
+ xmlNodePtr xmlNode_request;
+ LassoNodeClass *class;
+
+ request = LASSO_NODE(g_object_new(LASSO_TYPE_LOGOUT_REQUEST, NULL));
+
+ lassoNode_request = lasso_node_new_from_dump(buffer);
+ class = LASSO_NODE_GET_CLASS(lassoNode_request);
+ xmlNode_request = xmlCopyNode(class->get_xmlNode(LASSO_NODE(lassoNode_request)), 1);
+ lasso_node_destroy(lassoNode_request);
+
+ class = LASSO_NODE_GET_CLASS(request);
+ class->set_xmlNode(LASSO_NODE(request), xmlNode_request);
+
+ lasso_node_destroy(lassoNode_request);
+
+ return(request);
+}
+
LassoNode*
lasso_logout_request_new_from_export(gchar *buffer,
@@ -291,7 +313,11 @@ lasso_logout_request_new_from_export(gchar *buffer,
case lassoNodeExportTypeSoap:
request = lasso_logout_request_new_from_soap(buffer);
break;
+ case lassoNodeExportTypeXml:
+ request = lasso_logout_request_new_from_xml(buffer);
+ break;
default:
+ message(G_LOG_LEVEL_CRITICAL, "Unsupported export type\n");
break;
}
diff --git a/lasso/id-ff/logout.c b/lasso/id-ff/logout.c
index f95b0961..fc86b776 100644
--- a/lasso/id-ff/logout.c
+++ b/lasso/id-ff/logout.c
@@ -405,14 +405,13 @@ lasso_logout_init_request(LassoLogout *logout,
/* get the remote provider id */
if (remote_providerID == NULL) {
- debug("No remote provider id, get the next assertion peer provider id\n");
- profile->remote_providerID = lasso_session_get_next_providerID(profile->session);
+ /* No remote provider id, get the next assertion peer provider id */
+ profile->remote_providerID = lasso_session_get_first_providerID(profile->session);
}
else {
- debug("A remote provider id for logout request : %s\n", remote_providerID);
+ /* "A remote provider id for logout request */
profile->remote_providerID = g_strdup(remote_providerID);
}
-
if (profile->remote_providerID == NULL) {
message(G_LOG_LEVEL_CRITICAL, "No remote provider id to send the logout request\n");
ret = -1;
@@ -768,9 +767,8 @@ lasso_logout_process_response_msg(LassoLogout *logout,
case lassoProviderTypeIdp:
/* At IDP, if no more assertion for other providers and if initial remote provider id is set,
then remove his assertion and restore his original requester infos */
- if(profile->session->providerIDs->len == 1 && logout->initial_remote_providerID){
+ if(logout->initial_remote_providerID && profile->session->providerIDs->len == 1){
lasso_session_remove_assertion(profile->session, logout->initial_remote_providerID);
-
profile->remote_providerID = logout->initial_remote_providerID;
profile->request = logout->initial_request;
profile->response = logout->initial_response;
@@ -835,9 +833,9 @@ lasso_logout_validate_request(LassoLogout *logout)
profile = LASSO_PROFILE(logout);
+ /* verify logout request */
if (profile->request == NULL) {
- message(G_LOG_LEVEL_CRITICAL, "LogoutRequest not found\n");
- ret = -1;
+ ret = LASSO_PROFILE_ERROR_MISSING_REQUEST;
goto done;
}
@@ -852,26 +850,27 @@ lasso_logout_validate_request(LassoLogout *logout)
profile->remote_providerID = remote_providerID;
/* Set LogoutResponse */
- if (profile->http_request_method == lassoHttpMethodSoap) {
+ switch (profile->http_request_method) {
+ case lassoHttpMethodSoap:
profile->response = lasso_logout_response_new(profile->server->providerID,
lassoSamlStatusCodeSuccess,
profile->request,
lassoSignatureTypeWithX509,
lassoSignatureMethodRsaSha1);
- }
- else if (profile->http_request_method == lassoHttpMethodRedirect) {
+ break;
+ case lassoHttpMethodRedirect:
profile->response = lasso_logout_response_new(profile->server->providerID,
lassoSamlStatusCodeSuccess,
profile->request,
lassoSignatureTypeNone,
0);
- }
- else {
+ break;
+ default:
message(G_LOG_LEVEL_CRITICAL, "Invalid HTTP request method\n");
ret = -1;
goto done;
}
- if (profile->response == NULL) {
+ if (LASSO_IS_LOGOUT_RESPONSE(profile->response) == FALSE) {
message(G_LOG_LEVEL_CRITICAL, "Error while building response\n");
ret = -1;
goto done;
@@ -1117,9 +1116,9 @@ lasso_logout_new_from_dump(LassoServer *server,
{
LassoLogout *logout;
LassoProfile *profile;
- LassoNode *node_dump, *request_node, *response_node;
- LassoNode *initial_request_node, *initial_response_node;
- gchar *type, *export, *initial_remote_providerID;
+ LassoNode *node_dump, *request_node, *response_node;
+ LassoNode *initial_request_node, *initial_response_node;
+ gchar *type, *export, *initial_remote_providerID;
g_return_val_if_fail(LASSO_IS_SERVER(server), NULL);
g_return_val_if_fail(dump != NULL, NULL);
@@ -1128,6 +1127,8 @@ lasso_logout_new_from_dump(LassoServer *server,
"server", lasso_server_copy(server),
NULL));
+ profile = LASSO_PROFILE(logout);
+
node_dump = lasso_node_new_from_dump(dump);
/* profile attributes */
@@ -1144,14 +1145,14 @@ lasso_logout_new_from_dump(LassoServer *server,
/* rebuild request */
request_node = lasso_node_get_child(node_dump, "LogoutRequest", lassoLibHRef, NULL);
- if (request_node != NULL) {
+
+ if (LASSO_IS_NODE(request_node) == TRUE) {
export = lasso_node_export(request_node);
profile->request = lasso_logout_request_new_from_export(export,
lassoNodeExportTypeXml);
- g_free(export);
- lasso_node_destroy(request_node);
}
+
/* rebuild response */
response_node = lasso_node_get_child(node_dump, "LogoutResponse", lassoLibHRef, NULL);
if (response_node != NULL) {
@@ -1193,6 +1194,5 @@ lasso_logout_new_from_dump(LassoServer *server,
/* Initial logout remote provider id */
logout->initial_remote_providerID = lasso_node_get_child_content(node_dump, "InitialRemoteProviderID", lassoLassoHRef, NULL);
-
return(logout);
}