X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=xmltooling%2FXMLToolingConfig.cpp;h=f8e7f3b4f2f578df3e840de924f3284848ab6375;hb=8c28c26a2cb6adf1e2f56af534b5157a9ec605e0;hp=3cfbe7992e21f766293c2a4aaa1600e795414b93;hpb=3120264067f72471e391f87eba07d71b259296ac;p=shibboleth%2Fcpp-xmltooling.git diff --git a/xmltooling/XMLToolingConfig.cpp b/xmltooling/XMLToolingConfig.cpp index 3cfbe79..f8e7f3b 100644 --- a/xmltooling/XMLToolingConfig.cpp +++ b/xmltooling/XMLToolingConfig.cpp @@ -21,16 +21,16 @@ */ #include "internal.h" - -#define XMLTOOLING_DEFINE_CONSTANTS -#include - #include "exceptions.h" #include "XMLToolingConfig.h" +#include "encryption/Encryption.h" #include "impl/UnknownElement.h" -#include "signature/impl/KeyInfoImpl.h" -#include "signature/impl/XMLSecSignatureImpl.h" +#include "security/TrustEngine.h" +#include "security/OpenSSLCryptoX509CRL.h" +#include "signature/CredentialResolver.h" +#include "soap/SOAP.h" #include "util/NDC.h" +#include "util/StorageService.h" #include "util/XMLConstants.h" #include "validation/Validator.h" @@ -38,28 +38,37 @@ # include #endif +#include #include #include #include #include #ifndef XMLTOOLING_NO_XMLSEC #include + #include #endif -#include - -using namespace log4cpp; +using namespace soap11; +using namespace xmlencryption; +using namespace xmlsignature; using namespace xmltooling; +using namespace log4cpp; using namespace std; -DECL_EXCEPTION_FACTORY(XMLParserException); -DECL_EXCEPTION_FACTORY(XMLObjectException); -DECL_EXCEPTION_FACTORY(MarshallingException); -DECL_EXCEPTION_FACTORY(UnmarshallingException); -DECL_EXCEPTION_FACTORY(UnknownElementException); -DECL_EXCEPTION_FACTORY(UnknownAttributeException); -DECL_EXCEPTION_FACTORY(ValidationException); -DECL_EXCEPTION_FACTORY(SignatureException); +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); + +#ifndef XMLTOOLING_NO_XMLSEC + DECL_EXCEPTION_FACTORY(SignatureException,xmlsignature); +#endif namespace xmltooling { XMLToolingInternalConfig g_config; @@ -153,38 +162,54 @@ bool XMLToolingInternalConfig::init() #endif 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()); - - QName q(XMLConstants::XMLSIG_NS,KeyInfo::LOCAL_NAME); - XMLObjectBuilder::registerBuilder(q,new KeyInfoBuilderImpl()); - Validator::registerValidator(q,new KeyInfoSchemaValidator()); - q=QName(XMLConstants::XMLSIG_NS,KeyInfo::TYPE_NAME); - XMLObjectBuilder::registerBuilder(q,new KeyInfoBuilderImpl()); - Validator::registerValidator(q,new KeyInfoSchemaValidator()); - - q=QName(XMLConstants::XMLSIG_NS,KeyName::LOCAL_NAME); - XMLObjectBuilder::registerBuilder(q,new KeyNameBuilderImpl()); - Validator::registerValidator(q,new KeyNameSchemaValidator()); - - q=QName(XMLConstants::XMLSIG_NS,MgmtData::LOCAL_NAME); - XMLObjectBuilder::registerBuilder(q,new MgmtDataBuilderImpl()); - Validator::registerValidator(q,new MgmtDataSchemaValidator()); + 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); + #ifndef XMLTOOLING_NO_XMLSEC - XMLObjectBuilder::registerBuilder(QName(XMLConstants::XMLSIG_NS,Signature::LOCAL_NAME),new XMLSecSignatureBuilder()); + XMLObjectBuilder::registerBuilder(QName(XMLConstants::XMLSIG_NS,Signature::LOCAL_NAME),new SignatureBuilder()); + REGISTER_EXCEPTION_FACTORY(SignatureException,xmlsignature); + registerKeyResolvers(); + registerCredentialResolvers(); + registerTrustEngines(); #endif + registerStorageServices(); - REGISTER_EXCEPTION_FACTORY(XMLParserException); - REGISTER_EXCEPTION_FACTORY(XMLObjectException); - REGISTER_EXCEPTION_FACTORY(MarshallingException); - REGISTER_EXCEPTION_FACTORY(UnmarshallingException); - REGISTER_EXCEPTION_FACTORY(UnknownElementException); - REGISTER_EXCEPTION_FACTORY(UnknownAttributeException); - REGISTER_EXCEPTION_FACTORY(ValidationException); - REGISTER_EXCEPTION_FACTORY(SignatureException); + // 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"); @@ -198,6 +223,16 @@ bool XMLToolingInternalConfig::init() void XMLToolingInternalConfig::term() { XMLObjectBuilder::destroyBuilders(); + KeyInfoSchemaValidators.destroyValidators(); + EncryptionSchemaValidators.destroyValidators(); + XMLToolingException::deregisterFactories(); + AttributeExtensibleXMLObject::deregisterIDAttributes(); + +#ifndef XMLTOOLING_NO_XMLSEC + TrustEngineManager.deregisterFactories(); + CredentialResolverManager.deregisterFactories(); + KeyResolverManager.deregisterFactories(); +#endif for (vector::reverse_iterator i=m_libhandles.rbegin(); i!=m_libhandles.rend(); i++) { #if defined(WIN32) @@ -218,6 +253,8 @@ void XMLToolingInternalConfig::term() delete m_parserPool; m_parserPool=NULL; + delete m_validatingPool; + m_validatingPool=NULL; #ifndef XMLTOOLING_NO_XMLSEC delete m_xsecProvider; @@ -235,10 +272,10 @@ void XMLToolingInternalConfig::term() Category::getInstance(XMLTOOLING_LOGCAT".XMLToolingConfig").info("library shutdown complete"); } -ILockable& XMLToolingInternalConfig::lock() +Lockable* XMLToolingInternalConfig::lock() { xercesc::XMLPlatformUtils::lockMutex(m_lock); - return *this; + return this; } void XMLToolingInternalConfig::unlock() @@ -321,3 +358,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