diff --git a/tests/modules/saml/lib/Auth/Process/FilterScopesTest.php b/tests/modules/saml/lib/Auth/Process/FilterScopesTest.php new file mode 100644 index 0000000000000000000000000000000000000000..4f595c609d4183c4eebad8479a6b4e469554829c --- /dev/null +++ b/tests/modules/saml/lib/Auth/Process/FilterScopesTest.php @@ -0,0 +1,137 @@ +<?php +/** + * Test for the saml:FilterScopes filter. + * + * @author Jaime PĂ©rez Crespo, UNINETT AS <jaime.perez@uninett.no> + * @package SimpleSAMLphp + */ + +namespace SimpleSAML\Test\Module\saml\Auth\Process; + + +class FilterScopesTest extends \PHPUnit_Framework_TestCase +{ + + /* + * Helper function to run the filter with a given configuration. + * + * @param array $config The filter configuration. + * @param array $request The request state. + * @return array The state array after processing. + */ + private function processFilter(array $config, array $request) + { + $filter = new \SimpleSAML\Module\saml\Auth\Process\FilterScopes($config, null); + $filter->process($request); + return $request; + } + + + /** + * Test valid scopes. + */ + public function testValidScopes() + { + // test declared scopes + $config = array(); + $request = array( + 'Source' => array( + 'SingleSignOnService' => array( + array( + 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', + 'Location' => 'https://example.org/saml2/idp/SSOService.php', + ), + ), + 'scope' => array( + 'example.com', + 'example.net', + ), + ), + 'Attributes' => array( + 'eduPersonPrincipalName' => array('jdoe@example.com'), + ), + ); + $result = $this->processFilter($config, $request); + $this->assertEquals($request['Attributes'], $result['Attributes']); + + // test multiple values + $request['Attributes'] = array( + 'eduPersonPrincipalName' => array( + 'jdoe@example.com', + 'jdoe@example.net', + ), + ); + $result = $this->processFilter($config, $request); + $this->assertEquals($request['Attributes'], $result['Attributes']); + + // test implicit scope + $request['Attributes'] = array( + 'eduPersonPrincipalName' => array('jdoe@example.org'), + ); + $result = $this->processFilter($config, $request); + $this->assertEquals($request['Attributes'], $result['Attributes']); + + // test alternative attributes + $config['attributes'] = array( + 'mail', + ); + $request['Attributes'] = array( + 'mail' => array('john.doe@example.org'), + ); + $result = $this->processFilter($config, $request); + $this->assertEquals($request['Attributes'], $result['Attributes']); + + // test non-scoped attributes + $request['Attributes']['givenName'] = 'John Doe'; + $result = $this->processFilter($config, $request); + $this->assertEquals($request['Attributes'], $result['Attributes']); + } + + + /** + * Test invalid scopes. + */ + public function testInvalidScopes() + { + // test scope not matching anything, empty attribute + $config = array(); + $request = array( + 'Source' => array( + 'SingleSignOnService' => array( + array( + 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', + 'Location' => 'https://example.org/saml2/idp/SSOService.php', + ), + ), + 'scope' => array( + 'example.com', + 'example.net', + ), + ), + 'Attributes' => array( + 'eduPersonPrincipalName' => array('jdoe@example.edu'), + ), + ); + $result = $this->processFilter($config, $request); + $this->assertEquals(array(), $result['Attributes']); + + // test some scopes allowed and some others not + $request['Attributes']['eduPersonPrincipalName'][] = 'jdoe@example.com'; + $result = $this->processFilter($config, $request); + $this->assertEquals( + array( + 'eduPersonPrincipalName' => array( + 'jdoe@example.com', + ), + ), + $result['Attributes'] + ); + + // test attribute missing scope + $request['Attributes'] = array( + 'eduPersonPrincipalName' => array('jdoe'), + ); + $result = $this->processFilter($config, $request); + $this->assertEquals($request['Attributes'], $result['Attributes']); + } +}