X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2FXMLToolingConfig.cpp;h=fedd859013be7d2fdf79c6eedd80b630660bc679;hb=af53450562fc3a6d09d8015ace694c0a586ff934;hp=5b245d27dfbae56fbb3570aad1ead701602d1504;hpb=e54ee4ff7f220a89a2883e4e097e9922ddff937d;p=shibboleth%2Fxmltooling.git diff --git a/xmltooling/XMLToolingConfig.cpp b/xmltooling/XMLToolingConfig.cpp index 5b245d2..fedd859 100644 --- a/xmltooling/XMLToolingConfig.cpp +++ b/xmltooling/XMLToolingConfig.cpp @@ -22,15 +22,22 @@ #include "internal.h" #include "exceptions.h" +#include "logging.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 "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/PathResolver.h" #include "util/ReplayCache.h" #include "util/StorageService.h" #include "util/TemplateEngine.h" @@ -43,21 +50,25 @@ #endif #include -#include -#include -#include -#include +#if defined(XMLTOOLING_LOG4SHIB) +# include +# include +#elif defined(XMLTOOLING_LOG4CPP) +# include +# include +#endif #include #ifndef XMLTOOLING_NO_XMLSEC - #include - #include +# include +# include +# include #endif using namespace soap11; using namespace xmlencryption; using namespace xmlsignature; +using namespace xmltooling::logging; using namespace xmltooling; -using namespace log4cpp; using namespace std; DECL_XMLTOOLING_EXCEPTION_FACTORY(XMLParserException,xmltooling); @@ -78,6 +89,7 @@ DECL_XMLTOOLING_EXCEPTION_FACTORY(IOException,xmltooling); namespace xmltooling { 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) @@ -88,12 +100,13 @@ namespace xmltooling { g_openssl_locks[n]->unlock(); } - #ifndef WIN32 +# ifndef WIN32 extern "C" unsigned long openssl_thread_id(void) { return (unsigned long)(pthread_self()); } - #endif +# endif +#endif } XMLToolingConfig& XMLToolingConfig::getConfig() @@ -165,11 +178,19 @@ 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::setPathResolver(PathResolver* pathResolver) +{ + delete m_pathResolver; + m_pathResolver = pathResolver; +} void XMLToolingConfig::setTemplateEngine(TemplateEngine* templateEngine) { @@ -192,24 +213,26 @@ bool XMLToolingInternalConfig::init() try { log.debug("library initialization started"); +#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 - xercesc::XMLPlatformUtils::Initialize(); - log.debug("Xerces initialization complete"); + XMLPlatformUtils::Initialize(); + log.debug("Xerces %s initialization complete", XERCES_FULLVERSIONDOT); #ifndef XMLTOOLING_NO_XMLSEC XSECPlatformUtils::Initialise(); m_xsecProvider=new XSECProvider(); - log.debug("XMLSec initialization complete"); + log.debug("XML-Security %s initialization complete", XSEC_FULLVERSIONDOT); #endif 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()) { @@ -234,8 +257,6 @@ bool XMLToolingInternalConfig::init() registerEncryptionClasses(); registerSOAPClasses(); - m_urlEncoder = new URLEncoder(); - REGISTER_XMLTOOLING_EXCEPTION_FACTORY(XMLParserException,xmltooling); REGISTER_XMLTOOLING_EXCEPTION_FACTORY(XMLObjectException,xmltooling); REGISTER_XMLTOOLING_EXCEPTION_FACTORY(MarshallingException,xmltooling); @@ -250,58 +271,76 @@ bool XMLToolingInternalConfig::init() REGISTER_XMLTOOLING_EXCEPTION_FACTORY(XMLSecurityException,xmltooling); REGISTER_XMLTOOLING_EXCEPTION_FACTORY(SignatureException,xmlsignature); REGISTER_XMLTOOLING_EXCEPTION_FACTORY(EncryptionException,xmlencryption); - registerKeyResolvers(); + registerKeyInfoResolvers(); registerCredentialResolvers(); registerTrustEngines(); -#endif + registerXMLAlgorithms(); registerSOAPTransports(); initSOAPTransports(); registerStorageServices(); + m_keyInfoResolver = KeyInfoResolverManager.newPlugin(INLINE_KEYINFO_RESOLVER,NULL); +#endif + m_pathResolver = new PathResolver(); + 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(); +#ifndef XMLTOOLING_NO_XMLSEC StorageServiceManager.deregisterFactories(); termSOAPTransports(); SOAPTransportManager.deregisterFactories(); -#ifndef XMLTOOLING_NO_XMLSEC 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_pathResolver; + m_pathResolver = NULL; delete m_templateEngine; m_templateEngine = NULL; @@ -337,16 +376,17 @@ void XMLToolingInternalConfig::term() XSECPlatformUtils::Terminate(); #endif - xercesc::XMLPlatformUtils::closeMutex(m_lock); + XMLPlatformUtils::closeMutex(m_lock); m_lock=NULL; - xercesc::XMLPlatformUtils::Terminate(); + XMLPlatformUtils::Terminate(); +#ifndef XMLTOOLING_NO_XMLSEC curl_global_cleanup(); - - #ifdef _DEBUG +#endif +#ifdef _DEBUG xmltooling::NDC ndc("term"); #endif - Category::getInstance(XMLTOOLING_LOGCAT".XMLToolingConfig").info("library shutdown complete"); + Category::getInstance(XMLTOOLING_LOGCAT".XMLToolingConfig").info("%s library shutdown complete", PACKAGE_STRING); } Lockable* XMLToolingInternalConfig::lock() @@ -370,30 +410,27 @@ bool XMLToolingInternalConfig::load_library(const char* path, void* context) Locker locker(this); + string resolved(path); + m_pathResolver->resolve(resolved, PathResolver::XMLTOOLING_LIB_FILE); + #if defined(WIN32) HMODULE handle=NULL; - char* fixed=const_cast(path); - if (strchr(fixed,'/')) { - fixed=strdup(path); - char* p=fixed; - while (p=strchr(p,'/')) - *p='\\'; - } - + for (string::iterator i = resolved.begin(); i != resolved.end(); ++i) + if (*i == '/') + *i = '\\'; + UINT em=SetErrorMode(SEM_FAILCRITICALERRORS); try { - handle=LoadLibraryEx(fixed,NULL,LOAD_WITH_ALTERED_SEARCH_PATH); + handle=LoadLibraryEx(resolved.c_str(),NULL,LOAD_WITH_ALTERED_SEARCH_PATH); if (!handle) - handle=LoadLibraryEx(fixed,NULL,0); + handle=LoadLibraryEx(resolved.c_str(),NULL,0); if (!handle) - throw runtime_error(string("unable to load extension library: ") + fixed); + throw runtime_error(string("unable to load extension library: ") + resolved); FARPROC fn=GetProcAddress(handle,"xmltooling_extension_init"); if (!fn) - throw runtime_error(string("unable to locate xmltooling_extension_init entry point: ") + fixed); + throw runtime_error(string("unable to locate xmltooling_extension_init entry point: ") + resolved); if (reinterpret_cast(fn)(context)!=0) - throw runtime_error(string("detected error in xmltooling_extension_init: ") + fixed); - if (fixed!=path) - free(fixed); + throw runtime_error(string("detected error in xmltooling_extension_init: ") + resolved); SetErrorMode(em); } catch(runtime_error& e) { @@ -401,26 +438,24 @@ bool XMLToolingInternalConfig::load_library(const char* path, void* context) if (handle) FreeLibrary(handle); SetErrorMode(em); - if (fixed!=path) - free(fixed); return false; } #elif defined(HAVE_DLFCN_H) - void* handle=dlopen(path,RTLD_LAZY); + void* handle=dlopen(resolved.c_str(),RTLD_LAZY); if (!handle) - throw runtime_error(string("unable to load extension library '") + path + "': " + dlerror()); + throw runtime_error(string("unable to load extension library '") + resolved + "': " + dlerror()); int (*fn)(void*)=(int (*)(void*))(dlsym(handle,"xmltooling_extension_init")); if (!fn) { dlclose(handle); throw runtime_error( - string("unable to locate xmltooling_extension_init entry point in '") + path + "': " + + string("unable to locate xmltooling_extension_init entry point in '") + resolved + "': " + (dlerror() ? dlerror() : "unknown error") ); } try { if (fn(context)!=0) - throw runtime_error(string("detected error in xmltooling_extension_init in ") + path); + throw runtime_error(string("detected error in xmltooling_extension_init in ") + resolved); } catch(runtime_error& e) { log.error(e.what()); @@ -432,7 +467,7 @@ bool XMLToolingInternalConfig::load_library(const char* path, void* context) # error "Don't know about dynamic loading on this platform!" #endif m_libhandles.push_back(handle); - log.info("loaded extension: %s", path); + log.info("loaded extension: %s", resolved.c_str()); return true; } @@ -446,9 +481,9 @@ void xmltooling::log_openssl() 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; + log.errorStream() << "error code: " << code << " in " << file << ", line " << line << logging::eol; if (data && (flags & ERR_TXT_STRING)) - log.errorStream() << "error data: " << data << CategoryStream::ENDLINE; + log.errorStream() << "error data: " << data << logging::eol; code=ERR_get_error_line_data(&file,&line,&data,&flags); } } @@ -457,4 +492,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