2 * Copyright 2001-2010 Internet2
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
20 * Interface to a Shibboleth Application instance.
24 #include "Application.h"
25 #include "SPRequest.h"
26 #include "ServiceProvider.h"
27 #include "attribute/Attribute.h"
28 #include "remoting/ListenerService.h"
31 #include <xmltooling/util/Threads.h>
33 using namespace shibsp;
34 using namespace xmltooling;
37 Application::Application(const ServiceProvider* sp) : m_sp(sp), m_lock(RWLock::create())
41 Application::~Application()
46 const ServiceProvider& Application::getServiceProvider() const
51 const char* Application::getId() const
53 pair<bool,const char*> ret = getString("id");
54 return ret.first ? ret.second : "default";
57 pair<string,const char*> Application::getCookieNameProps(const char* prefix, time_t* lifetime) const
59 static const char* defProps="; path=/";
63 const PropertySet* props=getPropertySet("Sessions");
66 pair<bool,unsigned int> lt = props->getUnsignedInt("cookieLifetime");
68 *lifetime = lt.second;
70 pair<bool,const char*> p=props->getString("cookieProps");
73 pair<bool,const char*> p2=props->getString("cookieName");
75 return make_pair(string(prefix) + p2.second,p.second);
76 return make_pair(string(prefix) + getHash(),p.second);
79 // Shouldn't happen, but just in case..
80 return pair<string,const char*>(prefix,defProps);
83 void Application::clearHeader(SPRequest& request, const char* rawname, const char* cginame) const
85 request.clearHeader(rawname, cginame);
88 void Application::setHeader(SPRequest& request, const char* name, const char* value) const
90 request.setHeader(name, value);
93 string Application::getSecureHeader(const SPRequest& request, const char* name) const
95 return request.getSecureHeader(name);
98 void Application::clearAttributeHeaders(SPRequest& request) const
100 if (SPConfig::getConfig().isEnabled(SPConfig::OutOfProcess)) {
101 for (vector< pair<string,string> >::const_iterator i = m_unsetHeaders.begin(); i!=m_unsetHeaders.end(); ++i)
102 request.clearHeader(i->first.c_str(), i->second.c_str());
107 if (m_unsetHeaders.empty()) {
108 // No headers yet, so we have to request them from the remote half.
111 if (m_unsetHeaders.empty()) {
112 SharedLock wrlock(m_lock, false);
113 string addr=string(getId()) + "::getHeaders::Application";
114 DDF out,in = DDF(addr.c_str());
115 DDFJanitor jin(in),jout(out);
116 out = getServiceProvider().getListenerService()->send(in);
118 DDF header = out.first();
119 while (header.isstring()) {
120 m_unsetHeaders.push_back(pair<string,string>(header.name(),header.string()));
131 // Now holding read lock.
132 SharedLock unsetLock(m_lock, false);
133 for (vector< pair<string,string> >::const_iterator i = m_unsetHeaders.begin(); i!=m_unsetHeaders.end(); ++i)
134 request.clearHeader(i->first.c_str(), i->second.c_str());