mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/ConfirmEdit
synced 2024-09-24 10:49:46 +00:00
31c59374a4
Also update MathCaptcha so that it works with recent versions of Math (and breaks with old ones). Also fix MathCaptcha API output, which used to send the question in plaintext. Bug: T110302 Change-Id: I0da671a546700110d789b79a3089460abd9cce3b Depends-On: I8b52ec8ddf494f23941807638f149f15b5e46b0c
141 lines
3 KiB
PHP
Executable file
141 lines
3 KiB
PHP
Executable file
<?php
|
|
|
|
use MediaWiki\Session\SessionManager;
|
|
|
|
abstract class CaptchaStore {
|
|
/**
|
|
* Store the correct answer for a given captcha
|
|
* @param $index String
|
|
* @param $info String the captcha result
|
|
*/
|
|
abstract public function store( $index, $info );
|
|
|
|
/**
|
|
* Retrieve the answer for a given captcha
|
|
* @param $index String
|
|
* @return String|false
|
|
*/
|
|
abstract public function retrieve( $index );
|
|
|
|
/**
|
|
* Delete a result once the captcha has been used, so it cannot be reused
|
|
* @param $index
|
|
*/
|
|
abstract public function clear( $index );
|
|
|
|
/**
|
|
* Whether this type of CaptchaStore needs cookies
|
|
* @return Bool
|
|
*/
|
|
abstract public function cookiesNeeded();
|
|
|
|
/**
|
|
* The singleton instance
|
|
* @var CaptchaStore
|
|
*/
|
|
private static $instance;
|
|
|
|
/**
|
|
* Get somewhere to store captcha data that will persist between requests
|
|
*
|
|
* @throws Exception
|
|
* @return CaptchaStore
|
|
*/
|
|
final public static function get() {
|
|
if ( !self::$instance instanceof self ) {
|
|
global $wgCaptchaStorageClass;
|
|
if ( in_array( 'CaptchaStore', class_parents( $wgCaptchaStorageClass ) ) ) {
|
|
self::$instance = new $wgCaptchaStorageClass;
|
|
} else {
|
|
throw new Exception( "Invalid CaptchaStore class $wgCaptchaStorageClass" );
|
|
}
|
|
}
|
|
return self::$instance;
|
|
}
|
|
|
|
/**
|
|
* Protected constructor: no creating instances except through the factory method above
|
|
*/
|
|
protected function __construct() {
|
|
}
|
|
}
|
|
|
|
class CaptchaSessionStore extends CaptchaStore {
|
|
protected function __construct() {
|
|
// Make sure the session is started
|
|
SessionManager::getGlobalSession()->persist();
|
|
}
|
|
|
|
function store( $index, $info ) {
|
|
SessionManager::getGlobalSession()->set( 'captcha' . $index, $info );
|
|
}
|
|
|
|
function retrieve( $index ) {
|
|
return SessionManager::getGlobalSession()->get( 'captcha' . $index, false );
|
|
}
|
|
|
|
function clear( $index ) {
|
|
SessionManager::getGlobalSession()->remove( 'captcha' . $index );
|
|
}
|
|
|
|
function cookiesNeeded() {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
class CaptchaCacheStore extends CaptchaStore {
|
|
function store( $index, $info ) {
|
|
global $wgCaptchaSessionExpiration;
|
|
|
|
ObjectCache::getMainStashInstance()->set(
|
|
wfMemcKey( 'captcha', $index ),
|
|
$info,
|
|
$wgCaptchaSessionExpiration
|
|
);
|
|
}
|
|
|
|
function retrieve( $index ) {
|
|
$info = ObjectCache::getMainStashInstance()->get( wfMemcKey( 'captcha', $index ) );
|
|
if ( $info ) {
|
|
return $info;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function clear( $index ) {
|
|
ObjectCache::getMainStashInstance()->delete( wfMemcKey( 'captcha', $index ) );
|
|
}
|
|
|
|
function cookiesNeeded() {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
class CaptchaHashStore extends CaptchaStore {
|
|
protected $data = [];
|
|
|
|
public function store( $index, $info ) {
|
|
$this->data[$index] = $info;
|
|
}
|
|
|
|
public function retrieve( $index ) {
|
|
if ( array_key_exists( $index, $this->data ) ) {
|
|
return $this->data[$index];
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public function clear( $index ) {
|
|
unset( $this->data[$index] );
|
|
}
|
|
|
|
public function cookiesNeeded() {
|
|
return false;
|
|
}
|
|
|
|
public function clearAll() {
|
|
$this->data = [];
|
|
}
|
|
}
|