summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Dauvergne <bdauvergne@entrouvert.com>2010-06-10 13:38:00 +0000
committerBenjamin Dauvergne <bdauvergne@entrouvert.com>2010-06-10 13:38:00 +0000
commitc6fa47127ed38e8bb07399791919299adcdfb2a8 (patch)
tree0fdd64f1489611809b252a10474ef84139a402e6
parente69cbabde1599325de8eb24c08b0353f503b4ea8 (diff)
downloadlasso-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.c4
-rw-r--r--lasso/errors.h14
-rw-r--r--lasso/saml-2.0/assertion_query.c98
-rw-r--r--lasso/saml-2.0/assertion_query.h10
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
}