summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Clapies <nclapies@entrouvert.com>2005-09-27 21:37:31 +0000
committerNicolas Clapies <nclapies@entrouvert.com>2005-09-27 21:37:31 +0000
commit4c3d7d115cd5bf8305f54692d48010cecd8c408f (patch)
treeaefde86e30ffb61418aeb8d07602b18e262ea671
parente5994968e16fd1e1f3a557124043db8b4f265b93 (diff)
downloadlasso-4c3d7d115cd5bf8305f54692d48010cecd8c408f.tar.gz
lasso-4c3d7d115cd5bf8305f54692d48010cecd8c408f.tar.xz
lasso-4c3d7d115cd5bf8305f54692d48010cecd8c408f.zip
Added a first support of soap binding Fault wsf response.
-rw-r--r--lasso/id-wsf/discovery.c24
-rw-r--r--lasso/id-wsf/wsf_profile.c45
2 files changed, 52 insertions, 17 deletions
diff --git a/lasso/id-wsf/discovery.c b/lasso/id-wsf/discovery.c
index eb610816..f423bb20 100644
--- a/lasso/id-wsf/discovery.c
+++ b/lasso/id-wsf/discovery.c
@@ -529,13 +529,15 @@ lasso_discovery_process_modify_msg(LassoDiscovery *discovery, const gchar *messa
const gchar *security_mech_id)
{
LassoDiscoModify *request;
+ int res = 0;
g_return_val_if_fail(LASSO_IS_DISCOVERY(discovery), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
g_return_val_if_fail(message != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
- if (lasso_wsf_profile_process_soap_request_msg(LASSO_WSF_PROFILE(discovery),
- message, security_mech_id) < 0)
- return -1;
+ res = lasso_wsf_profile_process_soap_request_msg(LASSO_WSF_PROFILE(discovery), message,
+ security_mech_id);
+ if (res != 0)
+ return res;
request = LASSO_DISCO_MODIFY(LASSO_WSF_PROFILE(discovery)->request);
@@ -571,6 +573,10 @@ lasso_discovery_build_modify_response_msg(LassoDiscovery *discovery)
gboolean failure = FALSE;
char *new_entry_ids = NULL, *t_new_entry_ids = NULL;
+ if (lasso_wsf_profile_get_fault(LASSO_WSF_PROFILE(discovery))) {
+ return lasso_wsf_profile_build_soap_response_msg(LASSO_WSF_PROFILE(discovery));
+ }
+
/* build response */
status = lasso_utility_status_new(LASSO_DISCO_STATUS_CODE_FAILED);
response = lasso_disco_modify_response_new(status);
@@ -721,10 +727,14 @@ lasso_discovery_build_response_msg(LassoDiscovery *discovery)
GList *offerings = NULL;
GList *iter, *iter2, *iter3, *iter4;
- int res;
+ int res = 0;
gchar *credentialRef;
+ if (lasso_wsf_profile_get_fault(LASSO_WSF_PROFILE(discovery))) {
+ return lasso_wsf_profile_build_soap_response_msg(LASSO_WSF_PROFILE(discovery));
+ }
+
iter = request->RequestedServiceType;
while (iter) {
LassoDiscoRequestedServiceType *service_type = iter->data;
@@ -765,11 +775,9 @@ lasso_discovery_build_response_msg(LassoDiscovery *discovery)
}
}
- res = lasso_wsf_profile_build_soap_response_msg(LASSO_WSF_PROFILE(discovery));
- if (res < 0)
- return res;
+ //res = lasso_wsf_profile_build_soap_response_msg(LASSO_WSF_PROFILE(discovery));
- return 0;
+ return res;
}
/**
diff --git a/lasso/id-wsf/wsf_profile.c b/lasso/id-wsf/wsf_profile.c
index 27d6ef9e..0a91966b 100644
--- a/lasso/id-wsf/wsf_profile.c
+++ b/lasso/id-wsf/wsf_profile.c
@@ -24,6 +24,7 @@
#include <lasso/id-wsf/wsf_profile.h>
#include <lasso/xml/disco_modify.h>
+#include <lasso/xml/soap_fault.h>
#include <lasso/xml/soap_binding_correlation.h>
#include <lasso/xml/soap_binding_provider.h>
#include <lasso/xml/wsse_security.h>
@@ -41,12 +42,19 @@ struct _LassoWsfProfilePrivate
{
gboolean dispose_has_run;
char *security_mech_id;
+ LassoSoapFault *fault;
};
/*****************************************************************************/
/* private methods */
/*****************************************************************************/
+LassoSoapFault*
+lasso_wsf_profile_get_fault(LassoWsfProfile *profile)
+{
+ return profile->private_data->fault;
+}
+
gboolean
lasso_security_mech_id_is_x509_authentication(const gchar *security_mech_id)
{
@@ -557,8 +565,10 @@ lasso_wsf_profile_process_soap_request_msg(LassoWsfProfile *profile,
{
LassoSoapBindingCorrelation *correlation;
LassoSoapEnvelope *envelope = NULL;
+ LassoSoapFault *fault = NULL;
+ GList *iter;
gchar *messageId;
- int res;
+ int res = 0;
g_return_val_if_fail(LASSO_IS_WSF_PROFILE(profile), LASSO_PARAM_ERROR_BAD_TYPE_OR_NULL_OBJ);
g_return_val_if_fail(message != NULL, LASSO_PARAM_ERROR_INVALID_VALUE);
@@ -566,11 +576,17 @@ lasso_wsf_profile_process_soap_request_msg(LassoWsfProfile *profile,
profile->private_data->security_mech_id = g_strdup(security_mech_id);
xmlDoc *doc = xmlParseMemory(message, strlen(message));
+
+ /* If X509 authentication mecanism, then verify signature */
if (lasso_security_mech_id_is_x509_authentication(security_mech_id) == TRUE) {
- int res = lasso_wsf_profile_verify_x509_authentication(profile, doc);
- if (res != 0)
- return res;
+ res = lasso_wsf_profile_verify_x509_authentication(profile, doc);
+ }
+ res = 101;
+ if (res != 0) {
+ fault = lasso_soap_fault_new();
+ fault->faultstring = "Invalid signature";
}
+
/* FIXME: Remove Signature element if exists, it seg fault when a call to
lasso_node_new_from_xmlNode() */
{
@@ -583,17 +599,20 @@ lasso_wsf_profile_process_soap_request_msg(LassoWsfProfile *profile,
}
envelope = LASSO_SOAP_ENVELOPE(lasso_node_new_from_xmlNode(xmlDocGetRootElement(doc)));
-
profile->soap_envelope_request = envelope;
- profile->request = LASSO_NODE(envelope->Body->any->data);
-
- correlation = envelope->Header->Other->data;
+ profile->request = LASSO_NODE(envelope->Body->any->data);
+ correlation = LASSO_SOAP_BINDING_CORRELATION(envelope->Header->Other->data);
messageId = correlation->messageID;
envelope = lasso_wsf_profile_build_soap_envelope(messageId,
LASSO_PROVIDER(profile->server)->ProviderID);
LASSO_WSF_PROFILE(profile)->soap_envelope_response = envelope;
- return 0;
+ if (fault) {
+ envelope->Body->any = g_list_append(envelope->Body->any, fault);
+ profile->private_data->fault = fault;
+ }
+
+ return res;
}
gint
@@ -626,6 +645,12 @@ lasso_wsf_profile_process_soap_response_msg(LassoWsfProfile *profile, const gcha
envelope = LASSO_SOAP_ENVELOPE(lasso_node_new_from_xmlNode(xmlDocGetRootElement(doc)));
profile->soap_envelope_response = envelope;
+
+ /* Soap Fault message */
+ if (LASSO_IS_SOAP_FAULT(envelope->Body->any->data) == TRUE)
+ return -1;
+
+ /* Soap Body message */
profile->response = LASSO_NODE(envelope->Body->any->data);
return 0;
@@ -695,6 +720,8 @@ instance_init(LassoWsfProfile *profile)
profile->private_data = g_new0(LassoWsfProfilePrivate, 1);
profile->private_data->dispose_has_run = FALSE;
+ profile->private_data->security_mech_id = NULL;
+ profile->private_data->fault = NULL;
}
static void