b3a4e2357dd2eb32146d777cb0ef9d008e13db62
[shibboleth/sp.git] / shibsp / SPConfig.h
1 /*
2  *  Copyright 2001-2007 Internet2
3  * 
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
7  *
8  *     http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  */
16
17 /**
18  * @file shibsp/SPConfig.h
19  * 
20  * Library configuration 
21  */
22
23 #ifndef __shibsp_config_h__
24 #define __shibsp_config_h__
25
26 #include <shibsp/base.h>
27 #ifndef SHIBSP_LITE
28 # include <saml/binding/MessageDecoder.h>
29 #endif
30 #include <xmltooling/PluginManager.h>
31 #include <xercesc/dom/DOM.hpp>
32
33 /**
34  * @namespace shibsp
35  * Shibboleth Service Provider Library
36  */
37 namespace shibsp {
38
39     class SHIBSP_API AccessControl;
40     class SHIBSP_API Handler;
41     class SHIBSP_API ListenerService;
42     class SHIBSP_API RequestMapper;
43     class SHIBSP_API ServiceProvider;
44     class SHIBSP_API SessionCache;
45     class SHIBSP_API SessionInitiator;
46
47 #ifndef SHIBSP_LITE
48     class SHIBSP_API AttributeDecoder;
49     class SHIBSP_API AttributeExtractor;
50     class SHIBSP_API AttributeFilter;
51     class SHIBSP_API AttributeResolver;
52     class SHIBSP_API FilterPolicyContext;
53     class SHIBSP_API MatchFunctor;
54 #endif
55
56 #if defined (_MSC_VER)
57     #pragma warning( push )
58     #pragma warning( disable : 4250 4251 )
59 #endif
60
61     /**
62      * Singleton object that manages library startup/shutdown.
63      */
64     class SHIBSP_API SPConfig
65     {
66     MAKE_NONCOPYABLE(SPConfig);
67     public:
68         virtual ~SPConfig() {}
69
70         /**
71          * Returns the global configuration object for the library.
72          * 
73          * @return reference to the global library configuration object
74          */
75         static SPConfig& getConfig();
76
77         /**
78          * Bitmask values representing subsystems of the library.
79          */
80         enum components_t {
81             Listener = 1,
82             Caching = 2,
83 #ifndef SHIBSP_LITE
84             Metadata = 4,
85             Trust = 8,
86             Credentials = 16,
87             AttributeResolution = 32,
88 #endif
89             RequestMapping = 64,
90             OutOfProcess = 128,
91             InProcess = 256,
92             Logging = 512
93         };
94         
95         /**
96          * Set a bitmask of subsystems to activate.
97          * 
98          * @param enabled   bitmask of component constants
99          */
100         void setFeatures(unsigned long enabled) {
101             m_features = enabled;
102         }
103
104         /**
105          * Test whether a subsystem is enabled.
106          * 
107          * @param feature   subsystem/component to test
108          * @return true iff feature is enabled
109          */
110         bool isEnabled(components_t feature) {
111             return (m_features & feature)>0;
112         }
113         
114         /**
115          * Initializes library
116          * 
117          * Each process using the library MUST call this function exactly once
118          * before using any library classes.
119          * 
120          * @param catalog_path  delimited set of schema catalog files to load
121          * @return true iff initialization was successful 
122          */
123         virtual bool init(const char* catalog_path)=0;
124         
125         /**
126          * Shuts down library
127          * 
128          * Each process using the library SHOULD call this function exactly once
129          * before terminating itself.
130          */
131         virtual void term()=0;
132         
133         /**
134          * Sets the global ServiceProvider instance.
135          * This method must be externally synchronized with any code that uses the object.
136          * Any previously set object is destroyed.
137          * 
138          * @param serviceProvider   new ServiceProvider instance to store
139          */
140         void setServiceProvider(ServiceProvider* serviceProvider);
141         
142         /**
143          * Returns the global ServiceProvider instance.
144          * 
145          * @return  global ServiceProvider or NULL
146          */
147         ServiceProvider* getServiceProvider() const {
148             return m_serviceProvider;
149         }
150
151 #ifndef SHIBSP_LITE
152         /**
153          * Sets the global ArtifactResolver instance.
154          *
155          * <p>This method must be externally synchronized with any code that uses the object.
156          * Any previously set object is destroyed.
157          * 
158          * @param artifactResolver   new ArtifactResolver instance to store
159          */
160         void setArtifactResolver(opensaml::MessageDecoder::ArtifactResolver* artifactResolver) {
161             delete m_artifactResolver;
162             m_artifactResolver = artifactResolver;
163         }
164         
165         /**
166          * Returns the global ArtifactResolver instance.
167          * 
168          * @return  global ArtifactResolver or NULL
169          */
170         opensaml::MessageDecoder::ArtifactResolver* getArtifactResolver() const {
171             return m_artifactResolver;
172         }
173 #endif
174
175         /** Separator for serialized values of multi-valued attributes. */
176         char attribute_value_delimeter;
177         
178         /**
179          * Manages factories for AccessControl plugins.
180          */
181         xmltooling::PluginManager<AccessControl,std::string,const xercesc::DOMElement*> AccessControlManager;
182
183 #ifndef SHIBSP_LITE
184         /**
185          * Manages factories for AttributeDecoder plugins.
186          */
187         xmltooling::PluginManager<AttributeDecoder,xmltooling::QName,const xercesc::DOMElement*> AttributeDecoderManager;
188
189         /**
190          * Manages factories for AttributeExtractor plugins.
191          */
192         xmltooling::PluginManager<AttributeExtractor,std::string,const xercesc::DOMElement*> AttributeExtractorManager;
193
194         /**
195          * Manages factories for AttributeFilter plugins.
196          */
197         xmltooling::PluginManager<AttributeFilter,std::string,const xercesc::DOMElement*> AttributeFilterManager;
198
199         /**
200          * Manages factories for AttributeResolver plugins.
201          */
202         xmltooling::PluginManager<AttributeResolver,std::string,const xercesc::DOMElement*> AttributeResolverManager;
203
204         /**
205          * Manages factories for MatchFunctor plugins.
206          */
207         xmltooling::PluginManager< MatchFunctor,xmltooling::QName,std::pair<const FilterPolicyContext*,const xercesc::DOMElement*> > MatchFunctorManager;
208 #endif
209
210         /**
211          * Manages factories for Handler plugins that implement ArtifactResolutionService functionality.
212          */
213         xmltooling::PluginManager< Handler,std::string,std::pair<const xercesc::DOMElement*,const char*> > ArtifactResolutionServiceManager;
214
215         /**
216          * Manages factories for Handler plugins that implement AssertionConsumerService functionality.
217          */
218         xmltooling::PluginManager< Handler,std::string,std::pair<const xercesc::DOMElement*,const char*> > AssertionConsumerServiceManager;
219
220         /**
221          * Manages factories for Handler plugins that implement customized functionality.
222          */
223         xmltooling::PluginManager< Handler,std::string,std::pair<const xercesc::DOMElement*,const char*> > HandlerManager;
224
225         /**
226          * Manages factories for ListenerService plugins.
227          */
228         xmltooling::PluginManager<ListenerService,std::string,const xercesc::DOMElement*> ListenerServiceManager;
229
230         /**
231          * Manages factories for Handler plugins that implement ManageNameIDService functionality.
232          */
233         xmltooling::PluginManager< Handler,std::string,std::pair<const xercesc::DOMElement*,const char*> > ManageNameIDServiceManager;
234
235         /**
236          * Manages factories for RequestMapper plugins.
237          */
238         xmltooling::PluginManager<RequestMapper,std::string,const xercesc::DOMElement*> RequestMapperManager;
239
240         /**
241          * Manages factories for ServiceProvider plugins.
242          */
243         xmltooling::PluginManager<ServiceProvider,std::string,const xercesc::DOMElement*> ServiceProviderManager;
244
245         /**
246          * Manages factories for SessionCache plugins.
247          */
248         xmltooling::PluginManager<SessionCache,std::string,const xercesc::DOMElement*> SessionCacheManager;
249
250         /**
251          * Manages factories for Handler plugins that implement SessionInitiator functionality.
252          */
253         xmltooling::PluginManager< SessionInitiator,std::string,std::pair<const xercesc::DOMElement*,const char*> > SessionInitiatorManager;
254
255         /**
256          * Manages factories for Handler plugins that implement SingleLogoutService functionality.
257          */
258         xmltooling::PluginManager< Handler,std::string,std::pair<const xercesc::DOMElement*,const char*> > SingleLogoutServiceManager;
259
260     protected:
261         SPConfig() : attribute_value_delimeter(';'), m_serviceProvider(NULL),
262 #ifndef SHIBSP_LITE
263             m_artifactResolver(NULL),
264 #endif
265             m_features(0) {}
266         
267         /** Global ServiceProvider instance. */
268         ServiceProvider* m_serviceProvider;
269
270 #ifndef SHIBSP_LITE
271         /** Global ArtifactResolver instance. */
272         opensaml::MessageDecoder::ArtifactResolver* m_artifactResolver;
273 #endif
274
275     private:
276         unsigned long m_features;
277     };
278
279 #if defined (_MSC_VER)
280     #pragma warning( pop )
281 #endif
282
283 };
284
285 #endif /* __shibsp_config_h__ */