8000 Merge branch '6.3' into 6.4 · symfony/symfony@727c7ea · GitHub
[go: up one dir, main page]

Skip to content

Commit 727c7ea

Browse files
committed
Merge branch '6.3' into 6.4
* 6.3: [Messenger] Fix using negative delay [Validator] Add missing italian translation [Validator] Fix using known option names as field names [SecurityBundle] Prevent to login/logout without a request context
2 parents 93576a8 + be8cb29 commit 727c7ea

File tree

7 files changed

+123
-8
lines changed

7 files changed

+123
-8
lines changed

src/Symfony/Bundle/SecurityBundle/Security.php

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ public function getFirewallConfig(Request $request): ?FirewallConfig
115115
public function login(UserInterface $user, string $authenticatorName = null, string $firewallName = null, array $badges = []): ?Response
116116
{
117117
$request = $this->container->get('request_stack')->getCurrentRequest();
118+
if (null === $request) {
119+
throw new LogicException('Unable to login without a request context.');
120+
}
121+
118122
$firewallName ??= $this->getFirewallConfig($request)?->getName();
119123

120124
if (!$firewallName) {
@@ -139,15 +143,18 @@ public function login(UserInterface $user, string $authenticatorName = null, str
139143
*/
140144
public function logout(bool $validateCsrfToken = true): ?Response
141145
{
146+
$request = $this->container->get('request_stack')->getMainRequest();
147+
if (null === $request) {
148+
throw new LogicException('Unable to logout without a request context.');
149+
}
150+
142151
/** @var TokenStorageInterface $tokenStorage */
143152
$tokenStorage = $this->container->get('security.token_storage');
144153

145154
if (!($token = $tokenStorage->getToken()) || !$token->getUser()) {
146155
throw new LogicException('Unable to logout as there is no logged-in user.');
147156
}
148157

149-
$request = $this->container->get('request_stack')->getMainRequest();
150-
151158
if (!$firewallConfig = $this->container->get('security.firewall.map')->getFirewallConfig($request)) {
152159
throw new LogicException('Unable to logout as the request is not behind a firewall.');
153160
}

src/Symfony/Bundle/SecurityBundle/Tests/SecurityTest.php

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,28 @@ public function testLoginWithoutAuthenticatorThrows()
252252
$security->login($user);
253253
}
254254

255+
public function testLoginWithoutRequestContext()
256+
{
257+
$requestStack = new RequestStack();
258+
$user = $this->createMock(UserInterface::class);
259+
260+
$container = $this->createMock(ContainerInterface::class);
261+
$container
262+
->expects($this->atLeastOnce())
263+
->method('get')
264+
->willReturnMap([
265+
['request_stack', $requestStack],
266+
])
267+
;
268+
269+
$security = new Security($container, ['main' => null]);
270+
271+
$this->expectException(\LogicException::class);
272+
$this->expectExceptionMessage('Unable to login without a request context.');
273+
274+
$security->login($user);
275+
}
276+
255277
public function testLogout()
256278
{
257279
$request = new Request();
@@ -458,6 +480,27 @@ public function testLogoutWithValidCsrf()
458480
$this->assertEquals('a custom response', $response->getContent());
459481
}
460482

483+
public function testLogoutWithoutRequestContext()
484+
{
485+
$requestStack = new RequestStack();
486+
487+
$container = $this->createMock(ContainerInterface::class);
488+
$container
489+
->expects($this->atLeastOnce())
490+
->method('get')
491+
->willReturnMap([
492+
['request_stack', $requestStack],
493+
])
494+
;
495+
496+
$security = new Security($container, ['main' => null]);
497+
498+
$this->expectException(\LogicException::class);
499+
$this->expectExceptionMessage('Unable to logout without a request context.');
500+
501+
$security->logout();
502+
}
503+
461504
private function createContainer(string $serviceId, object $serviceObject): ContainerInterface
462505
{
463506
return new ServiceLocator([$serviceId => fn () => $serviceObject]);

src/Symfony/Component/Messenger/Bridge/Doctrine/Tests/Transport/DoctrineIntegrationTest.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,29 @@ public function testSendWithDelay()
6767
// DBAL 2 compatibility
6868
$result = method_exists($qb, 'executeQuery') ? $qb->executeQuery() : $qb->execute();
6969

70-
$available_at = new \DateTimeImmutable($result->fetchOne());
70+
$availableAt = new \DateTimeImmutable($result->fetchOne());
7171

7272
$now = new \DateTimeImmutable('now + 60 seconds');
73-
$this->assertGreaterThan($now, $available_at);
73+
$this->assertGreaterThan($now, $availableAt);
74+
}
75+
76+
public function testSendWithNegativeDelay()
77+
{
78+
$this->connection->send('{"message": "Hi, I am not actually delayed"}', ['type' => DummyMessage::class], -600000);
79+
80+
$qb = $this->driverConnection->createQueryBuilder()
81+
->select('m.available_at')
82+
->from('messenger_messages', 'm')
83+
->where('m.body = :body')
84+
->setParameter('body', '{"message": "Hi, I am not actually delayed"}');
85+
86+
// DBAL 2 compatibility
87+
$result = method_exists($qb, 'executeQuery') ? $qb->executeQuery() : $qb->execute();
88+
89+
$availableAt = new \DateTimeImmutable($result->fetchOne());
90+
91+
$now = new \DateTimeImmutable('now - 60 seconds');
92+
$this->assertLessThan($now, $availableAt);
7493
}
7594

7695
public function testItRetrieveTheFirstAvailableMessage()

src/Symfony/Component/Messenger/Bridge/Doctrine/Transport/Connection.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ public static function buildConfiguration(#[\SensitiveParameter] string $dsn, ar
127127
public function send(string $body, array $headers, int $delay = 0): string
128128
{
129129
$now = new \DateTimeImmutable('UTC');
130-
$availableAt = $now->modify(sprintf('+%d seconds', $delay / 1000));
130+
$availableAt = $now->modify(sprintf('%+d seconds', $delay / 1000));
131131

132132
$queryBuilder = $this->driverConnection->createQueryBuilder()
133133
->insert($this->configuration['table_name'])

src/Symfony/Component/Validator/Constraints/Collection.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Validator\Constraints;
1313

14+
use Symfony\Component\Validator\Constraint;
1415
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
1516

1617
/**
@@ -43,9 +44,10 @@ class Collection extends Composite
4344

4445
public function __construct(mixed $fields = null, array $groups = null, mixed $payload = null, bool $allowExtraFields = null, bool $allowMissingFields = null, string $extraFieldsMessage = null, string $missingFieldsMessage = null)
4546
{
46-
// no known options set? $fields is the fields array
4747
if (\is_array($fields)
48-
&& !array_intersect(array_keys($fields), ['groups', 'fields', 'allowExtraFields', 'allowMissingFields', 'extraFieldsMessage', 'missingFieldsMessage'])) {
48+
&& (($firstField = reset($fields)) instanceof Constraint
49+
|| ($firstField[0] ?? null) instanceof Constraint
50+
)) {
4951
$fields = ['fields' => $fields];
5052
}
5153

src/Symfony/Component/Validator/Resources/translations/validators.it.xlf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,10 @@
426426
<source>Using hidden overlay characters is not allowed.</source>
427427
<target>Non è consentito utilizzare caratteri sovrapposti nascosti.</target>
428428
</trans-unit>
429+
<trans-unit id="110">
430+
<source>The extension of the file is invalid ({{ extension }}). Allowed extensions are {{ extensions }}.</source>
431+
<target>L'estensione del file non è valida ({{ extension }}). Le estensioni consentite sono {{ extensions }}.</target>
432+
</trans-unit>
429433
</body>
430434
</file>
431435
</xliff>

src/Symfony/Component/Validator/Tests/Constraints/CollectionTest.php

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\Validator\Constraints\Required;
1919
use Symfony\Component\Validator\Constraints\Valid;
2020
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
21+
use Symfony\Component\Validator\Exception\InvalidOptionsException;
2122

2223
/**
2324
* @author Bernhard Schussek <bschussek@gmail.com>
@@ -34,7 +35,7 @@ public function testRejectInvalidFieldsOption()
3435

3536
public function testRejectNonConstraints()
3637
{
37-
$this->expectException(ConstraintDefinitionException::class);
38+
$this->expectException(InvalidOptionsException::class);
3839
new Collection([
3940
'foo' => 'bar',
4041
]);
@@ -113,4 +114,43 @@ public function testConstraintHasDefaultGroupWithOptionalValues()
113114
$this->assertEquals(['Default'], $constraint->fields['foo']->groups);
114115
$this->assertEquals(['Default'], $constraint->fields['bar']->groups);
115116
}
117+
118+
public function testOnlySomeKeysAreKnowOptions()
119+
{
120+
$constraint = new Collection([
121+
'fields' => [new Required()],
122+
'properties' => [new Required()],
123+
'catalog' => [new Optional()],
124+
]);
125+
126+
$this->assertArrayHasKey('fields', $constraint->fields);
127+
$this->assertInstanceOf(Required::class, $constraint->fields['fields']);
128+
$this->assertArrayHasKey('properties', $constraint->fields);
129+
$this->assertInstanceOf(Required::class, $constraint->fields['properties']);
130+
$this->assertArrayHasKey('catalog', $constraint->fields);
131+
$this->assertInstanceOf(Optional::class, $constraint->fields['catalog']);
132+
}
133+
134+
public function testAllKeysAreKnowOptions()
135+
{
136+
$constraint = new Collection([
137+
'fields' => [
138+
'fields' => [new Required()],
139+
'properties' => [new Required()],
140+
'catalog' => [new Optional()],
141+
],
142+
'allowExtraFields' => true,
143+
'extraFieldsMessage' => 'foo bar baz',
144+
]);
145+
146+
$this->assertArrayHasKey('fields', $constraint->fields);
147+
$this->assertInstanceOf(Required::class, $constraint->fields['fields']);
148+
$this->assertArrayHasKey('properties', $constraint->fields);
149+
$this->assertInstanceOf(Required::class, $constraint->fields['properties']);
150+
$this->assertArrayHasKey('catalog', $constraint->fields);
151+
$this->assertInstanceOf(Optional::class, $constraint->fields['catalog']);
152+
153+
$this->assertTrue($constraint->allowExtraFields);
154+
$this->assertSame('foo bar baz', $constraint->extraFieldsMessage);
155+
}
116156
}

0 commit comments

Comments
 (0)
0