/*
- * 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.
/**
* nsapi_shib.cpp
*
- * Shibboleth NSAPI filter
+ * Shibboleth NSAPI filter.
*/
#define SHIBSP_LITE
# define _CRT_RAND_S
#endif
+#include <shibsp/exceptions.h>
#include <shibsp/AbstractSPRequest.h>
#include <shibsp/RequestMapper.h>
#include <shibsp/SPConfig.h>
#include <shibsp/ServiceProvider.h>
+
+#include <set>
+#include <memory>
+#include <fstream>
+#include <sstream>
+#include <stdexcept>
#include <xmltooling/XMLToolingConfig.h>
#include <xmltooling/util/NDC.h>
#include <xmltooling/util/Threads.h>
#include <xmltooling/util/XMLHelper.h>
#include <xercesc/util/XMLUniDefs.hpp>
-#include <memory>
-#include <fstream>
-#include <sstream>
-#include <stdexcept>
-
#ifdef WIN32
# include <process.h>
# define XP_WIN32
if (IO_ERROR==net_write(sn->csd,str,strlen(str))) return REQ_EXIT
namespace {
- SPConfig* g_Config=NULL;
+ SPConfig* g_Config=nullptr;
string g_ServerName;
string g_unsetHeaderValue;
string g_spoofKey;
static const XMLCh path[] = UNICODE_LITERAL_4(p,a,t,h);
static const XMLCh validate[] = UNICODE_LITERAL_8(v,a,l,i,d,a,t,e);
+
+ void _my_invalid_parameter_handler(
+ const wchar_t * expression,
+ const wchar_t * function,
+ const wchar_t * file,
+ unsigned int line,
+ uintptr_t pReserved
+ ) {
+ return;
+ }
}
PluginManager<RequestMapper,string,const xercesc::DOMElement*>::Factory SunRequestMapFactory;
{
if (g_Config)
g_Config->term();
- g_Config = NULL;
+ g_Config = nullptr;
}
extern "C" NSAPI_PUBLIC int nsapi_shib_init(pblock* pb, ::Session* sn, Request* rq)
SPConfig::Handlers
);
if (!g_Config->init(schemadir,prefix)) {
- g_Config=NULL;
+ g_Config=nullptr;
pblock_nvinsert("error","unable to initialize Shibboleth libraries",pb);
return REQ_ABORTED;
}
catch (exception& ex) {
pblock_nvinsert("error",ex.what(),pb);
g_Config->term();
- g_Config=NULL;
+ g_Config=nullptr;
return REQ_ABORTED;
}
- daemon_atrestart(nsapi_shib_exit,NULL);
+ daemon_atrestart(nsapi_shib_exit,nullptr);
ServiceProvider* sp=g_Config->getServiceProvider();
Locker locker(sp);
g_spoofKey = unsetValue.second;
#ifdef WIN32
else {
+ _invalid_parameter_handler old = _set_invalid_parameter_handler(_my_invalid_parameter_handler);
unsigned int randkey=0,randkey2=0,randkey3=0,randkey4=0;
if (rand_s(&randkey) == 0 && rand_s(&randkey2) == 0 && rand_s(&randkey3) == 0 && rand_s(&randkey4) == 0) {
+ _set_invalid_parameter_handler(old);
ostringstream keystr;
keystr << randkey << randkey2 << randkey3 << randkey4;
g_spoofKey = keystr.str();
}
else {
+ _set_invalid_parameter_handler(old);
pblock_nvinsert("error", "module failed to generate a random anti-spoofing key (if this is Windows 2000 set one manually)", pb);
+ locker.assign(); // pops lock on SP config
g_Config->term();
- g_Config=NULL;
+ g_Config=nullptr;
return REQ_ABORTED;
}
}
return pblock_findval("method", m_rq->reqpb);
}
string getContentType() const {
- char* content_type = NULL;
+ char* content_type = nullptr;
if (request_header("content-type", &content_type, m_sn, m_rq) != REQ_PROCEED)
return "";
return content_type ? content_type : "";
long getContentLength() const {
if (m_gotBody)
return m_body.length();
- char* content_length=NULL;
+ char* content_length=nullptr;
if (request_header("content-length", &content_length, m_sn, m_rq) != REQ_PROCEED)
return 0;
return content_length ? atoi(content_length) : 0;
const char* getRequestBody() const {
if (m_gotBody)
return m_body.c_str();
- char* content_length=NULL;
+ char* content_length=nullptr;
if (request_header("content-length", &content_length, m_sn, m_rq) != REQ_PROCEED || !content_length) {
m_gotBody = true;
- return NULL;
+ return nullptr;
}
else if (atoi(content_length) > 1024*1024) // 1MB?
throw opensaml::SecurityPolicyException("Blocked request body exceeding 1M size limit.");
}
string getHeader(const char* name) const {
// NSAPI headers tend to be lower case. We'll special case "cookie" since it's used a lot.
- char* hdr = NULL;
+ char* hdr = nullptr;
int cookie = strcmp(name, "Cookie");
if (cookie == 0)
name = "cookie";
setResponseHeader("Content-Type", type);
}
void setResponseHeader(const char* name, const char* value) {
+ HTTPResponse::setResponseHeader(name, value);
pblock_nvinsert(name, value, m_rq->srvhdrs);
}
}
pblock_nvinsert("connection","close",m_rq->srvhdrs);
pblock_nninsert("content-length", msg.length(), m_rq->srvhdrs);
- protocol_status(m_sn, m_rq, status, NULL);
+ protocol_status(m_sn, m_rq, status, nullptr);
protocol_start_response(m_sn, m_rq);
net_write(m_sn->csd,const_cast<char*>(msg.c_str()),msg.length());
return REQ_EXIT;
}
long sendRedirect(const char* url) {
+ HTTPResponse::sendRedirect(url);
param_free(pblock_remove("content-type", m_rq->srvhdrs));
pblock_nninsert("content-length", 0, m_rq->srvhdrs);
pblock_nvinsert("expires", "01-Jan-1997 12:00:00 GMT", m_rq->srvhdrs);
pblock_nvinsert("cache-control", "private,no-store,no-cache", m_rq->srvhdrs);
pblock_nvinsert("location", url, m_rq->srvhdrs);
pblock_nvinsert("connection","close",m_rq->srvhdrs);
- protocol_status(m_sn, m_rq, PROTOCOL_REDIRECT, NULL);
+ protocol_status(m_sn, m_rq, PROTOCOL_REDIRECT, nullptr);
protocol_start_response(m_sn, m_rq);
return REQ_ABORTED;
}
SunRequestMapper(const xercesc::DOMElement* e);
~SunRequestMapper() { delete m_mapper; delete m_stKey; delete m_propsKey; }
Lockable* lock() { return m_mapper->lock(); }
- void unlock() { m_stKey->setData(NULL); m_propsKey->setData(NULL); m_mapper->unlock(); }
+ void unlock() { m_stKey->setData(nullptr); m_propsKey->setData(nullptr); m_mapper->unlock(); }
Settings getSettings(const HTTPRequest& request) const;
- const PropertySet* getParent() const { return NULL; }
+ const PropertySet* getParent() const { return nullptr; }
void setParent(const PropertySet*) {}
- pair<bool,bool> getBool(const char* name, const char* ns=NULL) const;
- pair<bool,const char*> getString(const char* name, const char* ns=NULL) const;
- pair<bool,const XMLCh*> getXMLString(const char* name, const char* ns=NULL) const;
- pair<bool,unsigned int> getUnsignedInt(const char* name, const char* ns=NULL) const;
- pair<bool,int> getInt(const char* name, const char* ns=NULL) const;
+ pair<bool,bool> getBool(const char* name, const char* ns=nullptr) const;
+ pair<bool,const char*> getString(const char* name, const char* ns=nullptr) const;
+ pair<bool,const XMLCh*> getXMLString(const char* name, const char* ns=nullptr) const;
+ pair<bool,unsigned int> getUnsignedInt(const char* name, const char* ns=nullptr) const;
+ pair<bool,int> getInt(const char* name, const char* ns=nullptr) const;
void getAll(map<string,const char*>& properties) const;
const PropertySet* getPropertySet(const char* name, const char* ns=shibspconstants::ASCII_SHIB2SPCONFIG_NS) const;
const xercesc::DOMElement* getElement() const;
return new SunRequestMapper(e);
}
-SunRequestMapper::SunRequestMapper(const xercesc::DOMElement* e) : m_mapper(NULL), m_stKey(NULL), m_propsKey(NULL)
+SunRequestMapper::SunRequestMapper(const xercesc::DOMElement* e) : m_mapper(nullptr), m_stKey(nullptr), m_propsKey(nullptr)
{
m_mapper = SPConfig::getConfig().RequestMapperManager.newPlugin(XML_REQUEST_MAPPER,e);
- m_stKey=ThreadKey::create(NULL);
- m_propsKey=ThreadKey::create(NULL);
+ m_stKey=ThreadKey::create(nullptr);
+ m_propsKey=ThreadKey::create(nullptr);
}
RequestMapper::Settings SunRequestMapper::getSettings(const HTTPRequest& request) const
return make_pair(true,param);
}
}
- return s ? s->getString(name,ns) : pair<bool,const char*>(false,NULL);
+ return s ? s->getString(name,ns) : pair<bool,const char*>(false,nullptr);
}
pair<bool,const XMLCh*> SunRequestMapper::getXMLString(const char* name, const char* ns) const
{
const PropertySet* s=reinterpret_cast<const PropertySet*>(m_propsKey->getData());
- return s ? s->getXMLString(name,ns) : pair<bool,const XMLCh*>(false,NULL);
+ return s ? s->getXMLString(name,ns) : pair<bool,const XMLCh*>(false,nullptr);
}
pair<bool,unsigned int> SunRequestMapper::getUnsignedInt(const char* name, const char* ns) const
// Override int properties.
const char* param=pblock_findval(name,stn->m_pb);
if (param)
- return pair<bool,unsigned int>(true,strtol(param,NULL,10));
+ return pair<bool,unsigned int>(true,strtol(param,nullptr,10));
}
return s ? s->getUnsignedInt(name,ns) : pair<bool,unsigned int>(false,0);
}
const PropertySet* SunRequestMapper::getPropertySet(const char* name, const char* ns) const
{
const PropertySet* s=reinterpret_cast<const PropertySet*>(m_propsKey->getData());
- return s ? s->getPropertySet(name,ns) : NULL;
+ return s ? s->getPropertySet(name,ns) : nullptr;
}
const xercesc::DOMElement* SunRequestMapper::getElement() const
{
const PropertySet* s=reinterpret_cast<const PropertySet*>(m_propsKey->getData());
- return s ? s->getElement() : NULL;
+ return s ? s->getElement() : nullptr;
}