summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Clapies <nclapies@entrouvert.com>2004-09-07 13:20:15 +0000
committerNicolas Clapies <nclapies@entrouvert.com>2004-09-07 13:20:15 +0000
commitde7d014d90f0566ee82fd72a39744af6897930f7 (patch)
tree4ebfffa621eec3286bc5029073eaf38e467071e3
parent66ff07ce2a75a13f48513985223a5d3767f57da2 (diff)
Updated the API developer documentation
-rw-r--r--lasso/id-ff/logout.c139
1 files changed, 84 insertions, 55 deletions
diff --git a/lasso/id-ff/logout.c b/lasso/id-ff/logout.c
index c82320f6..a919ad61 100644
--- a/lasso/id-ff/logout.c
+++ b/lasso/id-ff/logout.c
@@ -48,7 +48,10 @@ struct _LassoLogoutPrivate
* lasso_logout_dump:
* @logout: the logout object
*
- * This method dumps the logout object in string xml form.
+ * This method dumps the logout object in string a xml message.
+ * it first adds profile informations.
+ * Next, it adds his logout informations (initial_request, initial_response,
+ * initial_remote_providerID and providerID_index).
*
* Return value: a newly allocated string or NULL
**/
@@ -110,16 +113,18 @@ lasso_logout_dump(LassoLogout *logout)
*
* It gets the single logout protocol profile of the remote provider and :
* if it is a SOAP method, then it builds the logout request SOAP message,
- * set the msg_body attribute, get the single logout service url
- * and set the msg_url attribute of the logout object.
+ * sets the msg_body attribute, gets the single logout service url
+ * and sets the msg_url attribute of the logout object.
*
* if it is a HTTP-Redirect method, then it builds the logout request QUERY message,
- * builds the logout request url, set the msg_url to the logout request url,
- * set the msg_body to NULL
+ * builds the logout request url, sets the msg_url to the logout request url,
+ * sets the msg_body to NULL
*
- * HTTP-GET : TODO
+ * Optionaly ( if private key and certificates paths are set in server object )
+ * it signs the message (with X509 if a SOAP message,
+ * else with simple signature if a QUERY message )
*
- * Return value: a newly allocated string or NULL
+ * Return value: 0 if ok, else < 0
**/
gint
lasso_logout_build_request_msg(LassoLogout *logout)
@@ -226,16 +231,18 @@ lasso_logout_build_request_msg(LassoLogout *logout)
*
* It gets the request message method and :
* if it is a SOAP method, then it builds the logout response SOAP message,
- * set the msg_body attribute, get the single logout service return url
- * and set the msg_url attribute of the logout object.
+ * sets the msg_body attribute, gets the single logout service return url
+ * and sets the msg_url attribute of the logout object.
*
* if it is a HTTP-Redirect method, then it builds the logout response QUERY message,
- * builds the logout response url, set the msg_url to the logout response url,
- * set the msg_body to NULL
+ * builds the logout response url, sets the msg_url with the logout response url,
+ * sets the msg_body with NULL
*
- * HTTP-GET : TODO
+ * Optionaly ( if private key and certificates paths are set in server object )
+ * it signs the message (with X509 if a SOAP message,
+ * else with simple signature if a QUERY message )
*
- * Return value:
+ * Return value: 0 if ok, else < 0
**/
gint
lasso_logout_build_response_msg(LassoLogout *logout)
@@ -273,7 +280,7 @@ lasso_logout_build_response_msg(LassoLogout *logout)
goto done;
}
- /* build a SOAP or HTTP-Redirect logout response message */
+ /* build logout response message */
switch (profile->http_request_method) {
case lassoHttpMethodSoap:
/* optionaly sign the response message */
@@ -284,7 +291,6 @@ lasso_logout_build_response_msg(LassoLogout *logout)
profile->server->certificate);
}
- /* build the logout response messsage */
profile->msg_url = NULL;
profile->msg_body = lasso_node_export_to_soap(profile->response);
break;
@@ -336,11 +342,11 @@ lasso_logout_destroy(LassoLogout *logout)
* lasso_logout_get_next_providerID:
* @logout: the logout object
*
- * 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.
+ * This method returns the provider id from providerID_index in list of providerIDs in session object.
+ * excepted the initial service provider id :
+ * It gets the remote provider id in session from the logout providerID_index.
+ * If it is the initial remote provider id, then it asks the next provider id
+ * from providerID_index + 1;
*
* Return value: a newly allocated string or NULL
**/
@@ -351,11 +357,13 @@ lasso_logout_get_next_providerID(LassoLogout *logout)
gchar *providerID;
g_return_val_if_fail(LASSO_IS_LOGOUT(logout), NULL);
+ g_return_val_if_fail(LASSO_IS_SESSION(profile->session), NULL);
+
profile = LASSO_PROFILE(logout);
- g_return_val_if_fail(LASSO_IS_SESSION(profile->session), NULL);
providerID = lasso_session_get_provider_index(profile->session, logout->providerID_index);
logout->providerID_index++;
+
/* if it is the provider id of the SP requester, then get the next */
if (logout->initial_remote_providerID && xmlStrEqual(providerID, logout->initial_remote_providerID)) {
providerID = lasso_session_get_provider_index(profile->session, logout->providerID_index);
@@ -367,15 +375,18 @@ lasso_logout_get_next_providerID(LassoLogout *logout)
/**
* lasso_logout_init_request:
- * @logout: the logout object
- * @remote_providerID: The provider id of the logout requested provider.
- * If it is set to NULL, then gets the default first remote provider id.
- *
- * It sets a new logout request to the remote provider id
- * with the provider id of the requester (from the server object )
- * and name identifier of the federated principal
+ * @logout:
+ * @remote_providerID:
+ * @request_method: if set, then it get the protocol profile in metadata
+ * corresponding of this HTTP request method.
+ *
+ * First it verifies session and identity are set.
+ * Next, gets federation with the remote provider and gets the name identifier for the request.
+ * gets the protocol profile and build the logout request object.
+ * If the local provider is a Service Provider and if the protocol profile is a HTTP Redirect / GET method,
+ * then removes the assertion.
*
- * Return value: 0 if OK else < 0
+ * Return value: 0 if ok, else < 0
**/
gint
lasso_logout_init_request(LassoLogout *logout,
@@ -389,10 +400,8 @@ lasso_logout_init_request(LassoLogout *logout,
xmlChar *content = NULL, *nameQualifier = NULL, *format = NULL;
xmlChar *singleLogoutProtocolProfile = NULL;
GError *err = NULL;
- gint ret = 0;
-
- /* FIXME : should use a var to know if the protocol profile is SOAP or HTTP GET ? */
gboolean is_http_redirect_get_method = FALSE;
+ gint ret = 0;
g_return_val_if_fail(LASSO_IS_LOGOUT(logout), -1);
@@ -432,15 +441,17 @@ lasso_logout_init_request(LassoLogout *logout,
goto done;
}
- /* get the name identifier (!!! depend on the provider type : SP or IDP !!!)*/
+ /* get the name identifier */
switch (profile->provider_type) {
case lassoProviderTypeSp:
+ /* SP : get the local name identifier, if it is NULL, then get the remote name identifier */
nameIdentifier = lasso_federation_get_local_nameIdentifier(federation);
if (nameIdentifier == NULL) {
nameIdentifier = lasso_federation_get_remote_nameIdentifier(federation);
}
break;
case lassoProviderTypeIdp:
+ /* IDP : get the remote name identifier, if it is NULL, then get the local name identifier */
nameIdentifier = lasso_federation_get_remote_nameIdentifier(federation);
if (nameIdentifier == NULL) {
nameIdentifier = lasso_federation_get_local_nameIdentifier(federation);
@@ -459,12 +470,12 @@ lasso_logout_init_request(LassoLogout *logout,
goto done;
}
- /* build the request */
+ /* get name identifier attributes */
content = lasso_node_get_content(nameIdentifier, NULL);
nameQualifier = lasso_node_get_attr_value(nameIdentifier, "NameQualifier", NULL);
format = lasso_node_get_attr_value(nameIdentifier, "Format", NULL);
- /* get the single logout protocol profile and set a new logout request object */
+ /* get the provider */
provider = lasso_server_get_provider_ref(profile->server, profile->remote_providerID, &err);
if (provider == NULL) {
message(G_LOG_LEVEL_CRITICAL, err->message);
@@ -562,17 +573,18 @@ lasso_logout_init_request(LassoLogout *logout,
* @request_msg: the logout request message
* @request_method: the logout request method
*
- * Process a logout request.
+ * Processes a logout request.
* if it is a SOAP request method then it builds the logout request object
- * from the SOAP message and optionaly verify the signature of the logout request.
+ * from the SOAP message and optionaly verifies the signature of the logout request.
*
* if it is a HTTP-Redirect request method then it builds the logout request object
- * from the QUERY message and verify the signature
+ * from the QUERY message and verify the signature. If there is an error while parsing the query,
+ * then returns the code error LASSO_PROFILE_ERROR_INVALID_QUERY.
*
- * Set the msg_nameIdentifier attribute with the NameIdentifier content of the logout object and
- * optionaly set the msg_relayState attribute with the RelayState of the logout request
+ * Saves the HTTP request method.
+ * Saves the name identifier.
*
- * Return value: 0 if OK else < 0
+ * Return value: 0 if OK else LASSO_PROFILE_ERROR_INVALID_QUERY or < 0
**/
gint lasso_logout_process_request_msg(LassoLogout *logout,
gchar *request_msg,
@@ -658,11 +670,22 @@ gint lasso_logout_process_request_msg(LassoLogout *logout,
* @response_msg: the response message
* @response_method: the response method
*
- * Process the response method :
- * build the logout response object
- * verify the status code value
+ * Parses the response message and builds the response object :
+ * if there is an error while parsing the HTTP Redirect / GET message,
+ * then returns a LASSO_PROFILE_ERROR_INVALID_QUERY code error.
+ * Get the status code value :
+ * if it is not success, then if the local provider is a Service Provider and response method is SOAP,
+ * then builds a new logout request message for HTTP Redirect / GET method and returns the code error
+ * LASSO_LOGOUT_ERROR_UNSUPPORTED_PROFILE and exits.
+ *
+ * Sets the remote provider id.
+ * Sets the relay state.
+ *
+ * if it is a SOAP method or, IDP provider type and http method is Redirect / GET, then removes assertion.
*
- * Return value: 0 if OK else < 0
+ * If local server is an Identity Provider and if there is no more assertion (Identity Provider has logged out every Service Providers),
+ * then restores the initial response.
+ * Return value: 0 if OK else LASSO_LOGOUT_ERROR_UNSUPPORTED_PROFILE or < 0
**/
gint
lasso_logout_process_response_msg(LassoLogout *logout,
@@ -755,7 +778,7 @@ lasso_logout_process_response_msg(LassoLogout *logout,
ret = LASSO_LOGOUT_ERROR_UNSUPPORTED_PROFILE;
}
else {
- message(G_LOG_LEVEL_CRITICAL, "Status code is not succecc : %s\n", statusCodeValue);
+ message(G_LOG_LEVEL_CRITICAL, "Status code is not success : %s\n", statusCodeValue);
ret = -1;
}
@@ -773,7 +796,7 @@ lasso_logout_process_response_msg(LassoLogout *logout,
/* set the msg_relayState */
profile->msg_relayState = lasso_node_get_child_content(profile->response, "RelayState", lassoLibHRef, NULL);
- /* Only if SOAP method or, if IDP provider type and HTTP Redirect, then remove assertion */
+ /* if SOAP method or, if IDP provider type and HTTP Redirect, then remove assertion */
if ( (response_method == lassoHttpMethodSoap) || (profile->provider_type == lassoProviderTypeIdp && response_method == lassoHttpMethodRedirect) ) {
ret = lasso_session_remove_assertion(profile->session, profile->remote_providerID);
if (profile->provider_type == lassoProviderTypeIdp && logout->providerID_index >= 0) {
@@ -814,9 +837,9 @@ lasso_logout_process_response_msg(LassoLogout *logout,
* lasso_logout_reset_providerID_index:
* @logout: the logout object
*
- * Call the reset of the index provider id in session object
+ * Reset the providerID_index attribute (set to 0).
*
- * Return value: 0 if OK else < 0
+ * Return value: 0
**/
gint lasso_logout_reset_providerID_index(LassoLogout *logout)
{
@@ -831,12 +854,18 @@ gint lasso_logout_reset_providerID_index(LassoLogout *logout)
* lasso_logout_validate_request:
* @logout: the logout object
*
- * Validate the logout request :
- * sets the logout response
- * verifies the ProviderID
- * verifies the federation with the NameIdentifier
- * verifies the authentication with the NameIdentifier
- * if SOAP method at identity provider, verify all the remote service providers support SOAP method.
+ * Sets the remote provider id
+ * Sets a logout response with status code value to success.
+ * Verifies federation and authentication.
+ * If the request http method is a SOAP method, then verifies every other
+ * Service Providers supports SOAP method : if not, then sets status code value to
+ * UnsupportedProfile and returns a code error with LASSO_LOGOUT_ERROR_UNSUPPORTED_PROFILE.
+ *
+ * Every tests are ok, then removes assertion.
+ * (profile->provider_type == lassoProviderTypeIdp && profile->session->providerIDs->len >= 1)
+ * If local server is an Identity Provider and if there is more than one Service Provider
+ * (except the initial Service Provider),
+ * then saves the initial request, response and remote provider id.
*
* Return value: O if OK else < 0
**/