X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2FXMLToolingConfig.cpp;h=4a00d2ab89e35ae1e338d2a120b3d40f9060cce7;hb=6505807a62569ce65803b448b07a6872c6af2512;hp=7b9d378942f78ab15f714c3d7c5745cff3e2d644;hpb=a84e39caa065a850880467b8eeaf2061bccfbf6d;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltooling/XMLToolingConfig.cpp b/xmltooling/XMLToolingConfig.cpp index 7b9d378..4a00d2a 100644 --- a/xmltooling/XMLToolingConfig.cpp +++ b/xmltooling/XMLToolingConfig.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2001-2006 Internet2 + * Copyright 2001-2007 Internet2 * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,47 +23,79 @@ #include "internal.h" #include "exceptions.h" #include "XMLToolingConfig.h" +#include "encryption/Encrypter.h" #include "impl/UnknownElement.h" -#include "signature/KeyInfo.h" +#include "security/TrustEngine.h" +#include "security/OpenSSLCryptoX509CRL.h" +#include "security/CredentialResolver.h" +#include "security/KeyInfoResolver.h" #include "signature/Signature.h" +#include "soap/SOAP.h" +#include "soap/SOAPTransport.h" #include "util/NDC.h" +#include "util/ReplayCache.h" +#include "util/StorageService.h" +#include "util/TemplateEngine.h" +#include "util/URLEncoder.h" #include "util/XMLConstants.h" -#include "validation/Validator.h" +#include "validation/ValidatorSuite.h" #ifdef HAVE_DLFCN_H # include #endif +#include +#include #include #include #include #include #ifndef XMLTOOLING_NO_XMLSEC #include + #include #endif -#include - +using namespace soap11; +using namespace xmlencryption; using namespace xmlsignature; using namespace xmltooling; using namespace log4cpp; using namespace std; -DECL_EXCEPTION_FACTORY(XMLParserException,xmltooling); -DECL_EXCEPTION_FACTORY(XMLObjectException,xmltooling); -DECL_EXCEPTION_FACTORY(MarshallingException,xmltooling); -DECL_EXCEPTION_FACTORY(UnmarshallingException,xmltooling); -DECL_EXCEPTION_FACTORY(UnknownElementException,xmltooling); -DECL_EXCEPTION_FACTORY(UnknownAttributeException,xmltooling); -DECL_EXCEPTION_FACTORY(UnknownExtensionException,xmltooling); -DECL_EXCEPTION_FACTORY(ValidationException,xmltooling); +DECL_XMLTOOLING_EXCEPTION_FACTORY(XMLParserException,xmltooling); +DECL_XMLTOOLING_EXCEPTION_FACTORY(XMLObjectException,xmltooling); +DECL_XMLTOOLING_EXCEPTION_FACTORY(MarshallingException,xmltooling); +DECL_XMLTOOLING_EXCEPTION_FACTORY(UnmarshallingException,xmltooling); +DECL_XMLTOOLING_EXCEPTION_FACTORY(UnknownElementException,xmltooling); +DECL_XMLTOOLING_EXCEPTION_FACTORY(UnknownAttributeException,xmltooling); +DECL_XMLTOOLING_EXCEPTION_FACTORY(UnknownExtensionException,xmltooling); +DECL_XMLTOOLING_EXCEPTION_FACTORY(ValidationException,xmltooling); +DECL_XMLTOOLING_EXCEPTION_FACTORY(IOException,xmltooling); #ifndef XMLTOOLING_NO_XMLSEC - DECL_EXCEPTION_FACTORY(SignatureException,xmlsignature); + DECL_XMLTOOLING_EXCEPTION_FACTORY(XMLSecurityException,xmltooling); + DECL_XMLTOOLING_EXCEPTION_FACTORY(SignatureException,xmlsignature); + DECL_XMLTOOLING_EXCEPTION_FACTORY(EncryptionException,xmlencryption); #endif namespace xmltooling { - XMLToolingInternalConfig g_config; + static XMLToolingInternalConfig g_config; + static vector g_openssl_locks; + + extern "C" void openssl_locking_callback(int mode,int n,const char *file,int line) + { + if (mode & CRYPTO_LOCK) + g_openssl_locks[n]->lock(); + else + g_openssl_locks[n]->unlock(); + } + + #ifndef WIN32 + extern "C" unsigned long openssl_thread_id(void) + { + return (unsigned long)(pthread_self()); + } + #endif } XMLToolingConfig& XMLToolingConfig::getConfig() @@ -135,6 +167,24 @@ bool XMLToolingInternalConfig::log_config(const char* config) return true; } +void XMLToolingConfig::setReplayCache(ReplayCache* replayCache) +{ + delete m_replayCache; + m_replayCache = replayCache; +} + +void XMLToolingConfig::setTemplateEngine(TemplateEngine* templateEngine) +{ + delete m_templateEngine; + m_templateEngine = templateEngine; +} + +void XMLToolingConfig::setURLEncoder(URLEncoder* urlEncoder) +{ + delete m_urlEncoder; + m_urlEncoder = urlEncoder; +} + bool XMLToolingInternalConfig::init() { #ifdef _DEBUG @@ -144,6 +194,12 @@ bool XMLToolingInternalConfig::init() try { log.debug("library initialization started"); + if (curl_global_init(CURL_GLOBAL_ALL)) { + log.fatal("failed to initialize libcurl, OpenSSL, or Winsock"); + return false; + } + log.debug("libcurl %s initialization complete", LIBCURL_VERSION); + xercesc::XMLPlatformUtils::Initialize(); log.debug("Xerces initialization complete"); @@ -156,39 +212,108 @@ bool XMLToolingInternalConfig::init() m_parserPool=new ParserPool(); m_validatingPool=new ParserPool(true,true); m_lock=xercesc::XMLPlatformUtils::makeMutex(); + + // Load catalogs from path. + if (!catalog_path.empty()) { + char* catpath=strdup(catalog_path.c_str()); + char* sep=NULL; + char* start=catpath; + while (start && *start) { + sep=strchr(start,PATH_SEPARATOR_CHAR); + if (sep) + *sep=0; + auto_ptr_XMLCh temp(start); + m_validatingPool->loadCatalog(temp.get()); + start = sep ? sep + 1 : NULL; + } + free(catpath); + } // default registrations XMLObjectBuilder::registerDefaultBuilder(new UnknownElementBuilder()); registerKeyInfoClasses(); - - REGISTER_EXCEPTION_FACTORY(XMLParserException,xmltooling); - REGISTER_EXCEPTION_FACTORY(XMLObjectException,xmltooling); - REGISTER_EXCEPTION_FACTORY(MarshallingException,xmltooling); - REGISTER_EXCEPTION_FACTORY(UnmarshallingException,xmltooling); - REGISTER_EXCEPTION_FACTORY(UnknownElementException,xmltooling); - REGISTER_EXCEPTION_FACTORY(UnknownAttributeException,xmltooling); - REGISTER_EXCEPTION_FACTORY(ValidationException,xmltooling); + registerEncryptionClasses(); + registerSOAPClasses(); + + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(XMLParserException,xmltooling); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(XMLObjectException,xmltooling); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(MarshallingException,xmltooling); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(UnmarshallingException,xmltooling); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(UnknownElementException,xmltooling); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(UnknownAttributeException,xmltooling); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(ValidationException,xmltooling); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(IOException,xmltooling); #ifndef XMLTOOLING_NO_XMLSEC - XMLObjectBuilder::registerBuilder(QName(XMLConstants::XMLSIG_NS,Signature::LOCAL_NAME),new SignatureBuilder()); - REGISTER_EXCEPTION_FACTORY(SignatureException,xmlsignature); + XMLObjectBuilder::registerBuilder(QName(xmlconstants::XMLSIG_NS,Signature::LOCAL_NAME),new SignatureBuilder()); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(XMLSecurityException,xmltooling); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(SignatureException,xmlsignature); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(EncryptionException,xmlencryption); + registerKeyInfoResolvers(); + registerCredentialResolvers(); + registerTrustEngines(); #endif + registerSOAPTransports(); + initSOAPTransports(); + registerStorageServices(); + + m_urlEncoder = new URLEncoder(); + m_keyInfoResolver = KeyInfoResolverManager.newPlugin(INLINE_KEYINFO_RESOLVER,NULL); + + // Register xml:id as an ID attribute. + static const XMLCh xmlid[] = UNICODE_LITERAL_2(i,d); + AttributeExtensibleXMLObject::registerIDAttribute(QName(xmlconstants::XML_NS, xmlid)); } catch (const xercesc::XMLException&) { log.fatal("caught exception while initializing Xerces"); + curl_global_cleanup(); return false; } + // Set up OpenSSL locking. + for (int i=0; i()); + g_openssl_locks.clear(); + + SchemaValidators.destroyValidators(); XMLObjectBuilder::destroyBuilders(); - Validator::destroyValidators(); XMLToolingException::deregisterFactories(); + AttributeExtensibleXMLObject::deregisterIDAttributes(); + + StorageServiceManager.deregisterFactories(); + termSOAPTransports(); + SOAPTransportManager.deregisterFactories(); +#ifndef XMLTOOLING_NO_XMLSEC + TrustEngineManager.deregisterFactories(); + CredentialResolverManager.deregisterFactories(); + KeyInfoResolverManager.deregisterFactories(); +#endif + + delete m_keyInfoResolver; + m_keyInfoResolver = NULL; + + delete m_replayCache; + m_replayCache = NULL; + + delete m_templateEngine; + m_templateEngine = NULL; + + delete m_urlEncoder; + m_urlEncoder = NULL; for (vector::reverse_iterator i=m_libhandles.rbegin(); i!=m_libhandles.rend(); i++) { #if defined(WIN32) @@ -222,16 +347,18 @@ void XMLToolingInternalConfig::term() m_lock=NULL; xercesc::XMLPlatformUtils::Terminate(); + curl_global_cleanup(); + #ifdef _DEBUG xmltooling::NDC ndc("term"); #endif Category::getInstance(XMLTOOLING_LOGCAT".XMLToolingConfig").info("library shutdown complete"); } -Lockable& XMLToolingInternalConfig::lock() +Lockable* XMLToolingInternalConfig::lock() { xercesc::XMLPlatformUtils::lockMutex(m_lock); - return *this; + return this; } void XMLToolingInternalConfig::unlock() @@ -314,3 +441,26 @@ bool XMLToolingInternalConfig::load_library(const char* path, void* context) log.info("loaded extension: %s", path); return true; } + +#ifndef XMLTOOLING_NO_XMLSEC +void xmltooling::log_openssl() +{ + const char* file; + const char* data; + int flags,line; + + unsigned long code=ERR_get_error_line_data(&file,&line,&data,&flags); + while (code) { + Category& log=Category::getInstance("OpenSSL"); + log.errorStream() << "error code: " << code << " in " << file << ", line " << line << CategoryStream::ENDLINE; + if (data && (flags & ERR_TXT_STRING)) + log.errorStream() << "error data: " << data << CategoryStream::ENDLINE; + code=ERR_get_error_line_data(&file,&line,&data,&flags); + } +} + +XSECCryptoX509CRL* XMLToolingInternalConfig::X509CRL() const +{ + return new OpenSSLCryptoX509CRL(); +} +#endif