From 737771f209923968d9b475ea548fead4734eee12 Mon Sep 17 00:00:00 2001
From: Andrew Hoffmann <andrew.hoffmann@wisc.edu>
Date: Tue, 6 Dec 2016 10:47:09 -0600
Subject: [PATCH] Convert dashes to underscores when converting to HTTP headers

Changed the signature to `public static` to expose this useful function to other classes. Provided a test.
---
 .../wisc/doit/uwphps/UserDetailsProvider.php  |  4 +--
 .../FederatedPreauthUserDetailsProvider.php   | 18 ++++++-------
 .../preauth/PreauthUserDetailsProvider.php    | 18 ++++++-------
 .../doit/uwphps/UserDetailsProviderTest.php   | 27 +++++++++++++++++++
 4 files changed, 47 insertions(+), 20 deletions(-)
 create mode 100644 src/test/edu/wisc/doit/uwphps/UserDetailsProviderTest.php

diff --git a/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php
index f211ca7..9ebd735 100644
--- a/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php
+++ b/src/main/edu/wisc/doit/uwphps/UserDetailsProvider.php
@@ -49,8 +49,8 @@ abstract class UserDetailsProvider
      *
      * @see https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPAttributeAccess NativeSPAttributeAccess
      */
-    protected function httpHeaderFromAttribute($attribute)
+    public static function httpHeaderFromAttribute($attribute)
     {
-        return 'HTTP_' . strtoupper($attribute);
+        return 'HTTP_' . strtoupper(str_replace('-', '_', $attribute));
     }
 }
diff --git a/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php
index baafe05..48dfdf1 100644
--- a/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php
+++ b/src/main/edu/wisc/doit/uwphps/preauth/FederatedPreauthUserDetailsProvider.php
@@ -34,15 +34,15 @@ class FederatedPreauthUserDetailsProvider extends UserDetailsProvider
 
         if ($this->httpHeaders) {
             $userDetails = new UWUserDetails(
-                getenv($this->httpHeaderFromAttribute(static::EPPN)),
-                getenv($this->httpHeaderFromAttribute(static::SPVI)),
-                getenv($this->httpHeaderFromAttribute(static::FULL_NAME)),
-                explode(static::DELIMITER, getenv($this->httpHeaderFromAttribute(static::UDDS))),
-                getenv($this->httpHeaderFromAttribute(static::EMAIL)),
-                getenv($this->httpHeaderFromAttribute(static::SOURCE)),
-                getenv($this->httpHeaderFromAttribute(static::ISIS_EMPLID)),
-                getenv($this->httpHeaderFromAttribute(static::FIRST_NAME)),
-                getenv($this->httpHeaderFromAttribute(static::LAST_NAME))
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::EPPN)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::SPVI)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::FULL_NAME)),
+                explode(static::DELIMITER, getenv(UserDetailsProvider::httpHeaderFromAttribute(static::UDDS))),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::EMAIL)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::SOURCE)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::ISIS_EMPLID)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::FIRST_NAME)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::LAST_NAME))
             );
         } else {
             $userDetails = new UWUserDetails(
diff --git a/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php
index 2406b38..31f8261 100644
--- a/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php
+++ b/src/main/edu/wisc/doit/uwphps/preauth/PreauthUserDetailsProvider.php
@@ -36,15 +36,15 @@ class PreauthUserDetailsProvider extends UserDetailsProvider
 
         if ($this->httpHeaders) {
             $userDetails = new UWUserDetails(
-                getenv($this->httpHeaderFromAttribute(static::EPPN)),
-                getenv($this->httpHeaderFromAttribute(static::PVI)),
-                getenv($this->httpHeaderFromAttribute(static::FULL_NAME)),
-                explode(static::DELIMITER, getenv($this->httpHeaderFromAttribute(static::UDDS))),
-                getenv($this->httpHeaderFromAttribute(static::EMAIL)),
-                getenv($this->httpHeaderFromAttribute(static::SOURCE)),
-                getenv($this->httpHeaderFromAttribute(static::ISIS_EMPLID)),
-                getenv($this->httpHeaderFromAttribute(static::FIRST_NAME)),
-                getenv($this->httpHeaderFromAttribute(static::LAST_NAME))
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::EPPN)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::PVI)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::FULL_NAME)),
+                explode(static::DELIMITER, getenv(UserDetailsProvider::httpHeaderFromAttribute(static::UDDS))),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::EMAIL)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::SOURCE)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::ISIS_EMPLID)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::FIRST_NAME)),
+                getenv(UserDetailsProvider::httpHeaderFromAttribute(static::LAST_NAME))
             );
         } else {
             $userDetails = new UWUserDetails(
diff --git a/src/test/edu/wisc/doit/uwphps/UserDetailsProviderTest.php b/src/test/edu/wisc/doit/uwphps/UserDetailsProviderTest.php
new file mode 100644
index 0000000..0ce2e41
--- /dev/null
+++ b/src/test/edu/wisc/doit/uwphps/UserDetailsProviderTest.php
@@ -0,0 +1,27 @@
+<?php
+namespace edu\wisc\doit\uwphps;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * Tests for {@link UserDetailsProvider} concrete methods.
+ */
+class UserDetailsProviderTest extends TestCase
+{
+
+    /** @var UserDetailsProvider */
+    private $provider;
+
+    public function setUp()
+    {
+        // Must use a mock because it is an abstract class
+        $this->provider = $this->getMockForAbstractClass(UserDetailsProvider::class);
+    }
+
+    /** @test */
+    public function convertsAttributeToHttpHeader()
+    {
+        $this->assertEquals('HTTP_STARFLEETRANK', UserDetailsProvider::httpHeaderFromAttribute('starfleetRank'));
+        $this->assertEquals('HTTP_SHIB_SESSION_ID', UserDetailsProvider::httpHeaderFromAttribute('Shib-Session-Id'));
+    }
+}
-- 
GitLab