/*
- * Copyright 2001-2007 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.
*/
#include "internal.h"
+#include "Application.h"
#include "exceptions.h"
#include "ServiceProvider.h"
+#include "SPRequest.h"
#include "handler/RemotedHandler.h"
#include <algorithm>
-#include <log4cpp/Category.hh>
#include <xmltooling/unicode.h>
#ifndef SHIBSP_LITE
-# include <saml/util/CGIParser.h>
+# include "util/CGIParser.h"
# include <xsec/enc/OpenSSL/OpenSSLCryptoX509.hpp>
# include <xsec/enc/XSECCryptoException.hpp>
# include <xsec/framework/XSECException.hpp>
using namespace shibsp;
using namespace opensaml;
using namespace xmltooling;
-using namespace log4cpp;
using namespace xercesc;
using namespace std;
mutable CGIParser* m_parser;
mutable vector<XSECCryptoX509*> m_certs;
public:
- RemotedRequest(DDF& input) : m_input(input), m_parser(NULL) {}
+ RemotedRequest(DDF& input) : m_input(input), m_parser(nullptr) {}
virtual ~RemotedRequest() {
for_each(m_certs.begin(), m_certs.end(), xmltooling::cleanup<XSECCryptoX509>());
delete m_parser;
m_parser=new CGIParser(*this);
pair<CGIParser::walker,CGIParser::walker> bounds=m_parser->getParameters(name);
- return (bounds.first==bounds.second) ? NULL : bounds.first->second;
+ return (bounds.first==bounds.second) ? nullptr : bounds.first->second;
}
std::vector<const char*>::size_type RemotedRequest::getParameters(const char* name, std::vector<const char*>& values) const
const std::vector<XSECCryptoX509*>& RemotedRequest::getClientCertificates() const
{
if (m_certs.empty()) {
- DDF cert = m_input["certificates"].first();
- while (cert.isstring()) {
+ DDF certs = m_input["certificates"];
+ DDF cert = certs.first();
+ while (cert.string()) {
try {
auto_ptr<XSECCryptoX509> x509(XSECPlatformUtils::g_cryptoProvider->X509());
- x509->loadX509Base64Bin(cert.string(), cert.strlen());
+ if (strstr(cert.string(), "BEGIN"))
+ x509->loadX509PEM(cert.string(), cert.strlen());
+ else
+ x509->loadX509Base64Bin(cert.string(), cert.strlen());
m_certs.push_back(x509.release());
}
catch(XSECException& e) {
catch(XSECCryptoException& e) {
Category::getInstance(SHIBSP_LOGCAT".SPRequest").error("XML-Security exception loading client certificate: %s", e.getMsg());
}
- cert = cert.next();
+ cert = certs.next();
}
}
return m_certs;
m_output.structure();
DDF hdrs = m_output["headers"];
if (hdrs.isnull())
- hdrs = m_output.addmember("headers").structure();
- hdrs.addmember(name).string(value);
+ hdrs = m_output.addmember("headers").list();
+ DDF h = DDF(name).string(value);
+ hdrs.add(h);
}
long RemotedResponse::sendRedirect(const char* url)
{
if (!m_output.isstruct())
m_output.structure();
- m_output.addmember("redirect").string(url);
+ m_output.addmember("redirect").unsafe_string(url);
return HTTPResponse::XMLTOOLING_HTTP_STATUS_MOVED;
}
}
}
+RemotedHandler::RemotedHandler()
+{
+}
+
RemotedHandler::~RemotedHandler()
{
SPConfig& conf = SPConfig::getConfig();
DDF RemotedHandler::wrap(const SPRequest& request, const vector<string>* headers, bool certs) const
{
DDF in = DDF(m_address.c_str()).structure();
+ in.addmember("application_id").string(request.getApplication().getId());
in.addmember("scheme").string(request.getScheme());
- in.addmember("hostname").string(request.getHostname());
+ in.addmember("hostname").unsafe_string(request.getHostname());
in.addmember("port").integer(request.getPort());
in.addmember("content_type").string(request.getContentType().c_str());
in.addmember("content_length").integer(request.getContentLength());
in.addmember("remote_user").string(request.getRemoteUser().c_str());
in.addmember("client_addr").string(request.getRemoteAddr().c_str());
in.addmember("method").string(request.getMethod());
- in.addmember("uri").string(request.getRequestURI());
- in.addmember("url").string(request.getRequestURL());
+ in.addmember("uri").unsafe_string(request.getRequestURI());
+ in.addmember("url").unsafe_string(request.getRequestURL());
in.addmember("query").string(request.getQueryString());
if (headers) {
if (!xvec.empty()) {
DDF clist = in.addmember("certificates").list();
for (vector<XSECCryptoX509*>::const_iterator x = xvec.begin(); x!=xvec.end(); ++x) {
- DDF x509 = DDF(NULL).string((*x)->getDEREncodingSB().rawCharBuffer());
+ DDF x509 = DDF(nullptr).string((*x)->getDEREncodingSB().rawCharBuffer());
clist.add(x509);
}
}
if (!xvec.empty()) {
DDF clist = in.addmember("certificates").list();
for (vector<string>::const_iterator x = xvec.begin(); x!=xvec.end(); ++x) {
- DDF x509 = DDF(NULL).string(x->c_str());
+ DDF x509 = DDF(nullptr).string(x->c_str());
clist.add(x509);
}
}
pair<bool,long> RemotedHandler::unwrap(SPRequest& request, DDF& out) const
{
DDF h = out["headers"];
- h = h.first();
- while (h.isstring()) {
- request.setResponseHeader(h.name(), h.string());
- h = h.next();
+ DDF hdr = h.first();
+ while (hdr.isstring()) {
+#ifdef HAVE_STRCASECMP
+ if (!strcasecmp(hdr.name(), "Content-Type"))
+#else
+ if (!stricmp(hdr.name(), "Content-Type"))
+#endif
+ request.setContentType(hdr.string());
+ else
+ request.setResponseHeader(hdr.name(), hdr.string());
+ hdr = h.next();
}
h = out["redirect"];
if (h.isstring())
istringstream s(h["data"].string());
return make_pair(true, request.sendResponse(s, h["status"].integer()));
}
- return make_pair(false,0);
+ return make_pair(false,0L);
}
HTTPRequest* RemotedHandler::getRequest(DDF& in) const