Make sure one-click unsubscribe url won't redirect internally

[MAILPOET-4703]
This commit is contained in:
Sam Najian
2022-11-02 22:50:10 +01:00
committed by Aschepikov
parent 4fe8d10d6c
commit 50b613365f
3 changed files with 26 additions and 11 deletions

View File

@ -274,6 +274,7 @@ class SendingQueue {
$unsubscribeUrls = []; $unsubscribeUrls = [];
$statistics = []; $statistics = [];
$metas = []; $metas = [];
$oneClickUnsubscribeUrls = [];
$newsletterEntity = $this->newslettersRepository->findOneById($newsletter->id); $newsletterEntity = $this->newslettersRepository->findOneById($newsletter->id);
@ -301,7 +302,8 @@ class SendingQueue {
); );
$preparedSubscribersIds[] = $subscriber->id; $preparedSubscribersIds[] = $subscriber->id;
// create personalized instant unsubsribe link // create personalized instant unsubsribe link
$unsubscribeUrls[] = $this->links->getUnsubscribeUrl($queue, $subscriber->id); $unsubscribeUrls[] = $this->links->getUnsubscribeUrl($queue->id, $subscriberEntity);
$oneClickUnsubscribeUrls[] = $this->links->getOneClickUnsubscribeUrl($queue->id, $subscriberEntity);
$metas[] = $this->mailerMetaInfo->getNewsletterMetaInfo($newsletter, $subscriberEntity); $metas[] = $this->mailerMetaInfo->getNewsletterMetaInfo($newsletter, $subscriberEntity);
@ -319,12 +321,17 @@ class SendingQueue {
$preparedSubscribers[0], $preparedSubscribers[0],
$statistics[0], $statistics[0],
$timer, $timer,
['unsubscribe_url' => $unsubscribeUrls[0], 'meta' => $metas[0]] [
'unsubscribe_url' => $unsubscribeUrls[0],
'meta' => $metas[0],
'one_click_unsubscribe' => $oneClickUnsubscribeUrls,
]
); );
$preparedNewsletters = []; $preparedNewsletters = [];
$preparedSubscribers = []; $preparedSubscribers = [];
$preparedSubscribersIds = []; $preparedSubscribersIds = [];
$unsubscribeUrls = []; $unsubscribeUrls = [];
$oneClickUnsubscribeUrls = [];
$statistics = []; $statistics = [];
$metas = []; $metas = [];
} }
@ -337,7 +344,7 @@ class SendingQueue {
$preparedSubscribers, $preparedSubscribers,
$statistics, $statistics,
$timer, $timer,
['unsubscribe_url' => $unsubscribeUrls, 'meta' => $metas] ['unsubscribe_url' => $unsubscribeUrls, 'meta' => $metas, 'one_click_unsubscribe' => $oneClickUnsubscribeUrls]
); );
} }
return $queue; return $queue;

View File

