X-Git-Url: https://git.toastfreeware.priv.at/toast/cookiecaptcha.git/blobdiff_plain/e70965603fb02fc723a079e99bfffed4759e70e8..65700661799c399fc17f4e236178d465076d36f9:/ConfirmEdit_body.php diff --git a/ConfirmEdit_body.php b/ConfirmEdit_body.php index 57655c6..8c0d780 100644 --- a/ConfirmEdit_body.php +++ b/ConfirmEdit_body.php @@ -15,15 +15,15 @@ class ConfirmEditHooks { return $wgCaptcha; } - static function confirmEdit( &$editPage, $newtext, $section ) { + static function confirmEdit( $editPage, $newtext, $section ) { return self::getInstance()->confirmEdit( $editPage, $newtext, $section ); } - static function confirmEditMerged( &$editPage, $newtext ) { + static function confirmEditMerged( $editPage, $newtext ) { return self::getInstance()->confirmEditMerged( $editPage, $newtext ); } - - static function confirmEditAPI( &$editPage, $newtext, &$resultArr ) { + + static function confirmEditAPI( $editPage, $newtext, &$resultArr ) { return self::getInstance()->confirmEditAPI( $editPage, $newtext, $resultArr ); } @@ -54,7 +54,7 @@ class CaptchaSpecialPage extends UnlistedSpecialPage { $instance = ConfirmEditHooks::getInstance(); switch( $par ) { case "image": - if( method_exists($instance,'showImage') ) + if ( method_exists( $instance, 'showImage' ) ) return $instance->showImage(); case "help": default: @@ -63,24 +63,23 @@ class CaptchaSpecialPage extends UnlistedSpecialPage { } } - class SimpleCaptcha { function SimpleCaptcha() { global $wgCaptchaStorageClass; $this->storage = new $wgCaptchaStorageClass; } - + function getCaptcha() { - $a = mt_rand(0, 100); - $b = mt_rand(0, 10); - $op = mt_rand(0, 1) ? '+' : '-'; + $a = mt_rand( 0, 100 ); + $b = mt_rand( 0, 10 ); + $op = mt_rand( 0, 1 ) ? '+' : '-'; $test = "$a $op $b"; - $answer = ($op == '+') ? ($a + $b) : ($a - $b); - return array('question' => $test, 'answer' => $answer); + $answer = ( $op == '+' ) ? ( $a + $b ) : ( $a - $b ); + return array( 'question' => $test, 'answer' => $answer ); } - - function addCaptchaAPI(&$resultArr) { + + function addCaptchaAPI( &$resultArr ) { $captcha = $this->getCaptcha(); $index = $this->storeCaptcha( $captcha ); $resultArr['captcha']['type'] = 'simple'; @@ -88,7 +87,7 @@ class SimpleCaptcha { $resultArr['captcha']['id'] = $index; $resultArr['captcha']['question'] = $captcha['question']; } - + /** * Insert a captcha prompt into the edit form. * This sample implementation generates a simple arithmetic operation; @@ -147,8 +146,8 @@ class SimpleCaptcha { */ function injectUserCreate( &$template ) { global $wgCaptchaTriggers, $wgOut, $wgUser; - if( $wgCaptchaTriggers['createaccount'] ) { - if( $wgUser->isAllowed( 'skipcaptcha' ) ) { + if ( $wgCaptchaTriggers['createaccount'] ) { + if ( $wgUser->isAllowed( 'skipcaptcha' ) ) { wfDebug( "ConfirmEdit: user group allows skipping captcha on account creation\n" ); return true; } @@ -169,7 +168,7 @@ class SimpleCaptcha { * @return bool true to keep running callbacks */ function injectUserLogin( &$template ) { - if( $this->isBadLoginTriggered() ) { + if ( $this->isBadLoginTriggered() ) { global $wgOut; $template->set( 'header', "
" . @@ -179,7 +178,7 @@ class SimpleCaptcha { } return true; } - + /** * When a bad login attempt is made, increment an expiring counter * in the memcache cloud. Later checks for this may trigger a @@ -191,17 +190,17 @@ class SimpleCaptcha { */ function triggerUserLogin( $user, $password, $retval ) { global $wgCaptchaTriggers, $wgCaptchaBadLoginExpiration, $wgMemc; - if( $retval == LoginForm::WRONG_PASS && $wgCaptchaTriggers['badlogin'] ) { + if ( $retval == LoginForm::WRONG_PASS && $wgCaptchaTriggers['badlogin'] ) { $key = $this->badLoginKey(); $count = $wgMemc->get( $key ); - if( !$count ) { + if ( !$count ) { $wgMemc->add( $key, 0, $wgCaptchaBadLoginExpiration ); } $count = $wgMemc->incr( $key ); } return true; } - + /** * Check if a bad login has already been registered for this * IP address. If so, require a captcha. @@ -212,13 +211,13 @@ class SimpleCaptcha { global $wgMemc, $wgCaptchaBadLoginAttempts; return intval( $wgMemc->get( $this->badLoginKey() ) ) >= $wgCaptchaBadLoginAttempts; } - + /** * Check if the IP is allowed to skip captchas */ function isIPWhitelisted() { global $wgCaptchaWhitelistIP; - if( !empty( $wgCaptchaWhitelistIP ) ) { + if ( $wgCaptchaWhitelistIP ) { $ip = wfGetIp(); foreach ( $wgCaptchaWhitelistIP as $range ) { if ( IP::isInRange( $ip, $range ) ) { @@ -228,7 +227,7 @@ class SimpleCaptcha { } return false; } - + /** * Internal cache key for badlogin checks. * @return string @@ -237,7 +236,7 @@ class SimpleCaptcha { function badLoginKey() { return wfMemcKey( 'captcha', 'badlogin', 'ip', wfGetIP() ); } - + /** * Check if the submitted form matches the captcha session data provided * by the plugin when the form was generated. @@ -259,16 +258,15 @@ class SimpleCaptcha { * @param string $action (edit/create/addurl...) * @return bool true if action triggers captcha on editPage's namespace */ - function captchaTriggers( &$editPage, $action) { - global $wgCaptchaTriggers, $wgCaptchaTriggersOnNamespace; - //Special config for this NS? - if (isset( $wgCaptchaTriggersOnNamespace[$editPage->mTitle->getNamespace()][$action] ) ) + function captchaTriggers( &$editPage, $action ) { + global $wgCaptchaTriggers, $wgCaptchaTriggersOnNamespace; + // Special config for this NS? + if ( isset( $wgCaptchaTriggersOnNamespace[$editPage->mTitle->getNamespace()][$action] ) ) return $wgCaptchaTriggersOnNamespace[$editPage->mTitle->getNamespace()][$action]; - return ( !empty( $wgCaptchaTriggers[$action] ) ); //Default + return ( !empty( $wgCaptchaTriggers[$action] ) ); // Default } - /** * @param EditPage $editPage * @param string $newtext @@ -280,22 +278,22 @@ class SimpleCaptcha { $title = $editPage->mArticle->getTitle(); global $wgUser; - if( $wgUser->isAllowed( 'skipcaptcha' ) ) { + if ( $wgUser->isAllowed( 'skipcaptcha' ) ) { wfDebug( "ConfirmEdit: user group allows skipping captcha\n" ); return false; } - if( $this->isIPWhitelisted() ) + if ( $this->isIPWhitelisted() ) return false; global $wgEmailAuthentication, $ceAllowConfirmedEmail; - if( $wgEmailAuthentication && $ceAllowConfirmedEmail && + if ( $wgEmailAuthentication && $ceAllowConfirmedEmail && $wgUser->isEmailConfirmed() ) { wfDebug( "ConfirmEdit: user has confirmed mail, skipping captcha\n" ); return false; } - if( $this->captchaTriggers( $editPage, 'edit' ) ) { + if ( $this->captchaTriggers( $editPage, 'edit' ) ) { // Check on all edits global $wgUser; $this->trigger = sprintf( "edit trigger by '%s' at [[%s]]", @@ -306,8 +304,8 @@ class SimpleCaptcha { return true; } - if( $this->captchaTriggers( $editPage, 'create' ) && !$editPage->mTitle->exists() ) { - //Check if creating a page + if ( $this->captchaTriggers( $editPage, 'create' ) && !$editPage->mTitle->exists() ) { + // Check if creating a page global $wgUser; $this->trigger = sprintf( "Create trigger by '%s' at [[%s]]", $wgUser->getName(), @@ -317,7 +315,7 @@ class SimpleCaptcha { return true; } - if( $this->captchaTriggers( $editPage, 'addurl' ) ) { + if ( $this->captchaTriggers( $editPage, 'addurl' ) ) { // Only check edits that add URLs if ( $merged ) { // Get links from the database @@ -336,7 +334,7 @@ class SimpleCaptcha { $addedLinks = array_diff( $unknownLinks, $oldLinks ); $numLinks = count( $addedLinks ); - if( $numLinks > 0 ) { + if ( $numLinks > 0 ) { global $wgUser; $this->trigger = sprintf( "%dx url trigger by '%s' at [[%s]]: %s", $numLinks, @@ -349,20 +347,20 @@ class SimpleCaptcha { } global $wgCaptchaRegexes; - if( !empty( $wgCaptchaRegexes ) ) { + if ( $wgCaptchaRegexes ) { // Custom regex checks $oldtext = $this->loadText( $editPage, $section ); - foreach( $wgCaptchaRegexes as $regex ) { + foreach ( $wgCaptchaRegexes as $regex ) { $newMatches = array(); - if( preg_match_all( $regex, $newtext, $newMatches ) ) { + if ( preg_match_all( $regex, $newtext, $newMatches ) ) { $oldMatches = array(); preg_match_all( $regex, $oldtext, $oldMatches ); $addedMatches = array_diff( $newMatches[0], $oldMatches[0] ); $numHits = count( $addedMatches ); - if( $numHits > 0 ) { + if ( $numHits > 0 ) { global $wgUser; $this->trigger = sprintf( "%dx %s at [[%s]]: %s", $numHits, @@ -390,7 +388,7 @@ class SimpleCaptcha { global $wgCaptchaWhitelist; $source = wfMsgForContent( 'captcha-addurl-whitelist' ); - $whitelist = wfEmptyMsg( 'captcha-addurl-whitelist', $source ) + $whitelist = wfEmptyMsg( 'captcha-addurl-whitelist', $source ) ? false : $this->buildRegexes( explode( "\n", $source ) ); @@ -419,29 +417,29 @@ class SimpleCaptcha { } else { # Make regex # It's faster using the S modifier even though it will usually only be run once - //$regex = 'http://+[a-z0-9_\-.]*(' . implode( '|', $lines ) . ')'; - //return '/' . str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $regex) ) . '/Si'; + // $regex = 'http://+[a-z0-9_\-.]*(' . implode( '|', $lines ) . ')'; + // return '/' . str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $regex) ) . '/Si'; $regexes = ''; $regexStart = '/^https?:\/\/+[a-z0-9_\-.]*('; $regexEnd = ')/Si'; $regexMax = 4096; $build = false; - foreach( $lines as $line ) { + foreach ( $lines as $line ) { // FIXME: not very robust size check, but should work. :) - if( $build === false ) { + if ( $build === false ) { $build = $line; - } elseif( strlen( $build ) + strlen( $line ) > $regexMax ) { + } elseif ( strlen( $build ) + strlen( $line ) > $regexMax ) { $regexes .= $regexStart . - str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $build) ) . + str_replace( '/', '\/', preg_replace( '|\\\*/|', '/', $build ) ) . $regexEnd; $build = $line; } else { $build .= '|' . $line; } } - if( $build !== false ) { + if ( $build !== false ) { $regexes .= $regexStart . - str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $build) ) . + str_replace( '/', '\/', preg_replace( '|\\\*/|', '/', $build ) ) . $regexEnd; } return $regexes; @@ -454,7 +452,7 @@ class SimpleCaptcha { function getLinksFromTracker( $title ) { $dbr =& wfGetDB( DB_SLAVE ); $id = $title->getArticleId(); // should be zero queries - $res = $dbr->select( 'externallinks', array( 'el_to' ), + $res = $dbr->select( 'externallinks', array( 'el_to' ), array( 'el_from' => $id ), __METHOD__ ); $links = array(); while ( $row = $dbr->fetchObject( $res ) ) { @@ -462,14 +460,14 @@ class SimpleCaptcha { } return $links; } - + /** * Backend function for confirmEdit() and confirmEditAPI() * @return bool false if the CAPTCHA is rejected, true otherwise */ - private function doConfirmEdit( &$editPage, $newtext, $section, $merged = false ) { - if( $this->shouldCheck( $editPage, $newtext, $section, $merged ) ) { - if( $this->passCaptcha() ) { + private function doConfirmEdit( $editPage, $newtext, $section, $merged = false ) { + if ( $this->shouldCheck( $editPage, $newtext, $section, $merged ) ) { + if ( $this->passCaptcha() ) { return true; } else { return false; @@ -488,13 +486,13 @@ class SimpleCaptcha { * @param bool $merged * @return bool true to continue saving, false to abort and show a captcha form */ - function confirmEdit( &$editPage, $newtext, $section, $merged = false ) { - if( defined('MW_API') ) { + function confirmEdit( $editPage, $newtext, $section, $merged = false ) { + if ( defined( 'MW_API' ) ) { # API mode - # The CAPTCHA was already checked and approved + # The CAPTCHA was already checked and approved return true; } - if( !$this->doConfirmEdit( $editPage, $newtext, $section, $merged ) ) { + if ( !$this->doConfirmEdit( $editPage, $newtext, $section, $merged ) ) { $editPage->showEditForm( array( &$this, 'editCallback' ) ); return false; } @@ -506,14 +504,14 @@ class SimpleCaptcha { * @param EditPage $editPage * @param string $newtext */ - function confirmEditMerged( &$editPage, $newtext ) { + function confirmEditMerged( $editPage, $newtext ) { return $this->confirmEdit( $editPage, $newtext, false, true ); } - - - function confirmEditAPI( &$editPage, $newtext, &$resultArr) { - if( !$this->doConfirmEdit( $editPage, $newtext, false, false ) ) { - $this->addCaptchaAPI($resultArr); + + + function confirmEditAPI( $editPage, $newtext, &$resultArr ) { + if ( !$this->doConfirmEdit( $editPage, $newtext, false, false ) ) { + $this->addCaptchaAPI( $resultArr ); return false; } return true; @@ -527,23 +525,23 @@ class SimpleCaptcha { */ function confirmUserCreate( $u, &$message ) { global $wgCaptchaTriggers, $wgUser; - if( $wgCaptchaTriggers['createaccount'] ) { - if( $wgUser->isAllowed( 'skipcaptcha' ) ) { + if ( $wgCaptchaTriggers['createaccount'] ) { + if ( $wgUser->isAllowed( 'skipcaptcha' ) ) { wfDebug( "ConfirmEdit: user group allows skipping captcha on account creation\n" ); return true; } - if( $this->isIPWhitelisted() ) + if ( $this->isIPWhitelisted() ) return true; - + $this->trigger = "new account '" . $u->getName() . "'"; - if( !$this->passCaptcha() ) { + if ( !$this->passCaptcha() ) { $message = wfMsg( 'captcha-createaccount-fail' ); return false; } } return true; } - + /** * Hook for user login form submissions. * @param User $u @@ -551,12 +549,12 @@ class SimpleCaptcha { * @return bool true to continue, false to abort user creation */ function confirmUserLogin( $u, $pass, &$retval ) { - if( $this->isBadLoginTriggered() ) { - if( $this->isIPWhitelisted() ) + if ( $this->isBadLoginTriggered() ) { + if ( $this->isIPWhitelisted() ) return true; - + $this->trigger = "post-badlogin login '" . $u->getName() . "'"; - if( !$this->passCaptcha() ) { + if ( !$this->passCaptcha() ) { $message = wfMsg( 'captcha-badlogin-fail' ); // Emulate a bad-password return to confuse the shit out of attackers $retval = LoginForm::WRONG_PASS; @@ -573,9 +571,9 @@ class SimpleCaptcha { */ function passCaptcha() { $info = $this->retrieveCaptcha(); - if( $info ) { + if ( $info ) { global $wgRequest; - if( $this->keyMatch( $wgRequest->getVal('wpCaptchaWord'), $info ) ) { + if ( $this->keyMatch( $wgRequest->getVal( 'wpCaptchaWord' ), $info ) ) { $this->log( "passed" ); $this->clearCaptcha( $info ); return true; @@ -610,7 +608,7 @@ class SimpleCaptcha { * @return string captcha ID key */ function storeCaptcha( $info ) { - if( !isset( $info['index'] ) ) { + if ( !isset( $info['index'] ) ) { // Assign random index if we're not udpating $info['index'] = strval( mt_rand() ); } @@ -645,11 +643,11 @@ class SimpleCaptcha { */ function loadText( $editPage, $section ) { $rev = Revision::newFromTitle( $editPage->mTitle ); - if( is_null( $rev ) ) { + if ( is_null( $rev ) ) { return ""; } else { $text = $rev->getText(); - if( $section != '' ) { + if ( $section != '' ) { return Article::getSection( $text, $section ); } else { return $text; @@ -683,22 +681,21 @@ class SimpleCaptcha { $wgOut->addWikiText( wfMsg( 'captchahelp-cookies-needed' ) ); } } - } class CaptchaSessionStore { function store( $index, $info ) { $_SESSION['captcha' . $info['index']] = $info; } - + function retrieve( $index ) { - if( isset( $_SESSION['captcha' . $index] ) ) { + if ( isset( $_SESSION['captcha' . $index] ) ) { return $_SESSION['captcha' . $index]; } else { return false; } } - + function clear( $index ) { unset( $_SESSION['captcha' . $index] ); } @@ -718,13 +715,13 @@ class CaptchaCacheStore { function retrieve( $index ) { global $wgMemc; $info = $wgMemc->get( wfMemcKey( 'captcha', $index ) ); - if( $info ) { + if ( $info ) { return $info; } else { return false; } } - + function clear( $index ) { global $wgMemc; $wgMemc->delete( wfMemcKey( 'captcha', $index ) ); @@ -734,4 +731,3 @@ class CaptchaCacheStore { return false; } } -