summaryrefslogtreecommitdiff
path: root/extensions/ConfirmEdit/ReCaptcha.php
blob: b068b86eab87a093db41451d2456682942d2707b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php

/**
 * Captcha class using the reCAPTCHA widget. 
 * Stop Spam. Read Books.  
 *
 * @addtogroup Extensions
 * @author Mike Crawford <mike.crawford@gmail.com>
 * @copyright Copyright (c) 2007 reCAPTCHA -- http://recaptcha.net
 * @licence MIT/X11
 */

if( !defined( 'MEDIAWIKI' ) ) {
	exit;
}

$wgExtensionMessagesFiles['ReCaptcha'] = dirname( __FILE__ ) . '/ReCaptcha.i18n.php';

require_once( 'recaptchalib.php' );

// Set these in LocalSettings.php
$wgReCaptchaPublicKey = '';
$wgReCaptchaPrivateKey = '';
// For backwards compatibility
$recaptcha_public_key = '';
$recaptcha_private_key = '';

$wgExtensionFunctions[] = 'efReCaptcha';

/**
 * Make sure the keys are defined.
 */
function efReCaptcha() {
	global $wgReCaptchaPublicKey, $wgReCaptchaPrivateKey;
	global $recaptcha_public_key, $recaptcha_private_key;
	global $wgServerName;

	// Backwards compatibility
	if ( $wgReCaptchaPublicKey == '' ) {
		$wgReCaptchaPublicKey = $recaptcha_public_key;
	}
	if ( $wgReCaptchaPrivateKey == '' ) {
		$wgReCaptchaPrivateKey = $recaptcha_private_key;
	}

	if ($wgReCaptchaPublicKey == '' || $wgReCaptchaPrivateKey == '') {
		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='" .
		     htmlentities(recaptcha_get_signup_url ($wgServerName, "mediawiki")) . "'>here</a>.");
	}	
}


class ReCaptcha extends SimpleCaptcha {

	//reCAPTHCA error code returned from recaptcha_check_answer
	private $recaptcha_error = null;

	/**
	 * Displays the reCAPTCHA widget.
         * If $this->recaptcha_error is set, it will display an error in the widget.
	 *
         */
	function getForm() {
		global $wgReCaptchaPublicKey;
		$useHttps = ( isset( $_SERVER['HTTPS'] ) && $_SERVER['HTTPS'] == 'on' );
		return "<script>var RecaptchaOptions = { tabindex : 1 }; </script> " .
			recaptcha_get_html($wgReCaptchaPublicKey, $this->recaptcha_error, $useHttps);
	}

	/**
	 * Calls the library function recaptcha_check_answer to verify the users input.
	 * Sets $this->recaptcha_error if the user is incorrect.
         * @return boolean
         *
         */
	function passCaptcha() {
		global $wgReCaptchaPrivateKey;
		$recaptcha_response = recaptcha_check_answer ($wgReCaptchaPrivateKey,
							      wfGetIP (),
							      $_POST['recaptcha_challenge_field'],
							      $_POST['recaptcha_response_field']);
                if (!$recaptcha_response->is_valid) {
			$this->recaptcha_error = $recaptcha_response->error;
			return false;
                }
		$recaptcha_error = null;
                return true;

	}

	/**
	 * Called on all edit page saves. (EditFilter events)
	 * @return boolean - true if page save should continue, false if should display Captcha widget.
	 */
	function confirmEdit( $editPage, $newtext, $section, $merged = false ) {
		if( $this->shouldCheck( $editPage, $newtext, $section ) ) {

			if (!isset($_POST['recaptcha_response_field'])) {
					//User has not yet been presented with Captcha, show the widget.
					$editPage->showEditForm( array( &$this, 'editCallback' ) );
					return false;
			}

			if( $this->passCaptcha() ) {
					return true;
			} else {
					//Try again - show the widget
					$editPage->showEditForm( array( &$this, 'editCallback' ) );
					return false;
			}

		} else {
			wfDebug( "ConfirmEdit: no need to show captcha.\n" );
			return true;
		}
	}

	/**
	 * Show a message asking the user to enter a captcha on edit
	 * The result will be treated as wiki text
	 *
	 * @param $action Action being performed
	 * @return string
	 */
	function getMessage( $action ) {
		$name = 'recaptcha-' . $action;
		$text = wfMsg( $name );
		# Obtain a more tailored message, if possible, otherwise, fall back to
		# the default for edits
		return wfEmptyMsg( $name, $text ) ? wfMsg( 'recaptcha-edit' ) : $text;
	}

}