getEntityDescriptor() public method

Retrieve the EntityDescriptor element which is generated for this entity.
public getEntityDescriptor ( ) : DOMElement
return DOMElement The EntityDescriptor element of this entity.
Beispiel #1
0
 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;
 }
Beispiel #2
0
 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"));
     }
 }
Beispiel #4
0
 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;
     }
 }