summaryrefslogtreecommitdiffstats
path: root/libcsoap/soap-server.c
diff options
context:
space:
mode:
authorGravatar m0gg2006-11-24 10:54:03 +0000
committerGravatar m0gg2006-11-24 10:54:03 +0000
commit1183312d9d5248a93e28cf55e88ef0c819cc27a0 (patch)
tree1f98189b991568719ace9e6709b46b6e52674964 /libcsoap/soap-server.c
parent6457c46897d6e0c63476bf4ba4ca14b4844fac0d (diff)
downloadcsoap-1183312d9d5248a93e28cf55e88ef0c819cc27a0.tar.gz
csoap-1183312d9d5248a93e28cf55e88ef0c819cc27a0.tar.bz2
Message signature with xmlsec1
Diffstat (limited to 'libcsoap/soap-server.c')
-rw-r--r--libcsoap/soap-server.c145
1 files changed, 96 insertions, 49 deletions
diff --git a/libcsoap/soap-server.c b/libcsoap/soap-server.c
index d8d996d..78114c2 100644
--- a/libcsoap/soap-server.c
+++ b/libcsoap/soap-server.c
@@ -1,5 +1,5 @@
/******************************************************************
-* $Id: soap-server.c,v 1.30 2006/11/23 15:27:33 m0gg Exp $
+* $Id: soap-server.c,v 1.31 2006/11/24 10:54:03 m0gg Exp $
*
* CSOAP Project: A SOAP client/server library in C
* Copyright (C) 2003 Ferhat Ayaz
@@ -53,6 +53,21 @@
#include "soap-addressing.h"
#include "soap-transport.h"
+#ifdef HAVE_XMLSEC1
+#include "soap-xmlsec.h"
+static inline herror_t
+_soap_server_xmlsec_sign(struct SoapEnv *envelope)
+{
+ return soap_xmlsec_sign(envelope);
+}
+#else
+static inline herror_t
+_soap_server_xmlsec_sign(struct SoapEnv *envelope)
+{
+ return H_OK;
+}
+#endif
+
#include "soap-server.h"
static SoapRouterNode *head = NULL;
@@ -92,6 +107,26 @@ _soap_server_env_new_with_fault(const char *fault_string, const char *detail, st
return soap_env_new_with_fault(SOAP_FAULT_RECEIVER, fault_string, soap_server_get_name(), detail, out);
}
+static void
+_soap_server_fillup_header(struct SoapEnv *envelope)
+{
+ xmlURI *uri;
+
+ log_verbose1(__FUNCTION__);
+
+ if (!(uri = soap_addressing_get_message_id(envelope)))
+ soap_addressing_set_message_id_string(envelope, NULL);
+ else
+ xmlFreeURI(uri);
+
+ if (!(uri = soap_addressing_get_from(envelope)))
+ soap_addressing_set_from_string(envelope, soap_server_get_name());
+ else
+ xmlFreeURI(uri);
+
+ return;
+}
+
struct SoapRouter *
soap_server_find_router(const char *context)
{
@@ -122,63 +157,67 @@ soap_server_process(struct SoapCtx *request, struct SoapCtx **response)
*response = soap_ctx_new(NULL);
- if (!(method = soap_env_find_methodname(request->env)))
+ if ((method = soap_env_find_methodname(request->env)))
{
- _soap_server_env_new_with_fault("No method found", "The method is missing in the SOAP envelope", &((*response)->env));
- return H_OK;
- }
- log_verbose2("method: \"%s\"", method);
-
- if (!(urn = soap_env_find_urn(request->env)))
- {
- _soap_server_env_new_with_fault("No URN found", "The URN is missing in the SOAP envelope", &((*response)->env));
- return H_OK;
- }
- log_verbose2("urn: \"%s\"", urn);
-
- if ((to = soap_addressing_get_to_address_string(request->env)))
- {
- if (!(router = soap_server_find_router(to)))
+ log_verbose2("method: \"%s\"", method);
+ if ((urn = soap_env_find_urn(request->env)))
+ {
+ log_verbose2("urn: \"%s\"", urn);
+ if ((to = soap_addressing_get_to_address_string(request->env)))
+ {
+ if ((router = soap_server_find_router(to)))
+ {
+ log_verbose2("router: %p", router);
+ if ((service = soap_router_find_service(router, urn, method)))
+ {
+ log_verbose3("service (%p) found, function (%p)", service, service->func);
+ if ((err = service->func(request, *response)) == H_OK)
+ {
+ if ((*response)->env == NULL)
+ {
+ sprintf(buffer, "Service \"%s\" returned no envelope", urn);
+ _soap_server_env_new_with_fault("Internal service error", buffer, &((*response)->env));
+ }
+ }
+ else
+ {
+ sprintf(buffer, "Service returned following error message: \"%s\"", herror_message(err));
+ herror_release(err);
+ _soap_server_env_new_with_fault("Internal service error", buffer, &((*response)->env));
+ }
+ }
+ else
+ {
+ sprintf(buffer, "no service for URN \"%s\" found", urn);
+ _soap_server_env_new_with_fault(buffer, "The URN is not known by the server", &((*response)->env));
+ }
+ }
+ else
+ {
+ sprintf(buffer, "no router for context \"%s\" found", to);
+ _soap_server_env_new_with_fault(buffer, "The method is unknown by the server", &((*response)->env));
+ free(to);
+ }
+ free(to);
+ }
+ else
+ {
+ _soap_server_env_new_with_fault(buffer, "The destination address is missing", &((*response)->env));
+ }
+ }
+ else
{
- sprintf(buffer, "no router for context \"%s\" found", to);
- _soap_server_env_new_with_fault(buffer, "The method is unknown by the server", &((*response)->env));
- free(to);
- return H_OK;
+ _soap_server_env_new_with_fault("No method found", "The method is missing in the SOAP envelope", &((*response)->env));
}
- free(to);
}
else
{
- _soap_server_env_new_with_fault(buffer, "The destination address is missing", &((*response)->env));
- return H_OK;
- }
- log_verbose2("router: %p", router);
-
- if (!(service = soap_router_find_service(router, urn, method)))
- {
- sprintf(buffer, "no service for URN \"%s\" found", urn);
- _soap_server_env_new_with_fault(buffer, "The URN is not known by the server", &((*response)->env));
- return H_OK;
- }
- log_verbose2("service found (%p)", service);
-
- log_verbose2("service function: %p", service->func);
- if ((err = service->func(request, *response)) != H_OK)
- {
- sprintf(buffer, "Service returned following error message: \"%s\"", herror_message(err));
- herror_release(err);
- _soap_server_env_new_with_fault("Internal service error", buffer, &((*response)->env));
- return H_OK;
+ _soap_server_env_new_with_fault("No URN found", "The URN is missing in the SOAP envelope", &((*response)->env));
}
- if ((*response)->env == NULL)
- {
- sprintf(buffer, "Service \"%s\" returned no envelope", urn);
- _soap_server_env_new_with_fault("Internal service error", buffer, &((*response)->env));
- return H_OK;
- }
+ _soap_server_fillup_header((*response)->env);
- return H_OK;
+ return _soap_server_xmlsec_sign((*response)->env);
}
herror_t
@@ -192,6 +231,14 @@ soap_server_init_args(int argc, char **argv)
return status;
}
+#ifdef HAVE_XMLSEC1
+ if ((status = soap_xmlsec_init_args(argc, argv)) != H_OK)
+ {
+ log_error2("soap_xmlsec_init_args failed (%s)", herror_message(status));
+ return status;
+ }
+#endif
+
return H_OK;
}