using MetadataProvider::getEntityDescriptor;
using MetadataProvider::getEntitiesDescriptor;
+ void outputStatus(std::ostream& os) const;
void emitChangeEvent() const;
std::pair<const EntityDescriptor*,const RoleDescriptor*> getEntityDescriptor(const Criteria& criteria) const;
const EntitiesDescriptor* getEntitiesDescriptor(const char* name, bool requireValidMetadata=true) const;
) const;
protected:
+ /** Time of last update for reporting. */
+ mutable time_t m_lastUpdate;
+
/** Embedded KeyInfoResolver instance. */
xmltooling::KeyInfoResolver* m_resolver;
void init();
xmltooling::Lockable* lock();
void unlock();
+ const char* getId() const;
const xmltooling::XMLObject* getMetadata() const;
std::pair<const EntityDescriptor*,const RoleDescriptor*> getEntityDescriptor(const Criteria& criteria) const;
virtual EntityDescriptor* resolve(const Criteria& criteria) const;
private:
+ std::string m_id;
mutable xmltooling::RWLock* m_lock;
double m_refreshDelayFactor;
time_t m_minCacheDuration, m_maxCacheDuration;
virtual ~MetadataProvider();
/**
+ * Returns an identifier for the provider for logging/status purposes.
+ *
+ * @return an identifier, or null
+ */
+ virtual const char* getId() const;
+
+ /**
* Adds a metadata filter to apply to any resolved metadata. Will not be applied
* to metadata that is already loaded.
*
#include <xmltooling/security/Credential.h>
#include <xmltooling/security/KeyInfoResolver.h>
#include <xmltooling/security/SecurityHelper.h>
+#include <xmltooling/util/DateTime.h>
#include <xmltooling/util/Threads.h>
#include <xmltooling/util/XMLHelper.h>
static const XMLCh type[] = UNICODE_LITERAL_4(t,y,p,e);
AbstractMetadataProvider::AbstractMetadataProvider(const DOMElement* e)
- : ObservableMetadataProvider(e), m_resolver(nullptr), m_credentialLock(nullptr)
+ : ObservableMetadataProvider(e), m_lastUpdate(0), m_resolver(nullptr), m_credentialLock(nullptr)
{
e = XMLHelper::getFirstChildElement(e, _KeyInfoResolver);
if (e) {
delete m_resolver;
}
+void AbstractMetadataProvider::outputStatus(ostream& os) const
+{
+ os << "<MetadataProvider";
+
+ if (getId() && *getId()) {
+ os << " id='" << getId() << "'";
+ }
+
+ if (m_lastUpdate > 0) {
+ DateTime ts(m_lastUpdate);
+ ts.parseDateTime();
+ auto_ptr_char timestamp(ts.getFormattedString());
+ os << " lastUpdate='" << timestamp.get() << "'";
+ }
+
+ os << "/>";
+}
+
void AbstractMetadataProvider::emitChangeEvent() const
{
for (credmap_t::iterator c = m_credentialMap.begin(); c!=m_credentialMap.end(); ++c)
# define min(a,b) (((a) < (b)) ? (a) : (b))
# endif
+static const XMLCh id[] = UNICODE_LITERAL_2(i,d);
static const XMLCh maxCacheDuration[] = UNICODE_LITERAL_16(m,a,x,C,a,c,h,e,D,u,r,a,t,i,o,n);
static const XMLCh minCacheDuration[] = UNICODE_LITERAL_16(m,i,n,C,a,c,h,e,D,u,r,a,t,i,o,n);
static const XMLCh refreshDelayFactor[] = UNICODE_LITERAL_18(r,e,f,r,e,s,h,D,e,l,a,y,F,a,c,t,o,r);
DynamicMetadataProvider::DynamicMetadataProvider(const DOMElement* e)
: AbstractMetadataProvider(e),
m_validate(XMLHelper::getAttrBool(e, false, validate)),
+ m_id(XMLHelper::getAttrString(e, "Dynamic", id)),
m_lock(RWLock::create()),
m_refreshDelayFactor(0.75),
m_minCacheDuration(XMLHelper::getAttrInt(e, 600, minCacheDuration)),
{
}
+const char* DynamicMetadataProvider::getId() const
+{
+ return m_id.c_str();
+}
+
pair<const EntityDescriptor*,const RoleDescriptor*> DynamicMetadataProvider::getEntityDescriptor(const Criteria& criteria) const
{
Category& log = Category::getInstance(SAML_LOGCAT".MetadataProvider.Dynamic");
cacheExp = SAMLTIME_MAX;
indexEntity(entity2.release(), cacheExp, true);
+ m_lastUpdate = now;
+
// Downgrade back to a read lock.
m_lock->unlock();
m_lock->rdlock();
for_each(m_filters.begin(), m_filters.end(), xmltooling::cleanup<MetadataFilter>());
}
+const char* MetadataProvider::getId() const
+{
+ return nullptr;
+}
+
void MetadataProvider::addMetadataFilter(MetadataFilter* newFilter)
{
m_filters.push_back(newFilter);
}
}
+ const char* getId() const {
+ return m_id.c_str();
+ }
+
const XMLObject* getMetadata() const {
return m_object;
}
generateFeed();
if (changed)
emitChangeEvent();
+ m_lastUpdate = time(nullptr);
// Tracking cacheUntil through the tree is TBD, but
// validUntil is the tightest interval amongst the children.