From f9c0a3db924b9ae762277dc4f2e478ed0326c64a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antal=20=C3=81ron?= Date: Tue, 5 Aug 2025 00:42:19 +0200 Subject: [PATCH 1/3] Add friendly name in the `to` field --- .../Resend/Tests/Transport/ResendApiTransportTest.php | 2 +- .../Mailer/Bridge/Resend/Transport/ResendApiTransport.php | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Component/Mailer/Bridge/Resend/Tests/Transport/ResendApiTransportTest.php b/src/Symfony/Component/Mailer/Bridge/Resend/Tests/Transport/ResendApiTransportTest.php index 46a93365ac747..38f0773a0c5ed 100644 --- a/src/Symfony/Component/Mailer/Bridge/Resend/Tests/Transport/ResendApiTransportTest.php +++ b/src/Symfony/Component/Mailer/Bridge/Resend/Tests/Transport/ResendApiTransportTest.php @@ -152,7 +152,7 @@ public function testSendForIdnDomains() $body = json_decode($options['body'], true); // to - $this->assertSame('kältetechnik@xn--kltetechnik-xyz-0kb.de', $body['to'][0]); + $this->assertSame('Kältetechnik Xyz ', $body['to'][0]); // sender $this->assertStringContainsString('info@xn--kltetechnik-xyz-0kb.de', $body['from']); $this->assertStringContainsString('Kältetechnik Xyz', $body['from']); diff --git a/src/Symfony/Component/Mailer/Bridge/Resend/Transport/ResendApiTransport.php b/src/Symfony/Component/Mailer/Bridge/Resend/Transport/ResendApiTransport.php index c4033e6946b3f..e9a51ac1a0832 100644 --- a/src/Symfony/Component/Mailer/Bridge/Resend/Transport/ResendApiTransport.php +++ b/src/Symfony/Component/Mailer/Bridge/Resend/Transport/ResendApiTransport.php @@ -82,7 +82,7 @@ private function formatAddresses(array $addresses): array { $formattedAddresses = []; foreach ($addresses as $address) { - $formattedAddresses[] = $address->getEncodedAddress(); + $formattedAddresses[] = $this->formatAddress($address); } if (\count($formattedAddresses) > 50) { @@ -99,8 +99,8 @@ private function getPayload(Email $email, Envelope $envelope): array 'to' => $this->formatAddresses($this->getRecipients($email, $envelope)), 'subject' => $email->getSubject(), ]; - if ($attachements = $this->prepareAttachments($email)) { - $payload['attachments'] = $attachements; + if ($attachments = $this->prepareAttachments($email)) { + $payload['attachments'] = $attachments; } if ($emails = $email->getReplyTo()) { $payload['reply_to'] = current($this->formatAddresses($emails)); From f7438ff0de9aa64ac05175aa13b356df28c7dfca Mon Sep 17 00:00:00 2001 From: Florent Destremau Date: Sun, 10 Aug 2025 14:46:22 +0200 Subject: [PATCH 2/3] Added accessDecision and accessDecisionForUser helper functions This new function returns an AccessDecision object, allowing for further treatment in user land such as collecting the vote reasons. --- .../Twig/Extension/SecurityExtension.php | 21 +++++++++++++++++++ .../Bundle/SecurityBundle/Security.php | 17 +++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/Symfony/Bridge/Twig/Extension/SecurityExtension.php b/src/Symfony/Bridge/Twig/Extension/SecurityExtension.php index e0bb242586371..7e05d95dfda2c 100644 --- a/src/Symfony/Bridge/Twig/Extension/SecurityExtension.php +++ b/src/Symfony/Bridge/Twig/Extension/SecurityExtension.php @@ -55,6 +55,16 @@ public function isGranted(mixed $role, mixed $object = null, ?string $field = nu } } + public function accessDecision(mixed $role, mixed $object = null, ?string $field = null, ?AccessDecision $accessDecision = null): AccessDecision + { + $accessDecision = $accessDecision ?? new AccessDecision(); + + $this->isGranted($role, $object, $field, $accessDecision); + + return $accessDecision; + } + + public function isGrantedForUser(UserInterface $user, mixed $attribute, mixed $subject = null, ?string $field = null, ?AccessDecision $accessDecision = null): bool { if (null === $this->securityChecker) { @@ -80,6 +90,15 @@ public function isGrantedForUser(UserInterface $user, mixed $attribute, mixed $s } } + public function accessDecisionForUser(UserInterface $user, mixed $attribute, mixed $subject = null, ?string $field = null, ?AccessDecision $accessDecision = null): AccessDecision + { + $accessDecision = $accessDecision ?? new AccessDecision(); + + $this->isGrantedForUser($user, $attribute, $subject, $field, $accessDecision); + + return $accessDecision; + } + public function getImpersonateExitUrl(?string $exitTo = null): string { if (null === $this->impersonateUrlGenerator) { @@ -120,6 +139,7 @@ public function getFunctions(): array { $functions = [ new TwigFunction('is_granted', $this->isGranted(...)), + new TwigFunction('access_decision', $this->accessDecision(...)), new TwigFunction('impersonation_exit_url', $this->getImpersonateExitUrl(...)), new TwigFunction('impersonation_exit_path', $this->getImpersonateExitPath(...)), new TwigFunction('impersonation_url', $this->getImpersonateUrl(...)), @@ -128,6 +148,7 @@ public function getFunctions(): array if ($this->securityChecker instanceof UserAuthorizationCheckerInterface) { $functions[] = new TwigFunction('is_granted_for_user', $this->isGrantedForUser(...)); + $functions[] = new TwigFunction('access_decision_for_user', $this->accessDecisionForUser(...)); } return $functions; diff --git a/src/Symfony/Bundle/SecurityBundle/Security.php b/src/Symfony/Bundle/SecurityBundle/Security.php index 2efbb67fc3de0..1c9010066b2bb 100644 --- a/src/Symfony/Bundle/SecurityBundle/Security.php +++ b/src/Symfony/Bundle/SecurityBundle/Security.php @@ -65,6 +65,14 @@ public function isGranted(mixed $attributes, mixed $subject = null, ?AccessDecis ->isGranted($attributes, $subject, $accessDecision); } + public function accessDecision(mixed $attributes, mixed $subject = null, ?AccessDecision $accessDecision = null): AccessDecision + { + $accessDecision = $accessDecision ?? new AccessDecision(); + $this->isGranted($attributes, $subject, $accessDecision); + + return $accessDecision; + } + /** * Checks if the attribute is granted against the user and optionally supplied subject. * @@ -76,6 +84,15 @@ public function isGrantedForUser(UserInterface $user, mixed $attribute, mixed $s ->isGrantedForUser($user, $attribute, $subject, $accessDecision); } + public function accessDecisionForUser(UserInterface $user, mixed $attributes, mixed $subject = null, ?AccessDecision $accessDecision = null): AccessDecision + { + $accessDecision = $accessDecision ?? new AccessDecision(); + $this->isGrantedForUser($user, $attributes, $subject, $accessDecision); + + return $accessDecision; + } + + public function getToken(): ?TokenInterface { return $this->container->get('security.token_storage')->getToken(); From 8857a2f6375d61d3512720dcd1599598cd58b70d Mon Sep 17 00:00:00 2001 From: Florent Destremau Date: Thu, 21 Aug 2025 10:11:52 +0200 Subject: [PATCH 3/3] Simplified access decision creation --- src/Symfony/Bundle/SecurityBundle/Security.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Symfony/Bundle/SecurityBundle/Security.php b/src/Symfony/Bundle/SecurityBundle/Security.php index 1c9010066b2bb..62e1f88eedf13 100644 --- a/src/Symfony/Bundle/SecurityBundle/Security.php +++ b/src/Symfony/Bundle/SecurityBundle/Security.php @@ -65,9 +65,9 @@ public function isGranted(mixed $attributes, mixed $subject = null, ?AccessDecis ->isGranted($attributes, $subject, $accessDecision); } - public function accessDecision(mixed $attributes, mixed $subject = null, ?AccessDecision $accessDecision = null): AccessDecision + public function accessDecision(mixed $attributes, mixed $subject = null): AccessDecision { - $accessDecision = $accessDecision ?? new AccessDecision(); + $accessDecision = new AccessDecision(); $this->isGranted($attributes, $subject, $accessDecision); return $accessDecision; @@ -84,9 +84,9 @@ public function isGrantedForUser(UserInterface $user, mixed $attribute, mixed $s ->isGrantedForUser($user, $attribute, $subject, $accessDecision); } - public function accessDecisionForUser(UserInterface $user, mixed $attributes, mixed $subject = null, ?AccessDecision $accessDecision = null): AccessDecision + public function accessDecisionForUser(UserInterface $user, mixed $attributes, mixed $subject = null): AccessDecision { - $accessDecision = $accessDecision ?? new AccessDecision(); + $accessDecision = new AccessDecision(); $this->isGrantedForUser($user, $attributes, $subject, $accessDecision); return $accessDecision;