Extend KeyResolver to include certificate resolution, add inline resolver.
[shibboleth/cpp-xmltooling.git] / xmltooling / XMLToolingConfig.cpp
index c3af1da..ae102b9 100644 (file)
  * 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/CredentialResolver.h"
+#include "signature/KeyResolver.h"
 #include "signature/Signature.h"
 #include "util/NDC.h"
 #include "util/XMLConstants.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 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);
 
 #ifndef XMLTOOLING_NO_XMLSEC
@@ -166,56 +157,15 @@ bool XMLToolingInternalConfig::init()
 #endif
 
         m_parserPool=new ParserPool();
+        m_validatingPool=new ParserPool(true,true);
         m_lock=xercesc::XMLPlatformUtils::makeMutex();
 
         // 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_ELEMENT(XMLConstants::XMLSIG_NS,RetrievalMethod);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509IssuerSerial);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509IssuerName);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509SerialNumber);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509SKI);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509SubjectName);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509Certificate);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509CRL);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,X509Data);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,SPKISexp);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,SPKIData);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,PGPKeyID);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,PGPKeyPacket);
-        REGISTER_ELEMENT(XMLConstants::XMLSIG_NS,PGPData);
-        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);
-        REGISTER_TYPE(XMLConstants::XMLSIG_NS,RetrievalMethod);
-        REGISTER_TYPE(XMLConstants::XMLSIG_NS,X509IssuerSerial);
-        REGISTER_TYPE(XMLConstants::XMLSIG_NS,X509Data);
-        REGISTER_TYPE(XMLConstants::XMLSIG_NS,SPKIData);
-        REGISTER_TYPE(XMLConstants::XMLSIG_NS,PGPData);
 
+        registerKeyInfoClasses();
+        registerEncryptionClasses();
+        
         REGISTER_EXCEPTION_FACTORY(XMLParserException,xmltooling);
         REGISTER_EXCEPTION_FACTORY(XMLObjectException,xmltooling);
         REGISTER_EXCEPTION_FACTORY(MarshallingException,xmltooling);
@@ -227,6 +177,8 @@ bool XMLToolingInternalConfig::init()
 #ifndef XMLTOOLING_NO_XMLSEC
         XMLObjectBuilder::registerBuilder(QName(XMLConstants::XMLSIG_NS,Signature::LOCAL_NAME),new SignatureBuilder());
         REGISTER_EXCEPTION_FACTORY(SignatureException,xmlsignature);
+        registerKeyResolvers();
+        registerCredentialResolvers();
 #endif
     }
     catch (const xercesc::XMLException&) {
@@ -241,9 +193,15 @@ bool XMLToolingInternalConfig::init()
 void XMLToolingInternalConfig::term()
 {
     XMLObjectBuilder::destroyBuilders();
-    Validator::destroyValidators();
+    KeyInfoSchemaValidators.destroyValidators();
+    EncryptionSchemaValidators.destroyValidators();
     XMLToolingException::deregisterFactories();
 
+#ifndef XMLTOOLING_NO_XMLSEC
+    CredentialResolverManager.deregisterFactories();
+    KeyResolverManager.deregisterFactories();
+#endif
+
     for (vector<void*>::reverse_iterator i=m_libhandles.rbegin(); i!=m_libhandles.rend(); i++) {
 #if defined(WIN32)
         FARPROC fn=GetProcAddress(static_cast<HMODULE>(*i),"xmltooling_extension_term");
@@ -263,6 +221,8 @@ void XMLToolingInternalConfig::term()
     
     delete m_parserPool;
     m_parserPool=NULL;
+    delete m_validatingPool;
+    m_validatingPool=NULL;
 
 #ifndef XMLTOOLING_NO_XMLSEC
     delete m_xsecProvider;
@@ -280,10 +240,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()
@@ -366,3 +326,21 @@ 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);
+    }
+}
+#endif