mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/ConfirmEdit
synced 2024-11-24 00:04:15 +00:00
Add php code sniffer
Change-Id: I298b8b936a2b86deea75c302d88a7391cdb221c9
This commit is contained in:
parent
c3e6992bb3
commit
30490fba52
|
@ -108,8 +108,10 @@ $wgCaptchaTriggers['badlogin'] = true; // Special:Userlogin after failure
|
||||||
$wgCaptchaTriggersOnNamespace = array();
|
$wgCaptchaTriggersOnNamespace = array();
|
||||||
|
|
||||||
# Example:
|
# Example:
|
||||||
# $wgCaptchaTriggersOnNamespace[NS_TALK]['create'] = false; //Allow creation of talk pages without captchas.
|
# // Allow creation of talk pages without captchas
|
||||||
# $wgCaptchaTriggersOnNamespace[NS_PROJECT]['edit'] = true; //Show captcha whenever editing Project pages.
|
# $wgCaptchaTriggersOnNamespace[NS_TALK]['create'] = false;
|
||||||
|
# // Show captcha whenever editing Project pages.
|
||||||
|
# $wgCaptchaTriggersOnNamespace[NS_PROJECT]['edit'] = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicate how to store per-session data required to match up the
|
* Indicate how to store per-session data required to match up the
|
||||||
|
|
|
@ -12,7 +12,7 @@ class ApiFancyCaptchaReload extends ApiBase {
|
||||||
$captchaIndex = $captcha->getCaptchaIndex();
|
$captchaIndex = $captcha->getCaptchaIndex();
|
||||||
|
|
||||||
$result = $this->getResult();
|
$result = $this->getResult();
|
||||||
$result->addValue( null, $this->getModuleName(), array ( 'index' => $captchaIndex ) );
|
$result->addValue( null, $this->getModuleName(), array( 'index' => $captchaIndex ) );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -91,7 +91,7 @@ class FancyCaptcha extends SimpleCaptcha {
|
||||||
* @param OutputPage $out
|
* @param OutputPage $out
|
||||||
*/
|
*/
|
||||||
function getForm( OutputPage $out, $tabIndex = 1 ) {
|
function getForm( OutputPage $out, $tabIndex = 1 ) {
|
||||||
global $wgOut, $wgEnableAPI;
|
global $wgEnableAPI;
|
||||||
|
|
||||||
// Uses addModuleStyles so it is loaded when JS is disabled.
|
// Uses addModuleStyles so it is loaded when JS is disabled.
|
||||||
$out->addModuleStyles( 'ext.confirmEdit.fancyCaptcha.styles' );
|
$out->addModuleStyles( 'ext.confirmEdit.fancyCaptcha.styles' );
|
||||||
|
@ -145,7 +145,7 @@ class FancyCaptcha extends SimpleCaptcha {
|
||||||
); // tab in before the edit textarea
|
); // tab in before the edit textarea
|
||||||
if ( $this->action == 'usercreate' ) {
|
if ( $this->action == 'usercreate' ) {
|
||||||
// use raw element, because the message can contain links or some other html
|
// use raw element, because the message can contain links or some other html
|
||||||
$form .= HTML::rawelement( 'small',array(
|
$form .= HTML::rawelement( 'small', array(
|
||||||
'class' => 'mw-createacct-captcha-assisted'
|
'class' => 'mw-createacct-captcha-assisted'
|
||||||
), wfMessage( 'createacct-imgcaptcha-help' )->parse()
|
), wfMessage( 'createacct-imgcaptcha-help' )->parse()
|
||||||
);
|
);
|
||||||
|
@ -229,7 +229,8 @@ class FancyCaptcha extends SimpleCaptcha {
|
||||||
|
|
||||||
$place = mt_rand( 0, count( $dirs ) - 1 ); // pick a random subdir
|
$place = mt_rand( 0, count( $dirs ) - 1 ); // pick a random subdir
|
||||||
// In case all dirs are not filled, cycle through next digits...
|
// In case all dirs are not filled, cycle through next digits...
|
||||||
for ( $j = 0; $j < count( $dirs ); $j++ ) {
|
$fancyCount = count( $dirs );
|
||||||
|
for ( $j = 0; $j < $fancyCount; $j++ ) {
|
||||||
$char = $dirs[( $place + $j ) % count( $dirs )];
|
$char = $dirs[( $place + $j ) % count( $dirs )];
|
||||||
$info = $this->pickImageDir( "$directory/$char", $levels - 1, $lockouts );
|
$info = $this->pickImageDir( "$directory/$char", $levels - 1, $lockouts );
|
||||||
if ( $info ) {
|
if ( $info ) {
|
||||||
|
@ -301,7 +302,8 @@ class FancyCaptcha extends SimpleCaptcha {
|
||||||
$backend = $this->getBackend();
|
$backend = $this->getBackend();
|
||||||
$place = mt_rand( 0, count( $files ) - 1 ); // pick a random file
|
$place = mt_rand( 0, count( $files ) - 1 ); // pick a random file
|
||||||
$misses = 0; // number of files in listing that don't actually exist
|
$misses = 0; // number of files in listing that don't actually exist
|
||||||
for ( $j = 0; $j < count( $files ); $j++ ) {
|
$fancyImageCount = count( $files );
|
||||||
|
for ( $j = 0; $j < $fancyImageCount; $j++ ) {
|
||||||
$entry = $files[( $place + $j ) % count( $files )];
|
$entry = $files[( $place + $j ) % count( $files )];
|
||||||
if ( preg_match( '/^image_([0-9a-f]+)_([0-9a-f]+)\\.png$/', $entry, $matches ) ) {
|
if ( preg_match( '/^image_([0-9a-f]+)_([0-9a-f]+)\\.png$/', $entry, $matches ) ) {
|
||||||
if ( $wgCaptchaDeleteOnSolve ) { // captcha will be deleted when solved
|
if ( $wgCaptchaDeleteOnSolve ) { // captcha will be deleted when solved
|
||||||
|
|
|
@ -4,7 +4,8 @@ if ( function_exists( 'wfLoadExtension' ) ) {
|
||||||
// Keep i18n globals so mergeMessageFileList.php doesn't break
|
// Keep i18n globals so mergeMessageFileList.php doesn't break
|
||||||
$wgMessagesDirs['FancyCaptcha'] = __DIR__ . '/i18n';
|
$wgMessagesDirs['FancyCaptcha'] = __DIR__ . '/i18n';
|
||||||
/* wfWarn(
|
/* wfWarn(
|
||||||
'Deprecated PHP entry point used for FancyCaptcha extension. Please use wfLoadExtension instead, ' .
|
'Deprecated PHP entry point used for FancyCaptcha extension. ' .
|
||||||
|
'Please use wfLoadExtension instead, ' .
|
||||||
'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
|
'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
|
||||||
); */
|
); */
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -25,7 +25,16 @@ class MathCaptcha extends SimpleCaptcha {
|
||||||
$index = $this->storeCaptcha( array( 'answer' => $answer ) );
|
$index = $this->storeCaptcha( array( 'answer' => $answer ) );
|
||||||
|
|
||||||
$form = '<table><tr><td>' . $this->fetchMath( $sum ) . '</td>';
|
$form = '<table><tr><td>' . $this->fetchMath( $sum ) . '</td>';
|
||||||
$form .= '<td>' . Html::input( 'wpCaptchaWord', false, false, array( 'tabindex' => $tabIndex, 'autocomplete' => 'off', 'required' ) ) . '</td></tr></table>';
|
$form .= '<td>' . Html::input(
|
||||||
|
'wpCaptchaWord',
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
array(
|
||||||
|
'tabindex' => $tabIndex,
|
||||||
|
'autocomplete' => 'off',
|
||||||
|
'required'
|
||||||
|
)
|
||||||
|
) . '</td></tr></table>';
|
||||||
$form .= Html::hidden( 'wpCaptchaId', $index );
|
$form .= Html::hidden( 'wpCaptchaId', $index );
|
||||||
return $form;
|
return $form;
|
||||||
}
|
}
|
||||||
|
@ -45,7 +54,9 @@ class MathCaptcha extends SimpleCaptcha {
|
||||||
if ( class_exists( 'MathRenderer' ) ) {
|
if ( class_exists( 'MathRenderer' ) ) {
|
||||||
$math = MathRenderer::getRenderer( $sum, array(), MW_MATH_PNG );
|
$math = MathRenderer::getRenderer( $sum, array(), MW_MATH_PNG );
|
||||||
} else {
|
} else {
|
||||||
throw new Exception( 'MathCaptcha requires the Math extension for MediaWiki versions 1.18 and above.' );
|
throw new Exception(
|
||||||
|
'MathCaptcha requires the Math extension for MediaWiki versions 1.18 and above.'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$html = $math->render();
|
$html = $math->render();
|
||||||
return preg_replace( '/alt=".*?"/', '', $html );
|
return preg_replace( '/alt=".*?"/', '', $html );
|
||||||
|
|
|
@ -4,7 +4,8 @@ if ( function_exists( 'wfLoadExtension' ) ) {
|
||||||
// Keep i18n globals so mergeMessageFileList.php doesn't break
|
// Keep i18n globals so mergeMessageFileList.php doesn't break
|
||||||
$wgMessagesDirs['MathCaptcha'] = __DIR__ . '/i18n';
|
$wgMessagesDirs['MathCaptcha'] = __DIR__ . '/i18n';
|
||||||
/* wfWarn(
|
/* wfWarn(
|
||||||
'Deprecated PHP entry point used for MathCaptcha extension. Please use wfLoadExtension instead, ' .
|
'Deprecated PHP entry point used for MathCaptcha extension. ' .
|
||||||
|
'Please use wfLoadExtension instead, ' .
|
||||||
'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
|
'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
|
||||||
); */
|
); */
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -31,7 +31,7 @@ class QuestyCaptcha extends SimpleCaptcha {
|
||||||
function getCaptcha() {
|
function getCaptcha() {
|
||||||
global $wgCaptchaQuestions;
|
global $wgCaptchaQuestions;
|
||||||
|
|
||||||
//Backwards compatibility
|
// Backwards compatibility
|
||||||
if ( $wgCaptchaQuestions === array_values( $wgCaptchaQuestions ) ) {
|
if ( $wgCaptchaQuestions === array_values( $wgCaptchaQuestions ) ) {
|
||||||
return $wgCaptchaQuestions[ mt_rand( 0, count( $wgCaptchaQuestions ) - 1 ) ];
|
return $wgCaptchaQuestions[ mt_rand( 0, count( $wgCaptchaQuestions ) - 1 ) ];
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,9 @@ class QuestyCaptcha extends SimpleCaptcha {
|
||||||
function getForm( OutputPage $out, $tabIndex = 1 ) {
|
function getForm( OutputPage $out, $tabIndex = 1 ) {
|
||||||
$captcha = $this->getCaptcha();
|
$captcha = $this->getCaptcha();
|
||||||
if ( !$captcha ) {
|
if ( !$captcha ) {
|
||||||
die( "No questions found; set some in LocalSettings.php using the format from QuestyCaptcha.php." );
|
die(
|
||||||
|
"No questions found; set some in LocalSettings.php using the format from QuestyCaptcha.php."
|
||||||
|
);
|
||||||
}
|
}
|
||||||
$index = $this->storeCaptcha( $captcha );
|
$index = $this->storeCaptcha( $captcha );
|
||||||
return "<p><label for=\"wpCaptchaWord\">{$captcha['question']}</label> " .
|
return "<p><label for=\"wpCaptchaWord\">{$captcha['question']}</label> " .
|
||||||
|
@ -68,7 +70,9 @@ class QuestyCaptcha extends SimpleCaptcha {
|
||||||
$text = wfMessage( $name )->text();
|
$text = wfMessage( $name )->text();
|
||||||
# Obtain a more tailored message, if possible, otherwise, fall back to
|
# Obtain a more tailored message, if possible, otherwise, fall back to
|
||||||
# the default for edits
|
# the default for edits
|
||||||
return wfMessage( $name, $text )->isDisabled() ? wfMessage( 'questycaptcha-edit' )->text() : $text;
|
return wfMessage(
|
||||||
|
$name, $text
|
||||||
|
)->isDisabled() ? wfMessage( 'questycaptcha-edit' )->text() : $text;
|
||||||
}
|
}
|
||||||
|
|
||||||
function showHelp() {
|
function showHelp() {
|
||||||
|
|
|
@ -4,7 +4,8 @@ if ( function_exists( 'wfLoadExtension' ) ) {
|
||||||
// Keep i18n globals so mergeMessageFileList.php doesn't break
|
// Keep i18n globals so mergeMessageFileList.php doesn't break
|
||||||
$wgMessagesDirs['QuestyCaptcha'] = __DIR__ . '/i18n';
|
$wgMessagesDirs['QuestyCaptcha'] = __DIR__ . '/i18n';
|
||||||
/* wfWarn(
|
/* wfWarn(
|
||||||
'Deprecated PHP entry point used for QuestyCaptcha extension. Please use wfLoadExtension instead, ' .
|
'Deprecated PHP entry point used for QuestyCaptcha extension. ' .
|
||||||
|
'Please use wfLoadExtension instead, ' .
|
||||||
'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
|
'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
|
||||||
); */
|
); */
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -13,9 +13,13 @@ class ReCaptcha extends SimpleCaptcha {
|
||||||
global $wgReCaptchaPublicKey, $wgReCaptchaTheme;
|
global $wgReCaptchaPublicKey, $wgReCaptchaTheme;
|
||||||
|
|
||||||
$useHttps = ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' );
|
$useHttps = ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' );
|
||||||
$js = 'var RecaptchaOptions = ' . Xml::encodeJsVar( array( 'theme' => $wgReCaptchaTheme, 'tabindex' => $tabIndex ) );
|
$js = 'var RecaptchaOptions = ' . Xml::encodeJsVar(
|
||||||
|
array( 'theme' => $wgReCaptchaTheme, 'tabindex' => $tabIndex )
|
||||||
|
);
|
||||||
|
|
||||||
return Html::inlineScript( $js ) . recaptcha_get_html( $wgReCaptchaPublicKey, $this->recaptcha_error, $useHttps );
|
return Html::inlineScript(
|
||||||
|
$js
|
||||||
|
) . recaptcha_get_html( $wgReCaptchaPublicKey, $this->recaptcha_error, $useHttps );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -27,9 +31,14 @@ class ReCaptcha extends SimpleCaptcha {
|
||||||
function passCaptcha() {
|
function passCaptcha() {
|
||||||
global $wgReCaptchaPrivateKey, $wgRequest;
|
global $wgReCaptchaPrivateKey, $wgRequest;
|
||||||
|
|
||||||
// API is hardwired to return wpCaptchaId and wpCaptchaWord, so use that if the standard two are empty
|
// API is hardwired to return wpCaptchaId and wpCaptchaWord,
|
||||||
$challenge = $wgRequest->getVal( 'recaptcha_challenge_field', $wgRequest->getVal( 'wpCaptchaId' ) );
|
// so use that if the standard two are empty
|
||||||
$response = $wgRequest->getVal( 'recaptcha_response_field', $wgRequest->getVal( 'wpCaptchaWord' ) );
|
$challenge = $wgRequest->getVal(
|
||||||
|
'recaptcha_challenge_field', $wgRequest->getVal( 'wpCaptchaId' )
|
||||||
|
);
|
||||||
|
$response = $wgRequest->getVal(
|
||||||
|
'recaptcha_response_field', $wgRequest->getVal( 'wpCaptchaWord' )
|
||||||
|
);
|
||||||
|
|
||||||
if ( $response === null ) {
|
if ( $response === null ) {
|
||||||
// new captcha session
|
// new captcha session
|
||||||
|
|
|
@ -4,7 +4,8 @@ if ( function_exists( 'wfLoadExtension' ) ) {
|
||||||
// Keep i18n globals so mergeMessageFileList.php doesn't break
|
// Keep i18n globals so mergeMessageFileList.php doesn't break
|
||||||
$wgMessagesDirs['ReCaptcha'] = __DIR__ . '/i18n';
|
$wgMessagesDirs['ReCaptcha'] = __DIR__ . '/i18n';
|
||||||
/* wfWarn(
|
/* wfWarn(
|
||||||
'Deprecated PHP entry point used for ReCaptcha extension. Please use wfLoadExtension instead, ' .
|
'Deprecated PHP entry point used for ReCaptcha extension. ' .
|
||||||
|
'Please use wfLoadExtension instead, ' .
|
||||||
'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
|
'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
|
||||||
); */
|
); */
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -4,7 +4,8 @@ if ( function_exists( 'wfLoadExtension' ) ) {
|
||||||
// Keep i18n globals so mergeMessageFileList.php doesn't break
|
// Keep i18n globals so mergeMessageFileList.php doesn't break
|
||||||
$wgMessagesDirs['ReCaptchaNoCaptcha'] = __DIR__ . '/i18n';
|
$wgMessagesDirs['ReCaptchaNoCaptcha'] = __DIR__ . '/i18n';
|
||||||
/* wfWarn(
|
/* wfWarn(
|
||||||
'Deprecated PHP entry point used for ReCaptchaNoCaptcha extension. Please use wfLoadExtension instead, ' .
|
'Deprecated PHP entry point used for ReCaptchaNoCaptcha extension. ' .
|
||||||
|
'Please use wfLoadExtension instead, ' .
|
||||||
'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
|
'see https://www.mediawiki.org/wiki/Extension_registration for more details.'
|
||||||
); */
|
); */
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -153,8 +153,10 @@ class SimpleCaptcha {
|
||||||
$captcha = "<div class='captcha'>" .
|
$captcha = "<div class='captcha'>" .
|
||||||
$wgOut->parse( $this->getMessage( 'createaccount' ) ) .
|
$wgOut->parse( $this->getMessage( 'createaccount' ) ) .
|
||||||
// FIXME: Hardcoded tab index
|
// FIXME: Hardcoded tab index
|
||||||
// Usually, the CAPTCHA is added after the E-Mail address field, which actually has 6 as the tabIndex, but
|
// Usually, the CAPTCHA is added after the E-Mail address field,
|
||||||
// there may are wikis which allows to mention the "real name", which would have 7 as tabIndex, so increase
|
// which actually has 6 as the tabIndex, but
|
||||||
|
// there may are wikis which allows to mention the "real name",
|
||||||
|
// which would have 7 as tabIndex, so increase
|
||||||
// 6 by 2 and use it for the CAPTCHA -> 8 (the submit button has a tabIndex of 10)
|
// 6 by 2 and use it for the CAPTCHA -> 8 (the submit button has a tabIndex of 10)
|
||||||
$this->getForm( $wgOut, 8 ) .
|
$this->getForm( $wgOut, 8 ) .
|
||||||
"</div>\n";
|
"</div>\n";
|
||||||
|
@ -229,7 +231,9 @@ class SimpleCaptcha {
|
||||||
*/
|
*/
|
||||||
function isBadLoginTriggered() {
|
function isBadLoginTriggered() {
|
||||||
global $wgMemc, $wgCaptchaTriggers, $wgCaptchaBadLoginAttempts;
|
global $wgMemc, $wgCaptchaTriggers, $wgCaptchaBadLoginAttempts;
|
||||||
return $wgCaptchaTriggers['badlogin'] && intval( $wgMemc->get( $this->badLoginKey() ) ) >= $wgCaptchaBadLoginAttempts;
|
return $wgCaptchaTriggers['badlogin'] && intval(
|
||||||
|
$wgMemc->get( $this->badLoginKey() )
|
||||||
|
) >= $wgCaptchaBadLoginAttempts;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -303,7 +307,9 @@ class SimpleCaptcha {
|
||||||
* @return bool true if the captcha should run
|
* @return bool true if the captcha should run
|
||||||
*/
|
*/
|
||||||
function shouldCheck( WikiPage $page, $content, $section, $context, $oldtext = null ) {
|
function shouldCheck( WikiPage $page, $content, $section, $context, $oldtext = null ) {
|
||||||
|
// @codingStandardsIgnoreStart
|
||||||
global $ceAllowConfirmedEmail;
|
global $ceAllowConfirmedEmail;
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
|
|
||||||
if ( !$context instanceof IContextSource ) {
|
if ( !$context instanceof IContextSource ) {
|
||||||
$context = RequestContext::getMain();
|
$context = RequestContext::getMain();
|
||||||
|
@ -349,7 +355,7 @@ class SimpleCaptcha {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $this->captchaTriggers( $title, 'create' ) && !$title->exists() ) {
|
if ( $this->captchaTriggers( $title, 'create' ) && !$title->exists() ) {
|
||||||
// Check if creating a page
|
// Check if creating a page
|
||||||
$this->trigger = sprintf( "Create trigger by '%s' at [[%s]]",
|
$this->trigger = sprintf( "Create trigger by '%s' at [[%s]]",
|
||||||
$user->getName(),
|
$user->getName(),
|
||||||
|
@ -359,9 +365,12 @@ class SimpleCaptcha {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The following checks are expensive and should be done only, if we can assume, that the edit will be saved
|
// The following checks are expensive and should be done only,
|
||||||
|
// if we can assume, that the edit will be saved
|
||||||
if ( !$request->wasPosted() ) {
|
if ( !$request->wasPosted() ) {
|
||||||
wfDebug( "ConfirmEdit: request not posted, assuming that no content will be saved -> no CAPTCHA check" );
|
wfDebug(
|
||||||
|
"ConfirmEdit: request not posted, assuming that no content will be saved -> no CAPTCHA check"
|
||||||
|
);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -402,7 +411,9 @@ class SimpleCaptcha {
|
||||||
global $wgCaptchaRegexes;
|
global $wgCaptchaRegexes;
|
||||||
if ( $newtext !== null && $wgCaptchaRegexes ) {
|
if ( $newtext !== null && $wgCaptchaRegexes ) {
|
||||||
if ( !is_array( $wgCaptchaRegexes ) ) {
|
if ( !is_array( $wgCaptchaRegexes ) ) {
|
||||||
throw new UnexpectedValueException( '$wgCaptchaRegexes is required to be an array, ' . gettype( $wgCaptchaRegexes ) . ' given.' );
|
throw new UnexpectedValueException(
|
||||||
|
'$wgCaptchaRegexes is required to be an array, ' . gettype( $wgCaptchaRegexes ) . ' given.'
|
||||||
|
);
|
||||||
}
|
}
|
||||||
// Custom regex checks. Reuse $oldtext if set above.
|
// Custom regex checks. Reuse $oldtext if set above.
|
||||||
$oldtext = isset( $oldtext ) ? $oldtext : $this->loadText( $title, $section );
|
$oldtext = isset( $oldtext ) ? $oldtext : $this->loadText( $title, $section );
|
||||||
|
@ -606,7 +617,8 @@ class SimpleCaptcha {
|
||||||
// otherwise it's an unknown page where this function is called from
|
// otherwise it's an unknown page where this function is called from
|
||||||
$title = 'unknown';
|
$title = 'unknown';
|
||||||
}
|
}
|
||||||
// log this error, it could be a problem in another extension, edits should always have a WikiPage if
|
// log this error, it could be a problem in another extension,
|
||||||
|
// edits should always have a WikiPage if
|
||||||
// they go through EditFilterMergedContent.
|
// they go through EditFilterMergedContent.
|
||||||
wfDebug( __METHOD__ . ': Skipped ConfirmEdit check: No WikiPage for title ' . $title );
|
wfDebug( __METHOD__ . ': Skipped ConfirmEdit check: No WikiPage for title ' . $title );
|
||||||
return true;
|
return true;
|
||||||
|
@ -660,7 +672,9 @@ class SimpleCaptcha {
|
||||||
if ( $this->needCreateAccountCaptcha() ) {
|
if ( $this->needCreateAccountCaptcha() ) {
|
||||||
$this->trigger = "new account '" . $u->getName() . "'";
|
$this->trigger = "new account '" . $u->getName() . "'";
|
||||||
$success = $this->passCaptchaLimited();
|
$success = $this->passCaptchaLimited();
|
||||||
LoggerFactory::getInstance( 'authmanager' )->info( 'Captcha submitted on account creation', array(
|
LoggerFactory::getInstance(
|
||||||
|
'authmanager'
|
||||||
|
)->info( 'Captcha submitted on account creation', array(
|
||||||
'event' => 'captcha.submit',
|
'event' => 'captcha.submit',
|
||||||
'type' => 'accountcreation',
|
'type' => 'accountcreation',
|
||||||
'successful' => $success,
|
'successful' => $success,
|
||||||
|
@ -834,7 +848,8 @@ class SimpleCaptcha {
|
||||||
function passCaptcha() {
|
function passCaptcha() {
|
||||||
global $wgRequest;
|
global $wgRequest;
|
||||||
|
|
||||||
// Don't check the same CAPTCHA twice in one session, if the CAPTCHA was already checked - Bug T94276
|
// Don't check the same CAPTCHA twice in one session,
|
||||||
|
// if the CAPTCHA was already checked - Bug T94276
|
||||||
if ( isset( $this->captchaSolved ) ) {
|
if ( isset( $this->captchaSolved ) ) {
|
||||||
return $this->captchaSolved;
|
return $this->captchaSolved;
|
||||||
}
|
}
|
||||||
|
@ -1005,7 +1020,9 @@ class SimpleCaptcha {
|
||||||
$this->addCaptchaAPI( $result );
|
$this->addCaptchaAPI( $result );
|
||||||
$result['result'] = 'NeedCaptcha';
|
$result['result'] = 'NeedCaptcha';
|
||||||
|
|
||||||
LoggerFactory::getInstance( 'authmanager' )->info( 'Captcha data added in account creation API', array(
|
LoggerFactory::getInstance(
|
||||||
|
'authmanager'
|
||||||
|
)->info( 'Captcha data added in account creation API', array(
|
||||||
'event' => 'captcha.display',
|
'event' => 'captcha.display',
|
||||||
'type' => 'accountcreation',
|
'type' => 'accountcreation',
|
||||||
) );
|
) );
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
{
|
{
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"jakub-onderka/php-parallel-lint": "0.9"
|
"jakub-onderka/php-parallel-lint": "0.9",
|
||||||
|
"mediawiki/mediawiki-codesniffer": "0.4.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": [
|
"test": [
|
||||||
"parallel-lint . --exclude vendor"
|
"parallel-lint . --exclude vendor",
|
||||||
|
"phpcs -p -s"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,26 +6,26 @@ abstract class CaptchaStore {
|
||||||
* @param $index String
|
* @param $index String
|
||||||
* @param $info String the captcha result
|
* @param $info String the captcha result
|
||||||
*/
|
*/
|
||||||
public abstract function store( $index, $info );
|
abstract public function store( $index, $info );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the answer for a given captcha
|
* Retrieve the answer for a given captcha
|
||||||
* @param $index String
|
* @param $index String
|
||||||
* @return String
|
* @return String
|
||||||
*/
|
*/
|
||||||
public abstract function retrieve( $index );
|
abstract public function retrieve( $index );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete a result once the captcha has been used, so it cannot be reused
|
* Delete a result once the captcha has been used, so it cannot be reused
|
||||||
* @param $index
|
* @param $index
|
||||||
*/
|
*/
|
||||||
public abstract function clear( $index );
|
abstract public function clear( $index );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether this type of CaptchaStore needs cookies
|
* Whether this type of CaptchaStore needs cookies
|
||||||
* @return Bool
|
* @return Bool
|
||||||
*/
|
*/
|
||||||
public abstract function cookiesNeeded();
|
abstract public function cookiesNeeded();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The singleton instance
|
* The singleton instance
|
||||||
|
@ -39,7 +39,7 @@ abstract class CaptchaStore {
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
* @return CaptchaStore
|
* @return CaptchaStore
|
||||||
*/
|
*/
|
||||||
public final static function get() {
|
final public static function get() {
|
||||||
if ( !self::$instance instanceof self ) {
|
if ( !self::$instance instanceof self ) {
|
||||||
global $wgCaptchaStorageClass;
|
global $wgCaptchaStorageClass;
|
||||||
if ( in_array( 'CaptchaStore', class_parents( $wgCaptchaStorageClass ) ) ) {
|
if ( in_array( 'CaptchaStore', class_parents( $wgCaptchaStorageClass ) ) ) {
|
||||||
|
@ -54,7 +54,8 @@ abstract class CaptchaStore {
|
||||||
/**
|
/**
|
||||||
* Protected constructor: no creating instances except through the factory method above
|
* Protected constructor: no creating instances except through the factory method above
|
||||||
*/
|
*/
|
||||||
protected function __construct() {}
|
protected function __construct() {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CaptchaSessionStore extends CaptchaStore {
|
class CaptchaSessionStore extends CaptchaStore {
|
||||||
|
|
|
@ -145,7 +145,7 @@ class ConfirmEditHooks {
|
||||||
* FIXME: This should be done in a better way, e.g. only load the libraray, if really needed.
|
* FIXME: This should be done in a better way, e.g. only load the libraray, if really needed.
|
||||||
*/
|
*/
|
||||||
public static function onReCaptchaSetup() {
|
public static function onReCaptchaSetup() {
|
||||||
require_once( __DIR__ . '/../ReCaptcha/recaptchalib.php' );
|
require_once ( __DIR__ . '/../ReCaptcha/recaptchalib.php' );
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -154,7 +154,9 @@ class ConfirmEditHooks {
|
||||||
*/
|
*/
|
||||||
public static function efReCaptcha() {
|
public static function efReCaptcha() {
|
||||||
global $wgReCaptchaPublicKey, $wgReCaptchaPrivateKey;
|
global $wgReCaptchaPublicKey, $wgReCaptchaPrivateKey;
|
||||||
|
// @codingStandardsIgnoreStart
|
||||||
global $recaptcha_public_key, $recaptcha_private_key;
|
global $recaptcha_public_key, $recaptcha_private_key;
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
global $wgServerName;
|
global $wgServerName;
|
||||||
|
|
||||||
// Backwards compatibility
|
// Backwards compatibility
|
||||||
|
@ -166,9 +168,10 @@ class ConfirmEditHooks {
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( $wgReCaptchaPublicKey == '' || $wgReCaptchaPrivateKey == '' ) {
|
if ( $wgReCaptchaPublicKey == '' || $wgReCaptchaPrivateKey == '' ) {
|
||||||
die ( 'You need to set $wgReCaptchaPrivateKey and $wgReCaptchaPublicKey in LocalSettings.php to ' .
|
die (
|
||||||
|
'You need to set $wgReCaptchaPrivateKey and $wgReCaptchaPublicKey in LocalSettings.php to ' .
|
||||||
"use the reCAPTCHA plugin. You can sign up for a key <a href='" .
|
"use the reCAPTCHA plugin. You can sign up for a key <a href='" .
|
||||||
htmlentities( recaptcha_get_signup_url ( $wgServerName, "mediawiki" ) ) . "'>here</a>." );
|
htmlentities( recaptcha_get_signup_url( $wgServerName, "mediawiki" ) ) . "'>here</a>." );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ class CaptchaSpecialPage extends UnlistedSpecialPage {
|
||||||
|
|
||||||
$instance = ConfirmEditHooks::getInstance();
|
$instance = ConfirmEditHooks::getInstance();
|
||||||
|
|
||||||
switch( $par ) {
|
switch ( $par ) {
|
||||||
case "image":
|
case "image":
|
||||||
if ( method_exists( $instance, 'showImage' ) ) {
|
if ( method_exists( $instance, 'showImage' ) ) {
|
||||||
return $instance->showImage();
|
return $instance->showImage();
|
||||||
|
|
|
@ -24,10 +24,10 @@
|
||||||
if ( getenv( 'MW_INSTALL_PATH' ) ) {
|
if ( getenv( 'MW_INSTALL_PATH' ) ) {
|
||||||
$IP = getenv( 'MW_INSTALL_PATH' );
|
$IP = getenv( 'MW_INSTALL_PATH' );
|
||||||
} else {
|
} else {
|
||||||
$IP = dirname(__FILE__).'/../../..';
|
$IP = dirname( __FILE__ ).'/../../..';
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once( "$IP/maintenance/Maintenance.php" );
|
require_once ( "$IP/maintenance/Maintenance.php" );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Maintenance script to change the password of a given user.
|
* Maintenance script to change the password of a given user.
|
||||||
|
@ -127,4 +127,4 @@ class GenerateFancyCaptchas extends Maintenance {
|
||||||
}
|
}
|
||||||
|
|
||||||
$maintClass = "GenerateFancyCaptchas";
|
$maintClass = "GenerateFancyCaptchas";
|
||||||
require_once( RUN_MAINTENANCE_IF_MAIN );
|
require_once ( RUN_MAINTENANCE_IF_MAIN );
|
||||||
|
|
9
phpcs.xml
Normal file
9
phpcs.xml
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<ruleset>
|
||||||
|
<rule ref="vendor/mediawiki/mediawiki-codesniffer/MediaWiki"/>
|
||||||
|
<file>.</file>
|
||||||
|
<arg name="extensions" value="php,php5,inc"/>
|
||||||
|
<arg name="encoding" value="utf8"/>
|
||||||
|
<exclude-pattern>ReCaptcha/recaptchalib.php</exclude-pattern>
|
||||||
|
<exclude-pattern>vendor</exclude-pattern>
|
||||||
|
</ruleset>
|
Loading…
Reference in a new issue