2 * Copyright 2001-2005 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.
17 /* internal.h - internally visible declarations
25 #ifndef __shibtarget_internal_h__
26 #define __shibtarget_internal_h__
29 # define SHIBTARGET_EXPORTS __declspec(dllexport)
32 // eventually we might be able to support autoconf via cygwin...
33 #if defined (_MSC_VER) || defined(__BORLANDC__)
34 # include "config_win32.h"
39 #include "shib-target.h"
42 #if defined(HAVE_LOG4SHIB)
43 # include <log4shib/Category.hh>
44 # include <log4shib/CategoryStream.hh>
45 # include <log4shib/FixedContextCategory.hh>
46 namespace shibtarget {
47 namespace logging = log4shib;
49 #elif defined(HAVE_LOG4CPP)
50 # include <log4cpp/Category.hh>
51 # include <log4cpp/CategoryStream.hh>
52 # include <log4cpp/FixedContextCategory.hh>
53 namespace shibtarget {
54 namespace logging = log4cpp;
57 # error "Supported logging library not available."
60 #define SHIBT_L(s) shibtarget::XML::Literals::s
61 #define SHIBT_L_QNAME(p,s) shibtarget::XML::Literals::p##_##s
62 #define SHIBT_LOGCAT "shibtarget"
63 #define SHIBTRAN_LOGCAT "Shibboleth-TRANSACTION"
65 // Controls default logging level of console tools and other situations
66 // where full shibboleth.xml-based logging isn't used.
67 #define SHIB_LOGGING "WARN"
69 namespace shibtarget {
72 class RPCListener : public virtual IListener
75 RPCListener(const DOMElement* e);
79 const IApplication* application,
80 int supported_profiles,
81 const char* recipient,
86 std::string& provider_id
90 const IApplication* application,
93 ISessionCacheEntry** pentry
97 const IApplication* application,
101 void ping(int& i) const;
103 // Implemented by socket-specific subclasses. Return type must be ONC CLIENT*
104 virtual void* getClientHandle(ShibSocket& s, u_long program, u_long version) const=0;
107 logging::Category* log;
110 mutable RPCHandlePool* m_rpcpool;
113 // Generic class, which handles the IPropertySet configuration interface.
114 // Most of the basic configuration details are exposed via this interface.
115 // This implementation extracts the XML tree structure and caches it in a map
116 // with the attributes stored in the various possible formats they might be fetched.
117 // Elements are treated as nested IPropertySets.
118 // The "trick" to this is to pass in an "exclude list" using a DOMNodeFilter. Nested
119 // property sets are extracted by running a TreeWalker againt the filter for the
120 // immediate children. The filter should skip any excluded elements that will be
121 // processed separately.
122 class XMLPropertySet : public virtual IPropertySet
128 std::pair<bool,bool> getBool(const char* name, const char* ns=NULL) const;
129 std::pair<bool,const char*> getString(const char* name, const char* ns=NULL) const;
130 std::pair<bool,const XMLCh*> getXMLString(const char* name, const char* ns=NULL) const;
131 std::pair<bool,unsigned int> getUnsignedInt(const char* name, const char* ns=NULL) const;
132 std::pair<bool,int> getInt(const char* name, const char* ns=NULL) const;
133 const IPropertySet* getPropertySet(const char* name, const char* ns="urn:mace:shibboleth:target:config:1.0") const;
134 const DOMElement* getElement() const {return m_root;}
137 const DOMElement* e, // root element of property set
138 logging::Category& log, // log object for tracing
139 DOMNodeFilter* filter, // control what subelements to include
140 const std::map<std::string,std::string>* remapper=NULL // on the fly property renaming for legacy support
144 const DOMElement* m_root;
145 std::map<std::string,std::pair<char*,const XMLCh*> > m_map;
146 std::map<std::string,IPropertySet*> m_nested;
149 // ST-aware class that maps SAML artifacts to appropriate binding information
150 class STArtifactMapper : public virtual saml::SAMLBrowserProfile::ArtifactMapper
153 STArtifactMapper(const IApplication* application) : m_app(application) {}
154 virtual ~STArtifactMapper() {}
155 saml::SAMLResponse* resolve(saml::SAMLRequest* request);
158 const IApplication* m_app;
161 // Error template class
168 void insert (const std::string& key, const std::string& value);
169 void insert (const std::string& key, const char* value) {
170 std::string v = value;
173 void insert (const char* key, const std::string& value) {
177 void insert (const char* key, const char* value) {
178 std::string k = key, v = value;
181 void insert (saml::SAMLException& e);
183 void clear () { m_map.clear(); }
185 const char* run (std::istream& s, const IPropertySet* props=NULL, std::string* output=NULL);
186 const char* run (const std::string& input, const IPropertySet* props=NULL, std::string* output=NULL);
187 const char* run (const char* input, const IPropertySet* props=NULL, std::string* output=NULL) {
188 std::string i = input;
189 return run(i,props,output);
194 std::map<std::string,std::string> m_map;
195 std::string m_generated;
198 class STConfig : public ShibTargetConfig
201 STConfig() : m_tranLog(NULL), m_tranLogLock(NULL) {}
204 bool init(const char* schemadir);
205 bool load(const char* config);
208 logging::Category& getTransactionLog() { m_tranLogLock->lock(); return *m_tranLog; }
209 void releaseTransactionLog() { m_tranLogLock->unlock();}
211 logging::FixedContextCategory* m_tranLog;
212 shibboleth::Mutex* m_tranLogLock;
213 static IConfig* ShibTargetConfigFactory(const DOMElement* e);