Add unsubscribe token to new subscribers and newsletters

This commit is contained in:
Amine Ben hammou
2019-07-23 13:44:26 +01:00
committed by M. Shull
parent 33f442df9f
commit 1eecd65b3e
6 changed files with 22 additions and 29 deletions

View File

@ -373,6 +373,7 @@ class Newsletter extends Model {
unset($newsletter_data['id']); unset($newsletter_data['id']);
// merge data with newsletter data (allows override) // merge data with newsletter data (allows override)
$data['unsubscribe_token'] = Security::generateUnsubscribeToken(self::class);
$data = array_merge($newsletter_data, $data); $data = array_merge($newsletter_data, $data);
$duplicate = self::create(); $duplicate = self::create();
@ -446,6 +447,7 @@ class Newsletter extends Model {
'parent_id' => $this->id, 'parent_id' => $this->id,
'type' => self::TYPE_NOTIFICATION_HISTORY, 'type' => self::TYPE_NOTIFICATION_HISTORY,
'status' => self::STATUS_SENDING, 'status' => self::STATUS_SENDING,
'unsubscribe_token' => Security::generateUnsubscribeToken(self::class),
] ]
); );
@ -1013,6 +1015,7 @@ class Newsletter extends Model {
} }
static function createOrUpdate($data = []) { static function createOrUpdate($data = []) {
$data['unsubscribe_token'] = Security::generateUnsubscribeToken(self::class);
return parent::_createOrUpdate($data, false, function($data) { return parent::_createOrUpdate($data, false, function($data) {
$settings = new SettingsController(); $settings = new SettingsController();
// set default sender based on settings // set default sender based on settings

View File

@ -6,6 +6,7 @@ use MailPoet\Settings\SettingsController;
use MailPoet\Util\Helpers; use MailPoet\Util\Helpers;
use function MailPoet\Util\array_column; use function MailPoet\Util\array_column;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
use MailPoet\Util\Security;
if (!defined('ABSPATH')) exit; if (!defined('ABSPATH')) exit;
@ -781,6 +782,7 @@ class Subscriber extends Model {
$required_field_default_values = [ $required_field_default_values = [
'first_name' => '', 'first_name' => '',
'last_name' => '', 'last_name' => '',
'unsubscribe_token' => Security::generateUnsubscribeToken(self::class),
'status' => (!$settings->get('signup_confirmation.enabled')) ? self::STATUS_SUBSCRIBED : self::STATUS_UNCONFIRMED, 'status' => (!$settings->get('signup_confirmation.enabled')) ? self::STATUS_SUBSCRIBED : self::STATUS_UNCONFIRMED,
]; ];
foreach ($required_field_default_values as $field => $value) { foreach ($required_field_default_values as $field => $value) {

View File

@ -176,6 +176,7 @@ class NewslettersTest extends \MailPoetTest {
expect($response->data)->equals($saved_newsletter->asArray()); expect($response->data)->equals($saved_newsletter->asArray());
// newsletter option should be saved // newsletter option should be saved
expect($saved_newsletter->some_option)->equals('some_option_value'); expect($saved_newsletter->some_option)->equals('some_option_value');
expect(strlen($saved_newsletter->unsubscribe_token))->equals(15);
$hook_name = 'mailpoet_api_newsletters_save_before'; $hook_name = 'mailpoet_api_newsletters_save_before';
expect(WPHooksHelper::isFilterApplied($hook_name))->true(); expect(WPHooksHelper::isFilterApplied($hook_name))->true();

View File

@ -472,6 +472,7 @@ class APITest extends \MailPoetTest {
expect($result['email'])->equals($subscriber['email']); expect($result['email'])->equals($subscriber['email']);
expect($result['cf_' . $custom_field->id])->equals('test'); expect($result['cf_' . $custom_field->id])->equals('test');
expect($result['source'])->equals('api'); expect($result['source'])->equals('api');
expect(strlen($result['unsubscribe_token']))->equals(15);
} }
function testItChecksForMandatoryCustomFields() { function testItChecksForMandatoryCustomFields() {

View File

@ -820,45 +820,31 @@ class SubscriberTest extends \MailPoetTest {
function testItSetsDefaultValuesForRequiredFields() { function testItSetsDefaultValuesForRequiredFields() {
// MySQL running in strict mode requires a value to be set for certain fields // MySQL running in strict mode requires a value to be set for certain fields
expect(Subscriber::setRequiredFieldsDefaultValues([]))->equals( $values = Subscriber::setRequiredFieldsDefaultValues([]);
[ expect($values['first_name'])->equals('');
'first_name' => '', expect($values['last_name'])->equals('');
'last_name' => '', expect($values['status'])->equals(Subscriber::STATUS_UNCONFIRMED);
'status' => Subscriber::STATUS_UNCONFIRMED, expect(strlen($values['unsubscribe_token']))->equals(15);
]
);
} }
function testItSetsDefaultStatusDependingOnSingupConfirmationOption() { function testItSetsDefaultStatusDependingOnSingupConfirmationOption() {
// when signup confirmation is disabled, status should be 'subscribed' // when signup confirmation is disabled, status should be 'subscribed'
$this->settings->set('signup_confirmation.enabled', false); $this->settings->set('signup_confirmation.enabled', false);
expect(Subscriber::setRequiredFieldsDefaultValues([]))->equals( $values = Subscriber::setRequiredFieldsDefaultValues([]);
[ expect($values['first_name'])->equals('');
'first_name' => '', expect($values['last_name'])->equals('');
'last_name' => '', expect($values['status'])->equals(Subscriber::STATUS_SUBSCRIBED);
'status' => Subscriber::STATUS_SUBSCRIBED, expect(strlen($values['unsubscribe_token']))->equals(15);
]
);
$this->settings->set('signup_confirmation.enabled', true); $this->settings->set('signup_confirmation.enabled', true);
// when signup confirmation is enabled, status should be 'unconfirmed' // when signup confirmation is enabled, status should be 'unconfirmed'
expect(Subscriber::setRequiredFieldsDefaultValues([]))->equals( $values = Subscriber::setRequiredFieldsDefaultValues([]);
[ expect($values['status'])->equals(Subscriber::STATUS_UNCONFIRMED);
'first_name' => '',
'last_name' => '',
'status' => Subscriber::STATUS_UNCONFIRMED,
]
);
// when status is specified, it should not change regardless of signup confirmation option // when status is specified, it should not change regardless of signup confirmation option
$this->settings->set('signup_confirmation.enabled', true); $this->settings->set('signup_confirmation.enabled', true);
expect(Subscriber::setRequiredFieldsDefaultValues(['status' => Subscriber::STATUS_SUBSCRIBED]))->equals( $values = Subscriber::setRequiredFieldsDefaultValues(['status' => Subscriber::STATUS_SUBSCRIBED]);
[ expect($values['status'])->equals(Subscriber::STATUS_SUBSCRIBED);
'first_name' => '',
'last_name' => '',
'status' => Subscriber::STATUS_SUBSCRIBED,
]
);
} }
function testItSetsDefaultValuesForNewSubscribers() { function testItSetsDefaultValuesForNewSubscribers() {

View File

@ -125,7 +125,7 @@ class ExportTest extends \MailPoetTest {
expect( expect(
preg_match( preg_match(
'|' . '|' .
preg_quote(Env::$temp_path, '|') . '/MailPoet_export_[a-f0-9]{15}.' . preg_quote(Env::$temp_path, '|') . '/MailPoet_export_[a-z0-9]{15}.' .
$this->export->export_format_option . $this->export->export_format_option .
'|', $this->export->export_file) '|', $this->export->export_file)
)->equals(1); )->equals(1);