MediaWiki REL1_34
QuestyCaptcha.php
Go to the documentation of this file.
1<?php
2
12
14 // used for questycaptcha-edit, questycaptcha-addurl, questycaptcha-badlogin,
15 // questycaptcha-createaccount, questycaptcha-create, questycaptcha-sendemail via getMessage()
16 protected static $messagePrefix = 'questycaptcha-';
17
24 protected function keyMatch( $answer, $info ) {
25 if ( is_array( $info['answer'] ) ) {
26 return in_array( strtolower( $answer ), array_map( 'strtolower', $info['answer'] ) );
27 } else {
28 return strtolower( $answer ) == strtolower( $info['answer'] );
29 }
30 }
31
35 protected function addCaptchaAPI( &$resultArr ) {
36 $captcha = $this->getCaptcha();
37 $index = $this->storeCaptcha( $captcha );
38 $resultArr['captcha'] = $this->describeCaptchaType();
39 $resultArr['captcha']['id'] = $index;
40 $resultArr['captcha']['question'] = $captcha['question'];
41 }
42
46 public function describeCaptchaType() {
47 return [
48 'type' => 'question',
49 'mime' => 'text/html',
50 ];
51 }
52
56 public function getCaptcha() {
57 global $wgCaptchaQuestions;
58
59 // Backwards compatibility
60 if ( $wgCaptchaQuestions === array_values( $wgCaptchaQuestions ) ) {
61 return $wgCaptchaQuestions[ mt_rand( 0, count( $wgCaptchaQuestions ) - 1 ) ];
62 }
63
64 $question = array_rand( $wgCaptchaQuestions, 1 );
65 $answer = $wgCaptchaQuestions[ $question ];
66 return [ 'question' => $question, 'answer' => $answer ];
67 }
68
73 public function getFormInformation( $tabIndex = 1 ) {
74 $captcha = $this->getCaptcha();
75 if ( !$captcha ) {
76 die(
77 "No questions found; set some in LocalSettings.php using the format from QuestyCaptcha.php."
78 );
79 }
80 $index = $this->storeCaptcha( $captcha );
81 return [
82 'html' => "<p><label for=\"wpCaptchaWord\">{$captcha['question']}</label> " .
83 Html::element( 'input', [
84 'name' => 'wpCaptchaWord',
85 'id' => 'wpCaptchaWord',
86 'class' => 'mw-ui-input',
87 'required',
88 'autocomplete' => 'off',
89 // tab in before the edit textarea
90 'tabindex' => $tabIndex ] ) .
91 "</p>\n" .
92 Xml::element( 'input', [
93 'type' => 'hidden',
94 'name' => 'wpCaptchaId',
95 'id' => 'wpCaptchaId',
96 'value' => $index ] )
97 ];
98 }
99
100 public function showHelp() {
101 global $wgOut;
102 $wgOut->setPageTitle( wfMessage( 'captchahelp-title' )->text() );
103 $wgOut->addWikiMsg( 'questycaptchahelp-text' );
104 if ( CaptchaStore::get()->cookiesNeeded() ) {
105 $wgOut->addWikiMsg( 'captchahelp-cookies-needed' );
106 }
107 }
108
114 public function getCaptchaInfo( $captchaData, $id ) {
115 return $captchaData['question'];
116 }
117
124 public function onAuthChangeFormFields( array $requests, array $fieldInfo,
125 array &$formDescriptor, $action ) {
127 $req =
128 AuthenticationRequest::getRequestByClass( $requests,
129 CaptchaAuthenticationRequest::class, true );
130 if ( !$req ) {
131 return;
132 }
133
134 // declare RAW HTML output.
135 $formDescriptor['captchaInfo']['raw'] = true;
136 $formDescriptor['captchaWord']['label-message'] = null;
137 }
138}
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
$wgOut
Definition Setup.php:885
static get()
Get somewhere to store captcha data that will persist between requests.
This is a value object for authentication requests.
static $messagePrefix
showHelp()
Show a page explaining what this wacky thing is.
onAuthChangeFormFields(array $requests, array $fieldInfo, array &$formDescriptor, $action)
getFormInformation( $tabIndex=1)
keyMatch( $answer, $info)
Validate a captcha response.
addCaptchaAPI(&$resultArr)
getCaptchaInfo( $captchaData, $id)
Demo CAPTCHA (not for production usage) and base class for real CAPTCHAs.
string $action
Used to select the right message.
storeCaptcha( $info)
Generate a captcha session ID and save the info in PHP's session storage.