Change audience handling and validators to separate out entityID.
[shibboleth/sp.git] / shibsp / Application.h
index 7f67005..9660e7a 100644 (file)
 #define __shibsp_app_h__
 
 #include <shibsp/util/PropertySet.h>
-#include <saml/saml2/metadata/MetadataProvider.h>
-#include <xmltooling/security/CredentialResolver.h>
-#include <xmltooling/security/TrustEngine.h>
+
+#include <set>
+#ifndef SHIBSP_LITE
+# include <saml/binding/MessageEncoder.h>
+# include <saml/saml2/metadata/MetadataProvider.h>
+# include <xmltooling/security/CredentialResolver.h>
+# include <xmltooling/security/TrustEngine.h>
+#endif
+#include <xmltooling/io/HTTPRequest.h>
+#include <xmltooling/util/Threads.h>
 
 namespace shibsp {
     
+#ifndef SHIBSP_LITE
     class SHIBSP_API AttributeExtractor;
     class SHIBSP_API AttributeFilter;
     class SHIBSP_API AttributeResolver;
+#endif
+    class SHIBSP_API Attribute;
     class SHIBSP_API Handler;
     class SHIBSP_API ServiceProvider;
     class SHIBSP_API SessionInitiator;
+    class SHIBSP_API SPRequest;
+
+#if defined (_MSC_VER)
+    #pragma warning( push )
+    #pragma warning( disable : 4251 )
+#endif
 
     /**
      * Interface to a Shibboleth Application instance.
@@ -44,31 +60,53 @@ namespace shibsp {
      * of session management and policy.
      */
     class SHIBSP_API Application : public virtual PropertySet
+#ifndef SHIBSP_LITE
+        ,public virtual opensaml::MessageEncoder::ArtifactGenerator
+#endif
     {
         MAKE_NONCOPYABLE(Application);
     protected:
-        Application() {}
+        /**
+         * Constructor.
+         *
+         * @param sp    parent ServiceProvider instance
+         */
+        Application(const ServiceProvider* sp);
+        
+        /** Pointer to parent SP instance. */
+        const ServiceProvider* m_sp;
+
+        /** Shared lock for manipulating application state. */
+        mutable xmltooling::RWLock* m_lock;
+
+        /** Pairs of raw and normalized CGI header names to clear. */
+        mutable std::vector< std::pair<std::string,std::string> > m_unsetHeaders;
+
     public:
-        virtual ~Application() {}
+        virtual ~Application();
 
         /**
          * Returns the owning ServiceProvider instance.
          *
          * @return a locked ServiceProvider
          */
-        virtual const ServiceProvider& getServiceProvider() const=0;
+        const ServiceProvider& getServiceProvider() const {
+            return *m_sp;
+        }
 
         /**
          * Returns the Application's ID.
          * 
          * @return  the ID
          */        
-        virtual const char* getId() const=0;
+        virtual const char* getId() const {
+            return getString("id").second;
+        }
 
         /**
          * Returns a unique hash for the Application.
          * 
-         * @return a value resulting from a hash of the Application's ID  
+         * @return a value resulting from a computation over the Application's configuration
          */
         virtual const char* getHash() const=0;
 
@@ -80,6 +118,7 @@ namespace shibsp {
          */
         virtual std::pair<std::string,const char*> getCookieNameProps(const char* prefix) const;
 
+#ifndef SHIBSP_LITE
         /**
          * Returns a MetadataProvider for use with this Application.
          * 
@@ -133,6 +172,38 @@ namespace shibsp {
         virtual const PropertySet* getRelyingParty(const opensaml::saml2md::EntityDescriptor* provider) const=0;
 
         /**
+         * Returns any additional audience values associated with this Application.
+         * 
+         * @return additional audience values associated with the Application, or NULL
+         */
+        virtual const std::vector<const XMLCh*>* getAudiences() const=0;
+#endif
+
+        /**
+         * Returns the designated notification URL, or an empty string if no more locations are specified.
+         *
+         * @param request   requested URL to use to fill in missing pieces of notification URL
+         * @param front     true iff front channel notification is desired, false iff back channel is desired
+         * @param index     zero-based index of URL to return
+         * @return  the designated URL, or an empty string
+         */
+        virtual std::string getNotificationURL(const char* request, bool front, unsigned int index) const=0;
+
+        /**
+         * Returns an array of attribute IDs to use as a REMOTE_USER value, in order of preference.
+         *
+         * @return  an array of attribute IDs, possibly empty
+         */
+        virtual const std::vector<std::string>& getRemoteUserAttributeIds() const=0;
+
+        /**
+         * Clears any headers that may be used to hold attributes after export.
+         *
+         * @param request   SP request to clear
+         */
+        virtual void clearAttributeHeaders(SPRequest& request) const;
+
+        /**
          * Returns the default SessionInitiator when automatically requesting a session.
          * 
          * @return the default SessionInitiator, or NULL
@@ -146,7 +217,7 @@ namespace shibsp {
          * @return the designated SessionInitiator, or NULL
          */
         virtual const SessionInitiator* getSessionInitiatorById(const char* id) const=0;
-        
+
         /**
          * Returns the default AssertionConsumerService Handler
          * for use in AuthnRequest messages.
@@ -183,12 +254,17 @@ namespace shibsp {
         virtual const Handler* getHandler(const char* path) const=0;
 
         /**
-         * Returns the set of audience values associated with this Application.
-         * 
-         * @return set of audience values associated with the Application
+         * Returns all registered Handlers.
+         *
+         * @param handlers  array to populate
          */
-        virtual const std::vector<const XMLCh*>& getAudiences() const=0;
+        virtual void getHandlers(std::vector<const Handler*>& handlers) const=0;
     };
+
+#if defined (_MSC_VER)
+    #pragma warning( pop )
+#endif
+
 };
 
 #endif /* __shibsp_app_h__ */