Use service for fix newsletter API data

[MAILPOET-3430]
This commit is contained in:
Jan Lysý
2021-02-18 09:06:12 +01:00
committed by Veljko V
parent e443e3918d
commit 9441d32bdd
2 changed files with 19 additions and 4 deletions

View File

@@ -6,6 +6,7 @@ use MailPoet\API\JSON\Endpoint as APIEndpoint;
use MailPoet\API\JSON\Error as APIError; use MailPoet\API\JSON\Error as APIError;
use MailPoet\API\JSON\ResponseBuilders\NewsletterTemplatesResponseBuilder; use MailPoet\API\JSON\ResponseBuilders\NewsletterTemplatesResponseBuilder;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Newsletter\ApiDataSanitizer;
use MailPoet\NewsletterTemplates\NewsletterTemplatesRepository; use MailPoet\NewsletterTemplates\NewsletterTemplatesRepository;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
@@ -24,12 +25,17 @@ class NewsletterTemplates extends APIEndpoint {
/** @var NewsletterTemplatesResponseBuilder */ /** @var NewsletterTemplatesResponseBuilder */
private $newsletterTemplatesResponseBuilder; private $newsletterTemplatesResponseBuilder;
/** @var ApiDataSanitizer */
private $apiDataSanitizer;
public function __construct( public function __construct(
NewsletterTemplatesRepository $newsletterTemplatesRepository, NewsletterTemplatesRepository $newsletterTemplatesRepository,
NewsletterTemplatesResponseBuilder $newsletterTemplatesResponseBuilder NewsletterTemplatesResponseBuilder $newsletterTemplatesResponseBuilder,
ApiDataSanitizer $apiDataSanitizer
) { ) {
$this->newsletterTemplatesRepository = $newsletterTemplatesRepository; $this->newsletterTemplatesRepository = $newsletterTemplatesRepository;
$this->newsletterTemplatesResponseBuilder = $newsletterTemplatesResponseBuilder; $this->newsletterTemplatesResponseBuilder = $newsletterTemplatesResponseBuilder;
$this->apiDataSanitizer = $apiDataSanitizer;
} }
public function get($data = []) { public function get($data = []) {
@@ -55,6 +61,8 @@ class NewsletterTemplates extends APIEndpoint {
public function save($data = []) { public function save($data = []) {
ignore_user_abort(true); ignore_user_abort(true);
$body = $this->apiDataSanitizer->sanitizeBody(json_decode($data['body'], true));
$data['body'] = json_encode($body);
try { try {
$template = $this->newsletterTemplatesRepository->createOrUpdate($data); $template = $this->newsletterTemplatesRepository->createOrUpdate($data);
if (!empty($data['categories']) && $data['categories'] === NewsletterTemplatesRepository::RECENTLY_SENT_CATEGORIES) { if (!empty($data['categories']) && $data['categories'] === NewsletterTemplatesRepository::RECENTLY_SENT_CATEGORIES) {

View File

@@ -68,6 +68,9 @@ class NewsletterSaveController {
/** @var WPFunctions */ /** @var WPFunctions */
private $wp; private $wp;
/** @var ApiDataSanitizer */
private $dataSanitizer;
public function __construct( public function __construct(
AuthorizedEmailsController $authorizedEmailsController, AuthorizedEmailsController $authorizedEmailsController,
Emoji $emoji, Emoji $emoji,
@@ -81,7 +84,8 @@ class NewsletterSaveController {
ScheduledTasksRepository $scheduledTasksRepository, ScheduledTasksRepository $scheduledTasksRepository,
SettingsController $settings, SettingsController $settings,
Security $security, Security $security,
WPFunctions $wp WPFunctions $wp,
ApiDataSanitizer $dataSanitizer
) { ) {
$this->authorizedEmailsController = $authorizedEmailsController; $this->authorizedEmailsController = $authorizedEmailsController;
$this->emoji = $emoji; $this->emoji = $emoji;
@@ -96,18 +100,21 @@ class NewsletterSaveController {
$this->settings = $settings; $this->settings = $settings;
$this->security = $security; $this->security = $security;
$this->wp = $wp; $this->wp = $wp;
$this->dataSanitizer = $dataSanitizer;
} }
public function save(array $data = []): NewsletterEntity { public function save(array $data = []): NewsletterEntity {
if (!empty($data['template_id'])) { if (!empty($data['template_id'])) {
$template = $this->newsletterTemplatesRepository->findOneById($data['template_id']); $template = $this->newsletterTemplatesRepository->findOneById($data['template_id']);
if ($template) { if ($template) {
$data['body'] = json_encode($template->getBody()); $body = $this->dataSanitizer->sanitizeBody($template->getBody() ?: []);
$data['body'] = json_encode($body);
} }
} }
if (!empty($data['body'])) { if (!empty($data['body'])) {
$data['body'] = $this->emoji->encodeForUTF8Column(MP_NEWSLETTERS_TABLE, 'body', $data['body']); $body = $this->dataSanitizer->sanitizeBody(json_decode($data['body'], true));
$data['body'] = $this->emoji->encodeForUTF8Column(MP_NEWSLETTERS_TABLE, 'body', json_encode($body));
} }
$newsletter = isset($data['id']) ? $this->getNewsletter($data) : $this->createNewsletter($data); $newsletter = isset($data['id']) ? $this->getNewsletter($data) : $this->createNewsletter($data);