diff options
Diffstat (limited to 'www/wiki/extensions/ConfirmEdit/includes/CaptchaStore.php')
-rw-r--r-- | www/wiki/extensions/ConfirmEdit/includes/CaptchaStore.php | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/www/wiki/extensions/ConfirmEdit/includes/CaptchaStore.php b/www/wiki/extensions/ConfirmEdit/includes/CaptchaStore.php new file mode 100644 index 00000000..5a78e466 --- /dev/null +++ b/www/wiki/extensions/ConfirmEdit/includes/CaptchaStore.php @@ -0,0 +1,147 @@ +<?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; + } + + final public static function unsetInstanceForTests() { + if ( !defined( 'MW_PHPUNIT_TEST' ) ) { + throw new MWException( 'Cannot unset ' . __CLASS__ . ' instance in operation.' ); + } + self::$instance = null; + } + + /** + * 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 = []; + } +} |