https://issues.shibboleth.net/jira/browse/SSPCPP-349
[shibboleth/cpp-sp.git] / shibsp / handler / SessionInitiator.h
index bd0ae6b..3643aef 100644 (file)
@@ -1,17 +1,21 @@
-/*
- *  Copyright 2001-2007 Internet2
- * 
- * 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
+/**
+ * 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.
+ *
+ * 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.
  */
 
 /**
  * Pluggable runtime functionality that handles initiating sessions.
  */
 
-#ifndef __shibsp_initiator_h__
-#define __shibsp_initiator_h__
+#ifndef __shibsp_sesinitiator_h__
+#define __shibsp_sesinitiator_h__
 
 #include <shibsp/handler/Handler.h>
 
+#include <map>
+#include <set>
+#include <string>
+
 namespace shibsp {
 
+    class SHIBSP_API AuthnRequestEvent;
+
     /**
      * Pluggable runtime functionality that handles initiating sessions.
      *
@@ -35,11 +45,50 @@ namespace shibsp {
      */
     class SHIBSP_API SessionInitiator : public virtual Handler
     {
+        friend void SHIBSP_API registerSessionInitiators();
     protected:
-        SessionInitiator() {}
+        /** Property remapper for configuration compatibility. */
+        static std::map<std::string,std::string> m_remapper;
+
+        /** Set of optional settings supported by handler. */
+        std::set<std::string> m_supportedOptions;
+
+        SessionInitiator();
+
+        /**
+         * Examines the request and applicable settings to determine whether
+         * the handler is able to support the request.
+         * <p>If the handler is within a chain, the method will return false,
+         * otherwise an exception will be raised.
+         *
+         * @param request   SP request context
+         * @param isHandler true iff executing in the context of a direct handler invocation
+         * @return  true iff the request appears to be compatible
+         */
+        bool checkCompatibility(SPRequest& request, bool isHandler) const;
+
+#ifndef SHIBSP_LITE
+        /**
+         * Creates a new AuthnRequestEvent for the event log.
+         *
+         * @param application   the Application associated with the event
+         * @param request       the HTTP client request associated with the event, or nullptr
+         * @return  a fresh AuthnRequestEvent, prepopulated by the input parameters, or nullptr if an error occurs
+         */
+        virtual AuthnRequestEvent* newAuthnRequestEvent(
+            const Application& application, const xmltooling::HTTPRequest* request=nullptr
+            ) const;
+#endif
 
     public:
-        virtual ~SessionInitiator() {}
+        virtual ~SessionInitiator();
+
+        /**
+         * Indicates the set of optional settings supported by the handler.
+         *
+         * @return  a set of the optional settings supported
+         */
+        virtual const std::set<std::string>& getSupportedOptions() const;
 
         /**
          * Executes an incoming request.
@@ -57,9 +106,8 @@ namespace shibsp {
         std::pair<bool,long> run(SPRequest& request, bool isHandler=true) const;
 
 #ifndef SHIBSP_LITE
-        const char* getType() const {
-            return "SessionInitiator";
-        }
+        const char* getType() const;
+        void generateMetadata(opensaml::saml2md::SPSSODescriptor& role, const char* handlerURL) const;
 #endif
     };
     
@@ -86,6 +134,9 @@ namespace shibsp {
 
     /** SessionInitiator that uses HTML form submission from the user. */
     #define FORM_SESSION_INITIATOR "Form"
+
+    /** SessionInitiator that reads the CDC. */
+    #define COOKIE_SESSION_INITIATOR "Cookie"
 };
 
-#endif /* __shibsp_initiator_h__ */
+#endif /* __shibsp_sesinitiator_h__ */