Copied over mapping and filtering schemas.
[shibboleth/sp.git] / shibsp / impl / XMLServiceProvider.cpp
index aba398c..ea3f662 100644 (file)
@@ -30,6 +30,7 @@
 #include "SPConfig.h"\r
 #include "SPRequest.h"\r
 #include "TransactionLog.h"\r
+#include "attribute/resolver/AttributeExtractor.h"\r
 #include "attribute/resolver/AttributeResolver.h"\r
 #include "handler/SessionInitiator.h"\r
 #include "remoting/ListenerService.h"\r
@@ -86,12 +87,12 @@ namespace {
         TrustEngine* getTrustEngine() const {\r
             return (!m_trust && m_base) ? m_base->getTrustEngine() : m_trust;\r
         }\r
+        AttributeExtractor* getAttributeExtractor() const {\r
+            return (!m_attrExtractor && m_base) ? m_base->getAttributeExtractor() : m_attrExtractor;\r
+        }\r
         AttributeResolver* getAttributeResolver() const {\r
             return (!m_attrResolver && m_base) ? m_base->getAttributeResolver() : m_attrResolver;\r
         }\r
-        const set<string>* getAttributeIds() const {\r
-            return (m_attributeIds.empty() && m_base) ? m_base->getAttributeIds() : (m_attributeIds.empty() ? NULL : &m_attributeIds);\r
-        }\r
         CredentialResolver* getCredentialResolver() const {\r
             return (!m_credResolver && m_base) ? m_base->getCredentialResolver() : m_credResolver;\r
         }\r
@@ -118,10 +119,10 @@ namespace {
         string m_hash;\r
         MetadataProvider* m_metadata;\r
         TrustEngine* m_trust;\r
+        AttributeExtractor* m_attrExtractor;\r
         AttributeResolver* m_attrResolver;\r
         CredentialResolver* m_credResolver;\r
         vector<const XMLCh*> m_audiences;\r
-        set<string> m_attributeIds;\r
 \r
         // manage handler objects\r
         vector<Handler*> m_handlers;\r
@@ -287,6 +288,8 @@ namespace {
     static const XMLCh _Application[] =         UNICODE_LITERAL_11(A,p,p,l,i,c,a,t,i,o,n);\r
     static const XMLCh Applications[] =         UNICODE_LITERAL_12(A,p,p,l,i,c,a,t,i,o,n,s);\r
     static const XMLCh _ArtifactMap[] =         UNICODE_LITERAL_11(A,r,t,i,f,a,c,t,M,a,p);\r
+    static const XMLCh _AttributeExtractor[] =  UNICODE_LITERAL_18(A,t,t,r,i,b,u,t,e,E,x,t,r,a,c,t,o,r);\r
+    static const XMLCh _AttributeFilter[] =     UNICODE_LITERAL_15(A,t,t,r,i,b,u,t,e,F,i,l,t,e,r);\r
     static const XMLCh _AttributeResolver[] =   UNICODE_LITERAL_17(A,t,t,r,i,b,u,t,e,R,e,s,o,l,v,e,r);\r
     static const XMLCh _CredentialResolver[] =  UNICODE_LITERAL_18(C,r,e,d,e,n,t,i,a,l,R,e,s,o,l,v,e,r);\r
     static const XMLCh DefaultRelyingParty[] =  UNICODE_LITERAL_19(D,e,f,a,u,l,t,R,e,l,y,i,n,g,P,a,r,t,y);\r
@@ -338,8 +341,8 @@ XMLApplication::XMLApplication(
     const ServiceProvider* sp,\r
     const DOMElement* e,\r
     const XMLApplication* base\r
-    ) : m_sp(sp), m_base(base), m_metadata(NULL), m_trust(NULL), m_attrResolver(NULL), m_credResolver(NULL),\r
-        m_partyDefault(NULL), m_sessionInitDefault(NULL), m_acsDefault(NULL)\r
+    ) : m_sp(sp), m_base(base), m_metadata(NULL), m_trust(NULL), m_attrExtractor(NULL), m_attrResolver(NULL),\r
+        m_credResolver(NULL), m_partyDefault(NULL), m_sessionInitDefault(NULL), m_acsDefault(NULL)\r
 {\r
 #ifdef _DEBUG\r
     xmltooling::NDC ndc("XMLApplication");\r
@@ -360,25 +363,6 @@ XMLApplication::XMLApplication(
         m_hash+=getString("entityID").second;\r
         m_hash=samlConf.hashSHA1(m_hash.c_str(), true);\r
 \r
-        pair<bool,const char*> attributes = getString("attributeIds");\r
-        if (attributes.first) {\r
-            char* dup = strdup(attributes.second);\r
-            char* pos;\r
-            char* start = dup;\r
-            while (start && *start) {\r
-                while (*start && isspace(*start))\r
-                    start++;\r
-                if (!*start)\r
-                    break;\r
-                pos = strchr(start,' ');\r
-                if (pos)\r
-                    *pos=0;\r
-                m_attributeIds.insert(start);\r
-                start = pos ? pos+1 : NULL;\r
-            }\r
-            free(dup);\r
-        }\r
-\r
         const PropertySet* sessions = getPropertySet("Sessions");\r
 \r
         // Process handlers.\r
@@ -526,6 +510,18 @@ XMLApplication::XMLApplication(
         }\r
 \r
         if (conf.isEnabled(SPConfig::AttributeResolution)) {\r
+            child = XMLHelper::getFirstChildElement(e,_AttributeExtractor);\r
+            if (child) {\r
+                auto_ptr_char type(child->getAttributeNS(NULL,_type));\r
+                log.info("building AttributeExtractor of type %s...",type.get());\r
+                try {\r
+                    m_attrExtractor = conf.AttributeExtractorManager.newPlugin(type.get(),child);\r
+                }\r
+                catch (exception& ex) {\r
+                    log.crit("error building AttributeExtractor: %s", ex.what());\r
+                }\r
+            }\r
+\r
             child = XMLHelper::getFirstChildElement(e,_AttributeResolver);\r
             if (child) {\r
                 auto_ptr_char type(child->getAttributeNS(NULL,_type));\r
@@ -596,6 +592,7 @@ void XMLApplication::cleanup()
     for_each(m_handlers.begin(),m_handlers.end(),xmltooling::cleanup<Handler>());\r
     delete m_credResolver;\r
     delete m_attrResolver;\r
+    delete m_attrExtractor;\r
     delete m_trust;\r
     delete m_metadata;\r
 }\r
@@ -617,6 +614,8 @@ short XMLApplication::acceptNode(const DOMNode* node) const
         XMLString::equals(name,_MetadataProvider) ||\r
         XMLString::equals(name,_TrustEngine) ||\r
         XMLString::equals(name,_CredentialResolver) ||\r
+        XMLString::equals(name,_AttributeFilter) ||\r
+        XMLString::equals(name,_AttributeExtractor) ||\r
         XMLString::equals(name,_AttributeResolver))\r
         return FILTER_REJECT;\r
 \r