X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=shibsp%2FAbstractSPRequest.cpp;h=fe0de146bbd26bbe96c43db044f00c8e36214065;hb=9abb4b739f0e1f89bd569ed0ee3c261ecdf0f6fa;hp=eb1ced4774750d513b23a954b84de516dce4cae2;hpb=926fc8dc99fc125be98c79abf0e7803382eb8112;p=shibboleth%2Fcpp-sp.git diff --git a/shibsp/AbstractSPRequest.cpp b/shibsp/AbstractSPRequest.cpp index eb1ced4..fe0de14 100644 --- a/shibsp/AbstractSPRequest.cpp +++ b/shibsp/AbstractSPRequest.cpp @@ -1,17 +1,21 @@ -/* - * Copyright 2001-2010 Internet2 +/** + * Licensed to the University Corporation for Advanced Internet + * Development, Inc. (UCAID) under one or more contributor license + * agreements. See the NOTICE file distributed with this work for + * additional information regarding copyright ownership. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * UCAID licenses this file to you under the Apache License, + * Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the + * License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific + * language governing permissions and limitations under the License. */ /** @@ -24,10 +28,13 @@ #include "exceptions.h" #include "AbstractSPRequest.h" #include "Application.h" +#include "GSSRequest.h" #include "ServiceProvider.h" #include "SessionCache.h" #include "util/CGIParser.h" +#include + using namespace shibsp; using namespace opensaml; using namespace xmltooling; @@ -50,11 +57,26 @@ void SPRequest::setAuthType(const char* authtype) { } +#ifdef SHIBSP_HAVE_GSSAPI +GSSRequest::GSSRequest() +{ +} + +GSSRequest::~GSSRequest() +{ +} + +gss_name_t GSSRequest::getGSSName() const +{ + return GSS_C_NO_NAME; +} +#endif + AbstractSPRequest::AbstractSPRequest(const char* category) - : m_sp(nullptr), m_mapper(nullptr), m_app(nullptr), m_sessionTried(false), m_session(nullptr), - m_log(&Category::getInstance(category)), m_parser(nullptr) + : m_sp(SPConfig::getConfig().getServiceProvider()), + m_mapper(nullptr), m_app(nullptr), m_sessionTried(false), m_session(nullptr), + m_log(&Category::getInstance(category)) { - m_sp=SPConfig::getConfig().getServiceProvider(); m_sp->lock(); } @@ -66,7 +88,6 @@ AbstractSPRequest::~AbstractSPRequest() m_mapper->unlock(); if (m_sp) m_sp->unlock(); - delete m_parser; } const ServiceProvider& AbstractSPRequest::getServiceProvider() const @@ -78,7 +99,7 @@ RequestMapper::Settings AbstractSPRequest::getRequestSettings() const { if (!m_mapper) { // Map request to application and content settings. - m_mapper=m_sp->getRequestMapper(); + m_mapper = m_sp->getRequestMapper(); m_mapper->lock(); m_settings = m_mapper->getSettings(*this); @@ -95,7 +116,7 @@ const Application& AbstractSPRequest::getApplication() const { if (!m_app) { // Now find the application from the URL settings - m_app=m_sp->getApplication(getRequestSettings().first->getString("applicationId").second); + m_app = m_sp->getApplication(getRequestSettings().first->getString("applicationId").second); if (!m_app) throw ConfigurationException("Unable to map non-default applicationId to an ApplicationOverride, check configuration."); } @@ -111,16 +132,16 @@ Session* AbstractSPRequest::getSession(bool checkTimeout, bool ignoreAddress, bo m_sessionTried = true; // Need address checking and timeout settings. - time_t timeout=3600; + time_t timeout = 3600; if (checkTimeout || !ignoreAddress) { - const PropertySet* props=getApplication().getPropertySet("Sessions"); + const PropertySet* props = getApplication().getPropertySet("Sessions"); if (props) { if (checkTimeout) { - pair p=props->getUnsignedInt("timeout"); + pair p = props->getUnsignedInt("timeout"); if (p.first) timeout = p.second; } - pair pcheck=props->getBool("consistentAddress"); + pair pcheck = props->getBool("consistentAddress"); if (pcheck.first) ignoreAddress = !pcheck.second; } @@ -128,7 +149,7 @@ Session* AbstractSPRequest::getSession(bool checkTimeout, bool ignoreAddress, bo // The cache will either silently pass a session or nullptr back, or throw an exception out. Session* session = getServiceProvider().getSessionCache()->find( - getApplication(), *this, ignoreAddress ? nullptr : getRemoteAddr().c_str(), checkTimeout ? &timeout : nullptr + getApplication(), *this, (ignoreAddress ? nullptr : getRemoteAddr().c_str()), (checkTimeout ? &timeout : nullptr) ); if (cache) m_session = session; @@ -183,11 +204,8 @@ const char* AbstractSPRequest::getRequestURL() const int port = getPort(); const char* scheme = getScheme(); m_url = string(scheme) + "://" + getHostname(); - if ((!strcmp(scheme,"http") && port!=80) || (!strcmp(scheme,"https") && port!=443)) { - ostringstream portstr; - portstr << port; - m_url += ":" + portstr.str(); - } + if (!isDefaultPort()) + m_url += ":" + boost::lexical_cast(port); m_url += m_uri; } return m_url.c_str(); @@ -201,20 +219,20 @@ string AbstractSPRequest::getRemoteAddr() const const char* AbstractSPRequest::getParameter(const char* name) const { - if (!m_parser) - m_parser=new CGIParser(*this); + if (!m_parser.get()) + m_parser.reset(new CGIParser(*this)); - pair bounds=m_parser->getParameters(name); + pair bounds = m_parser->getParameters(name); return (bounds.first==bounds.second) ? nullptr : bounds.first->second; } vector::size_type AbstractSPRequest::getParameters(const char* name, vector& values) const { - if (!m_parser) - m_parser=new CGIParser(*this); + if (!m_parser.get()) + m_parser.reset(new CGIParser(*this)); - pair bounds=m_parser->getParameters(name); - while (bounds.first!=bounds.second) { + pair bounds = m_parser->getParameters(name); + while (bounds.first != bounds.second) { values.push_back(bounds.first->second); ++bounds.first; } @@ -226,20 +244,18 @@ const char* AbstractSPRequest::getHandlerURL(const char* resource) const if (!resource) resource = getRequestURL(); - if (!m_handlerURL.empty() && resource && !strcmp(getRequestURL(),resource)) + if (!m_handlerURL.empty() && resource && !strcmp(getRequestURL(), resource)) return m_handlerURL.c_str(); + // Check for relative URL. string stackresource; if (resource && *resource == '/') { // Compute a URL to the root of the site and point resource at constructed string. int port = getPort(); const char* scheme = getScheme(); stackresource = string(scheme) + "://" + getHostname(); - if ((!strcmp(scheme,"http") && port!=80) || (!strcmp(scheme,"https") && port!=443)) { - ostringstream portstr; - portstr << port; - stackresource += ":" + portstr.str(); - } + if (!isDefaultPort()) + stackresource += ":" + boost::lexical_cast(port); stackresource += resource; resource = stackresource.c_str(); } @@ -251,24 +267,27 @@ const char* AbstractSPRequest::getHandlerURL(const char* resource) const #endif throw ConfigurationException("Target resource was not an absolute URL."); - bool ssl_only=true; - const char* handler=nullptr; - const PropertySet* props=getApplication().getPropertySet("Sessions"); + bool ssl_only = true; + const char* handler = nullptr; + const PropertySet* props = getApplication().getPropertySet("Sessions"); if (props) { - pair p=props->getBool("handlerSSL"); + pair p = props->getBool("handlerSSL"); if (p.first) - ssl_only=p.second; - pair p2=props->getString("handlerURL"); + ssl_only = p.second; + pair p2 = props->getString("handlerURL"); if (p2.first) - handler=p2.second; + handler = p2.second; } - // Should never happen... - if (!handler || (*handler!='/' && strncmp(handler,"http:",5) && strncmp(handler,"https:",6))) + if (!handler) { + handler = "/Shibboleth.sso"; + } + else if (*handler!='/' && strncmp(handler,"http:",5) && strncmp(handler,"https:",6)) { throw ConfigurationException( "Invalid handlerURL property ($1) in element for Application ($2)", params(2, handler ? handler : "null", m_app->getId()) ); + } // The "handlerURL" property can be in one of three formats: // @@ -296,9 +315,9 @@ const char* AbstractSPRequest::getHandlerURL(const char* resource) const } // break apart the "protocol" string into protocol, host, and "the rest" - const char* colon=strchr(prot,':'); + const char* colon = strchr(prot, ':'); colon += 3; - const char* slash=strchr(colon,'/'); + const char* slash = strchr(colon, '/'); if (!path) path = slash;