Files
piratepoet/mailpoet/lib/Subscription/Captcha/CaptchaSession.php
David Remer 4832771185 Refactor the captcha system
The current Captcha class has a lot of responsibilities. It renders the captcha
image, can check if a certain captcha type is a Google captcha, if a captcha is
required for a certain email. The SubscriberSubscribeController is not only in
charge of "controlling" the subscription process but also validates, whether a
captcha is correct or not. This architecture made it difficult to extend the
functionality and introduce the audio captcha feature.

Therefore this commit refactors the captcha architecture and tries to seperate
the different concerns into several classes and objects. Validation is now done
by validators.

The CaptchaPhrase now is in charge of keeping the captcha phrase consistent
between the image and the new audio, so that you can renew the captcha and both
captchas are in sync.

[MAILPOET-4514]
2022-11-24 09:20:39 +01:00

60 lines
1.4 KiB
PHP

<?php
namespace MailPoet\Subscription\Captcha;
use MailPoet\Util\Security;
use MailPoet\WP\Functions as WPFunctions;
class CaptchaSession {
const EXPIRATION = 1800; // 30 minutes
const ID_LENGTH = 32;
const SESSION_HASH_KEY = 'hash';
const SESSION_FORM_KEY = 'form';
/** @var WPFunctions */
private $wp;
/** @var ?string */
private $id = null;
public function __construct(
WPFunctions $wp
) {
$this->wp = $wp;
}
public function init($id = null) {
$this->id = $id ?: Security::generateRandomString(self::ID_LENGTH);
}
public function getId(): ?string {
return $this->id;
}
public function reset() {
$this->wp->deleteTransient($this->getKey(self::SESSION_FORM_KEY));
$this->wp->deleteTransient($this->getKey(self::SESSION_HASH_KEY));
}
public function setFormData(array $data) {
$this->wp->setTransient($this->getKey(self::SESSION_FORM_KEY), $data, self::EXPIRATION);
}
public function getFormData() {
return $this->wp->getTransient($this->getKey(self::SESSION_FORM_KEY));
}
public function setCaptchaHash($hash) {
$this->wp->setTransient($this->getKey(self::SESSION_HASH_KEY), $hash, self::EXPIRATION);
}
public function getCaptchaHash() {
return $this->wp->getTransient($this->getKey(self::SESSION_HASH_KEY));
}
private function getKey($type) {
return \implode('_', ['MAILPOET', $this->getId(), $type]);
}
}