diff --git a/lib/Router/Endpoints/Subscription.php b/lib/Router/Endpoints/Subscription.php index 452c27b36f..e9df13a095 100644 --- a/lib/Router/Endpoints/Subscription.php +++ b/lib/Router/Endpoints/Subscription.php @@ -32,9 +32,13 @@ class Subscription { /** @var WPFunctions */ private $wp; - public function __construct(UserSubscription\Pages $subscriptionPages, WPFunctions $wp) { + /** @var UserSubscription\Captcha */ + private $captcha; + + public function __construct(UserSubscription\Pages $subscriptionPages, WPFunctions $wp, UserSubscription\Captcha $captcha) { $this->subscriptionPages = $subscriptionPages; $this->wp = $wp; + $this->captcha = $captcha; } public function captcha($data) { @@ -42,11 +46,10 @@ class Subscription { } public function captchaImage($data) { - $captcha = new UserSubscription\Captcha; $width = !empty($data['width']) ? (int)$data['width'] : null; $height = !empty($data['height']) ? (int)$data['height'] : null; $sessionId = !empty($data['captcha_session_id']) ? $data['captcha_session_id'] : null; - return $captcha->renderImage($width, $height, $sessionId); + return $this->captcha->renderImage($width, $height, $sessionId); } public function confirm($data) { diff --git a/lib/Subscription/Captcha.php b/lib/Subscription/Captcha.php index d632c54420..cd7b2c59ab 100644 --- a/lib/Subscription/Captcha.php +++ b/lib/Subscription/Captcha.php @@ -3,7 +3,7 @@ namespace MailPoet\Subscription; use MailPoet\Models\Subscriber; -use MailPoet\Models\SubscriberIP; +use MailPoet\Subscribers\SubscriberIPsRepository; use MailPoet\Util\Helpers; use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Gregwar\Captcha\CaptchaBuilder; @@ -19,7 +19,14 @@ class Captcha { /** @var CaptchaSession */ private $captchaSession; - public function __construct(WPFunctions $wp = null, CaptchaSession $captchaSession = null) { + /** @var SubscriberIPsRepository */ + private $subscriberIPsRepository; + + public function __construct( + SubscriberIPsRepository $subscriberIPsRepository, + WPFunctions $wp = null, + CaptchaSession $captchaSession = null + ) { if ($wp === null) { $wp = new WPFunctions; } @@ -28,6 +35,7 @@ class Captcha { } $this->wp = $wp; $this->captchaSession = $captchaSession; + $this->subscriberIPsRepository = $subscriberIPsRepository; } public function isSupported() { @@ -59,11 +67,10 @@ class Captcha { return false; } - $subscriptionCount = SubscriberIP::where('ip', $subscriberIp) - ->whereRaw( - '(`created_at` >= NOW() - INTERVAL ? SECOND)', - [(int)$subscriptionCaptchaWindow] - )->count(); + $subscriptionCount = $this->subscriberIPsRepository->getCountByIPAndCreatedAtAfterTimeInSeconds( + $subscriberIp, + (int)$subscriptionCaptchaWindow + ); if ($subscriptionCount > 0) { return true; diff --git a/tests/integration/API/JSON/v1/SetupTest.php b/tests/integration/API/JSON/v1/SetupTest.php index 56ab7a0f64..b6eec08595 100644 --- a/tests/integration/API/JSON/v1/SetupTest.php +++ b/tests/integration/API/JSON/v1/SetupTest.php @@ -30,10 +30,11 @@ class SetupTest extends \MailPoetTest { $settings = SettingsController::getInstance(); $referralDetector = new ReferralDetector($wpStub, $settings); + $subscriptionCaptcha = $this->diContainer->get(Captcha::class); $populator = new Populator( $settings, $wpStub, - new Captcha(), + $subscriptionCaptcha, $referralDetector, $this->diContainer->get(FormsRepository::class), $this->entityManager, @@ -48,7 +49,6 @@ class SetupTest extends \MailPoetTest { expect($signupConfirmation)->true(); $captcha = $settings->fetch('captcha'); - $subscriptionCaptcha = new Captcha; $captchaType = $subscriptionCaptcha->isSupported() ? Captcha::TYPE_BUILTIN : Captcha::TYPE_DISABLED; expect($captcha['type'])->equals($captchaType); expect($captcha['recaptcha_site_token'])->equals(''); diff --git a/tests/integration/API/JSON/v1/SubscribersTest.php b/tests/integration/API/JSON/v1/SubscribersTest.php index 86d1d9b0ea..fc7097921f 100644 --- a/tests/integration/API/JSON/v1/SubscribersTest.php +++ b/tests/integration/API/JSON/v1/SubscribersTest.php @@ -18,6 +18,7 @@ use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SubscriberCustomFieldEntity; use MailPoet\Entities\SubscriberEntity; +use MailPoet\Entities\SubscriberIPEntity; use MailPoet\Entities\SubscriberSegmentEntity; use MailPoet\Form\Util\FieldNameObfuscator; use MailPoet\Listing\Handler; @@ -29,7 +30,6 @@ use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\Segment; use MailPoet\Models\SendingQueue; use MailPoet\Models\Subscriber; -use MailPoet\Models\SubscriberIP; use MailPoet\Models\SubscriberSegment; use MailPoet\Segments\SegmentsRepository; use MailPoet\Settings\SettingsController; @@ -46,7 +46,6 @@ use MailPoet\Test\DataFactories\DynamicSegment; use MailPoet\UnexpectedValueException; use MailPoet\WP\Functions; use MailPoetVendor\Carbon\Carbon; -use MailPoetVendor\Idiorm\ORM; class SubscribersTest extends \MailPoetTest { @@ -938,6 +937,6 @@ class SubscribersTest extends \MailPoetTest { $this->truncateEntity(CustomFieldEntity::class); $this->truncateEntity(SubscriberCustomFieldEntity::class); $this->diContainer->get(SettingsRepository::class)->truncate(); - ORM::raw_execute('TRUNCATE ' . SubscriberIP::$_table); + $this->truncateEntity(SubscriberIPEntity::class); } } diff --git a/tests/integration/Router/Endpoints/SubscriptionTest.php b/tests/integration/Router/Endpoints/SubscriptionTest.php index db69597227..91288ba0b5 100644 --- a/tests/integration/Router/Endpoints/SubscriptionTest.php +++ b/tests/integration/Router/Endpoints/SubscriptionTest.php @@ -5,6 +5,7 @@ namespace MailPoet\Test\Router\Endpoints; use Codeception\Stub; use Codeception\Stub\Expected; use MailPoet\Router\Endpoints\Subscription; +use MailPoet\Subscription\Captcha; use MailPoet\Subscription\Pages; use MailPoet\WP\Functions as WPFunctions; @@ -14,9 +15,13 @@ class SubscriptionTest extends \MailPoetTest { /** @var WPFunctions */ private $wp; + /** @var Captcha */ + private $captcha; + public function _before() { $this->data = []; $this->wp = WPFunctions::get(); + $this->captcha = $this->diContainer->get(Captcha::class); } public function testItDisplaysConfirmPage() { @@ -24,7 +29,7 @@ class SubscriptionTest extends \MailPoetTest { 'wp' => $this->wp, 'confirm' => Expected::exactly(1), ], $this); - $subscription = new Subscription($pages, $this->wp); + $subscription = new Subscription($pages, $this->wp, $this->captcha); $subscription->confirm($this->data); } @@ -34,7 +39,7 @@ class SubscriptionTest extends \MailPoetTest { 'getManageLink' => Expected::exactly(1), 'getManageContent' => Expected::exactly(1), ], $this); - $subscription = new Subscription($pages, $this->wp); + $subscription = new Subscription($pages, $this->wp, $this->captcha); $subscription->manage($this->data); do_shortcode('[mailpoet_manage]'); do_shortcode('[mailpoet_manage_subscription]'); @@ -45,7 +50,7 @@ class SubscriptionTest extends \MailPoetTest { 'wp' => new WPFunctions, 'unsubscribe' => Expected::exactly(1), ], $this); - $subscription = new Subscription($pages, $this->wp); + $subscription = new Subscription($pages, $this->wp, $this->captcha); $subscription->unsubscribe($this->data); } } diff --git a/tests/integration/Subscription/CaptchaTest.php b/tests/integration/Subscription/CaptchaTest.php index 3b4a684aff..382dd084e0 100644 --- a/tests/integration/Subscription/CaptchaTest.php +++ b/tests/integration/Subscription/CaptchaTest.php @@ -3,8 +3,9 @@ namespace MailPoet\Test\Subscription; use Codeception\Util\Fixtures; +use MailPoet\Entities\SubscriberIPEntity; use MailPoet\Models\Subscriber; -use MailPoet\Models\SubscriberIP; +use MailPoet\Subscribers\SubscriberIPsRepository; use MailPoet\Subscription\Captcha; use MailPoet\Subscription\CaptchaSession; use MailPoet\Util\Cookies; @@ -24,9 +25,10 @@ class CaptchaTest extends \MailPoetTest { public function _before() { $cookiesMock = $this->createMock(Cookies::class); $cookiesMock->method('get')->willReturn('abcd'); + $subscriberIPsRepository = $this->diContainer->get(SubscriberIPsRepository::class); $this->captchaSession = new CaptchaSession(new Functions()); $this->captchaSession->init(self::CAPTCHA_SESSION_ID); - $this->captcha = new Captcha(new WPFunctions, $this->captchaSession); + $this->captcha = new Captcha($subscriberIPsRepository, new WPFunctions, $this->captchaSession); $_SERVER['REMOTE_ADDR'] = '127.0.0.1'; $this->captchaSession->reset(); } @@ -47,10 +49,10 @@ class CaptchaTest extends \MailPoetTest { } public function testItRequiresCaptchaForRepeatedIPAddress() { - $ip = SubscriberIP::create(); - $ip->ip = '127.0.0.1'; - $ip->createdAt = Carbon::now()->subMinutes(1); - $ip->save(); + $ip = new SubscriberIPEntity('127.0.0.1'); + $ip->setCreatedAt(Carbon::now()->subMinutes(1)); + $this->entityManager->persist($ip); + $this->entityManager->flush(); $email = 'non-existent-subscriber@example.com'; $result = $this->captcha->isRequired($email); expect($result)->equals(true); @@ -64,6 +66,6 @@ class CaptchaTest extends \MailPoetTest { } public function _after() { - SubscriberIP::deleteMany(); + $this->truncateEntity(SubscriberIPEntity::class); } }