Retrieve the EntityDescriptor element which is generated for this entity.
public getEntityDescriptor ( ) : DOMElement | ||
Результат | DOMElement | The EntityDescriptor element of this entity. |
public function getMetadataDocument() { // Get metadata entries $entities = $this->getSources(); // Generate XML Document $xml = new DOMDocument(); $entitiesDescriptor = $xml->createElementNS('urn:oasis:names:tc:SAML:2.0:metadata', 'EntitiesDescriptor'); $entitiesDescriptor->setAttribute('Name', $this->id); $xml->appendChild($entitiesDescriptor); $maxDuration = $this->getMaxDuration(); $reconstruct = $this->getReconstruct(); /* Build EntityDescriptor elements for them. */ foreach ($entities as $entity => $sets) { $entityDescriptor = NULL; foreach ($sets as $set => $metadata) { if (!array_key_exists('entityDescriptor', $metadata)) { /* One of the sets doesn't contain an EntityDescriptor element. */ $entityDescriptor = FALSE; break; } if ($entityDescriptor == NULL) { /* First EntityDescriptor elements. */ $entityDescriptor = $metadata['entityDescriptor']; continue; } assert('is_string($entityDescriptor)'); if ($entityDescriptor !== $metadata['entityDescriptor']) { /* Entity contains multiple different EntityDescriptor elements. */ $entityDescriptor = FALSE; break; } } if (is_string($entityDescriptor) && !$reconstruct) { /* All metadata sets for the entity contain the same entity descriptor. Use that one. */ $tmp = new DOMDocument(); $tmp->loadXML(base64_decode($entityDescriptor)); $entityDescriptor = $tmp->documentElement; } else { $tmp = new SimpleSAML_Metadata_SAMLBuilder($entity, $maxDuration, $maxDuration); $orgmeta = NULL; foreach ($sets as $set => $metadata) { $tmp->addMetadata($set, $metadata); $orgmeta = $metadata; } $tmp->addOrganizationInfo($orgmeta); $entityDescriptor = $tmp->getEntityDescriptor(); } $entitiesDescriptor->appendChild($xml->importNode($entityDescriptor, TRUE)); } /* Sign the metadata if enabled. */ if ($this->shouldSign()) { $signer = new SimpleSAML_XML_Signer($this->getSigningInfo()); $signer->sign($entitiesDescriptor, $entitiesDescriptor, $entitiesDescriptor->firstChild); } return $xml; }
public function getMetadataDocument() { // Get metadata entries $entities = $this->getSources(); $maxDuration = $this->getMaxDuration(); $reconstruct = $this->getReconstruct(); $entitiesDescriptor = new SAML2_XML_md_EntitiesDescriptor(); $entitiesDescriptor->Name = $this->id; $entitiesDescriptor->validUntil = time() + $maxDuration; // add RegistrationInfo extension if enabled if ($this->gConfig->hasValue('RegistrationInfo')) { $ri = new SAML2_XML_mdrpi_RegistrationInfo(); foreach ($this->gConfig->getArray('RegistrationInfo') as $riName => $riValues) { switch ($riName) { case 'authority': $ri->registrationAuthority = $riValues; break; case 'instant': $ri->registrationInstant = SAML2_Utils::xsDateTimeToTimestamp($riValues); break; case 'policies': $ri->RegistrationPolicy = $riValues; break; } } $entitiesDescriptor->Extensions[] = $ri; } /* Build EntityDescriptor elements for them. */ foreach ($entities as $entity => $sets) { $entityDescriptor = NULL; foreach ($sets as $set => $metadata) { if (!array_key_exists('entityDescriptor', $metadata)) { /* One of the sets doesn't contain an EntityDescriptor element. */ $entityDescriptor = FALSE; break; } if ($entityDescriptor == NULL) { /* First EntityDescriptor elements. */ $entityDescriptor = $metadata['entityDescriptor']; continue; } assert('is_string($entityDescriptor)'); if ($entityDescriptor !== $metadata['entityDescriptor']) { /* Entity contains multiple different EntityDescriptor elements. */ $entityDescriptor = FALSE; break; } } if (is_string($entityDescriptor) && !$reconstruct) { /* All metadata sets for the entity contain the same entity descriptor. Use that one. */ $tmp = new DOMDocument(); $tmp->loadXML(base64_decode($entityDescriptor)); $entitiesDescriptor->children[] = new SAML2_XML_md_EntityDescriptor($tmp->documentElement); } else { $tmp = new SimpleSAML_Metadata_SAMLBuilder($entity, $maxDuration, $maxDuration); $orgmeta = NULL; foreach ($sets as $set => $metadata) { $tmp->addMetadata($set, $metadata); $orgmeta = $metadata; } $tmp->addOrganizationInfo($orgmeta); $entitiesDescriptor->children[] = $tmp->getEntityDescriptor(); } } $document = $entitiesDescriptor->toXML(); // sign the metadata if enabled if ($this->shouldSign()) { $signer = new SimpleSAML_XML_Signer($this->getSigningInfo()); $signer->sign($document, $document, $document->firstChild); } return $document; }
/** * Test the requeste attributes are valued correctly. */ public function testAttributes() { $entityId = 'https://entity.example.com/id'; // test SP20 array parsing, no friendly name $set = 'saml20-sp-remote'; $metadata = array('entityid' => $entityId, 'name' => array('en' => 'Test SP'), 'metadata-set' => $set, 'attributes' => array('urn:oid:1.3.6.1.4.1.5923.1.1.1.10', 'urn:oid:1.3.6.1.4.1.5923.1.1.1.6', 'urn:oid:0.9.2342.19200300.100.1.3', 'urn:oid:2.5.4.3')); $samlBuilder = new SimpleSAML_Metadata_SAMLBuilder($entityId); $samlBuilder->addMetadata($set, $metadata); $spDesc = $samlBuilder->getEntityDescriptor(); $acs = $spDesc->getElementsByTagName("AttributeConsumingService"); $this->assertEquals(1, $acs->length); $attributes = $acs->item(0)->getElementsByTagName("RequestedAttribute"); $this->assertEquals(4, $attributes->length); for ($c = 0; $c < $attributes->length; $c++) { $curAttribute = $attributes->item($c); $this->assertTrue($curAttribute->hasAttribute("Name")); $this->assertFalse($curAttribute->hasAttribute("FriendlyName")); $this->assertEquals($metadata['attributes'][$c], $curAttribute->getAttribute("Name")); } // test SP20 array parsing, no friendly name $set = 'saml20-sp-remote'; $metadata = array('entityid' => $entityId, 'name' => array('en' => 'Test SP'), 'metadata-set' => $set, 'attributes' => array('eduPersonTargetedID' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.10', 'eduPersonPrincipalName' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.6', 'eduPersonOrgDN' => 'urn:oid:0.9.2342.19200300.100.1.3', 'cn' => 'urn:oid:2.5.4.3')); $samlBuilder = new SimpleSAML_Metadata_SAMLBuilder($entityId); $samlBuilder->addMetadata($set, $metadata); $spDesc = $samlBuilder->getEntityDescriptor(); $acs = $spDesc->getElementsByTagName("AttributeConsumingService"); $this->assertEquals(1, $acs->length); $attributes = $acs->item(0)->getElementsByTagName("RequestedAttribute"); $this->assertEquals(4, $attributes->length); $keys = array_keys($metadata['attributes']); for ($c = 0; $c < $attributes->length; $c++) { $curAttribute = $attributes->item($c); $this->assertTrue($curAttribute->hasAttribute("Name")); $this->assertTrue($curAttribute->hasAttribute("FriendlyName")); $this->assertEquals($metadata['attributes'][$keys[$c]], $curAttribute->getAttribute("Name")); $this->assertEquals($keys[$c], $curAttribute->getAttribute("FriendlyName")); } // test SP13 array parsing, no friendly name $set = 'shib13-sp-remote'; $metadata = array('entityid' => $entityId, 'name' => array('en' => 'Test SP'), 'metadata-set' => $set, 'attributes' => array('urn:oid:1.3.6.1.4.1.5923.1.1.1.10', 'urn:oid:1.3.6.1.4.1.5923.1.1.1.6', 'urn:oid:0.9.2342.19200300.100.1.3', 'urn:oid:2.5.4.3')); $samlBuilder = new SimpleSAML_Metadata_SAMLBuilder($entityId); $samlBuilder->addMetadata($set, $metadata); $spDesc = $samlBuilder->getEntityDescriptor(); $acs = $spDesc->getElementsByTagName("AttributeConsumingService"); $this->assertEquals(1, $acs->length); $attributes = $acs->item(0)->getElementsByTagName("RequestedAttribute"); $this->assertEquals(4, $attributes->length); for ($c = 0; $c < $attributes->length; $c++) { $curAttribute = $attributes->item($c); $this->assertTrue($curAttribute->hasAttribute("Name")); $this->assertFalse($curAttribute->hasAttribute("FriendlyName")); $this->assertEquals($metadata['attributes'][$c], $curAttribute->getAttribute("Name")); } // test SP20 array parsing, no friendly name $set = 'shib13-sp-remote'; $metadata = array('entityid' => $entityId, 'name' => array('en' => 'Test SP'), 'metadata-set' => $set, 'attributes' => array('eduPersonTargetedID' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.10', 'eduPersonPrincipalName' => 'urn:oid:1.3.6.1.4.1.5923.1.1.1.6', 'eduPersonOrgDN' => 'urn:oid:0.9.2342.19200300.100.1.3', 'cn' => 'urn:oid:2.5.4.3')); $samlBuilder = new SimpleSAML_Metadata_SAMLBuilder($entityId); $samlBuilder->addMetadata($set, $metadata); $spDesc = $samlBuilder->getEntityDescriptor(); $acs = $spDesc->getElementsByTagName("AttributeConsumingService"); $this->assertEquals(1, $acs->length); $attributes = $acs->item(0)->getElementsByTagName("RequestedAttribute"); $this->assertEquals(4, $attributes->length); $keys = array_keys($metadata['attributes']); for ($c = 0; $c < $attributes->length; $c++) { $curAttribute = $attributes->item($c); $this->assertTrue($curAttribute->hasAttribute("Name")); $this->assertTrue($curAttribute->hasAttribute("FriendlyName")); $this->assertEquals($metadata['attributes'][$keys[$c]], $curAttribute->getAttribute("Name")); $this->assertEquals($keys[$c], $curAttribute->getAttribute("FriendlyName")); } }
private static function getMetadata($eid, $revision, $type = null, array $option = null) { assert('ctype_digit($eid)'); assert('ctype_digit($revision)'); $janus_config = sspmod_janus_DiContainer::getInstance()->getConfig(); $entityController = sspmod_janus_DiContainer::getInstance()->getEntityController(); if (!($entity = $entityController->setEntity($eid, $revision))) { self::$_error = array('Entity could not be loaded - Eid: ' . $eid . ' Revisionid: ' . $revision); return false; } $metadata_raw = $entityController->getMetadata(); // Get metadata fields $nm_mb = new sspmod_janus_MetadataFieldBuilder($janus_config->getArray('metadatafields.' . $entity->getType())); $metadatafields_required = $nm_mb->getMetadataFields(); // Get required metadata fields $required = array(); foreach ($metadatafields_required as $mf) { if (isset($mf->required) && $mf->required === true) { $required[] = $mf->name; } } // Get metadata to me tested $metadata = array(); foreach ($metadata_raw as $k => $v) { // Metadata field not defined if (!isset($metadatafields_required[$v->getKey()])) { continue; } // Value not set for metadata if (is_string($v->getValue()) && $v->getValue() == '') { continue; } // Compute is the default values is allowed $default_allow = false; if (isset($metadatafields_required[$v->getKey()]->default_allow) && is_bool($metadatafields_required[$v->getKey()]->default_allow)) { $default_allow = $metadatafields_required[$v->getKey()]->default_allow; } /* * Do not include metadata if value is set to default and default * is not allowed. */ if (!$default_allow && (isset($metadatafields_required[$v->getKey()]->default) && $v->getValue() == $metadatafields_required[$v->getKey()]->default)) { continue; } $metadata[] = $v->getKey(); } // Compute missing metadata that is required $missing_required = array_diff($required, $metadata); $entityId = $entity->getEntityid(); if (!empty($missing_required)) { SimpleSAML_Logger::error('JANUS - Missing required metadata fields. Entity_id:' . $entityId); self::$_error = $missing_required; return false; } try { $metaArray = $entityController->getMetaArray(); $metaArray['eid'] = $eid; $blockedEntities = $entityController->getBlockedEntities(); $allowedEntities = $entityController->getAllowedEntities(); $disabledConsent = $entityController->getDisableConsent(); $metaFlat = '// Revision: ' . $entity->getRevisionid() . "\n"; $metaFlat .= var_export($entityId, TRUE) . ' => ' . var_export($metaArray, TRUE) . ','; // Add authproc filter to block blocked entities if (!empty($blockedEntities) || !empty($allowedEntities)) { $metaFlat = substr($metaFlat, 0, -2); if (!empty($allowedEntities)) { $metaFlat .= " 'allowed' => array(\n"; $metaArray['allowed'] = array(); foreach ($allowedEntities as $allowedEntity) { $metaFlat .= " '" . $allowedEntity['remoteentityid'] . "',\n"; $metaArray['allowed'][] = $allowedEntity['remoteentityid']; } $metaFlat .= " ),\n"; } if (!empty($blockedEntities)) { $metaFlat .= " 'blocked' => array(\n"; $metaArray['blocked'] = array(); foreach ($blockedEntities as $blockedEntity) { $metaFlat .= " '" . $blockedEntity['remoteentityid'] . "',\n"; $metaArray['blocked'][] = $blockedEntity['remoteentityid']; } $metaFlat .= " ),\n"; } $metaFlat .= '),'; } // Add disable consent if (!empty($disabledConsent)) { $metaFlat = substr($metaFlat, 0, -2); $metaFlat .= " 'consent.disable' => array(\n"; foreach ($disabledConsent as $key => $value) { $metaFlat .= " '" . $key . "',\n"; } $metaFlat .= " ),\n"; $metaFlat .= '),'; } $maxCache = isset($option['maxCache']) ? $option['maxCache'] : null; $maxDuration = isset($option['maxDuration']) ? $option['maxDuration'] : null; try { $metaBuilder = new SimpleSAML_Metadata_SAMLBuilder($entityId, $maxCache, $maxDuration); $metaBuilder->addMetadata($metaArray['metadata-set'], $metaArray); } catch (Exception $e) { SimpleSAML_Logger::error('JANUS - Entity_id:' . $entityId . ' - Error generating XML metadata - ' . var_export($e, true)); self::$_error = array('Error generating XML metadata - ' . $e->getMessage()); return false; } // Add organization info if (!empty($metaArray['OrganizationName']) && !empty($metaArray['OrganizationDisplayName']) && !empty($metaArray['OrganizationURL'])) { $metaBuilder->addOrganizationInfo(array('OrganizationName' => $metaArray['OrganizationName'], 'OrganizationDisplayName' => $metaArray['OrganizationDisplayName'], 'OrganizationURL' => $metaArray['OrganizationURL'])); } // Add contact info if (!empty($metaArray['contact'])) { $metaBuilder->addContact('technical', $metaArray['contact']); } switch ($type) { case self::XML: return $metaBuilder->getEntityDescriptor(); case self::XMLREADABLE: return $metaBuilder->getEntityDescriptorText(); case self::PHPARRAY: return $metaArray; case self::FLATFILE: default: return $metaFlat; } } catch (Exception $exception) { $session = SimpleSAML_Session::getInstance(); SimpleSAML_Utilities::fatalError($session->getTrackID(), 'JANUS - Metadatageneration', $exception); return false; } }