/*
- * Copyright 2001-2006 Internet2
+ * Copyright 2001-2007 Internet2
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*/
#include "internal.h"
+
+#if defined(XMLTOOLING_LOG4SHIB)
+# ifndef OPENSAML_LOG4SHIB
+# error "Logging library mismatch (XMLTooling is using log4shib)."
+# endif
+#elif defined(XMLTOOLING_LOG4CPP)
+# ifndef OPENSAML_LOG4CPP
+# error "Logging library mismatch (XMLTooling is using log4cpp)."
+# endif
+#else
+# error "No supported logging library."
+#endif
+
#include "exceptions.h"
#include "SAMLConfig.h"
#include "binding/ArtifactMap.h"
#include "binding/MessageEncoder.h"
#include "binding/SAMLArtifact.h"
#include "binding/SecurityPolicyRule.h"
-#include "binding/URLEncoder.h"
#include "saml1/core/Assertions.h"
#include "saml1/core/Protocols.h"
#include "saml2/core/Protocols.h"
#include "saml2/metadata/Metadata.h"
+#include "saml2/metadata/MetadataFilter.h"
#include "saml2/metadata/MetadataProvider.h"
#include "util/SAMLConstants.h"
+#include <xmltooling/logging.h>
#include <xmltooling/XMLToolingConfig.h>
#include <xmltooling/signature/Signature.h>
#include <xmltooling/util/NDC.h>
+#include <xmltooling/util/PathResolver.h>
-#include <log4cpp/Category.hh>
#include <xsec/enc/XSECCryptoException.hpp>
#include <xsec/enc/XSECCryptoProvider.hpp>
#include <xsec/utils/XSECPlatformUtils.hpp>
-#include <openssl/err.h>
using namespace opensaml;
using namespace xmlsignature;
+using namespace xmltooling::logging;
using namespace xmltooling;
-using namespace log4cpp;
using namespace std;
// Expose entry points when used as an extension library
SAMLConfig::getConfig().term(false);
}
-DECL_EXCEPTION_FACTORY(ArtifactException,opensaml);
-DECL_EXCEPTION_FACTORY(MetadataFilterException,opensaml::saml2md);
-DECL_EXCEPTION_FACTORY(BindingException,opensaml);
+DECL_XMLTOOLING_EXCEPTION_FACTORY(ArtifactException,opensaml);
+DECL_XMLTOOLING_EXCEPTION_FACTORY(SecurityPolicyException,opensaml);
+DECL_XMLTOOLING_EXCEPTION_FACTORY(MetadataException,opensaml::saml2md);
+DECL_XMLTOOLING_EXCEPTION_FACTORY(MetadataFilterException,opensaml::saml2md);
+DECL_XMLTOOLING_EXCEPTION_FACTORY(BindingException,opensaml);
+DECL_XMLTOOLING_EXCEPTION_FACTORY(ProfileException,opensaml);
+DECL_XMLTOOLING_EXCEPTION_FACTORY(FatalProfileException,opensaml);
+DECL_XMLTOOLING_EXCEPTION_FACTORY(RetryableProfileException,opensaml);
namespace opensaml {
SAMLInternalConfig g_config;
m_artifactMap = artifactMap;
}
-void SAMLConfig::setURLEncoder(URLEncoder* urlEncoder)
-{
- delete m_urlEncoder;
- m_urlEncoder = urlEncoder;
-}
-
bool SAMLInternalConfig::init(bool initXMLTooling)
{
#ifdef _DEBUG
Category& log=Category::getInstance(SAML_LOGCAT".SAMLConfig");
log.debug("library initialization started");
- if (initXMLTooling) {
+ if (initXMLTooling)
XMLToolingConfig::getConfig().init();
- log.debug("XMLTooling library initialized");
- }
+ XMLToolingConfig::getConfig().getPathResolver()->setDefaultPackageName("opensaml");
- REGISTER_EXCEPTION_FACTORY(ArtifactException,opensaml);
- REGISTER_EXCEPTION_FACTORY(MetadataFilterException,opensaml::saml2md);
- REGISTER_EXCEPTION_FACTORY(BindingException,opensaml);
+ REGISTER_XMLTOOLING_EXCEPTION_FACTORY(ArtifactException,opensaml);
+ REGISTER_XMLTOOLING_EXCEPTION_FACTORY(SecurityPolicyException,opensaml);
+ REGISTER_XMLTOOLING_EXCEPTION_FACTORY(MetadataException,opensaml::saml2md);
+ REGISTER_XMLTOOLING_EXCEPTION_FACTORY(MetadataFilterException,opensaml::saml2md);
+ REGISTER_XMLTOOLING_EXCEPTION_FACTORY(BindingException,opensaml);
+ REGISTER_XMLTOOLING_EXCEPTION_FACTORY(ProfileException,opensaml);
+ REGISTER_XMLTOOLING_EXCEPTION_FACTORY(FatalProfileException,opensaml);
+ REGISTER_XMLTOOLING_EXCEPTION_FACTORY(RetryableProfileException,opensaml);
saml1::registerAssertionClasses();
saml1p::registerProtocolClasses();
registerMessageEncoders();
registerMessageDecoders();
registerSecurityPolicyRules();
-
- m_urlEncoder = new URLEncoder();
- log.info("library initialization complete");
+ log.info("%s library initialization complete", PACKAGE_STRING);
return true;
}
delete m_artifactMap;
m_artifactMap = NULL;
- delete m_urlEncoder;
- m_urlEncoder = NULL;
- if (termXMLTooling) {
+ if (termXMLTooling)
XMLToolingConfig::getConfig().term();
- log.debug("XMLTooling library shut down");
- }
- log.info("library shutdown complete");
+
+ log.info("%s library shutdown complete", PACKAGE_STRING);
}
void SAMLInternalConfig::generateRandomBytes(void* buf, unsigned int len)
throw XMLSecurityException("Unable to generate SHA-1 hash.");
}
-void opensaml::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);
- }
-}
-
+using namespace saml2p;
using namespace saml2md;
-void opensaml::annotateException(XMLToolingException* e, const EntityDescriptor* entity, bool rethrow)
+void opensaml::annotateException(XMLToolingException* e, const EntityDescriptor* entity, const Status* status, bool rethrow)
{
+ const RoleDescriptor* role = NULL;
if (entity) {
- auto_ptr_char id(entity->getEntityID());
- e->addProperty("entityID",id.get());
const list<XMLObject*>& roles=entity->getOrderedChildren();
- for (list<XMLObject*>::const_iterator child=roles.begin(); child!=roles.end(); ++child) {
- const RoleDescriptor* role=dynamic_cast<RoleDescriptor*>(*child);
- if (role && role->isValid()) {
- const vector<ContactPerson*>& contacts=role->getContactPersons();
- for (vector<ContactPerson*>::const_iterator c=contacts.begin(); c!=contacts.end(); ++c) {
- const XMLCh* ctype=(*c)->getContactType();
- if (ctype && (XMLString::equals(ctype,ContactPerson::CONTACT_SUPPORT)
- || XMLString::equals(ctype,ContactPerson::CONTACT_TECHNICAL))) {
- GivenName* fname=(*c)->getGivenName();
- SurName* lname=(*c)->getSurName();
- auto_ptr_char first(fname ? fname->getName() : NULL);
- auto_ptr_char last(lname ? lname->getName() : NULL);
- if (first.get() && last.get()) {
- string contact=string(first.get()) + ' ' + last.get();
- e->addProperty("contactName",contact.c_str());
- }
- else if (first.get())
- e->addProperty("contactName",first.get());
- else if (last.get())
- e->addProperty("contactName",last.get());
- const vector<EmailAddress*>& emails=const_cast<const ContactPerson*>(*c)->getEmailAddresss();
- if (!emails.empty()) {
- auto_ptr_char email(emails.front()->getAddress());
- if (email.get())
- e->addProperty("contactEmail",email.get());
- }
- break;
- }
- }
- if (e->getProperty("contactName") || e->getProperty("contactEmail")) {
- auto_ptr_char eurl(role->getErrorURL());
- if (eurl.get()) {
- e->addProperty("errorURL",eurl.get());
- }
- }
- break;
- }
+ for (list<XMLObject*>::const_iterator child=roles.begin(); !role && child!=roles.end(); ++child) {
+ role=dynamic_cast<RoleDescriptor*>(*child);
+ if (role && !role->isValid())
+ role = NULL;
}
}
-
- if (rethrow)
- e->raise();
+ annotateException(e, role, status, rethrow);
}
-void opensaml::annotateException(XMLToolingException* e, const RoleDescriptor* role, bool rethrow)
+void opensaml::annotateException(XMLToolingException* e, const RoleDescriptor* role, const Status* status, bool rethrow)
{
if (role) {
auto_ptr_char id(dynamic_cast<EntityDescriptor*>(role->getParent())->getEntityID());
}
}
+ if (status) {
+ auto_ptr_char sc(status->getStatusCode() ? status->getStatusCode()->getValue() : NULL);
+ if (sc.get() && *sc.get())
+ e->addProperty("statusCode", sc.get());
+ if (status->getStatusCode()->getStatusCode()) {
+ auto_ptr_char sc2(status->getStatusCode()->getStatusCode()->getValue());
+ if (sc2.get() && *sc.get())
+ e->addProperty("statusCode2", sc2.get());
+ }
+ if (status->getStatusMessage()) {
+ auto_ptr_char msg(status->getStatusMessage()->getMessage());
+ if (msg.get() && *msg.get())
+ e->addProperty("statusMessage", msg.get());
+ }
+ }
+
if (rethrow)
e->raise();
}