summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDamien Laniel <dlaniel@entrouvert.com>2007-06-29 15:25:19 +0000
committerDamien Laniel <dlaniel@entrouvert.com>2007-06-29 15:25:19 +0000
commit1db332e9f8fff2b8a8b484fc9235f1280c2242f8 (patch)
treed43279e27a961adbbaabde1ff3741a9e742dfbe4
parentf7c23d191021bda3b16ec09651d5f16fabf8e073 (diff)
added lasso.SOAP_FAULT_REDIRECT_REQUEST eception when WSP needs user consent + service.redirectUrl
-rw-r--r--lasso/id-wsf-2.0/data_service.c48
-rw-r--r--lasso/id-wsf-2.0/data_service.h1
-rw-r--r--swig/Lasso-wsf2.i7
3 files changed, 55 insertions, 1 deletions
diff --git a/lasso/id-wsf-2.0/data_service.c b/lasso/id-wsf-2.0/data_service.c
index 9d6ec960..d02f8834 100644
--- a/lasso/id-wsf-2.0/data_service.c
+++ b/lasso/id-wsf-2.0/data_service.c
@@ -255,6 +255,46 @@ lasso_idwsf2_data_service_parse_query_items(LassoIdWsf2DataService *service)
return res;
}
+static gint
+lasso_idwsf2_data_service_process_query_response_soap_fault_msg(LassoIdWsf2DataService *service,
+ const gchar *message)
+{
+ LassoIdWsf2Profile *profile = LASSO_IDWSF2_PROFILE(service);
+ LassoSoapFault *fault;
+ LassoIdWsf2SoapBinding2RedirectRequest *redirect_request = NULL;
+ GList *iter;
+ int res;
+
+ if (! LASSO_IS_SOAP_FAULT(LASSO_PROFILE(profile)->response)) {
+ /* Should not happen as it should be checked in caller */
+ return 0;
+ }
+
+ fault = LASSO_SOAP_FAULT(LASSO_PROFILE(profile)->response);
+
+ if (fault->Detail == NULL || fault->Detail->any == NULL) {
+ return LASSO_SOAP_ERROR_MISSING_SOAP_FAULT_DETAIL;
+ }
+
+ /* Get RedirectRequest element from soap fault detail */
+ for (iter = fault->Detail->any; iter != NULL; iter = iter->next) {
+ if (LASSO_IS_IDWSF2_SOAP_BINDING2_REDIRECT_REQUEST(iter->data) == TRUE) {
+ redirect_request = LASSO_IDWSF2_SOAP_BINDING2_REDIRECT_REQUEST(iter->data);
+ break;
+ }
+ }
+
+ if (redirect_request != NULL) {
+ /* This is not a failure, this exception code indicates the WSP needs to ask */
+ /* user consent to get an attribute */
+ res = LASSO_SOAP_FAULT_REDIRECT_REQUEST;
+ /* Get redirect request url */
+ service->redirect_url = g_strdup(redirect_request->redirectURL);
+ }
+
+ return res;
+}
+
gint
lasso_idwsf2_data_service_process_query_response_msg(LassoIdWsf2DataService *service,
const gchar *message)
@@ -271,7 +311,13 @@ lasso_idwsf2_data_service_process_query_response_msg(LassoIdWsf2DataService *ser
if (res != 0) {
return res;
}
-
+
+ /* Message can be either a SoapFault or a QueryResponse */
+ if (LASSO_IS_SOAP_FAULT(LASSO_PROFILE(profile)->response)) {
+ return lasso_idwsf2_data_service_process_query_response_soap_fault_msg(
+ service, message);
+ }
+
if (! LASSO_IS_IDWSF2_DSTREF_QUERY_RESPONSE(LASSO_PROFILE(profile)->response)) {
return LASSO_PROFILE_ERROR_INVALID_SOAP_MSG;
}
diff --git a/lasso/id-wsf-2.0/data_service.h b/lasso/id-wsf-2.0/data_service.h
index 9553af83..08d81b19 100644
--- a/lasso/id-wsf-2.0/data_service.h
+++ b/lasso/id-wsf-2.0/data_service.h
@@ -58,6 +58,7 @@ struct _LassoIdWsf2DataService {
/*< public >*/
xmlNode *data;
gchar *type;
+ gchar *redirect_url;
/*< private >*/
LassoIdWsf2DataServicePrivate *private_data;
diff --git a/swig/Lasso-wsf2.i b/swig/Lasso-wsf2.i
index b0a80d9e..12f4993a 100644
--- a/swig/Lasso-wsf2.i
+++ b/swig/Lasso-wsf2.i
@@ -323,6 +323,9 @@ typedef struct {
%newobject data;
char *data;
+ %immutable redirectUrl;
+ char *redirectUrl;
+
/* Constructor, Destructor & Static Methods */
LassoIdWsf2DataService(LassoServer *server);
@@ -425,6 +428,10 @@ typedef struct {
#define LassoIdWsf2DataService_set_data(self, value) set_xml_string(&(self)->data, (value))
#define LassoIdWsf2DataService_data_set(self, value) set_xml_string(&(self)->data, (value))
+/* redirectUrl */
+#define LassoIdWsf2DataService_get_redirectUrl(self) self->redirect_url
+#define LassoIdWsf2DataService_redirectUrl_get(self) self->redirect_url
+
/* Constructors, destructors & static methods implementations */
#define new_LassoIdWsf2DataService lasso_idwsf2_data_service_new