Implement captchas for sending emails via Special:EmailUser.
authorHappy-melon <happy-melon@users.mediawiki.org>
Sat, 10 Apr 2010 21:26:03 +0000 (21:26 +0000)
committerHappy-melon <happy-melon@users.mediawiki.org>
Sat, 10 Apr 2010 21:26:03 +0000 (21:26 +0000)
ConfirmEdit.i18n.php
ConfirmEdit.php
ConfirmEdit_body.php
FancyCaptcha.i18n.php
QuestyCaptcha.i18n.php

index 2fb17ff1571238827a1d6b8b9809c1e72d01da59..59045cfd4ebc992c7a3b67df466d2b5e75f86b64 100644 (file)
@@ -16,6 +16,9 @@ To help protect against automated spam, please solve the simple sum below and en
        'captcha-createaccount'      => 'To help protect against automated account creation, please solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
        'captcha-createaccount-fail' => "Incorrect or missing confirmation code.",
        'captcha-create'             => 'To create the page, please solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
+       'captcha-sendemail'          => 'To help protect against automated spamming, please solve the simple sum below and enter the answer in the box ([[Special:Captcha/help|more info]]):',
+       'captcha-sendemail-fail'     => 'Incorrect or missing confirmation code.',
+       'captcha-disabledinapi'      => 'This action requires a captcha, so it cannot be performed through the API.',
        'captchahelp-title'          => 'Captcha help',
        'captchahelp-cookies-needed' => "You will need to have cookies enabled in your browser for this to work.",
        'captchahelp-text'           => "Web sites that accept postings from the public, like this wiki, are often abused by spammers who use automated tools to post their links to many sites.
index 4f35d832ce8528747367b5d5788d73ec98946093..d2bbc613dcdf2aa1aefa942612077e852b7fbceb 100644 (file)
@@ -88,6 +88,7 @@ $wgCaptchaClass = 'SimpleCaptcha';
 $wgCaptchaTriggers = array();
 $wgCaptchaTriggers['edit']          = false; // Would check on every edit
 $wgCaptchaTriggers['create']           = false; // Check on page creation.
+$wgCaptchaTriggers['sendemail']     = false; // Special:Emailuser
 $wgCaptchaTriggers['addurl']        = true;  // Check on edits that add URLs
 $wgCaptchaTriggers['createaccount'] = true;  // Special:Userlogin&type=signup
 $wgCaptchaTriggers['badlogin']      = true;  // Special:Userlogin after failure
@@ -190,6 +191,8 @@ $wgHooks['AbortNewAccount'][] = 'ConfirmEditHooks::confirmUserCreate';
 $wgHooks['LoginAuthenticateAudit'][] = 'ConfirmEditHooks::triggerUserLogin';
 $wgHooks['UserLoginForm'][] = 'ConfirmEditHooks::injectUserLogin';
 $wgHooks['AbortLogin'][] = 'ConfirmEditHooks::confirmUserLogin';
+$wgHooks['EmailUserForm'][] = 'ConfirmEditHooks::injectEmailUser';
+$wgHooks['EmailUser'][] = 'ConfirmEditHooks::confirmEmailUser';
 # Register API hook
 $wgHooks['APIEditBeforeSave'][] = 'ConfirmEditHooks::confirmEditAPI';
 
