Add init/term methods.
[shibboleth/resolver.git] / shibresolver / resolver.cpp
index dbe3968..f8acdc7 100644 (file)
 
 #include "internal.h"
 
+#include <shibsp/ServiceProvider.h>
+#include <shibsp/attribute/Attribute.h>
+#include <shibsp/remoting/ListenerService.h>
+
+using namespace shibresolver;
 using namespace shibsp;
 #ifndef SHIBSP_LITE
 using namespace opensaml;
@@ -29,9 +34,121 @@ using namespace opensaml;
 using namespace xmltooling;
 using namespace std;
 
+namespace shibresolver {
+    class SHIBRESOLVER_DLLLOCAL RemotedResolver : public Remoted {
+    public:
+        RemotedResolver() {}
+        ~RemotedResolver() {}
+
+        void receive(DDF& in, ostream& out);
+    };
+
+    static RemotedResolver g_Remoted;
+};
+
+ShibbolethResolver* ShibbolethResolver::create()
+{
+    return new ShibbolethResolver();
+}
+
+ShibbolethResolver::ShibbolethResolver()
+{
+}
+
+ShibbolethResolver::~ShibbolethResolver()
+{
+    for_each(m_resolvedAttributes.begin(), m_resolvedAttributes.end(), xmltooling::cleanup<Attribute>());
+    if (m_mapper)
+        m_mapper->unlock();
+    if (m_sp)
+        m_sp->unlock();
+}
+
+void ShibbolethResolver::setServiceURI(const char* uri)
+{
+    m_serviceURI.erase();
+    if (uri)
+        m_serviceURI = uri;
+}
+
+void ShibbolethResolver::setApplicationID(const char* appID)
+{
+    m_appID.erase();
+    if (appID)
+        m_appID = appID;
+}
+
+void ShibbolethResolver::setIssuer(const char* issuer)
+{
+    m_issuer.erase();
+    if (issuer)
+        m_issuer = issuer;
+}
+
+void ShibbolethResolver::addToken(
+#ifdef SHIBSP_LITE
+        const XMLObject* token
+#else
+        const saml2::Assertion* token
+#endif
+    )
+{
+    if (token)
+        m_tokens.push_back(token);
+}
+
+void ShibbolethResolver::addAttribute(Attribute* attr)
+{
+    if (attr)
+        m_inputAttributes.push_back(attr);
+}
+
+vector<Attribute*>& ShibbolethResolver::getResolvedAttributes()
+{
+    return m_resolvedAttributes;
+}
+
+RequestMapper::Settings ShibbolethResolver::getSettings() const
+{
+    return m_settings;
+}
+
+void ShibbolethResolver::resolve()
+{
+}
+
+void RemotedResolver::receive(DDF& in, ostream& out)
+{
+}
+
+bool ShibbolethResolver::init(unsigned long features, const char* config, bool rethrow)
+{
+    SPConfig::getConfig().setFeatures(features | SPConfig::AttributeResolution | SPConfig::Metadata | SPConfig::Trust);
+    if (!SPConfig::getConfig().init())
+        return false;
+    if (!SPConfig::getConfig().instantiate(config, rethrow))
+        return false;
+    return true;
+}
+
+/**
+    * Shuts down runtime.
+    *
+    * Each process using the library SHOULD call this function exactly once before terminating itself.
+    */
+void ShibbolethResolver::term()
+{
+    SPConfig::getConfig().term();
+}
+
+
 extern "C" int SHIBRESOLVER_EXPORTS xmltooling_extension_init(void*)
 {
-    // Register factory functions with appropriate plugin managers in the XMLTooling/SAML/SPConfig objects.
+#ifdef SHIBRESOLVER_SHIBSP_HAS_REMOTING
+    SPConfig& conf = SPConfig::getConfig();
+    if (conf.isEnabled(SPConfig::OutOfProcess) && !conf.isEnabled(SPConfig::InProcess) && conf.isEnabled(SPConfig::Listener))
+        conf.getServiceProvider()->regListener("org.project-moonshot.shibresolver", &g_Remoted);
+#endif
     return 0;   // signal success
 }