From fae346327c3a0018f1494e5a7e8cc293e11081b6 Mon Sep 17 00:00:00 2001
From: Andrea Biancini <andrea.biancini@gmail.com>
Date: Sat, 8 Nov 2014 09:05:12 +0100
Subject: [PATCH] Fixed regression on FriendyName management in requested
 attributes and created small test class

---
 modules/saml/www/sp/metadata.php              |   2 +-
 tests/SimpleSAML/Metadata/SAMLBuilderTest.php | 137 ++++++++++++++++++
 2 files changed, 138 insertions(+), 1 deletion(-)
 create mode 100644 tests/SimpleSAML/Metadata/SAMLBuilderTest.php

diff --git a/modules/saml/www/sp/metadata.php b/modules/saml/www/sp/metadata.php
index e4c921975..f1a7d88a0 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 000000000..277a3b60f
--- /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"));
+	}
+    }
+
+}
-- 
GitLab