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..62e1f88eedf13 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 = 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 = new AccessDecision(); + $this->isGrantedForUser($user, $attributes, $subject, $accessDecision); + + return $accessDecision; + } + + public function getToken(): ?TokenInterface { return $this->container->get('security.token_storage')->getToken(); 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));