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