diff --git a/composer.json b/composer.json index 0e153b21a1ef4ff547afcecd3461b175a6313ec1..c60f3b3bffa7fee2534847bc1f96a9b8554e65ab 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,7 @@ "type": "library", "homepage": "https://git.doit.wisc.edu/adi-ia/uw-php-security", "license": "Apache-2.0", - "version": "1.0.2", + "version": "1.0.3", "authors": [{ "name": "UW-Madison DoIT ADI Integrated Applications", "email": "adi-ia@lists.wisc.edu", diff --git a/src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php index 94ea4103c21605fe9d289b10e01d41e699e405b9..a0c17d476ca71eccaf07585f4889fcc337a0eb46 100644 --- a/src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php +++ b/src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php @@ -28,8 +28,8 @@ class FederatedPreauthUserDetailsProvider implements UserDetailsProvider public function loadUser() { // Return null if no Shib session is found - if (empty(getenv(FederatedPreauthUserDetailsProvider::SHIB_SESSION_ID)) && - empty(getenv(FederatedPreauthUserDetailsProvider::SHIB_SESSION_ID_HTTP))) { + if ($this->httpHeaders && !getenv(FederatedPreauthUserDetailsProvider::SHIB_SESSION_ID_HTTP) || + !$this->httpHeaders && !getenv(FederatedPreauthUserDetailsProvider::SHIB_SESSION_ID)) { return null; } diff --git a/src/test/edu/wisc/doit/FederatedPreauthUserDetailsProviderTest.php b/src/test/edu/wisc/doit/FederatedPreauthUserDetailsProviderTest.php deleted file mode 100644 index 4accd8e943d0370605f6e361a292f4c614d0b517..0000000000000000000000000000000000000000 --- a/src/test/edu/wisc/doit/FederatedPreauthUserDetailsProviderTest.php +++ /dev/null @@ -1,102 +0,0 @@ -<?php - -use edu\wisc\doit\UserDetailsProvider; -use edu\wisc\doit\FederatedPreauthUserDetailsProvider; - -/** - * Tests for {@link FederatedPreauthUserDetailsProvider}. - */ -class FederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_TestCase -{ - - /** @var array */ - private $attributes; - - /** @var UserDetailsProvider */ - private $userProvider; - - /** - * Populate putenv with Shib attributes to simulate a logged in user - */ - protected function setUp() - { - parent::setUp(); - $jsonString = file_get_contents(__DIR__ . "/../../../resources/testuser.json"); - if ($jsonString === false) { - return null; - } - - $this->attributes = json_decode($jsonString, true); - } - - public function testLoadUser() - { - $this->setupHttpPreauthEnvironment(); - $this->userProvider = new FederatedPreauthUserDetailsProvider(true); - $user = $this->userProvider->loadUser(); - $this->assertNotNull($user); - $this->assertEquals("bbadger@wisc.edu", $user->getEppn()); - $this->assertEquals("UW123A456", $user->getPvi()); - $this->assertEquals("BUCKINGHAM BADGER", $user->getFullName()); - $this->assertEquals("bucky.badger@wisc.edu", $user->getEmailAddress()); - $this->assertEquals("a_source", $user->getSource()); - $this->assertEquals("123456789", $user->getIsisEmplid()); - $this->assertEquals("BUCKINGHAM", $user->getFirstName()); - $this->assertEquals("BADGER", $user->getLastName()); - } - - public function testLoadUserWithNoEPPN() - { - $this->setupHttpPreauthEnvironment(); - $this->userProvider = new FederatedPreauthUserDetailsProvider(true); - // Clear Shib session ID to simulate no session - putenv(UserDetailsProvider::SHIB_SESSION_ID); - $user = $this->userProvider->loadUser(); - $this->assertNull($user); - } - - public function testLoadUserWithNoEmail() - { - $this->setupHttpPreauthEnvironment(); - $this->userProvider = new FederatedPreauthUserDetailsProvider(true); - // Clear email to simulate no email - putenv('HTTP_' . strtoupper(UserDetailsProvider::FED_EMAIL)); - $user = $this->userProvider->loadUser(); - $this->assertFalse($user->getEmailAddress()); - } - - /** - * Setup environment to simulate a Preauth (Shib) environment. - */ - private function setupPreauthEnvironment() - { - putenv(UserDetailsProvider::FED_EPPN . '=' . $this->attributes[UserDetailsProvider::FED_EPPN]); - putenv(UserDetailsProvider::FED_SPVI . '=' . $this->attributes[UserDetailsProvider::FED_SPVI]); - putenv(UserDetailsProvider::FED_FULLNAME . '=' . $this->attributes[UserDetailsProvider::FED_FULLNAME]); - putenv(UserDetailsProvider::FED_FIRST_NAME . '=' . $this->attributes[UserDetailsProvider::FED_FIRST_NAME]); - putenv(UserDetailsProvider::FED_LAST_NAME . '=' . $this->attributes[UserDetailsProvider::FED_LAST_NAME]); - putenv(UserDetailsProvider::UDDS . '=' . implode(",", $this->attributes[UserDetailsProvider::UDDS])); - putenv(UserDetailsProvider::FED_EMAIL . '=' . $this->attributes[UserDetailsProvider::FED_EMAIL]); - putenv(UserDetailsProvider::SOURCE . '=' . $this->attributes[UserDetailsProvider::SOURCE]); - putenv(UserDetailsProvider::ISIS_EMPLID . '=' . $this->attributes[UserDetailsProvider::ISIS_EMPLID]); - putenv(UserDetailsProvider::SHIB_SESSION_ID . '=' . $this->attributes[UserDetailsProvider::SHIB_SESSION_ID]); - } - - /** - * Setup environment to simulate HTTP Preauth. - */ - private function setupHttpPreauthEnvironment() - { - putenv('HTTP_' . strtoupper(UserDetailsProvider::FED_EPPN) . '=' . $this->attributes[UserDetailsProvider::FED_EPPN]); - putenv('HTTP_' . strtoupper(UserDetailsProvider::FED_SPVI) . '=' . $this->attributes[UserDetailsProvider::FED_SPVI]); - putenv('HTTP_' . strtoupper(UserDetailsProvider::FED_FULLNAME) . '=' . $this->attributes[UserDetailsProvider::FED_FULLNAME]); - putenv('HTTP_' . strtoupper(UserDetailsProvider::FED_FIRST_NAME) . '=' . $this->attributes[UserDetailsProvider::FED_FIRST_NAME]); - putenv('HTTP_' . strtoupper(UserDetailsProvider::FED_LAST_NAME) . '=' . $this->attributes[UserDetailsProvider::FED_LAST_NAME]); - putenv('HTTP_' . strtoupper(UserDetailsProvider::UDDS) . '=' . implode(",", $this->attributes[UserDetailsProvider::UDDS])); - putenv('HTTP_' . strtoupper(UserDetailsProvider::FED_EMAIL) . '=' . $this->attributes[UserDetailsProvider::FED_EMAIL]); - putenv('HTTP_' . strtoupper(UserDetailsProvider::SOURCE) . '=' . $this->attributes[UserDetailsProvider::SOURCE]); - putenv('HTTP_' . strtoupper(UserDetailsProvider::ISIS_EMPLID) . '=' . $this->attributes[UserDetailsProvider::ISIS_EMPLID]); - putenv(UserDetailsProvider::SHIB_SESSION_ID . '=' . $this->attributes[UserDetailsProvider::SHIB_SESSION_ID]); - } - -} diff --git a/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php b/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..683915a8cf0ad7df20511edd932756f44fbd281c --- /dev/null +++ b/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php @@ -0,0 +1,79 @@ +<?php + +use edu\wisc\doit\UserDetailsProvider; +use edu\wisc\doit\FederatedPreauthUserDetailsProvider; + +/** + * Tests for {@link FederatedPreauthUserDetailsProvider}. + */ +class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_TestCase +{ + + /** @var array */ + private $attributes; + + /** @var UserDetailsProvider */ + private $userProvider; + + /** + * Populate putenv with Shib attributes to simulate a logged in user + */ + protected function setUp() + { + parent::setUp(); + $jsonString = file_get_contents(__DIR__ . "/../../../resources/testuser_http.json"); + if ($jsonString === false) { + return null; + } + + $this->attributes = json_decode($jsonString, true); + $this->userProvider = new FederatedPreauthUserDetailsProvider(true); + + putenv($this->mapAttribute(UserDetailsProvider::FED_EPPN) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::FED_EPPN)]); + putenv($this->mapAttribute(UserDetailsProvider::FED_SPVI) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::FED_SPVI)]); + putenv($this->mapAttribute(UserDetailsProvider::FED_FULLNAME) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::FED_FULLNAME)]); + putenv($this->mapAttribute(UserDetailsProvider::FED_FIRST_NAME) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::FED_FIRST_NAME)]); + putenv($this->mapAttribute(UserDetailsProvider::FED_LAST_NAME) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::FED_LAST_NAME)]); + putenv($this->mapAttribute(UserDetailsProvider::UDDS) . '=' . implode(",", $this->attributes[$this->mapAttribute(UserDetailsProvider::UDDS)])); + putenv($this->mapAttribute(UserDetailsProvider::FED_EMAIL) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::FED_EMAIL)]); + putenv($this->mapAttribute(UserDetailsProvider::SOURCE) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::SOURCE)]); + putenv($this->mapAttribute(UserDetailsProvider::ISIS_EMPLID) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::ISIS_EMPLID)]); + putenv(UserDetailsProvider::SHIB_SESSION_ID_HTTP . '=' . $this->attributes[UserDetailsProvider::SHIB_SESSION_ID_HTTP]); + } + + public function testLoadUser() + { + $user = $this->userProvider->loadUser(); + $this->assertNotNull($user); + $this->assertEquals("bbadger@wisc.edu", $user->getEppn()); + $this->assertEquals("UW123A456", $user->getPvi()); + $this->assertEquals("BUCKINGHAM BADGER", $user->getFullName()); + $this->assertEquals("bucky.badger@wisc.edu", $user->getEmailAddress()); + $this->assertEquals("a_source", $user->getSource()); + $this->assertEquals("123456789", $user->getIsisEmplid()); + $this->assertEquals("BUCKINGHAM", $user->getFirstName()); + $this->assertEquals("BADGER", $user->getLastName()); + } + + public function testLoadUserWithNoEPPN() + { + // Clear Shib session ID to simulate no session + putenv(UserDetailsProvider::SHIB_SESSION_ID_HTTP); + $user = $this->userProvider->loadUser(); + $this->assertNull($user); + } + + public function testLoadUserWithNoEmail() + { + // Clear email to simulate no email + putenv('HTTP_' . strtoupper(UserDetailsProvider::FED_EMAIL)); + $user = $this->userProvider->loadUser(); + $this->assertFalse($user->getEmailAddress()); + } + + private function mapAttribute($attribute) + { + return 'HTTP_' . strtoupper($attribute); + } + +} diff --git a/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php b/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php index 175219a72223dd6c2e651a092965777bb9627a95..52b4bb8fa1d4d6754791333cea72b7ae24c74614 100644 --- a/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php +++ b/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php @@ -10,7 +10,7 @@ class LocalUserDetailsProviderTest extends \PHPUnit_Framework_TestCase public function testLoadUser() { - $userDetailsService = new LocalUserDetailsProvider(__DIR__ . "/../../../resources/testuser.json"); + $userDetailsService = new LocalUserDetailsProvider(__DIR__ . "/../../../resources/localuser.json"); $user = $userDetailsService->loadUser(); $this->assertEquals("bbadger@wisc.edu", $user->getEppn()); $this->assertEquals("UW123A456", $user->getPvi()); diff --git a/src/test/resources/testuser.json b/src/test/resources/localuser.json similarity index 84% rename from src/test/resources/testuser.json rename to src/test/resources/localuser.json index 57b252d5d69b82f576f98be3b34ed07d2f63eac1..a3a534459cfdc2a46fbf549dc978220726505e98 100644 --- a/src/test/resources/testuser.json +++ b/src/test/resources/localuser.json @@ -11,6 +11,5 @@ ], "eduWisconsinEmailAddress": "bucky.badger@wisc.edu", "source": "a_source", - "isisEmplid": "123456789", - "Shib-Session-Id": "1234567890" + "isisEmplid": "123456789" } \ No newline at end of file diff --git a/src/test/resources/testuser_http.json b/src/test/resources/testuser_http.json new file mode 100644 index 0000000000000000000000000000000000000000..7de908f421b737c919579067ef9789b1286303ea --- /dev/null +++ b/src/test/resources/testuser_http.json @@ -0,0 +1,16 @@ +{ + "HTTP_EPPN": "bbadger@wisc.edu", + "HTTP_EDUWISCONSINSPVI": "UW123A456", + "HTTP_CN": "BUCKINGHAM BADGER", + "HTTP_EDUWISCONSINCOMMONNAME": "BUCKINGHAM BADGER", + "HTTP_EDUWISCONSINGIVENNAME": "BUCKINGHAM", + "HTTP_EDUWISCONSINSURNAME": "BADGER", + "HTTP_UDDS": [ + "UW123A456", + "UW234A567" + ], + "HTTP_EDUWISCONSINEMAILADDRESS": "bucky.badger@wisc.edu", + "HTTP_SOURCE": "a_source", + "HTTP_ISISEMPLID": "123456789", + "HTTP_SHIB_SESSION_ID": "1234567890" +} \ No newline at end of file