diff options
| author | Valery Febvre <vfebvre at easter-eggs.com> | 2004-07-23 13:28:08 +0000 |
|---|---|---|
| committer | Valery Febvre <vfebvre at easter-eggs.com> | 2004-07-23 13:28:08 +0000 |
| commit | 5da1b0185ae35cdeb24efd4fc8c642ee3d1f6bd0 (patch) | |
| tree | 14f6777868da44d4da244bad67f1132cfe045fa5 | |
| parent | 25c73745541cd659babe96bbb9daf6872f409479 (diff) | |
| download | lasso-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.c | 13 | ||||
| -rw-r--r-- | lasso/Attic/protocols/elements/authentication_statement.c | 8 | ||||
| -rw-r--r-- | lasso/Attic/protocols/logout_response.c | 26 | ||||
| -rw-r--r-- | lasso/Attic/protocols/provider.c | 77 | ||||
| -rw-r--r-- | lasso/Attic/protocols/provider.h | 12 | ||||
| -rw-r--r-- | lasso/id-ff/federation_termination.c | 13 | ||||
| -rw-r--r-- | lasso/id-ff/lecp.c | 10 | ||||
| -rw-r--r-- | lasso/id-ff/login.c | 31 | ||||
| -rw-r--r-- | lasso/id-ff/logout.c | 10 | ||||
| -rw-r--r-- | lasso/id-ff/name_identifier_mapping.c | 69 | ||||
| -rw-r--r-- | lasso/id-ff/profile_context.c | 12 | ||||
| -rw-r--r-- | lasso/id-ff/register_name_identifier.c | 51 | ||||
| -rw-r--r-- | lasso/id-ff/server.c | 31 | ||||
| -rw-r--r-- | lasso/xml/errors.c | 6 | ||||
| -rw-r--r-- | lasso/xml/errors.h | 2 | ||||
| -rw-r--r-- | lasso/xml/xml.c | 26 | ||||
| -rw-r--r-- | lasso/xml/xml.h | 14 |
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); |
