diff options
| author | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2010-06-10 13:38:00 +0000 |
|---|---|---|
| committer | Benjamin Dauvergne <bdauvergne@entrouvert.com> | 2010-06-10 13:38:00 +0000 |
| commit | c6fa47127ed38e8bb07399791919299adcdfb2a8 (patch) | |
| tree | 0fdd64f1489611809b252a10474ef84139a402e6 | |
| parent | e69cbabde1599325de8eb24c08b0353f503b4ea8 (diff) | |
| download | lasso-c6fa47127ed38e8bb07399791919299adcdfb2a8.tar.gz lasso-c6fa47127ed38e8bb07399791919299adcdfb2a8.tar.xz lasso-c6fa47127ed38e8bb07399791919299adcdfb2a8.zip | |
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
| -rw-r--r-- | lasso/errors.c | 4 | ||||
| -rw-r--r-- | lasso/errors.h | 14 | ||||
| -rw-r--r-- | lasso/saml-2.0/assertion_query.c | 98 | ||||
| -rw-r--r-- | lasso/saml-2.0/assertion_query.h | 10 |
4 files changed, 126 insertions, 0 deletions
diff --git a/lasso/errors.c b/lasso/errors.c index 9ef02655..f3e829e0 100644 --- a/lasso/errors.c +++ b/lasso/errors.c @@ -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: diff --git a/lasso/errors.h b/lasso/errors.h index 9be828c2..c306feaa 100644 --- a/lasso/errors.h +++ b/lasso/errors.h @@ -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 diff --git a/lasso/saml-2.0/assertion_query.c b/lasso/saml-2.0/assertion_query.c index 029d0e48..21aafb97 100644 --- a/lasso/saml-2.0/assertion_query.c +++ b/lasso/saml-2.0/assertion_query.c @@ -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 */ diff --git a/lasso/saml-2.0/assertion_query.h b/lasso/saml-2.0/assertion_query.h index 8d8c6644..0f240f88 100644 --- a/lasso/saml-2.0/assertion_query.h +++ b/lasso/saml-2.0/assertion_query.h @@ -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 } |
