Fix bug when duplicated newsletter uses the source's coupon

On duplication, the sensitive data of the coupon were
inherited from the source

[MAILPOET-4678]
This commit is contained in:
Sam Najian
2023-01-20 17:15:39 +01:00
committed by Aschepikov
parent 6164a92b9f
commit 7ced42a494
4 changed files with 100 additions and 1 deletions

View File

@@ -481,6 +481,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Newsletter\Sending\SendingQueuesRepository::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\ViewInBrowser\ViewInBrowserController::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\ViewInBrowser\ViewInBrowserRenderer::class)->setPublic(true);
$container->autowire(\MailPoet\Newsletter\NewsletterCoupon::class)->setPublic(true);
$container->autowire(\MailPoet\Statistics\GATracking::class)->setPublic(true);
// Newsletter templates
$container->autowire(\MailPoet\NewsletterTemplates\NewsletterTemplatesRepository::class)->setPublic(true);

View File

@@ -0,0 +1,45 @@
<?php declare(strict_types = 1);
namespace MailPoet\Newsletter;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Newsletter\Renderer\Blocks\Coupon;
class NewsletterCoupon {
public function cleanupSensitiveData(NewsletterEntity $newsletter): NewsletterEntity {
$body = $newsletter->getBody();
if (!is_array($body) || empty($body['content'])) {
return $newsletter;
}
$cleanBlocks = $this->cleanupCouponBlocks($body['content']['blocks']);
$updatedBody = array_merge(
$body,
[
'content' => array_merge(
$body['content'],
['blocks' => $cleanBlocks]
),
]
);
$newsletter->setBody($updatedBody);
return $newsletter;
}
private function cleanupCouponBlocks(array &$blocks): array {
foreach ($blocks as &$block) {
if (isset($block['blocks']) && !empty($block['blocks'])) {
$this->cleanupCouponBlocks($block['blocks']);
}
if (isset($block['type']) && $block['type'] === Coupon::TYPE) {
if (isset($block['code']))
unset($block['code']);
if(isset($block['couponId']))
unset($block['couponId']);
}
}
return $blocks;
}
}

View File

@@ -74,6 +74,9 @@ class NewsletterSaveController {
/** @var Scheduler */
private $scheduler;
/*** @var NewsletterCoupon */
private $newsletterCoupon;
public function __construct(
AuthorizedEmailsController $authorizedEmailsController,
Emoji $emoji,
@@ -89,7 +92,8 @@ class NewsletterSaveController {
Security $security,
WPFunctions $wp,
ApiDataSanitizer $dataSanitizer,
Scheduler $scheduler
Scheduler $scheduler,
NewsletterCoupon $newsletterCoupon
) {
$this->authorizedEmailsController = $authorizedEmailsController;
$this->emoji = $emoji;
@@ -106,6 +110,7 @@ class NewsletterSaveController {
$this->wp = $wp;
$this->dataSanitizer = $dataSanitizer;
$this->scheduler = $scheduler;
$this->newsletterCoupon = $newsletterCoupon;
}
public function save(array $data = []): NewsletterEntity {
@@ -182,6 +187,7 @@ class NewsletterSaveController {
// reset sent at date
$duplicate->setSentAt(null);
$duplicate = $this->newsletterCoupon->cleanupSensitiveData($duplicate);
$this->newslettersRepository->persist($duplicate);
$this->newslettersRepository->flush();

View File

@@ -0,0 +1,47 @@
<?php declare(strict_types = 1);
namespace unit\Newsletter\Editor;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Newsletter\NewsletterCoupon;
use MailPoet\Newsletter\Renderer\Blocks\Coupon;
class NewsletterCouponTest extends \MailPoetUnitTest {
public function testCleanupSensitiveDataRecursively() {
$newsletterCoupon = new NewsletterCoupon();
$newsletter = new NewsletterEntity();
$blocks = [
[
'type' => 'any',
'blocks' => [
[
'type' => Coupon::TYPE,
'couponId' => '100',
'code' => 'asdasjdkkjaskljdasd',
],
[
'type' => 'any',
'blocks' => [
[
'type' => Coupon::TYPE,
'couponId' => '100',
'code' => 'asdasjdkkjaskljdasd',
],
],
],
],
],
[
'type' => Coupon::TYPE,
'couponId' => '100',
'code' => 'asdasjdkkjaskljdasd',
],
];
$newsletter->setBody(['content' => ['blocks' => $blocks]]);
$result = $newsletterCoupon->cleanupSensitiveData($newsletter);
$body = (array)$result->getBody();
expect($body['content']['blocks'][0]['blocks'][0])->equals(['type' => Coupon::TYPE]);
expect($body['content']['blocks'][0]['blocks'][1]['blocks'][0])->equals(['type' => Coupon::TYPE]);
expect($body['content']['blocks'][1])->equals(['type' => Coupon::TYPE]);
}
}