/*
- * Copyright 2001-2009 Internet2
+ * Copyright 2001-2010 Internet2
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
)
{
// The properties we need can be set in the RequestMap, or the Errors element.
- bool mderror = dynamic_cast<const opensaml::saml2md::MetadataException*>(tp.getRichException())!=NULL;
+ bool mderror = dynamic_cast<const opensaml::saml2md::MetadataException*>(tp.getRichException())!=nullptr;
bool accesserror = (strcmp(page, "access")==0);
- pair<bool,const char*> redirectErrors = pair<bool,const char*>(false,NULL);
- pair<bool,const char*> pathname = pair<bool,const char*>(false,NULL);
+ pair<bool,const char*> redirectErrors = pair<bool,const char*>(false,nullptr);
+ pair<bool,const char*> pathname = pair<bool,const char*>(false,nullptr);
- // Strictly for error handling, detect a NULL application and point at the default.
+ // Strictly for error handling, detect a nullptr application and point at the default.
if (!app)
- app = request.getServiceProvider().getApplication("default");
+ app = request.getServiceProvider().getApplication(nullptr);
const PropertySet* props=app->getPropertySet("Errors");
void SHIBSP_DLLLOCAL clearHeaders(SPRequest& request) {
const Application& app = request.getApplication();
app.clearHeader(request, "Shib-Session-ID", "HTTP_SHIB_SESSION_ID");
+ app.clearHeader(request, "Shib-Session-Index", "HTTP_SHIB_SESSION_INDEX");
app.clearHeader(request, "Shib-Identity-Provider", "HTTP_SHIB_IDENTITY_PROVIDER");
app.clearHeader(request, "Shib-Authentication-Method", "HTTP_SHIB_AUTHENTICATION_METHOD");
app.clearHeader(request, "Shib-Authentication-Instant", "HTTP_SHIB_AUTHENTICATION_INSTANT");
ServiceProvider::ServiceProvider()
{
+ m_authTypes.insert("shibboleth");
}
ServiceProvider::~ServiceProvider()
{
}
+#ifndef SHIBSP_LITE
+SecurityPolicyProvider* ServiceProvider::getSecurityPolicyProvider(bool required) const
+{
+ if (required)
+ throw ConfigurationException("No SecurityPolicyProvider available.");
+ return nullptr;
+}
+#endif
+
+Remoted* ServiceProvider::regListener(const char* address, Remoted* listener)
+{
+ Remoted* ret=nullptr;
+ map<string,Remoted*>::const_iterator i=m_listenerMap.find(address);
+ if (i!=m_listenerMap.end())
+ ret=i->second;
+ m_listenerMap[address]=listener;
+ Category::getInstance(SHIBSP_LOGCAT".ServiceProvider").info("registered remoted message endpoint (%s)",address);
+ return ret;
+}
+
+bool ServiceProvider::unregListener(const char* address, Remoted* current, Remoted* restore)
+{
+ map<string,Remoted*>::const_iterator i=m_listenerMap.find(address);
+ if (i!=m_listenerMap.end() && i->second==current) {
+ if (restore)
+ m_listenerMap[address]=restore;
+ else
+ m_listenerMap.erase(address);
+ Category::getInstance(SHIBSP_LOGCAT".ServiceProvider").info("unregistered remoted message endpoint (%s)",address);
+ return true;
+ }
+ return false;
+}
+
+Remoted* ServiceProvider::lookupListener(const char *address) const
+{
+ map<string,Remoted*>::const_iterator i=m_listenerMap.find(address);
+ return (i==m_listenerMap.end()) ? nullptr : i->second;
+}
+
pair<bool,long> ServiceProvider::doAuthentication(SPRequest& request, bool handler) const
{
#ifdef _DEBUG
#endif
Category& log = Category::getInstance(SHIBSP_LOGCAT".ServiceProvider");
- const Application* app=NULL;
+ const Application* app=nullptr;
string targetURL = request.getRequestURL();
try {
pair<bool,bool> requireSession = settings.first->getBool("requireSession");
pair<bool,const char*> requireSessionWith = settings.first->getString("requireSessionWith");
- // If no session is required AND the AuthType (an Apache-derived concept) isn't shibboleth,
+ string lcAuthType;
+ if (authType.first) {
+ while (*authType.second)
+ lcAuthType += tolower(*authType.second++);
+ }
+
+ // If no session is required AND the AuthType (an Apache-derived concept) isn't recognized,
// then we ignore this request and consider it unprotected. Apache might lie to us if
// ShibBasicHijack is on, but that's up to it.
if ((!requireSession.first || !requireSession.second) && !requireSessionWith.first &&
-#ifdef HAVE_STRCASECMP
- (!authType.first || strcasecmp(authType.second,"shibboleth")))
-#else
- (!authType.first || _stricmp(authType.second,"shibboleth")))
-#endif
- return make_pair(true,request.returnDecline());
+ (!authType.first || m_authTypes.find(lcAuthType) == m_authTypes.end()))
+ return make_pair(true, request.returnDecline());
// Fix for secadv 20050901
clearHeaders(request);
- Session* session = NULL;
+ Session* session = nullptr;
try {
session = request.getSession();
}
catch (exception& e) {
log.warn("error during session lookup: %s", e.what());
// If it's not a retryable session failure, we throw to the outer handler for reporting.
- if (dynamic_cast<opensaml::RetryableProfileException*>(&e)==NULL)
+ if (dynamic_cast<opensaml::RetryableProfileException*>(&e)==nullptr)
throw;
}
return make_pair(true,request.returnOK());
// No session, but we require one. Initiate a new session using the indicated method.
- const SessionInitiator* initiator=NULL;
+ const SessionInitiator* initiator=nullptr;
if (requireSessionWith.first) {
initiator=app->getSessionInitiatorById(requireSessionWith.second);
if (!initiator) {
return initiator->run(request,false);
}
- request.setAuthType("shibboleth");
+ request.setAuthType(lcAuthType.c_str());
// We're done. Everything is okay. Nothing to report. Nothing to do..
// Let the caller decide how to proceed.
#endif
Category& log = Category::getInstance(SHIBSP_LOGCAT".ServiceProvider");
- const Application* app=NULL;
+ const Application* app=nullptr;
string targetURL = request.getRequestURL();
try {
pair<bool,bool> requireSession = settings.first->getBool("requireSession");
pair<bool,const char*> requireSessionWith = settings.first->getString("requireSessionWith");
- // If no session is required AND the AuthType (an Apache-derived concept) isn't shibboleth,
+ string lcAuthType;
+ if (authType.first) {
+ while (*authType.second)
+ lcAuthType += tolower(*authType.second++);
+ }
+
+ // If no session is required AND the AuthType (an Apache-derived concept) isn't recognized,
// then we ignore this request and consider it unprotected. Apache might lie to us if
// ShibBasicHijack is on, but that's up to it.
if ((!requireSession.first || !requireSession.second) && !requireSessionWith.first &&
-#ifdef HAVE_STRCASECMP
- (!authType.first || strcasecmp(authType.second,"shibboleth")))
-#else
- (!authType.first || _stricmp(authType.second,"shibboleth")))
-#endif
- return make_pair(true,request.returnDecline());
+ (!authType.first || m_authTypes.find(lcAuthType) == m_authTypes.end()))
+ return make_pair(true, request.returnDecline());
// Do we have an access control plugin?
if (settings.second) {
- const Session* session = NULL;
+ const Session* session = nullptr;
try {
session = request.getSession(false);
}
#endif
Category& log = Category::getInstance(SHIBSP_LOGCAT".ServiceProvider");
- const Application* app=NULL;
+ const Application* app=nullptr;
string targetURL = request.getRequestURL();
try {
RequestMapper::Settings settings = request.getRequestSettings();
app = &(request.getApplication());
- const Session* session = NULL;
+ const Session* session = nullptr;
try {
session = request.getSession(false);
}
hval = session->getAuthnContextDeclRef();
if (hval)
app->setHeader(request, "Shib-AuthnContext-Decl", hval);
+ hval = session->getSessionIndex();
+ if (hval)
+ app->setHeader(request, "Shib-Session-Index", hval);
// Maybe export the assertion keys.
pair<bool,bool> exp=settings.first->getBool("exportAssertion");
if (exp.first && exp.second) {
const PropertySet* sessions=app->getPropertySet("Sessions");
- pair<bool,const char*> exportLocation = sessions ? sessions->getString("exportLocation") : pair<bool,const char*>(false,NULL);
+ pair<bool,const char*> exportLocation = sessions ? sessions->getString("exportLocation") : pair<bool,const char*>(false,nullptr);
if (!exportLocation.first)
log.warn("can't export assertions without an exportLocation Sessions property");
else {
#endif
Category& log = Category::getInstance(SHIBSP_LOGCAT".ServiceProvider");
- const Application* app=NULL;
+ const Application* app=nullptr;
string targetURL = request.getRequestURL();
try {