]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blobdiff - extensions/ConfirmEdit/includes/CaptchaStore.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / extensions / ConfirmEdit / includes / CaptchaStore.php
diff --git a/extensions/ConfirmEdit/includes/CaptchaStore.php b/extensions/ConfirmEdit/includes/CaptchaStore.php
new file mode 100644 (file)
index 0000000..5a78e46
--- /dev/null
@@ -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 = [];
+       }
+}