summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Dauvergne <bdauvergne@entrouvert.com>2009-01-24 09:34:04 +0000
committerBenjamin Dauvergne <bdauvergne@entrouvert.com>2009-01-24 09:34:04 +0000
commitd38057f858e853c4eb87fdcd8487799cc7b34d7e (patch)
tree59fd605b37e4ef1e17250268ef37b9c9d8e41b21
parentb5d79960c76edcf231996c36a1752a03832566e7 (diff)
downloadlasso-d38057f858e853c4eb87fdcd8487799cc7b34d7e.tar.gz
lasso-d38057f858e853c4eb87fdcd8487799cc7b34d7e.tar.xz
lasso-d38057f858e853c4eb87fdcd8487799cc7b34d7e.zip
ID-FF 1.2: review logout_validate_request
* lasso/id-ff/logout.c (lasso_logout_validate_request): - when signature verification failed in process_request_msg, do not continue validation of the request, stop immediately and return the signature status code. - use utils.h macro for memory allocation handling. Fix potential leak of the profile->response object.
-rw-r--r--lasso/id-ff/logout.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/lasso/id-ff/logout.c b/lasso/id-ff/logout.c
index e2b85df6..e45bb2f6 100644
--- a/lasso/id-ff/logout.c
+++ b/lasso/id-ff/logout.c
@@ -789,6 +789,10 @@ gint lasso_logout_reset_providerID_index(LassoLogout *logout)
* Sets a logout response with status code value to success.
* </para></listitem>
* <listitem><para>
+ * Checks current signature status, if verification failed, stop processing
+ * and set the status code value to failure.
+ * </para></listitem>
+ * <listitem><para>
* Verifies federation and authentication.
* </para></listitem>
* <listitem><para>
@@ -831,11 +835,7 @@ lasso_logout_validate_request(LassoLogout *logout)
if (LASSO_IS_LIB_LOGOUT_REQUEST(profile->request) == FALSE)
return LASSO_PROFILE_ERROR_MISSING_REQUEST;
- if (profile->remote_providerID) {
- g_free(profile->remote_providerID);
- }
-
- profile->remote_providerID = g_strdup(
+ lasso_assign_string(profile->remote_providerID =
LASSO_LIB_LOGOUT_REQUEST(profile->request)->ProviderID);
/* get the provider */
@@ -846,7 +846,7 @@ lasso_logout_validate_request(LassoLogout *logout)
}
/* Set LogoutResponse */
- profile->response = NULL;
+ lasso_release_gobject(profile->response);
if (profile->http_request_method == LASSO_HTTP_METHOD_SOAP) {
profile->response = lasso_lib_logout_response_new_full(
LASSO_PROVIDER(profile->server)->ProviderID,
@@ -868,10 +868,11 @@ lasso_logout_validate_request(LassoLogout *logout)
return critical_error(LASSO_PROFILE_ERROR_BUILDING_RESPONSE_FAILED);
}
- /* verify signature status */
+ /* Verify signature status, if signature is invalid, stop validation here */
if (profile->signature_status != 0) {
lasso_profile_set_response_status(profile,
LASSO_LIB_STATUS_CODE_INVALID_SIGNATURE);
+ return profile->signature_status;
}
/* Get the name identifier */
@@ -949,13 +950,9 @@ lasso_logout_validate_request(LassoLogout *logout)
*/
if (remote_provider->role == LASSO_PROVIDER_ROLE_SP &&
g_hash_table_size(profile->session->assertions) >= 1) {
- logout->initial_remote_providerID = profile->remote_providerID;
- logout->initial_request = LASSO_NODE(profile->request);
- logout->initial_response = LASSO_NODE(profile->response);
-
- profile->remote_providerID = NULL;
- profile->request = NULL;
- profile->response = NULL;
+ lasso_transfer_string(logout->initial_remote_providerID, profile->remote_providerID);
+ lasso_transfer_gobject(logout->initial_request, LASSO_NODE(profile->request));
+ lasso_transfer_gobject(logout->initial_response, LASSO_NODE(profile->response));
}
return 0;