X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=saml%2Fbinding%2Fimpl%2FClientCertAuthRule.cpp;fp=saml%2Fbinding%2Fimpl%2FClientCertAuthRule.cpp;h=6337b19b336398db98ffcc2cea6407c54556dcda;hb=3e40c0e62375c069e7860a87ca4f65fb2003f018;hp=f13e25ec1027a0af34e0e2e47046b00f8afa7d31;hpb=25875b97ccfa1615adb94645b504bdfc94e980d9;p=shibboleth%2Fcpp-opensaml.git diff --git a/saml/binding/impl/ClientCertAuthRule.cpp b/saml/binding/impl/ClientCertAuthRule.cpp index f13e25e..6337b19 100644 --- a/saml/binding/impl/ClientCertAuthRule.cpp +++ b/saml/binding/impl/ClientCertAuthRule.cpp @@ -27,7 +27,6 @@ #include "saml2/metadata/MetadataProvider.h" #include -#include #include #include @@ -44,95 +43,37 @@ namespace opensaml { } }; -pair ClientCertAuthRule::evaluate( - const XMLObject& message, - const GenericRequest* request, - const MetadataProvider* metadataProvider, - const QName* role, - const TrustEngine* trustEngine - ) const +void ClientCertAuthRule::evaluate(const XMLObject& message, const GenericRequest* request, SecurityPolicy& policy) const { Category& log=Category::getInstance(SAML_LOGCAT".SecurityPolicyRule.ClientCertAuth"); log.debug("evaluating client certificate authentication policy"); - pair ret = pair(NULL,NULL); if (!request) { log.debug("ignoring message, no protocol request available"); - return ret; - } - + return; + } + else if (!policy.getIssuerMetadata()) { + log.debug("ignoring message, no issuer metadata supplied"); + return; + } + const X509TrustEngine* x509trust; - if (!metadataProvider || !role || !(x509trust=dynamic_cast(trustEngine))) { - log.debug("ignoring message, no metadata or X509TrustEngine supplied"); - return ret; + if (!(x509trust=dynamic_cast(policy.getTrustEngine()))) { + log.debug("ignoring message, no X509TrustEngine supplied"); + return; } const std::vector& chain = request->getClientCertificates(); if (chain.empty()) { log.debug("ignoring message, no client certificates in request"); - return ret; + return; } - try { - log.debug("extracting issuer from message"); - pair issuerInfo = getIssuerAndProtocol(message); - - auto_ptr issuer(issuerInfo.first); - if (!issuerInfo.first || !issuerInfo.second || - (issuer->getFormat() && !XMLString::equals(issuer->getFormat(), saml2::NameIDType::ENTITY))) { - log.warn("issuer identity not estabished, or was not an entityID"); - return ret; - } - - log.debug("searching metadata for message issuer..."); - const EntityDescriptor* entity = metadataProvider->getEntityDescriptor(issuer->getName()); - if (!entity) { - auto_ptr_char temp(issuer->getName()); - log.warn("no metadata found, can't establish identity of issuer (%s)", temp.get()); - return ret; - } - - log.debug("matched message issuer against metadata, searching for applicable role..."); - const RoleDescriptor* roledesc=entity->getRoleDescriptor(*role, issuerInfo.second); - if (!roledesc) { - log.warn("unable to find compatible role (%s) in metadata", role->toString().c_str()); - return ret; - } - - if (!x509trust->validate(chain.front(), chain, *roledesc, true, metadataProvider->getKeyResolver())) { - log.error("unable to verify certificate chain with supplied trust engine"); - return ret; - } - - if (log.isDebugEnabled()) { - auto_ptr_char iname(entity->getEntityID()); - log.debug("message from (%s), signature verified", iname.get()); - } - - ret.first = issuer.release(); - ret.second = roledesc; + if (!x509trust->validate(chain.front(), chain, *(policy.getIssuerMetadata()), true, + policy.getMetadataProvider()->getKeyResolver())) { + log.error("unable to verify certificate chain with supplied trust engine"); + return; } - catch (bad_cast&) { - // Just trap it. - log.warn("caught a bad_cast while extracting issuer"); - } - return ret; -} - -pair ClientCertAuthRule::getIssuerAndProtocol(const XMLObject& message) const -{ - // We just let any bad casts throw here. - - // Shortcuts some of the casting. - const XMLCh* ns = message.getElementQName().getNamespaceURI(); - if (ns) { - if (XMLString::equals(ns, samlconstants::SAML20P_NS)) { - // 2.0 namespace should be castable to a specialized 2.0 root. - const saml2::RootObject& root = dynamic_cast(message); - saml2::Issuer* issuer = root.getIssuer(); - if (issuer && issuer->getName()) - return make_pair(issuer->cloneIssuer(), samlconstants::SAML20P_NS); - } - } - return pair(NULL,NULL); + + log.debug("client certificate verified against message issuer"); }