Support for application-specific attribute IDs.
[shibboleth/sp.git] / shibsp / impl / XMLServiceProvider.cpp
index 849fc16..e5c96a6 100644 (file)
@@ -97,6 +97,9 @@ namespace {
         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
@@ -126,6 +129,7 @@ namespace {
         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
@@ -361,6 +365,25 @@ XMLApplication::XMLApplication(
         m_hash+=getString("providerId").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