index 00359271fe09fcc8633704e59972732e7abf142e..291fb83d1b7e8a38d5d80d5e728cc3f56d3907c2 100644 (file)
@@ -46,6 +46,14 @@ class ConfirmEditHooks {
        static function confirmUserLogin( $u, $pass, &$retval ) {
                return self::getInstance()->confirmUserLogin( $u, $pass, $retval );
        }
+
+       static function injectEmailUser( &$form ) {
+               return self::getInstance()->injectEmailUser( $form );
+       }
+
+       static function confirmEmailUser( $from, $to, $subject, $text, &$error ) {
+               return self::getInstance()->confirmEmailUser( $from, $to, $subject, $text, $error );
+       }
 }
 
 class CaptchaSpecialPage extends UnlistedSpecialPage {
@@ -138,6 +146,28 @@ class SimpleCaptcha {
                return wfEmptyMsg( $name, $text ) ? wfMsg( 'captcha-edit' ) : $text;
        }
 
+       /**
+        * Inject whazawhoo
+        * @fixme if multiple thingies insert a header, could break
+        * @param HTMLForm
+        * @return bool true to keep running callbacks
+        */
+       function injectEmailUser( &$form ) {
+               global $wgCaptchaTriggers, $wgOut, $wgUser;
+               if ( $wgCaptchaTriggers['sendemail'] ) {
+                       if ( $wgUser->isAllowed( 'skipcaptcha' ) ) {
+                               wfDebug( "ConfirmEdit: user group allows skipping captcha on email sending\n" );
+                               return true;
+                       }
+                       $form->addFooterText( 
+                               "<div class='captcha'>" .
+                               $wgOut->parse( $this->getMessage( 'sendemail' ) ) .
+                               $this->getForm() .
+                               "</div>\n" );
+               }
+               return true;
+       }
+
        /**
         * Inject whazawhoo
         * @fixme if multiple thingies insert a header, could break
@@ -564,6 +594,40 @@ class SimpleCaptcha {
                return true;
        }
 
+       /**
+        * Check the captcha on Special:EmailUser 
+        * @param $from MailAddress
+        * @param $to MailAddress
+        * @param $subject String
+        * @param $text String
+        * @param $error String reference
+        * @return Bool true to continue saving, false to abort and show a captcha form
+        */
+       function confirmEmailUser( $from, $to, $subject, $text, &$error ) {
+               global $wgCaptchaTriggers, $wgUser;
+               if ( $wgCaptchaTriggers['sendemail'] ) {
+                       if ( $wgUser->isAllowed( 'skipcaptcha' ) ) {
+                               wfDebug( "ConfirmEdit: user group allows skipping captcha on email sending\n" );
+                               return true;
+                       }
+                       if ( $this->isIPWhitelisted() )
+                               return true;
+               
+                       if ( defined( 'MW_API' ) ) {
+                               # API mode
+                               # Asking for captchas in the API is really silly
+                               $error = wfMsg( 'captcha-disabledinapi' );
+                               return false;
+                       }
+                       $this->trigger = "{$wgUser->getName()} sending email";
+                       if ( !$this->passCaptcha() ) {
+                               $error = wfMsg( 'captcha-sendemail-fail' );
+                               return false;
+                       }
+               }
+               return true;
+       }
+
        /**
         * Given a required captcha run, test form input for correct
         * input on the open session.
index e6f5b1cfc76d62a1e3fea3246dfec19b4489afd2..313fc0f8954ad34232fb6c5c312336214c927f05 100644 (file)
@@ -16,6 +16,7 @@ To help protect against automated spam, please enter the words that appear below
        'fancycaptcha-createaccount' => 'To help protect against automated account creation, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
        'fancycaptcha-create'        => 'To create the page, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
        'fancycaptcha-edit'          => 'To edit this page, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
+       'fancycaptcha-sendemail'     => 'To help protect against automated spamming, please enter the words that appear below in the box ([[Special:Captcha/help|more info]]):',
 );
 
 /** Message documentation (Message documentation)
index df2953c10beae19137c6f53a61e6b617f581e32f..003cafeeea7b94d836dea31ac5012ccd0f797aee 100644 (file)
@@ -16,6 +16,7 @@ To help protect against automated spam, please answer the question that appears
        'questycaptcha-createaccount' => 'To help protect against automated account creation, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
        'questycaptcha-create' => 'To create the page, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
        'questycaptcha-edit' => 'To edit this page, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
+       'questycaptcha-sendemail' => 'To help protect against automated spamming, please answer the question that appears below ([[Special:Captcha/help|more info]]):',
        'questycaptchahelp-text' => "Web sites that accept contributions from the public, like this wiki, are often abused by spammers who use automated tools to add their links to many sites.
 While these spam links can be removed, they are a significant nuisance.