SAMLv2: add new methods to class LassoAssertionQuery

* lasso_assertion_query_add_attribute_request:
   helper to setup request attribute for AttributeQuery messages.
 * lasso_assertion_query_get_request_type:
   method to find the type of the last received query.
 * fixes #90
This commit is contained in:
Benjamin Dauvergne 2010-06-10 13:38:00 +00:00
parent e69cbabde1
commit c6fa47127e
4 changed files with 126 additions and 0 deletions

View File

@ -41,6 +41,10 @@ const char*
lasso_strerror(int error_code)
{
switch (error_code) {
case LASSO_ASSERTION_QUERY_ERROR_ATTRIBUTE_REQUEST_ALREADY_EXIST:
return "Tried to add the same attribute request a second time.";
case LASSO_ASSERTION_QUERY_ERROR_NOT_AN_ATTRIBUTE_QUERY:
return "The current assertion query does not contain an attribute query.";
case LASSO_DATA_SERVICE_ERROR_CANNOT_ADD_ITEM:
return "LASSO_DATA_SERVICE_ERROR_CANNOT_ADD_ITEM";
case LASSO_DATA_SERVICE_ERROR_UNREGISTERED_DST:

View File

@ -1037,3 +1037,17 @@
* The item_id was not found in the current query request.
*/
#define LASSO_IDWSF2_DST_ERROR_ITEM_NOT_FOUND 1804
/**
* LASSO_ASSERTION_QUERY_ERROR_ATTRIBUTE_REQUEST_ALREADY_EXIST:
*
* Tried to add the same attribute request a second time.
*/
#define LASSO_ASSERTION_QUERY_ERROR_ATTRIBUTE_REQUEST_ALREADY_EXIST 1901
/**
* LASSO_ASSERTION_QUERY_ERROR_NOT_AN_ATTRIBUTE_QUERY
*
* The current assertion query does not contain an attribute query.
*/
#define LASSO_ASSERTION_QUERY_ERROR_NOT_AN_ATTRIBUTE_QUERY 1902

View File

@ -396,6 +396,104 @@ cleanup:
return rc;
}
static LassoSaml2Attribute*
lasso_assertion_query_lookup_attribute(LassoAssertionQuery *assertion_query, char *format, char *name)
{
LassoSaml2Attribute *result = NULL;
LassoSamlp2AttributeQuery *query = NULL;
g_return_val_if_fail(LASSO_IS_ASSERTION_QUERY(assertion_query) || ! format || ! name,
NULL);
query = (LassoSamlp2AttributeQuery*) assertion_query->parent.request;
g_return_val_if_fail(LASSO_IS_SAMLP2_ATTRIBUTE_QUERY(query), NULL);
lasso_foreach_full_begin(LassoSaml2Attribute*, attribute, it, query->Attribute)
{
if (LASSO_IS_SAML2_ATTRIBUTE(attribute) &&
g_strcmp0(attribute->NameFormat, format) == 0 &&
g_strcmp0(attribute->Name, name) == 0)
{
result = attribute;
break;
}
}
lasso_foreach_full_end()
return result;
}
/**
* lasso_assertion_query_add_attribute_request:
* @assertion_query: a #LassoAssertionQuery object
* @attribute_format: the attribute designator format
* @attribute_name: the attribute designator name
*
* Append a new attribute designator to the current attribute request.
*
* Return value: 0 if successful, an error code otherwise.
*/
int
lasso_assertion_query_add_attribute_request(LassoAssertionQuery *assertion_query,
char *format, char *name)
{
int rc = 0;
LassoSaml2Attribute *attribute = NULL;
LassoSamlp2AttributeQuery *query = NULL;
lasso_bad_param(ASSERTION_QUERY, assertion_query);
lasso_null_param(format);
lasso_null_param(name);
query = (LassoSamlp2AttributeQuery*) assertion_query->parent.request;
g_return_val_if_fail(LASSO_IS_SAMLP2_ATTRIBUTE_QUERY(query),
LASSO_ASSERTION_QUERY_ERROR_NOT_AN_ATTRIBUTE_QUERY);
/* Check unicity */
attribute = lasso_assertion_query_lookup_attribute(assertion_query, format, name);
if (attribute != NULL) {
return LASSO_ASSERTION_QUERY_ERROR_ATTRIBUTE_REQUEST_ALREADY_EXIST;
}
/* Do the work */
attribute = (LassoSaml2Attribute*)lasso_saml2_attribute_new();
lasso_assign_string(attribute->NameFormat, format);
lasso_assign_string(attribute->Name, name);
lasso_list_add_new_gobject(query->Attribute, attribute);
return rc;
}
/**
* lasso_assertion_query_get_request_type:
* @assertion_query: a #LassoAssertionQuery object
*
* Return the type of the last processed request.
*
* Return value: a #LassoAssertionQueryRequestType value
*/
LassoAssertionQueryRequestType
lasso_assertion_query_get_request_type(LassoAssertionQuery *assertion_query)
{
LassoNode *request;
GType type;
g_return_val_if_fail(LASSO_IS_ASSERTION_QUERY(assertion_query),
LASSO_ASSERTION_QUERY_REQUEST_TYPE_UNSET);
request = assertion_query->parent.request;
if (! G_IS_OBJECT(request))
return LASSO_ASSERTION_QUERY_REQUEST_TYPE_UNSET;
type = G_OBJECT_TYPE(request);
if (type == LASSO_TYPE_SAMLP2_ASSERTION_ID_REQUEST)
return LASSO_ASSERTION_QUERY_REQUEST_TYPE_ASSERTION_ID;
if (type == LASSO_TYPE_SAMLP2_AUTHN_QUERY)
return LASSO_ASSERTION_QUERY_REQUEST_TYPE_AUTHN;
if (type == LASSO_TYPE_SAMLP2_ATTRIBUTE_QUERY)
return LASSO_ASSERTION_QUERY_REQUEST_TYPE_ATTRIBUTE;
if (type == LASSO_TYPE_SAMLP2_AUTHZ_DECISION_QUERY)
return LASSO_ASSERTION_QUERY_REQUEST_TYPE_AUTHZ_DECISION;
return LASSO_ASSERTION_QUERY_REQUEST_TYPE_UNSET;
}
/*****************************************************************************/
/* private methods */

View File

@ -86,6 +86,7 @@ struct _LassoAssertionQueryClass {
LASSO_EXPORT GType lasso_assertion_query_get_type(void);
LASSO_EXPORT LassoAssertionQuery *lasso_assertion_query_new(LassoServer *server);
LASSO_EXPORT void lasso_assertion_query_destroy(LassoAssertionQuery *assertion_query);
LASSO_EXPORT gint lasso_assertion_query_init_request(
@ -93,20 +94,29 @@ LASSO_EXPORT gint lasso_assertion_query_init_request(
char *remote_provider_id,
LassoHttpMethod http_method,
LassoAssertionQueryRequestType query_request_type);
LASSO_EXPORT gint lasso_assertion_query_validate_request(
LassoAssertionQuery *assertion_query);
LASSO_EXPORT gint lasso_assertion_query_build_request_msg(
LassoAssertionQuery *assertion_query);
LASSO_EXPORT gint lasso_assertion_query_process_request_msg(
LassoAssertionQuery *assertion_query,
gchar *request_msg);
LASSO_EXPORT int lasso_assertion_query_build_response_msg(
LassoAssertionQuery *assertion_query);
LASSO_EXPORT gint lasso_assertion_query_process_response_msg(
LassoAssertionQuery *assertion_query,
gchar *response_msg);
LASSO_EXPORT int lasso_assertion_query_add_attribute_request(LassoAssertionQuery *assertion_query,
char *format, char *name);
LASSO_EXPORT LassoAssertionQueryRequestType lasso_assertion_query_get_request_type(
LassoAssertionQuery *assertion_query);
#ifdef __cplusplus
}