* @ingroup Extensions */ class QuestyCaptcha extends SimpleCaptcha { /** Validate a captcha response */ function keyMatch( $answer, $info ) { if ( is_array( $info['answer'] ) ) { return in_array( strtolower( $answer ), $info['answer'] ); } else { return strtolower( $answer ) == strtolower( $info['answer'] ); } } function addCaptchaAPI( &$resultArr ) { $captcha = $this->getCaptcha(); $index = $this->storeCaptcha( $captcha ); $resultArr['captcha']['type'] = 'question'; $resultArr['captcha']['mime'] = 'text/plain'; $resultArr['captcha']['id'] = $index; $resultArr['captcha']['question'] = $captcha['question']; } function getCaptcha() { global $wgCaptchaQuestions; return $wgCaptchaQuestions[mt_rand( 0, count( $wgCaptchaQuestions ) - 1 )]; // pick a question, any question } function getForm() { $captcha = $this->getCaptcha(); if ( !$captcha ) { die( "No questions found; set some in LocalSettings.php using the format from QuestyCaptcha.php." ); } $index = $this->storeCaptcha( $captcha ); return "

" . Html::element( 'input', array( 'name' => 'wpCaptchaWord', 'id' => 'wpCaptchaWord', 'required', 'tabindex' => 1 ) ) . // tab in before the edit textarea "

\n" . Xml::element( 'input', array( 'type' => 'hidden', 'name' => 'wpCaptchaId', 'id' => 'wpCaptchaId', 'value' => $index ) ); } function getMessage( $action ) { $name = 'questycaptcha-' . $action; $text = wfMessage( $name )->text(); # Obtain a more tailored message, if possible, otherwise, fall back to # the default for edits return wfMessage( $name, $text )->isDisabled() ? wfMessage( 'questycaptcha-edit' )->text() : $text; } function showHelp() { global $wgOut; $wgOut->setPageTitle( wfMessage( 'captchahelp-title' )->text() ); $wgOut->addWikiMsg( 'questycaptchahelp-text' ); if ( CaptchaStore::get()->cookiesNeeded() ) { $wgOut->addWikiMsg( 'captchahelp-cookies-needed' ); } } }