From 1183312d9d5248a93e28cf55e88ef0c819cc27a0 Mon Sep 17 00:00:00 2001 From: m0gg Date: Fri, 24 Nov 2006 10:54:03 +0000 Subject: Message signature with xmlsec1 --- libcsoap/Makefile.am | 5 ++ libcsoap/soap-addressing.c | 33 ++++++++++- libcsoap/soap-addressing.h | 5 +- libcsoap/soap-env.c | 22 +++---- libcsoap/soap-fault.c | 22 +++---- libcsoap/soap-server.c | 145 ++++++++++++++++++++++++++++++--------------- 6 files changed, 156 insertions(+), 76 deletions(-) (limited to 'libcsoap') diff --git a/libcsoap/Makefile.am b/libcsoap/Makefile.am index a0dc62e..e5518cb 100644 --- a/libcsoap/Makefile.am +++ b/libcsoap/Makefile.am @@ -13,6 +13,11 @@ libcsoap_la_HEADERS=soap-xml.h soap-fault.h soap-env.h soap-service.h \ soap-admin.h soap-addressing.h soap-transport.h \ soap-nudp.h soap-nhttp.h soap-wsil.h +if BUILD_WITH_XMLSEC1 +libcsoap_la_SOURCES+=soap-xmlsec.c +libcsoap_la_HEADERS+=soap-xmlsec.h +endif + libcsoap_la_LDFLAGS= -version-info @csoap_version@ -release @csoap_release@ libcsoap_la_CFLAGS=-I${top_srcdir} -D__CSOAP_INTERNAL=1 diff --git a/libcsoap/soap-addressing.c b/libcsoap/soap-addressing.c index dc75d18..95c47cd 100644 --- a/libcsoap/soap-addressing.c +++ b/libcsoap/soap-addressing.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-addressing.c,v 1.3 2006/11/23 15:27:33 m0gg Exp $ +* $Id: soap-addressing.c,v 1.4 2006/11/24 10:54:03 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2006 Heiko Ronsdorf @@ -83,7 +83,7 @@ _soap_addressing_generate_id(void) { uuid_t uuid; uint32_t status; - char *ret; + char *ret, *buf; uuid_create(&uuid, &status); if (status != uuid_s_ok) @@ -92,12 +92,24 @@ _soap_addressing_generate_id(void) return NULL; } - uuid_to_string(&uuid, &ret, &status); + uuid_to_string(&uuid, &buf, &status); if (status != uuid_s_ok) { log_error2("uuid_to_string failed (%s)", _soap_addressing_uuid_error(status)); return NULL; } + + if (!(ret = (char *)malloc(128))) + { + log_error2("malloc failed (%s)", strerror(errno)); + free(buf); + return NULL; + } + + sprintf(ret, "%s/%s", soap_server_get_name(), buf); + + free(buf); + return ret; } @@ -295,6 +307,8 @@ soap_addressing_set_message_id_string(struct SoapEnv *envelope, xmlChar *id) else tmp = id; + log_verbose2("setting message id = \"%s\"", tmp); + node = _soap_addressing_get_child_element(envelope->header, WSA_MESSAGE_ID); if (node == NULL) node = _soap_addressing_add_node(envelope->header, WSA_MESSAGE_ID, tmp); @@ -431,6 +445,19 @@ soap_addressing_set_from(struct SoapEnv *envelope, xmlNodePtr address) return ret; } +xmlNodePtr +soap_addressing_set_from_string(struct SoapEnv *envelope, const char *from) +{ + xmlURI *uri; + xmlNodePtr ret; + + uri = xmlParseURI(from); + ret = soap_addressing_set_from_address(envelope, uri); + xmlFreeURI(uri); + + return ret; +} + xmlURI * soap_addressing_get_from_address(struct SoapEnv *envelope) { diff --git a/libcsoap/soap-addressing.h b/libcsoap/soap-addressing.h index 224fd33..0893ac5 100644 --- a/libcsoap/soap-addressing.h +++ b/libcsoap/soap-addressing.h @@ -1,5 +1,5 @@ /****************************************************************** - * $Id: soap-addressing.h,v 1.3 2006/11/23 15:27:33 m0gg Exp $ + * $Id: soap-addressing.h,v 1.4 2006/11/24 10:54:03 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2006 Heiko Ronsdorf @@ -35,7 +35,7 @@ * in a transport-neutral manner. * * @author H. Ronsdorf - * @version $Revision: 1.3 $ + * @version $Revision: 1.4 $ * @see http://www.w3.org/TR/ws-addr-core/ * */ @@ -197,6 +197,7 @@ xmlNodePtr soap_addressing_get_metadata(xmlNodePtr endpoint_reference); xmlNodePtr soap_addressing_set_metadata(xmlNodePtr endpoint_reference, xmlNodePtr parameter); xmlURI *soap_addressing_get_message_id(struct SoapEnv *envelope); +xmlChar *soap_addressing_get_message_id_string(struct SoapEnv *envelope); xmlNodePtr soap_addressing_set_message_id(struct SoapEnv *envelope, xmlURI *id); xmlNodePtr soap_addressing_get_relates_to(struct SoapEnv *envelope); diff --git a/libcsoap/soap-env.c b/libcsoap/soap-env.c index 6bdce39..6abfb1f 100644 --- a/libcsoap/soap-env.c +++ b/libcsoap/soap-env.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-env.c,v 1.24 2006/11/23 15:27:33 m0gg Exp $ +* $Id: soap-env.c,v 1.25 2006/11/24 10:54:03 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -74,11 +74,11 @@ Parameters: "" \ - " " \ - " "\ - " "\ - " " \ - " "\ + "" \ + ""\ + ""\ + "" \ + ""\ "" @@ -96,11 +96,11 @@ Parameters: "" \ - " " \ - " "\ - " <%s xmlns=\"%s\">"\ - " " \ - " "\ + "" \ + ""\ + "<%s xmlns=\"%s\">"\ + "" \ + ""\ "" diff --git a/libcsoap/soap-fault.c b/libcsoap/soap-fault.c index 242a51a..8bb3945 100644 --- a/libcsoap/soap-fault.c +++ b/libcsoap/soap-fault.c @@ -1,5 +1,5 @@ /****************************************************************** -* $Id: soap-fault.c,v 1.13 2006/11/23 15:27:33 m0gg Exp $ +* $Id: soap-fault.c,v 1.14 2006/11/24 10:54:03 m0gg Exp $ * * CSOAP Project: A SOAP client/server library in C * Copyright (C) 2003 Ferhat Ayaz @@ -59,15 +59,15 @@ Parameters: " SOAP-ENV:encoding=\"%s\"" \ " xmlns:xsi=\"%s\"" \ " xmlns:xsd=\"%s\">" \ - " " \ - " " \ - " "\ - " %s"\ - " %s"\ - " %s"\ - " %s"\ - " " \ - " "\ + "" \ + "" \ + ""\ + "%s"\ + "%s"\ + "%s"\ + "%s"\ + "" \ + ""\ "" @@ -135,7 +135,7 @@ soap_fault_build(int fault_code, const char *fault_string, const char *fault_act if (fault == NULL) { - log_error1("Can not create xml document!"); + log_error1("Cannot create XML document!"); return soap_fault_build(fault_code, "Cannot create fault object in XML", soap_server_get_name(), NULL); } 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; } -- cgit v1.1-32-gdbae