diff --git a/lib/API/JSON/v1/NewsletterTemplates.php b/lib/API/JSON/v1/NewsletterTemplates.php
index dc58f22458..8dbb59c267 100644
--- a/lib/API/JSON/v1/NewsletterTemplates.php
+++ b/lib/API/JSON/v1/NewsletterTemplates.php
@@ -61,8 +61,10 @@ class NewsletterTemplates extends APIEndpoint {
public function save($data = []) {
ignore_user_abort(true);
- $body = $this->apiDataSanitizer->sanitizeBody(json_decode($data['body'], true));
- $data['body'] = json_encode($body);
+ if (!empty($data['body'])) {
+ $body = $this->apiDataSanitizer->sanitizeBody(json_decode($data['body'], true));
+ $data['body'] = json_encode($body);
+ }
try {
$template = $this->newsletterTemplatesRepository->createOrUpdate($data);
if (!empty($data['categories']) && $data['categories'] === NewsletterTemplatesRepository::RECENTLY_SENT_CATEGORIES) {
diff --git a/lib/Newsletter/ApiDataSanitizer.php b/lib/Newsletter/ApiDataSanitizer.php
index 0787d1256a..0161215328 100644
--- a/lib/Newsletter/ApiDataSanitizer.php
+++ b/lib/Newsletter/ApiDataSanitizer.php
@@ -6,27 +6,24 @@ class ApiDataSanitizer {
/** @var NewsletterHtmlSanitizer */
private $htmlSanitizer;
+ private const SANITIZE_KEY_WHITELIST = [
+ 'text',
+ ];
+
public function __construct(NewsletterHtmlSanitizer $htmlSanitizer) {
$this->htmlSanitizer = $htmlSanitizer;
}
public function sanitizeBody(array $body): array {
foreach ($body as $blockName => $block) {
- $sanitizedBlock = is_array($block) ? $this->sanitizeBlock($block) : $this->htmlSanitizer->sanitize($block);
+ if (is_array($block)) {
+ $sanitizedBlock = $this->sanitizeBody($block);
+ } else {
+ $sanitizedBlock = $block && in_array($blockName, self::SANITIZE_KEY_WHITELIST, true) ? $this->htmlSanitizer->sanitize($block) : $block;
+ }
$body[$blockName] = $sanitizedBlock;
}
return $body;
}
-
- private function sanitizeBlock(array $block): array {
- foreach ($block as $name => $value) {
- if (is_array($value)) {
- $block[$name] = $this->sanitizeBlock($value);
- } else {
- $block[$name] = $value ? $this->htmlSanitizer->sanitize($value) : $value;
- }
- }
- return $block;
- }
}
diff --git a/lib/Newsletter/NewsletterSaveController.php b/lib/Newsletter/NewsletterSaveController.php
index 1e5fdef075..a46b41be21 100644
--- a/lib/Newsletter/NewsletterSaveController.php
+++ b/lib/Newsletter/NewsletterSaveController.php
@@ -107,8 +107,7 @@ class NewsletterSaveController {
if (!empty($data['template_id'])) {
$template = $this->newsletterTemplatesRepository->findOneById($data['template_id']);
if ($template) {
- $body = $this->dataSanitizer->sanitizeBody($template->getBody() ?: []);
- $data['body'] = json_encode($body);
+ $data['body'] = json_encode($template->getBody());
}
}
diff --git a/tests/integration/Newsletter/ApiDataSanitizerTest.php b/tests/integration/Newsletter/ApiDataSanitizerTest.php
index 766a76f233..811ae73a44 100644
--- a/tests/integration/Newsletter/ApiDataSanitizerTest.php
+++ b/tests/integration/Newsletter/ApiDataSanitizerTest.php
@@ -24,9 +24,9 @@ class ApiDataSanitizerTest extends \MailPoetTest {
],
],
[
- 'type' => 'image',
+ 'type' => 'header',
'link' => '',
- 'src' => 'http://some.url/wp-c\'">ontent/fake-logo.png',
+ 'text' => 'http://some.url/wp-c\'">
ontent/fake-logo.png',
],
];
@@ -46,8 +46,8 @@ class ApiDataSanitizerTest extends \MailPoetTest {
expect($block2['type'])->equals('footer');
expect($block2['text'])->equals('
Unsubscribe
Add your postal address here!