diff options
| author | Nicolas Clapies <nclapies@entrouvert.com> | 2005-11-15 11:19:38 +0000 |
|---|---|---|
| committer | Nicolas Clapies <nclapies@entrouvert.com> | 2005-11-15 11:19:38 +0000 |
| commit | c4697fb3afc4890bf0c569e9ee2584d4283df961 (patch) | |
| tree | 47250248bdd597447bb7afc5075e219a8d19cfe3 | |
| parent | 0a511fc52d81dca59783e461f396832ddf499d52 (diff) | |
Added some user interaction support : lasso_data_service_need_user_interaction() sets soap response with a soap fault asking redirect request. lasso_data_service_get_redirect_request_url() retrieves the redirect request url. DataService raises a redirect request warning exception if a fault was found in soap response after a lasso_data_service_process_query_response_msg().
| -rw-r--r-- | lasso/id-wsf/data_service.c | 109 | ||||
| -rw-r--r-- | lasso/id-wsf/data_service.h | 6 |
2 files changed, 111 insertions, 4 deletions
diff --git a/lasso/id-wsf/data_service.c b/lasso/id-wsf/data_service.c index a6c3de26..f37f740a 100644 --- a/lasso/id-wsf/data_service.c +++ b/lasso/id-wsf/data_service.c @@ -33,6 +33,8 @@ #include <lasso/xml/dst_modify.h> #include <lasso/xml/dst_modify_response.h> #include <lasso/xml/soap_binding_correlation.h> +#include <lasso/xml/soap_fault.h> +#include <lasso/xml/is_redirect_request.h> #include <xmlsec/xmltree.h> #include <xmlsec/xmldsig.h> @@ -45,6 +47,7 @@ struct _LassoDataServicePrivate gboolean dispose_has_run; LassoDiscoResourceOffering *offering; GList *credentials; + LassoSoapFault *fault; }; /*****************************************************************************/ @@ -120,6 +123,26 @@ lasso_data_service_add_query_item(LassoDataService *service, return item; } +gint +lasso_data_service_need_user_interaction(LassoDataService *service, const char *redirectUrl) +{ + LassoWsfProfile *profile; + LassoSoapBody *body; + LassoSoapFault *fault; + LassoUtilityStatus *status; + LassoSoapDetail *detail; + GList *iter; + + /* Find a SOAP fault element */ + service->private_data->fault = lasso_soap_fault_new(); + service->private_data->fault->faultcode = g_strdup(LASSO_SOAP_FAULT_CODE_SERVER); + detail = lasso_soap_detail_new(); + detail->any = g_list_append(detail->any, lasso_is_redirect_request_new(redirectUrl)); + service->private_data->fault->Detail = detail; + + return 0; +} + /** * lasso_data_service_init_query * @service: a #LassoDataService @@ -190,7 +213,7 @@ lasso_data_service_init_query(LassoDataService *service, const char *select, return LASSO_ERROR_UNIMPLEMENTED; } - /* Added needed credential for remote service */ + /* Added needd credential for remote service */ if (description->CredentialRef) { char *credentialRef = description->CredentialRef->data; iter = service->private_data->credentials; @@ -208,6 +231,47 @@ lasso_data_service_init_query(LassoDataService *service, const char *select, } /** + * lasso_data_service_get_redirect_request_url: + * @service: a #LassoDataService + * @message: the dst query message + * + * Tells if Attribute Provider needs user interaction. + * + * Return value: TRUE if needed; or FALSE otherwise. + **/ +gchar* +lasso_data_service_get_redirect_request_url(LassoDataService *service) +{ + LassoSoapFault *fault = NULL; + LassoIsRedirectRequest *redirect_request = NULL; + GList *iter; + + iter = LASSO_WSF_PROFILE(service)->soap_envelope_response->Body->any; + while (iter) { + if (LASSO_IS_SOAP_FAULT(iter->data) == TRUE) { + fault = LASSO_SOAP_FAULT(iter->data); + break; + } + iter = iter->next; + } + if (!fault) + return NULL; + + iter = fault->Detail->any; + while (iter) { + if (LASSO_IS_IS_REDIRECT_REQUEST(iter->data) == TRUE) { + redirect_request = LASSO_IS_REDIRECT_REQUEST(iter->data); + break; + } + iter = iter->next; + } + if (!redirect_request) + return NULL; + + return g_strdup(redirect_request->redirectURL); +} + +/** * lasso_data_service_process_query_msg: * @service: a #LassoDataService * @message: the dst query message @@ -341,12 +405,19 @@ lasso_data_service_build_response_msg(LassoDataService *service) profile = LASSO_WSF_PROFILE(service); request = LASSO_DST_QUERY(profile->request); + envelope = profile->soap_envelope_response; + + if (service->private_data->fault != NULL) { + envelope->Body->any = g_list_append( + envelope->Body->any, service->private_data->fault); + return lasso_wsf_profile_build_soap_response_msg(profile); + } + response = lasso_dst_query_response_new( lasso_utility_status_new(LASSO_DST_STATUS_CODE_OK)); profile->response = LASSO_NODE(response); response->prefixServiceType = g_strdup(request->prefixServiceType); response->hrefServiceType = g_strdup(request->hrefServiceType); - envelope = profile->soap_envelope_response; envelope->Body->any = g_list_append(envelope->Body->any, response); doc = xmlNewDoc((xmlChar*)"1.0"); @@ -508,16 +579,44 @@ lasso_data_service_process_query_response_msg(LassoDataService *service, { int rc; LassoDstQueryResponse *response; + LassoSoapFault *fault = NULL; + LassoIsRedirectRequest *redirect_request = NULL; + GList *iter; rc = lasso_wsf_profile_process_soap_response_msg(LASSO_WSF_PROFILE(service), message); if (rc) return rc; - if (! LASSO_IS_DST_QUERY_RESPONSE(LASSO_WSF_PROFILE(service)->response)) + /* Process Soap Faults response */ + iter = LASSO_WSF_PROFILE(service)->soap_envelope_response->Body->any; + while (iter) { + if (LASSO_IS_SOAP_FAULT(iter->data) == TRUE) { + fault = LASSO_SOAP_FAULT(iter->data); + break; + } + iter = iter->next; + } + if (!fault) + return 0; + + iter = fault->Detail->any; + while (iter) { + if (LASSO_IS_IS_REDIRECT_REQUEST(iter->data) == TRUE) { + redirect_request = LASSO_IS_REDIRECT_REQUEST(iter->data); + break; + } + iter = iter->next; + } + if (redirect_request) + return LASSO_SOAP_FAULT_REDIRECT_REQUEST; + + return 0; + + /*if (! LASSO_IS_DST_QUERY_RESPONSE(LASSO_WSF_PROFILE(service)->response)) return LASSO_ERROR_UNDEFINED; response = LASSO_DST_QUERY_RESPONSE(LASSO_WSF_PROFILE(service)->response); if (response->Status == NULL || strcmp(response->Status->code, "OK") != 0) - return LASSO_ERROR_UNDEFINED; + return LASSO_ERROR_UNDEFINED;*/ return 0; } @@ -642,6 +741,7 @@ lasso_data_service_set_offering(LassoDataService *service, service->private_data->offering = g_object_ref(offering); } + /*****************************************************************************/ /* overrided parent class methods */ /*****************************************************************************/ @@ -681,6 +781,7 @@ instance_init(LassoDataService *service) { service->resource_data = NULL; service->private_data = g_new0(LassoDataServicePrivate, 1); + service->private_data->fault = NULL; } static void diff --git a/lasso/id-wsf/data_service.h b/lasso/id-wsf/data_service.h index 2f162b02..bbdd0a70 100644 --- a/lasso/id-wsf/data_service.h +++ b/lasso/id-wsf/data_service.h @@ -117,6 +117,12 @@ LASSO_EXPORT gint lasso_data_service_process_modify_msg(LassoDataService *servic LASSO_EXPORT gint lasso_data_service_process_modify_response_msg(LassoDataService *service, const gchar *soap_msg); +LASSO_EXPORT gboolean lasso_data_service_need_user_interaction(LassoDataService *service, + const char *redirectUrl); + +LASSO_EXPORT gchar* lasso_data_service_get_redirect_request_url(LassoDataService *service); + + #ifdef __cplusplus } #endif /* __cplusplus */ |
