diff options
-rw-r--r-- | lasso/Attic/protocols/logout_request.c | 28 | ||||
-rw-r--r-- | lasso/id-ff/logout.c | 42 |
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); } |