Skip to content
Snippets Groups Projects
Commit 5a0656d2 authored by Andrew Hoffmann's avatar Andrew Hoffmann
Browse files

Extract HTTP header conversion method to its own trait for reuse

parent c4f74ce2
No related branches found
No related tags found
1 merge request!12Test all the things!
<?php
namespace edu\wisc\doit\uwphps;
/**
* Maps Shibboleth attributes to their HTTP header equivalents
*/
trait HttpHeaderMapper
{
/**
* 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
*
* @see https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPAttributeAccess NativeSPAttributeAccess
*/
protected function httpHeaderFromAttribute($attribute)
{
return 'HTTP_' . strtoupper(str_replace('-', '_', $attribute));
}
}
......@@ -8,6 +8,7 @@ namespace edu\wisc\doit\uwphps;
*/
abstract class UserDetailsProvider
{
use HttpHeaderMapper;
/** @var bool Flag indicating if headers are passed prefixed with 'HTTP_' */
protected $httpHeaders;
......@@ -39,18 +40,4 @@ abstract class UserDetailsProvider
* @return UserDetails currently authenticated user, null if not logged in
*/
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
*
* @see https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPAttributeAccess NativeSPAttributeAccess
*/
public static function httpHeaderFromAttribute($attribute)
{
return 'HTTP_' . strtoupper(str_replace('-', '_', $attribute));
}
}
......@@ -34,15 +34,15 @@ class FederatedPreauthUserDetailsProvider extends UserDetailsProvider
if ($this->httpHeaders) {
$userDetails = new UWUserDetails(
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))
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))
);
} else {
$userDetails = new UWUserDetails(
......
......@@ -33,15 +33,15 @@ class PreauthUserDetailsProvider extends UserDetailsProvider
if ($this->httpHeaders) {
$userDetails = new UWUserDetails(
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))
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))
);
} else {
$userDetails = new UWUserDetails(
......
......@@ -3,6 +3,7 @@ namespace edu\wisc\doit\uwphps;
trait EnvironmentHelper
{
use HttpHeaderMapper;
/**
* Sets environment variables
......@@ -31,12 +32,12 @@ trait EnvironmentHelper
*
* @param array $environment
* @return array environment with variable names converted to HTTP headers
* @see UserDetailsProvider::httpHeaderFromAttribute()
* @see HttpHeaderMapper::httpHeaderFromAttribute()
*/
private function toHttpHeaders(array $environment)
{
foreach ($environment as $key => $value) {
$environment[UserDetailsProvider::httpHeaderFromAttribute($key)] = $value;
$environment[$this->httpHeaderFromAttribute($key)] = $value;
unset($environment[$key]);
}
return $environment;
......
<?php
namespace edu\wisc\doit\uwphps;
use PHPUnit\Framework\TestCase;
/**
* Tests for {@link HttpHeaderMapper} trait
*/
class HttpHeaderMapperTest extends TestCase
{
use HttpHeaderMapper;
/** @test */
public function convertsAttributeToHttpHeader()
{
$this->assertEquals('HTTP_STARFLEETRANK', $this->httpHeaderFromAttribute('starfleetRank'));
$this->assertEquals('HTTP_SHIB_SESSION_ID', $this->httpHeaderFromAttribute('Shib-Session-Id'));
}
}
<?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'));
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment