using namespace std;
namespace shibsp {
+
SHIBSP_DLLLOCAL PluginManager< Handler,string,pair<const DOMElement*,const char*> >::Factory SAML1ConsumerFactory;
SHIBSP_DLLLOCAL PluginManager< Handler,string,pair<const DOMElement*,const char*> >::Factory SAML2ConsumerFactory;
SHIBSP_DLLLOCAL PluginManager< Handler,string,pair<const DOMElement*,const char*> >::Factory SAML2ArtifactResolutionFactory;
- SHIBSP_DLLLOCAL PluginManager< Handler,string,pair<const DOMElement*,const char*> >::Factory ChainingLogoutInitiatorFactory;
- SHIBSP_DLLLOCAL PluginManager< Handler,string,pair<const DOMElement*,const char*> >::Factory LocalLogoutInitiatorFactory;
- SHIBSP_DLLLOCAL PluginManager< Handler,string,pair<const DOMElement*,const char*> >::Factory SAML2LogoutInitiatorFactory;
SHIBSP_DLLLOCAL PluginManager< Handler,string,pair<const DOMElement*,const char*> >::Factory SAML2LogoutFactory;
SHIBSP_DLLLOCAL PluginManager< Handler,string,pair<const DOMElement*,const char*> >::Factory SAML2NameIDMgmtFactory;
SHIBSP_DLLLOCAL PluginManager< Handler,string,pair<const DOMElement*,const char*> >::Factory AssertionLookupFactory;
SHIBSP_DLLLOCAL PluginManager< Handler,string,pair<const DOMElement*,const char*> >::Factory StatusHandlerFactory;
SHIBSP_DLLLOCAL PluginManager< Handler,string,pair<const DOMElement*,const char*> >::Factory SessionHandlerFactory;
+ void SHIBSP_DLLLOCAL absolutize(const HTTPRequest& request, string& url) {
+ if (url.empty())
+ url = '/';
+ if (url[0] == '/') {
+ // Compute a URL to the root of the site.
+ int port = request.getPort();
+ const char* scheme = request.getScheme();
+ string root = string(scheme) + "://" + request.getHostname();
+ if ((!strcmp(scheme,"http") && port!=80) || (!strcmp(scheme,"https") && port!=443)) {
+ ostringstream portstr;
+ portstr << port;
+ root += ":" + portstr.str();
+ }
+ url = root + url;
+ }
+ }
+
void SHIBSP_DLLLOCAL generateRandomHex(std::string& buf, unsigned int len) {
static char DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
int r;
buf += (DIGITS[0x0F & b2]);
}
}
+
+
};
void SHIBSP_API shibsp::registerHandlers()
conf.HandlerManager.registerFactory(STATUS_HANDLER, StatusHandlerFactory);
conf.HandlerManager.registerFactory(SESSION_HANDLER, SessionHandlerFactory);
- conf.LogoutInitiatorManager.registerFactory(CHAINING_LOGOUT_INITIATOR, ChainingLogoutInitiatorFactory);
- conf.LogoutInitiatorManager.registerFactory(LOCAL_LOGOUT_INITIATOR, LocalLogoutInitiatorFactory);
- conf.LogoutInitiatorManager.registerFactory(SAML2_LOGOUT_INITIATOR, SAML2LogoutInitiatorFactory);
conf.SingleLogoutServiceManager.registerFactory(SAML20_BINDING_SOAP, SAML2LogoutFactory);
conf.SingleLogoutServiceManager.registerFactory(SAML20_BINDING_HTTP_REDIRECT, SAML2LogoutFactory);
conf.SingleLogoutServiceManager.registerFactory(SAML20_BINDING_HTTP_POST, SAML2LogoutFactory);
{
}
+const XMLCh* Handler::getProtocolFamily() const
+{
+ return nullptr;
+}
+
void Handler::log(SPRequest::SPLogLevel level, const string& msg) const
{
Category::getInstance(SHIBSP_LOGCAT".Handler").log(
if (storage) {
string rsKey;
generateRandomHex(rsKey,5);
- if (!storage->createString("RelayState", rsKey.c_str(), relayState.c_str(), time(NULL) + 600))
+ if (!storage->createString("RelayState", rsKey.c_str(), relayState.c_str(), time(nullptr) + 600))
throw IOException("Attempted to insert duplicate storage key.");
relayState = string(mech.second-3) + ':' + rsKey;
}
StorageService* storage = conf.getServiceProvider()->getStorageService(ssid.c_str());
if (storage) {
ssid = key;
- if (storage->readString("RelayState",ssid.c_str(),&relayState)>0) {
+ if (storage->readString("RelayState",ssid.c_str(),&relayState) > 0) {
if (clear)
storage->deleteString("RelayState",ssid.c_str());
+ absolutize(request, relayState);
return;
}
else
}
else {
relayState = out.string();
+ absolutize(request, relayState);
return;
}
}
exp += "; expires=Mon, 01 Jan 2001 00:00:00 GMT";
response.setCookie(relay_cookie.first.c_str(), exp.c_str());
}
+ absolutize(request, relayState);
return;
}
}
if (relayState.empty() || relayState == "default" || relayState == "cookie") {
pair<bool,const char*> homeURL=application.getString("homeURL");
if (homeURL.first)
- relayState=homeURL.second;
- else {
- // Compute a URL to the root of the site.
- int port = request.getPort();
- const char* scheme = request.getScheme();
- relayState = string(scheme) + "://" + request.getHostname();
- if ((!strcmp(scheme,"http") && port!=80) || (!strcmp(scheme,"https") && port!=443)) {
- ostringstream portstr;
- portstr << port;
- relayState += ":" + portstr.str();
- }
- relayState += '/';
- }
+ relayState = homeURL.second;
+ else
+ relayState = '/';
}
+
+ absolutize(request, relayState);
}
AbstractHandler::AbstractHandler(
const DOMElement* e, Category& log, DOMNodeFilter* filter, const map<string,string>* remapper
) : m_log(log), m_configNS(shibspconstants::SHIB2SPCONFIG_NS) {
- load(e,NULL,filter,remapper);
+ load(e,nullptr,filter,remapper);
}
AbstractHandler::~AbstractHandler()
const saml2p::Status* status = r2->getStatus();
if (status) {
const saml2p::StatusCode* sc = status->getStatusCode();
- const XMLCh* code = sc ? sc->getValue() : NULL;
+ const XMLCh* code = sc ? sc->getValue() : nullptr;
if (code && !XMLString::equals(code,saml2p::StatusCode::SUCCESS)) {
FatalProfileException ex("SAML response contained an error.");
annotateException(&ex, role, status); // throws it
const saml1p::Status* status = r1->getStatus();
if (status) {
const saml1p::StatusCode* sc = status->getStatusCode();
- const xmltooling::QName* code = sc ? sc->getValue() : NULL;
+ const xmltooling::QName* code = sc ? sc->getValue() : nullptr;
if (code && *code != saml1p::StatusCode::SUCCESS) {
FatalProfileException ex("SAML response contained an error.");
ex.addProperty("statusCode", code->toString().c_str());
bool signIfPossible
) const
{
- const EntityDescriptor* entity = role ? dynamic_cast<const EntityDescriptor*>(role->getParent()) : NULL;
+ const EntityDescriptor* entity = role ? dynamic_cast<const EntityDescriptor*>(role->getParent()) : nullptr;
const PropertySet* relyingParty = application.getRelyingParty(entity);
pair<bool,const char*> flag = signIfPossible ? make_pair(true,(const char*)"true") : relyingParty->getString("signing");
if (role && flag.first &&
CredentialResolver* credResolver=application.getCredentialResolver();
if (credResolver) {
Locker credLocker(credResolver);
- const Credential* cred = NULL;
+ const Credential* cred = nullptr;
pair<bool,const char*> keyName = relyingParty->getString("keyName");
pair<bool,const XMLCh*> sigalg = relyingParty->getXMLString("signingAlg");
if (role) {
rsKey = SAMLArtifact::toHex(rsKey);
ostringstream out;
out << postData;
- if (!storage->createString("PostData", rsKey.c_str(), out.str().c_str(), time(NULL) + 600))
+ if (!storage->createString("PostData", rsKey.c_str(), out.str().c_str(), time(nullptr) + 600))
throw IOException("Attempted to insert duplicate storage key.");
postkey = string(mech.second-3) + ':' + rsKey;
}
plimit.second = 1024 * 1024;
if (plimit.second == 0 || request.getContentLength() <= plimit.second) {
CGIParser cgi(request);
- pair<CGIParser::walker,CGIParser::walker> params = cgi.getParameters(NULL);
+ pair<CGIParser::walker,CGIParser::walker> params = cgi.getParameters(nullptr);
if (params.first == params.second)
return DDF("parameters").list();
DDF child;
return getString(name);
}
- return pair<bool,const char*>(false,NULL);
+ return pair<bool,const char*>(false,nullptr);
}
pair<bool,unsigned int> AbstractHandler::getUnsignedInt(const char* name, const SPRequest& request, unsigned int type) const
if (type & HANDLER_PROPERTY_REQUEST) {
const char* param = request.getParameter(name);
if (param && *param)
- return pair<bool,unsigned int>(true, strtol(param,NULL,10));
+ return pair<bool,unsigned int>(true, strtol(param,nullptr,10));
}
if (type & HANDLER_PROPERTY_MAP) {