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.
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());
}
}
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());
}
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(
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();
}
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;