diff --git a/composer.json b/composer.json index c60f3b3bffa7fee2534847bc1f96a9b8554e65ab..12afc2b80ff0e4f78b173f3c616b9a5395307e48 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.3", + "version": "2.0.0", "authors": [{ "name": "UW-Madison DoIT ADI Integrated Applications", "email": "adi-ia@lists.wisc.edu", @@ -19,7 +19,7 @@ }, "autoload": { "psr-4": { - "edu\\wisc\\doit\\": "src/main/edu/wisc/doit/" + "edu\\wisc\\doit\\uwphps": "src/main/edu/wisc/doit/uwphps" } } } diff --git a/src/main/edu/wisc/doit/uwphps/UWUserDetails.php b/src/main/edu/wisc/doit/uwphps/UWUserDetails.php index cb1a6469e92cfa5088e1227ae347dffe79a726c9..1ba3f6c79cf727d645b58f16d62c2d6c51ad9aa7 100644 --- a/src/main/edu/wisc/doit/uwphps/UWUserDetails.php +++ b/src/main/edu/wisc/doit/uwphps/UWUserDetails.php @@ -39,8 +39,17 @@ class UWUserDetails implements UserDetails * @param string $firstName * @param string $lastName */ - public function __construct($eppn, $pvi, $fullName, $udds, $emailAddress, $source, $isisEmplid, $firstName, $lastName) - { + public function __construct( + $eppn, + $pvi, + $fullName, + $udds, + $emailAddress, + $source, + $isisEmplid, + $firstName, + $lastName + ) { $this->eppn = $eppn; $this->pvi = $pvi; $this->fullName = $fullName; diff --git a/src/main/edu/wisc/doit/uwphps/UserDetails.php b/src/main/edu/wisc/doit/uwphps/UserDetails.php index 93cb4220ed926b171802b0ffccfd6cba278ab179..d3a36eae017ff3b3c8e1b2cb7a1ba47a7f003f25 100644 --- a/src/main/edu/wisc/doit/uwphps/UserDetails.php +++ b/src/main/edu/wisc/doit/uwphps/UserDetails.php @@ -74,4 +74,4 @@ interface UserDetails */ public function getLastName(); -} \ No newline at end of file +} diff --git a/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php index 1cf730d62d52a992d574b809e6b1b5d958899582..3f604e3b3b07c561e90e60ef7bb0b14b20ebc151 100644 --- a/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php +++ b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php @@ -12,15 +12,8 @@ abstract class UserDetailsProvider /** @var bool Flag indicating if headers are passed prefixed with 'HTTP_' */ protected $httpHeaders; - // Constants representing UW Federated login Shibboleth headers - const FED_EPPN = "eppn"; - const FED_SPVI = "eduWisconsinSPVI"; - const FED_FULLNAME = "eduWisconsinCommonName"; - const FED_FIRST_NAME = "eduWisconsinGivenName"; - const FED_LAST_NAME = "eduWisconsinSurname"; - const FED_EMAIL = "eduWisconsinEmailAddress"; - - // Generic and/or UWMSN constants + // General, shared constants relevant to UWMSN and UW-System login + const EPPN = "eppn"; const SHIB_SESSION_ID = 'Shib-Session-Id'; const SHIB_SESSION_ID_HTTP = 'HTTP_SHIB_SESSION_ID'; const UDDS = "udds"; @@ -33,7 +26,7 @@ abstract class UserDetailsProvider */ public function __construct($http = true) { - $this->http = $http; + $this->httpHeaders = $http; } /** diff --git a/src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php index 96436837b40b8940589509ddf2c0a9819aa26118..0c465ad1d6c098307196052f5e65a0368c2cea12 100644 --- a/src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php +++ b/src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php @@ -2,13 +2,13 @@ namespace edu\wisc\doit\uwphps\local; +use edu\wisc\doit\uwphps\preauth\PreauthUserDetailsProvider; use edu\wisc\doit\uwphps\UWUserDetails; -use edu\wisc\doit\uwphps\UserDetailsProvider; /** * LocalUserDetailsProvider provides a developer with a {@link UWUserDetails} suitable for use in local development. */ -class LocalUserDetailsProvider extends UserDetailsProvider +class LocalUserDetailsProvider extends PreauthUserDetailsProvider { /** @var string */ @@ -17,7 +17,7 @@ class LocalUserDetailsProvider extends UserDetailsProvider /** * LocalUserDetailsProvider constructor. * - * @param $filePath path to JSON file defining a local user. + * @param $filePath string Path to JSON file defining a local user. */ public function __construct($filePath) { @@ -38,15 +38,15 @@ class LocalUserDetailsProvider extends UserDetailsProvider $attributes = json_decode($jsonString, true); return new UWUserDetails( - $attributes[UserDetailsProvider::FED_EPPN], - $attributes[UserDetailsProvider::FED_SPVI], - $attributes[UserDetailsProvider::FED_FULLNAME], - $attributes[UserDetailsProvider::UDDS], - $attributes[UserDetailsProvider::FED_EMAIL], - $attributes[UserDetailsProvider::SOURCE], - $attributes[UserDetailsProvider::ISIS_EMPLID], - $attributes[UserDetailsProvider::FED_FIRST_NAME], - $attributes[UserDetailsProvider::FED_LAST_NAME] + $attributes[static::EPPN], + $attributes[static::PVI], + $attributes[static::FULL_NAME], + $attributes[static::UDDS], + $attributes[static::EMAIL], + $attributes[static::SOURCE], + $attributes[static::ISIS_EMPLID], + $attributes[static::FIRST_NAME], + $attributes[static::LAST_NAME] ); } diff --git a/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php index b5a85112f205b0dc132abb40cead76e72d2c387e..2f0454d7b1fb1178231b52bb8364b58e79df01a5 100644 --- a/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php +++ b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php @@ -2,8 +2,8 @@ namespace edu\wisc\doit\uwphps\preauth; -use edu\wisc\doit\uwphps\UWUserDetails; use edu\wisc\doit\uwphps\UserDetailsProvider; +use edu\wisc\doit\uwphps\UWUserDetails; /** * FederatedPreauthUserDetailsProvider is an implementation of {@link UserDetailsProvider} for loading users @@ -14,40 +14,47 @@ use edu\wisc\doit\uwphps\UserDetailsProvider; class FederatedPreauthUserDetailsProvider extends UserDetailsProvider { + // Constants defining common header values + const SPVI = "eduWisconsinSPVI"; + const EMAIL = "eduWisconsinEmailAddress"; + const FULL_NAME = "eduWisconsinCommonName"; + const FIRST_NAME = "eduWisconsinGivenName"; + const LAST_NAME = "eduWisconsinSurname"; + /** * {@inheritdoc} */ public function loadUser() { // Return null if no Shib session is found - if ($this->httpHeaders && !getenv(FederatedPreauthUserDetailsProvider::SHIB_SESSION_ID_HTTP) || - !$this->httpHeaders && !getenv(FederatedPreauthUserDetailsProvider::SHIB_SESSION_ID)) { + if ($this->httpHeaders && !getenv(static::SHIB_SESSION_ID_HTTP) || + !$this->httpHeaders && !getenv(static::SHIB_SESSION_ID)) { return null; } if ($this->httpHeaders) { $userDetails = new UWUserDetails( - getenv($this->mapAttribute(UserDetailsProvider::FED_EPPN)), - getenv($this->mapAttribute(UserDetailsProvider::FED_SPVI)), - getenv($this->mapAttribute(UserDetailsProvider::FED_FULLNAME)), - getenv($this->mapAttribute(UserDetailsProvider::UDDS)), - getenv($this->mapAttribute(UserDetailsProvider::FED_EMAIL)), - getenv($this->mapAttribute(UserDetailsProvider::SOURCE)), - getenv($this->mapAttribute(UserDetailsProvider::ISIS_EMPLID)), - getenv($this->mapAttribute(UserDetailsProvider::FED_FIRST_NAME)), - getenv($this->mapAttribute(UserDetailsProvider::FED_LAST_NAME)) + getenv($this->mapAttribute(static::EPPN)), + getenv($this->mapAttribute(static::SPVI)), + getenv($this->mapAttribute(static::FULL_NAME)), + getenv($this->mapAttribute(static::UDDS)), + getenv($this->mapAttribute(static::EMAIL)), + getenv($this->mapAttribute(static::SOURCE)), + getenv($this->mapAttribute(static::ISIS_EMPLID)), + getenv($this->mapAttribute(static::FIRST_NAME)), + getenv($this->mapAttribute(static::LAST_NAME)) ); } else { $userDetails = new UWUserDetails( - getenv(UserDetailsProvider::FED_EPPN), - getenv(UserDetailsProvider::FED_SPVI), - getenv(UserDetailsProvider::FED_FULLNAME), - getenv(UserDetailsProvider::UDDS), - getenv(UserDetailsProvider::FED_EMAIL), - getenv(UserDetailsProvider::SOURCE), - getenv(UserDetailsProvider::ISIS_EMPLID), - getenv(UserDetailsProvider::FED_FIRST_NAME), - getenv(UserDetailsProvider::FED_LAST_NAME) + getenv(static::EPPN), + getenv(static::SPVI), + getenv(static::FULL_NAME), + getenv(static::UDDS), + getenv(static::EMAIL), + getenv(static::SOURCE), + getenv(static::ISIS_EMPLID), + getenv(static::FIRST_NAME), + getenv(static::LAST_NAME) ); } diff --git a/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php index 77bcecc23141a583c35c4ea453be7d34b1cb9cdf..8925fdba7fcf16d29d4b55c223b9e174ef11f594 100644 --- a/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php +++ b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php @@ -2,6 +2,9 @@ namespace edu\wisc\doit\uwphps\preauth; +use edu\wisc\doit\uwphps\UserDetailsProvider; +use edu\wisc\doit\uwphps\UWUserDetails; + /** * PreauthUserDetailsProvider is an implementation of {@link UserDetailsProvider} for loading users authenticated * with UW-Madison login. @@ -11,12 +14,53 @@ namespace edu\wisc\doit\uwphps\preauth; class PreauthUserDetailsProvider extends UserDetailsProvider { + // Constants defining common header values + const PVI = 'wiscEduPVI'; + const FULL_NAME = 'cn'; + const EMAIL = 'mail'; + const UDDS = 'wiscEduUDDS'; + const ISIS_EMPLID = 'wiscEduIsisEmplid'; + const FIRST_NAME = 'givenName'; + const LAST_NAME = 'sn'; + /** * {@inheritdoc} */ public function loadUser() { + // Return null if no Shib session is found + if ($this->httpHeaders && !getenv(static::SHIB_SESSION_ID_HTTP) || + !$this->httpHeaders && !getenv(static::SHIB_SESSION_ID)) { + return null; + } + + if ($this->httpHeaders) { + $userDetails = new UWUserDetails( + getenv($this->mapAttribute(static::EPPN)), + getenv($this->mapAttribute(static::PVI)), + getenv($this->mapAttribute(static::FULL_NAME)), + getenv($this->mapAttribute(static::UDDS)), + getenv($this->mapAttribute(static::EPPN)), + getenv($this->mapAttribute(static::SOURCE)), + getenv($this->mapAttribute(static::ISIS_EMPLID)), + getenv($this->mapAttribute(static::FIRST_NAME)), + getenv($this->mapAttribute(static::LAST_NAME)) + ); + } else { + $userDetails = new UWUserDetails( + getenv(static::EPPN), + getenv(static::PVI), + getenv(static::FULL_NAME), + getenv(static::UDDS), + getenv(static::EPPN), + getenv(static::SOURCE), + getenv(static::ISIS_EMPLID), + getenv(static::FIRST_NAME), + getenv(static::LAST_NAME) + ); + } + return $userDetails; } } diff --git a/src/main/resources/localuser.json b/src/main/resources/localuser.json index a3a534459cfdc2a46fbf549dc978220726505e98..148a35285eddb928324f43eeb5153d1bafbb1fed 100644 --- a/src/main/resources/localuser.json +++ b/src/main/resources/localuser.json @@ -1,15 +1,15 @@ { "eppn": "bbadger@wisc.edu", - "eduWisconsinSPVI": "UW123A456", + "wiscEduPVI": "UW123A456", "cn": "BUCKINGHAM BADGER", - "eduWisconsinCommonName": "BUCKINGHAM BADGER", - "eduWisconsinGivenName": "BUCKINGHAM", - "eduWisconsinSurname": "BADGER", - "udds": [ + "cn": "BUCKINGHAM BADGER", + "givenName": "BUCKINGHAM", + "sn": "BADGER", + "wiscEduUDDS": [ "UW123A456", "UW234A567" ], - "eduWisconsinEmailAddress": "bucky.badger@wisc.edu", + "mail": "bucky.badger@wisc.edu", "source": "a_source", "isisEmplid": "123456789" } \ No newline at end of file diff --git a/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php b/src/test/edu/wisc/doit/uwphps/local/LocalUserDetailsProviderTest.php similarity index 88% rename from src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php rename to src/test/edu/wisc/doit/uwphps/local/LocalUserDetailsProviderTest.php index 35c73e0efa17186f3f3410b396c7820b3e373347..3ee4255ec27d37fdbcb9a26ca5aad246a38799a6 100644 --- a/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php +++ b/src/test/edu/wisc/doit/uwphps/local/LocalUserDetailsProviderTest.php @@ -8,9 +8,12 @@ use edu\wisc\doit\uwphps\local\LocalUserDetailsProvider; class LocalUserDetailsProviderTest extends \PHPUnit_Framework_TestCase { - public function testLoadUser() + /** + * @test + */ + public function loadUser() { - $userDetailsService = new LocalUserDetailsProvider(__DIR__ . "/../../../resources/localuser.json"); + $userDetailsService = new LocalUserDetailsProvider(__DIR__ . "/../../../../../resources/localuser.json"); $user = $userDetailsService->loadUser(); $this->assertEquals("bbadger@wisc.edu", $user->getEppn()); $this->assertEquals("UW123A456", $user->getPvi()); @@ -21,4 +24,5 @@ class LocalUserDetailsProviderTest extends \PHPUnit_Framework_TestCase $this->assertEquals("BUCKINGHAM", $user->getFirstName()); $this->assertEquals("BADGER", $user->getLastName()); } + } diff --git a/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php b/src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php similarity index 61% rename from src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php rename to src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php index c4f1d70ca5a453feb0ce3542e6181010c05c7e32..09ddc42697fbbf443fe78e2b730a38a36e7cbf2a 100644 --- a/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php +++ b/src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php @@ -16,12 +16,11 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes private $userProvider; /** - * Populate putenv with Shib attributes to simulate a logged in user + * Populate $_SERVER with Shib attributes to simulate a logged in user */ protected function setUp() { - parent::setUp(); - $jsonString = file_get_contents(__DIR__ . "/../../../resources/testuser_http.json"); + $jsonString = file_get_contents(__DIR__ . "/../../../../../resources/testuser_http.json"); if ($jsonString === false) { return null; } @@ -29,19 +28,22 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes $this->attributes = json_decode($jsonString, true); $this->userProvider = new FederatedPreauthUserDetailsProvider(); - 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::EPPN) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::EPPN)]); + putenv($this->mapAttribute(FederatedPreauthUserDetailsProvider::SPVI) . '=' . $this->attributes[$this->mapAttribute(FederatedPreauthUserDetailsProvider::SPVI)]); + putenv($this->mapAttribute(FederatedPreauthUserDetailsProvider::FULL_NAME) . '=' . $this->attributes[$this->mapAttribute(FederatedPreauthUserDetailsProvider::FULL_NAME)]); + putenv($this->mapAttribute(FederatedPreauthUserDetailsProvider::FIRST_NAME) . '=' . $this->attributes[$this->mapAttribute(FederatedPreauthUserDetailsProvider::FIRST_NAME)]); + putenv($this->mapAttribute(FederatedPreauthUserDetailsProvider::LAST_NAME) . '=' . $this->attributes[$this->mapAttribute(FederatedPreauthUserDetailsProvider::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(FederatedPreauthUserDetailsProvider::EMAIL) . '=' . $this->attributes[$this->mapAttribute(FederatedPreauthUserDetailsProvider::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() + /** + * @test + */ + public function loadUser() { $user = $this->userProvider->loadUser(); $this->assertNotNull($user); @@ -55,7 +57,10 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes $this->assertEquals("BADGER", $user->getLastName()); } - public function testLoadUserWithNoEPPN() + /** + * @test + */ + public function loadUserWithNoEPPN() { // Clear Shib session ID to simulate no session putenv(UserDetailsProvider::SHIB_SESSION_ID_HTTP); @@ -63,10 +68,13 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes $this->assertNull($user); } - public function testLoadUserWithNoEmail() + /** + * @test + */ + public function loadUserWithNoEmail() { // Clear email to simulate no email - putenv('HTTP_' . strtoupper(UserDetailsProvider::FED_EMAIL)); + putenv('HTTP_' . strtoupper(FederatedPreauthUserDetailsProvider::EMAIL)); $user = $this->userProvider->loadUser(); $this->assertFalse($user->getEmailAddress()); } diff --git a/src/test/resources/localuser.json b/src/test/resources/localuser.json index a3a534459cfdc2a46fbf549dc978220726505e98..447c367bf82a35a856e8fe729f5eb92cb62bfc86 100644 --- a/src/test/resources/localuser.json +++ b/src/test/resources/localuser.json @@ -1,15 +1,15 @@ { "eppn": "bbadger@wisc.edu", - "eduWisconsinSPVI": "UW123A456", + "wiscEduPVI": "UW123A456", "cn": "BUCKINGHAM BADGER", - "eduWisconsinCommonName": "BUCKINGHAM BADGER", - "eduWisconsinGivenName": "BUCKINGHAM", - "eduWisconsinSurname": "BADGER", - "udds": [ + "cn": "BUCKINGHAM BADGER", + "givenName": "BUCKINGHAM", + "sn": "BADGER", + "wiscEduUDDS": [ "UW123A456", "UW234A567" ], - "eduWisconsinEmailAddress": "bucky.badger@wisc.edu", + "mail": "bucky.badger@wisc.edu", "source": "a_source", - "isisEmplid": "123456789" + "wiscEduIsisEmplid": "123456789" } \ No newline at end of file