r23122 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r23121‎ | r23122 | r23123 >
Date:10:00, 20 June 2007
Author:raymond
Status:old
Tags:
Comment:
* URL whitelist added ([[MediaWiki:Captcha-addurl-whitelist]]), uses same syntax as [[MediaWiki:spam-whitelist]] from the SpamBlacklist extension.
Regex building code copied from SpamBlacklist extension.
Modified paths:
  • /trunk/extensions/ConfirmEdit/ConfirmEdit.i18n.php (modified) (history)
  • /trunk/extensions/ConfirmEdit/ConfirmEdit.php (modified) (history)

Diff [purge]

Index: trunk/extensions/ConfirmEdit/ConfirmEdit.i18n.php
@@ -28,6 +28,12 @@
2929 Unfortunately this may inconvenience users with limited vision or using text-based or speech-based browsers. At the moment we do not have an audio alternative available. Please contact the site administrators for assistance if this is unexpectedly preventing you from making legitimate posts.
3030
3131 Hit the 'back' button in your browser to return to the page editor.",
 32+ 'captcha-addurl-whitelist' => '
 33+ #<!-- leave this line exactly as it is --> <pre>
 34+# Syntax is as follows:
 35+# * Everything from a "#" character to the end of the line is a comment
 36+# * Every non-blank line is a regex fragment which will only match hosts inside URLs
 37+ #</pre> <!-- leave this line exactly as it is -->',
3238 );
3339
3440 $wgConfirmEditMessages['af'] = array(
@@ -134,6 +140,12 @@
135141 'captchahelp-title' => 'Captcha-Hilfe',
136142 'captchahelp-cookies-needed' => "'''Wichtiger Hinweis:''' Es müssen Cookies im Browser erlaubt sein.",
137143 'captchahelp-text' => "Internetangebote, die für Beiträge von praktisch jedem offen sind — so wie das {{SITENAME}}-Wiki — werden oft von Spammern missbraucht, die ihre Links automatisch auf vielen Webseiten platzieren. Diese Spam-Links können wieder entfernt werden, sie sind aber ein erhebliches Ärgernis. In manchen Fällen, insbesondere beim Hinzufügen von neuen Weblinks zu einer Seite, kann es vorkommen, dass dieses Wiki ein Bild mit einem farbigen und verzerrten Text anzeigt und dazu auffordert, die angezeigten Wörter einzutippen. Da eine solche Aufgabe nur schwer automatisch erledigt werden kann, werden dadurch die meisten Spammer, die mit automatischen Werkzeugen arbeiten, gestoppt, wogegen menschliche Benutzer ihren Beitrag absenden können. Leider kann dies zu Schwierigkeiten für Personen führen, die über eine eingeschränkte Sehfähigkeit verfügen oder text- oder sprachbasierte Browser verwenden. Eine Lösung ist die reguläre Anmeldung als Benutzer. Der „Zurück“-Knopf des Browsers führt zurück in das Bearbeitungsfenster.",
 144+ 'captcha-addurl-whitelist' => '
 145+ #<!-- leave this line exactly as it is --> <pre>
 146+# Syntax:
 147+# * Alles von einem #-Zeichen bis zum Ende der Zeile ist ein Kommentar
 148+# * Jeder nicht-leere Zeile ist ein Regex-Fragment, das gegenüber den Hostnamen einer URL geprüft wird
 149+ #</pre> <!-- leave this line exactly as it is -->',
138150 );
139151
140152 $wgConfirmEditMessages['es'] = array(
Index: trunk/extensions/ConfirmEdit/ConfirmEdit.php
@@ -140,7 +140,7 @@
141141 * Regex to whitelist URLs to known-good sites...
142142 * For instance:
143143 * $wgCaptchaWhitelist = '#^https?://([a-z0-9-]+\\.)?(wikimedia|wikipedia)\.org/#i';
144 - * @fixme Use the 'spam-whitelist' thingy instead?
 144+ * Local admins can define a whitelist under [[MediaWiki:captcha-addurl-whitelist]]
145145 */
146146 $wgCaptchaWhitelist = false;
147147
@@ -480,15 +480,79 @@
481481
482482 /**
483483 * Filter callback function for URL whitelisting
 484+ * @param string url to check
484485 * @return bool true if unknown, false if whitelisted
485486 * @access private
486487 */
487488 function filterLink( $url ) {
488489 global $wgCaptchaWhitelist;
489 - return !( $wgCaptchaWhitelist && preg_match( $wgCaptchaWhitelist, $url ) );
 490+ $whitelist = false;
 491+ $source = wfMsgForContent( 'captcha-addurl-whitelist' );
 492+
 493+ if( $source && $source != '&lt;captcha-addurl-whitelist&gt;' ) {
 494+ $whitelist = $this->buildRegexes( explode( "\n", $source ) );
 495+ }
 496+
 497+ if ( $whitelist === false && $wgCaptchaWhitelist === false ) {
 498+ // $whitelist is empty, $wgCaptchaWhitelist is default
 499+ return true;
 500+ } elseif ( $whitelist === false && $wgCaptchaWhitelist !== false ) {
 501+ // $whitelist is empty
 502+ return !( preg_match( $wgCaptchaWhitelist, $url ) );
 503+ } else {
 504+ return !( preg_match( $wgCaptchaWhitelist, $url ) || preg_match( $whitelist, $url ) );
 505+ }
490506 }
491507
492508 /**
 509+ * Build regex from whitelist
 510+ * @param string lines from [[MediaWiki:Captcha-addurl-whitelist]]
 511+ * @return string Regex or bool false if whitelist is empty
 512+ * @access private
 513+ */
 514+ function buildRegexes( $lines ) {
 515+ # Code duplicated from the SpamBlacklist extension (r19197)
 516+
 517+ # Strip comments and whitespace, then remove blanks
 518+ $lines = array_filter( array_map( 'trim', preg_replace( '/#.*$/', '', $lines ) ) );
 519+
 520+ # No lines, don't make a regex which will match everything
 521+ if ( count( $lines ) == 0 ) {
 522+ wfDebug( "No lines\n" );
 523+ return false;
 524+ } else {
 525+ # Make regex
 526+ # It's faster using the S modifier even though it will usually only be run once
 527+ //$regex = 'http://+[a-z0-9_\-.]*(' . implode( '|', $lines ) . ')';
 528+ //return '/' . str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $regex) ) . '/Si';
 529+ $regexes = '';
 530+ $regexStart = '/http:\/\/+[a-z0-9_\-.]*(';
 531+ $regexEnd = ')/Si';
 532+ $regexMax = 4096;
 533+ $build = false;
 534+ foreach( $lines as $line ) {
 535+ // FIXME: not very robust size check, but should work. :)
 536+ if( $build === false ) {
 537+ $build = $line;
 538+ } elseif( strlen( $build ) + strlen( $line ) > $regexMax ) {
 539+ $regexes .= $regexStart .
 540+ str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $build) ) .
 541+ $regexEnd;
 542+ $build = $line;
 543+ } else {
 544+ $build .= '|' . $line;
 545+ }
 546+ }
 547+ if( $build !== false ) {
 548+ $regexes .= $regexStart .
 549+ str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $build) ) .
 550+ $regexEnd;
 551+ }
 552+ return $regexes;
 553+ }
 554+ }
 555+
 556+ /**
493557 * The main callback run on edit attempts.
494558 * @param EditPage $editPage
495559 * @param string $newtext

Status & tagging log