X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2FXMLToolingConfig.cpp;h=f4fc4d3afe1850048e27914955b6907d4a9390e9;hb=270ca608be354a2adc23e957abd98dc558221ae5;hp=009b724b0584ee12d13cb63f7c73c7cd1acf7f7f;hpb=645c1df85d4d450c5cd0458ec965bd68b0d6b880;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltooling/XMLToolingConfig.cpp b/xmltooling/XMLToolingConfig.cpp index 009b724..f4fc4d3 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. @@ -24,15 +24,22 @@ #include "exceptions.h" #include "XMLToolingConfig.h" #include "encryption/Encryption.h" +#include "encryption/Encrypter.h" +#include "io/HTTPRequest.h" +#include "io/HTTPResponse.h" #include "impl/UnknownElement.h" #include "security/TrustEngine.h" #include "security/OpenSSLCryptoX509CRL.h" -#include "signature/CredentialResolver.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/ValidatorSuite.h" @@ -46,8 +53,9 @@ #include #include #ifndef XMLTOOLING_NO_XMLSEC - #include - #include +# include +# include +# include #endif using namespace soap11; @@ -57,23 +65,42 @@ 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_EXCEPTION_FACTORY(XMLSecurityException,xmltooling); -DECL_EXCEPTION_FACTORY(IOException,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; +#ifndef XMLTOOLING_NO_XMLSEC + 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 +#endif } XMLToolingConfig& XMLToolingConfig::getConfig() @@ -145,11 +172,13 @@ bool XMLToolingInternalConfig::log_config(const char* config) return true; } +#ifndef XMLTOOLING_LITE void XMLToolingConfig::setReplayCache(ReplayCache* replayCache) { delete m_replayCache; m_replayCache = replayCache; } +#endif void XMLToolingConfig::setTemplateEngine(TemplateEngine* templateEngine) { @@ -157,6 +186,12 @@ void XMLToolingConfig::setTemplateEngine(TemplateEngine* templateEngine) m_templateEngine = templateEngine; } +void XMLToolingConfig::setURLEncoder(URLEncoder* urlEncoder) +{ + delete m_urlEncoder; + m_urlEncoder = urlEncoder; +} + bool XMLToolingInternalConfig::init() { #ifdef _DEBUG @@ -166,7 +201,15 @@ bool XMLToolingInternalConfig::init() try { log.debug("library initialization started"); - xercesc::XMLPlatformUtils::Initialize(); +#ifndef XMLTOOLING_NO_XMLSEC + 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); +#endif + + XMLPlatformUtils::Initialize(); log.debug("Xerces initialization complete"); #ifndef XMLTOOLING_NO_XMLSEC @@ -177,7 +220,7 @@ bool XMLToolingInternalConfig::init() m_parserPool=new ParserPool(); m_validatingPool=new ParserPool(true,true); - m_lock=xercesc::XMLPlatformUtils::makeMutex(); + m_lock=XMLPlatformUtils::makeMutex(); // Load catalogs from path. if (!catalog_path.empty()) { @@ -201,59 +244,94 @@ bool XMLToolingInternalConfig::init() registerKeyInfoClasses(); registerEncryptionClasses(); registerSOAPClasses(); - - 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); - REGISTER_EXCEPTION_FACTORY(XMLSecurityException,xmltooling); - REGISTER_EXCEPTION_FACTORY(IOException,xmltooling); + + 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); - registerKeyResolvers(); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(XMLSecurityException,xmltooling); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(SignatureException,xmlsignature); + REGISTER_XMLTOOLING_EXCEPTION_FACTORY(EncryptionException,xmlencryption); + registerKeyInfoResolvers(); registerCredentialResolvers(); registerTrustEngines(); -#endif + registerXMLAlgorithms(); + registerSOAPTransports(); + initSOAPTransports(); registerStorageServices(); + m_keyInfoResolver = KeyInfoResolverManager.newPlugin(INLINE_KEYINFO_RESOLVER,NULL); +#endif + m_urlEncoder = new URLEncoder(); + // 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"); +#ifndef XMLTOOLING_NO_XMLSEC + curl_global_cleanup(); +#endif return false; } +#ifndef XMLTOOLING_NO_XMLSEC + // Set up OpenSSL locking. + for (int i=0; i()); + g_openssl_locks.clear(); +#endif + SchemaValidators.destroyValidators(); XMLObjectBuilder::destroyBuilders(); XMLToolingException::deregisterFactories(); AttributeExtensibleXMLObject::deregisterIDAttributes(); - StorageServiceManager.deregisterFactories(); #ifndef XMLTOOLING_NO_XMLSEC + StorageServiceManager.deregisterFactories(); + termSOAPTransports(); + SOAPTransportManager.deregisterFactories(); TrustEngineManager.deregisterFactories(); CredentialResolverManager.deregisterFactories(); - KeyResolverManager.deregisterFactories(); -#endif + KeyInfoResolverManager.deregisterFactories(); + m_algorithmMap.clear(); + + delete m_keyInfoResolver; + m_keyInfoResolver = NULL; delete m_replayCache; m_replayCache = NULL; - +#endif + 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) FARPROC fn=GetProcAddress(static_cast(*i),"xmltooling_extension_term"); @@ -282,11 +360,14 @@ void XMLToolingInternalConfig::term() XSECPlatformUtils::Terminate(); #endif - xercesc::XMLPlatformUtils::closeMutex(m_lock); + XMLPlatformUtils::closeMutex(m_lock); m_lock=NULL; - xercesc::XMLPlatformUtils::Terminate(); + XMLPlatformUtils::Terminate(); - #ifdef _DEBUG +#ifndef XMLTOOLING_NO_XMLSEC + curl_global_cleanup(); +#endif +#ifdef _DEBUG xmltooling::NDC ndc("term"); #endif Category::getInstance(XMLTOOLING_LOGCAT".XMLToolingConfig").info("library shutdown complete"); @@ -400,4 +481,37 @@ XSECCryptoX509CRL* XMLToolingInternalConfig::X509CRL() const { return new OpenSSLCryptoX509CRL(); } + +void XMLToolingInternalConfig::registerXMLAlgorithms() +{ + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIRSA_MD5, "RSA", 0); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIRSA_SHA1, "RSA", 0); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIRSA_SHA224, "RSA", 0); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIRSA_SHA256, "RSA", 0); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIRSA_SHA384, "RSA", 0); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIRSA_SHA512, "RSA", 0); + + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIRSA_1_5, "RSA", 0); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIRSA_OAEP_MGFP1, "RSA", 0); + + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIDSA_SHA1, "DSA", 0); + + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIHMAC_SHA1, "HMAC", 0); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIHMAC_SHA224, "HMAC", 0); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIHMAC_SHA256, "HMAC", 0); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIHMAC_SHA384, "HMAC", 0); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIHMAC_SHA512, "HMAC", 0); + + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURI3DES_CBC, "DESede", 192); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIKW_3DES, "DESede", 192); + + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIAES128_CBC, "AES", 128); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIKW_AES128, "AES", 128); + + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIAES192_CBC, "AES", 192); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIKW_AES192, "AES", 192); + + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIAES256_CBC, "AES", 256); + registerXMLAlgorithm(DSIGConstants::s_unicodeStrURIKW_AES256, "AES", 256); +} #endif