@ -5,6 +5,7 @@ namespace MailPoet\Cron\Workers\SendingQueue\Tasks;
use MailPoet\Cron\Workers\StatsNotifications\NewsletterLinkRepository; use MailPoet\Cron\Workers\StatsNotifications\NewsletterLinkRepository;
use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\NewsletterLinkEntity; use MailPoet\Entities\NewsletterLinkEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Newsletter\Links\Links as NewsletterLinks; use MailPoet\Newsletter\Links\Links as NewsletterLinks;
use MailPoet\Router\Endpoints\Track; use MailPoet\Router\Endpoints\Track;
use MailPoet\Router\Router; use MailPoet\Router\Router;
@ -68,12 +69,11 @@ class Links {
return $this->newsletterLinks->save($links, $newsletter->getId(), $queue->id); return $this->newsletterLinks->save($links, $newsletter->getId(), $queue->id);
} }
public function getUnsubscribeUrl($queue, $subscriberId) { public function getUnsubscribeUrl($queueId, SubscriberEntity $subscriber = null) {
$subscriber = $this->subscribersRepository->findOneById($subscriberId);
if ($this->trackingConfig->isEmailTrackingEnabled() && $subscriber) { if ($this->trackingConfig->isEmailTrackingEnabled() && $subscriber) {
$linkHash = $this->newsletterLinkRepository->findOneBy( $linkHash = $this->newsletterLinkRepository->findOneBy(
[ [
'queue' => $queue->id, 'queue' => $queueId,
'url' => NewsletterLinkEntity::INSTANT_UNSUBSCRIBE_LINK_SHORT_CODE, 'url' => NewsletterLinkEntity::INSTANT_UNSUBSCRIBE_LINK_SHORT_CODE,
] ]
); );
@ -84,7 +84,7 @@ class Links {
$data = $this->newsletterLinks->createUrlDataObject( $data = $this->newsletterLinks->createUrlDataObject(
$subscriber->getId(), $subscriber->getId(),
$this->linkTokens->getToken($subscriber), $this->linkTokens->getToken($subscriber),
$queue->id, $queueId,
$linkHash->getHash(), $linkHash->getHash(),
false false
); );
@ -95,8 +95,13 @@ class Links {
); );
} else { } else {
$subscriptionUrlFactory = SubscriptionUrlFactory::getInstance(); $subscriptionUrlFactory = SubscriptionUrlFactory::getInstance();
$url = $subscriptionUrlFactory->getUnsubscribeUrl($subscriber, $queue->id); $url = $subscriptionUrlFactory->getUnsubscribeUrl($subscriber, $queueId);
} }
return $url; return $url;
} }
public function getOneClickUnsubscribeUrl($queueId, SubscriberEntity $subscriber): string {
$subscriptionUrlFactory = SubscriptionUrlFactory::getInstance();
return $subscriptionUrlFactory->getUnsubscribeUrl($subscriber, $queueId);
}
} }

View File

@ -111,6 +111,7 @@ class MailPoet implements MailerMethod {
$newsletter[$record], $newsletter[$record],
$this->processSubscriber($subscriber[$record]), $this->processSubscriber($subscriber[$record]),
(!empty($extraParams['unsubscribe_url'][$record])) ? $extraParams['unsubscribe_url'][$record] : false, (!empty($extraParams['unsubscribe_url'][$record])) ? $extraParams['unsubscribe_url'][$record] : false,
(!empty($extraParams['one_click_unsubscribe'][$record])) ? $extraParams['one_click_unsubscribe'][$record] : false,
(!empty($extraParams['meta'][$record])) ? $extraParams['meta'][$record] : false (!empty($extraParams['meta'][$record])) ? $extraParams['meta'][$record] : false
); );
} }
@ -119,13 +120,14 @@ class MailPoet implements MailerMethod {
$newsletter, $newsletter,
$this->processSubscriber($subscriber), $this->processSubscriber($subscriber),
(!empty($extraParams['unsubscribe_url'])) ? $extraParams['unsubscribe_url'] : false, (!empty($extraParams['unsubscribe_url'])) ? $extraParams['unsubscribe_url'] : false,
(!empty($extraParams['one_click_unsubscribe'])) ? $extraParams['one_click_unsubscribe'] : false,
(!empty($extraParams['meta'])) ? $extraParams['meta'] : false (!empty($extraParams['meta'])) ? $extraParams['meta'] : false
); );
} }
return $body; return $body;
} }
private function composeBody($newsletter, $subscriber, $unsubscribeUrl, $meta): array { private function composeBody($newsletter, $subscriber, $unsubscribeUrl, $oneClickUnsubscribeUrl, $meta): array {
$body = [ $body = [
'to' => ([ 'to' => ([
'address' => $subscriber['email'], 'address' => $subscriber['email'],
@ -150,9 +152,10 @@ class MailPoet implements MailerMethod {
$body['text'] = $newsletter['body']['text']; $body['text'] = $newsletter['body']['text'];
} }
if ($unsubscribeUrl) { if ($unsubscribeUrl) {
$oneClickIsPossible = $this->url->isUsingHttps($unsubscribeUrl);
$body['unsubscribe'] = [ $body['unsubscribe'] = [
'url' => $unsubscribeUrl, 'url' => $oneClickIsPossible ? $oneClickUnsubscribeUrl : $unsubscribeUrl,
'post' => $this->url->isUsingHttps($unsubscribeUrl), 'post' => $oneClickIsPossible,
]; ];
} }
if ($meta) { if ($meta) {