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:
@@ -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);
|
||||
|
45
mailpoet/lib/Newsletter/NewsletterCoupon.php
Normal file
45
mailpoet/lib/Newsletter/NewsletterCoupon.php
Normal 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;
|
||||
}
|
||||
}
|
@@ -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();
|
||||
|
||||
|
@@ -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]);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user