*/
#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 <boost/scoped_ptr.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <xercesc/util/XMLUniDefs.hpp>
#include <saml/Assertion.h>
{
ChainingContext(
const Application& application,
+ const GenericRequest* request,
const EntityDescriptor* issuer,
const XMLCh* protocol,
const NameID* nameid,
const XMLCh* authncontext_decl,
const vector<const opensaml::Assertion*>* tokens,
const vector<shibsp::Attribute*>* 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() {
vector<opensaml::Assertion*> m_ownedAssertions;
const Application& m_app;
+ const GenericRequest* m_request;
const EntityDescriptor* m_issuer;
const XMLCh* m_protocol;
const NameID* m_nameid;
const vector<const opensaml::Assertion*>* tokens=nullptr,
const vector<shibsp::Attribute*>* 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<const opensaml::Assertion*>* tokens=nullptr,
+ const vector<shibsp::Attribute*>* 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 {
{
}
+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<const opensaml::Assertion*>* tokens,
+ const vector<shibsp::Attribute*>* 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<const opensaml::Assertion*>* tokens,
+ const vector<shibsp::Attribute*>* attributes
+ ) const
+{
+ // Default for deprecated method.
+ throw ConfigurationException("Deprecated method implementation should always be overridden.");
+}
+
+
ChainingAttributeResolver::ChainingAttributeResolver(const DOMElement* e)
{
SPConfig& conf = SPConfig::getConfig();
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<AttributeResolver> np(conf.AttributeResolverManager.newPlugin(t.c_str(), 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()
);
}
{
ChainingContext& chain = dynamic_cast<ChainingContext&>(ctx);
for (ptr_vector<AttributeResolver>::iterator i = m_resolvers.begin(); i != m_resolvers.end(); ++i) {
- Locker locker(&(*i));
- scoped_ptr<ResolutionContext> 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<ResolutionContext> 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()
+ );
+ }
}
}