From a60ddb67d29767a1d829b123690dbac14e453761 Mon Sep 17 00:00:00 2001 From: Andy Summers <andrew.summers@wisc.edu> Date: Tue, 15 Nov 2016 10:59:50 -0600 Subject: [PATCH 1/5] Reorganize namespaces for less clutter --- .../edu/wisc/doit/UserDetailsProvider.php | 33 ----------- .../wisc/doit/{ => uwphps}/UWUserDetails.php | 4 +- .../wisc/doit/{ => uwphps}/UserDetails.php | 2 +- .../wisc/doit/uwphps/UserDetailsProvider.php | 58 +++++++++++++++++++ .../local}/LocalUserDetailsProvider.php | 8 ++- .../FederatedPreauthUserDetailsProvider.php | 37 +++--------- .../preauth/PreauthUserDetailsProvider.php | 22 +++++++ ...ederatedPreauthUserDetailsProviderTest.php | 6 +- .../doit/LocalUserDetailsProviderTest.php | 2 +- 9 files changed, 102 insertions(+), 70 deletions(-) delete mode 100644 src/main/edu/wisc/doit/UserDetailsProvider.php rename src/main/edu/wisc/doit/{ => uwphps}/UWUserDetails.php (97%) rename src/main/edu/wisc/doit/{ => uwphps}/UserDetails.php (98%) create mode 100644 src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php rename src/main/edu/wisc/doit/{ => uwphps/local}/LocalUserDetailsProvider.php (87%) rename src/main/edu/wisc/doit/{ => uwphps/preauth}/FederatedPreauthUserDetailsProvider.php (64%) create mode 100644 src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php diff --git a/src/main/edu/wisc/doit/UserDetailsProvider.php b/src/main/edu/wisc/doit/UserDetailsProvider.php deleted file mode 100644 index 36c7244..0000000 --- a/src/main/edu/wisc/doit/UserDetailsProvider.php +++ /dev/null @@ -1,33 +0,0 @@ -<?php - -namespace edu\wisc\doit; - -/** - * TODO: Write documentation - */ -interface UserDetailsProvider -{ - - // 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 - const SHIB_SESSION_ID = 'Shib-Session-Id'; - const SHIB_SESSION_ID_HTTP = 'HTTP_SHIB_SESSION_ID'; - const UDDS = "udds"; - const SOURCE = "source"; - const ISIS_EMPLID = "isisEmplid"; - - /** - * Map Shibboleth header values to an associative array. - * - * @return UserDetails - */ - public function loadUser(); - -} \ No newline at end of file diff --git a/src/main/edu/wisc/doit/UWUserDetails.php b/src/main/edu/wisc/doit/uwphps/UWUserDetails.php similarity index 97% rename from src/main/edu/wisc/doit/UWUserDetails.php rename to src/main/edu/wisc/doit/uwphps/UWUserDetails.php index 1708f13..cb1a646 100644 --- a/src/main/edu/wisc/doit/UWUserDetails.php +++ b/src/main/edu/wisc/doit/uwphps/UWUserDetails.php @@ -1,6 +1,6 @@ <?php -namespace edu\wisc\doit; +namespace edu\wisc\doit\uwphps; /** * Default, concrete implementation of {@link UserDetails} to represent a UW user. @@ -20,7 +20,7 @@ class UWUserDetails implements UserDetails private $emailAddress; /** @var string */ private $source; - /** @var isisEmplid */ + /** @var string */ private $isisEmplid; /** @var string */ private $firstName; diff --git a/src/main/edu/wisc/doit/UserDetails.php b/src/main/edu/wisc/doit/uwphps/UserDetails.php similarity index 98% rename from src/main/edu/wisc/doit/UserDetails.php rename to src/main/edu/wisc/doit/uwphps/UserDetails.php index b7d8fc1..93cb422 100644 --- a/src/main/edu/wisc/doit/UserDetails.php +++ b/src/main/edu/wisc/doit/uwphps/UserDetails.php @@ -1,6 +1,6 @@ <?php -namespace edu\wisc\doit; +namespace edu\wisc\doit\uwphps; /** * UserDetails defines a minimal representation of a user associated with UW. diff --git a/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php new file mode 100644 index 0000000..1cf730d --- /dev/null +++ b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php @@ -0,0 +1,58 @@ +<?php + +namespace edu\wisc\doit\uwphps; + +/** + * UseDetailsProvider is an interface defining how to load an {@link UserDetails} and provides constants for + * supplied request header keys. + */ +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 + const SHIB_SESSION_ID = 'Shib-Session-Id'; + const SHIB_SESSION_ID_HTTP = 'HTTP_SHIB_SESSION_ID'; + const UDDS = "udds"; + const SOURCE = "source"; + const ISIS_EMPLID = "isisEmplid"; + + /** + * UserDetailsProvider constructor. + * @param $http + */ + public function __construct($http = true) + { + $this->http = $http; + } + + /** + * Map Shibboleth header values to an associative array. + * + * @return UserDetails + */ + abstract public function loadUser(); + + + /** + * Map a Shibboleth attribute to its associated HTTP header name. + * + * @param string $attribute attribute to map + * @return string Shibboleth attribute name mapped to its equivalent HTTP header name + */ + protected function mapAttribute($attribute) + { + return 'HTTP_' . strtoupper($attribute); + } + +} diff --git a/src/main/edu/wisc/doit/LocalUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php similarity index 87% rename from src/main/edu/wisc/doit/LocalUserDetailsProvider.php rename to src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php index bbbbf02..9643683 100644 --- a/src/main/edu/wisc/doit/LocalUserDetailsProvider.php +++ b/src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php @@ -1,11 +1,14 @@ <?php -namespace edu\wisc\doit; +namespace edu\wisc\doit\uwphps\local; + +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 implements UserDetailsProvider +class LocalUserDetailsProvider extends UserDetailsProvider { /** @var string */ @@ -18,6 +21,7 @@ class LocalUserDetailsProvider implements UserDetailsProvider */ public function __construct($filePath) { + parent::__construct(false); $this->filePath = $filePath; } diff --git a/src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php similarity index 64% rename from src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php rename to src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php index a0c17d4..b5a8511 100644 --- a/src/main/edu/wisc/doit/FederatedPreauthUserDetailsProvider.php +++ b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php @@ -1,27 +1,19 @@ <?php -namespace edu\wisc\doit; +namespace edu\wisc\doit\uwphps\preauth; + +use edu\wisc\doit\uwphps\UWUserDetails; +use edu\wisc\doit\uwphps\UserDetailsProvider; /** - * FederatedPreauthUserDetailsProvider provides an application with a {@link UWUserDetails} from Shibboleth attributes. - * The attributes use the keys as defined by UW System, which are distinct from those used specifically by UWMSN. + * FederatedPreauthUserDetailsProvider is an implementation of {@link UserDetailsProvider} for loading users + * authenticated with UW-System Federated login. + * + * {@see PreauthUserDetailsProvider} for loading users authenticated through UW-Madison login. */ -class FederatedPreauthUserDetailsProvider implements UserDetailsProvider +class FederatedPreauthUserDetailsProvider extends UserDetailsProvider { - /** @var bool */ - private $httpHeaders; - - /** - * FederatedPreauthUserDetailsProvider constructor. - * - * @param bool $http flag indicating if Shibboleth attributes are forwarded as HTTP headers - */ - public function __construct($http = false) - { - $this->httpHeaders = $http; - } - /** * {@inheritdoc} */ @@ -62,15 +54,4 @@ class FederatedPreauthUserDetailsProvider implements UserDetailsProvider return $userDetails; } - /** - * Map a Shibboleth attribute to its associated HTTP header name. - * - * @param string $attribute attribute to map - * @return string Shibboleth attribute name mapped to its equivalent HTTP header name - */ - private function mapAttribute($attribute) - { - return 'HTTP_' . strtoupper($attribute); - } - } diff --git a/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php new file mode 100644 index 0000000..77bcecc --- /dev/null +++ b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php @@ -0,0 +1,22 @@ +<?php + +namespace edu\wisc\doit\uwphps\preauth; + +/** + * PreauthUserDetailsProvider is an implementation of {@link UserDetailsProvider} for loading users authenticated + * with UW-Madison login. + * + * {@see FederatedPreauthUserDetailsProvider} for loading users authenticated through UW-System Federated login. + */ +class PreauthUserDetailsProvider extends UserDetailsProvider +{ + + /** + * {@inheritdoc} + */ + public function loadUser() + { + + } + +} diff --git a/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php b/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php index 683915a..c4f1d70 100644 --- a/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php +++ b/src/test/edu/wisc/doit/HTTPFederatedPreauthUserDetailsProviderTest.php @@ -1,7 +1,7 @@ <?php -use edu\wisc\doit\UserDetailsProvider; -use edu\wisc\doit\FederatedPreauthUserDetailsProvider; +use edu\wisc\doit\uwphps\UserDetailsProvider; +use edu\wisc\doit\uwphps\preauth\FederatedPreauthUserDetailsProvider; /** * Tests for {@link FederatedPreauthUserDetailsProvider}. @@ -27,7 +27,7 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes } $this->attributes = json_decode($jsonString, true); - $this->userProvider = new FederatedPreauthUserDetailsProvider(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)]); diff --git a/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php b/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php index 52b4bb8..35c73e0 100644 --- a/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php +++ b/src/test/edu/wisc/doit/LocalUserDetailsProviderTest.php @@ -1,6 +1,6 @@ <?php -use edu\wisc\doit\LocalUserDetailsProvider; +use edu\wisc\doit\uwphps\local\LocalUserDetailsProvider; /** * Tests for {@link LocalUserDetailsProvider}. -- GitLab From 7cc0c142d15324f41c9a9531ef334823048297b7 Mon Sep 17 00:00:00 2001 From: Andy Summers <andrew.summers@wisc.edu> Date: Tue, 15 Nov 2016 14:09:17 -0600 Subject: [PATCH 2/5] Add `PreauthUserDetailsProvider` for UWMSN, large refactor --- composer.json | 4 +- .../edu/wisc/doit/uwphps/UWUserDetails.php | 13 ++++- src/main/edu/wisc/doit/uwphps/UserDetails.php | 2 +- .../wisc/doit/uwphps/UserDetailsProvider.php | 13 ++--- .../uwphps/local/LocalUserDetailsProvider.php | 24 ++++----- .../FederatedPreauthUserDetailsProvider.php | 49 +++++++++++-------- .../preauth/PreauthUserDetailsProvider.php | 44 +++++++++++++++++ src/main/resources/localuser.json | 12 ++--- .../local}/LocalUserDetailsProviderTest.php | 8 ++- ...ederatedPreauthUserDetailsProviderTest.php | 34 ++++++++----- src/test/resources/localuser.json | 14 +++--- 11 files changed, 141 insertions(+), 76 deletions(-) rename src/test/edu/wisc/doit/{ => uwphps/local}/LocalUserDetailsProviderTest.php (88%) rename src/test/edu/wisc/doit/{ => uwphps/preauth}/HTTPFederatedPreauthUserDetailsProviderTest.php (61%) diff --git a/composer.json b/composer.json index c60f3b3..12afc2b 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 cb1a646..1ba3f6c 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 93cb422..d3a36ea 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 1cf730d..3f604e3 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 9643683..0c465ad 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 b5a8511..2f0454d 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 77bcecc..8925fdb 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 a3a5344..148a352 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 35c73e0..3ee4255 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 c4f1d70..09ddc42 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 a3a5344..447c367 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 -- GitLab From f7885783f2226d7842a73790184d03e1cedde839 Mon Sep 17 00:00:00 2001 From: Andy Summers <andrew.summers@wisc.edu> Date: Tue, 15 Nov 2016 14:22:59 -0600 Subject: [PATCH 3/5] Add missing namespace separator --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 12afc2b..40192f5 100644 --- a/composer.json +++ b/composer.json @@ -19,7 +19,7 @@ }, "autoload": { "psr-4": { - "edu\\wisc\\doit\\uwphps": "src/main/edu/wisc/doit/uwphps" + "edu\\wisc\\doit\\uwphps\\": "src/main/edu/wisc/doit/uwphps" } } } -- GitLab From 370af8bd47f77575724f1c905afc953aaf56735e Mon Sep 17 00:00:00 2001 From: Andy Summers <andrew.summers@wisc.edu> Date: Wed, 16 Nov 2016 10:42:21 -0600 Subject: [PATCH 4/5] Assume multiple UDDS values are delimited by ; --- src/main/edu/wisc/doit/uwphps/UWUserDetails.php | 4 ++-- src/main/edu/wisc/doit/uwphps/UserDetails.php | 2 +- src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php | 3 +++ .../edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php | 2 +- .../uwphps/preauth/FederatedPreauthUserDetailsProvider.php | 2 +- .../wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php | 2 +- src/main/resources/localuser.json | 5 +---- .../preauth/HTTPFederatedPreauthUserDetailsProviderTest.php | 3 ++- src/test/resources/localuser.json | 5 +---- src/test/resources/testuser_http.json | 5 +---- 10 files changed, 14 insertions(+), 19 deletions(-) diff --git a/src/main/edu/wisc/doit/uwphps/UWUserDetails.php b/src/main/edu/wisc/doit/uwphps/UWUserDetails.php index 1ba3f6c..958066e 100644 --- a/src/main/edu/wisc/doit/uwphps/UWUserDetails.php +++ b/src/main/edu/wisc/doit/uwphps/UWUserDetails.php @@ -14,7 +14,7 @@ class UWUserDetails implements UserDetails private $pvi; /** @var string */ private $fullName; - /** @var string[] */ + /** @var array */ private $udds; /** @var string */ private $emailAddress; @@ -32,7 +32,7 @@ class UWUserDetails implements UserDetails * @param string $eppn * @param string $pvi * @param string $fullName - * @param string[] $udds + * @param array $udds * @param string $emailAddress * @param string $source * @param string $isisEmplid diff --git a/src/main/edu/wisc/doit/uwphps/UserDetails.php b/src/main/edu/wisc/doit/uwphps/UserDetails.php index d3a36ea..6153cee 100644 --- a/src/main/edu/wisc/doit/uwphps/UserDetails.php +++ b/src/main/edu/wisc/doit/uwphps/UserDetails.php @@ -34,7 +34,7 @@ interface UserDetails /** * A never null, but possibly empty, array of strings each representing the UDDS IDs of the group this user is a member of. * - * @return string[] + * @return array */ public function getUddsMembership(); diff --git a/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php index 3f604e3..3231b70 100644 --- a/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php +++ b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php @@ -20,6 +20,9 @@ abstract class UserDetailsProvider const SOURCE = "source"; const ISIS_EMPLID = "isisEmplid"; + // Delimiter used by multi-valued headers + const DELIMITER = ';'; + /** * UserDetailsProvider constructor. * @param $http diff --git a/src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php index 0c465ad..7a15d83 100644 --- a/src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php +++ b/src/main/edu/wisc/doit/uwphps/local/LocalUserDetailsProvider.php @@ -41,7 +41,7 @@ class LocalUserDetailsProvider extends PreauthUserDetailsProvider $attributes[static::EPPN], $attributes[static::PVI], $attributes[static::FULL_NAME], - $attributes[static::UDDS], + explode(static::DELIMITER, $attributes[static::UDDS]), $attributes[static::EMAIL], $attributes[static::SOURCE], $attributes[static::ISIS_EMPLID], diff --git a/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php index 2f0454d..e8d896b 100644 --- a/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php +++ b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php @@ -37,7 +37,7 @@ class FederatedPreauthUserDetailsProvider extends UserDetailsProvider getenv($this->mapAttribute(static::EPPN)), getenv($this->mapAttribute(static::SPVI)), getenv($this->mapAttribute(static::FULL_NAME)), - getenv($this->mapAttribute(static::UDDS)), + explode(static::DELIMITER, getenv($this->mapAttribute(static::UDDS))), getenv($this->mapAttribute(static::EMAIL)), getenv($this->mapAttribute(static::SOURCE)), getenv($this->mapAttribute(static::ISIS_EMPLID)), diff --git a/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php index 8925fdb..79631f2 100644 --- a/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php +++ b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php @@ -39,7 +39,7 @@ class PreauthUserDetailsProvider extends UserDetailsProvider getenv($this->mapAttribute(static::EPPN)), getenv($this->mapAttribute(static::PVI)), getenv($this->mapAttribute(static::FULL_NAME)), - getenv($this->mapAttribute(static::UDDS)), + explode(static::DELIMITER, getenv($this->mapAttribute(static::UDDS))), getenv($this->mapAttribute(static::EPPN)), getenv($this->mapAttribute(static::SOURCE)), getenv($this->mapAttribute(static::ISIS_EMPLID)), diff --git a/src/main/resources/localuser.json b/src/main/resources/localuser.json index 148a352..731030b 100644 --- a/src/main/resources/localuser.json +++ b/src/main/resources/localuser.json @@ -5,10 +5,7 @@ "cn": "BUCKINGHAM BADGER", "givenName": "BUCKINGHAM", "sn": "BADGER", - "wiscEduUDDS": [ - "UW123A456", - "UW234A567" - ], + "wiscEduUDDS": "A061234;A072345", "mail": "bucky.badger@wisc.edu", "source": "a_source", "isisEmplid": "123456789" diff --git a/src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php b/src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php index 09ddc42..7d07e2b 100644 --- a/src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php +++ b/src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php @@ -33,7 +33,7 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes 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::UDDS) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::UDDS)]); 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)]); @@ -55,6 +55,7 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes $this->assertEquals("123456789", $user->getIsisEmplid()); $this->assertEquals("BUCKINGHAM", $user->getFirstName()); $this->assertEquals("BADGER", $user->getLastName()); + $this->assertEquals(["A061234", "A072345"], $user->getUddsMembership()); } /** diff --git a/src/test/resources/localuser.json b/src/test/resources/localuser.json index 447c367..6070468 100644 --- a/src/test/resources/localuser.json +++ b/src/test/resources/localuser.json @@ -5,10 +5,7 @@ "cn": "BUCKINGHAM BADGER", "givenName": "BUCKINGHAM", "sn": "BADGER", - "wiscEduUDDS": [ - "UW123A456", - "UW234A567" - ], + "wiscEduUDDS": "A061234;A072345", "mail": "bucky.badger@wisc.edu", "source": "a_source", "wiscEduIsisEmplid": "123456789" diff --git a/src/test/resources/testuser_http.json b/src/test/resources/testuser_http.json index 7de908f..0d7f591 100644 --- a/src/test/resources/testuser_http.json +++ b/src/test/resources/testuser_http.json @@ -5,10 +5,7 @@ "HTTP_EDUWISCONSINCOMMONNAME": "BUCKINGHAM BADGER", "HTTP_EDUWISCONSINGIVENNAME": "BUCKINGHAM", "HTTP_EDUWISCONSINSURNAME": "BADGER", - "HTTP_UDDS": [ - "UW123A456", - "UW234A567" - ], + "HTTP_UDDS": "A061234;A072345", "HTTP_EDUWISCONSINEMAILADDRESS": "bucky.badger@wisc.edu", "HTTP_SOURCE": "a_source", "HTTP_ISISEMPLID": "123456789", -- GitLab From 1e1989308087513a8845ebe598a06029a636a380 Mon Sep 17 00:00:00 2001 From: Andy Summers <andrew.summers@wisc.edu> Date: Wed, 16 Nov 2016 12:54:26 -0600 Subject: [PATCH 5/5] Turn off HTTP headers by default --- src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php | 2 +- .../preauth/HTTPFederatedPreauthUserDetailsProviderTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php index 3231b70..78b9c9e 100644 --- a/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php +++ b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php @@ -27,7 +27,7 @@ abstract class UserDetailsProvider * UserDetailsProvider constructor. * @param $http */ - public function __construct($http = true) + public function __construct($http = false) { $this->httpHeaders = $http; } diff --git a/src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php b/src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php index 7d07e2b..3d43e21 100644 --- a/src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php +++ b/src/test/edu/wisc/doit/uwphps/preauth/HTTPFederatedPreauthUserDetailsProviderTest.php @@ -26,7 +26,7 @@ class HTTPFederatedPreauthUserDetailsProviderTest extends \PHPUnit_Framework_Tes } $this->attributes = json_decode($jsonString, true); - $this->userProvider = new FederatedPreauthUserDetailsProvider(); + $this->userProvider = new FederatedPreauthUserDetailsProvider(true); putenv($this->mapAttribute(UserDetailsProvider::EPPN) . '=' . $this->attributes[$this->mapAttribute(UserDetailsProvider::EPPN)]); putenv($this->mapAttribute(FederatedPreauthUserDetailsProvider::SPVI) . '=' . $this->attributes[$this->mapAttribute(FederatedPreauthUserDetailsProvider::SPVI)]); -- GitLab