/*
- * The Shibboleth License, Version 1.
- * Copyright (c) 2002
- * University Corporation for Advanced Internet Development, Inc.
- * All rights reserved
+ * 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
*
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
+ * http://www.apache.org/licenses/LICENSE-2.0
*
- * Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution, if any, must include
- * the following acknowledgment: "This product includes software developed by
- * the University Corporation for Advanced Internet Development
- * <http://www.ucaid.edu>Internet2 Project. Alternately, this acknowledegement
- * may appear in the software itself, if and wherever such third-party
- * acknowledgments normally appear.
- *
- * Neither the name of Shibboleth nor the names of its contributors, nor
- * Internet2, nor the University Corporation for Advanced Internet Development,
- * Inc., nor UCAID may be used to endorse or promote products derived from this
- * software without specific prior written permission. For written permission,
- * please contact shibboleth@shibboleth.org
- *
- * Products derived from this software may not be called Shibboleth, Internet2,
- * UCAID, or the University Corporation for Advanced Internet Development, nor
- * may Shibboleth appear in their name, without prior written permission of the
- * University Corporation for Advanced Internet Development.
- *
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND WITH ALL FAULTS. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE, AND NON-INFRINGEMENT ARE DISCLAIMED AND THE ENTIRE RISK
- * OF SATISFACTORY QUALITY, PERFORMANCE, ACCURACY, AND EFFORT IS WITH LICENSEE.
- * IN NO EVENT SHALL THE COPYRIGHT OWNER, CONTRIBUTORS OR THE UNIVERSITY
- * CORPORATION FOR ADVANCED INTERNET DEVELOPMENT, INC. BE LIABLE FOR ANY DIRECT,
- * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 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.
*/
/*
#ifndef SHIB_TARGET_H
#define SHIB_TARGET_H
-#ifdef __cplusplus
-# include <saml/saml.h>
-# include <shib/shib.h>
-# include <shib/shib-threads.h>
-#endif
+// New headers
+#include <shibsp/Application.h>
+#include <shibsp/Handler.h>
+#include <shibsp/RequestMapper.h>
+#include <shibsp/ServiceProvider.h>
+#include <shibsp/SessionCache.h>
+#include <shibsp/remoting/ListenerService.h>
+
+// Old headers
+#include <saml/saml.h>
+#include <shib/shib.h>
#ifdef WIN32
# ifndef SHIBTARGET_EXPORTS
# define SHIBTARGET_EXPORTS __declspec(dllimport)
# endif
+# define SHIB_SCHEMAS "/opt/shibboleth-sp/share/xml/shibboleth"
+# define SHIB_CONFIG "/opt/shibboleth-sp/etc/shibboleth/shibboleth.xml"
#else
+# include <shib-target/shib-paths.h>
# define SHIBTARGET_EXPORTS
#endif
-#include <shib-target/shibrpc.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#ifdef WIN32
-
-#include <winsock.h>
-typedef SOCKET ShibSocket;
-#define SHIB_SHAR_SOCKET "127.0.0.1:12345" /* TCP host:port */
-
-#else /* UNIX */
-
-typedef int ShibSocket;
-#define SHIB_SHAR_SOCKET "/tmp/shar-socket" /* Unix domain socket */
-
-#endif
-
-/* shib-rpcutil.c */
-
-/* Create an RPC Client handle for the _connected_ socket sock, attaching
- * the RPC program and version.
- *
- * returns a CLIENT on success, or NULL on error. The caller can
- * call clnt_pcreateerror ("<string>") to output an error message from
- * the RPC library.
- */
-SHIBTARGET_EXPORTS CLIENT * shibrpc_client_create (ShibSocket sock, u_long program, u_long version);
-
-/* shib-sock.c */
-
-/* Create a new socket and put it into sock.
- *
- * Returns 0 on success, non-zero on error
- */
-SHIBTARGET_EXPORTS int shib_sock_create (ShibSocket *sock);
-
-/*
- * bind the socket s to the "port" name.
- *
- * Returns 0 on success; non-zero on error.
- *
- * SIDE EFFECT: On error, the socket is closed!
- */
-SHIBTARGET_EXPORTS int shib_sock_bind (ShibSocket s, const char* name);
-
-/*
- * connect the socket s to the "port" name on the local host.
- *
- * Returns 0 on success; non-zero on error.
- */
-SHIBTARGET_EXPORTS int shib_sock_connect (ShibSocket s, const char* name);
-
-/*
- * accept a connection. Returns 0 on success, non-zero on failure.
- */
-SHIBTARGET_EXPORTS int shib_sock_accept (ShibSocket listener, ShibSocket* s);
-
-/*
- * close the socket
- */
-SHIBTARGET_EXPORTS void shib_sock_close (ShibSocket s, const char* name);
-
-/* shib-target.cpp */
-
-/* application names */
-#define SHIBTARGET_GENERAL "general"
-#define SHIBTARGET_SHAR "shar"
-#define SHIBTARGET_SHIRE "shire"
-#define SHIBTARGET_RM "rm"
-#define SHIBTARGET_POLICIES "policies"
-
-/* configuration tags */
-#define SHIBTARGET_TAG_LOGGER "logger"
-#define SHIBTARGET_TAG_SCHEMAS "schemadir"
-#define SHIBTARGET_TAG_CERTFILE "certfile"
-#define SHIBTARGET_TAG_KEYFILE "keyfile"
-#define SHIBTARGET_TAG_KEYPASS "keypass"
-#define SHIBTARGET_TAG_CALIST "calist"
-
-#define SHIBTARGET_TAG_AATIMEOUT "AATimeout"
-#define SHIBTARGET_TAG_AACONNECTTO "AAConnectTimeout"
-#define SHIBTARGET_TAG_SAMLCOMPAT "SAMLCompat"
-
-#define SHIBTARGET_TAG_METADATA "metadata"
-#define SHIBTARGET_TAG_TRUST "trust"
-#define SHIBTARGET_TAG_CREDS "credentials"
-#define SHIBTARGET_TAG_AAP "aap"
-#define SHIBTARGET_TAG_APPMAPPER "applicationMap"
-
-#define SHIBTARGET_TAG_DEFAULTLIFE "defaultLife"
-
-#define SHIBTARGET_TAG_CACHETYPE "cacheType"
-#define SHIBTARGET_TAG_CACHECLEAN "cacheClean"
-#define SHIBTARGET_TAG_CACHETIMEOUT "cacheTimeout"
-
-#define SHIBTARGET_TAG_REQATTRS "requestAttributes"
-
-/* initialize and finalize the target library (return 0 on success, 1 on failure) */
-SHIBTARGET_EXPORTS int shib_target_initialize (const char* application, const char* ini_file);
-SHIBTARGET_EXPORTS void shib_target_finalize (void);
-
-/* access socket specifics from C code */
-SHIBTARGET_EXPORTS const char* shib_target_sockname(void);
-SHIBTARGET_EXPORTS const char* shib_target_sockacl(unsigned int index);
-
-#ifdef __cplusplus
-}
-
-
namespace shibtarget {
- class RPCHandleInternal;
- class SHIBTARGET_EXPORTS RPCHandle
- {
- public:
- RPCHandle(const char* shar, u_long program, u_long version);
- ~RPCHandle();
-
- CLIENT * connect(void); /* locks the HANDLE and returns the CLIENT */
- void release(void); /* unlocks the HANDLE */
- void disconnect(void); /* disconnects */
-
- // A simple function to get a handle
- // Note that it does not check that an existing handle matches the request.
- static RPCHandle* get_handle(shibboleth::ThreadKey* key,
- const char* shar, u_long program,
- u_long version);
-
- private:
- RPCHandleInternal *m_priv;
- };
-
- class SHIBTARGET_EXPORTS ShibTargetException : public std::exception
- {
- public:
- explicit ShibTargetException() : m_origin(NULL), m_code(SHIBRPC_OK) {}
- explicit ShibTargetException(ShibRpcStatus code, const char* msg, const XMLCh* origin = NULL)
- : m_code(code), m_origin(XMLString::replicate(origin)) { if (msg) m_msg=msg; }
- explicit ShibTargetException(ShibRpcStatus code, const std::string& msg, const XMLCh* origin = NULL)
- : m_code(code), m_msg(msg), m_origin(XMLString::replicate(origin)) {}
- ShibTargetException(const ShibTargetException& src)
- : m_code(src.m_code), m_msg(src.m_msg), m_origin(XMLString::replicate(src.m_origin)) {}
+
+ // Abstract APIs for access to configuration information
- virtual ~ShibTargetException() throw () { if (m_origin) XMLString::release(&m_origin); }
- virtual const char* what() const throw () { return (m_msg.c_str()); }
- virtual ShibRpcStatus which() const throw () { return (m_code); }
- virtual const XMLCh* where() const throw () { return m_origin; }
-
- private:
- ShibRpcStatus m_code;
- std::string m_msg;
- XMLCh* m_origin;
- };
-
- class RPCErrorPriv;
- class SHIBTARGET_EXPORTS RPCError
- {
- public:
- RPCError() { init(0, "", NULL); }
- RPCError(ShibRpcError* error);
- RPCError(int s, char const* st, const XMLCh* orig = NULL) { init (s,st,orig); }
- RPCError(ShibTargetException &exp) { init(exp.which(), exp.what(), exp.where()); }
- ~RPCError();
-
- bool isError();
- bool isRetryable();
-
- // Return a set of strings that corresponds to the type, text, and desc
- const char* getType();
- const char* getText();
- const char* getDesc();
- std::string getOriginErrorURL();
- std::string getOriginContactName();
- std::string getOriginContactEmail();
- int getCode();
-
- private:
- void init(int stat, char const* msg, const XMLCh* origin);
- RPCErrorPriv* m_priv;
- };
-
- // The ShibTargetError is used by the high-level SHIRE and RM methods
- // to notify the handlers of high-level errors.
-
- class ShibMLPPriv;
- class SHIBTARGET_EXPORTS ShibMLP {
- public:
- ShibMLP();
- ~ShibMLP();
-
- void insert (const std::string& key, const std::string& value);
- void insert (const std::string& key, const char* value) {
- std::string v = value;
- insert (key, v);
- }
- void insert (const char* key, const std::string& value) {
- std::string k = key;
- insert (k, value);
- }
- void insert (const char* key, const char* value) {
- std::string k = key, v = value;
- insert(k,v);
- }
- void insert (RPCError& e);
-
- void clear () { m_map.clear(); }
-
- std::string run (std::istream& s) const;
- std::string run (const std::string& input) const;
- std::string run (const char* input) const {
- std::string i = input;
- return run(i);
- }
-
- private:
- ShibMLPPriv *m_priv;
- std::map<std::string,std::string> m_map;
- };
+ /**
+ * Interface to Shibboleth Applications, which exposes most of the functionality
+ * required to process web requests or security protocol messages for resources
+ * associated with them.
+ *
+ * Applications are implementation-specific, but generally correspond to collections
+ * of resources related to one another in logical ways, such as a virtual host or
+ * a Java servlet context. Most complex configuration data is associated with an
+ * Application. Implementations should always expose an application named "default"
+ * as a last resort.
+ */
+ struct SHIBTARGET_EXPORTS IApplication : public virtual shibsp::Application,
+ public virtual shibboleth::ShibBrowserProfile::ITokenValidator
+ {
+ // caller is borrowing object, must use within scope of config lock
+ virtual const saml::SAMLBrowserProfile* getBrowserProfile() const=0;
+ virtual const saml::SAMLBinding* getBinding(const XMLCh* binding) const=0;
+
+ // caller is given ownership of object, must use and delete within scope of config lock
+ virtual saml::SAMLBrowserProfile::ArtifactMapper* getArtifactMapper() const=0;
+
+ // general token validation based on conditions, signatures, etc.
+ virtual void validateToken(
+ saml::SAMLAssertion* token,
+ time_t t=0,
+ const opensaml::saml2md::RoleDescriptor* role=NULL,
+ const xmltooling::TrustEngine* trust=NULL
+ ) const=0;
- class SHIBTARGET_EXPORTS ShibTargetResponse
- {
- public:
- // What to do with the response
- enum ReturnValue {
- OK = 0,
- DECLINED,
- REDIRECT,
- INTERNAL_ERROR
+ virtual ~IApplication() {}
};
- // How to log the message, if any. (NONE implies no log_msg)
- enum LogLevel {
- NONE = 0,
- DEBUG,
- INFO,
- ERR,
- CRIT
+ /**
+ * OpenSAML binding hook
+ *
+ * Instead of wrapping the binding to deal with mutual authentication, we
+ * just use the HTTP hook functionality offered by OpenSAML. The hook will
+ * register "itself" as a globalCtx pointer with the SAML binding and the caller
+ * will declare and pass the embedded struct as callCtx for use by the hook.
+ */
+ class ShibHTTPHook : virtual public saml::SAMLSOAPHTTPBinding::HTTPHook
+ {
+ public:
+ ShibHTTPHook(const xmltooling::TrustEngine* trust) : m_trust(trust) {}
+ virtual ~ShibHTTPHook() {}
+
+ // Only hook we need here is for outgoing connection to server.
+ virtual bool outgoing(saml::HTTPClient* conn, void* globalCtx=NULL, void* callCtx=NULL);
+
+ // Client declares a context object and pass as callCtx to send() method.
+ class ShibHTTPHookCallContext {
+ public:
+ ShibHTTPHookCallContext(const shibsp::PropertySet* credUse, const opensaml::saml2md::RoleDescriptor* role)
+ : m_credUse(credUse), m_role(role), m_hook(NULL), m_authenticated(false) {}
+ const ShibHTTPHook* getHook() {return m_hook;}
+ const shibsp::PropertySet* getCredentialUse() {return m_credUse;}
+ const opensaml::saml2md::RoleDescriptor* getRoleDescriptor() {return m_role;}
+ bool isAuthenticated() const {return m_authenticated;}
+ void setAuthenticated() {m_authenticated=true;}
+
+ private:
+ const shibsp::PropertySet* m_credUse;
+ const opensaml::saml2md::RoleDescriptor* m_role;
+ ShibHTTPHook* m_hook;
+ bool m_authenticated;
+ friend class ShibHTTPHook;
+ };
+
+ const xmltooling::TrustEngine* getTrustEngine() const {return m_trust;}
+ private:
+ const xmltooling::TrustEngine* m_trust;
};
- ReturnValue status;
- LogLevel log_level;
- bool has_mlp;
-
- std::string log_msg; // message to log if log_level != NONE
- std::string redirect_to; // where to redirect if status == REDIRECT
- ShibMLP mlp; // MLP information if has_mlp == true
- };
-
- class SHIBTARGET_EXPORTS ShibTargetError : public std::exception
- {
- public:
- explicit ShibTargetError(ShibTargetResponse *resp = NULL) { m_resp = resp; }
- virtual ~ShibTargetError() throw () { if (m_resp) delete m_resp; }
- virtual const ShibTargetResponse* getError() { return m_resp; }
-
- private:
- ShibTargetResponse *m_resp;
- };
-
- class SHIBTARGET_EXPORTS SHIREConfig
- {
- public:
- bool checkIPAddress;
- time_t lifetime;
- time_t timeout;
- };
-
- class SHIREPriv;
- class SHIBTARGET_EXPORTS ShibINI;
- class SHIBTARGET_EXPORTS SHIRE
- {
- public:
- SHIRE(RPCHandle *rpc, SHIREConfig config, const char* shire_url);
- ~SHIRE();
-
- RPCError* sessionIsValid(const char* cookie, const char* ip, const char* application_id);
- RPCError* sessionCreate(const char* post, const char* ip, const char* application_id, std::string &cookie);
-
- private:
- SHIREPriv *m_priv;
- };
-
- class SHIBTARGET_EXPORTS RMConfig
- {
- public:
- bool checkIPAddress;
- };
-
- class RMPriv;
- class SHIBTARGET_EXPORTS RM
- {
- public:
- RM(RPCHandle *rpc, RMConfig config);
- ~RM();
-
- RPCError* getAssertions(const char* cookie, const char* ip, const char* application_id,
- std::vector<saml::SAMLAssertion*> &assertions,
- saml::SAMLAuthenticationStatement **statement = NULL);
- static void serialize(saml::SAMLAssertion &assertion, std::string &result);
- private:
- RMPriv *m_priv;
- };
-
- class ShibINIPriv;
- class SHIBTARGET_EXPORTS ShibINI {
- public:
- ShibINI (std::string& file, bool case_sensitive = true) { init(file,case_sensitive); }
- ShibINI (const char *file, bool case_sensitive = true) {
- std::string f = file;
- init(f, case_sensitive);
- }
- ~ShibINI ();
-
- bool refresh(void);
-
- const std::string get (const std::string& header, const std::string& tag);
- const std::string get (const char* header, const char* tag) {
- std::string h = header, t = tag;
- return get(h,t);
- }
-
- const std::string operator() (const std::string& header, const std::string& tag) {
- return get(header,tag);
- }
- const std::string operator() (const char* header, const char* tag) {
- std::string h = header, t = tag;
- return get(h,t);
- }
-
- bool exists(const std::string& header);
- bool exists(const std::string& header, const std::string& tag);
-
- bool exists(const char* header) {
- std::string s = header;
- return exists(s);
- }
- bool exists(const char* header, const char* tag) {
- std::string h = header, t = tag;
- return exists(h,t);
- }
-
- // Special method to look for a tag in one header and maybe in the
- // 'SHIBTARGET_GENERAL' header
- bool get_tag(std::string& header, std::string& tag, bool try_general,
- std::string* result);
-
- bool get_tag(std::string& header, const char* tag, bool try_general,
- std::string* result) {
- std::string t = tag;
- return get_tag (header,t,try_general,result);
- }
-
- bool get_tag(const char* header, const char* tag, bool try_general,
- std::string* result) {
- std::string h = header, t = tag;
- return get_tag (h,t,try_general,result);
- }
-
- // Dump out the inifile to the output stream
- void dump(std::ostream& os);
-
- // Iterators
-
- // The begin() functions reset the iterator and return the first element
- // (or 0 if there are no elements.)
- // The next() functions return the next element, or 0 if there are no
- // elements left.
- //
- // Example:
- // for (const foo* current = begin(); current; current = next()) {
- // ...
- // }
- //
- // NOTE: Holding an Iterator will lock the INI file and cause it to
- // stop updating itself. You should destroy the iterator as soon as
- // you are done with it.
- //
- // ALSO NOTE: the string* returned from the Iterator is only valid
- // while you hold the iterator. You should copy the de-reference
- // of the pointer to your own copy if you want to keep the string.
+ /**
+ * Interface to a cached user session.
+ *
+ * Cache entries provide implementations with access to the raw SAML information they
+ * need to publish or provide access to the data for applications to use. All creation
+ * or access to entries is through the ISessionCache interface, and callers must unlock
+ * the entry when finished using it, rather than explicitly freeing them.
+ */
+ struct SHIBTARGET_EXPORTS ISessionCacheEntry : public virtual saml::ILockable
+ {
+ virtual const char* getClientAddress() const=0;
+ virtual const char* getProviderId() const=0;
+ virtual std::pair<const char*,const saml::SAMLSubject*> getSubject(bool xml=true, bool obj=false) const=0;
+ virtual const char* getAuthnContext() const=0;
+ virtual std::pair<const char*,const saml::SAMLResponse*> getTokens(bool xml=true, bool obj=false) const=0;
+ virtual std::pair<const char*,const saml::SAMLResponse*> getFilteredTokens(bool xml=true, bool obj=false) const=0;
+ virtual ~ISessionCacheEntry() {}
+ };
- class SHIBTARGET_EXPORTS Iterator {
- public:
- virtual ~Iterator() {}
- virtual const std::string* begin() = 0;
- virtual const std::string* next() = 0;
+ /**
+ * Interface to a sink for session cache events.
+ *
+ * All caches support registration of a backing store that can be informed
+ * of significant events in the lifecycle of a cache entry.
+ */
+ struct SHIBTARGET_EXPORTS ISessionCacheStore
+ {
+ virtual HRESULT onCreate(
+ const char* key,
+ const IApplication* application,
+ const ISessionCacheEntry* entry,
+ int majorVersion,
+ int minorVersion,
+ time_t created
+ )=0;
+ virtual HRESULT onRead(
+ const char* key,
+ std::string& applicationId,
+ std::string& clientAddress,
+ std::string& providerId,
+ std::string& subject,
+ std::string& authnContext,
+ std::string& tokens,
+ int& majorVersion,
+ int& minorVersion,
+ time_t& created,
+ time_t& accessed
+ )=0;
+ virtual HRESULT onRead(const char* key, time_t& accessed)=0;
+ virtual HRESULT onRead(const char* key, std::string& tokens)=0;
+ virtual HRESULT onUpdate(const char* key, const char* tokens=NULL, time_t lastAccess=0)=0;
+ virtual HRESULT onDelete(const char* key)=0;
+ virtual ~ISessionCacheStore() {}
};
- Iterator* header_iterator();
- Iterator* tag_iterator(const std::string& header);
+ /**
+ * Interface to the session cache.
+ *
+ * The session cache abstracts a persistent (meaning across requests) cache of
+ * instances of the ISessionCacheEntry interface. Creation of new entries and entry
+ * lookup are confined to this interface to enable implementations to flexibly
+ * remote and/or optimize calls by implementing custom versions of the
+ * ISessionCacheEntry interface as required.
+ */
+ struct SHIBTARGET_EXPORTS ISessionCache : virtual public shibsp::SessionCache
+ {
+ virtual std::string insert(
+ const IApplication* application,
+ const opensaml::saml2md::RoleDescriptor* source,
+ const char* client_addr,
+ const saml::SAMLSubject* subject,
+ const char* authnContext,
+ const saml::SAMLResponse* tokens
+ )=0;
+ virtual ISessionCacheEntry* find(
+ const char* key, const IApplication* application, const char* client_addr
+ )=0;
+ virtual void remove(
+ const char* key, const IApplication* application, const char* client_addr
+ )=0;
+
+ virtual bool setBackingStore(ISessionCacheStore* store)=0;
+ virtual ~ISessionCache() {}
+ };
- static bool boolean(std::string& value);
+ #define MEMORY_SESSIONCACHE "edu.internet2.middleware.shibboleth.sp.provider.MemorySessionCacheProvider"
+ #define MYSQL_SESSIONCACHE "edu.internet2.middleware.shibboleth.sp.provider.MySQLSessionCacheProvider"
+ #define ODBC_SESSIONCACHE "edu.internet2.middleware.shibboleth.sp.provider.ODBCSessionCacheProvider"
- private:
- ShibINIPriv *m_priv;
- void init(std::string& file, bool case_sensitive);
- };
+ #define MYSQL_REPLAYCACHE "edu.internet2.middleware.shibboleth.sp.provider.MySQLReplayCacheProvider"
+ #define ODBC_REPLAYCACHE "edu.internet2.middleware.shibboleth.sp.provider.ODBCReplayCacheProvider"
- // Abstract API to map URLs to application names
- struct SHIBTARGET_EXPORTS IApplicationMapper : public virtual shibboleth::ILockable
- {
- virtual const char* getApplicationFromURL(const char* url) const=0;
- virtual const XMLCh* getXMLChApplicationFromURL(const char* url) const=0;
- virtual const char* getApplicationFromParsedURL(
- const char* scheme, const char* hostname, unsigned int port, const char* path=NULL
- ) const=0;
- virtual const XMLCh* getXMLChApplicationFromParsedURL(
- const char* scheme, const char* hostname, unsigned int port, const char* path=NULL
- ) const=0;
- virtual ~IApplicationMapper() {}
- };
- // A helper class to wrap the lock/unlock sequence.
- class SHIBTARGET_EXPORTS ApplicationMapper
+ class SHIBTARGET_EXPORTS ShibTargetConfig
{
public:
- ApplicationMapper();
- ~ApplicationMapper() {if (m_mapper) m_mapper->unlock();}
- const IApplicationMapper* operator->() const {return m_mapper;}
- operator const IApplicationMapper*() const {return m_mapper;}
+ ShibTargetConfig() {}
+ virtual ~ShibTargetConfig() {}
- private:
- ApplicationMapper(const ApplicationMapper&);
- void operator=(const ApplicationMapper&);
- IApplicationMapper* m_mapper;
+ virtual bool init(const char* schemadir) = 0;
+ virtual bool load(const char* config) = 0;
+ virtual void shutdown() = 0;
+
+ static ShibTargetConfig& getConfig();
};
-
- class SHIBTARGET_EXPORTS ShibTargetConfig
- {
- public:
- static void preinit();
- static ShibTargetConfig& init(const char* app_name, const char* inifile);
- static ShibTargetConfig& getConfig();
- virtual void init() = 0;
- virtual void shutdown() = 0;
- virtual shibtarget::ShibINI& getINI() const = 0;
- virtual IApplicationMapper* getApplicationMapper() const = 0;
- virtual saml::Iterator<shibboleth::IMetadata*> getMetadataProviders() const = 0;
- virtual saml::Iterator<shibboleth::ITrust*> getTrustProviders() const = 0;
- virtual saml::Iterator<shibboleth::ICredentials*> getCredentialProviders() const = 0;
- virtual saml::Iterator<shibboleth::IAAP*> getAAPProviders() const = 0;
- virtual ~ShibTargetConfig() {}
- };
-} // namespace
-#endif
+}
#endif /* SHIB_TARGET_H */