diff --git a/modules/saml/www/sp/metadata.php b/modules/saml/www/sp/metadata.php index e4c92197501ce3c9b04e9123c4ba3e7c13abda75..f1a7d88a025a6a3b0f7c75cbeeaf4b25e144518d 100644 --- a/modules/saml/www/sp/metadata.php +++ b/modules/saml/www/sp/metadata.php @@ -124,7 +124,7 @@ if ($format !== NULL) { } $name = $spconfig->getLocalizedString('name', NULL); -$attributes = array_values($spconfig->getArray('attributes', array())); +$attributes = $spconfig->getArray('attributes', array()); if ($name !== NULL && !empty($attributes)) { $metaArray20['name'] = $name; diff --git a/tests/SimpleSAML/Metadata/SAMLBuilderTest.php b/tests/SimpleSAML/Metadata/SAMLBuilderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..277a3b60f343a393cc2a90e323349c195798acac --- /dev/null +++ b/tests/SimpleSAML/Metadata/SAMLBuilderTest.php @@ -0,0 +1,137 @@ +<?php +/** + * Class SimpleSAML_Metadata_SAMLBuilderTest + */ + +class SimpleSAML_Metadata_SAMLBuilderTest extends PHPUnit_Framework_TestCase +{ + + /** + * Test the requeste attributes are valued correctly. + */ + public function testAttributes() + { + $entityId = 'https://entity.examle.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")); + } + } + +}