Inject WPFunctions to FieldNameObfuscator using DI

[MAILPOET-2665]
This commit is contained in:
Rostislav Wolny
2020-01-30 11:54:52 +01:00
committed by Jack Kitterhing
parent 7d596e3407
commit d0acad5c3b
5 changed files with 36 additions and 26 deletions

View File

@@ -68,6 +68,9 @@ class Subscribers extends APIEndpoint {
/** @var SubscriptionUrlFactory */ /** @var SubscriptionUrlFactory */
private $subscriptionUrlFactory; private $subscriptionUrlFactory;
/** @var FieldNameObfuscator */
private $fieldNameObfuscator;
public function __construct( public function __construct(
Listing\BulkActionController $bulkActionController, Listing\BulkActionController $bulkActionController,
SubscribersListings $subscribersListings, SubscribersListings $subscribersListings,
@@ -79,7 +82,8 @@ class Subscribers extends APIEndpoint {
SettingsController $settings, SettingsController $settings,
CaptchaSession $captchaSession, CaptchaSession $captchaSession,
ConfirmationEmailMailer $confirmationEmailMailer, ConfirmationEmailMailer $confirmationEmailMailer,
SubscriptionUrlFactory $subscriptionUrlFactory SubscriptionUrlFactory $subscriptionUrlFactory,
FieldNameObfuscator $fieldNameObfuscator
) { ) {
$this->bulkActionController = $bulkActionController; $this->bulkActionController = $bulkActionController;
$this->subscribersListings = $subscribersListings; $this->subscribersListings = $subscribersListings;
@@ -92,6 +96,7 @@ class Subscribers extends APIEndpoint {
$this->captchaSession = $captchaSession; $this->captchaSession = $captchaSession;
$this->confirmationEmailMailer = $confirmationEmailMailer; $this->confirmationEmailMailer = $confirmationEmailMailer;
$this->subscriptionUrlFactory = $subscriptionUrlFactory; $this->subscriptionUrlFactory = $subscriptionUrlFactory;
$this->fieldNameObfuscator = $fieldNameObfuscator;
} }
public function get($data = []) { public function get($data = []) {
@@ -271,8 +276,7 @@ class Subscribers extends APIEndpoint {
} }
private function deobfuscateFormPayload($data) { private function deobfuscateFormPayload($data) {
$obfuscator = new FieldNameObfuscator(); return $this->fieldNameObfuscator->deobfuscateFormPayload($data);
return $obfuscator->deobfuscateFormPayload($data);
} }
private function validateCaptcha($captchaSettings, $data) { private function validateCaptcha($captchaSettings, $data) {

View File

@@ -9,9 +9,16 @@ class FieldNameObfuscator {
const OBFUSCATED_FIELD_PREFIX = 'form_field_'; const OBFUSCATED_FIELD_PREFIX = 'form_field_';
const HASH_LENGTH = 12; const HASH_LENGTH = 12;
/** @var WPFunctions */
private $wp;
public function __construct(WPFunctions $wp) {
$this->wp = $wp;
}
public function obfuscate($name) { public function obfuscate($name) {
$authKey = defined('AUTH_KEY') ? AUTH_KEY : ''; $authKey = defined('AUTH_KEY') ? AUTH_KEY : '';
$hash = substr(md5($authKey . WPFunctions::get()->homeUrl() . $name), 0, self::HASH_LENGTH); $hash = substr(md5($authKey . $this->wp->homeUrl() . $name), 0, self::HASH_LENGTH);
return self::OBFUSCATED_FIELD_PREFIX . base64_encode($hash . '_' . $name); return self::OBFUSCATED_FIELD_PREFIX . base64_encode($hash . '_' . $name);
} }

View File

@@ -60,6 +60,7 @@ class SubscribersTest extends \MailPoetTest {
$settings = $container->get(SettingsController::class); $settings = $container->get(SettingsController::class);
$wp = $container->get(Functions::class); $wp = $container->get(Functions::class);
$this->captchaSession = new CaptchaSession($container->get(Functions::class)); $this->captchaSession = new CaptchaSession($container->get(Functions::class));
$obfuscator = new FieldNameObfuscator($wp);
$this->endpoint = new Subscribers( $this->endpoint = new Subscribers(
$container->get(BulkActionController::class), $container->get(BulkActionController::class),
$container->get(SubscribersListings::class), $container->get(SubscribersListings::class),
@@ -71,9 +72,9 @@ class SubscribersTest extends \MailPoetTest {
$settings, $settings,
$this->captchaSession, $this->captchaSession,
$container->get(ConfirmationEmailMailer::class), $container->get(ConfirmationEmailMailer::class),
new SubscriptionUrlFactory($wp, $settings, new LinkTokens) new SubscriptionUrlFactory($wp, $settings, new LinkTokens),
$obfuscator
); );
$obfuscator = new FieldNameObfuscator();
$this->obfuscatedEmail = $obfuscator->obfuscate('email'); $this->obfuscatedEmail = $obfuscator->obfuscate('email');
$this->obfuscatedSegments = $obfuscator->obfuscate('segments'); $this->obfuscatedSegments = $obfuscator->obfuscate('segments');
$this->segment1 = Segment::createOrUpdate(['name' => 'Segment 1']); $this->segment1 = Segment::createOrUpdate(['name' => 'Segment 1']);

View File

@@ -16,6 +16,7 @@ use MailPoet\Settings\SettingsRepository;
use MailPoet\Subscription\Form; use MailPoet\Subscription\Form;
use MailPoet\Util\Security; use MailPoet\Util\Security;
use MailPoet\Util\Url as UrlHelper; use MailPoet\Util\Url as UrlHelper;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Idiorm\ORM; use MailPoetVendor\Idiorm\ORM;
class FormTest extends \MailPoetTest { class FormTest extends \MailPoetTest {
@@ -55,7 +56,7 @@ class FormTest extends \MailPoetTest {
], ],
] ]
); );
$obfuscator = new FieldNameObfuscator(); $obfuscator = new FieldNameObfuscator(WPFunctions::get());
$obfuscatedEmail = $obfuscator->obfuscate('email'); $obfuscatedEmail = $obfuscator->obfuscate('email');
$this->requestData = [ $this->requestData = [
'action' => 'mailpoet_subscription_form', 'action' => 'mailpoet_subscription_form',

View File

@@ -2,46 +2,43 @@
namespace MailPoet\Form\Util; namespace MailPoet\Form\Util;
use Codeception\Stub;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
use PHPUnit\Framework\MockObject\MockObject;
class FieldNameObfuscatorTest extends \MailPoetUnitTest { class FieldNameObfuscatorTest extends \MailPoetUnitTest {
/** @var MockObject | WPFunctions */
private $wpMock;
/** @var FieldNameObfuscator */
private $obfuscator;
public function _before() { public function _before() {
parent::_before(); parent::_before();
WPFunctions::set( $this->wpMock = $this->createMock(WPFunctions::class);
Stub::make(WPFunctions::class, [ $this->wpMock->method('homeUrl')->willReturn('http://example.com');
'homeUrl' => 'http://example.com', $this->obfuscator = new FieldNameObfuscator($this->wpMock);
])
);
} }
public function testObfuscateWorks() { public function testObfuscateWorks() {
$obfuscator = new FieldNameObfuscator(); expect($this->obfuscator->obfuscate('email'))->notContains('email');
expect($obfuscator->obfuscate('email'))->notContains('email');
} }
public function testObfuscateDeobfuscateWorks() { public function testObfuscateDeobfuscateWorks() {
$obfuscator = new FieldNameObfuscator(); $obfuscated = $this->obfuscator->obfuscate('email');
$obfuscated = $obfuscator->obfuscate('email'); expect($this->obfuscator->deobfuscate($obfuscated))->equals('email');
expect($obfuscator->deobfuscate($obfuscated))->equals('email');
} }
public function testObfuscatePayloadWorks() { public function testObfuscatePayloadWorks() {
$obfuscator = new FieldNameObfuscator(); $obfuscated = $this->obfuscator->obfuscate('email');
$obfuscated = $obfuscator->obfuscate('email');
$data = [ $data = [
'regularField' => 'regularValue', 'regularField' => 'regularValue',
$obfuscated => 'obfuscatedFieldValue', $obfuscated => 'obfuscatedFieldValue',
]; ];
$deobfuscatedPayload = $obfuscator->deobfuscateFormPayload($data); $deobfuscatedPayload = $this->obfuscator->deobfuscateFormPayload($data);
expect($deobfuscatedPayload)->equals([ expect($deobfuscatedPayload)->equals([
'regularField' => 'regularValue', 'regularField' => 'regularValue',
'email' => 'obfuscatedFieldValue', 'email' => 'obfuscatedFieldValue',
]); ]);
} }
public function _after() {
parent::_after();
WPFunctions::set(new WPFunctions());
}
} }