Skip to content
Snippets Groups Projects
Unverified Commit 96a1d7e2 authored by Fabien Potencier's avatar Fabien Potencier
Browse files

bug #121 Fix Symfony 7 compatibility (core23, jordisala1991)

This PR was merged into the 3.x-dev branch.

Discussion
----------

Fix Symfony 7 compatibility

Continuation of #116

I want to see what is failing to fix it.

Might close: https://github.com/symfony/security-acl/pull/112 https://github.com/symfony/security-acl/pull/115 https://github.com/symfony/security-acl/issues/114 #121

Commits
-------

17f22558 Actualizar AclVoter.php
29379e67 fix cs issues
c4c7ca07 suppress psalm since it is not fixable
1247ccb5 Fix tests
8647e143 Fix symfony 7 compatibility
parents 15b96b5d 17f22558
No related branches found
No related tags found
No related merge requests found
......@@ -7,6 +7,7 @@ return (new PhpCsFixer\Config())
'@Symfony' => true,
'@Symfony:risky' => true,
'protected_to_private' => false,
'phpdoc_to_comment' => ['ignored_tags' => ['psalm-suppress']],
])
->setRiskyAllowed(true)
->setFinder(
......
......@@ -11,7 +11,9 @@
namespace Symfony\Component\Security\Acl\Tests\Dbal;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Security\Acl\Dbal\AclProvider;
use Symfony\Component\Security\Acl\Dbal\Schema;
......@@ -146,10 +148,22 @@ class AclProviderTest extends TestCase
protected function setUp(): void
{
$this->connection = DriverManager::getConnection([
'driver' => 'pdo_sqlite',
'memory' => true,
]);
$configuration = new Configuration();
/**
* @psalm-suppress RedundantCondition Since we are compatibles with DBAL 2 and 3, we need to check if the method exists
*/
if (method_exists($configuration, 'setSchemaManagerFactory')) {
$configuration->setSchemaManagerFactory(new DefaultSchemaManagerFactory());
}
$this->connection = DriverManager::getConnection(
[
'driver' => 'pdo_sqlite',
'memory' => true,
],
$configuration
);
// import the schema
$schema = new Schema($this->getOptions());
......@@ -160,27 +174,50 @@ class AclProviderTest extends TestCase
// populate the schema with some test data
$insertClassStmt = $this->connection->prepare('INSERT INTO acl_classes (id, class_type) VALUES (?, ?)');
foreach ($this->getClassData() as $data) {
$insertClassStmt->executeStatement($data);
$insertClassStmt->bindValue(1, $data[0]);
$insertClassStmt->bindValue(2, $data[1]);
$insertClassStmt->executeStatement();
}
$insertSidStmt = $this->connection->prepare('INSERT INTO acl_security_identities (id, identifier, username) VALUES (?, ?, ?)');
foreach ($this->getSidData() as $data) {
$insertSidStmt->executeStatement($data);
$insertSidStmt->bindValue(1, $data[0]);
$insertSidStmt->bindValue(2, $data[1]);
$insertSidStmt->bindValue(3, $data[2]);
$insertSidStmt->executeStatement();
}
$insertOidStmt = $this->connection->prepare('INSERT INTO acl_object_identities (id, class_id, object_identifier, parent_object_identity_id, entries_inheriting) VALUES (?, ?, ?, ?, ?)');
foreach ($this->getOidData() as $data) {
$insertOidStmt->executeStatement($data);
$insertOidStmt->bindValue(1, $data[0]);
$insertOidStmt->bindValue(2, $data[1]);
$insertOidStmt->bindValue(3, $data[2]);
$insertOidStmt->bindValue(4, $data[3]);
$insertOidStmt->bindValue(5, $data[4]);
$insertOidStmt->executeStatement();
}
$insertEntryStmt = $this->connection->prepare('INSERT INTO acl_entries (id, class_id, object_identity_id, field_name, ace_order, security_identity_id, mask, granting, granting_strategy, audit_success, audit_failure) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
foreach ($this->getEntryData() as $data) {
$insertEntryStmt->executeStatement($data);
$insertEntryStmt->bindValue(1, $data[0]);
$insertEntryStmt->bindValue(2, $data[1]);
$insertEntryStmt->bindValue(3, $data[2]);
$insertEntryStmt->bindValue(4, $data[3]);
$insertEntryStmt->bindValue(5, $data[4]);
$insertEntryStmt->bindValue(6, $data[5]);
$insertEntryStmt->bindValue(7, $data[6]);
$insertEntryStmt->bindValue(8, $data[7]);
$insertEntryStmt->bindValue(9, $data[8]);
$insertEntryStmt->bindValue(10, $data[9]);
$insertEntryStmt->bindValue(11, $data[10]);
$insertEntryStmt->executeStatement();
}
$insertOidAncestorStmt = $this->connection->prepare('INSERT INTO acl_object_identity_ancestors (object_identity_id, ancestor_id) VALUES (?, ?)');
foreach ($this->getOidAncestorData() as $data) {
$insertOidAncestorStmt->executeStatement($data);
$insertOidAncestorStmt->bindValue(1, $data[0]);
$insertOidAncestorStmt->bindValue(2, $data[1]);
$insertOidAncestorStmt->executeStatement();
}
}
......
......@@ -11,8 +11,10 @@
namespace Symfony\Component\Security\Acl\Tests\Dbal;
use Doctrine\DBAL\Configuration;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\DriverManager;
use Doctrine\DBAL\Schema\DefaultSchemaManagerFactory;
use PHPUnit\Framework\TestCase;
use Symfony\Component\Security\Acl\Dbal\AclProvider;
use Symfony\Component\Security\Acl\Dbal\MutableAclProvider;
......@@ -518,10 +520,23 @@ class MutableAclProviderTest extends TestCase
protected function setUp(): void
{
$this->connection = DriverManager::getConnection([
'driver' => 'pdo_sqlite',
'memory' => true,
]);
$configuration = new Configuration();
/**
* @psalm-suppress RedundantCondition Since we are compatibles with DBAL 2 and 3, we need to check if the method exists
*/
if (method_exists($configuration, 'setSchemaManagerFactory')) {
$configuration->setSchemaManagerFactory(new DefaultSchemaManagerFactory());
}
$this->connection = DriverManager::getConnection(
[
'driver' => 'pdo_sqlite',
'memory' => true,
],
$configuration
);
$this->connection->setNestTransactionsWithSavepoints(true);
// import the schema
$schema = new Schema($this->getOptions());
......
......@@ -284,7 +284,7 @@ class CustomUserImpl implements UserInterface
return [];
}
public function eraseCredentials()
public function eraseCredentials(): void
{
}
......
......@@ -22,6 +22,30 @@ use Symfony\Component\Security\Acl\Permission\PermissionMapInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
if (class_exists(\Symfony\Component\Security\Core\Security::class)) {
/**
* @internal
*/
trait AclVoterTrait
{
public function vote(TokenInterface $token, $subject, array $attributes)
{
return $this->doVote($token, $subject, $attributes);
}
}
} else {
/**
* @internal
*/
trait AclVoterTrait
{
public function vote(TokenInterface $token, mixed $subject, array $attributes): int
{
return $this->doVote($token, $subject, $attributes);
}
}
}
/**
* This voter can be used as a base class for implementing your own permissions.
*
......@@ -29,6 +53,8 @@ use Symfony\Component\Security\Core\Authorization\Voter\VoterInterface;
*/
class AclVoter implements VoterInterface
{
use AclVoterTrait;
private $aclProvider;
private $permissionMap;
private $objectIdentityRetrievalStrategy;
......@@ -51,7 +77,7 @@ class AclVoter implements VoterInterface
return \is_string($attribute) && $this->permissionMap->contains($attribute);
}
public function vote(TokenInterface $token, $subject, array $attributes)
private function doVote(TokenInterface $token, $subject, array $attributes): int
{
foreach ($attributes as $attribute) {
if (!$this->supportsAttribute($attribute)) {
......
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