Added a simple storage abstraction, and an in-memory sample.
[shibboleth/cpp-xmltooling.git] / xmltooling / XMLToolingConfig.cpp
index ae102b9..f8e7f3b 100644 (file)
 #include "XMLToolingConfig.h"
 #include "encryption/Encryption.h"
 #include "impl/UnknownElement.h"
+#include "security/TrustEngine.h"
+#include "security/OpenSSLCryptoX509CRL.h"
 #include "signature/CredentialResolver.h"
-#include "signature/KeyResolver.h"
-#include "signature/Signature.h"
+#include "soap/SOAP.h"
 #include "util/NDC.h"
+#include "util/StorageService.h"
 #include "util/XMLConstants.h"
 #include "validation/Validator.h"
 
@@ -46,6 +48,7 @@
     #include <openssl/err.h>
 #endif
 
+using namespace soap11;
 using namespace xmlencryption;
 using namespace xmlsignature;
 using namespace xmltooling;
@@ -60,6 +63,8 @@ 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);
@@ -159,12 +164,29 @@ bool XMLToolingInternalConfig::init()
         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());
 
         registerKeyInfoClasses();
         registerEncryptionClasses();
+        registerSOAPClasses();
         
         REGISTER_EXCEPTION_FACTORY(XMLParserException,xmltooling);
         REGISTER_EXCEPTION_FACTORY(XMLObjectException,xmltooling);
@@ -173,13 +195,21 @@ bool XMLToolingInternalConfig::init()
         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 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");
@@ -196,8 +226,10 @@ void XMLToolingInternalConfig::term()
     KeyInfoSchemaValidators.destroyValidators();
     EncryptionSchemaValidators.destroyValidators();
     XMLToolingException::deregisterFactories();
+    AttributeExtensibleXMLObject::deregisterIDAttributes();
 
 #ifndef XMLTOOLING_NO_XMLSEC
+    TrustEngineManager.deregisterFactories();
     CredentialResolverManager.deregisterFactories();
     KeyResolverManager.deregisterFactories();
 #endif
@@ -343,4 +375,9 @@ void xmltooling::log_openssl()
         code=ERR_get_error_line_data(&file,&line,&data,&flags);
     }
 }
+
+XSECCryptoX509CRL* XMLToolingInternalConfig::X509CRL() const
+{
+    return new OpenSSLCryptoX509CRL();
+}
 #endif