SSPCPP-616 - clean up concatenated string literals
[shibboleth/cpp-opensaml.git] / saml / saml2 / metadata / impl / AbstractMetadataProvider.cpp
index 40180f4..f2cca92 100644 (file)
@@ -104,6 +104,14 @@ void AbstractMetadataProvider::emitChangeEvent() const
     ObservableMetadataProvider::emitChangeEvent();
 }
 
+void AbstractMetadataProvider::emitChangeEvent(const EntityDescriptor& entity) const
+{
+    for (credmap_t::iterator c = m_credentialMap.begin(); c!=m_credentialMap.end(); ++c)
+        for_each(c->second.begin(), c->second.end(), xmltooling::cleanup<Credential>());
+    m_credentialMap.clear();
+    ObservableMetadataProvider::emitChangeEvent(entity);
+}
+
 void AbstractMetadataProvider::indexEntity(EntityDescriptor* site, time_t& validUntil, bool replace) const
 {
     // If child expires later than input, reset child, otherwise lower input to match.
@@ -251,7 +259,7 @@ const EntitiesDescriptor* AbstractMetadataProvider::getEntitiesDescriptor(const
             return i->second;
     
     if (range.first != range.second) {
-        Category& log = Category::getInstance(SAML_LOGCAT".MetadataProvider");
+        Category& log = Category::getInstance(SAML_LOGCAT ".MetadataProvider");
         if (strict) {
             log.warn("ignored expired metadata group (%s)", range.first->first.c_str());
         }
@@ -291,7 +299,7 @@ pair<const EntityDescriptor*,const RoleDescriptor*> AbstractMetadataProvider::ge
     }
     
     if (!result.first && range.first!=range.second) {
-        Category& log = Category::getInstance(SAML_LOGCAT".MetadataProvider");
+        Category& log = Category::getInstance(SAML_LOGCAT ".MetadataProvider");
         if (criteria.validOnly) {
             log.warn("ignored expired metadata instance for (%s)", range.first->first.c_str());
         }
@@ -316,16 +324,13 @@ const Credential* AbstractMetadataProvider::resolve(const CredentialCriteria* cr
     if (!metacrit)
         throw MetadataException("Cannot resolve credentials without a MetadataCredentialCriteria object.");
 
-    Lock lock(m_credentialLock.get());
+    Lock lock(m_credentialLock);
     const credmap_t::mapped_type& creds = resolveCredentials(metacrit->getRole());
 
-    // Indirect iterator derefs the pointers in the vector to pass to the matches() method by reference.
-    credmap_t::mapped_type::const_iterator c = find_if(
-        creds.begin(), creds.end(), lambda::bind(&CredentialCriteria::matches, metacrit, boost::ref(*_1))
-        );
-    if (c != creds.end())
-        return *c;
-    return nullptr;
+    for (credmap_t::mapped_type::const_iterator c = creds.begin(); c!=creds.end(); ++c)
+       if (metacrit->matches(*(*c)))
+       return *c;
+return nullptr;
 }
 
 vector<const Credential*>::size_type AbstractMetadataProvider::resolve(
@@ -336,16 +341,12 @@ vector<const Credential*>::size_type AbstractMetadataProvider::resolve(
     if (!metacrit)
         throw MetadataException("Cannot resolve credentials without a MetadataCredentialCriteria object.");
 
-    Lock lock(m_credentialLock.get());
+    Lock lock(m_credentialLock);
     const credmap_t::mapped_type& creds = resolveCredentials(metacrit->getRole());
 
-    // Add matching creds to results array.
-    static void (vector<const Credential*>::* push_back)(const Credential* const &) = &vector<const Credential*>::push_back;
-    for_each(
-        creds.begin(), creds.end(),
-        if_(lambda::bind(&CredentialCriteria::matches, metacrit, boost::ref(*_1)))[lambda::bind(push_back, boost::ref(results), _1)]
-        );
-    
+   for (credmap_t::mapped_type::const_iterator c = creds.begin(); c!=creds.end(); ++c)
+       if (metacrit->matches(*(*c)))
+           results.push_back(*c); 
     return results.size();
 }
 
@@ -362,9 +363,12 @@ const AbstractMetadataProvider::credmap_t::mapped_type& AbstractMetadataProvider
             k != make_indirect_iterator(keys.end()); ++k) {
         if (k->getKeyInfo()) {
             auto_ptr<MetadataCredentialContext> mcc(new MetadataCredentialContext(*k));
-            Credential* c = resolver->resolve(mcc.get());
-            mcc.release();
-            resolved.push_back(c);
+            auto_ptr<Credential> c(resolver->resolve(mcc.get()));
+            if (c.get()) {
+                mcc.release();  // this API sucks, the object is now owned by the Credential
+                resolved.push_back(c.get());
+                c.release();
+            }
         }
     }
     return resolved;