Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit c3e30eb

Browse filesBrowse files
committed
Fix fingerprint when context is not serializable
1 parent 756522e commit c3e30eb
Copy full SHA for c3e30eb

File tree

Expand file treeCollapse file tree

2 files changed

+39
-1
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+39
-1
lines changed

‎src/Symfony/Bridge/Twig/Mime/BodyRenderer.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Mime/BodyRenderer.php
+18-1Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public function render(Message $message): void
4949

5050
$previousRenderingKey = $messageContext[__CLASS__] ?? null;
5151
unset($messageContext[__CLASS__]);
52-
$currentRenderingKey = md5(serialize([$messageContext, $message->getTextTemplate(), $message->getHtmlTemplate()]));
52+
$currentRenderingKey = $this->getFingerPrint($message);
5353
if ($previousRenderingKey === $currentRenderingKey) {
5454
return;
5555
}
@@ -77,6 +77,23 @@ public function render(Message $message): void
7777
$message->context($message->getContext() + [__CLASS__ => $currentRenderingKey]);
7878
}
7979

80+
private function getFingerPrint(TemplatedEmail $message): string
81+
{
82+
$messageContext = $message->getContext();
83+
unset($messageContext[__CLASS__]);
84+
85+
$payload = [$messageContext, $message->getTextTemplate(), $message->getHtmlTemplate()];
86+
try {
87+
$serialized = serialize($payload);
88+
} catch (\Exception $e) {
89+
// Serialization of 'Closure' is not allowed
90+
// Happens when context contain a closure, in that case, we assume that context always change.
91+
$serialized = random_bytes(8);
92+
}
93+
94+
return md5($serialized);
95+
}
96+
8097
private function convertHtmlToText(string $html): string
8198
{
8299
if (null !== $this->converter) {

‎src/Symfony/Bridge/Twig/Tests/Mime/BodyRendererTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Bridge/Twig/Tests/Mime/BodyRendererTest.php
+21Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,27 @@ public function testRenderedOnce()
100100
$this->assertEquals('reset', $email->getTextBody());
101101
}
102102

103+
public function testRenderedOnceUnserializableContext()
104+
{
105+
$twig = new Environment(new ArrayLoader([
106+
'text' => 'Text',
107+
]));
108+
$renderer = new BodyRenderer($twig);
109+
$email = (new TemplatedEmail())
110+
->to('fabien@symfony.com')
111+
->from('helene@symfony.com')
112+
;
113+
$email->textTemplate('text');
114+
$email->context([
115+
'foo' => static function () {
116+
return 'bar';
117+
},
118+
]);
119+
120+
$renderer->render($email);
121+
$this->assertEquals('Text', $email->getTextBody());
122+
}
123+
103124
private function prepareEmail(?string $text, ?string $html, array $context = []): TemplatedEmail
104125
{
105126
$twig = new Environment(new ArrayLoader([

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.