* Library configuration
*/
-#define XMLTOOLING_DECLARE_VALIDATORS
-
#include "internal.h"
#include "exceptions.h"
#include "XMLToolingConfig.h"
+#include "encryption/Encryption.h"
#include "impl/UnknownElement.h"
-#include "signature/KeyInfo.h"
-#include "signature/Signature.h"
+#include "security/TrustEngine.h"
+#include "security/OpenSSLCryptoX509CRL.h"
+#include "signature/CredentialResolver.h"
+#include "soap/SOAP.h"
#include "util/NDC.h"
+#include "util/ReplayCache.h"
+#include "util/StorageService.h"
+#include "util/TemplateEngine.h"
#include "util/XMLConstants.h"
-#include "validation/Validator.h"
+#include "validation/ValidatorSuite.h"
#ifdef HAVE_DLFCN_H
# include <dlfcn.h>
#endif
+#include <stdexcept>
#include <log4cpp/Category.hh>
#include <log4cpp/PropertyConfigurator.hh>
#include <log4cpp/OstreamAppender.hh>
#include <xercesc/util/PlatformUtils.hpp>
#ifndef XMLTOOLING_NO_XMLSEC
#include <xsec/framework/XSECProvider.hpp>
+ #include <openssl/err.h>
#endif
-#include <stdexcept>
-
+using namespace soap11;
+using namespace xmlencryption;
using namespace xmlsignature;
using namespace xmltooling;
using namespace log4cpp;
using namespace std;
-#define REGISTER_ELEMENT(namespaceURI,cname) \
- q=QName(namespaceURI,cname::LOCAL_NAME); \
- XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
- Validator::registerValidator(q,new cname##SchemaValidator())
-
-#define REGISTER_TYPE(namespaceURI,cname) \
- q=QName(namespaceURI,cname::TYPE_NAME); \
- XMLObjectBuilder::registerBuilder(q,new cname##Builder()); \
- Validator::registerValidator(q,new cname##SchemaValidator())
+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_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);
+#ifndef XMLTOOLING_NO_XMLSEC
+ DECL_EXCEPTION_FACTORY(SignatureException,xmlsignature);
+#endif
namespace xmltooling {
XMLToolingInternalConfig g_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;
+}
+
bool XMLToolingInternalConfig::init()
{
#ifdef _DEBUG
#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;
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,KeyInfo);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,KeyName);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,KeyValue);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,MgmtData);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,DSAKeyValue);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,RSAKeyValue);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Exponent);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Modulus);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,P);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Q);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,G);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Y);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,J);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Seed);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,PgenCounter);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,XPath);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Transform);
- REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,Transforms);
- REGISTER_TYPE(XMLConstants::XMLSIG_NS,KeyInfo);
- REGISTER_TYPE(XMLConstants::XMLSIG_NS,KeyValue);
- REGISTER_TYPE(XMLConstants::XMLSIG_NS,DSAKeyValue);
- REGISTER_TYPE(XMLConstants::XMLSIG_NS,RSAKeyValue);
- REGISTER_TYPE(XMLConstants::XMLSIG_NS,Transform);
- REGISTER_TYPE(XMLConstants::XMLSIG_NS,Transforms);
+ 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 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");
void XMLToolingInternalConfig::term()
{
+ SchemaValidators.destroyValidators();
XMLObjectBuilder::destroyBuilders();
+ XMLToolingException::deregisterFactories();
+ AttributeExtensibleXMLObject::deregisterIDAttributes();
+
+#ifndef XMLTOOLING_NO_XMLSEC
+ TrustEngineManager.deregisterFactories();
+ CredentialResolverManager.deregisterFactories();
+ KeyResolverManager.deregisterFactories();
+#endif
+
+ delete m_replayCache;
+ m_replayCache = NULL;
+
+ delete m_templateEngine;
+ m_templateEngine = NULL;
for (vector<void*>::reverse_iterator i=m_libhandles.rbegin(); i!=m_libhandles.rend(); i++) {
#if defined(WIN32)
delete m_parserPool;
m_parserPool=NULL;
+ delete m_validatingPool;
+ m_validatingPool=NULL;
#ifndef XMLTOOLING_NO_XMLSEC
delete m_xsecProvider;
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()
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