diff options
| author | Damien Laniel <dlaniel@entrouvert.com> | 2007-06-13 10:09:55 +0000 |
|---|---|---|
| committer | Damien Laniel <dlaniel@entrouvert.com> | 2007-06-13 10:09:55 +0000 |
| commit | bd0913130c776210e5ecc10d70fd665025447ec7 (patch) | |
| tree | 12c817e83c48f7fc612e713cbc91d091483eed21 | |
| parent | 2726db1fb7a7c40b4e10cdf5b2bfb3ef47270dfa (diff) | |
better error handling + some refactoring
| -rw-r--r-- | lasso/errors.c | 13 | ||||
| -rw-r--r-- | lasso/errors.h | 10 | ||||
| -rw-r--r-- | lasso/id-wsf-2.0/data_service.c | 53 | ||||
| -rw-r--r-- | lasso/id-wsf-2.0/discovery.c | 84 | ||||
| -rw-r--r-- | lasso/xml/strings.h | 6 | ||||
| -rw-r--r-- | swig/Lasso.i | 42 |
6 files changed, 146 insertions, 62 deletions
diff --git a/lasso/errors.c b/lasso/errors.c index 53ea2c30..6df297b9 100644 --- a/lasso/errors.c +++ b/lasso/errors.c @@ -193,12 +193,19 @@ lasso_strerror(int error_code) case LASSO_NAME_IDENTIFIER_MAPPING_ERROR_MISSING_TARGET_NAMESPACE: return "Target name space not found"; - case LASSO_IDWSF2_DISCOVERY_ERROR_SVC_METADATA_REGISTER_FAILED: + case LASSO_DISCOVERY_ERROR_SVC_METADATA_REGISTER_FAILED: return "Service metadata registration failed"; - case LASSO_IDWSF2_DISCOVERY_ERROR_SVC_METADATA_ASSOCIATION_ADD_FAILED: + case LASSO_DISCOVERY_ERROR_SVC_METADATA_ASSOCIATION_ADD_FAILED: return "Service metadata association failed"; - case LASSO_IDWSF2_DISCOVERY_ERROR_MISSING_REQUESTED_SERVICE: + case LASSO_DISCOVERY_ERROR_MISSING_REQUESTED_SERVICE: return "Missing requested service"; + case LASSO_DISCOVERY_ERROR_FAILED_TO_BUILD_ENDPOINT_REFERENCE: + return "Failed to build Endpoint Reference"; + + case LASSO_DST_ERROR_QUERY_FAILED: + return "Query failed"; + case LASSO_DST_ERROR_QUERY_PARTIALLY_FAILED: + return "Query partially failed : some items were correctly processed"; default: return "Error"; diff --git a/lasso/errors.h b/lasso/errors.h index c310653f..6663ba42 100644 --- a/lasso/errors.h +++ b/lasso/errors.h @@ -144,10 +144,12 @@ #define LASSO_WSF_PROFILE_ERROR_MISSING_SECURITY -1101 /* ID-WSF 2 Discovery */ -#define LASSO_IDWSF2_DISCOVERY_ERROR_SVC_METADATA_REGISTER_FAILED -1200 -#define LASSO_IDWSF2_DISCOVERY_ERROR_SVC_METADATA_ASSOCIATION_ADD_FAILED -1201 -#define LASSO_IDWSF2_DISCOVERY_ERROR_MISSING_REQUESTED_SERVICE -1202 +#define LASSO_DISCOVERY_ERROR_SVC_METADATA_REGISTER_FAILED -1200 +#define LASSO_DISCOVERY_ERROR_SVC_METADATA_ASSOCIATION_ADD_FAILED -1201 +#define LASSO_DISCOVERY_ERROR_MISSING_REQUESTED_SERVICE -1202 +#define LASSO_DISCOVERY_ERROR_FAILED_TO_BUILD_ENDPOINT_REFERENCE -1203 /* ID-WSF 2 Data Service */ -#define LASSO_IDWSF2_DST_QUERY_FAILED -1300 +#define LASSO_DST_ERROR_QUERY_FAILED -1300 +#define LASSO_DST_ERROR_QUERY_PARTIALLY_FAILED -1301 diff --git a/lasso/id-wsf-2.0/data_service.c b/lasso/id-wsf-2.0/data_service.c index 72d324e3..14ee09db 100644 --- a/lasso/id-wsf-2.0/data_service.c +++ b/lasso/id-wsf-2.0/data_service.c @@ -156,8 +156,9 @@ gint lasso_idwsf2_data_service_build_query_response_msg(LassoIdWsf2DataService *service) { LassoWsf2Profile *profile = LASSO_WSF2_PROFILE(service); - LassoIdWsf2DstRefQuery *request = LASSO_IDWSF2_DSTREF_QUERY(profile->request); + LassoIdWsf2DstRefQuery *request; LassoIdWsf2DstRefQueryResponse *response; + LassoIdWsf2UtilResponse *response2; LassoSoapEnvelope *envelope; xmlDoc *doc; xmlXPathContext *xpathCtx; @@ -169,10 +170,16 @@ lasso_idwsf2_data_service_build_query_response_msg(LassoIdWsf2DataService *servi LassoIdWsf2DstRefItemData *data_item; xmlNode *node; GList *iter; + int res = 0; g_return_val_if_fail(LASSO_IS_IDWSF2_DATA_SERVICE(service), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ); + if (! LASSO_IS_IDWSF2_DSTREF_QUERY(profile->request)) { + return LASSO_PROFILE_ERROR_MISSING_REQUEST; + } + request = LASSO_IDWSF2_DSTREF_QUERY(profile->request); + /* Response envelope and body */ envelope = profile->soap_envelope_response; response = lasso_idwsf2_dstref_query_response_new(); @@ -181,6 +188,10 @@ lasso_idwsf2_data_service_build_query_response_msg(LassoIdWsf2DataService *servi profile->response = LASSO_NODE(response); envelope->Body->any = g_list_append(envelope->Body->any, response); + response2 = LASSO_IDWSF2_UTIL_RESPONSE(response); + /* Default is Failed, will be OK or Partial when some items are successfully parsed */ + response2->Status = lasso_util_status_new(LASSO_DST_STATUS_CODE_FAILED); + /* Initialise XML parsing */ doc = xmlNewDoc((xmlChar*)"1.0"); xmlDocSetRootElement(doc, service->data); @@ -205,21 +216,41 @@ lasso_idwsf2_data_service_build_query_response_msg(LassoIdWsf2DataService *servi data_item->itemIDRef = g_strdup(item_result_query_base->itemID); } response->Data = g_list_append(response->Data, data); + /* Success : change status code to OK */ + if (strcmp(response2->Status->code, LASSO_DST_STATUS_CODE_FAILED) == 0) { + free(response2->Status->code); + response2->Status->code = g_strdup(LASSO_DST_STATUS_CODE_OK); + } + xmlXPathFreeObject(xpathObj); + xpathObj = NULL; + } else { + /* If status was OK, change it to Partial */ + if (strcmp(response2->Status->code, LASSO_DST_STATUS_CODE_OK) == 0) { + free(response2->Status->code); + response2->Status->code = g_strdup(LASSO_DST_STATUS_CODE_PARTIAL); + } else { + res = LASSO_DST_ERROR_QUERY_FAILED; + } + if (xpathObj != NULL) { + xmlXPathFreeObject(xpathObj); + xpathObj = NULL; + } + /* Stop processing at first error */ + break; } - xmlXPathFreeObject(xpathObj); - xpathObj = NULL; } - /* Free XML parsing objects */ xmlUnlinkNode(service->data); xmlXPathFreeContext(xpathCtx); xmlFreeDoc(doc); - /* Response is built without any problem, status code is ok */ - LASSO_IDWSF2_UTIL_RESPONSE(response)->Status = - lasso_util_status_new(LASSO_DST_STATUS_CODE_OK); + if (res == 0 && strcmp(response2->Status->code, LASSO_DST_STATUS_CODE_FAILED) == 0) { + res = LASSO_DST_ERROR_QUERY_FAILED; + } + + lasso_wsf2_profile_build_response_msg(profile); - return lasso_wsf2_profile_build_response_msg(profile); + return res; } gint @@ -248,8 +279,10 @@ lasso_idwsf2_data_service_process_query_response_msg(LassoIdWsf2DataService *ser if (response->Status == NULL || response->Status->code == NULL) { return LASSO_PROFILE_ERROR_MISSING_STATUS_CODE; } - if (strcmp(response->Status->code, "OK") != 0) { - return LASSO_IDWSF2_DST_QUERY_FAILED; + if (strcmp(response->Status->code, LASSO_DST_STATUS_CODE_PARTIAL) == 0) { + return LASSO_DST_ERROR_QUERY_PARTIALLY_FAILED; + } else if (strcmp(response->Status->code, LASSO_DST_STATUS_CODE_OK) != 0) { + return LASSO_DST_ERROR_QUERY_FAILED; } return 0; diff --git a/lasso/id-wsf-2.0/discovery.c b/lasso/id-wsf-2.0/discovery.c index 29fb92e9..a8b425d2 100644 --- a/lasso/id-wsf-2.0/discovery.c +++ b/lasso/id-wsf-2.0/discovery.c @@ -240,7 +240,7 @@ lasso_idwsf2_discovery_process_metadata_register_response_msg(LassoIdWsf2Discove if (response->SvcMDID != NULL) { discovery->svcMDID = g_strdup(response->SvcMDID->data); } else { - res = LASSO_IDWSF2_DISCOVERY_ERROR_SVC_METADATA_REGISTER_FAILED; + res = LASSO_DISCOVERY_ERROR_SVC_METADATA_REGISTER_FAILED; } } @@ -302,12 +302,11 @@ lasso_idwsf2_discovery_process_metadata_association_add_msg(LassoIdWsf2Discovery /* Build response */ response = lasso_idwsf2_disco_svc_md_association_add_response_new(); - /* Default is Failed, will be OK when metadatas are registered */ - response->Status = lasso_util_status_new(LASSO_DISCO_STATUS_CODE_FAILED); - envelope = profile->soap_envelope_response; envelope->Body->any = g_list_append(envelope->Body->any, response); + profile->response = LASSO_NODE(response); + return res; } @@ -318,7 +317,6 @@ lasso_idwsf2_discovery_register_metadata(LassoIdWsf2Discovery *discovery) LassoIdWsf2DiscoSvcMDAssociationAdd *request; LassoIdWsf2DiscoSvcMDAssociationAddResponse *response; LassoIdentity *identity; - LassoSoapEnvelope *envelope; GList *i; int res = 0; @@ -333,6 +331,8 @@ lasso_idwsf2_discovery_register_metadata(LassoIdWsf2Discovery *discovery) if (! LASSO_IS_IDWSF2_DISCO_SVC_MD_ASSOCIATION_ADD(profile->request)) { res = LASSO_PROFILE_ERROR_INVALID_SOAP_MSG; + } else if (! LASSO_IS_IDWSF2_DISCO_SVC_MD_ASSOCIATION_ADD_RESPONSE(profile->response)) { + res = LASSO_PROFILE_ERROR_MISSING_RESPONSE; } /* If the request has been correctly processed, */ @@ -343,16 +343,12 @@ lasso_idwsf2_discovery_register_metadata(LassoIdWsf2Discovery *discovery) lasso_identity_add_svc_md_id(identity, (gchar *)(i->data)); } + /* Set response status code */ + response = LASSO_IDWSF2_DISCO_SVC_MD_ASSOCIATION_ADD_RESPONSE(profile->response); if (res == 0) { - envelope = profile->soap_envelope_response; - for (i = g_list_first(envelope->Body->any); i != NULL; i = g_list_next(i)) { - if (LASSO_IS_IDWSF2_DISCO_SVC_MD_ASSOCIATION_ADD_RESPONSE(i->data)) { - response = - LASSO_IDWSF2_DISCO_SVC_MD_ASSOCIATION_ADD_RESPONSE(i->data); - response->Status->code = g_strdup(LASSO_DISCO_STATUS_CODE_OK); - break; - } - } + response->Status = lasso_util_status_new(LASSO_DISCO_STATUS_CODE_OK); + } else { + response->Status = lasso_util_status_new(LASSO_DISCO_STATUS_CODE_FAILED); } return res; @@ -386,7 +382,7 @@ lasso_idwsf2_discovery_process_metadata_association_add_response_msg( return LASSO_PROFILE_ERROR_MISSING_STATUS_CODE; } if (strcmp(response->Status->code, "OK") != 0) { - return LASSO_IDWSF2_DISCOVERY_ERROR_SVC_METADATA_ASSOCIATION_ADD_FAILED; + return LASSO_DISCOVERY_ERROR_SVC_METADATA_ASSOCIATION_ADD_FAILED; } return 0; @@ -449,6 +445,27 @@ lasso_idwsf2_discovery_add_requested_service_type(LassoIdWsf2Discovery *discover return 0; } +gint +lasso_idwsf2_discovery_process_query_msg(LassoIdWsf2Discovery *discovery, const gchar *message) +{ + LassoWsf2Profile *profile = LASSO_WSF2_PROFILE(discovery); + + int res = 0; + + g_return_val_if_fail(LASSO_IS_IDWSF2_DISCOVERY(discovery), + LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ); + g_return_val_if_fail(message != NULL, LASSO_PARAM_ERROR_INVALID_VALUE); + + /* Process request */ + res = lasso_wsf2_profile_process_soap_request_msg(profile, message); + + if (! LASSO_IS_IDWSF2_DISCO_QUERY(profile->request)) { + res = LASSO_PROFILE_ERROR_INVALID_SOAP_MSG; + } + + return res; +} + static LassoWsAddrEndpointReference* lasso_idwsf2_discovery_build_query_response_epr(LassoIdWsf2DiscoRequestedService *service, LassoIdentity *identity, LassoServer *server) @@ -561,27 +578,6 @@ lasso_idwsf2_discovery_build_query_response_epr(LassoIdWsf2DiscoRequestedService } gint -lasso_idwsf2_discovery_process_query_msg(LassoIdWsf2Discovery *discovery, const gchar *message) -{ - LassoWsf2Profile *profile = LASSO_WSF2_PROFILE(discovery); - - int res = 0; - - g_return_val_if_fail(LASSO_IS_IDWSF2_DISCOVERY(discovery), - LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ); - g_return_val_if_fail(message != NULL, LASSO_PARAM_ERROR_INVALID_VALUE); - - /* Process request */ - res = lasso_wsf2_profile_process_soap_request_msg(profile, message); - - if (! LASSO_IS_IDWSF2_DISCO_QUERY(profile->request)) { - res = LASSO_PROFILE_ERROR_INVALID_SOAP_MSG; - } - - return res; -} - -gint lasso_idwsf2_discovery_build_query_response_msg(LassoIdWsf2Discovery *discovery) { LassoWsf2Profile *profile = LASSO_WSF2_PROFILE(discovery); @@ -608,7 +604,7 @@ lasso_idwsf2_discovery_build_query_response_msg(LassoIdWsf2Discovery *discovery) request->RequestedService->data); } if (service == NULL) { - res = LASSO_IDWSF2_DISCOVERY_ERROR_MISSING_REQUESTED_SERVICE; + res = LASSO_DISCOVERY_ERROR_MISSING_REQUESTED_SERVICE; } } @@ -616,15 +612,21 @@ lasso_idwsf2_discovery_build_query_response_msg(LassoIdWsf2Discovery *discovery) response = lasso_idwsf2_disco_query_response_new(); if (res == 0) { - response->Status = lasso_util_status_new(LASSO_DISCO_STATUS_CODE_OK); /* FIXME : foreach here as well */ epr = lasso_idwsf2_discovery_build_query_response_epr(service, identity, server); if (epr != NULL) { response->EndpointReference = g_list_append(response->EndpointReference, epr); + /* XXX : Should probably check if the epr contains a SecurityContext, */ + /* otherwise return a "federation not found" error code */ + } else { + res = LASSO_DISCOVERY_ERROR_FAILED_TO_BUILD_ENDPOINT_REFERENCE; } - /* XXX : Should probably check if the epr contains a SecurityContext, */ - /* otherwise return a "federation not found" error code */ + } + + /* Set response status code */ + if (res == 0) { + response->Status = lasso_util_status_new(LASSO_DISCO_STATUS_CODE_OK); } else { response->Status = lasso_util_status_new(LASSO_DISCO_STATUS_CODE_FAILED); /* XXX : May add secondary status codes here */ @@ -669,7 +671,7 @@ lasso_idwsf2_discovery_process_query_response_msg(LassoIdWsf2Discovery *discover return LASSO_PROFILE_ERROR_MISSING_STATUS_CODE; } if (strcmp(response->Status->code, "OK") != 0) { - return LASSO_IDWSF2_DISCOVERY_ERROR_SVC_METADATA_ASSOCIATION_ADD_FAILED; + return LASSO_DISCOVERY_ERROR_SVC_METADATA_ASSOCIATION_ADD_FAILED; } /* If the response has been correctly processed, */ diff --git a/lasso/xml/strings.h b/lasso/xml/strings.h index e14e66fb..ba533429 100644 --- a/lasso/xml/strings.h +++ b/lasso/xml/strings.h @@ -199,6 +199,9 @@ #define LASSO_DISCO_STATUS_CODE_NO_RESULTS "NoResults" #define LASSO_DISCO_STATUS_CODE_DIRECTIVES "Directive" +#define LASSO_DST_STATUS_CODE_OK "OK" +#define LASSO_DST_STATUS_CODE_FAILED "Failed" +#define LASSO_DST_STATUS_CODE_PARTIAL "Partial" #define LASSO_DST_STATUS_CODE_ACTION_NOT_AUTHORIZED "ActionNotAuthorized" #define LASSO_DST_STATUS_CODE_ACTION_NOT_SUPPORTED "ActionNotSupported" #define LASSO_DST_STATUS_CODE_ALL_RETURNED "AllReturned" @@ -218,13 +221,12 @@ #define LASSO_DST_STATUS_CODE_NO_MORE_ELEMENTS "NoMoreElements" #define LASSO_DST_STATUS_CODE_NO_MULTIPLE_ALLOWED "NoMultipleAllowed" #define LASSO_DST_STATUS_CODE_NO_MULTIPLE_RESOURCES "NoMultipleResources" -#define LASSO_DST_STATUS_CODE_OK "OK" #define LASSO_DST_STATUS_CODE_TIME_OUT "TimeOut" #define LASSO_DST_STATUS_CODE_UNEXPECTED_ERROR "UnexpectedError" +#define LASSO_SA_STATUS_CODE_OK "OK" #define LASSO_SA_STATUS_CODE_CONTINUE "continue" #define LASSO_SA_STATUS_CODE_ABORT "abort" -#define LASSO_SA_STATUS_CODE_OK "OK" /*****************************************************************************/ /* METADATA */ diff --git a/swig/Lasso.i b/swig/Lasso.i index b6177c10..b642a64d 100644 --- a/swig/Lasso.i +++ b/swig/Lasso.i @@ -1104,7 +1104,8 @@ typedef enum { %rename(SERVER_ERROR_ADD_PROVIDER_FAILED) LASSO_SERVER_ERROR_ADD_PROVIDER_FAILED; %rename(SERVER_ERROR_ADD_PROVIDER_PROTOCOL_MISMATCH) \ LASSO_SERVER_ERROR_ADD_PROVIDER_PROTOCOL_MISMATCH; -%rename(SERVER_ERROR_SET_ENCRYPTION_PRIVATE_KEY_FAILED) LASSO_SERVER_ERROR_SET_ENCRYPTION_PRIVATE_KEY_FAILED; +%rename(SERVER_ERROR_SET_ENCRYPTION_PRIVATE_KEY_FAILED) \ + LASSO_SERVER_ERROR_SET_ENCRYPTION_PRIVATE_KEY_FAILED; #endif /* Single Logout */ @@ -1150,6 +1151,11 @@ typedef enum { %rename(PROFILE_ERROR_MISSING_ENCRYPTION_PRIVATE_KEY) \ LASSO_PROFILE_ERROR_MISSING_ENCRYPTION_PRIVATE_KEY; %rename(PROFILE_ERROR_STATUS_NOT_SUCCESS) LASSO_PROFILE_ERROR_STATUS_NOT_SUCCESS; +%rename(PROFILE_ERROR_MISSING_ISSUER) LASSO_PROFILE_ERROR_MISSING_ISSUER; +%rename(PROFILE_ERROR_MISSING_SERVICE_INSTANCE) LASSO_PROFILE_ERROR_MISSING_SERVICE_INSTANCE; +%rename(PROFILE_ERROR_MISSING_ENDPOINT_REFERENCE) LASSO_PROFILE_ERROR_MISSING_ENDPOINT_REFERENCE; +%rename(PROFILE_ERROR_MISSING_ENDPOINT_REFERENCE_ADDRESS) \ + LASSO_PROFILE_ERROR_MISSING_ENDPOINT_REFERENCE_ADDRESS; #endif /* functions/methods parameters checking */ @@ -1175,12 +1181,15 @@ typedef enum { /* Federation Termination Notification */ #ifndef SWIG_PHP_RENAMES -%rename(DEFEDERATION_ERROR_MISSING_NAME_IDENTIFIER) LASSO_DEFEDERATION_ERROR_MISSING_NAME_IDENTIFIER; +%rename(DEFEDERATION_ERROR_MISSING_NAME_IDENTIFIER) \ + LASSO_DEFEDERATION_ERROR_MISSING_NAME_IDENTIFIER; #endif /* Soap */ #ifndef SWIG_PHP_RENAMES %rename(SOAP_FAULT_REDIRECT_REQUEST) LASSO_SOAP_FAULT_REDIRECT_REQUEST; +%rename(SOAP_ERROR_MISSING_HEADER) LASSO_SOAP_ERROR_MISSING_HEADER; +%rename(SOAP_ERROR_MISSING_BODY) LASSO_SOAP_ERROR_MISSING_BODY; #endif /* Name Identifier Mapping */ @@ -1193,6 +1202,35 @@ typedef enum { LASSO_NAME_IDENTIFIER_MAPPING_ERROR_MISSING_TARGET_IDENTIFIER; #endif +/* Data Service */ +#ifndef SWIG_PHP_RENAMES +%rename(DATA_SERVICE_ERROR_UNREGISTERED_DST) LASSO_DATA_SERVICE_ERROR_UNREGISTERED_DST; +#endif + +/* WSF Profile */ +#ifndef SWIG_PHP_RENAMES +%rename(WSF_PROFILE_ERROR_MISSING_CORRELATION) LASSO_WSF_PROFILE_ERROR_MISSING_CORRELATION; +%rename(WSF_PROFILE_ERROR_MISSING_SECURITY) LASSO_WSF_PROFILE_ERROR_MISSING_SECURITY; +#endif + +/* ID-WSF 2 Discovery */ +#ifndef SWIG_PHP_RENAMES +%rename(DISCOVERY_ERROR_SVC_METADATA_REGISTER_FAILED) \ + LASSO_DISCOVERY_ERROR_SVC_METADATA_REGISTER_FAILED; +%rename(DISCOVERY_ERROR_SVC_METADATA_ASSOCIATION_ADD_FAILED) \ + LASSO_DISCOVERY_ERROR_SVC_METADATA_ASSOCIATION_ADD_FAILED; +%rename(DISCOVERY_ERROR_MISSING_REQUESTED_SERVICE) \ + LASSO_DISCOVERY_ERROR_MISSING_REQUESTED_SERVICE; +%rename(DISCOVERY_ERROR_FAILED_TO_BUILD_ENDPOINT_REFERENCE) \ + LASSO_DISCOVERY_ERROR_FAILED_TO_BUILD_ENDPOINT_REFERENCE; +#endif + +/* ID-WSF 2 Data Service */ +#ifndef SWIG_PHP_RENAMES +%rename(DST_ERROR_QUERY_FAILED) LASSO_DST_ERROR_QUERY_FAILED; +%rename(DST_ERROR_QUERY_PARTIALLY_FAILED) LASSO_DST_ERROR_QUERY_PARTIALLY_FAILED; +#endif + #ifndef SWIG_PHP_RENAMES %rename(strerror) lasso_strerror; #endif |
