X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=shibsp%2Fattribute%2Fresolver%2Fimpl%2FChainingAttributeResolver.cpp;h=d4227f9a977a6d6c6cc56ffad121084c4a5f5e62;hb=c51bfd77603cf0ddb0b5e374c35586a8435895d6;hp=7fd38c45913bde6f1ee21261538672b666baa510;hpb=c29a676cae4df1aba87f7b4019ce29dc0cab623c;p=shibboleth%2Fcpp-sp.git diff --git a/shibsp/attribute/resolver/impl/ChainingAttributeResolver.cpp b/shibsp/attribute/resolver/impl/ChainingAttributeResolver.cpp index 7fd38c4..d4227f9 100644 --- a/shibsp/attribute/resolver/impl/ChainingAttributeResolver.cpp +++ b/shibsp/attribute/resolver/impl/ChainingAttributeResolver.cpp @@ -25,13 +25,13 @@ */ #include "internal.h" +#include "exceptions.h" #include "Application.h" #include "ServiceProvider.h" #include "attribute/Attribute.h" #include "attribute/resolver/AttributeResolver.h" #include "attribute/resolver/ResolutionContext.h" -#include #include #include #include @@ -50,6 +50,7 @@ namespace shibsp { { ChainingContext( const Application& application, + const GenericRequest* request, const EntityDescriptor* issuer, const XMLCh* protocol, const NameID* nameid, @@ -57,14 +58,17 @@ namespace shibsp { const XMLCh* authncontext_decl, const vector* tokens, const vector* attributes - ) : m_app(application), m_issuer(issuer), m_protocol(protocol), m_nameid(nameid), m_authclass(authncontext_class), m_authdecl(authncontext_decl), m_session(nullptr) { + ) : m_app(application), m_request(request), m_issuer(issuer), m_protocol(protocol), m_nameid(nameid), + m_authclass(authncontext_class), m_authdecl(authncontext_decl), m_session(nullptr) { if (tokens) m_tokens.assign(tokens->begin(), tokens->end()); if (attributes) m_attributes.assign(attributes->begin(), attributes->end()); } - ChainingContext(const Application& application, const Session& session) : m_app(application), m_session(&session) { + ChainingContext(const Application& application, const Session& session) + : m_app(application), m_request(nullptr), m_issuer(nullptr), m_protocol(nullptr), m_nameid(nullptr), + m_authclass(nullptr), m_authdecl(nullptr), m_session(&session) { } ~ChainingContext() { @@ -83,6 +87,7 @@ namespace shibsp { vector m_ownedAssertions; const Application& m_app; + const GenericRequest* m_request; const EntityDescriptor* m_issuer; const XMLCh* m_protocol; const NameID* m_nameid; @@ -116,7 +121,22 @@ namespace shibsp { const vector* tokens=nullptr, const vector* attributes=nullptr ) const { - return new ChainingContext(application, issuer, protocol, nameid, authncontext_class, authncontext_decl, tokens, attributes); + // Make sure new method gets run. + return createResolutionContext(application, nullptr, issuer, protocol, nameid, authncontext_class, authncontext_decl, tokens, attributes); + } + + ResolutionContext* createResolutionContext( + const Application& application, + const GenericRequest* request, + const EntityDescriptor* issuer, + const XMLCh* protocol, + const NameID* nameid=nullptr, + const XMLCh* authncontext_class=nullptr, + const XMLCh* authncontext_decl=nullptr, + const vector* tokens=nullptr, + const vector* attributes=nullptr + ) const { + return new ChainingContext(application, request, issuer, protocol, nameid, authncontext_class, authncontext_decl, tokens, attributes); } ResolutionContext* createResolutionContext(const Application& application, const Session& session) const { @@ -171,6 +191,38 @@ AttributeResolver::~AttributeResolver() { } +ResolutionContext* AttributeResolver::createResolutionContext( + const Application& application, + const GenericRequest* request, + const EntityDescriptor* issuer, + const XMLCh* protocol, + const NameID* nameid, + const XMLCh* authncontext_class, + const XMLCh* authncontext_decl, + const vector* tokens, + const vector* attributes + ) const +{ + // Default call into deprecated method. + return createResolutionContext(application, issuer, protocol, nameid, authncontext_class, authncontext_decl, tokens, attributes); +} + +ResolutionContext* AttributeResolver::createResolutionContext( + const Application& application, + const EntityDescriptor* issuer, + const XMLCh* protocol, + const NameID* nameid, + const XMLCh* authncontext_class, + const XMLCh* authncontext_decl, + const vector* tokens, + const vector* attributes + ) const +{ + // Default for deprecated method. + throw ConfigurationException("Deprecated method implementation should always be overridden."); +} + + ChainingAttributeResolver::ChainingAttributeResolver(const DOMElement* e) { SPConfig& conf = SPConfig::getConfig(); @@ -181,7 +233,7 @@ ChainingAttributeResolver::ChainingAttributeResolver(const DOMElement* e) string t(XMLHelper::getAttrString(e, nullptr, _type)); if (!t.empty()) { try { - Category::getInstance(SHIBSP_LOGCAT".AttributeResolver.Chaining").info( + Category::getInstance(SHIBSP_LOGCAT ".AttributeResolver."CHAINING_ATTRIBUTE_RESOLVER).info( "building AttributeResolver of type (%s)...", t.c_str() ); auto_ptr np(conf.AttributeResolverManager.newPlugin(t.c_str(), e)); @@ -189,7 +241,7 @@ ChainingAttributeResolver::ChainingAttributeResolver(const DOMElement* e) np.release(); } catch (exception& ex) { - Category::getInstance(SHIBSP_LOGCAT".AttributeResolver.Chaining").error( + Category::getInstance(SHIBSP_LOGCAT ".AttributeResolver."CHAINING_ATTRIBUTE_RESOLVER).error( "caught exception processing embedded AttributeResolver element: %s", ex.what() ); } @@ -202,23 +254,30 @@ void ChainingAttributeResolver::resolveAttributes(ResolutionContext& ctx) const { ChainingContext& chain = dynamic_cast(ctx); for (ptr_vector::iterator i = m_resolvers.begin(); i != m_resolvers.end(); ++i) { - Locker locker(&(*i)); - scoped_ptr context( - chain.m_session ? - i->createResolutionContext(chain.m_app, *chain.m_session) : - i->createResolutionContext( - chain.m_app, chain.m_issuer, chain.m_protocol, chain.m_nameid, chain.m_authclass, chain.m_authdecl, &chain.m_tokens, &chain.m_attributes - ) - ); - - i->resolveAttributes(*context); - - chain.m_attributes.insert(chain.m_attributes.end(), context->getResolvedAttributes().begin(), context->getResolvedAttributes().end()); - chain.m_ownedAttributes.insert(chain.m_ownedAttributes.end(), context->getResolvedAttributes().begin(), context->getResolvedAttributes().end()); - context->getResolvedAttributes().clear(); - - chain.m_tokens.insert(chain.m_tokens.end(), context->getResolvedAssertions().begin(), context->getResolvedAssertions().end()); - chain.m_ownedAssertions.insert(chain.m_ownedAssertions.end(), context->getResolvedAssertions().begin(), context->getResolvedAssertions().end()); - context->getResolvedAssertions().clear(); + try { + Locker locker(&(*i)); + scoped_ptr context( + chain.m_session ? + i->createResolutionContext(chain.m_app, *chain.m_session) : + i->createResolutionContext( + chain.m_app, chain.m_request, chain.m_issuer, chain.m_protocol, chain.m_nameid, chain.m_authclass, chain.m_authdecl, &chain.m_tokens, &chain.m_attributes + ) + ); + + i->resolveAttributes(*context); + + chain.m_attributes.insert(chain.m_attributes.end(), context->getResolvedAttributes().begin(), context->getResolvedAttributes().end()); + chain.m_ownedAttributes.insert(chain.m_ownedAttributes.end(), context->getResolvedAttributes().begin(), context->getResolvedAttributes().end()); + context->getResolvedAttributes().clear(); + + chain.m_tokens.insert(chain.m_tokens.end(), context->getResolvedAssertions().begin(), context->getResolvedAssertions().end()); + chain.m_ownedAssertions.insert(chain.m_ownedAssertions.end(), context->getResolvedAssertions().begin(), context->getResolvedAssertions().end()); + context->getResolvedAssertions().clear(); + } + catch (exception& ex) { + Category::getInstance(SHIBSP_LOGCAT ".AttributeResolver."CHAINING_ATTRIBUTE_RESOLVER).error( + "caught exception applying AttributeResolver in chain: %s", ex.what() + ); + } } }