]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - extensions/ConfirmEdit/QuestyCaptcha/QuestyCaptcha.class.php
MediaWiki 1.30.2
[autoinstalls/mediawiki.git] / extensions / ConfirmEdit / QuestyCaptcha / QuestyCaptcha.class.php
1 <?php
2
3 /**
4  * QuestyCaptcha class
5  *
6  * @file
7  * @author Benjamin Lees <emufarmers@gmail.com>
8  * @ingroup Extensions
9  */
10
11 use MediaWiki\Auth\AuthenticationRequest;
12
13 class QuestyCaptcha extends SimpleCaptcha {
14         // used for questycaptcha-edit, questycaptcha-addurl, questycaptcha-badlogin,
15         // questycaptcha-createaccount, questycaptcha-create, questycaptcha-sendemail via getMessage()
16         protected static $messagePrefix = 'questycaptcha-';
17
18         /**
19          * Validate a captcha response
20          * @param string $answer
21          * @param array $info
22          * @return bool
23          */
24         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
32         /**
33          * @param array $resultArr
34          */
35         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
43         /**
44          * @return array
45          */
46         public function describeCaptchaType() {
47                 return [
48                         'type' => 'question',
49                         'mime' => 'text/html',
50                 ];
51         }
52
53         /**
54          * @return array
55          */
56         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
69         /**
70          * @param int $tabIndex
71          * @return array
72          */
73         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                                         'tabindex' => $tabIndex ] ) . // tab in before the edit textarea
90                                 "</p>\n" .
91                                 Xml::element( 'input', [
92                                         'type'  => 'hidden',
93                                         'name'  => 'wpCaptchaId',
94                                         'id'    => 'wpCaptchaId',
95                                         'value' => $index ] )
96                 ];
97         }
98
99         function showHelp() {
100                 global $wgOut;
101                 $wgOut->setPageTitle( wfMessage( 'captchahelp-title' )->text() );
102                 $wgOut->addWikiMsg( 'questycaptchahelp-text' );
103                 if ( CaptchaStore::get()->cookiesNeeded() ) {
104                         $wgOut->addWikiMsg( 'captchahelp-cookies-needed' );
105                 }
106         }
107
108         /**
109          * @param array $captchaData
110          * @param string $id
111          * @return mixed
112          */
113         public function getCaptchaInfo( $captchaData, $id ) {
114                 return $captchaData['question'];
115         }
116
117         /**
118          * @param array $requests
119          * @param array $fieldInfo
120          * @param array $formDescriptor
121          * @param string $action
122          */
123         public function onAuthChangeFormFields( array $requests, array $fieldInfo,
124                 array &$formDescriptor, $action ) {
125                 /** @var CaptchaAuthenticationRequest $req */
126                 $req =
127                         AuthenticationRequest::getRequestByClass( $requests,
128                                 CaptchaAuthenticationRequest::class, true );
129                 if ( !$req ) {
130                         return;
131                 }
132
133                 // declare RAW HTML output.
134                 $formDescriptor['captchaInfo']['raw'] = true;
135                 $formDescriptor['captchaWord']['label-message'] = null;
136         }
137 }