Index: trunk/extensions/ConfirmEdit/ConfirmEdit.i18n.php |
— | — | @@ -28,6 +28,12 @@ |
29 | 29 | 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. |
30 | 30 | |
31 | 31 | 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 -->', |
32 | 38 | ); |
33 | 39 | |
34 | 40 | $wgConfirmEditMessages['af'] = array( |
— | — | @@ -134,6 +140,12 @@ |
135 | 141 | 'captchahelp-title' => 'Captcha-Hilfe', |
136 | 142 | 'captchahelp-cookies-needed' => "'''Wichtiger Hinweis:''' Es müssen Cookies im Browser erlaubt sein.", |
137 | 143 | '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 -->', |
138 | 150 | ); |
139 | 151 | |
140 | 152 | $wgConfirmEditMessages['es'] = array( |
Index: trunk/extensions/ConfirmEdit/ConfirmEdit.php |
— | — | @@ -140,7 +140,7 @@ |
141 | 141 | * Regex to whitelist URLs to known-good sites... |
142 | 142 | * For instance: |
143 | 143 | * $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]] |
145 | 145 | */ |
146 | 146 | $wgCaptchaWhitelist = false; |
147 | 147 | |
— | — | @@ -480,15 +480,79 @@ |
481 | 481 | |
482 | 482 | /** |
483 | 483 | * Filter callback function for URL whitelisting |
| 484 | + * @param string url to check |
484 | 485 | * @return bool true if unknown, false if whitelisted |
485 | 486 | * @access private |
486 | 487 | */ |
487 | 488 | function filterLink( $url ) { |
488 | 489 | global $wgCaptchaWhitelist; |
489 | | - return !( $wgCaptchaWhitelist && preg_match( $wgCaptchaWhitelist, $url ) ); |
| 490 | + $whitelist = false; |
| 491 | + $source = wfMsgForContent( 'captcha-addurl-whitelist' ); |
| 492 | + |
| 493 | + if( $source && $source != '<captcha-addurl-whitelist>' ) { |
| 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 | + } |
490 | 506 | } |
491 | 507 | |
492 | 508 | /** |
| 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 | + /** |
493 | 557 | * The main callback run on edit attempts. |
494 | 558 | * @param EditPage $editPage |
495 | 559 | * @param string $newtext |