+ auto_ptr_char id(site->getEntityID());
+ if (id.get()) {
+ m_sites.insert(make_pair(id.get(),site));
+ }
+
+ // Process each IdP role.
+ const vector<IDPSSODescriptor*>& roles=const_cast<const EntityDescriptor*>(site)->getIDPSSODescriptors();
+ for (vector<IDPSSODescriptor*>::const_iterator i=roles.begin(); i!=roles.end(); i++) {
+ // SAML 1.x?
+ if ((*i)->hasSupport(SAMLConstants::SAML10_PROTOCOL_ENUM) || (*i)->hasSupport(SAMLConstants::SAML11_PROTOCOL_ENUM)) {
+ // Check for SourceID extension element.
+ const Extensions* exts=(*i)->getExtensions();
+ if (exts) {
+ const list<XMLObject*>& children=exts->getXMLObjects();
+ for (list<XMLObject*>::const_iterator ext=children.begin(); ext!=children.end(); ext++) {
+ SourceID* sid=dynamic_cast<SourceID*>(*ext);
+ if (sid) {
+ auto_ptr_char sourceid(sid->getID());
+ if (sourceid.get()) {
+ m_sources.insert(pair<string,const EntityDescriptor*>(sourceid.get(),site));
+ break;
+ }
+ }
+ }
+ }
+
+ // Hash the ID.
+ m_sources.insert(
+ pair<string,const EntityDescriptor*>(SAMLConfig::getConfig().hashSHA1(id.get(), true),site)
+ );
+
+ // Load endpoints for type 0x0002 artifacts.
+ const vector<ArtifactResolutionService*>& locs=const_cast<const IDPSSODescriptor*>(*i)->getArtifactResolutionServices();
+ for (vector<ArtifactResolutionService*>::const_iterator loc=locs.begin(); loc!=locs.end(); loc++) {
+ auto_ptr_char location((*loc)->getLocation());
+ if (location.get())
+ m_sources.insert(pair<string,const EntityDescriptor*>(location.get(),site));
+ }
+ }
+
+ // SAML 2.0?
+ if ((*i)->hasSupport(SAMLConstants::SAML20P_NS)) {
+ // Hash the ID.
+ m_sources.insert(
+ pair<string,const EntityDescriptor*>(SAMLConfig::getConfig().hashSHA1(id.get(), true),site)
+ );
+ }
+ }
+}
+
+void MetadataProvider::index(EntitiesDescriptor* group, time_t validUntil)