Followup r81231, r81229
[toast/cookiecaptcha.git] / ReCaptcha.php
1 <?php
2
3 /**
4  * Captcha class using the reCAPTCHA widget. 
5  * Stop Spam. Read Books.  
6  *
7  * @addtogroup Extensions
8  * @author Mike Crawford <mike.crawford@gmail.com>
9  * @copyright Copyright (c) 2007 reCAPTCHA -- http://recaptcha.net
10  * @licence MIT/X11
11  */
12
13 if( !defined( 'MEDIAWIKI' ) ) {
14         exit;
15 }
16
17 $wgExtensionMessagesFiles['ReCaptcha'] = dirname( __FILE__ ) . '/ReCaptcha.i18n.php';
18
19 require_once( 'recaptchalib.php' );
20
21 // Set these in LocalSettings.php
22 $wgReCaptchaPublicKey = '';
23 $wgReCaptchaPrivateKey = '';
24 // For backwards compatibility
25 $recaptcha_public_key = '';
26 $recaptcha_private_key = '';
27
28 $wgExtensionFunctions[] = 'efReCaptcha';
29
30 /**
31  * Make sure the keys are defined.
32  */
33 function efReCaptcha() {
34         global $wgReCaptchaPublicKey, $wgReCaptchaPrivateKey;
35         global $recaptcha_public_key, $recaptcha_private_key;
36         global $wgServerName;
37
38         // Backwards compatibility
39         if ( $wgReCaptchaPublicKey == '' ) {
40                 $wgReCaptchaPublicKey = $recaptcha_public_key;
41         }
42         if ( $wgReCaptchaPrivateKey == '' ) {
43                 $wgReCaptchaPrivateKey = $recaptcha_private_key;
44         }
45
46         if ($wgReCaptchaPublicKey == '' || $wgReCaptchaPrivateKey == '') {
47                 die ('You need to set $wgReCaptchaPrivateKey and $wgReCaptchaPublicKey in LocalSettings.php to ' .
48                      "use the reCAPTCHA plugin. You can sign up for a key <a href='" .
49                      htmlentities(recaptcha_get_signup_url ($wgServerName, "mediawiki")) . "'>here</a>.");
50         }       
51 }
52
53
54 class ReCaptcha extends SimpleCaptcha {
55                 
56         //reCAPTHCA error code returned from recaptcha_check_answer
57         private $recaptcha_error = null;
58
59                 
60         /** 
61          * Displays the reCAPTCHA widget.  
62          * If $this->recaptcha_error is set, it will display an error in the widget.
63          *
64          */
65         function getForm() {
66                 global $wgReCaptchaPublicKey;
67                 return "<script>var RecaptchaOptions = { tabindex : 1 }; </script> " .
68                 recaptcha_get_html($wgReCaptchaPublicKey, $this->recaptcha_error);
69         }
70
71
72                 
73         /**
74          * Calls the library function recaptcha_check_answer to verify the users input.
75          * Sets $this->recaptcha_error if the user is incorrect.
76          * @return boolean 
77          *
78          */
79         function passCaptcha() {
80                 global $wgReCaptchaPrivateKey;
81                 $recaptcha_response = recaptcha_check_answer ($wgReCaptchaPrivateKey,
82                                                               wfGetIP (),
83                                                               $_POST['recaptcha_challenge_field'],
84                                                               $_POST['recaptcha_response_field']);
85                 if (!$recaptcha_response->is_valid) {
86                         $this->recaptcha_error = $recaptcha_response->error;
87                         return false;
88                 }
89                 $recaptcha_error = null;
90                 return true;
91
92         }
93
94
95
96         /**
97          * Called on all edit page saves. (EditFilter events)
98          * @return boolean - true if page save should continue, false if should display Captcha widget.
99          */
100         function confirmEdit( $editPage, $newtext, $section ) {
101                 if( $this->shouldCheck( $editPage, $newtext, $section ) ) {
102
103                         if (!isset($_POST['recaptcha_response_field'])) {
104                                 //User has not yet been presented with Captcha, show the widget.
105                                 $editPage->showEditForm( array( &$this, 'editCallback' ) );
106                                 return false;
107                         }
108
109                         if( $this->passCaptcha() ) {
110                                 return true;
111                         } else {
112                                 //Try again - show the widget
113                                 $editPage->showEditForm( array( &$this, 'editCallback' ) );
114                                 return false;
115                         }
116
117                 } else {
118                         wfDebug( "ConfirmEdit: no need to show captcha.\n" );
119                         return true;
120                 }
121         }
122
123         
124
125         /**
126          * Show a message asking the user to enter a captcha on edit
127          * The result will be treated as wiki text
128          *
129          * @param $action Action being performed
130          * @return string
131          */
132         function getMessage( $action ) {
133                 $name = 'recaptcha-' . $action;
134                 $text = wfMsg( $name );
135                 # Obtain a more tailored message, if possible, otherwise, fall back to
136                 # the default for edits
137                 return wfEmptyMsg( $name, $text ) ? wfMsg( 'recaptcha-edit' ) : $text;
138         }
139
140 }