* URL whitelist added ([[MediaWiki:Captcha-addurl-whitelist]]), uses same syntax...
authorRaimond Spekking <raymond@users.mediawiki.org>
Wed, 20 Jun 2007 10:00:47 +0000 (10:00 +0000)
committerRaimond Spekking <raymond@users.mediawiki.org>
Wed, 20 Jun 2007 10:00:47 +0000 (10:00 +0000)
Regex building code copied from SpamBlacklist extension.

ConfirmEdit.i18n.php
ConfirmEdit.php

index cb3bbbec19640a08355d67999509bf28374293f1..cc10f7a11037855f7b8139f2afaafa145e5ec912 100644 (file)
@@ -28,6 +28,12 @@ Sometimes, especially when adding new web links to a page, the wiki may show you
 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.
 
 Hit the 'back' button in your browser to return to the page editor.",
 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.
 
 Hit the 'back' button in your browser to return to the page editor.",
+       'captcha-addurl-whitelist' => '
+ #<!-- leave this line exactly as it is --> <pre> 
+# Syntax is as follows: 
+#   * Everything from a "#" character to the end of the line is a comment
+#   * Every non-blank line is a regex fragment which will only match hosts inside URLs
+ #</pre> <!-- leave this line exactly as it is -->',
 );
 
 $wgConfirmEditMessages['af'] = array(
 );
 
 $wgConfirmEditMessages['af'] = array(
@@ -134,6 +140,12 @@ $wgConfirmEditMessages['de'] = array(
        'captchahelp-title'          => 'Captcha-Hilfe',
        'captchahelp-cookies-needed' => "'''Wichtiger Hinweis:''' Es müssen Cookies im Browser erlaubt sein.",
        '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.",
        'captchahelp-title'          => 'Captcha-Hilfe',
        'captchahelp-cookies-needed' => "'''Wichtiger Hinweis:''' Es müssen Cookies im Browser erlaubt sein.",
        '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.",
+       'captcha-addurl-whitelist' => '
+ #<!-- leave this line exactly as it is --> <pre> 
+#  Syntax:
+#   * Alles von einem #-Zeichen bis zum Ende der Zeile ist ein Kommentar
+#   * Jeder nicht-leere Zeile ist ein Regex-Fragment, das gegenüber den Hostnamen einer URL geprüft wird
+ #</pre> <!-- leave this line exactly as it is -->',
 );
 
 $wgConfirmEditMessages['es'] = array(
 );
 
 $wgConfirmEditMessages['es'] = array(
index 9e746c4cba04c89103716fe10a211aa2da360e92..55fa2fb5a3412909a289dc904ef2606305091f93 100644 (file)
@@ -140,7 +140,7 @@ $ceAllowConfirmedEmail = false;
  * Regex to whitelist URLs to known-good sites...
  * For instance:
  * $wgCaptchaWhitelist = '#^https?://([a-z0-9-]+\\.)?(wikimedia|wikipedia)\.org/#i';
  * Regex to whitelist URLs to known-good sites...
  * For instance:
  * $wgCaptchaWhitelist = '#^https?://([a-z0-9-]+\\.)?(wikimedia|wikipedia)\.org/#i';
- * @fixme Use the 'spam-whitelist' thingy instead?
+ * Local admins can define a whitelist under [[MediaWiki:captcha-addurl-whitelist]]
  */
 $wgCaptchaWhitelist = false;
 
  */
 $wgCaptchaWhitelist = false;
 
@@ -480,12 +480,76 @@ class SimpleCaptcha {
 
        /**
         * Filter callback function for URL whitelisting
 
        /**
         * Filter callback function for URL whitelisting
+        * @param string url to check
         * @return bool true if unknown, false if whitelisted
         * @access private
         */
        function filterLink( $url ) {
                global $wgCaptchaWhitelist;
         * @return bool true if unknown, false if whitelisted
         * @access private
         */
        function filterLink( $url ) {
                global $wgCaptchaWhitelist;
-               return !( $wgCaptchaWhitelist && preg_match( $wgCaptchaWhitelist, $url ) );
+               $whitelist = false;
+               $source = wfMsgForContent( 'captcha-addurl-whitelist' );
+
+               if( $source && $source != '&lt;captcha-addurl-whitelist&gt;' ) {
+                       $whitelist = $this->buildRegexes( explode( "\n", $source ) );
+               }
+
+               if ( $whitelist === false && $wgCaptchaWhitelist === false ) {
+                       // $whitelist is empty, $wgCaptchaWhitelist is default
+                       return true;
+               } elseif ( $whitelist === false && $wgCaptchaWhitelist !== false ) {
+                       // $whitelist is empty
+                       return !( preg_match( $wgCaptchaWhitelist, $url ) );
+               } else {
+                       return !( preg_match( $wgCaptchaWhitelist, $url ) || preg_match( $whitelist, $url ) );
+               }
+       }
+
+       /**
+        * Build regex from whitelist
+        * @param string lines from [[MediaWiki:Captcha-addurl-whitelist]]
+        * @return string Regex or bool false if whitelist is empty
+        * @access private
+        */
+       function buildRegexes( $lines ) {
+               # Code duplicated from the SpamBlacklist extension (r19197)
+
+               # Strip comments and whitespace, then remove blanks
+               $lines = array_filter( array_map( 'trim', preg_replace( '/#.*$/', '', $lines ) ) );
+
+               # No lines, don't make a regex which will match everything
+               if ( count( $lines ) == 0 ) {
+                       wfDebug( "No lines\n" );
+                       return false;
+               } else {
+                       # Make regex
+                       # It's faster using the S modifier even though it will usually only be run once
+                       //$regex = 'http://+[a-z0-9_\-.]*(' . implode( '|', $lines ) . ')';
+                       //return '/' . str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $regex) ) . '/Si';
+                       $regexes = '';
+                       $regexStart = '/http:\/\/+[a-z0-9_\-.]*(';
+                       $regexEnd = ')/Si';
+                       $regexMax = 4096;
+                       $build = false;
+                       foreach( $lines as $line ) {
+                               // FIXME: not very robust size check, but should work. :)
+                               if( $build === false ) {
+                                       $build = $line;
+                               } elseif( strlen( $build ) + strlen( $line ) > $regexMax ) {
+                                       $regexes .= $regexStart .
+                                               str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $build) ) .
+                                               $regexEnd;
+                                       $build = $line;
+                               } else {
+                                       $build .= '|' . $line;
+                               }
+                       }
+                       if( $build !== false ) {
+                               $regexes .= $regexStart .
+                                       str_replace( '/', '\/', preg_replace('|\\\*/|', '/', $build) ) .
+                                       $regexEnd;
+                       }
+                       return $regexes;
+               }
        }
 
        /**
        }
 
        /**