Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 31 additions & 3 deletions src/Manager/Doctrine/AccessTokenManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
use League\Bundle\OAuth2ServerBundle\Manager\AccessTokenManagerInterface;
use League\Bundle\OAuth2ServerBundle\Model\AccessToken;
use League\Bundle\OAuth2ServerBundle\Model\AccessTokenInterface;
use League\Bundle\OAuth2ServerBundle\Model\RefreshToken;

final class AccessTokenManager implements AccessTokenManagerInterface
{
Expand Down Expand Up @@ -50,12 +51,39 @@ public function clearExpired(): int
return 0;
}

/** @var int */
return $this->entityManager->createQueryBuilder()
->delete(AccessToken::class, 'at')
/** @var array{identifier: string}[] */
$results = $this->entityManager->createQueryBuilder()
->select('at.identifier')
->from(AccessToken::class, 'at')
->where('at.expiry < :expiry')
->setParameter('expiry', new \DateTimeImmutable(), 'datetime_immutable')
->getQuery()
->getScalarResult();
if (0 === \count($results)) {
return 0;
}

/** @var string[] */
$ids = array_column($results, 'identifier');

// unlink access tokens from refresh tokens
$this->entityManager->createQueryBuilder()
->update(RefreshToken::class, 'rt')
->set('rt.accessToken', ':null')
->where('rt.accessToken IN (:ids)')
->setParameter('null', null)
->setParameter('ids', $ids)
->getQuery()
->execute();

// delete expired access tokens
$this->entityManager->createQueryBuilder()
->delete(AccessToken::class, 'at')
->where('at.identifier IN (:ids)')
->setParameter('ids', $ids)
->getQuery()
->execute();

return \count($ids);
}
}
7 changes: 3 additions & 4 deletions tests/Acceptance/DoctrineAccessTokenManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,9 @@ public function testClearExpiredWithRefreshToken(): void

$this->assertSame(3, $doctrineAccessTokenManager->clearExpired());

$this->assertSame(
$testData['output'],
$em->getRepository(RefreshToken::class)->findBy(['accessToken' => null], ['identifier' => 'ASC'])
);
$em->clear();

self::assertCount(3, $em->getRepository(RefreshToken::class)->findBy(['accessToken' => null], ['identifier' => 'ASC']));
}

public function testClearExpiredWithRefreshTokenWithoutSavingAccessToken(): void
Expand Down
10 changes: 5 additions & 5 deletions tests/Acceptance/DoctrineClientManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ final class DoctrineClientManagerTest extends AbstractAcceptanceTest
{
public function testSimpleDelete(): void
{
/** @var $em EntityManagerInterface */
/** @var EntityManagerInterface $em */
$em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
$doctrineClientManager = new DoctrineClientManager($em, self::getContainer()->get(EventDispatcherInterface::class), Client::class);

Expand All @@ -41,7 +41,7 @@ public function testSimpleDelete(): void

public function testClientDeleteCascadesToAccessTokens(): void
{
/** @var $em EntityManagerInterface */
/** @var EntityManagerInterface $em */
$em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
$doctrineClientManager = new DoctrineClientManager($em, self::getContainer()->get(EventDispatcherInterface::class), Client::class);

Expand Down Expand Up @@ -74,7 +74,7 @@ public function testClientDeleteCascadesToAccessTokens(): void

public function testSaveClientWithoutScopeAddDefaultScopes(): void
{
/** @var $em EntityManagerInterface */
/** @var EntityManagerInterface $em */
$em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
$doctrineClientManager = new DoctrineClientManager($em, self::getContainer()->get(EventDispatcherInterface::class), Client::class);

Expand All @@ -88,7 +88,7 @@ public function testSaveClientWithoutScopeAddDefaultScopes(): void

public function testClientDeleteCascadesToAccessTokensAndRefreshTokens(): void
{
/** @var $em EntityManagerInterface */
/** @var EntityManagerInterface $em */
$em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
$doctrineClientManager = new DoctrineClientManager($em, self::getContainer()->get(EventDispatcherInterface::class), Client::class);

Expand Down Expand Up @@ -122,7 +122,7 @@ public function testClientDeleteCascadesToAccessTokensAndRefreshTokens(): void
->find($accessToken->getIdentifier())
);

/** @var $refreshToken RefreshToken */
/** @var RefreshToken $refreshToken */
$refreshToken = $em
->getRepository(RefreshToken::class)
->find($refreshToken->getIdentifier())
Expand Down