summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Clapies <nclapies@entrouvert.com>2004-08-27 13:44:07 +0000
committerNicolas Clapies <nclapies@entrouvert.com>2004-08-27 13:44:07 +0000
commiteaa4b813fcd0f7aa1152d98998afe5b59556142f (patch)
tree09c78008476fbdc0fb442fabc235adc7e7f0f19c
parent3ed5fa5681451b2407e316f01f22225f9d758e6d (diff)
downloadlasso-eaa4b813fcd0f7aa1152d98998afe5b59556142f.tar.gz
lasso-eaa4b813fcd0f7aa1152d98998afe5b59556142f.tar.xz
lasso-eaa4b813fcd0f7aa1152d98998afe5b59556142f.zip
Added index attribute (session->index_providerID) of next provider id returned when a call to lasso_session_get_providerID(), added lasso_session_reset_index_providerID() to reset the index to the first provider id of assertion list. the index is decremented when removing assertion. lasso_get_next_providerID() returns NULL if there is no assertion anymore or if the index point is at the end of the list. Added lasso_logout_get_next_providerID() lasso_logout_reset_index_providerID() to wrap session method
-rw-r--r--lasso/id-ff/logout.c301
-rw-r--r--lasso/id-ff/logout.h9
-rw-r--r--lasso/id-ff/session.c81
-rw-r--r--lasso/id-ff/session.h17
4 files changed, 222 insertions, 186 deletions
diff --git a/lasso/id-ff/logout.c b/lasso/id-ff/logout.c
index df54c650..38e7e9c0 100644
--- a/lasso/id-ff/logout.c
+++ b/lasso/id-ff/logout.c
@@ -286,6 +286,9 @@ lasso_logout_destroy(LassoLogout *logout)
*
* This method returns the next logout request service provider id
* excepted the initial service provider id.
+ *
+ * This method returns the next provider id to send a logout request.
+ * get the current provider id with index_remote_providerID as index in session->providerIDs.
*
* Return value: a newly allocated string or NULL
**/
@@ -293,36 +296,16 @@ gchar*
lasso_logout_get_next_providerID(LassoLogout *logout)
{
LassoProfile *profile;
- gchar *current_provider_id;
- int i;
+ gchar *provider_id;
g_return_val_if_fail(LASSO_IS_LOGOUT(logout), NULL);
-
profile = LASSO_PROFILE(logout);
- if (profile->session == NULL) {
- message(G_LOG_LEVEL_CRITICAL, "Session not found\n");
- return(NULL);
- }
+ g_return_val_if_fail(LASSO_IS_SESSION(profile->session), NULL);
- /* if a ProviderID from a SP request, pass it and return the next provider id found */
- for (i = 0; i < profile->session->providerIDs->len; i++) {
- current_provider_id = g_strdup(g_ptr_array_index(profile->session->providerIDs, i));
-
- /* if logout request from SP at IDP, verify not to return the ProviderID of the initial SP requester */
- if (logout->initial_remote_providerID != NULL) {
- if (xmlStrEqual(current_provider_id, logout->initial_remote_providerID)) {
- debug("It's the ProviderID of the SP requester (%s) : %s, pass it\n",
- logout->initial_remote_providerID,
- current_provider_id);
- g_free(current_provider_id);
- continue;
- }
- }
- return(current_provider_id);
- }
-
- return(NULL);
+ provider_id = lasso_session_get_next_providerID(profile->session);
+
+ return(provider_id);
}
/**
@@ -374,7 +357,7 @@ 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_assertion_remote_providerID(profile->session);
+ profile->remote_providerID = lasso_session_get_next_providerID(profile->session);
}
else {
debug("A remote provider id for logout request : %s\n", remote_providerID);
@@ -632,6 +615,148 @@ gint lasso_logout_process_request_msg(LassoLogout *logout,
}
/**
+ * lasso_logout_process_response_msg:
+ * @logout: the logout object
+ * @response_msg: the response message
+ * @response_method: the response method
+ *
+ * Process the response method :
+ * build the logout response object
+ * verify the status code value
+ *
+ * Return value: 0 if OK else < 0
+ **/
+gint
+lasso_logout_process_response_msg(LassoLogout *logout,
+ gchar *response_msg,
+ lassoHttpMethod response_method)
+{
+ LassoProfile *profile;
+ xmlChar *statusCodeValue;
+ LassoNode *statusCode;
+ GError *err = NULL;
+ gint ret = 0;
+
+ g_return_val_if_fail(LASSO_IS_LOGOUT(logout), -1);
+ g_return_val_if_fail(response_msg != NULL, -1);
+
+ profile = LASSO_PROFILE(logout);
+
+ /* build logout response object */
+ switch (response_method) {
+ case lassoHttpMethodSoap:
+ profile->response = lasso_logout_response_new_from_export(response_msg, lassoNodeExportTypeSoap);
+ break;
+ case lassoHttpMethodRedirect:
+ profile->response = lasso_logout_response_new_from_export(response_msg, lassoNodeExportTypeQuery);
+ break;
+ default:
+ message(G_LOG_LEVEL_CRITICAL, "Invalid response method\n");
+ ret = -1;
+ goto done;
+ }
+ if (LASSO_IS_LOGOUT_RESPONSE(profile->response) == FALSE) {
+ message(G_LOG_LEVEL_CRITICAL, "Message is not a LogoutResponse\n");
+ 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");
+ ret = -1;
+ goto done;
+ }
+
+ statusCodeValue = lasso_node_get_attr_value(statusCode, "Value", NULL);
+
+ if (!xmlStrEqual(statusCodeValue, lassoSamlStatusCodeSuccess)) {
+ /* At SP, if the request method was a SOAP type, if at IDP, then rebuild the request message with HTTP method */
+ if (profile->provider_type == lassoProviderTypeSp && profile->http_request_method == lassoHttpMethodSoap) {
+ /* temporary vars */
+ LassoProvider *provider;
+ gchar *url, *query;
+
+ provider = lasso_server_get_provider_ref(profile->server, profile->remote_providerID, &err);
+ if (provider == NULL) {
+ message(G_LOG_LEVEL_CRITICAL, err->message);
+ ret = err->code;
+ g_error_free(err);
+ goto done;
+ }
+
+ /* FIXME : verify the IDP support a HTTP method */
+
+ /* Build and optionaly sign the logout request QUERY message */
+ url = lasso_provider_get_singleLogoutServiceURL(provider, lassoProviderTypeIdp, NULL);
+ query = lasso_node_export_to_query(profile->request,
+ profile->server->signature_method,
+ profile->server->private_key);
+ profile->msg_url = g_new(gchar, strlen(url)+strlen(query)+1+1);
+ g_sprintf(profile->msg_url, "%s?%s", url, query);
+ profile->msg_body = NULL;
+
+ /* send a HTTP Redirect / GET method, so first remove session */
+ lasso_session_remove_assertion(profile->session, profile->remote_providerID);
+ }
+
+ message(G_LOG_LEVEL_WARNING, "Status code value is not Success\n");
+ ret = LASSO_LOGOUT_ERROR_UNSUPPORTED_PROFILE;
+ goto done;
+ }
+
+ /* LogoutResponse status code value is ok, so remove assertion */
+ profile->remote_providerID = lasso_node_get_child_content(profile->response, "ProviderID",
+ NULL, NULL);
+ lasso_session_remove_assertion(profile->session, profile->remote_providerID);
+
+ switch (profile->provider_type) {
+ case lassoProviderTypeSp:
+ /* */
+ break;
+ 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){
+ 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;
+ }
+ break;
+ default:
+ message(G_LOG_LEVEL_CRITICAL, "Invalid provider type\n");
+ }
+
+ done:
+
+ return(ret);
+}
+
+/**
+ * lasso_logout_reset_session_index:
+ * @logout: the logout object
+ *
+ * Call the reset of the index provider id in session object
+ *
+ * Return value: 0 if OK else < 0
+ **/
+gint lasso_logout_reset_session_index(LassoLogout *logout)
+{
+ LassoProfile *profile;
+
+ g_return_val_if_fail(LASSO_IS_LOGOUT(logout), -1);
+ profile = LASSO_PROFILE(logout);
+
+ g_return_val_if_fail(LASSO_IS_SESSION(profile->session), -1);
+
+ lasso_session_reset_index_providerID(profile->session);
+
+ return(0);
+}
+
+/**
* lasso_logout_validate_request:
* @logout: the logout object
*
@@ -810,130 +935,6 @@ lasso_logout_validate_request(LassoLogout *logout)
return(ret);
}
-/**
- * lasso_logout_process_response_msg:
- * @logout: the logout object
- * @response_msg: the response message
- * @response_method: the response method
- *
- * Process the response method :
- * build the logout response object
- * verify the status code value
- *
- * Return value: 0 if OK else < 0
- **/
-gint
-lasso_logout_process_response_msg(LassoLogout *logout,
- gchar *response_msg,
- lassoHttpMethod response_method)
-{
- LassoProfile *profile;
- xmlChar *statusCodeValue;
- LassoNode *statusCode;
- GError *err = NULL;
- gint ret = 0;
-
- g_return_val_if_fail(LASSO_IS_LOGOUT(logout), -1);
- g_return_val_if_fail(response_msg != NULL, -1);
-
- profile = LASSO_PROFILE(logout);
-
- /* build logout response object */
- switch (response_method) {
- case lassoHttpMethodSoap:
- profile->response = lasso_logout_response_new_from_export(response_msg, lassoNodeExportTypeSoap);
- break;
- case lassoHttpMethodRedirect:
- profile->response = lasso_logout_response_new_from_export(response_msg, lassoNodeExportTypeQuery);
- break;
- default:
- message(G_LOG_LEVEL_CRITICAL, "Invalid response method\n");
- ret = -1;
- goto done;
- }
- if (LASSO_IS_LOGOUT_RESPONSE(profile->response) == FALSE) {
- message(G_LOG_LEVEL_CRITICAL, "Message is not a LogoutResponse\n");
- 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");
- ret = -1;
- goto done;
- }
-
- statusCodeValue = lasso_node_get_attr_value(statusCode, "Value", NULL);
-
- if (!xmlStrEqual(statusCodeValue, lassoSamlStatusCodeSuccess)) {
- /* At SP, if the request method was a SOAP type, if at IDP, then rebuild the request message with HTTP method */
- if (profile->provider_type == lassoProviderTypeSp && profile->http_request_method == lassoHttpMethodSoap) {
- /* temporary vars */
- LassoProvider *provider;
- gchar *url, *query;
-
- provider = lasso_server_get_provider_ref(profile->server, profile->remote_providerID, &err);
- if (provider == NULL) {
- message(G_LOG_LEVEL_CRITICAL, err->message);
- ret = err->code;
- g_error_free(err);
- goto done;
- }
-
- /* FIXME : verify the IDP support a HTTP method */
-
- /* Build and optionaly sign the logout request QUERY message */
- url = lasso_provider_get_singleLogoutServiceURL(provider, lassoProviderTypeIdp, NULL);
- query = lasso_node_export_to_query(profile->request,
- profile->server->signature_method,
- profile->server->private_key);
- profile->msg_url = g_new(gchar, strlen(url)+strlen(query)+1+1);
- g_sprintf(profile->msg_url, "%s?%s", url, query);
- profile->msg_body = NULL;
-
- /* send a HTTP Redirect / GET method, so first remove session */
- lasso_session_remove_assertion(profile->session, profile->remote_providerID);
- }
-
- message(G_LOG_LEVEL_WARNING, "Status code value is not Success\n");
- ret = LASSO_LOGOUT_ERROR_UNSUPPORTED_PROFILE;
- goto done;
- }
-
- /* LogoutResponse status code value is ok, so remove assertion */
-
- profile->remote_providerID = lasso_node_get_child_content(profile->response, "ProviderID",
- NULL, NULL);
-
- /* response os ok, delete the assertion */
- lasso_session_remove_assertion(profile->session, profile->remote_providerID);
-
- /* response is ok, so delete the assertion */
- switch (profile->provider_type) {
- case lassoProviderTypeSp:
- /* */
- break;
- case lassoProviderTypeIdp:
- /* 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){
- 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;
- }
- break;
- default:
- message(G_LOG_LEVEL_CRITICAL, "Invalid provider type\n");
- }
-
- done:
-
- return(ret);
-}
-
/*****************************************************************************/
/* overrided parent class methods */
/*****************************************************************************/
diff --git a/lasso/id-ff/logout.h b/lasso/id-ff/logout.h
index 70bd77ff..fe760ea0 100644
--- a/lasso/id-ff/logout.h
+++ b/lasso/id-ff/logout.h
@@ -84,12 +84,15 @@ LASSO_EXPORT gint lasso_logout_process_request_msg (LassoLogout *lo
gchar *request_msg,
lassoHttpMethod request_method);
-LASSO_EXPORT gint lasso_logout_validate_request (LassoLogout *logout);
-
LASSO_EXPORT gint lasso_logout_process_response_msg (LassoLogout *logout,
gchar *response_msg,
lassoHttpMethod response_method);
-
+
+LASSO_EXPORT gint lasso_logout_reset_session_index (LassoLogout *logout);
+
+LASSO_EXPORT gint lasso_logout_validate_request (LassoLogout *logout);
+
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/lasso/id-ff/session.c b/lasso/id-ff/session.c
index dabd9d4b..c7dd8644 100644
--- a/lasso/id-ff/session.c
+++ b/lasso/id-ff/session.c
@@ -83,19 +83,19 @@ lasso_session_dump_assertion(gpointer key,
gint
lasso_session_add_assertion(LassoSession *session,
- gchar *remote_providerID,
+ gchar *providerID,
LassoNode *assertion)
{
int i;
gboolean found = FALSE;
g_return_val_if_fail(session != NULL, -1);
- g_return_val_if_fail(remote_providerID != NULL, -2);
+ g_return_val_if_fail(providerID != NULL, -2);
g_return_val_if_fail(assertion != NULL, -3);
/* add the remote provider id */
for(i = 0; i<session->providerIDs->len; i++) {
- if(xmlStrEqual(remote_providerID, g_ptr_array_index(session->providerIDs, i))) {
+ if(xmlStrEqual(providerID, g_ptr_array_index(session->providerIDs, i))) {
found = TRUE;
break;
}
@@ -104,13 +104,18 @@ lasso_session_add_assertion(LassoSession *session,
debug("An assertion existed already for this providerID, it was replaced by the new one.\n");
}
else {
- g_ptr_array_add(session->providerIDs, g_strdup(remote_providerID));
+ g_ptr_array_add(session->providerIDs, g_strdup(providerID));
}
/* add the assertion */
- g_hash_table_insert(session->assertions, g_strdup(remote_providerID),
+ g_hash_table_insert(session->assertions, g_strdup(providerID),
lasso_node_copy(assertion));
+ /* If index_providerID is -1, then set to 0 (now there is at least one assertion) */
+ if (session->index_providerID < 0) {
+ session->index_providerID = 0;
+ }
+
session->is_dirty = TRUE;
return(0);
@@ -187,15 +192,15 @@ lasso_session_dump(LassoSession *session)
LassoNode*
lasso_session_get_assertion(LassoSession *session,
- gchar *remote_providerID)
+ gchar *providerID)
{
LassoNode *assertion;
g_return_val_if_fail(session != NULL, NULL);
- g_return_val_if_fail(remote_providerID != NULL, NULL);
+ g_return_val_if_fail(providerID != NULL, NULL);
assertion = (LassoNode *)g_hash_table_lookup(session->assertions,
- remote_providerID);
+ providerID);
if (assertion == NULL) {
return NULL;
}
@@ -212,11 +217,11 @@ lasso_session_get_authentication_method(LassoSession *session,
gchar *authentication_method;
GError *err = NULL;
- if (remote_providerID == NULL) {
- providerID = lasso_session_get_next_assertion_remote_providerID(session);
+ if (providerID == NULL) {
+ providerID = lasso_session_get_next_providerID(session);
}
assertion = lasso_session_get_assertion(session, providerID);
- if (remote_providerID == NULL) {
+ if (providerID == NULL) {
g_free(providerID);
}
as = lasso_node_get_child(assertion, "AuthenticationStatement", NULL, NULL);
@@ -234,9 +239,9 @@ lasso_session_get_authentication_method(LassoSession *session,
}
gchar*
-lasso_session_get_next_assertion_remote_providerID(LassoSession *session)
+lasso_session_get_next_providerID(LassoSession *session)
{
- gchar *remote_providerID;
+ gchar *providerID;
g_return_val_if_fail(session!=NULL, NULL);
@@ -244,43 +249,64 @@ lasso_session_get_next_assertion_remote_providerID(LassoSession *session)
return(NULL);
}
- remote_providerID = g_strdup(g_ptr_array_index(session->providerIDs, 0));
+ if (session->index_providerID < 0) {
+ return(NULL);
+ }
+
+ /* get the next provider id and increments the index */
+ providerID = g_strdup(g_ptr_array_index(session->providerIDs, session->index_providerID));
+ session->index_providerID++;
- return(remote_providerID);
+ return(providerID);
}
gint
lasso_session_remove_assertion(LassoSession *session,
- gchar *remote_providerID)
+ gchar *providerID)
{
LassoNode *assertion;
int i;
g_return_val_if_fail(session != NULL, -1);
- g_return_val_if_fail(remote_providerID != NULL, -2);
+ g_return_val_if_fail(providerID != NULL, -2);
/* remove the assertion */
- assertion = lasso_session_get_assertion(session, remote_providerID);
+ assertion = lasso_session_get_assertion(session, providerID);
if (assertion != NULL) {
- debug("Remove assertion of remote provider id %s\n", remote_providerID);
- g_hash_table_remove(session->assertions, remote_providerID);
+ debug("Remove assertion of remote provider id %s\n", providerID);
+ g_hash_table_remove(session->assertions, providerID);
lasso_node_destroy(assertion);
}
/* remove the remote provider id */
for(i = 0; i<session->providerIDs->len; i++) {
- if(xmlStrEqual(remote_providerID, g_ptr_array_index(session->providerIDs, i))) {
- debug("Remove remote provider id %s\n", remote_providerID);
+ if(xmlStrEqual(providerID, g_ptr_array_index(session->providerIDs, i))) {
+ debug("Remove remote provider id %s\n", providerID);
g_ptr_array_remove_index(session->providerIDs, i);
break;
}
}
+ /* decrements the index of provider id */
+ session->index_providerID--;
+
session->is_dirty = TRUE;
return(0);
}
+gint
+lasso_session_reset_index_providerID(LassoSession *session)
+{
+ g_return_val_if_fail(session != NULL, -1);
+
+ if (session->index_providerID >= 0) {
+ session->index_providerID = 0;
+ }
+
+ return(0);
+}
+
/*****************************************************************************/
/* overrided parent class methods */
/*****************************************************************************/
@@ -336,6 +362,7 @@ lasso_session_instance_init(LassoSession *session)
session->assertions = g_hash_table_new_full(g_str_hash, g_str_equal,
(GDestroyNotify)g_free,
(GDestroyNotify)lasso_node_destroy);
+ session->index_providerID = -1; /* There is no assertion yet, so index_providerID is set to -1 */
session->is_dirty = TRUE;
}
@@ -390,7 +417,7 @@ lasso_session_new_from_dump(gchar *dump)
LassoNode *session_node;
LassoNode *assertions_node, *assertion_node, *assertion;
xmlNodePtr assertions_xmlNode, assertion_xmlNode;
- xmlChar *remote_providerID;
+ xmlChar *providerID;
GError *err = NULL;
g_return_val_if_fail(dump != NULL, NULL);
@@ -418,16 +445,16 @@ lasso_session_new_from_dump(gchar *dump)
xmlStrEqual(assertion_xmlNode->name, LASSO_SESSION_ASSERTION_NODE)) {
/* assertion node */
assertion_node = lasso_node_new_from_xmlNode(assertion_xmlNode);
- remote_providerID = lasso_node_get_attr_value(assertion_node,
+ providerID = lasso_node_get_attr_value(assertion_node,
LASSO_SESSION_REMOTE_PROVIDERID_ATTR,
&err);
- if (remote_providerID != NULL) {
+ if (providerID != NULL) {
assertion = lasso_node_get_child(assertion_node,
"Assertion",
NULL, /* lassoLibHRef, FIXME changed for SourceID */
&err);
if (assertion != NULL) {
- lasso_session_add_assertion(session, remote_providerID, assertion);
+ lasso_session_add_assertion(session, providerID, assertion);
lasso_node_destroy(assertion);
}
else {
@@ -439,7 +466,7 @@ lasso_session_new_from_dump(gchar *dump)
message(G_LOG_LEVEL_CRITICAL, err->message);
g_clear_error(&err);
}
- g_free(remote_providerID);
+ g_free(providerID);
lasso_node_destroy(assertion_node);
}
assertion_xmlNode = assertion_xmlNode->next;
diff --git a/lasso/id-ff/session.h b/lasso/id-ff/session.h
index 5db2de44..2a1488c3 100644
--- a/lasso/id-ff/session.h
+++ b/lasso/id-ff/session.h
@@ -54,7 +54,10 @@ struct _LassoSession {
gboolean is_dirty;
/*< private >*/
- LassoSessionPrivate *private;
+ LassoSessionPrivate *private; /* Index of the current remote provider id in the providerIDs list */
+
+ gint index_providerID;
+
};
struct _LassoSessionClass {
@@ -68,7 +71,7 @@ LASSO_EXPORT LassoSession* lasso_session_new (
LASSO_EXPORT LassoSession* lasso_session_new_from_dump (gchar *dump);
LASSO_EXPORT gint lasso_session_add_assertion (LassoSession *session,
- gchar *remote_providerID,
+ gchar *providerID,
LassoNode *assertion);
LASSO_EXPORT LassoSession* lasso_session_copy (LassoSession *session);
@@ -78,15 +81,17 @@ LASSO_EXPORT void lasso_session_destroy (
LASSO_EXPORT gchar* lasso_session_dump (LassoSession *session);
LASSO_EXPORT LassoNode* lasso_session_get_assertion (LassoSession *session,
- gchar *remote_providerID);
+ gchar *providerID);
LASSO_EXPORT gchar* lasso_session_get_authentication_method (LassoSession *session,
- gchar *remote_providerID);
+ gchar *providerID);
-LASSO_EXPORT gchar* lasso_session_get_next_assertion_remote_providerID (LassoSession *session);
+LASSO_EXPORT gchar* lasso_session_get_next_providerID (LassoSession *session);
LASSO_EXPORT gint lasso_session_remove_assertion (LassoSession *session,
- gchar *remote_providerID);
+ gchar *providerID);
+
+LASSO_EXPORT gint lasso_session_reset_index_providerID (LassoSession *session);
#ifdef __cplusplus
}