if (param)
return make_pair(true, request.sendRedirect(param));
- return sendLogoutPage(app, request, false, "Logout complete.");
+ return sendLogoutPage(app, request, request, false, "Logout complete.");
}
catch (exception& e) {
TemplateParameters tp(&e);
tp.m_map["requestURL"] = targetURL.substr(0,targetURL.find('?'));
+ tp.m_request = &request;
return make_pair(true,sendError(log, request, app, "session", tp));
}
}
* Sends a response template to the user agent informing it of the results of a logout attempt.
*
* @param application the Application to use in determining the logout template
+ * @param request the HTTP client request to supply to the template
* @param response the HTTP response to use
* @param local true iff the logout operation was local to the SP, false iff global
* @param status optional logoutStatus key value to add to template
*/
std::pair<bool,long> sendLogoutPage(
- const Application& application, xmltooling::HTTPResponse& response, bool local=true, const char* status=NULL
+ const Application& application,
+ const xmltooling::HTTPRequest& request,
+ xmltooling::HTTPResponse& response,
+ bool local=true,
+ const char* status=NULL
) const;
};
vector<string> sessions(1, session_id);
if (!notifyBackChannel(app, request.getRequestURL(), sessions, true)) {
app.getServiceProvider().getSessionCache()->remove(app, request, &request);
- return sendLogoutPage(app, request, true, "Partial logout failure.");
+ return sendLogoutPage(app, request, request, true, "Partial logout failure.");
}
request.getServiceProvider().getSessionCache()->remove(app, request, &request);
}
- return sendLogoutPage(app, request, true, "Logout was successful.");
+ return sendLogoutPage(app, request, request, true, "Logout was successful.");
}
using namespace xmltooling;
using namespace std;
-pair<bool,long> LogoutHandler::sendLogoutPage(const Application& application, HTTPResponse& response, bool local, const char* status) const
+pair<bool,long> LogoutHandler::sendLogoutPage(
+ const Application& application, const HTTPRequest& request, HTTPResponse& response, bool local, const char* status
+ ) const
{
pair<bool,const char*> prop = application.getString(local ? "localLogout" : "globalLogout");
if (prop.first) {
if (!infile)
throw ConfigurationException("Unable to access $1 HTML template.", params(1,local ? "localLogout" : "globalLogout"));
TemplateParameters tp;
+ tp.m_request = &request;
tp.setPropertySet(application.getPropertySet("Errors"));
if (status)
tp.m_map["logoutStatus"] = status;
pair<bool,long> LogoutHandler::run(SPRequest& request, bool isHandler) const
{
- // If we're inside a chain, so do nothing.
+ // If we're inside a chain, do nothing.
if (getParent())
return make_pair(false,0L);
return make_pair(false,0L);
// Try another front-channel notification. No extra parameters and the session is implicit.
- pair<bool,long> ret = notifyFrontChannel(request.getApplication(), request, request);
- if (ret.first)
- return ret;
-
- return make_pair(false,0L);
+ return notifyFrontChannel(request.getApplication(), request, request);
}
void LogoutHandler::receive(DDF& in, ostream& out)
checkError(logoutResponse, policy.getIssuerMetadata()); // throws if Status doesn't look good...
// Return template for completion of global logout, or redirect to homeURL.
- return sendLogoutPage(application, response, false, "Global logout completed.");
+ return sendLogoutPage(application, request, response, false, "Global logout completed.");
}
FatalProfileException ex("Incoming message was not a samlp:LogoutRequest or samlp:LogoutResponse.");
if (!notifyBackChannel(application, httpRequest.getRequestURL(), sessions, false)) {
session->unlock();
application.getServiceProvider().getSessionCache()->remove(application, httpRequest, &httpResponse);
- return sendLogoutPage(application, httpResponse, true, "Partial logout failure.");
+ return sendLogoutPage(application, httpRequest, httpResponse, true, "Partial logout failure.");
}
#ifndef SHIBSP_LITE
}
if (!logoutResponse)
- ret = sendLogoutPage(application, httpResponse, false, "Identity provider did not respond to logout request.");
+ ret = sendLogoutPage(application, httpRequest, httpResponse, false, "Identity provider did not respond to logout request.");
else if (!logoutResponse->getStatus() || !logoutResponse->getStatus()->getStatusCode() ||
!XMLString::equals(logoutResponse->getStatus()->getStatusCode()->getValue(), saml2p::StatusCode::SUCCESS)) {
delete logoutResponse;
- ret = sendLogoutPage(application, httpResponse, false, "Identity provider returned a SAML error in response to logout request.");
+ ret = sendLogoutPage(application, httpRequest, httpResponse, false, "Identity provider returned a SAML error in response to logout request.");
}
else {
delete logoutResponse;
- ret = sendLogoutPage(application, httpResponse, false, "Logout completed successfully.");
+ ret = sendLogoutPage(application, httpRequest, httpResponse, false, "Logout completed successfully.");
}
if (session) {