Skip to content

Commit

Permalink
Merge branch '5.4' into 6.4
Browse files Browse the repository at this point in the history
* 5.4:
  Update deprecations baseline
  drop existing schema if tests create it explicitly
  synchronize line numbers in deprecations baseline
  Add integration test for RememberMe with pg connection
  fix: DoctrineTokenProvider not oracle compatible
  • Loading branch information
xabbuh committed Oct 18, 2024
2 parents 6691e1f + 94ecd6f commit 402d583
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 6 deletions.
10 changes: 6 additions & 4 deletions Security/RememberMe/DoctrineTokenProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,15 +52,17 @@ public function __construct(

public function loadTokenBySeries(string $series): PersistentTokenInterface
{
// the alias for lastUsed works around case insensitivity in PostgreSQL
$sql = 'SELECT class, username, value, lastUsed AS last_used FROM rememberme_token WHERE series=:series';
$sql = 'SELECT class, username, value, lastUsed FROM rememberme_token WHERE series=:series';
$paramValues = ['series' => $series];
$paramTypes = ['series' => ParameterType::STRING];
$stmt = $this->conn->executeQuery($sql, $paramValues, $paramTypes);
$row = $stmt instanceof Result || $stmt instanceof DriverResult ? $stmt->fetchAssociative() : $stmt->fetch(\PDO::FETCH_ASSOC);

// fetching numeric because column name casing depends on platform, eg. Oracle converts all not quoted names to uppercase
$row = $stmt instanceof Result || $stmt instanceof DriverResult ? $stmt->fetchNumeric() : $stmt->fetch(\PDO::FETCH_NUM);

if ($row) {
return new PersistentToken($row['class'], $row['username'], $series, $row['value'], new \DateTimeImmutable($row['last_used']));
[$class, $username, $value, $last_used] = $row;
return new PersistentToken($class, $username, $series, $value, new \DateTimeImmutable($last_used));
}

throw new TokenNotFoundException('No token found.');
Expand Down
55 changes: 55 additions & 0 deletions Tests/Security/RememberMe/DoctrineTokenProviderPostgresTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

namespace Symfony\Bridge\Doctrine\Tests\Security\RememberMe;

use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory;
use Doctrine\ORM\ORMSetup;
use Symfony\Bridge\Doctrine\Security\RememberMe\DoctrineTokenProvider;

/**
* @requires extension pdo_pgsql
* @group integration
*/
class DoctrineTokenProviderPostgresTest extends DoctrineTokenProviderTest
{
public static function setUpBeforeClass(): void
{
if (!getenv('POSTGRES_HOST')) {
self::markTestSkipped('Missing POSTGRES_HOST env variable');
}
}

protected function bootstrapProvider()
{
$config = class_exists(ORMSetup::class) ? ORMSetup::createConfiguration(true) : new Configuration();
if (class_exists(DefaultSchemaManagerFactory::class)) {
$config->setSchemaManagerFactory(new DefaultSchemaManagerFactory());
}

$connection = DriverManager::getConnection([
'driver' => 'pdo_pgsql',
'host' => getenv('POSTGRES_HOST'),
'user' => 'postgres',
'password' => 'password',
], $config);
$connection->{method_exists($connection, 'executeStatement') ? 'executeStatement' : 'executeUpdate'}(<<<'SQL'
DROP TABLE IF EXISTS rememberme_token;
SQL
);

$connection->{method_exists($connection, 'executeStatement') ? 'executeStatement' : 'executeUpdate'}(<<<'SQL'
CREATE TABLE rememberme_token (
series CHAR(88) UNIQUE PRIMARY KEY NOT NULL,
value VARCHAR(88) NOT NULL, -- CHAR(88) adds spaces at the end
lastUsed TIMESTAMP NOT NULL,
class VARCHAR(100) NOT NULL,
username VARCHAR(200) NOT NULL
);
SQL
);

return new DoctrineTokenProvider($connection);
}
}
4 changes: 2 additions & 2 deletions Tests/Security/RememberMe/DoctrineTokenProviderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
* file that was distributed with this source code.
*/

namespace Security\RememberMe;
namespace Symfony\Bridge\Doctrine\Tests\Security\RememberMe;

use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory;
Expand Down Expand Up @@ -120,7 +120,7 @@ public function testVerifyOutdatedTokenAfterParallelRequestFailsAfter60Seconds()
/**
* @return DoctrineTokenProvider
*/
private function bootstrapProvider()
protected function bootstrapProvider()
{
$config = ORMSetup::createConfiguration(true);
if (class_exists(DefaultSchemaManagerFactory::class)) {
Expand Down

0 comments on commit 402d583

Please sign in to comment.