summaryrefslogtreecommitdiffstats
path: root/lasso/id-ff
diff options
context:
space:
mode:
authorNicolas Clapies <nclapies@entrouvert.com>2004-08-17 16:40:06 +0000
committerNicolas Clapies <nclapies@entrouvert.com>2004-08-17 16:40:06 +0000
commitb0462a7e1344af0d7ef3ef4f125bfa9863d12bc0 (patch)
tree0d437a9b45105133602ba22b7328ca7179890ea1 /lasso/id-ff
parentb0333739d2fc6eb3818089237e57c862b19afcb4 (diff)
downloadlasso-b0462a7e1344af0d7ef3ef4f125bfa9863d12bc0.tar.gz
lasso-b0462a7e1344af0d7ef3ef4f125bfa9863d12bc0.tar.xz
lasso-b0462a7e1344af0d7ef3ef4f125bfa9863d12bc0.zip
updated error checkings with ret / goto done method
Diffstat (limited to 'lasso/id-ff')
-rw-r--r--lasso/id-ff/logout.c131
1 files changed, 90 insertions, 41 deletions
diff --git a/lasso/id-ff/logout.c b/lasso/id-ff/logout.c
index 4642e38e..f9c0972e 100644
--- a/lasso/id-ff/logout.c
+++ b/lasso/id-ff/logout.c
@@ -88,6 +88,7 @@ lasso_logout_build_request_msg(LassoLogout *logout)
LassoProfile *profile;
LassoProvider *provider;
xmlChar *protocolProfile;
+ gint ret = 0;
g_return_val_if_fail(LASSO_IS_LOGOUT(logout), -1);
@@ -98,7 +99,8 @@ lasso_logout_build_request_msg(LassoLogout *logout)
NULL);
if (provider == NULL) {
message(G_LOG_LEVEL_CRITICAL, "Provider %s not found\n", profile->remote_providerID);
- return(-1);
+ ret = -1;
+ goto done;
}
/* get the prototocol profile of the logout request */
@@ -107,8 +109,9 @@ lasso_logout_build_request_msg(LassoLogout *logout)
NULL);
if (protocolProfile == NULL) {
- message(G_LOG_LEVEL_CRITICAL, "Single Logout Protocol profile not found\n");
- return(-1);
+ message(G_LOG_LEVEL_CRITICAL, "Single logout protocol profile not found\n");
+ ret = -1;
+ goto done;
}
if (xmlStrEqual(protocolProfile, lassoLibProtocolProfileSloSpSoap) || \
@@ -133,7 +136,12 @@ lasso_logout_build_request_msg(LassoLogout *logout)
profile->server->private_key);
}
- return(0);
+ done:
+ if (protocolProfile != NULL) {
+ xmlFree(protocolProfile);
+ }
+
+ return(ret);
}
/**
@@ -161,10 +169,12 @@ lasso_logout_build_response_msg(LassoLogout *logout)
LassoProfile *profile;
LassoProvider *provider;
xmlChar *protocolProfile;
+ gint ret = 0;
if (LASSO_IS_LOGOUT(logout) == FALSE) {
message(G_LOG_LEVEL_CRITICAL, "Not a Logout object\n");
- return(-1);
+ ret = -1;
+ goto done;
}
profile = LASSO_PROFILE(logout);
@@ -174,7 +184,8 @@ lasso_logout_build_response_msg(LassoLogout *logout)
NULL);
if (provider == NULL) {
message(G_LOG_LEVEL_CRITICAL, "Provider not found %s\n", profile->remote_providerID);
- return(-2);
+ ret = -1;
+ goto done;
}
protocolProfile = lasso_provider_get_singleLogoutProtocolProfile(provider,
@@ -182,7 +193,8 @@ lasso_logout_build_response_msg(LassoLogout *logout)
NULL);
if (protocolProfile == NULL) {
message(G_LOG_LEVEL_CRITICAL, "Single Logout Protocol profile not found\n");
- return(-3);
+ ret = -1;
+ goto done;
}
if (xmlStrEqual(protocolProfile, lassoLibProtocolProfileSloSpSoap) || \
@@ -199,7 +211,12 @@ lasso_logout_build_response_msg(LassoLogout *logout)
profile->msg_body = NULL;
}
- return(0);
+ done:
+ if (protocolProfile != NULL) {
+ xmlFree(protocolProfile);
+ }
+
+ return(ret);
}
/**
@@ -272,8 +289,8 @@ lasso_logout_init_request(LassoLogout *logout,
LassoProfile *profile;
LassoNode *nameIdentifier;
LassoFederation *federation;
-
- xmlChar *content, *nameQualifier, *format;
+ xmlChar *content, *nameQualifier, *format;
+ gint ret = 0;
g_return_val_if_fail(LASSO_IS_LOGOUT(logout), -1);
@@ -290,14 +307,16 @@ lasso_logout_init_request(LassoLogout *logout,
if (profile->remote_providerID == NULL) {
message(G_LOG_LEVEL_CRITICAL, "No remote provider id to send the logout request\n");
- return(-1);
+ ret = -1;
+ goto done;
}
/* get federation */
federation = lasso_identity_get_federation(profile->identity, profile->remote_providerID);
if (federation == NULL) {
message(G_LOG_LEVEL_CRITICAL, "Federation not found\n");
- return(-1);
+ ret = -1;
+ goto done;
}
/* get the name identifier (!!! depend on the provider type : SP or IDP !!!)*/
@@ -316,14 +335,15 @@ lasso_logout_init_request(LassoLogout *logout,
break;
default:
message(G_LOG_LEVEL_CRITICAL, "Invalid provider type\n");
- return(-1);
+ ret = -1;
+ goto done;
}
- lasso_federation_destroy(federation);
if (nameIdentifier == NULL) {
message(G_LOG_LEVEL_CRITICAL, "Name identifier not found for %s\n",
profile->remote_providerID);
- return(-1);
+ ret = -1;
+ goto done;
}
/* build the request */
@@ -335,20 +355,29 @@ lasso_logout_init_request(LassoLogout *logout,
content,
nameQualifier,
format);
-
- /* free the nameIdentifier infos except the value (keep in profile->nameIdentifier) */
profile->nameIdentifier = content;
- xmlFree(nameQualifier);
- xmlFree(format);
- lasso_node_destroy(nameIdentifier);
-
if (profile->request == NULL) {
message(G_LOG_LEVEL_CRITICAL, "Error while creating the request\n");
- return(-1);
+ ret = -1;
+ goto done;
+ }
+
+ done:
+ if (federation != NULL) {
+ lasso_federation_destroy(federation);
+ }
+ if (nameIdentifier != NULL ) {
+ lasso_node_destroy(nameIdentifier);
+ }
+ if (nameQualifier != NULL) {
+ xmlFree(nameQualifier);
+ }
+ if (format != NULL) {
+ xmlFree(format);
}
- return(0);
+ return(ret);
}
/**
@@ -476,6 +505,7 @@ lasso_logout_validate_request(LassoLogout *logout)
LassoNode *statusCode;
LassoNodeClass *statusCode_class;
xmlChar *remote_providerID;
+ gint ret = 0;
g_return_val_if_fail(LASSO_IS_LOGOUT(logout), -1);
@@ -483,7 +513,8 @@ lasso_logout_validate_request(LassoLogout *logout)
if (profile->request == NULL) {
message(G_LOG_LEVEL_CRITICAL, "LogoutRequest not found\n");
- return(-1);
+ ret = -1;
+ goto done;
}
/* Set the remote provider id from the request */
@@ -491,7 +522,8 @@ lasso_logout_validate_request(LassoLogout *logout)
NULL, NULL);
if (remote_providerID == NULL) {
message(G_LOG_LEVEL_CRITICAL, "ProviderID in LogoutRequest not found\n");
- return(-1);
+ ret = -1;
+ goto done;
}
profile->remote_providerID = remote_providerID;
@@ -501,7 +533,8 @@ lasso_logout_validate_request(LassoLogout *logout)
profile->request);
if (profile->response == NULL) {
message(G_LOG_LEVEL_CRITICAL, "Error while building response\n");
- return(-5);
+ ret = -1;
+ goto done;
}
statusCode = lasso_node_get_child(profile->response, "StatusCode", NULL, NULL);
@@ -512,28 +545,32 @@ lasso_logout_validate_request(LassoLogout *logout)
if (nameIdentifier == NULL) {
message(G_LOG_LEVEL_CRITICAL, "Name identifier not found in logout request\n");
statusCode_class->set_prop(statusCode, "Value", lassoLibStatusCodeFederationDoesNotExist);
- return(-6);
+ ret = -1;
+ goto done;
}
remote_providerID = lasso_node_get_child_content(profile->request, "ProviderID",
NULL, NULL);
if (remote_providerID == NULL) {
message(G_LOG_LEVEL_CRITICAL, "Provider id not found in logout request\n");
- return(-7);
+ ret = -1;
+ goto done;
}
/* verify authentication */
if (profile->identity == NULL) {
message(G_LOG_LEVEL_WARNING, "Identity not found\n");
statusCode_class->set_prop(statusCode, "Value", lassoSamlStatusCodeRequestDenied);
- return(-1);
+ ret = -1;
+ goto done;
}
assertion = lasso_session_get_assertion(profile->session, remote_providerID);
if (assertion == NULL) {
message(G_LOG_LEVEL_WARNING, "%s has no assertion\n", remote_providerID);
statusCode_class->set_prop(statusCode, "Value", lassoSamlStatusCodeRequestDenied);
- return(-1);
+ ret = -1;
+ goto done;
}
lasso_node_destroy(assertion);
@@ -542,13 +579,15 @@ lasso_logout_validate_request(LassoLogout *logout)
if (federation == NULL) {
message(G_LOG_LEVEL_WARNING, "No federation for %s\n", remote_providerID);
statusCode_class->set_prop(statusCode, "Value", lassoLibStatusCodeFederationDoesNotExist);
- return(-1);
+ ret = -1;
+ goto done;
}
if (lasso_federation_verify_nameIdentifier(federation, nameIdentifier) == FALSE) {
message(G_LOG_LEVEL_WARNING, "No name identifier for %s\n", remote_providerID);
statusCode_class->set_prop(statusCode, "Value", lassoLibStatusCodeFederationDoesNotExist);
- return(-1);
+ ret = -1;
+ goto done;
}
/* if SOAP request method at IDP then verify all the remote service providers support SOAP protocol profile.
@@ -595,7 +634,8 @@ lasso_logout_validate_request(LassoLogout *logout)
if (all_http_soap==FALSE) {
statusCode_class->set_prop(statusCode, "Value", lassoLibStatusCodeUnsupportedProfile);
- return(-1);
+ ret = -1;
+ goto done;
}
}
@@ -615,7 +655,9 @@ lasso_logout_validate_request(LassoLogout *logout)
}
}
- return(0);
+ done:
+
+ return(ret);
}
/**
@@ -636,8 +678,9 @@ lasso_logout_process_response_msg(LassoLogout *logout,
lassoHttpMethod response_method)
{
LassoProfile *profile;
- xmlChar *statusCodeValue;
- LassoNode *statusCode;
+ xmlChar *statusCodeValue;
+ LassoNode *statusCode;
+ gint ret = 0;
g_return_val_if_fail(LASSO_IS_LOGOUT(logout), -1);
g_return_val_if_fail(response_msg != NULL, -1);
@@ -654,25 +697,29 @@ lasso_logout_process_response_msg(LassoLogout *logout,
break;
default:
message(G_LOG_LEVEL_CRITICAL, "Unknown response method\n");
- return(-1);
+ ret = -1;
+ goto done;
}
if (profile->response == NULL) {
message(G_LOG_LEVEL_CRITICAL, "LogoutResponse is NULL\n");
- return(-1);
+ ret = -1;
+ goto done;
}
statusCode = lasso_node_get_child(profile->response, "StatusCode", NULL, NULL);
if (statusCode == NULL) {
message(G_LOG_LEVEL_CRITICAL, "StatusCode node not found\n");
- return(-1);
+ ret = -1;
+ goto done;
}
statusCodeValue = lasso_node_get_attr_value(statusCode, "Value", NULL);
if (!xmlStrEqual(statusCodeValue, lassoSamlStatusCodeSuccess)) {
message(G_LOG_LEVEL_WARNING, "Status code value is not Success\n");
- return(-1);
+ ret = -1;
+ goto done;
}
profile->remote_providerID = lasso_node_get_child_content(profile->response, "ProviderID",
@@ -699,7 +746,9 @@ lasso_logout_process_response_msg(LassoLogout *logout,
message(G_LOG_LEVEL_CRITICAL, "Invalid provider type\n");
}
- return(0);
+ done:
+
+ return(ret);
}
/*****************************************************************************/