* @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 = ''; /** * Make sure the keys are defined. */ function efReCaptcha() { global $wgReCaptchaPublicKey, $wgReCaptchaPrivateKey; global $recaptcha_public_key, $recaptcha_private_key; global $wgServerName; // Backwards compatibility $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 here."); } } 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; return " " . recaptcha_get_html($wgReCaptchaPublicKey, $this->recaptcha_error); } /** * 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 ) { 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; } }