/*
* 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.
* You may obtain a copy of the License at
/**
* mod_apache.cpp
- *
+ *
* Apache module implementation
*/
// Short-circuit entirely?
if (((shib_dir_config*)ap_get_module_config(r->per_dir_config, &mod_shib))->bOff==1)
return DECLINED;
-
+
ap_log_rerror(APLOG_MARK,APLOG_DEBUG|APLOG_NOERRNO,SH_AP_R(r), "shib_check_user(%d): ENTER", (int)getpid());
ostringstream threadid;
Lockable* lock() { return m_mapper->lock(); }
void unlock() { m_staKey->setData(NULL); m_propsKey->setData(NULL); m_mapper->unlock(); }
Settings getSettings(const HTTPRequest& request) const;
-
+
const PropertySet* getParent() const { return NULL; }
void setParent(const PropertySet*) {}
pair<bool,bool> getBool(const char* name, const char* ns=NULL) const;
int m=sta->m_req->method_number;
bool method_restricted=false;
const char *t, *w;
-
+
const array_header* reqs_arr=ap_requires(sta->m_req);
if (!reqs_arr)
return shib_acl_indeterminate; // should never happen
request.log(SPRequest::SPDebug,string("htaccess plugin using groups file: ") + sta->m_dc->szAuthGrpFile);
grpstatus=groups_for_user(sta->m_req,remote_user.c_str(),sta->m_dc->szAuthGrpFile);
}
-
+
bool negate=false;
while (*t) {
w=ap_getword_conf(sta->m_req->pool,&t);
auto_ptr<xercesc::RegularExpression> temp(new xercesc::RegularExpression(trans.get()));
re=temp;
}
-
+
for (; !status && attrs.first!=attrs.second; ++attrs.first) {
if (checkAttribute(request, attrs.first->second, w, regexp ? re.get() : NULL)) {
status = true;
}
#endif
-/*
+/*
* shire_child_init()
* Things to do when the child process is initialized.
* (or after the configs are read in apache-2)
g_Config->AccessControlManager.registerFactory(HT_ACCESS_CONTROL,&htAccessFactory);
g_Config->RequestMapperManager.registerFactory(NATIVE_REQUEST_MAPPER,&ApacheRequestMapFactory);
- if (!g_szSHIBConfig)
- g_szSHIBConfig=getenv("SHIBSP_CONFIG");
- if (!g_szSHIBConfig)
- g_szSHIBConfig=SHIBSP_CONFIG;
-
try {
- xercesc::DOMDocument* dummydoc=XMLToolingConfig::getConfig().getParser().newDocument();
- XercesJanitor<xercesc::DOMDocument> docjanitor(dummydoc);
- xercesc::DOMElement* dummy = dummydoc->createElementNS(NULL,path);
- auto_ptr_XMLCh src(g_szSHIBConfig);
- dummy->setAttributeNS(NULL,path,src.get());
- dummy->setAttributeNS(NULL,validate,xmlconstants::XML_ONE);
-
- g_Config->setServiceProvider(g_Config->ServiceProviderManager.newPlugin(XML_SERVICE_PROVIDER,dummy));
- g_Config->getServiceProvider()->init();
+ if (!g_Config->instantiate(g_szSHIBConfig, true))
+ throw exception("unknown error");
}
catch (exception& ex) {
ap_log_error(APLOG_MARK,APLOG_CRIT|APLOG_NOERRNO,SH_AP_R(s),ex.what());
{"ShibURLScheme", (config_fn_t)shib_set_server_string_slot,
(void *) XtOffsetOf (shib_server_config, szScheme),
RSRC_CONF, TAKE1, "URL scheme to force into generated URLs for a vhost"},
-
+
{"ShibRequestSetting", (config_fn_t)shib_table_set, NULL,
OR_AUTHCFG, TAKE2, "Set arbitrary Shibboleth request property for content"},
/*\r
* Copyright 2001-2007 Internet2\r
- * \r
+ *\r
* Licensed under the Apache License, Version 2.0 (the "License");\r
* you may not use this file except in compliance with the License.\r
* You may obtain a copy of the License at\r
const char* getRequestBody() const {\r
throw runtime_error("getRequestBody not implemented by FastCGI authorizer.");\r
}\r
- \r
+\r
long sendResponse(istream& in, long status) {\r
string hdr = string("Connection: close\r\n");\r
for (multimap<string,string>::const_iterator i=m_response_headers.begin(); i!=m_response_headers.end(); ++i)\r
return SHIB_RETURN_DONE;\r
}\r
\r
- long returnDecline() { \r
+ long returnDecline() {\r
return SHIB_RETURN_KO;\r
}\r
\r
exit(1);\r
}\r
\r
- const char* config=getenv("SHIBSP_CONFIG");\r
- if (!config)\r
- config=SHIBSP_CONFIG;\r
-\r
try {\r
- DOMDocument* dummydoc=XMLToolingConfig::getConfig().getParser().newDocument();\r
- XercesJanitor<DOMDocument> docjanitor(dummydoc);\r
- DOMElement* dummy = dummydoc->createElementNS(NULL,path);\r
- auto_ptr_XMLCh src(config);\r
- dummy->setAttributeNS(NULL,path,src.get());\r
- dummy->setAttributeNS(NULL,validate,xmlconstants::XML_ONE);\r
-\r
- g_Config->setServiceProvider(g_Config->ServiceProviderManager.newPlugin(XML_SERVICE_PROVIDER,dummy));\r
- g_Config->getServiceProvider()->init();\r
+ if (!g_Config->instantiate(NULL, true))\r
+ throw exception("unknown error");\r
}\r
catch (exception& ex) {\r
g_Config->term();\r
\r
FCGX_Init();\r
FCGX_InitRequest(&request, 0, 0);\r
- \r
+\r
cout << "Shibboleth initialization complete. Starting request loop." << endl;\r
while (FCGX_Accept_r(&request) == 0)\r
{\r
try {\r
xmltooling::NDC ndc("FastCGI shibauthorizer");\r
ShibTargetFCGIAuth sta(&request, g_ServerScheme.c_str(), g_ServerName.c_str(), g_ServerPort);\r
- \r
+\r
pair<bool,long> res = sta.getServiceProvider().doAuthentication(sta);\r
if (res.first) {\r
#ifdef _DEBUG\r
case SHIB_RETURN_OK:\r
print_ok(sta.m_request_headers);\r
continue;\r
- \r
+\r
case SHIB_RETURN_KO:\r
print_ok(sta.m_request_headers);\r
continue;\r
\r
case SHIB_RETURN_DONE:\r
continue;\r
- \r
+\r
default:\r
cerr << "shib: doAuthentication returned an unexpected result: " << res.second << endl;\r
print_error("<html><body>FastCGI Shibboleth authorizer returned an unexpected result.</body></html>");\r
continue;\r
}\r
}\r
- \r
+\r
res = sta.getServiceProvider().doExport(sta);\r
if (res.first) {\r
#ifdef _DEBUG\r
case SHIB_RETURN_OK:\r
print_ok(sta.m_request_headers);\r
continue;\r
- \r
+\r
case SHIB_RETURN_KO:\r
print_ok(sta.m_request_headers);\r
continue;\r
\r
case SHIB_RETURN_DONE:\r
continue;\r
- \r
+\r
default:\r
cerr << "shib: doExport returned an unexpected result: " << res.second << endl;\r
print_error("<html><body>FastCGI Shibboleth authorizer returned an unexpected result.</body></html>");\r
case SHIB_RETURN_OK:\r
print_ok(sta.m_request_headers);\r
continue;\r
- \r
+\r
case SHIB_RETURN_KO:\r
print_ok(sta.m_request_headers);\r
continue;\r
\r
case SHIB_RETURN_DONE:\r
continue;\r
- \r
+\r
default:\r
cerr << "shib: doAuthorization returned an unexpected result: " << res.second << endl;\r
print_error("<html><body>FastCGI Shibboleth authorizer returned an unexpected result.</body></html>");\r
}\r
\r
print_ok(sta.m_request_headers);\r
- \r
+\r
}\r
catch (exception& e) {\r
cerr << "shib: FastCGI authorizer caught an exception: " << e.what() << endl;\r
\r
if (g_Config)\r
g_Config->term();\r
- \r
+\r
return 0;\r
}\r
/*\r
* Copyright 2001-2007 Internet2\r
- * \r
+ *\r
* Licensed under the Apache License, Version 2.0 (the "License");\r
* you may not use this file except in compliance with the License.\r
* You may obtain a copy of the License at\r
virtual void clearHeader(const char* rawname, const char* cginame) {\r
throw runtime_error("clearHeader not implemented by FastCGI responder.");\r
}\r
- \r
+\r
virtual void setHeader(const char* name, const char* value) {\r
throw runtime_error("setHeader not implemented by FastCGI responder.");\r
}\r
exit(1);\r
}\r
\r
- const char* config=getenv("SHIBSP_CONFIG");\r
- if (!config)\r
- config=SHIBSP_CONFIG;\r
-\r
try {\r
- DOMDocument* dummydoc=XMLToolingConfig::getConfig().getParser().newDocument();\r
- XercesJanitor<DOMDocument> docjanitor(dummydoc);\r
- DOMElement* dummy = dummydoc->createElementNS(NULL,path);\r
- auto_ptr_XMLCh src(config);\r
- dummy->setAttributeNS(NULL,path,src.get());\r
- dummy->setAttributeNS(NULL,validate,xmlconstants::XML_ONE);\r
-\r
- g_Config->setServiceProvider(g_Config->ServiceProviderManager.newPlugin(XML_SERVICE_PROVIDER,dummy));\r
- g_Config->getServiceProvider()->init();\r
+ if (!g_Config->instantiate(NULL, true))\r
+ throw exception("unknown error");\r
}\r
catch (exception& ex) {\r
g_Config->term();\r
\r
FCGX_Init();\r
FCGX_InitRequest(&request, 0, 0);\r
- \r
+\r
cout << "Shibboleth initialization complete. Starting request loop." << endl;\r
while (FCGX_Accept_r(&request) == 0) {\r
// Note that the default bufsize (0) will cause the use of iostream\r
try {\r
xmltooling::NDC ndc("FastCGI shibresponder");\r
ShibTargetFCGI stf(&request, content, g_ServerScheme.c_str(), g_ServerName.c_str(), g_ServerPort);\r
- \r
+\r
pair<bool,long> res = stf.getServiceProvider().doHandler(stf);\r
if (res.first) {\r
#ifdef _DEBUG\r
case SHIB_RETURN_OK:\r
print_ok();\r
break;\r
- \r
+\r
case SHIB_RETURN_KO:\r
cerr << "shib: doHandler failed to handle the request" << endl;\r
print_error("<html><body>FastCGI Shibboleth responder should only be used for Shibboleth protocol requests.</body></html>");\r
case SHIB_RETURN_DONE:\r
// response already handled\r
break;\r
- \r
+\r
default:\r
cerr << "shib: doHandler returned an unexpected result: " << res.second << endl;\r
print_error("<html><body>FastCGI Shibboleth responder returned an unexpected result.</body></html>");\r
else {\r
cerr << "shib: doHandler failed to handle request." << endl;\r
print_error("<html><body>FastCGI Shibboleth responder failed to process request.</body></html>");\r
- } \r
- \r
+ }\r
+\r
}\r
catch (exception& e) {\r
cerr << "shib: FastCGI responder caught an exception: " << e.what() << endl;\r
\r
if (g_Config)\r
g_Config->term();\r
- \r
+\r
return 0;\r
}\r
return FALSE;
}
- LPCSTR config=getenv("SHIBSP_CONFIG");
- if (!config)
- config=SHIBSP_CONFIG;
-
try {
- DOMDocument* dummydoc=XMLToolingConfig::getConfig().getParser().newDocument();
- XercesJanitor<DOMDocument> docjanitor(dummydoc);
- DOMElement* dummy = dummydoc->createElementNS(NULL,path);
- auto_ptr_XMLCh src(config);
- dummy->setAttributeNS(NULL,path,src.get());
- dummy->setAttributeNS(NULL,validate,xmlconstants::XML_ONE);
-
- g_Config->setServiceProvider(g_Config->ServiceProviderManager.newPlugin(XML_SERVICE_PROVIDER,dummy));
- g_Config->getServiceProvider()->init();
+ if (!g_Config->instantiate(NULL, true))
+ throw exception("unknown error");
}
catch (exception& ex) {
g_Config->term();
/*
* 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.
* You may obtain a copy of the License at
/**
* nsapi_shib.cpp
- *
+ *
* Shibboleth NSAPI filter
*/
g_Config->RequestMapperManager.registerFactory(XML_REQUEST_MAPPER,&SunRequestMapFactory);
- const char* config=pblock_findval("shib-config",pb);
- if (!config)
- config=getenv("SHIBSP_CONFIG");
- if (!config)
- config=SHIBSP_CONFIG;
-
try {
- xercesc::DOMDocument* dummydoc=XMLToolingConfig::getConfig().getParser().newDocument();
- XercesJanitor<xercesc::DOMDocument> docjanitor(dummydoc);
- xercesc::DOMElement* dummy = dummydoc->createElementNS(NULL,path);
- auto_ptr_XMLCh src(config);
- dummy->setAttributeNS(NULL,path,src.get());
- dummy->setAttributeNS(NULL,validate,xmlconstants::XML_ONE);
-
- g_Config->setServiceProvider(g_Config->ServiceProviderManager.newPlugin(XML_SERVICE_PROVIDER,dummy));
- g_Config->getServiceProvider()->init();
+ if (!g_Config->instantiate(pblock_findval("shib-config",pb), true))
+ throw exception("unknown error");
}
catch (exception& ex) {
pblock_nvinsert("error",ex.what(),pb);
if (level>=SPError)
log_error(LOG_FAILURE, "nsapi_shib", m_sn, m_rq, const_cast<char*>(msg.c_str()));
}
- const char* getQueryString() const {
+ const char* getQueryString() const {
return pblock_findval("query", m_rq->reqpb);
}
const char* getRequestBody() const {
Lockable* lock() { return m_mapper->lock(); }
void unlock() { m_stKey->setData(NULL); m_propsKey->setData(NULL); m_mapper->unlock(); }
Settings getSettings(const HTTPRequest& request) const;
-
+
const PropertySet* getParent() const { return NULL; }
void setParent(const PropertySet*) {}
pair<bool,bool> getBool(const char* name, const char* ns=NULL) const;
/*\r
* Copyright 2001-2007 Internet2\r
- * \r
+ *\r
* Licensed under the Apache License, Version 2.0 (the "License");\r
* you may not use this file except in compliance with the License.\r
* You may obtain a copy of the License at\r
fprintf(stderr, "configuration is invalid, see console for specific problems\n");\r
return -1;\r
}\r
- \r
- if (!shar_config)\r
- shar_config=getenv("SHIBSP_CONFIG");\r
- if (!shar_config)\r
- shar_config=SHIBSP_CONFIG;\r
-\r
- try {\r
- static const XMLCh path[] = UNICODE_LITERAL_4(p,a,t,h);\r
- static const XMLCh validate[] = UNICODE_LITERAL_8(v,a,l,i,d,a,t,e);\r
- xercesc::DOMDocument* dummydoc=XMLToolingConfig::getConfig().getParser().newDocument();\r
- XercesJanitor<xercesc::DOMDocument> docjanitor(dummydoc);\r
- xercesc::DOMElement* dummy = dummydoc->createElementNS(NULL,path);\r
- auto_ptr_XMLCh src(shar_config);\r
- dummy->setAttributeNS(NULL,path,src.get());\r
- dummy->setAttributeNS(NULL,validate,xmlconstants::XML_ONE);\r
- \r
- conf.setServiceProvider(conf.ServiceProviderManager.newPlugin(XML_SERVICE_PROVIDER,dummy));\r
- conf.getServiceProvider()->init();\r
- }\r
- catch (exception& ex) {\r
- fprintf(stderr, "caught exception while loading configuration: %s\n", ex.what());\r
+\r
+ if (!conf.instantiate(shar_config)) {\r
+ fprintf(stderr, "configuration is invalid, check console for specific problems\n");\r
conf.term();\r
return -2;\r
}\r
return -1;\r
}\r
\r
- if (!shar_config)\r
- shar_config=getenv("SHIBSP_CONFIG");\r
- if (!shar_config)\r
- shar_config=SHIBSP_CONFIG;\r
- \r
- try {\r
- static const XMLCh path[] = UNICODE_LITERAL_4(p,a,t,h);\r
- static const XMLCh validate[] = UNICODE_LITERAL_8(v,a,l,i,d,a,t,e);\r
- xercesc::DOMDocument* dummydoc=XMLToolingConfig::getConfig().getParser().newDocument();\r
- XercesJanitor<xercesc::DOMDocument> docjanitor(dummydoc);\r
- xercesc::DOMElement* dummy = dummydoc->createElementNS(NULL,path);\r
- auto_ptr_XMLCh src(shar_config);\r
- dummy->setAttributeNS(NULL,path,src.get());\r
- dummy->setAttributeNS(NULL,validate,xmlconstants::XML_ONE);\r
-\r
- conf.setServiceProvider(conf.ServiceProviderManager.newPlugin(XML_SERVICE_PROVIDER,dummy));\r
- conf.getServiceProvider()->init();\r
- }\r
- catch (exception& ex) {\r
- fprintf(stderr, "caught exception while loading configuration: %s\n", ex.what());\r
+ if (!conf.instantiate(shar_config)) {\r
+ fprintf(stderr, "configuration is invalid, check console for specific problems\n");\r
conf.term();\r
return -2;\r
}\r
perror(pidfile); // keep running though\r
}\r
}\r
- \r
+\r
// Run the listener\r
if (!conf.getServiceProvider()->getListenerService()->run(&shibd_shutdown)) {\r
fprintf(stderr, "listener failed to enter listen loop\n");\r
/*
* 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.
* You may obtain a copy of the License at
/**
* SPConfig.cpp
- *
- * Library configuration
+ *
+ * Library configuration
*/
#include "internal.h"
#endif
#include <ctime>
+#include <xercesc/util/XMLUniDefs.hpp>
#include <xmltooling/util/NDC.h>
#include <xmltooling/util/PathResolver.h>
#include <xmltooling/util/TemplateEngine.h>
+#include <xmltooling/util/XMLHelper.h>
using namespace shibsp;
using namespace opensaml;
using namespace xmltooling;
+using namespace std;
DECL_XMLTOOLING_EXCEPTION_FACTORY(AttributeException,shibsp);
DECL_XMLTOOLING_EXCEPTION_FACTORY(AttributeExtractionException,shibsp);
inst_prefix2.push_back((*inst_prefix=='\\') ? ('/') : (*inst_prefix));
++inst_prefix;
}
-
+
const char* loglevel=getenv("SHIBSP_LOGGING");
if (!loglevel)
loglevel = SHIBSP_LOGGING;
log.fatal("failed to initialize XMLTooling library");
return false;
}
-#endif
+#endif
XMLToolingConfig::getConfig().getPathResolver()->setDefaultPackageName(PACKAGE_NAME);
XMLToolingConfig::getConfig().getPathResolver()->setDefaultPrefix(inst_prefix2.c_str());
XMLToolingConfig::getConfig().setTemplateEngine(new TemplateEngine());
XMLToolingConfig::getConfig().getTemplateEngine()->setTagPrefix("shibmlp");
-
+
REGISTER_XMLTOOLING_EXCEPTION_FACTORY(AttributeException,shibsp);
REGISTER_XMLTOOLING_EXCEPTION_FACTORY(AttributeExtractionException,shibsp);
REGISTER_XMLTOOLING_EXCEPTION_FACTORY(AttributeFilteringException,shibsp);
#endif
log.info("%s library shutdown complete", PACKAGE_STRING);
}
+
+bool SPConfig::instantiate(const char* config, bool rethrow)
+{
+#ifdef _DEBUG
+ NDC ndc("instantiate");
+#endif
+ if (!config)
+ config = getenv("SHIBSP_CONFIG");
+ if (!config)
+ config = SHIBSP_CONFIG;
+ try {
+ xercesc::DOMDocument* dummydoc;
+ if (*config == '"' || *config == '\'') {
+ throw ConfigurationException("The value of SHIBSP_CONFIG started with a quote.");
+ }
+ else if (*config != '<') {
+
+ // Mock up some XML.
+ string resolved(config);
+ stringstream snippet;
+ snippet
+ << "<Dummy path='"
+ << XMLToolingConfig::getConfig().getPathResolver()->resolve(resolved, PathResolver::XMLTOOLING_CFG_FILE)
+ << "' validate='1'/>";
+ dummydoc = XMLToolingConfig::getConfig().getParser().parse(snippet);
+ XercesJanitor<xercesc::DOMDocument> docjanitor(dummydoc);
+ setServiceProvider(ServiceProviderManager.newPlugin(XML_SERVICE_PROVIDER, dummydoc->getDocumentElement()));
+ }
+ else {
+ stringstream snippet(config);
+ dummydoc = XMLToolingConfig::getConfig().getParser().parse(snippet);
+ XercesJanitor<xercesc::DOMDocument> docjanitor(dummydoc);
+ static const XMLCh _type[] = UNICODE_LITERAL_4(t,y,p,e);
+ auto_ptr_char type(dummydoc->getDocumentElement()->getAttributeNS(NULL,_type));
+ if (type.get() && *type.get())
+ setServiceProvider(ServiceProviderManager.newPlugin(type.get(), dummydoc->getDocumentElement()));
+ else
+ throw ConfigurationException("The supplied XML bootstrapping configuration did not include a type attribute.");
+ }
+
+ getServiceProvider()->init();
+ return true;
+ }
+ catch (exception& ex) {
+ if (rethrow)
+ throw;
+ Category::getInstance(SHIBSP_LOGCAT".Config").fatal("caught exception while loading configuration: %s", ex.what());
+ }
+ return false;
+}
/*
* 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.
* You may obtain a copy of the License at
/**
* @file shibsp/SPConfig.h
- *
- * Library configuration
+ *
+ * Library configuration
*/
#ifndef __shibsp_config_h__
/**
* Returns the global configuration object for the library.
- *
+ *
* @return reference to the global library configuration object
*/
static SPConfig& getConfig();
Logging = 512,
Handlers = 1024
};
-
+
/**
* Set a bitmask of subsystems to activate.
- *
+ *
* @param enabled bitmask of component constants
*/
void setFeatures(unsigned long enabled) {
/**
* Test whether a subsystem is enabled.
- *
+ *
* @param feature subsystem/component to test
* @return true iff feature is enabled
*/
bool isEnabled(components_t feature) {
return (m_features & feature)>0;
}
-
+
/**
* Initializes library
- *
+ *
* Each process using the library MUST call this function exactly once
* before using any library classes.
- *
+ *
* @param catalog_path delimited set of schema catalog files to load
* @param inst_prefix installation prefix for software
- * @return true iff initialization was successful
+ * @return true iff initialization was successful
*/
virtual bool init(const char* catalog_path=NULL, const char* inst_prefix=NULL);
-
+
/**
* Shuts down library
- *
+ *
* Each process using the library SHOULD call this function exactly once
* before terminating itself.
*/
virtual void term();
-
+
/**
* Sets the global ServiceProvider instance.
* This method must be externally synchronized with any code that uses the object.
* Any previously set object is destroyed.
- *
+ *
* @param serviceProvider new ServiceProvider instance to store
*/
void setServiceProvider(ServiceProvider* serviceProvider);
-
+
/**
* Returns the global ServiceProvider instance.
- *
+ *
* @return global ServiceProvider or NULL
*/
ServiceProvider* getServiceProvider() const {
return m_serviceProvider;
}
+ /**
+ * Instantiates and installs a ServiceProvider instance based on an XML configuration string
+ * or a configuration pathname.
+ *
+ * @param config a snippet of XML to parse (it <strong>MUST</strong> contain a type attribute) or a pathname
+ * @param rethrow true iff caught exceptions should be rethrown instead of just returning the status
+ * @return true iff instantiation was successful
+ */
+ virtual bool instantiate(const char* config=NULL, bool rethrow=false);
+
#ifndef SHIBSP_LITE
/**
* Sets the global ArtifactResolver instance.
*
* <p>This method must be externally synchronized with any code that uses the object.
* Any previously set object is destroyed.
- *
+ *
* @param artifactResolver new ArtifactResolver instance to store
*/
void setArtifactResolver(opensaml::MessageDecoder::ArtifactResolver* artifactResolver) {
delete m_artifactResolver;
m_artifactResolver = artifactResolver;
}
-
+
/**
* Returns the global ArtifactResolver instance.
- *
+ *
* @return global ArtifactResolver or NULL
*/
opensaml::MessageDecoder::ArtifactResolver* getArtifactResolver() const {
/** Separator for serialized values of multi-valued attributes. */
char attribute_value_delimeter;
-
+
/**
* Manages factories for AccessControl plugins.
*/