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\Sending\SendingQueuesRepository::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Newsletter\ViewInBrowser\ViewInBrowserController::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\ViewInBrowser\ViewInBrowserRenderer::class)->setPublic(true);
|
||||||
|
$container->autowire(\MailPoet\Newsletter\NewsletterCoupon::class)->setPublic(true);
|
||||||
$container->autowire(\MailPoet\Statistics\GATracking::class)->setPublic(true);
|
$container->autowire(\MailPoet\Statistics\GATracking::class)->setPublic(true);
|
||||||
// Newsletter templates
|
// Newsletter templates
|
||||||
$container->autowire(\MailPoet\NewsletterTemplates\NewsletterTemplatesRepository::class)->setPublic(true);
|
$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 */
|
/** @var Scheduler */
|
||||||
private $scheduler;
|
private $scheduler;
|
||||||
|
|
||||||
|
/*** @var NewsletterCoupon */
|
||||||
|
private $newsletterCoupon;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
AuthorizedEmailsController $authorizedEmailsController,
|
AuthorizedEmailsController $authorizedEmailsController,
|
||||||
Emoji $emoji,
|
Emoji $emoji,
|
||||||
@@ -89,7 +92,8 @@ class NewsletterSaveController {
|
|||||||
Security $security,
|
Security $security,
|
||||||
WPFunctions $wp,
|
WPFunctions $wp,
|
||||||
ApiDataSanitizer $dataSanitizer,
|
ApiDataSanitizer $dataSanitizer,
|
||||||
Scheduler $scheduler
|
Scheduler $scheduler,
|
||||||
|
NewsletterCoupon $newsletterCoupon
|
||||||
) {
|
) {
|
||||||
$this->authorizedEmailsController = $authorizedEmailsController;
|
$this->authorizedEmailsController = $authorizedEmailsController;
|
||||||
$this->emoji = $emoji;
|
$this->emoji = $emoji;
|
||||||
@@ -106,6 +110,7 @@ class NewsletterSaveController {
|
|||||||
$this->wp = $wp;
|
$this->wp = $wp;
|
||||||
$this->dataSanitizer = $dataSanitizer;
|
$this->dataSanitizer = $dataSanitizer;
|
||||||
$this->scheduler = $scheduler;
|
$this->scheduler = $scheduler;
|
||||||
|
$this->newsletterCoupon = $newsletterCoupon;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function save(array $data = []): NewsletterEntity {
|
public function save(array $data = []): NewsletterEntity {
|
||||||
@@ -182,6 +187,7 @@ class NewsletterSaveController {
|
|||||||
// reset sent at date
|
// reset sent at date
|
||||||
$duplicate->setSentAt(null);
|
$duplicate->setSentAt(null);
|
||||||
|
|
||||||
|
$duplicate = $this->newsletterCoupon->cleanupSensitiveData($duplicate);
|
||||||
$this->newslettersRepository->persist($duplicate);
|
$this->newslettersRepository->persist($duplicate);
|
||||||
$this->newslettersRepository->flush();
|
$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