Created page with "{{note|1=This extension is bundled with MediaWiki 1.18 and above. Thus you do not have to download it again.}} {{ {{TN..."
New page
{{note|1=This extension is [[Special:MyLanguage/MediaWiki 1.18#Bundled extensions|bundled with MediaWiki 1.18]] and above. Thus you do not have to download it again.}}
{{ {{TNTN|Extension}}
|name = ConfirmEdit
|type = page action
|author = [[User:Brion VIBBER|Brion Vibber]] and others
|image =
|version = 1.3
|status = stable
|update = 2014-03-26
|mediawiki = 1.20+
|php = 5.3+
|license = GPL
|download = {{ {{TNTN|WikimediaDownload}} |ConfirmEdit}}
|readme =
|changelog =
|hook1 = EditFilterMerged
|hook2 = UserCreateForm
|hook3 = AbortNewAccount
|hook4 = LoginAuthenticateAudit
|hook5 = UserLoginForm
|hook6 = AbortLogin
|hook7 = EmailUserForm
|hook8 = EmailUser
|hook9 = APIEditBeforeSave
|hook10 = APIGetAllowedParams
|hook11 = APIGetParamDescription
|description = Adds CAPTCHAs for page saves and other user actions
|parameters= * $wgCaptchaClass
* $wgCaptchaWhitelistIP
* $wgCaptcha
* $wgCaptchaTriggers
* $wgCaptchaTriggersOnNamespace
* $wgCaptchaStorageClass
* $wgCaptchaSessionExpiration
* $wgCaptchaBadLoginExpiration
* $ceAllowConfirmedEmail
* $wgCaptchaBadLoginAttempts
* $wgCaptchaWhitelist
* $wgCaptchaRegexes
* $wgCaptchaQuestions
* $wgReCaptchaPublicKey
* $wgReCaptchaPrivateKey
|rights = skipcaptcha
|example = [http://img99.imageshack.us/img99/295/confirmeditbj4.jpg One screenshot of ConfirmEdit running on Wikimanga.net]
|pagedrive1 = true
|bugzilla = ConfirmEdit (CAPTCHA extension)
|needs-updatephp = No
}}
The '''ConfirmEdit''' extension lets you use various different [[w:CAPTCHA|CAPTCHA]] techniques, to try to prevent [[w:spambot|spambots]] and other automated tools from editing your wiki, as well as to foil automated login attempts that try to guess passwords.
ConfirmEdit ships with several techniques/modules to generate captcha.
{| class="wikitable"
|-
! Module !! Description !! Effectiveness at stopping spam
|-
| <tt>SimpleCaptcha</tt> || Users have to solve a '''simple''' math problem. || Low
|-
| <tt>FancyCaptcha</tt> || Users have to identify a series of characters, displayed in a stylized way. || Low
|-
| <tt>MathCaptcha</tt> || Users have to solve a math problem that's displayed as an image. || Low
|-
| <tt>[[Special:Mylanguage/Extension:QuestyCaptcha|QuestyCaptcha]]</tt> || Users have to answer a question, out of a series of questions defined by the administrator(s). || Very high, until cracked
|-
| <tt>[[Special:Mylanguage/Extension:Asirra|Asirra]]</tt> || Users have to identify the cats in a set of photos of cats and dogs, from a widget provided by the [http://research.microsoft.com/en-us/um/redmond/projects/asirra/ Asirra] service. || High
|-
| <tt>ReCaptcha</tt> || Users have to identify a series of characters, either visually or audially, from a widget provided by the [http://www.google.com/recaptcha reCAPTCHA] service. || Medium
|}
Some of these modules require additional setup work:
* MathCaptcha requires both the presence of TeX and, for versions of MediaWiki after 1.17, the [[Extension:Math|Math]] extension;
* FancyCaptcha requires running a preliminary setup script in Python;
* and reCAPTCHA requires obtaining API keys.
Caveats: CAPTCHAs reduce accessibility and cause inconvenience to human users. In addition, they are not 100% effective against bots, and they will not protect your wiki from spammers who are willing and able to use human labor to get through the CAPTCHAs. You may wish to use ConfirmEdit in conjunction with other [[Special:Mylanguage/Manual:combating spam|anti-spam features]]. Regardless of the solution you use, if you have a publicly-editable wiki it's important to keep monitoring the "Recent changes" page.
==Installation==
{{ {{TNTN|ExtensionInstall}}
|repo-name=ConfirmEdit
|custom-steps=* [[#CAPTCHA types|Enable the CAPTCHA type]] which should be used
* [[#Configuration|Configure]] as needed
}}
{{Note}} ConfirmEdit may not work if used with a MediaWiki version different from the one specified when downloading via the "Extension distributor".
==CAPTCHA types==
There are numerous different CAPTCHA types included with ConfirmEdit.
===QuestyCaptcha===
This module presents a question and the user supplies the answer. You provide the questions in the configuration. This module has proven to offer a strong mechanism against spam bots; it also should have the advantage of a better [[accessibility]], as textual questions can be read by text-to-speech software allowing visually impaired users (but not bots) to answer correctly.
Set the following to enable this CAPTCHA:
<source lang="php">
require_once "$IP/extensions/ConfirmEdit/QuestyCaptcha.php";
$wgCaptchaClass = 'QuestyCaptcha';
$arr = array (
"A question?" => "An answer!",
"What is this wiki's name?" => "$wgSitename",
'Please write the magic secret, "passion", here:' => 'passion',
'Type the code word, 567, here:' => '567',
'Which animal? <img src="http://www.example.com/path/to/filename_not_including_dog.jpg" alt="" title="" />' => 'dog',
);
foreach ( $arr as $key => $value ) {
$wgCaptchaQuestions[] = array( 'question' => $key, 'answer' => $value );
}
</source>
It will randomly choose a question from those supplied. The minimum is one.
*The answer must be easy to guess for a human interested in your wiki, but not by an automatic program. Ideally, it should not be contained in the text of the question; you can try and edit the captcha help messages<ref>MediaWiki:Questycaptchahelp-text, MediaWiki:Questycaptcha-edit, MediaWiki:Questycaptcha-addurl, MediaWiki:Questycaptcha-create and MediaWiki:Questycaptcha-createaccount.</ref> and provide the solution to the captcha response there.
*Just change the questions when/if they start proving ineffective; this may never happen if your wiki is not specifically targeted.
*Don't ever reuse questions already used by you or others in the past: spambots are known to remember a question and its answer forever once they broke it.
*You can get even smarter, with questions like «What is the output of "date -u +%V`uname`|sha256sum|sed 's/\W//g'"?».
*And other '''[http://thingelstad.com/stopping-mediawiki-spam-with-dynamic-questy-captchas/ dynamic questy captchas]'''.
===Asirra===
[[Image:Extension confirmedit asirra.png|220px|right]]
This module displays the [http://research.microsoft.com/en-us/um/redmond/projects/asirra/ Asirra] (Animal Species Image Recognition for Restricting Access) widget, created by Microsoft Research. The widget shows 12 random images from the [http://petfinder.com/ Petfinder] pet-adoption website, all of which are of either a cat or a dog, and asks the user to select only the images of cats.
Image recognition is an inherently more difficult task for computers than character recognition; and the use of Petfinder's massive, and ever-changing, database of millions of images makes it seemingly impossible for spammers to attempt to beat the system via some shortcut. It should be noted, though, that [http://crypto.stanford.edu/~pgolle/papers/dogcat.html some research exists] showing that image-recognition software can beat Asirra at least 10% of the time. Still, Asirra may possibly be the most secure of the modules within ConfirmEdit.
*'''Note:''' in order to use Asirra, you will need to download the latest/trunk version of ConfirmEdit.
*'''Note:''' Currently reported to not work with all browsers (especially IE 8 and 9) even if using the latest/trunk version.
Add the following to LocalSettings.php to enable this CAPTCHA:
<source lang="php">
require_once "$IP/extensions/ConfirmEdit/Asirra.php";
</source>
In addition, you can add any of the following configuration parameters:
* <tt>$wgAsirraEnlargedPosition</tt>: Can be one of <tt>top</tt>, <tt>bottom</tt>, <tt>left</tt>, <tt>right</tt>. Defaults to <tt>bottom</tt>.
* <tt>$wgAsirraCellsPerRow</tt>: Number of images per row. Defaults to <tt>6</tt>.
* <tt>$wgAsirraScriptPath</tt>: If your extensions directory is outside the document root, or not accessible for any reason, you can set an alternative path to this module's JavaScript scripts here.
Some sysadmins have reported that present versions of Asirra will fail to allow the user to pass the CAPTCHA, even if he selects all kittens correctly, unless you download the [[Extension:Asirra]] and use <code>extensions/Asirra</code> as the path instead of <code>extensions/ConfirmEdit/Asirra/</code>.
===ReCaptcha===
[[File:Captcha for Extension ConfirmEdit.jpg|right|thumb|300px|Example screenshot of ReCaptcha]]
This module uses the "reCAPTCHA" widget/service. In addition to providing a CAPTCHA, it performs a valuable service because it helps to digitize old books ([http://www.google.com/recaptcha/learnmore read more here].)
To use this module, first go [https://www.google.com/recaptcha/admin/create here] and obtain a public and private key for your wiki.
Add the following to LocalSettings.php, below the inclusion of ConfirmEdit:
<source lang="php">
require_once "$IP/extensions/ConfirmEdit/ReCaptcha.php";
$wgCaptchaClass = 'ReCaptcha';
$wgReCaptchaPublicKey = 'your public key here';
$wgReCaptchaPrivateKey = 'your private key here';
</source>
* Recaptcha is only in the latest 1.18 version of ConfirmEdit. Earlier versions do not have the reCAPTCHA PHP files.
* Unfortunately, as of 2011, some spammers appear to have figured out a way to bypass it, either through character recognition or by using humans. For that reason, it is not necessarily recommended.
* Part of the weakness of the ReCaptcha module is that ConfirmEdit doesn't include any penalty mechanism, so spam bots can simply keep trying to bypass the CAPTCHA until they get through. This is an issue that is strongly worth addressing in some way.
* Regardless of its strengths or weaknesses, reCAPTCHA can't be implemented on Wikimedia wikis because it produces a third-party dependency.
=== Are You A Human (aka PlayThru) ===
'''NB: Not yet merged into ConfirmEdit, pending code review; applying the patch is your own decision. → https://gerrit.wikimedia.org/r/#/c/65797/'''
{{note|The actual CAPTCHA is proprietary like Asirra and ReCaptcha and English only, but unlike them requires (gratis) keys and may embed ads, specifically "branded games".[http://areyouahuman.com/faq/]}}
This module uses the [http://areyouahuman.com/ Are You A Human?] service ([http://areyouahuman.com/demo/ demo]), which is an alternative to distorted text-based CAPTCHAs. Like Asirra, it presents a small JavaScript-based puzzle that the user must complete, usually of the form of matching appropriate objects. It includes audio support for the visually impaired.
To use this module:
# Go [http://portal.areyouahuman.com/signup here] and obtain Publisher and Scoring keys for your domain and wiki.
#* When given the choice, select "embedded" style, rather than the default LightBox style. LightBox may work, but it hasn't been tested.
#* Enter the domain ''precisely'' how it appears in $wgServer, but without the protocol. For example: if your wiki is <tt><nowiki>http://www.mywiki.com</nowiki></tt>, use <tt>www.mywiki.com</tt>. Entering <tt>mywiki.com</tt> will not work.
#* MediaWiki is not listed as one of the officially supported platforms, so choose PHP instead.
# Download the [http://portal.areyouahuman.com/installation/php AYAH PHP integration library] when given the option.
# Unpack the PHP integration library and put <tt>ayah.php</tt> and <tt>ayah_config.php</tt> into <code>$IP/extensions/ConfirmEdit/AreYouAHuman/</code>.
# Edit <tt>ayah_config.php</tt> with your API keys
# Add the following to LocalSettings.php:
<source lang="php">
require_once "$IP/extensions/ConfirmEdit/AyahCaptcha.php";
$wgCaptchaClass = 'AyahCaptcha';
</source>
=== Not recommended ===
{{ {{TNTN|Warning}} |The following types are used by very few wikis outside WMF if any, probably because of scarce effectiveness.}}
====SimpleCaptcha (calculation)====
[[File:SimleCaptcha screenshot.png|thumb|350px|right|a simple math question.]]
This is the default CAPTCHA. This module provides a simple addition or subtraction question for the user.
Add the following lines to LocalSettings.php in the root of your MediaWiki to enable this CAPTCHA:
<source lang="php">
$wgCaptchaClass = 'SimpleCaptcha';
</source>
Note that the display of a trivial maths problem as plaintext yields a captcha which can be trivially solved by automated means; as of 2012, sites using SimpleCaptcha are receiving significant amounts of spam and many automated registrations of spurious new accounts. Wikis currently using this default setting should therefore migrate to [[Extension:VisualMathCaptcha|VisualMathCaptcha]] or one of the other CAPTCHAs.
====FancyCaptcha====
[[File:FancyCaptcha screenshot.png|thumb]]
This module displays a stylized image of a set of characters. The [http://www.pythonware.com/products/pil/ Python Imaging Library] must be installed in order to create the set of images initially, but isn't needed after that (can be installed with <code>pip install pil</code> in most environments).
# Add the following lines to <tt>LocalSettings.php</tt> in the root of your MediaWiki installation:
#: <code>require_once "$IP/extensions/ConfirmEdit/ConfirmEdit.php";<br />require_once "$IP/extensions/ConfirmEdit/FancyCaptcha.php";<br>$wgCaptchaClass = 'FancyCaptcha';</code>
# In LocalSettings.php, set the variable <tt>$wgCaptchaDirectory</tt> to the directory where you will store Captcha images. Below it set <tt>$wgCaptchaSecret</tt> to your passphrase.
# Create the images by running the following, where:
#* '''font''' is a path to some font, for instance AriBlk.TTF.
#* '''wordlist''' is a path to some word list, for instance /usr/share/dict/words. (Note: on Debian/Ubuntu, the 'wbritish' and 'wamerican' packages provide such lists. On Fedora, use the 'words' package).
#* '''key''' is the the exact passphrase you set <tt>$wgCaptchaSecret</tt> to. Use quotes if necessary.
#* '''output''' is the path to where the images should be stored (defined in <tt>$wgCaptchaDirectory</tt>).
#* '''count''' is how many images to generate.
#: <code><nowiki>python /path/to/captcha.py --font=<font> --wordlist=<wordlist> --key=<key> --output=<output> --count=<count></nowiki></code>
#* An example, assuming you're in the extensions/ConfirmEdit directory (font location from Ubuntu 6.06, probably different on other operating systems):
#: <code>python captcha.py --font=/usr/share/fonts/truetype/freefont/FreeSans.ttf --wordlist=/usr/share/dict/words --key=FOO --output=../../../captcha --count=100</code>
#* If you are not satisfied with the results of the words you've generated you can simply remove the images and create a new set. Comic_Sans_MS_Bold.ttf seems to generate relatively legible words, and you could also edit the last line of captcha.py to increase the font size from the default of 40.
# Put the images you get into captcha directory in your installation
# Edit your wiki's [[Manual:LocalSettings.php|LocalSettings.php]]: specify full path to your captcha directory in $wgCaptchaDirectory and secret key you've been using while generating captures in $wgCaptchaSecret
<source lang="php">
$wgCaptchaDirectory = "/.php-data/my-wiki.org/wiki/captcha";
$wgCaptchaDirectoryLevels = 0; // Set this to a value greater than zero to break the images into subdirectories
$wgCaptchaSecret = "FOO"; // same value you used in --key option in captcha.py
</source>
See also [[wikitech:Generating CAPTCHAs]] for how Wikimedia Foundation does it.
===== How to avoid common problems running Python =====
# Install the most recent version of [http://www.pythonware.com/products/pil/ Python Imaging Library (PIL)].
# Make the installation of Python on a short folder name. Like '''C:\Python\'''
# Create a folder like '''C:\Ex''' and place files '''CAPTCHA.py / FONT.ttf / LIST.txt''' into the folder.
# To execute easily, run the following example as a [[w:en:Batch_file#Example|batch]] file:
<small><pre>
C:\python\python.exe C:\Ex\CAPTCHA.py --font C:\Ex\FONT.ttf --wordlist C:\Ex\LIST.txt --key=YOURPASSWORD --output C:\Ex\ --count=20
</pre></small>
====MathCaptcha====
:'''This requires the [[Extension:Math|Math extension]] to be installed.<br/>Until MediaWiki 1.18 this was part of MediaWiki, later versions need to install it manually. See also [[Extension:Math]]'''
This module generates an image using TeX to ask a basic math question.
Set the following to enable this CAPTCHA:
<source lang="php">
require_once "$IP/extensions/ConfirmEdit/MathCaptcha.php";
$wgCaptchaClass = 'MathCaptcha';
</source>
See the readme file in the math folder to install this captcha.
==Outside extensions==
===VisualMathCaptcha===
The extension [[Extension:VisualMathCaptcha|VisualMathCaptcha]] can also be used, in conjunction with ConfirmEdit. See that extension's documentation for how to install and configure it.
==Configuration==
ConfirmEdit introduces a 'skipcaptcha' permission type to [[Manual:$wgGroupPermissions|wgGroupPermissions]]. This lets you set certain groups to never see CAPTCHAs. All of the following can be added to localsettings.php.
Defaults from ConfirmEdit.php:
<source lang="php">
$wgGroupPermissions['*' ]['skipcaptcha'] = false;
$wgGroupPermissions['user' ]['skipcaptcha'] = false;
$wgGroupPermissions['autoconfirmed']['skipcaptcha'] = false;
$wgGroupPermissions['bot' ]['skipcaptcha'] = true; // registered bots
$wgGroupPermissions['sysop' ]['skipcaptcha'] = true;
</source>
To skip captchas for users that confirmed their email, you need to both set:
<source lang="php">
$wgGroupPermissions['emailconfirmed']['skipcaptcha'] = true;
$ceAllowConfirmedEmail = true;</source>
There are five "triggers" on which CAPTCHAs can be displayed:
* 'edit' - triggered on every attempted page save
* 'create' - triggered on page creation
* 'addurl' - triggered on a page save that would add one or more URLs to the page
* 'createaccount' - triggered on creation of a new account
* 'badlogin' - triggered on the next login attempt after a failed one. Requires $wgMainCacheType to be set to something other than <tt>CACHE_NONE</tt> in your <tt>LocalSettings.php</tt>, if in doubt the following will always work
<syntaxhighlight lang="php">$wgMainCacheType = CACHE_ANYTHING;</syntaxhighlight>
The default values for these are:
<source lang="php">
$wgCaptchaTriggers['edit'] = false;
$wgCaptchaTriggers['create'] = false;
$wgCaptchaTriggers['addurl'] = true;
$wgCaptchaTriggers['createaccount'] = true;
$wgCaptchaTriggers['badlogin'] = true;
</source>
The triggers <code>edit</code>, <code>create</code> and <code>addurl</code> can be configured per namespace using the <code>$wgCaptchaTriggersOnNamespace</code> setting. If there is no <code>$wgCaptchaTriggersOnNamespace</code> for the current namespace, the normal <code>$wgCaptchaTriggers</code> apply. So suppose that in addition to the above <code>$wgCaptchaTriggers</code> defaults we configure the following:
<source lang="php">
$wgCaptchaTriggersOnNamespace[NS_TALK]['addurl'] = false;
$wgCaptchaTriggersOnNamespace[NS_PROJECT]['edit'] = true;
</source>
Then the CAPTCHA will not trigger when adding URLs to a talk page, but on the other hand user will need to solve a CAPTCHA any time they try to edit a page in the project namespace, even if they aren't adding a link.
=== URL and IP whitelists ===
It is possible to define a whitelist of known "good" sites for which the CAPTCHA should not kick in, when the 'addurl' action is triggered.
Sysop users can do this by editing the system message page called <nowiki>[[MediaWiki:Captcha-addurl-whitelist]]</nowiki>. The expected format is a set of regex's one per line. Comments can be added with # prefix. You can see an example of this usage [http://wiki.openstreetmap.org/index.php/MediaWiki:Captcha-addurl-whitelist on OpenStreetMap].
This set of whitelist regexes can also be defined using the $wgCaptchaWhitelist config variable in LocalSettings.php, to keep the value(s) a secret.
Some other variables you can add to LocalSettings.php:
* $wgCaptchaWhitelistIP - List of IP ranges to allow to skip the CAPTCHA
* $ceAllowConfirmedEmail - Allow users who have confirmed their e-mail addresses to post URL links
These are described more thoroughly in the code comments
=== Regular expressions ===
The global variable wgCaptchaRegexes accepts an array of regexes to be tested against the page text and will trigger the CAPTCHA in case of a match.
=== Wikimedia projects ===
For example, [[Wikimedia Foundation]] wikis use FancyCaptcha with a custom set of images and the default configuration, modified by what follows.
<syntaxhighlight lang="php">
$wgGroupPermissions['autoconfirmed']['skipcaptcha'] = true;
</syntaxhighlight>
This means only unregistered and [[m:newly registered user|newly registered users]] have to pass the CAPTCHA.
==== EmergencyCaptcha mode ====
Additionally the shortcut named <code>$wmgEmergencyCaptcha</code> is designed for use in a limited number of emergency situations, for instance in case of massive vandalism or spam attacks: it changes the default trigger values (see above) into the following:
<syntaxhighlight lang="php">
$wgCaptchaTriggers['edit'] = true;
$wgCaptchaTriggers['create'] = true;
</syntaxhighlight>
So all anonymous and new users have to solve a CAPTCHA also before being able to save an edit or create a new page, in addition to the normal situation.
== Test plan ==
See [[ConfirmEdit Test Plan]].
== Patch for even more spam protection ==
This is a patch to allow experienced users to bring in external links without solving a captcha, regardless she has skipcaptcha permissions. A user is considered to be trusted if she has a large number of edits.
This patch also prohibits new users from adding _any_ external links. Such behaviour should help a lot to tackle spam, because the whole reason of spam is to add such links (they call it "link building") and spam is almost always added by newly created users.
Configuration:
Apply the patch to extensions/ after unpacking ConfirmEdit 1.2. If you want to deviate from the
defaults, add this to LocalSettings.php:
<syntaxhighlight lang="php">
# Don't ask for a captcha for users with more than this number of edits.
$wgCaptchaTrustedThreshold = 150; // default 100
# Always reject edits adding new external links with less than this number of edits.
$wgCaptchaNewbieThreshold = 10; // default 5
</syntaxhighlight>
The patch isn't as well honed as it could be, for example user messages aren't localized. Also, the refusal for newbies to add external links applies no matter which permissions a user has. Other than that, it appears to work just fine. For a wiki using this patch, see http://reprap.org.
Markus "Traumflug" Hitter, September 2013, <mah@jump-ing.de>
<syntaxhighlight lang="diff">
--- ConfirmEdit/Captcha.php.2013-09-06 2013-05-28 12:10:57.000000000 -0700
+++ ConfirmEdit/Captcha.php 2013-09-08 10:30:12.000000000 -0700
@@ -1,6 +1,9 @@
<?php
class SimpleCaptcha {
+
+ private $newLinks = null;
+
function getCaptcha() {
$a = mt_rand( 0, 100 );
$b = mt_rand( 0, 10 );
@@ -62,6 +65,21 @@
}
/**
+ * Insert the captcha prompt into an edit form.
+ * @param OutputPage $out
+ */
+ function newbieCallback( &$out ) {
+ global $wgCaptchaNewbieThreshold, $wgUser;
+ $count = $wgUser->getEditCount();
+ $out->addWikiText( "As a spam protection measure, users with fewer than
+ $wgCaptchaNewbieThreshold edits are '''not''' allowed
+ to add ''external'' links. Please use internal links
+ instead (which is always to be perferred) or raise
+ your edit count by doing a few edits without links.
+ \n\nYour edit count is $count.\n\n" );
+ }
+
+ /**
* Show a message asking the user to enter a captcha on edit
* The result will be treated as wiki text
*
@@ -237,6 +255,34 @@
/**
* @param $editPage EditPage
* @param $newtext string
+ * @param $merged bool
+ * @return an array with the number of newly added links
+ */
+ function findNewLinks( &$editPage, $newtext, $merged ) {
+ if ( $this->newLinks != null )
+ return $this->newLinks;
+
+ if ( $merged ) {
+ // Get links from the database
+ $oldLinks = $this->getLinksFromTracker( $editPage->mArticle->getTitle() );
+ // Share a parse operation with Article::doEdit()
+ $editInfo = $editPage->mArticle->prepareTextForEdit( $newtext );
+ $newLinks = array_keys( $editInfo->output->getExternalLinks() );
+ } else {
+ // Get link changes in the slowest way known to man
+ $oldtext = $this->loadText( $editPage, $section );
+ $oldLinks = $this->findLinks( $editPage, $oldtext );
+ $newLinks = $this->findLinks( $editPage, $newtext );
+ }
+
+ $unknownLinks = array_filter( $newLinks, array( &$this, 'filterLink' ) );
+ $this->newLinks = array_diff( $unknownLinks, $oldLinks );
+ return $this->newLinks;
+ }
+
+ /**
+ * @param $editPage EditPage
+ * @param $newtext string
* @param $section string
* @param $merged bool
* @return bool true if the captcha should run
@@ -246,6 +292,18 @@
$title = $editPage->mArticle->getTitle();
global $wgUser;
+
+ // Users with more than $wgCaptchaTrustedThreshold edits
+ // are considered to be trusted, so they don't need a captcha.
+ global $wgCaptchaTrustedThreshold;
+ if ( ! isset( $wgCaptchaTrustedThreshold ) )
+ $wgCaptchaTrustedThreshold = 100;
+ if ( $wgUser->getEditCount() > $wgCaptchaTrustedThreshold ) {
+ wfDebug( "ConfirmEdit: trusted user, skipping captcha\n" );
+ return false;
+ }
+
if ( $wgUser->isAllowed( 'skipcaptcha' ) ) {
wfDebug( "ConfirmEdit: user group allows skipping captcha\n" );
return false;
@@ -284,22 +341,7 @@
}
if ( $this->captchaTriggers( $editPage, 'addurl' ) ) {
- // Only check edits that add URLs
- if ( $merged ) {
- // Get links from the database
- $oldLinks = $this->getLinksFromTracker( $title );
- // Share a parse operation with Article::doEdit()
- $editInfo = $editPage->mArticle->prepareTextForEdit( $newtext );
- $newLinks = array_keys( $editInfo->output->getExternalLinks() );
- } else {
- // Get link changes in the slowest way known to man
- $oldtext = $this->loadText( $editPage, $section );
- $oldLinks = $this->findLinks( $editPage, $oldtext );
- $newLinks = $this->findLinks( $editPage, $newtext );
- }
-
- $unknownLinks = array_filter( $newLinks, array( &$this, 'filterLink' ) );
- $addedLinks = array_diff( $unknownLinks, $oldLinks );
+ $addedLinks = $this->findNewLinks( $editPage, $newtext, $merged );
$numLinks = count( $addedLinks );
if ( $numLinks > 0 ) {
@@ -469,6 +511,21 @@
# The CAPTCHA was already checked and approved
return true;
}
+
+ // Always reject edits of newbies adding external links.
+ global $wgCaptchaNewbieThreshold, $wgUser;
+ if ( ! isset( $wgCaptchaNewbieThreshold ) )
+ $wgCaptchaNewbieThreshold = 5;
+ if ( $wgUser->getEditCount() < $wgCaptchaNewbieThreshold ) {
+ $addedLinks = $this->findNewLinks( $editPage, $newtext, $merged );
+ if ( count( $addedLinks ) > 0 ) {
+ wfDebug( "ConfirmEdit: rejecting newbie edit due to new links\n" );
+ $editPage->showEditForm( array( &$this, 'newbieCallback' ) );
+ return false;
+ }
+ }
+
if ( !$this->doConfirmEdit( $editPage, $newtext, $section, $merged ) ) {
$editPage->showEditForm( array( &$this, 'editCallback' ) );
return false;
</syntaxhighlight>
===Experience with this patch===
After two months with this patch, we still wait for the first spam edit. Other than spambots still creating accounts, misuse of [http://reprap.org our wiki] has completely disappeared.
Legitimate users apparently understand the error message. No complaints, but occasionally useless edits to raise the edit count appear. Typically, these users revert their useless edits without maintainer intervention. Exactly like planned.
-- [http://reprap.org/wiki/User:Traumflug Traumflug@reprap.org]
==Authors==
The basic framework was designed largely by [[User:Brion VIBBER|Brion Vibber]], who also wrote the SimpleCaptcha and FancyCaptcha modules. The Asirra module was written by [[User:Bachsau|Bachsau]]. The MathCaptcha module was written by [[User:Robchurch|Rob Church]]. The QuestyCaptcha module was written by [[User:Emufarmers|Benjamin Lees]]. The reCAPTCHA module was written by Mike Crawford and Ben Maurer. Additional maintenance work was done by [[User:Yaron Koren|Yaron Koren]].
==Notes==
<references/>
==See also==
* [[Special:MyLanguage/Anti-spam features|Anti-spam features]]
* [[Special:MyLanguage/Extension:SpamRegex|Extension:SpamRegex]]
* [[Special:MyLanguage/Extension:KittenAuth|Extension:KittenAuth]]
* [[Special:MyLanguage/Manual:$wgSpamRegex|Manual:$wgSpamRegex]]
{{OnWikimedia}}
{{Languages}}
[[Category:Edit extensions{{translation}}]]
[[Category:Spam management extensions{{translation}}]]