Skip to content

Commit

Permalink
Rebased onto 9.0.x
Browse files Browse the repository at this point in the history
  • Loading branch information
Slamdunk committed Jul 24, 2023
1 parent f08b086 commit 371336e
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 22 deletions.
7 changes: 3 additions & 4 deletions src/Storageless/Http/SessionMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use PSR7Sessions\Storageless\Http\ClientFingerprint\Configuration as FingerprintConfig;
use PSR7Sessions\Storageless\Http\ClientFingerprint\SameOriginRequest;
use PSR7Sessions\Storageless\Session\DefaultSessionData;
use PSR7Sessions\Storageless\Session\LazySession;
Expand Down Expand Up @@ -63,7 +62,7 @@ public function __construct(
*/
public function process(Request $request, RequestHandlerInterface $handler): Response
{
$sameOriginRequest = new SameOriginRequest($this->fingerprintConfig, $request);
$sameOriginRequest = new SameOriginRequest($this->config->getClientFingerprintConfiguration(), $request);
$token = $this->parseToken($request, $sameOriginRequest);
$sessionContainer = LazySession::fromContainerBuildingCallback(function () use ($token): SessionInterface {
return $this->extractSessionContainer($token);
Expand Down Expand Up @@ -179,7 +178,7 @@ private function getTokenCookie(SessionInterface $sessionContainer, SameOriginRe

$jwtConfiguration = $this->config->getJwtConfiguration();

$builder = $this->config->builder(ChainedFormatter::withUnixTimestampDates())
$builder = $jwtConfiguration->builder(ChainedFormatter::withUnixTimestampDates())
->issuedAt($now)
->canOnlyBeUsedAfter($now)
->expiresAt($expiresAt)
Expand All @@ -191,7 +190,7 @@ private function getTokenCookie(SessionInterface $sessionContainer, SameOriginRe
->config->getCookie()
->withValue(
$builder
->getToken($this->config->signer(), $this->config->signingKey())
->getToken($jwtConfiguration->signer(), $jwtConfiguration->signingKey())
->toString(),
)
->withExpires($expiresAt);
Expand Down
20 changes: 18 additions & 2 deletions src/Storageless/Http/SessionMiddlewareConfiguration.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
use Lcobucci\Clock\Clock;
use Lcobucci\Clock\SystemClock;
use Lcobucci\JWT\Configuration;
use PSR7Sessions\Storageless\Http\ClientFingerprint\Configuration as FingerprintConfig;

/** @immutable */
final class SessionMiddlewareConfiguration
Expand All @@ -38,18 +39,20 @@ final class SessionMiddlewareConfiguration
private int $refreshTime = 60;
/** @var literal-string */
private string $sessionAttribute = SessionMiddleware::SESSION_ATTRIBUTE;
private FingerprintConfig $clientFingerprintConfiguration;

public function __construct(
Configuration $jwtConfiguration,
) {
$this->jwtConfiguration = clone $jwtConfiguration;

$this->clock = SystemClock::fromSystemTimezone();
$this->cookie = SetCookie::create('__Secure-slsession')
$this->clock = SystemClock::fromSystemTimezone();
$this->cookie = SetCookie::create('__Secure-slsession')
->withSecure(true)
->withHttpOnly(true)
->withSameSite(SameSite::lax())
->withPath('/');
$this->clientFingerprintConfiguration = new FingerprintConfig();
}

public function getJwtConfiguration(): Configuration
Expand Down Expand Up @@ -85,6 +88,11 @@ public function getSessionAttribute(): string
return $this->sessionAttribute;
}

public function getClientFingerprintConfiguration(): FingerprintConfig
{
return $this->clientFingerprintConfiguration;
}

public function withJwtConfiguration(Configuration $jwtConfiguration): self
{
$new = clone $this;
Expand Down Expand Up @@ -135,4 +143,12 @@ public function withSessionAttribute(string $sessionAttribute): self

return $new;
}

public function withClientFingerprintConfiguration(FingerprintConfig $clientFingerprintConfiguration): self
{
$new = clone $this;
$new->clientFingerprintConfiguration = clone $clientFingerprintConfiguration;

return $new;
}
}
14 changes: 14 additions & 0 deletions test/StoragelessTest/Http/SessionMiddlewareConfigurationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
use Lcobucci\JWT\Signer\Hmac\Sha256;
use Lcobucci\JWT\Signer\Key\InMemory;
use PHPUnit\Framework\TestCase;
use PSR7Sessions\Storageless\Http\ClientFingerprint\Configuration as FingerprintConfig;
use PSR7Sessions\Storageless\Http\SessionMiddlewareConfiguration;

use function random_bytes;
Expand Down Expand Up @@ -78,6 +79,13 @@ public function testProvideNonEmptyDefaultsForScalarAttributes(): void
self::assertNotEmpty($config->getSessionAttribute());
}

public function testClientFingerprintConfigurationIsDisabled(): void
{
$config = new SessionMiddlewareConfiguration($this->jwtConfig);

self::assertFalse($config->getClientFingerprintConfiguration()->enabled());
}

public function testImmutability(): void
{
$leftConfig = new SessionMiddlewareConfiguration($this->jwtConfig);
Expand Down Expand Up @@ -112,5 +120,11 @@ public function testImmutability(): void
$leftConfig = $rightConfig->withSessionAttribute($sessionAttribute);
self::assertNotSame($leftConfig, $rightConfig);
self::assertSame($sessionAttribute, $leftConfig->getSessionAttribute());

$clientFingerprintConfiguration = FingerprintConfig::forIpAndUserAgent();
$leftConfig = $rightConfig->withClientFingerprintConfiguration($clientFingerprintConfiguration);
self::assertNotSame($leftConfig, $rightConfig);
self::assertNotSame($clientFingerprintConfiguration, $leftConfig->getClientFingerprintConfiguration());
self::assertSame($clientFingerprintConfiguration->sources(), $leftConfig->getClientFingerprintConfiguration()->sources());
}
}
21 changes: 5 additions & 16 deletions test/StoragelessTest/Http/SessionMiddlewareTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -538,12 +538,8 @@ public function testAllowCustomRequestAttributeName(): void

public function testDefaultConfigurationShouldNotUseClientFingerprinting(): void
{
$middleware = SessionMiddleware::fromSymmetricKeyDefaults(
self::makeRandomSymmetricKey(),
100,
);
$response = $middleware->process(new ServerRequest(), $this->writingMiddleware());
$token = $this->getCookie($response)->getValue();
$response = $this->middleware->process(new ServerRequest(), $this->writingMiddleware());
$token = $this->getCookie($response)->getValue();

self::assertIsString($token);
self::assertTrue($token !== '');
Expand Down Expand Up @@ -574,14 +570,7 @@ public function extractFrom(ServerRequestInterface $request): string
};

$middleware = new SessionMiddleware(
Configuration::forSymmetricSigner(
new Sha256(),
self::makeRandomSymmetricKey(),
),
SetCookie::create(SessionMiddleware::DEFAULT_COOKIE),
100,
SystemClock::fromSystemTimezone(),
fingerprintConfig: new FingerprintConfig($source),
$this->config->withClientFingerprintConfiguration(new FingerprintConfig($source)),
);

$request = new ServerRequest([$serverParamKey => $serverParamValue]);
Expand All @@ -595,7 +584,7 @@ public function extractFrom(ServerRequestInterface $request): string
self::assertInstanceOf(Plain::class, $parsedToken);
self::assertTrue($parsedToken->claims()->has(SameOriginRequest::CLAIM));

$validNewRequest = $request->withCookieParams([SessionMiddleware::DEFAULT_COOKIE => $token]);
$validNewRequest = $request->withCookieParams([$this->config->getCookie()->getName() => $token]);

$middleware->process(
$validNewRequest,
Expand All @@ -613,7 +602,7 @@ static function (ServerRequestInterface $request) use ($sessionValue) {

$invalidNewRequest = (new ServerRequest([
$serverParamKey => $serverParamValue . ' changed',
]))->withCookieParams([SessionMiddleware::DEFAULT_COOKIE => $token]);
]))->withCookieParams([$this->config->getCookie()->getName() => $token]);

$middleware->process(
$invalidNewRequest,
Expand Down

0 comments on commit 371336e

Please sign in to comment.