diff --git a/tests/modules/core/lib/Auth/Source/Auth_Source_SP_Test.php b/tests/modules/core/lib/Auth/Source/Auth_Source_SP_Test.php deleted file mode 100644 index d91bdff3c1fc13701720600301f40c7189cd9d5d..0000000000000000000000000000000000000000 --- a/tests/modules/core/lib/Auth/Source/Auth_Source_SP_Test.php +++ /dev/null @@ -1,200 +0,0 @@ -<?php - -// Custom Exception to throw to terminate a TestCase -class ExitTestException extends Exception { - private $testResult; - - public function __construct($testResult) { - parent::__construct("ExitTestException", 0, null); - $this->testResult = $testResult; - } - - function getTestResult() { - return $this->testResult; - } -} - - -/* Wrap the SSP sspmod_saml_Auth_Source_SP class - - Use introspection to make startSSO2Test available - - Override sendSAML2AuthnRequest() to catch the AuthnRequest being sent -*/ -class sspmod_saml_Auth_Source_SP_Tester extends \sspmod_saml_Auth_Source_SP -{ - public function __construct($info, $config) { - parent::__construct($info, $config); - } - - public function startSSO2Test(SimpleSAML_Configuration $idpMetadata, array $state) { - $reflector = new ReflectionObject($this); - $method=$reflector->getMethod('startSSO2'); - $method->setAccessible(true); - $method->invoke($this, $idpMetadata, $state); - } - - // Override - public function sendSAML2AuthnRequest(array &$state, SAML2_Binding $binding, SAML2_AuthnRequest $ar) { - // Exit test. Continuing would mean running into a assert(FALSE) - throw new ExitTestException( - array( - 'state' => $state, - 'binding' => $binding, - 'ar' => $ar, - ) - ); - } -} - -class Auth_Source_SP_Test extends PHPUnit_Framework_TestCase -{ - private $idpMetadata = NULL; - private $idpConfigArray = array( - 'metadata-set' => 'saml20-idp-remote', - 'entityid' => 'https://engine.surfconext.nl/authentication/idp/metadata', - 'SingleSignOnService' => - array ( - 0 => - array ( - 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', - 'Location' => 'https://engine.surfconext.nl/authentication/idp/single-sign-on', - ), - ), - 'keys' => - array ( - 0 => - array ( - 'encryption' => false, - 'signing' => true, - 'type' => 'X509Certificate', - 'X509Certificate' => 'MIID3zCCAsegAwIBAgIJAMVC9xn1ZfsuMA0GCSqGSIb3DQEBCwUAMIGFMQswCQYDVQQGEwJOTDEQMA4GA1UECAwHVXRyZWNodDEQMA4GA1UEBwwHVXRyZWNodDEVMBMGA1UECgwMU1VSRm5ldCBCLlYuMRMwEQYDVQQLDApTVVJGY29uZXh0MSYwJAYDVQQDDB1lbmdpbmUuc3VyZmNvbmV4dC5ubCAyMDE0MDUwNTAeFw0xNDA1MDUxNDIyMzVaFw0xOTA1MDUxNDIyMzVaMIGFMQswCQYDVQQGEwJOTDEQMA4GA1UECAwHVXRyZWNodDEQMA4GA1UEBwwHVXRyZWNodDEVMBMGA1UECgwMU1VSRm5ldCBCLlYuMRMwEQYDVQQLDApTVVJGY29uZXh0MSYwJAYDVQQDDB1lbmdpbmUuc3VyZmNvbmV4dC5ubCAyMDE0MDUwNTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKthMDbB0jKHefPzmRu9t2h7iLP4wAXr42bHpjzTEk6gttHFb4l/hFiz1YBI88TjiH6hVjnozo/YHA2c51us+Y7g0XoS7653lbUN/EHzvDMuyis4Xi2Ijf1A/OUQfH1iFUWttIgtWK9+fatXoGUS6tirQvrzVh6ZstEp1xbpo1SF6UoVl+fh7tM81qz+Crr/Kroan0UjpZOFTwxPoK6fdLgMAieKSCRmBGpbJHbQ2xxbdykBBrBbdfzIX4CDepfjE9h/40ldw5jRn3e392jrS6htk23N9BWWrpBT5QCk0kH3h/6F1Dm6TkyG9CDtt73/anuRkvXbeygI4wml9bL3rE8CAwEAAaNQME4wHQYDVR0OBBYEFD+Ac7akFxaMhBQAjVfvgGfY8hNKMB8GA1UdIwQYMBaAFD+Ac7akFxaMhBQAjVfvgGfY8hNKMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAC8L9D67CxIhGo5aGVu63WqRHBNOdo/FAGI7LURDFeRmG5nRw/VXzJLGJksh4FSkx7aPrxNWF1uFiDZ80EuYQuIv7bDLblK31ZEbdg1R9LgiZCdYSr464I7yXQY9o6FiNtSKZkQO8EsscJPPy/Zp4uHAnADWACkOUHiCbcKiUUFu66dX0Wr/v53Gekz487GgVRs8HEeT9MU1reBKRgdENR8PNg4rbQfLc3YQKLWK7yWnn/RenjDpuCiePj8N8/80tGgrNgK/6fzM3zI18sSywnXLswxqDb/J+jgVxnQ6MrsTf1urM8MnfcxG/82oHIwfMh/sXPCZpo+DTLkhQxctJ3M=', - ), - ), - ); - - private function getIdpMetadata() { - - if (!$this->idpMetadata) { - $this->idpMetadata = new SimpleSAML_Configuration($this->idpConfigArray, 'Auth_Source_SP_Test::getIdpMetadata()'); - } - - return $this->idpMetadata; - } - - /** Create a SAML AuthnRequest using sspmod_saml_Auth_Source_SP - * @param $state State Array to use in the test. This is an array of the Parameters described in section 2 of - * https://simplesamlphp.org/docs/development/saml:sp - * @return SAML2_AuthnRequest - */ - private function CreateAuthnRequest($state = array()) { - $info=array( 'AuthId' => 'default-sp' ); - $config=array(); - $as = new \sspmod_saml_Auth_Source_SP_Tester($info, $config); - - /** @var SAML2_AuthnRequest $ar */ - $ar=NULL; - try { - $as->startSSO2Test($this->getIdpMetadata(), $state); - $this->assertTrue(FALSE, 'Expected ExitTestException'); - } - catch (ExitTestException $e) { - $r = $e->getTestResult(); - $ar = $r['ar']; - } - return $ar; - } - - /** Test generating a authnrequest - * @test **/ - public function TestAuthnRequest() { - /** @var SAML2_AuthnRequest $ar */ - $ar = $this->CreateAuthnRequest(); - - // Assert values in the generated AuthnRequest - /** @var $xml DOMElement */ - $xml=$ar->toSignedXML(); - // echo $xml->ownerDocument->saveXML($xml); // Print XML - $q=SAML2_Utils::xpQuery($xml, '/samlp:AuthnRequest/@Destination'); - $this->assertEquals( - $this->idpConfigArray['SingleSignOnService'][0]['Location'], - $q[0]->value); - $q=SAML2_Utils::xpQuery($xml, '/samlp:AuthnRequest/saml:Issuer'); - $this->assertEquals( - 'http://localhost/simplesaml/module.php/saml/sp/metadata.php/default-sp', - $q[0]->textContent); - } - - /** Test setting a Subject - * @test **/ - public function TestNameID() { - $state=array( - 'saml:NameID' => array('Value' => 'user@example.org', 'Format' => SAML2_Const::NAMEID_UNSPECIFIED) - ); - - /** @var SAML2_AuthnRequest $ar */ - $ar = $this->CreateAuthnRequest($state); - - $nameID=$ar->getNameId(); - $this->assertEquals($state['saml:NameID']['Value'], $nameID['Value']); - $this->assertEquals($state['saml:NameID']['Format'], $nameID['Format']); - - /** @var $xml DOMElement */ - $xml=$ar->toSignedXML(); - //echo $xml->ownerDocument->saveXML($xml); // Print XML - $q=SAML2_Utils::xpQuery($xml, '/samlp:AuthnRequest/saml:Subject/saml:NameID/@Format'); - $this->assertEquals( - $state['saml:NameID']['Format'], - $q[0]->value); - $q=SAML2_Utils::xpQuery($xml, '/samlp:AuthnRequest/saml:Subject/saml:NameID'); - $this->assertEquals( - $state['saml:NameID']['Value'], - $q[0]->textContent); - } - - /** Test setting an AuthnConextClassRef - * @test **/ - public function TestAuthnContextClassRef() { - $state=array( - 'saml:AuthnContextClassRef' => 'http://example.com/myAuthnContextClassRef' - ); - - /** @var SAML2_AuthnRequest $ar */ - $ar = $this->CreateAuthnRequest($state); - - $a=$ar->getRequestedAuthnContext(); - $this->assertEquals( - $state['saml:AuthnContextClassRef'], - $a['AuthnContextClassRef'][0] ); - - /** @var $xml DOMElement */ - $xml=$ar->toSignedXML(); - //echo $xml->ownerDocument->saveXML($xml); // Print XML - $q=SAML2_Utils::xpQuery($xml, '/samlp:AuthnRequest/samlp:RequestedAuthnContext/saml:AuthnContextClassRef'); - $this->assertEquals( - $state['saml:AuthnContextClassRef'], - $q[0]->textContent); - } - - /** Test setting ForcedAuthn - * @test **/ - public function TestForcedAuthn() { - $state=array( - 'ForceAuthn' => true - ); - - /** @var SAML2_AuthnRequest $ar */ - $ar = $this->CreateAuthnRequest($state); - - $this->assertEquals( - $state['ForceAuthn'], - $ar->getForceAuthn() ); - - /** @var $xml DOMElement */ - $xml=$ar->toSignedXML(); - //echo $xml->ownerDocument->saveXML($xml); // Print XML - $q=SAML2_Utils::xpQuery($xml, '/samlp:AuthnRequest/@ForceAuthn'); - $this->assertEquals( - $state['ForceAuthn'] ? 'true' : 'false', - $q[0]->value); - } - -} diff --git a/tests/modules/saml/lib/Auth/Source/Auth_Source_SP_Test.php b/tests/modules/saml/lib/Auth/Source/Auth_Source_SP_Test.php new file mode 100644 index 0000000000000000000000000000000000000000..bfa81b4efb2b1a3316feb9c60777a2136e1a5ab3 --- /dev/null +++ b/tests/modules/saml/lib/Auth/Source/Auth_Source_SP_Test.php @@ -0,0 +1,261 @@ +<?php + + +/** + * Custom Exception to throw to terminate a TestCase. + */ +class ExitTestException extends Exception +{ + private $testResult; + + + public function __construct($testResult) + { + parent::__construct("ExitTestException", 0, null); + $this->testResult = $testResult; + } + + + public function getTestResult() + { + return $this->testResult; + } +} + + +/** + * Wrap the SSP sspmod_saml_Auth_Source_SP class + * - Use introspection to make startSSO2Test available + * - Override sendSAML2AuthnRequest() to catch the AuthnRequest being sent + */ +class sspmod_saml_Auth_Source_SP_Tester extends \sspmod_saml_Auth_Source_SP +{ + + public function __construct($info, $config) + { + parent::__construct($info, $config); + } + + + public function startSSO2Test(SimpleSAML_Configuration $idpMetadata, array $state) + { + $reflector = new ReflectionObject($this); + $method = $reflector->getMethod('startSSO2'); + $method->setAccessible(true); + $method->invoke($this, $idpMetadata, $state); + } + + + // override the method that sends the request to avoid sending anything + public function sendSAML2AuthnRequest(array &$state, SAML2_Binding $binding, SAML2_AuthnRequest $ar) + { + // Exit test. Continuing would mean running into a assert(FALSE) + throw new ExitTestException( + array( + 'state' => $state, + 'binding' => $binding, + 'ar' => $ar, + ) + ); + } +} + + +/** + * Set of test cases for sspmod_saml_Auth_Source_SP. + */ +class Auth_Source_SP_Test extends PHPUnit_Framework_TestCase +{ + + private $idpMetadata = null; + + private $idpConfigArray; + + + private function getIdpMetadata() + { + if (!$this->idpMetadata) { + $this->idpMetadata = new SimpleSAML_Configuration( + $this->idpConfigArray, + 'Auth_Source_SP_Test::getIdpMetadata()' + ); + } + + return $this->idpMetadata; + } + + + protected function setUp() + { + $this->idpConfigArray = array( + 'metadata-set' => 'saml20-idp-remote', + 'entityid' => 'https://engine.surfconext.nl/authentication/idp/metadata', + 'SingleSignOnService' => array( + array( + 'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect', + 'Location' => 'https://engine.surfconext.nl/authentication/idp/single-sign-on', + ), + ), + 'keys' => array( + array( + 'encryption' => false, + 'signing' => true, + 'type' => 'X509Certificate', + 'X509Certificate' => + 'MIID3zCCAsegAwIBAgIJAMVC9xn1ZfsuMA0GCSqGSIb3DQEBCwUAMIGFMQswCQYDVQQGEwJOTDEQMA4GA1UECAwHVXRyZ'. + 'WNodDEQMA4GA1UEBwwHVXRyZWNodDEVMBMGA1UECgwMU1VSRm5ldCBCLlYuMRMwEQYDVQQLDApTVVJGY29uZXh0MSYwJA'. + 'YDVQQDDB1lbmdpbmUuc3VyZmNvbmV4dC5ubCAyMDE0MDUwNTAeFw0xNDA1MDUxNDIyMzVaFw0xOTA1MDUxNDIyMzVaMIG'. + 'FMQswCQYDVQQGEwJOTDEQMA4GA1UECAwHVXRyZWNodDEQMA4GA1UEBwwHVXRyZWNodDEVMBMGA1UECgwMU1VSRm5ldCBC'. + 'LlYuMRMwEQYDVQQLDApTVVJGY29uZXh0MSYwJAYDVQQDDB1lbmdpbmUuc3VyZmNvbmV4dC5ubCAyMDE0MDUwNTCCASIwD'. + 'QYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKthMDbB0jKHefPzmRu9t2h7iLP4wAXr42bHpjzTEk6gttHFb4l/hFiz1Y'. + 'BI88TjiH6hVjnozo/YHA2c51us+Y7g0XoS7653lbUN/EHzvDMuyis4Xi2Ijf1A/OUQfH1iFUWttIgtWK9+fatXoGUS6ti'. + 'rQvrzVh6ZstEp1xbpo1SF6UoVl+fh7tM81qz+Crr/Kroan0UjpZOFTwxPoK6fdLgMAieKSCRmBGpbJHbQ2xxbdykBBrBb'. + 'dfzIX4CDepfjE9h/40ldw5jRn3e392jrS6htk23N9BWWrpBT5QCk0kH3h/6F1Dm6TkyG9CDtt73/anuRkvXbeygI4wml9'. + 'bL3rE8CAwEAAaNQME4wHQYDVR0OBBYEFD+Ac7akFxaMhBQAjVfvgGfY8hNKMB8GA1UdIwQYMBaAFD+Ac7akFxaMhBQAjV'. + 'fvgGfY8hNKMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAC8L9D67CxIhGo5aGVu63WqRHBNOdo/FAGI7LUR'. + 'DFeRmG5nRw/VXzJLGJksh4FSkx7aPrxNWF1uFiDZ80EuYQuIv7bDLblK31ZEbdg1R9LgiZCdYSr464I7yXQY9o6FiNtSK'. + 'ZkQO8EsscJPPy/Zp4uHAnADWACkOUHiCbcKiUUFu66dX0Wr/v53Gekz487GgVRs8HEeT9MU1reBKRgdENR8PNg4rbQfLc'. + '3YQKLWK7yWnn/RenjDpuCiePj8N8/80tGgrNgK/6fzM3zI18sSywnXLswxqDb/J+jgVxnQ6MrsTf1urM8MnfcxG/82oHI'. + 'wfMh/sXPCZpo+DTLkhQxctJ3M=', + ), + ), + ); + } + + + /** Create a SAML AuthnRequest using sspmod_saml_Auth_Source_SP + * + * @param array $state The state array to use in the test. This is an array of the parameters described in section + * 2 of https://simplesamlphp.org/docs/development/saml:sp + * + * @return SAML2_AuthnRequest The AuthnRequest generated. + */ + private function createAuthnRequest($state = array()) + { + $info = array('AuthId' => 'default-sp'); + $config = array(); + $as = new \sspmod_saml_Auth_Source_SP_Tester($info, $config); + + /** @var SAML2_AuthnRequest $ar */ + $ar = null; + try { + $as->startSSO2Test($this->getIdpMetadata(), $state); + $this->assertTrue(false, 'Expected ExitTestException'); + } catch (ExitTestException $e) { + $r = $e->getTestResult(); + $ar = $r['ar']; + } + return $ar; + } + + + /** + * Test generating an AuthnRequest + * @test + */ + public function testAuthnRequest() + { + /** @var SAML2_AuthnRequest $ar */ + $ar = $this->createAuthnRequest(); + + // Assert values in the generated AuthnRequest + /** @var $xml DOMElement */ + $xml = $ar->toSignedXML(); + $q = SAML2_Utils::xpQuery($xml, '/samlp:AuthnRequest/@Destination'); + $this->assertEquals( + $this->idpConfigArray['SingleSignOnService'][0]['Location'], + $q[0]->value + ); + $q = SAML2_Utils::xpQuery($xml, '/samlp:AuthnRequest/saml:Issuer'); + $this->assertEquals( + 'http://localhost/simplesaml/module.php/saml/sp/metadata.php/default-sp', + $q[0]->textContent + ); + } + + + /** Test setting a Subject + * @test * + */ + public function testNameID() + { + $state = array( + 'saml:NameID' => array('Value' => 'user@example.org', 'Format' => SAML2_Const::NAMEID_UNSPECIFIED) + ); + + /** @var SAML2_AuthnRequest $ar */ + $ar = $this->createAuthnRequest($state); + + $nameID = $ar->getNameId(); + $this->assertEquals($state['saml:NameID']['Value'], $nameID['Value']); + $this->assertEquals($state['saml:NameID']['Format'], $nameID['Format']); + + /** @var $xml DOMElement */ + $xml = $ar->toSignedXML(); + $q = SAML2_Utils::xpQuery($xml, '/samlp:AuthnRequest/saml:Subject/saml:NameID/@Format'); + $this->assertEquals( + $state['saml:NameID']['Format'], + $q[0]->value + ); + $q = SAML2_Utils::xpQuery($xml, '/samlp:AuthnRequest/saml:Subject/saml:NameID'); + $this->assertEquals( + $state['saml:NameID']['Value'], + $q[0]->textContent + ); + } + + + /** Test setting an AuthnConextClassRef + * @test * + */ + public function testAuthnContextClassRef() + { + $state = array( + 'saml:AuthnContextClassRef' => 'http://example.com/myAuthnContextClassRef' + ); + + /** @var SAML2_AuthnRequest $ar */ + $ar = $this->createAuthnRequest($state); + + $a = $ar->getRequestedAuthnContext(); + $this->assertEquals( + $state['saml:AuthnContextClassRef'], + $a['AuthnContextClassRef'][0] + ); + + /** @var $xml DOMElement */ + $xml = $ar->toSignedXML(); + $q = SAML2_Utils::xpQuery($xml, '/samlp:AuthnRequest/samlp:RequestedAuthnContext/saml:AuthnContextClassRef'); + $this->assertEquals( + $state['saml:AuthnContextClassRef'], + $q[0]->textContent + ); + } + + + /** Test setting ForcedAuthn + * @test * + */ + public function testForcedAuthn() + { + $state = array( + 'ForceAuthn' => true + ); + + /** @var SAML2_AuthnRequest $ar */ + $ar = $this->createAuthnRequest($state); + + $this->assertEquals( + $state['ForceAuthn'], + $ar->getForceAuthn() + ); + + /** @var $xml DOMElement */ + $xml = $ar->toSignedXML(); + $q = SAML2_Utils::xpQuery($xml, '/samlp:AuthnRequest/@ForceAuthn'); + $this->assertEquals( + $state['ForceAuthn'] ? 'true' : 'false', + $q[0]->value + ); + } +}