private void addDescriptors(List<String> result, EntitiesDescriptor descriptors) throws MetadataProviderException { log.debug("Found metadata EntitiesDescriptor with ID", descriptors.getID()); if (descriptors.getEntitiesDescriptors() != null) { for (EntitiesDescriptor descriptor : descriptors.getEntitiesDescriptors()) { addDescriptors(result, descriptor); } } if (descriptors.getEntityDescriptors() != null) { for (EntityDescriptor descriptor : descriptors.getEntityDescriptors()) { addDescriptor(result, descriptor); } } }
List<EntityDescriptor> entityDescriptors = descriptor.getEntityDescriptors(); if (entityDescriptors != null && !entityDescriptors.isEmpty()) { List<EntityDescriptor> emptyEntityDescriptors = new ArrayList<EntityDescriptor>(); if (entityRoles == null || entityRoles.isEmpty()) { log.trace("Filtering out entity descriptor {} from entity group {}", entityDescriptor .getEntityID(), descriptor.getName()); emptyEntityDescriptors.add(entityDescriptor); List<EntitiesDescriptor> entitiesDescriptors = descriptor.getEntitiesDescriptors(); if (entitiesDescriptors != null && !entitiesDescriptors.isEmpty()) { List<EntitiesDescriptor> emptyEntitiesDescriptors = new ArrayList<EntitiesDescriptor>(); if (getRemoveEmptyEntitiesDescriptors()) { if ((entitiesDescriptor.getEntityDescriptors() == null || entitiesDescriptor.getEntityDescriptors() .isEmpty()) && (entitiesDescriptor.getEntitiesDescriptors() == null || entitiesDescriptor .getEntitiesDescriptors().isEmpty())) { log.trace("Filtering out entity descriptor {} from entity group {}", entitiesDescriptor .getName(), descriptor.getName()); emptyEntitiesDescriptors.add(entitiesDescriptor);
/** {@inheritDoc} */ protected void processChildElement(XMLObject parentSAMLObject, XMLObject childSAMLObject) throws UnmarshallingException { EntitiesDescriptor entitiesDescriptor = (EntitiesDescriptor) parentSAMLObject; if (childSAMLObject instanceof Extensions) { entitiesDescriptor.setExtensions((Extensions) childSAMLObject); } else if (childSAMLObject instanceof EntitiesDescriptor) { entitiesDescriptor.getEntitiesDescriptors().add((EntitiesDescriptor) childSAMLObject); } else if (childSAMLObject instanceof EntityDescriptor) { entitiesDescriptor.getEntityDescriptors().add((EntityDescriptor) childSAMLObject); } else if (childSAMLObject instanceof Signature) { entitiesDescriptor.setSignature((Signature) childSAMLObject); } else { super.processChildElement(parentSAMLObject, childSAMLObject); } }
log.trace("Processing EntitiesDescriptor group: {}", entitiesDescriptor.getName()); if (entitiesDescriptor.isSigned()) { verifySignature(entitiesDescriptor, entitiesDescriptor.getName(), true); Iterator<EntityDescriptor> entityIter = entitiesDescriptor.getEntityDescriptors().iterator(); while (entityIter.hasNext()) { EntityDescriptor entityChild = entityIter.next(); entitiesDescriptor.getEntityDescriptors().removeAll(toRemove); toRemove.clear(); Iterator<EntitiesDescriptor> entitiesIter = entitiesDescriptor.getEntitiesDescriptors().iterator(); while(entitiesIter.hasNext()) { EntitiesDescriptor entitiesChild = entitiesIter.next(); log.trace("Processing EntitiesDescriptor member: {}", entitiesChild.getName()); try { processEntityGroup(entitiesChild); } catch (FilterException e) { log.error("EntitiesDescriptor '{}' failed signature verification, removing from metadata provider", entitiesChild.getName()); toRemove.add(entitiesChild); entitiesDescriptor.getEntitiesDescriptors().removeAll(toRemove);
private void discoverAndAddIdp(XMLObject metadata, Map<String, SAMLProviderMetadata> idpMap) { if (metadata instanceof EntityDescriptor) { EntityDescriptor entityDescriptor = (EntityDescriptor) metadata; addIdpToMap(entityDescriptor, idpMap); } else if (metadata instanceof EntitiesDescriptor) { EntitiesDescriptor entitiesDescriptor = (EntitiesDescriptor) metadata; if (entitiesDescriptor.getEntityDescriptors() != null) { for (EntityDescriptor entityDescriptor: entitiesDescriptor.getEntityDescriptors()) { addIdpToMap(entityDescriptor, idpMap); } } if (entitiesDescriptor.getEntitiesDescriptors() != null) { for (EntitiesDescriptor entitiesDescriptorInner: entitiesDescriptor.getEntitiesDescriptors()) { discoverAndAddIdp(entitiesDescriptorInner, idpMap); } } } }
default String getEntityID() throws MetadataProviderException { fetchMetadata(); XMLObject metadata = doGetMetadata(); if (metadata instanceof EntityDescriptor) { EntityDescriptor entityDescriptor = (EntityDescriptor) metadata; return entityDescriptor.getEntityID(); } else if (metadata instanceof EntitiesDescriptor) { EntitiesDescriptor desc = (EntitiesDescriptor)metadata; if (desc.getEntityDescriptors().size()!=1) { throw new MetadataProviderException("Invalid metadata. Number of descriptors must be 1, but is "+desc.getEntityDescriptors().size()); } else { return desc.getEntityDescriptors().get(0).getEntityID(); } } else { throw new MetadataProviderException("Unknown descriptor class:"+metadata.getClass().getName()); } }
if (entitiesDescriptor.getID() != null) { log.debug("Writing ID attribute to EntitiesDescriptor DOM element."); domElement.setAttributeNS(null, EntitiesDescriptor.ID_ATTRIB_NAME, entitiesDescriptor.getID()); domElement.setIdAttributeNS(null, EntitiesDescriptor.ID_ATTRIB_NAME, true); if (entitiesDescriptor.getValidUntil() != null) { log.debug("Writting validUntil attribute to EntitiesDescriptor DOM element"); String validUntilStr = Configuration.getSAMLDateFormatter().print(entitiesDescriptor.getValidUntil()); domElement.setAttributeNS(null, TimeBoundSAMLObject.VALID_UNTIL_ATTRIB_NAME, validUntilStr); if (entitiesDescriptor.getCacheDuration() != null) { log.debug("Writting cacheDuration attribute to EntitiesDescriptor DOM element"); String cacheDuration = XMLHelper.longToDuration(entitiesDescriptor.getCacheDuration()); domElement.setAttributeNS(null, CacheableSAMLObject.CACHE_DURATION_ATTRIB_NAME, cacheDuration); if (entitiesDescriptor.getName() != null) { log.debug("Writting Name attribute to EntitiesDescriptor DOM element"); domElement.setAttributeNS(null, EntitiesDescriptor.NAME_ATTRIB_NAME, entitiesDescriptor.getName());
/** * Gets the entities descriptor with the given name. * * @param name name of the entities descriptor * @param rootDescriptor the root descriptor to search in * * @return the EntitiesDescriptor with the given name */ protected EntitiesDescriptor getEntitiesDescriptorByName(String name, EntitiesDescriptor rootDescriptor) { EntitiesDescriptor descriptor = null; if (DatatypeHelper.safeEquals(name, rootDescriptor.getName()) && isValid(rootDescriptor)) { descriptor = rootDescriptor; } else { List<EntitiesDescriptor> childDescriptors = rootDescriptor.getEntitiesDescriptors(); if (childDescriptors == null || childDescriptors.isEmpty()) { return null; } for (EntitiesDescriptor childDescriptor : childDescriptors) { childDescriptor = getEntitiesDescriptorByName(name, childDescriptor); if (childDescriptor != null) { descriptor = childDescriptor; } } } return descriptor; }
/** * Checks that at least either Valid Until or Cache Duration is present when Entities Descriptor is root element. * * @param entitiesDescriptor * @throws ValidationException */ protected void validateRoot(EntitiesDescriptor entitiesDescriptor) throws ValidationException { if (entitiesDescriptor.getParent() == null && entitiesDescriptor.getValidUntil() == null && entitiesDescriptor.getCacheDuration() == null) { throw new ValidationException("Must have either ValidUntil or CacheDuration when is root element."); } } }
/** * Get the name of the parent element of an {@link Extensions} element in metadata, mostly * useful for logging purposes. * * If the parent is an EntityDescriptor, return the entityID value. If an EntitiesDescriptor, * return the name value. * * @param extensions the Extensions element * @return the Extensions element's parent's name */ protected String getExtensionsParentName(Extensions extensions) { XMLObject parent = extensions.getParent(); if (parent == null) { return null; } if (parent instanceof EntityDescriptor) { return ((EntityDescriptor) parent).getEntityID(); } else if (extensions.getParent() instanceof EntitiesDescriptor) { return ((EntitiesDescriptor) parent).getName(); } return null; }
log.trace("Checking to see if EntitiesDescriptor {} contains the requested descriptor", descriptor.getName()); List<EntityDescriptor> entityDescriptors = descriptor.getEntityDescriptors(); if (entityDescriptors != null && !entityDescriptors.isEmpty()) { for (EntityDescriptor entityDescriptor : entityDescriptors) { List<EntitiesDescriptor> entitiesDescriptors = descriptor.getEntitiesDescriptors(); if (entitiesDescriptors != null && !entitiesDescriptors.isEmpty()) { for (EntitiesDescriptor entitiesDescriptor : descriptor.getEntitiesDescriptors()) { entityDescriptor = getEntityDescriptorById(entityID, entitiesDescriptor); if (entityDescriptor != null) {
/** * Checks that at least one EntitiesDescriptor or EntityDescriptor is present. * * @param entitiesDescriptor * @throws ValidationException */ protected void validateEntityDescriptors(EntitiesDescriptor entitiesDescriptor) throws ValidationException { if ((entitiesDescriptor.getEntitiesDescriptors() == null || entitiesDescriptor.getEntitiesDescriptors().size() < 1) && (entitiesDescriptor.getEntityDescriptors() == null || entitiesDescriptor.getEntityDescriptors() .size() < 1)) { throw new ValidationException("Must have one or more EntitiesDescriptor or EntityDescriptor."); } } }
@SneakyThrows private boolean isLocal(ExtendedMetadataDelegate delegate) { delegate.initialize(); XMLObject metadata = delegate.getDelegate().getMetadata(); List<EntityDescriptor> descriptors = EntityDescriptor.class.isAssignableFrom(metadata.getClass()) ? Collections.singletonList((EntityDescriptor) metadata) : (EntitiesDescriptor.class.isAssignableFrom(metadata.getClass()) ? ((EntitiesDescriptor) metadata).getEntityDescriptors() : Collections.emptyList()); return descriptors.stream() .anyMatch(ed -> isLocal(delegate, ed.getEntityID())); }
EntitiesDescriptor entityGroup = (EntitiesDescriptor) entityDescriptor.getParent(); while (entityGroup != null) { if (rpConfigs.containsKey(entityGroup.getName())) { log.debug("Relying party configuration found for {} as member of metadata group {}", relyingPartyEntityID, entityGroup.getName()); return rpConfigs.get(entityGroup.getName()); entityGroup = (EntitiesDescriptor) entityGroup.getParent();
/** * Recursively parses descriptors object. Supports both nested entitiesDescriptor * elements and leaf entityDescriptors. EntityID of all found descriptors are added * to the result set. Signatures on all found entities are verified using the given policy * and trust engine. * * @param result result set of parsed entity IDs * @param descriptors descriptors to parse * @throws MetadataProviderException in case signature validation fails */ private void addDescriptors(List<String> result, EntitiesDescriptor descriptors) throws MetadataProviderException { log.debug("Found metadata EntitiesDescriptor with ID", descriptors.getID()); if (descriptors.getEntitiesDescriptors() != null) { for (EntitiesDescriptor descriptor : descriptors.getEntitiesDescriptors()) { addDescriptors(result, descriptor); } } if (descriptors.getEntityDescriptors() != null) { for (EntityDescriptor descriptor : descriptors.getEntityDescriptors()) { addDescriptor(result, descriptor); } } }
if (ed.getEntityDescriptors() == null) { throw new XMLParserException("EntityDescriptors is null"); if (ed.getEntityDescriptors().isEmpty()) { throw new XMLParserException("EntityDescriptors is empty"); edesc = ed.getEntityDescriptors().get(0);