summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Dauvergne <bdauvergne@entrouvert.com>2010-02-17 10:14:55 +0000
committerBenjamin Dauvergne <bdauvergne@entrouvert.com>2010-02-17 10:14:55 +0000
commit6ca10e383dd7dba708f1784acf42e78bd5990db2 (patch)
tree0cd7f8b2f246ca3b1417b36e92bc301705ad3bc2
parent00125b59a279b741da950e28cea85f489839fd83 (diff)
ID-WSF 2.0: make lasso_idwsf2_profile_redirect_user_for_interaction choke on missing redirect property on UserInteraction header
* lasso/id-wsf-2.0/profile.c: if redirect boolean property is false, refuse to return a redirect request. automatically create a SOAP fault to signal to the requester that it needs to support interaction via redirect.
-rw-r--r--lasso/id-wsf-2.0/profile.c54
1 files changed, 47 insertions, 7 deletions
diff --git a/lasso/id-wsf-2.0/profile.c b/lasso/id-wsf-2.0/profile.c
index 24663cd4..64868a9b 100644
--- a/lasso/id-wsf-2.0/profile.c
+++ b/lasso/id-wsf-2.0/profile.c
@@ -47,6 +47,7 @@
#include "../xml/xml_enc.h"
#include "../xml/id-wsf-2.0/sb2_sender.h"
#include "../xml/id-wsf-2.0/sb2_redirect_request.h"
+#include "../xml/id-wsf-2.0/util_status.h"
#include "../xml/ws/wsse_security_header.h"
@@ -469,23 +470,33 @@ lasso_idwsf2_profile_redirect_user_for_interaction(
LassoSoapFault *fault = NULL;
LassoIdWsf2Sb2RedirectRequest *redirect_request = NULL;
LassoIdWsf2Sb2UserInteractionHint hint;
+ LassoIdWsf2Sb2UserInteractionHeader *user_interaction_header;
+ LassoSoapEnvelope *soap_envelope_request;
int rc = 0;
lasso_bad_param(IDWSF2_PROFILE, profile);
lasso_check_non_empty_string(redirect_url);
- hint = lasso_soap_envelope_get_sb2_user_interaction_hint(
- lasso_idwsf2_profile_get_soap_envelope_request(profile));
+ soap_envelope_request = lasso_idwsf2_profile_get_soap_envelope_request(profile);
+ if (! soap_envelope_request) {
+ return LASSO_PROFILE_ERROR_MISSING_REQUEST;
+ }
+ hint = lasso_soap_envelope_get_sb2_user_interaction_hint(soap_envelope_request);
switch (hint) {
case LASSO_IDWSF2_SB2_USER_INTERACTION_HINT_DO_NOT_INTERACT:
- return LASSO_WSF_PROFILE_ERROR_SERVER_INTERACTION_REQUIRED;
+ goto_cleanup_with_rc(LASSO_WSF_PROFILE_ERROR_SERVER_INTERACTION_REQUIRED);
case LASSO_IDWSF2_SB2_USER_INTERACTION_HINT_DO_NOT_INTERACT_FOR_DATA:
if (for_data) {
- return LASSO_WSF_PROFILE_ERROR_SERVER_INTERACTION_REQUIRED_FOR_DATA;
+ goto_cleanup_with_rc(LASSO_WSF_PROFILE_ERROR_SERVER_INTERACTION_REQUIRED_FOR_DATA);
}
default:
break;
}
+ user_interaction_header =
+ lasso_soap_envelope_get_sb2_user_interaction_header(soap_envelope_request, FALSE);
+ if (user_interaction_header == FALSE) {
+ goto_cleanup_with_rc(LASSO_WSF_PROFILE_ERROR_REDIRECT_REQUEST_UNSUPPORTED_BY_REQUESTER);
+ }
lasso_check_good_rc(lasso_idwsf2_profile_init_soap_fault_response(profile));
fault = (LassoSoapFault*)profile->parent.response;
@@ -495,6 +506,32 @@ lasso_idwsf2_profile_redirect_user_for_interaction(
lasso_soap_fault_add_to_detail(fault, (LassoNode*)redirect_request);
cleanup:
+ if (! rc) {
+ LassoIdWsf2UtilStatus *status;
+ const char *status_code = NULL;
+ lasso_idwsf2_profile_init_soap_fault_response(profile);
+ fault = (LassoSoapFault*)profile->parent.response;
+ lasso_assign_string(fault->faultcode, LASSO_SOAP_FAULT_CODE_SERVER);
+ switch (rc) {
+ case LASSO_WSF_PROFILE_ERROR_SERVER_INTERACTION_REQUIRED:
+ status_code = LASSO_IDWSF2_SB2_STATUS_CODE_SERVER_INTERACTION_REQUIRED;
+ break;
+ case LASSO_WSF_PROFILE_ERROR_SERVER_INTERACTION_REQUIRED_FOR_DATA:
+ status_code = LASSO_IDWSF2_SB2_STATUS_CODE_SERVER_INTERACTION_REQUIRED;
+ break;
+ case LASSO_WSF_PROFILE_ERROR_REDIRECT_REQUEST_UNSUPPORTED_BY_REQUESTER:
+ status_code = "RedirectRequestNeeded";
+ break;
+ default:
+ status_code = "UnknownInteraction error";
+ break;
+ }
+ if (status_code) {
+ status = lasso_idwsf2_util_status_new_with_code(status_code, NULL);
+ }
+ fault->Detail = lasso_soap_detail_new();
+ lasso_list_add_gobject(fault->Detail->any, status);
+ }
lasso_release_gobject(redirect_request);
return rc;
}
@@ -815,9 +852,12 @@ init_from_xml(LassoNode *node, xmlNode *xmlnode)
if (! wsf2_profile->private_data) {
wsf2_profile->private_data = g_new0(LassoIdWsf2ProfilePrivate, 1);
}
- epr_node = xmlSecFindChild(xmlnode, BAD_CAST LASSO_IDWSF2_PROFILE_ELEMENT_EPR, BAD_CAST LASSO_LASSO_HREF);
- request_node = xmlSecFindChild(xmlnode, BAD_CAST LASSO_IDWSF2_PROFILE_ELEMENT_REQUEST, BAD_CAST LASSO_LASSO_HREF);
- response_node = xmlSecFindChild(xmlnode, BAD_CAST LASSO_IDWSF2_PROFILE_ELEMENT_RESPONSE, BAD_CAST LASSO_LASSO_HREF);
+ epr_node = xmlSecFindChild(xmlnode, BAD_CAST LASSO_IDWSF2_PROFILE_ELEMENT_EPR, BAD_CAST
+ LASSO_LASSO_HREF);
+ request_node = xmlSecFindChild(xmlnode, BAD_CAST LASSO_IDWSF2_PROFILE_ELEMENT_REQUEST,
+ BAD_CAST LASSO_LASSO_HREF);
+ response_node = xmlSecFindChild(xmlnode, BAD_CAST LASSO_IDWSF2_PROFILE_ELEMENT_RESPONSE,
+ BAD_CAST LASSO_LASSO_HREF);
if (epr_node) {
epr = (LassoWsAddrEndpointReference*)lasso_node_new_from_xmlNode(epr_node);