From a73c8a0ffb3d10e120533356c43e10f5a5fe34cd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Jaime=20P=C3=A9rez=20Crespo?= <jaime.perez@uninett.no>
Date: Sun, 2 Feb 2014 18:53:52 +0000
Subject: [PATCH] AttributeLimit: allow defining values, not just attributes.

git-svn-id: https://simplesamlphp.googlecode.com/svn/trunk@3348 44740490-163a-0410-bde0-09ae8108e29a
---
 .../core/lib/Auth/Process/AttributeLimit.php  | 35 ++++++++++++++-----
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git a/modules/core/lib/Auth/Process/AttributeLimit.php b/modules/core/lib/Auth/Process/AttributeLimit.php
index 44ebcb777..de9a13d1d 100644
--- a/modules/core/lib/Auth/Process/AttributeLimit.php
+++ b/modules/core/lib/Auth/Process/AttributeLimit.php
@@ -28,20 +28,28 @@ class sspmod_core_Auth_Process_AttributeLimit extends SimpleSAML_Auth_Processing
 	 *
 	 * @param array $config  Configuration information about this filter.
 	 * @param mixed $reserved  For future use
+     * @throws SimpleSAML_Error_Exception If invalid configuration is found.
 	 */
 	public function __construct($config, $reserved) {
 		parent::__construct($config, $reserved);
 
 		assert('is_array($config)');
 
-		foreach($config as $index => $value) {
+		foreach ($config as $index => $value) {
 			if ($index === 'default') {
 				$this->isDefault = (bool)$value;
 			} elseif (is_int($index)) {
-				if(!is_string($value)) {
-					throw new SimpleSAML_Error_Exception('AttributeLimit: Invalid attribute name: ' . var_export($value, TRUE));
+				if (!is_string($value)) {
+					throw new SimpleSAML_Error_Exception('AttributeLimit: Invalid attribute name: ' .
+                        var_export($value, TRUE));
 				}
 				$this->allowedAttributes[] = $value;
+            } elseif (is_string($index)) {
+                if (!is_array($value)) {
+                    throw new SimpleSAML_Error_Exception('AttributeLimit: Values for ' . var_export($index, TRUE) .
+                        ' must be specified in an array.');
+                }
+                $this->allowedAttributes[$index] = $value;
 			} else {
 				throw new SimpleSAML_Error_Exception('AttributeLimit: Invalid option: ' . var_export($index, TRUE));
 			}
@@ -75,6 +83,7 @@ class sspmod_core_Auth_Process_AttributeLimit extends SimpleSAML_Auth_Processing
 	 * Removes all attributes which aren't one of the allowed attributes.
 	 *
 	 * @param array &$request  The current request
+     * @throws SimpleSAML_Error_Exception If invalid configuration is found.
 	 */
 	public function process(&$request) {
 		assert('is_array($request)');
@@ -96,14 +105,24 @@ class sspmod_core_Auth_Process_AttributeLimit extends SimpleSAML_Auth_Processing
 
 		$attributes =& $request['Attributes'];
 
-		foreach($attributes as $name => $values) {
-			if(!in_array($name, $allowedAttributes, TRUE)) {
-				unset($attributes[$name]);
+		foreach ($attributes as $name => $values) {
+			if (!in_array($name, $allowedAttributes, TRUE)) {
+                // the attribute name is not in the array of allowed attributes
+                if (array_key_exists($name, $allowedAttributes)) {
+                    // but it is an index of the array
+                    if (!is_array($values)) {
+                        throw new SimpleSAML_Error_Exception('AttributeLimit: Values for ' . var_export($name, TRUE) .
+                            ' must be specified in an array.');
+                    }
+                    $attributes[$name] = array_intersect($attributes[$name], $allowedAttributes[$name]);
+                    if (!empty($attributes[$name])) {
+                        continue;
+                    }
+                }
+                unset($attributes[$name]);
 			}
 		}
 
 	}
 
 }
-
-?>
\ No newline at end of file
-- 
GitLab