summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorValery Febvre <vfebvre at easter-eggs.com>2004-07-23 13:28:08 +0000
committerValery Febvre <vfebvre at easter-eggs.com>2004-07-23 13:28:08 +0000
commit5da1b0185ae35cdeb24efd4fc8c642ee3d1f6bd0 (patch)
tree14f6777868da44d4da244bad67f1132cfe045fa5
parent25c73745541cd659babe96bbb9daf6872f409479 (diff)
downloadlasso-5da1b0185ae35cdeb24efd4fc8c642ee3d1f6bd0.tar.gz
lasso-5da1b0185ae35cdeb24efd4fc8c642ee3d1f6bd0.tar.xz
lasso-5da1b0185ae35cdeb24efd4fc8c642ee3d1f6bd0.zip
- Added a third arg (GError **err) in lasso_node_get_attr_value()
method to report errors - Replaced some lasso_provider_get_providerID() by direct access to ProviderID attribute of server objects
-rw-r--r--lasso/Attic/protocols/authn_response.c13
-rw-r--r--lasso/Attic/protocols/elements/authentication_statement.c8
-rw-r--r--lasso/Attic/protocols/logout_response.c26
-rw-r--r--lasso/Attic/protocols/provider.c77
-rw-r--r--lasso/Attic/protocols/provider.h12
-rw-r--r--lasso/id-ff/federation_termination.c13
-rw-r--r--lasso/id-ff/lecp.c10
-rw-r--r--lasso/id-ff/login.c31
-rw-r--r--lasso/id-ff/logout.c10
-rw-r--r--lasso/id-ff/name_identifier_mapping.c69
-rw-r--r--lasso/id-ff/profile_context.c12
-rw-r--r--lasso/id-ff/register_name_identifier.c51
-rw-r--r--lasso/id-ff/server.c31
-rw-r--r--lasso/xml/errors.c6
-rw-r--r--lasso/xml/errors.h2
-rw-r--r--lasso/xml/xml.c26
-rw-r--r--lasso/xml/xml.h14
17 files changed, 272 insertions, 139 deletions
diff --git a/lasso/Attic/protocols/authn_response.c b/lasso/Attic/protocols/authn_response.c
index 6daf7963..e9f1deb8 100644
--- a/lasso/Attic/protocols/authn_response.c
+++ b/lasso/Attic/protocols/authn_response.c
@@ -54,10 +54,21 @@ lasso_authn_response_set_status(LassoAuthnResponse *response,
xmlChar *
lasso_authn_response_get_status(LassoAuthnResponse *response) {
LassoNode *status_code;
+ xmlChar *value;
+ GError *err = NULL;
status_code = lasso_node_get_child(LASSO_NODE(response), "StatusCode", NULL);
if (status_code != NULL) {
- return lasso_node_get_attr_value(status_code, "Value");
+ value = lasso_node_get_attr_value(status_code, "Value", &err);
+ lasso_node_destroy(status_code);
+ if (err != NULL) {
+ debug(ERROR, err->message);
+ g_error_free(err);
+ return (NULL);
+ }
+ else {
+ return (value);
+ }
}
else {
debug(ERROR, "No StatusCode element found in AuthnResponse.\n");
diff --git a/lasso/Attic/protocols/elements/authentication_statement.c b/lasso/Attic/protocols/elements/authentication_statement.c
index 0ea5a7b9..70d150c9 100644
--- a/lasso/Attic/protocols/elements/authentication_statement.c
+++ b/lasso/Attic/protocols/elements/authentication_statement.c
@@ -101,12 +101,12 @@ lasso_authentication_statement_new(const xmlChar *authenticationMethod
str = lasso_node_get_content(LASSO_NODE(idp_identifier));
new_identifier = lasso_saml_name_identifier_new(str);
xmlFree(str);
- str = lasso_node_get_attr_value(LASSO_NODE(idp_identifier), "NameQualifier");
+ str = lasso_node_get_attr_value(LASSO_NODE(idp_identifier), "NameQualifier", NULL);
if (str != NULL) {
lasso_saml_name_identifier_set_nameQualifier(LASSO_SAML_NAME_IDENTIFIER(new_identifier), str);
xmlFree(str);
}
- str = lasso_node_get_attr_value(LASSO_NODE(idp_identifier), "Format");
+ str = lasso_node_get_attr_value(LASSO_NODE(idp_identifier), "Format", NULL);
if (str != NULL) {
lasso_saml_name_identifier_set_format(LASSO_SAML_NAME_IDENTIFIER(new_identifier), str);
xmlFree(str);
@@ -123,12 +123,12 @@ lasso_authentication_statement_new(const xmlChar *authenticationMethod
str = lasso_node_get_content(LASSO_NODE(idp_identifier));
new_idp_identifier = lasso_lib_idp_provided_name_identifier_new(str);
xmlFree(str);
- str = lasso_node_get_attr_value(LASSO_NODE(idp_identifier), "NameQualifier");
+ str = lasso_node_get_attr_value(LASSO_NODE(idp_identifier), "NameQualifier", NULL);
if (str != NULL) {
lasso_saml_name_identifier_set_nameQualifier(LASSO_SAML_NAME_IDENTIFIER(new_idp_identifier), str);
xmlFree(str);
}
- str = lasso_node_get_attr_value(LASSO_NODE(idp_identifier), "Format");
+ str = lasso_node_get_attr_value(LASSO_NODE(idp_identifier), "Format", NULL);
if (str != NULL) {
lasso_saml_name_identifier_set_format(LASSO_SAML_NAME_IDENTIFIER(new_idp_identifier), str);
xmlFree(str);
diff --git a/lasso/Attic/protocols/logout_response.c b/lasso/Attic/protocols/logout_response.c
index 05c01b43..3eaac369 100644
--- a/lasso/Attic/protocols/logout_response.c
+++ b/lasso/Attic/protocols/logout_response.c
@@ -32,13 +32,27 @@
gchar*
lasso_logout_response_get_status_code_value(LassoLogoutResponse *response)
{
- LassoNodeClass *statusCode_class;
- LassoNode *statusCode_node;
-
- statusCode_node = lasso_node_get_child(LASSO_NODE(response), "StatusCode", NULL);
- statusCode_class = LASSO_NODE_GET_CLASS(statusCode_node);
+ LassoNode *status_code;
+ xmlChar *value;
+ GError *err = NULL;
- return(statusCode_class->get_attr_value(statusCode_node, "Value"));
+ status_code = lasso_node_get_child(LASSO_NODE(response), "StatusCode", NULL);
+ if (status_code != NULL) {
+ value = lasso_node_get_attr_value(status_code, "Value", &err);
+ lasso_node_destroy(status_code);
+ if (err != NULL) {
+ debug(ERROR, err->message);
+ g_error_free(err);
+ return (NULL);
+ }
+ else {
+ return (value);
+ }
+ }
+ else {
+ debug(ERROR, "No StatusCode element found in Response.\n");
+ return (NULL);
+ }
}
/*****************************************************************************/
diff --git a/lasso/Attic/protocols/provider.c b/lasso/Attic/protocols/provider.c
index 22589be4..1a0414a5 100644
--- a/lasso/Attic/protocols/provider.c
+++ b/lasso/Attic/protocols/provider.c
@@ -24,6 +24,7 @@
*/
#include <lasso/protocols/provider.h>
+#include <lasso/xml/errors.h>
struct _LassoProviderPrivate
{
@@ -64,51 +65,102 @@ lasso_provider_dump(LassoProvider *provider)
}
gchar *
-lasso_provider_get_assertionConsumerServiceURL(LassoProvider *provider)
+lasso_provider_get_assertionConsumerServiceURL(LassoProvider *provider)
{
return(lasso_node_get_child_content(provider->metadata, "AssertionConsumerServiceURL", NULL));
}
gchar *
-lasso_provider_get_federationTerminationNotificationProtocolProfile(LassoProvider *provider)
+lasso_provider_get_federationTerminationNotificationProtocolProfile(LassoProvider *provider)
{
return(lasso_node_get_child_content(provider->metadata, "FederationTerminationNotificationProtocolProfile", NULL));
}
gchar *
-lasso_provider_get_federationTerminationReturnServiceURL(LassoProvider *provider)
+lasso_provider_get_federationTerminationReturnServiceURL(LassoProvider *provider)
{
return(lasso_node_get_child_content(provider->metadata, "FederationTerminationReturnServiceURL", NULL));
}
gchar *
-lasso_provider_get_federationTerminationServiceURL(LassoProvider *provider)
+lasso_provider_get_federationTerminationServiceURL(LassoProvider *provider)
{
return(lasso_node_get_child_content(provider->metadata, "FederationTerminationServiceURL", NULL));
}
gchar *
-lasso_provider_get_nameIdentifierMappingProtocolProfile(LassoProvider *provider)
+lasso_provider_get_nameIdentifierMappingProtocolProfile(LassoProvider *provider,
+ GError **err)
{
- return(lasso_node_get_attr_value(provider->metadata, "NameIdentifierMappingProtocolProfile"));
+ GError *tmp_err = NULL;
+ xmlChar *value;
+
+ g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+ value = lasso_node_get_attr_value(provider->metadata,
+ "NameIdentifierMappingProtocolProfile",
+ &tmp_err);
+ if (value == NULL) {
+ g_propagate_error (err, tmp_err);
+ return (NULL);
+ }
+ return (value);
}
gchar *
-lasso_provider_get_nameIdentifierMappingServiceURL(LassoProvider *provider)
+lasso_provider_get_nameIdentifierMappingServiceURL(LassoProvider *provider,
+ GError **err)
{
- return(lasso_node_get_attr_value(provider->metadata, "NameIdentifierMappingServiceURL"));
+ GError *tmp_err = NULL;
+ xmlChar *value;
+
+ g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+ value = lasso_node_get_attr_value(provider->metadata,
+ "NameIdentifierMappingServiceURL",
+ &tmp_err);
+ if (value == NULL) {
+ g_propagate_error (err, tmp_err);
+ return (NULL);
+ }
+ return (value);
}
gchar *
-lasso_provider_get_nameIdentifierMappingServiceReturnURL(LassoProvider *provider)
+lasso_provider_get_nameIdentifierMappingServiceReturnURL(LassoProvider *provider,
+ GError **err)
{
- return(lasso_node_get_attr_value(provider->metadata, "NameIdentifierMappingServiceReturnURL"));
+ GError *tmp_err = NULL;
+ xmlChar *value;
+
+ g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+ value = lasso_node_get_attr_value(provider->metadata,
+ "NameIdentifierMappingServiceReturnURL",
+ &tmp_err);
+ if (value == NULL) {
+ g_propagate_error (err, tmp_err);
+ return (NULL);
+ }
+ return (value);
}
gchar *
-lasso_provider_get_providerID(LassoProvider *provider)
+lasso_provider_get_providerID(LassoProvider *provider,
+ GError **err)
{
- return(lasso_node_get_attr_value(provider->metadata, "ProviderID"));
+ GError *tmp_err = NULL;
+ xmlChar *value;
+
+ g_return_val_if_fail (err == NULL || *err == NULL, NULL);
+
+ value = lasso_node_get_attr_value(provider->metadata, "ProviderID",
+ &tmp_err);
+ if (value == NULL) {
+ g_propagate_error (err, tmp_err);
+ return (NULL);
+ }
+ return (value);
}
gchar *
@@ -301,7 +353,6 @@ lasso_provider_new_metadata_filename(gchar *metadata_filename)
doc = xmlParseFile(metadata_filename);
root = xmlCopyNode(xmlDocGetRootElement(doc), 1);
xmlFreeDoc(doc);
-
provider->metadata = lasso_node_new();
LASSO_NODE_GET_CLASS(provider->metadata)->set_xmlNode(provider->metadata, root);
/*provider->metadata = lasso_node_new_from_xmlNode(root); */
diff --git a/lasso/Attic/protocols/provider.h b/lasso/Attic/protocols/provider.h
index 6cd636ea..551d482a 100644
--- a/lasso/Attic/protocols/provider.h
+++ b/lasso/Attic/protocols/provider.h
@@ -89,13 +89,17 @@ LASSO_EXPORT gchar *lasso_provider_get_federationTerminationReturnServic
LASSO_EXPORT gchar *lasso_provider_get_federationTerminationServiceURL (LassoProvider *provider);
-LASSO_EXPORT gchar *lasso_provider_get_nameIdentifierMappingProtocolProfile (LassoProvider *provider);
+LASSO_EXPORT gchar *lasso_provider_get_nameIdentifierMappingProtocolProfile (LassoProvider *provider,
+ GError **err);
-LASSO_EXPORT gchar *lasso_provider_get_nameIdentifierMappingServiceURL (LassoProvider *provider);
+LASSO_EXPORT gchar *lasso_provider_get_nameIdentifierMappingServiceURL (LassoProvider *provider,
+ GError **err);
-LASSO_EXPORT gchar *lasso_provider_get_nameIdentifierMappingServiceReturnURL (LassoProvider *provider);
+LASSO_EXPORT gchar *lasso_provider_get_nameIdentifierMappingServiceReturnURL (LassoProvider *provider,
+ GError **err);
-LASSO_EXPORT gchar *lasso_provider_get_providerID (LassoProvider *provider);
+LASSO_EXPORT gchar *lasso_provider_get_providerID (LassoProvider *provider,
+ GError **err);
LASSO_EXPORT gchar *lasso_provider_get_registerNameIdentifierProtocolProfile (LassoProvider *provider);
diff --git a/lasso/id-ff/federation_termination.c b/lasso/id-ff/federation_termination.c
index d5b627ce..24acb1ef 100644
--- a/lasso/id-ff/federation_termination.c
+++ b/lasso/id-ff/federation_termination.c
@@ -152,13 +152,12 @@ lasso_federation_termination_init_notification(LassoFederationTermination *defed
/* build the request */
content = lasso_node_get_content(nameIdentifier);
- nameQualifier = lasso_node_get_attr_value(nameIdentifier, "NameQualifier");
- format = lasso_node_get_attr_value(nameIdentifier, "Format");
- profileContext->request = lasso_federation_termination_notification_new(
- lasso_provider_get_providerID(LASSO_PROVIDER(profileContext->server)),
- content,
- nameQualifier,
- format);
+ nameQualifier = lasso_node_get_attr_value(nameIdentifier, "NameQualifier", NULL);
+ format = lasso_node_get_attr_value(nameIdentifier, "Format", NULL);
+ profileContext->request = lasso_federation_termination_notification_new(profileContext->server->providerID,
+ content,
+ nameQualifier,
+ format);
if(profileContext->request==NULL){
debug(ERROR, "Error while creating the notification\n");
return(-6);
diff --git a/lasso/id-ff/lecp.c b/lasso/id-ff/lecp.c
index ba7aecba..24a309e3 100644
--- a/lasso/id-ff/lecp.c
+++ b/lasso/id-ff/lecp.c
@@ -109,8 +109,7 @@ lasso_lecp_init_authn_request(LassoLecp *lecp,
gint
lasso_lecp_init_authn_request_envelope(LassoLecp *lecp)
{
- LassoProvider *provider;
- gchar *providerID, *assertionConsumerServiceURL;
+ gchar *assertionConsumerServiceURL;
g_return_val_if_fail(LASSO_IS_LECP(lecp), -1);
@@ -119,12 +118,11 @@ lasso_lecp_init_authn_request_envelope(LassoLecp *lecp)
return(-4);
}
- provider = LASSO_PROVIDER(lecp->server);
- providerID = lasso_provider_get_providerID(provider);
- assertionConsumerServiceURL = lasso_provider_get_assertionConsumerServiceURL(provider);
+ assertionConsumerServiceURL = lasso_provider_get_assertionConsumerServiceURL(LASSO_PROVIDER(lecp->server));
lecp->request = lasso_authn_request_envelope_new(lecp->authnRequest,
- providerID,
+ lecp->server->providerID,
assertionConsumerServiceURL);
+ g_free(assertionConsumerServiceURL);
return(0);
}
diff --git a/lasso/id-ff/login.c b/lasso/id-ff/login.c
index 28f38898..e9aeb275 100644
--- a/lasso/id-ff/login.c
+++ b/lasso/id-ff/login.c
@@ -27,6 +27,8 @@
#include <glib/gprintf.h>
#include <xmlsec/base64.h>
+#include <lasso/xml/errors.h>
+
#include <lasso/environs/login.h>
#include <lasso/protocols/artifact.h>
@@ -71,12 +73,17 @@ lasso_login_add_response_assertion(LassoLogin *login,
{
LassoNode *assertion = NULL, *authentication_statement;
xmlChar *requestID;
+ GError *err = NULL;
gint ret = 0;
- requestID = lasso_node_get_attr_value(LASSO_NODE(LASSO_PROFILE_CONTEXT(login)->request), "RequestID");
+ requestID = lasso_node_get_attr_value(LASSO_NODE(LASSO_PROFILE_CONTEXT(login)->request),
+ "RequestID", &err);
+
if (requestID == NULL) {
- debug(ERROR, "The attribute 'RequestID' is missing in request message.\n");
- return(-2);
+ debug(ERROR, err->message);
+ ret = err->code;
+ g_error_free(err);
+ return(ret);
}
assertion = lasso_assertion_new(LASSO_PROFILE_CONTEXT(login)->server->providerID,
@@ -174,7 +181,9 @@ lasso_login_process_response_status_and_assertion(LassoLogin *login) {
LassoNode *assertion = NULL, *status = NULL, *statusCode = NULL;
LassoProvider *idp = NULL;
gchar *statusCode_value = NULL;
- gint signature_check, ret = 0;
+ gint signature_check;
+ gint ret = 0;
+ GError *err = NULL;
assertion = lasso_node_get_child(LASSO_PROFILE_CONTEXT(login)->response,
"Assertion",
@@ -217,10 +226,16 @@ lasso_login_process_response_status_and_assertion(LassoLogin *login) {
ret = -8;
goto done;
}
- statusCode_value = lasso_node_get_attr_value(statusCode, "Value");
- if (!xmlStrEqual(statusCode_value, lassoSamlStatusCodeSuccess)) {
- ret = -7;
- goto done;
+ statusCode_value = lasso_node_get_attr_value(statusCode, "Value", &err);
+ if (err == NULL) {
+ if (!xmlStrEqual(statusCode_value, lassoSamlStatusCodeSuccess)) {
+ ret = -7;
+ }
+ }
+ else {
+ debug(ERROR, err->message);
+ ret = err->code;
+ g_error_free(err);
}
done:
diff --git a/lasso/id-ff/logout.c b/lasso/id-ff/logout.c
index 8cfb08e5..34231913 100644
--- a/lasso/id-ff/logout.c
+++ b/lasso/id-ff/logout.c
@@ -203,9 +203,9 @@ lasso_logout_init_request(LassoLogout *logout,
/* build the request */
content = lasso_node_get_content(nameIdentifier);
- nameQualifier = lasso_node_get_attr_value(nameIdentifier, "NameQualifier");
- format = lasso_node_get_attr_value(nameIdentifier, "Format");
- profileContext->request = lasso_logout_request_new(lasso_provider_get_providerID(LASSO_PROVIDER(profileContext->server)),
+ nameQualifier = lasso_node_get_attr_value(nameIdentifier, "NameQualifier", NULL);
+ format = lasso_node_get_attr_value(nameIdentifier, "Format", NULL);
+ profileContext->request = lasso_logout_request_new(profileContext->server->providerID,
content,
nameQualifier,
format);
@@ -261,7 +261,7 @@ lasso_logout_process_request_msg(LassoLogout *logout,
profileContext->remote_providerID = remote_providerID;
/* set LogoutResponse */
- profileContext->response = lasso_logout_response_new(lasso_provider_get_providerID(LASSO_PROVIDER(profileContext->server)),
+ profileContext->response = lasso_logout_response_new(profileContext->server->providerID,
lassoSamlStatusCodeSuccess,
profileContext->request);
@@ -344,7 +344,7 @@ lasso_logout_process_response_msg(LassoLogout *logout,
}
statusCode = lasso_node_get_child(profileContext->response, "StatusCode", NULL);
- statusCodeValue = lasso_node_get_attr_value(statusCode, "Value");
+ statusCodeValue = lasso_node_get_attr_value(statusCode, "Value", NULL);
if(!xmlStrEqual(statusCodeValue, lassoSamlStatusCodeSuccess)){
return(-4);
}
diff --git a/lasso/id-ff/name_identifier_mapping.c b/lasso/id-ff/name_identifier_mapping.c
index c4fb8b50..2eb0a507 100644
--- a/lasso/id-ff/name_identifier_mapping.c
+++ b/lasso/id-ff/name_identifier_mapping.c
@@ -45,6 +45,8 @@ lasso_name_identifier_mapping_build_request_msg(LassoNameIdentifierMapping *mapp
LassoProfileContext *profileContext;
LassoProvider *provider;
xmlChar *protocolProfile;
+ GError *err = NULL;
+ gint ret = 0;
g_return_val_if_fail(LASSO_IS_NAME_IDENTIFIER_MAPPING(mapping), -1);
@@ -57,16 +59,18 @@ lasso_name_identifier_mapping_build_request_msg(LassoNameIdentifierMapping *mapp
return(-2);
}
- protocolProfile = lasso_provider_get_nameIdentifierMappingProtocolProfile(provider);
- if(protocolProfile==NULL){
- debug(ERROR, "Single Name_Identifier_Mapping Protocol profile not found\n");
- return(-3);
+ protocolProfile = lasso_provider_get_nameIdentifierMappingProtocolProfile(provider, &err);
+ if(err != NULL){
+ debug(ERROR, err->message);
+ ret = err->code;
+ g_error_free(err);
+ return (ret);
}
if(xmlStrEqual(protocolProfile, lassoLibProtocolProfileSloSpSoap) || xmlStrEqual(protocolProfile, lassoLibProtocolProfileSloIdpSoap)){
debug(DEBUG, "building a soap request message\n");
profileContext->request_type = lassoHttpMethodSoap;
- profileContext->msg_url = lasso_provider_get_nameIdentifierMappingServiceURL(provider);
+ profileContext->msg_url = lasso_provider_get_nameIdentifierMappingServiceURL(provider, NULL);
profileContext->msg_body = lasso_node_export_to_soap(profileContext->request);
}
else if(xmlStrEqual(protocolProfile,lassoLibProtocolProfileSloSpHttp)||xmlStrEqual(protocolProfile,lassoLibProtocolProfileSloIdpHttp)){
@@ -87,7 +91,9 @@ lasso_name_identifier_mapping_build_response_msg(LassoNameIdentifierMapping *map
LassoProfileContext *profileContext;
LassoProvider *provider;
xmlChar *protocolProfile;
-
+ GError *err = NULL;
+ gint ret = 0;
+
g_return_val_if_fail(LASSO_IS_NAME_IDENTIFIER_MAPPING(mapping), -1);
profileContext = LASSO_PROFILE_CONTEXT(mapping);
@@ -98,15 +104,17 @@ lasso_name_identifier_mapping_build_response_msg(LassoNameIdentifierMapping *map
return(-2);
}
- protocolProfile = lasso_provider_get_nameIdentifierMappingProtocolProfile(provider);
- if(protocolProfile==NULL){
- debug(ERROR, "Single Name_Identifier_Mapping Protocol profile not found\n");
- return(-3);
+ protocolProfile = lasso_provider_get_nameIdentifierMappingProtocolProfile(provider, &err);
+ if(err != NULL){
+ debug(ERROR, err->message);
+ ret = err->code;
+ g_error_free(err);
+ return(ret);
}
if(xmlStrEqual(protocolProfile, lassoLibProtocolProfileSloSpSoap) || xmlStrEqual(protocolProfile, lassoLibProtocolProfileSloIdpSoap)){
debug(DEBUG, "building a soap response message\n");
- profileContext->msg_url = lasso_provider_get_nameIdentifierMappingServiceURL(provider);
+ profileContext->msg_url = lasso_provider_get_nameIdentifierMappingServiceURL(provider, NULL);
profileContext->msg_body = lasso_node_export_to_soap(profileContext->response);
}
else if(xmlStrEqual(protocolProfile,lassoLibProtocolProfileSloSpHttp)||xmlStrEqual(protocolProfile,lassoLibProtocolProfileSloIdpHttp)){
@@ -172,13 +180,12 @@ lasso_name_identifier_mapping_init_request(LassoNameIdentifierMapping *mapping,
/* build the request */
content = lasso_node_get_content(nameIdentifier);
- nameQualifier = lasso_node_get_attr_value(nameIdentifier, "NameQualifier");
- format = lasso_node_get_attr_value(nameIdentifier, "Format");
- profileContext->request = lasso_name_identifier_mapping_request_new(
- lasso_provider_get_providerID(LASSO_PROVIDER(profileContext->server)),
- content,
- nameQualifier,
- format);
+ nameQualifier = lasso_node_get_attr_value(nameIdentifier, "NameQualifier", NULL);
+ format = lasso_node_get_attr_value(nameIdentifier, "Format", NULL);
+ profileContext->request = lasso_name_identifier_mapping_request_new(profileContext->server->providerID,
+ content,
+ nameQualifier,
+ format);
g_return_val_if_fail(profileContext->request!=NULL, -6);
@@ -224,10 +231,9 @@ lasso_name_identifier_mapping_process_request_msg(LassoNameIdentifierMapping *ma
profileContext->remote_providerID = remote_providerID;
/* set Name_Identifier_MappingResponse */
- profileContext->response = lasso_name_identifier_mapping_response_new(
- lasso_provider_get_providerID(LASSO_PROVIDER(profileContext->server)),
- lassoSamlStatusCodeSuccess,
- profileContext->request);
+ profileContext->response = lasso_name_identifier_mapping_response_new(profileContext->server->providerID,
+ lassoSamlStatusCodeSuccess,
+ profileContext->request);
g_return_val_if_fail(profileContext->response!=NULL, -4);
@@ -267,9 +273,11 @@ lasso_name_identifier_mapping_process_response_msg(LassoNameIdentifierMapping *m
LassoProfileContext *profileContext;
xmlChar *statusCodeValue;
LassoNode *statusCode;
+ GError *err = NULL;
+ gint ret = 0;
g_return_val_if_fail(LASSO_IS_NAME_IDENTIFIER_MAPPING(mapping), -1);
- g_return_val_if_fail(response_msg!=NULL, -2);
+ g_return_val_if_fail(response_msg != NULL, -2);
profileContext = LASSO_PROFILE_CONTEXT(mapping);
@@ -283,11 +291,18 @@ lasso_name_identifier_mapping_process_response_msg(LassoNameIdentifierMapping *m
}
statusCode = lasso_node_get_child(profileContext->response, "StatusCode", NULL);
- statusCodeValue = lasso_node_get_attr_value(statusCode, "Value");
- if(!xmlStrEqual(statusCodeValue, lassoSamlStatusCodeSuccess)){
- return(-4);
+ statusCodeValue = lasso_node_get_attr_value(statusCode, "Value", &err);
+ if (err == NULL) {
+ if(!xmlStrEqual(statusCodeValue, lassoSamlStatusCodeSuccess)) {
+ return(-4);
+ }
+ }
+ else {
+ debug(ERROR, err->message);
+ ret = err->code;
+ g_error_free(err);
+ return (ret);
}
-
return(0);
}
diff --git a/lasso/id-ff/profile_context.c b/lasso/id-ff/profile_context.c
index 81765050..3bc7c5e6 100644
--- a/lasso/id-ff/profile_context.c
+++ b/lasso/id-ff/profile_context.c
@@ -23,6 +23,9 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
+#include <glib.h>
+#include <glib/gprintf.h>
+
#include <lasso/xml/samlp_response.h>
#include <lasso/protocols/request.h>
#include <lasso/protocols/response.h>
@@ -46,8 +49,7 @@ lasso_profile_context_get_request_type_from_soap_msg(gchar *soap)
LassoNode *soap_node, *body_node, *request_node;
GPtrArray *children;
const xmlChar * name;
- int type;
- int i;
+ int type = 0;
soap_node = lasso_node_new_from_dump(soap);
if(soap_node==NULL){
@@ -104,8 +106,8 @@ lasso_profile_context_dump(LassoProfileContext *ctx,
const gchar *name)
{
LassoNode *node;
- LassoNode *request, *response;
- gchar *child_dump, *dump = NULL;
+ LassoNode *request, *response = NULL;
+ gchar *dump = NULL;
gchar *request_type = g_new0(gchar, 6);
gchar *response_type = g_new0(gchar, 6);
gchar *provider_type = g_new0(gchar, 6);
@@ -124,7 +126,7 @@ lasso_profile_context_dump(LassoProfileContext *ctx,
lasso_node_destroy(request);
}
if (ctx->response != NULL) {
- request = lasso_node_copy(ctx->response);
+ response = lasso_node_copy(ctx->response);
LASSO_NODE_GET_CLASS(node)->add_child(node, response, FALSE);
lasso_node_destroy(response);
}
diff --git a/lasso/id-ff/register_name_identifier.c b/lasso/id-ff/register_name_identifier.c
index a5152067..dfc32b1a 100644
--- a/lasso/id-ff/register_name_identifier.c
+++ b/lasso/id-ff/register_name_identifier.c
@@ -34,7 +34,6 @@ static GObjectClass *parent_class = NULL;
gchar *
lasso_register_name_identifier_dump(LassoRegisterNameIdentifier *register_name_identifier)
{
- LassoProfileContext *profileContext;
gchar *dump;
g_return_val_if_fail(LASSO_IS_REGISTER_NAME_IDENTIFIER(register_name_identifier), NULL);
@@ -152,7 +151,6 @@ lasso_register_name_identifier_init_request(LassoRegisterNameIdentifier *registe
LassoProfileContext *profileContext;
LassoNode *nameIdentifier;
LassoIdentity *identity;
- LassoRegisterNameIdentifierRequest *request;
xmlChar *content, *nameQualifier, *format;
@@ -198,19 +196,18 @@ lasso_register_name_identifier_init_request(LassoRegisterNameIdentifier *registe
/* build the request */
content = lasso_node_get_content(nameIdentifier);
- nameQualifier = lasso_node_get_attr_value(nameIdentifier, "NameQualifier");
- format = lasso_node_get_attr_value(nameIdentifier, "Format");
- profileContext->request = lasso_register_name_identifier_request_new(
- lasso_provider_get_providerID(LASSO_PROVIDER(profileContext->server)),
- content,
- nameQualifier,
- format,
- "",
- "",
- "",
- "",
- "",
- "");
+ nameQualifier = lasso_node_get_attr_value(nameIdentifier, "NameQualifier", NULL);
+ format = lasso_node_get_attr_value(nameIdentifier, "Format", NULL);
+ profileContext->request = lasso_register_name_identifier_request_new(profileContext->server->providerID,
+ content,
+ nameQualifier,
+ format,
+ "",
+ "",
+ "",
+ "",
+ "",
+ "");
if(profileContext->request==NULL){
debug(ERROR, "Error while creating the request\n");
@@ -259,10 +256,9 @@ lasso_register_name_identifier_process_request_msg(LassoRegisterNameIdentifier *
profileContext->remote_providerID = remote_providerID;
/* set RegisterNameIdentifierResponse */
- profileContext->response = lasso_register_name_identifier_response_new(
- lasso_provider_get_providerID(LASSO_PROVIDER(profileContext->server)),
- lassoSamlStatusCodeSuccess,
- profileContext->request);
+ profileContext->response = lasso_register_name_identifier_response_new(profileContext->server->providerID,
+ lassoSamlStatusCodeSuccess,
+ profileContext->request);
if(profileContext->response==NULL){
debug(ERROR, "Error while building response\n");
@@ -318,6 +314,8 @@ lasso_register_name_identifier_process_response_msg(LassoRegisterNameIdentifier
LassoProfileContext *profileContext;
xmlChar *statusCodeValue;
LassoNode *statusCode;
+ GError *err = NULL;
+ gint ret = 0;
g_return_val_if_fail(LASSO_IS_REGISTER_NAME_IDENTIFIER(register_name_identifier), -1);
g_return_val_if_fail(response_msg!=NULL, -2);
@@ -338,11 +336,18 @@ lasso_register_name_identifier_process_response_msg(LassoRegisterNameIdentifier
}
statusCode = lasso_node_get_child(profileContext->response, "StatusCode", NULL);
- statusCodeValue = lasso_node_get_attr_value(statusCode, "Value");
- if(!xmlStrEqual(statusCodeValue, lassoSamlStatusCodeSuccess)){
- return(-4);
+ statusCodeValue = lasso_node_get_attr_value(statusCode, "Value", &err);
+ if (err == NULL) {
+ if(!xmlStrEqual(statusCodeValue, lassoSamlStatusCodeSuccess)){
+ return(-4);
+ }
+ }
+ else {
+ debug(ERROR, err->message);
+ ret = err->code;
+ g_error_free(err);
+ return (ret);
}
-
return(0);
}
diff --git a/lasso/id-ff/server.c b/lasso/id-ff/server.c
index 8809e17b..41fba64d 100644
--- a/lasso/id-ff/server.c
+++ b/lasso/id-ff/server.c
@@ -102,8 +102,9 @@ lasso_server_add_lasso_provider(LassoServer *server,
g_return_val_if_fail(LASSO_IS_SERVER(server), -1);
g_return_val_if_fail(LASSO_IS_PROVIDER(provider), -2);
-/* debug(INFO, "Add a provider(%s)\n", lasso_provider_get_providerID(provider)); */
g_ptr_array_add(server->providers, provider);
+
+ return (0);
}
gint
@@ -149,7 +150,7 @@ lasso_server_get_provider(LassoServer *server,
for(index = 0; index<len; index++) {
provider = g_ptr_array_index(server->providers, index);
- id = lasso_provider_get_providerID(provider);
+ id = lasso_provider_get_providerID(provider, NULL);
if (xmlStrEqual(providerID, id)) {
return(provider);
}
@@ -169,7 +170,7 @@ lasso_server_get_providerID_from_hash(LassoServer *server,
len = server->providers->len;
for(index = 0; index<len; index++){
provider = g_ptr_array_index(server->providers, index);
- providerID = lasso_provider_get_providerID(provider);
+ providerID = lasso_provider_get_providerID(provider, NULL);
hash_providerID = lasso_str_hash(providerID, server->private_key);
if(xmlStrEqual(hash_providerID, hash)){
return(providerID);
@@ -274,6 +275,7 @@ lasso_server_new(gchar *metadata,
xmlNodePtr root;
LassoNode *md_node;
gchar *providerID;
+ GError *err = NULL;
g_return_val_if_fail(metadata != NULL, NULL);
@@ -286,9 +288,10 @@ lasso_server_new(gchar *metadata,
/* md_node = lasso_node_new_from_xmlNode(root); */
/* get ProviderID in metadata */
- providerID = lasso_node_get_attr_value(md_node, "ProviderID");
+ providerID = lasso_node_get_attr_value(md_node, "ProviderID", &err);
if (providerID == NULL) {
- debug(ERROR, "ProviderID is missing in server metadata.\n");
+ debug(ERROR, err->message);
+ g_error_free(err);
lasso_node_destroy(md_node);
return (NULL);
}
@@ -319,7 +322,6 @@ lasso_server_new_from_dump(gchar *dump)
xmlNodePtr providers_xmlNode, provider_xmlNode;
xmlChar *public_key, *ca_certificate;
-
server = LASSO_SERVER(g_object_new(LASSO_TYPE_SERVER, NULL));
server_node = lasso_node_new_from_dump(dump);
@@ -330,26 +332,27 @@ lasso_server_new_from_dump(gchar *dump)
server_class = LASSO_NODE_GET_CLASS(server_node);
/* providerID */
- server->providerID = lasso_node_get_attr_value(server_node, LASSO_SERVER_PROVIDERID_NODE);
+ server->providerID = lasso_node_get_attr_value(server_node, LASSO_SERVER_PROVIDERID_NODE, NULL);
/* private key */
- server->private_key = lasso_node_get_attr_value(server_node, LASSO_SERVER_PRIVATE_KEY_NODE);
+ server->private_key = lasso_node_get_attr_value(server_node, LASSO_SERVER_PRIVATE_KEY_NODE, NULL);
/* certificate */
- server->certificate = lasso_node_get_attr_value(server_node, LASSO_SERVER_CERTIFICATE_NODE);
+ server->certificate = lasso_node_get_attr_value(server_node, LASSO_SERVER_CERTIFICATE_NODE, NULL);
/* signature method */
- server->signature_method = atoi(lasso_node_get_attr_value(server_node, LASSO_SERVER_SIGNATURE_METHOD_NODE));
+ /* FIXME signature_method should be checked before atoi !!! */
+ server->signature_method = atoi(lasso_node_get_attr_value(server_node, LASSO_SERVER_SIGNATURE_METHOD_NODE, NULL));
/* metadata */
server_metadata_node = lasso_node_get_child(server_node, "EntityDescriptor", NULL);
LASSO_PROVIDER(server)->metadata = lasso_node_copy(server_metadata_node);
/* public key */
- LASSO_PROVIDER(server)->public_key = lasso_node_get_attr_value(server_node, LASSO_PROVIDER_PUBLIC_KEY_NODE);
+ LASSO_PROVIDER(server)->public_key = lasso_node_get_attr_value(server_node, LASSO_PROVIDER_PUBLIC_KEY_NODE, NULL);
/* ca_certificate */
- LASSO_PROVIDER(server)->ca_certificate = lasso_node_get_attr_value(server_node, LASSO_PROVIDER_CA_CERTIFICATE_NODE);
+ LASSO_PROVIDER(server)->ca_certificate = lasso_node_get_attr_value(server_node, LASSO_PROVIDER_CA_CERTIFICATE_NODE, NULL);
/* providers */
providers_node = lasso_node_get_child(server_node, LASSO_SERVER_PROVIDERS_NODE, NULL);
@@ -367,10 +370,10 @@ lasso_server_new_from_dump(gchar *dump)
entity_node = lasso_node_get_child(provider_node, "EntityDescriptor", NULL);
/* public key */
- public_key = lasso_node_get_attr_value(provider_node, LASSO_PROVIDER_PUBLIC_KEY_NODE);
+ public_key = lasso_node_get_attr_value(provider_node, LASSO_PROVIDER_PUBLIC_KEY_NODE, NULL);
/* ca certificate */
- ca_certificate = lasso_node_get_attr_value(provider_node, LASSO_PROVIDER_CA_CERTIFICATE_NODE);
+ ca_certificate = lasso_node_get_attr_value(provider_node, LASSO_PROVIDER_CA_CERTIFICATE_NODE, NULL);
/* add provider */
provider = lasso_provider_new_from_metadata_node(entity_node);
diff --git a/lasso/xml/errors.c b/lasso/xml/errors.c
index 79402e3d..256d7eba 100644
--- a/lasso/xml/errors.c
+++ b/lasso/xml/errors.c
@@ -29,9 +29,9 @@ const char*
lasso_strerror(int error_code)
{
switch (error_code) {
- case LASSO_ERROR_METADATA_VALUE_NOTFOUND:
- return "Unable to get metadata value %s\n";
+ case LASSO_ERROR_XML_ATTR_VALUE_NOTFOUND:
+ return "Unable to get '%s' attribute value in '%s' element.\n";
default:
- return "Undefined error code !\n";
+ return "Undefined error code !!!\n";
}
}
diff --git a/lasso/xml/errors.h b/lasso/xml/errors.h
index e3c70407..5de7f4ba 100644
--- a/lasso/xml/errors.h
+++ b/lasso/xml/errors.h
@@ -23,6 +23,6 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-#define LASSO_ERROR_METADATA_VALUE_NOTFOUND -1
+#define LASSO_ERROR_XML_ATTR_VALUE_NOTFOUND -1
const char* lasso_strerror(int error_code);
diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c
index c29c70d2..4e567f18 100644
--- a/lasso/xml/xml.c
+++ b/lasso/xml/xml.c
@@ -24,6 +24,7 @@
*/
#include <string.h>
+#include <lasso/xml/errors.h>
#include <lasso/xml/xml.h>
#include <lasso/xml/ds_signature.h>
#include <xmlsec/base64.h>
@@ -194,6 +195,7 @@ lasso_node_get_attr(LassoNode *node,
* lasso_node_get_attr_value:
* @node: a LassoNode
* @name: the attribute name
+ * @err: return location for an allocated GError, or NULL to ignore errors
*
* Gets the value of an attribute associated to a node.
*
@@ -201,13 +203,14 @@ lasso_node_get_attr(LassoNode *node,
* to free the memory with xmlFree().
**/
xmlChar *
-lasso_node_get_attr_value(LassoNode *node,
- const xmlChar *name)
+lasso_node_get_attr_value(LassoNode *node,
+ const xmlChar *name,
+ GError **err)
{
g_return_val_if_fail (LASSO_IS_NODE(node), NULL);
LassoNodeClass *class = LASSO_NODE_GET_CLASS(node);
- return (class->get_attr_value(node, name));
+ return (class->get_attr_value(node, name, err));
}
/**
@@ -716,13 +719,24 @@ lasso_node_impl_get_attr(LassoNode *node,
}
static xmlChar *
-lasso_node_impl_get_attr_value(LassoNode *node,
- const xmlChar *name)
+lasso_node_impl_get_attr_value(LassoNode *node,
+ const xmlChar *name,
+ GError **err)
{
g_return_val_if_fail (LASSO_IS_NODE(node), NULL);
g_return_val_if_fail (name != NULL, NULL);
+ g_return_val_if_fail (err == NULL || *err == NULL, NULL);
- return (xmlGetProp(node->private->node, name));
+ xmlChar *value = xmlGetProp(node->private->node, name);
+
+ if (value == NULL) {
+ g_set_error(err, g_quark_from_string("Lasso"),
+ LASSO_ERROR_XML_ATTR_VALUE_NOTFOUND,
+ lasso_strerror(LASSO_ERROR_XML_ATTR_VALUE_NOTFOUND),
+ name, node->private->node->name);
+ }
+
+ return (value);
}
static GPtrArray *
diff --git a/lasso/xml/xml.h b/lasso/xml/xml.h
index ce248567..ab759312 100644
--- a/lasso/xml/xml.h
+++ b/lasso/xml/xml.h
@@ -81,8 +81,9 @@ struct _LassoNodeClass {
xmlChar* (* export_to_soap) (LassoNode *node);
LassoAttr* (* get_attr) (LassoNode *node,
const xmlChar *name);
- xmlChar* (* get_attr_value) (LassoNode *node,
- const xmlChar *name);
+ xmlChar* (* get_attr_value) (LassoNode *node,
+ const xmlChar *name,
+ GError **err);
GPtrArray* (* get_attrs) (LassoNode *node);
LassoNode* (* get_child) (LassoNode *node,
const xmlChar *name,
@@ -154,15 +155,16 @@ LASSO_EXPORT gchar* lasso_node_export_to_query (LassoNode *n
LASSO_EXPORT xmlChar* lasso_node_export_to_soap (LassoNode *node);
-LASSO_EXPORT LassoAttr* lasso_node_get_attr (LassoNode *node,
+LASSO_EXPORT LassoAttr* lasso_node_get_attr (LassoNode *node,
const xmlChar *name);
-LASSO_EXPORT xmlChar* lasso_node_get_attr_value (LassoNode *node,
- const xmlChar *name);
+LASSO_EXPORT xmlChar* lasso_node_get_attr_value (LassoNode *node,
+ const xmlChar *name,
+ GError **err);
LASSO_EXPORT GPtrArray* lasso_node_get_attrs (LassoNode *node);
-LASSO_EXPORT LassoNode* lasso_node_get_child (LassoNode *node,
+LASSO_EXPORT LassoNode* lasso_node_get_child (LassoNode *node,
const xmlChar *name,
const xmlChar *href);