Make a single colon an invalid title in php and js
authorumherirrender <umherirrender_de.wp@web.de>
Fri, 6 Dec 2013 17:12:24 +0000 (18:12 +0100)
committerKrinkle <krinklemail@gmail.com>
Fri, 6 Dec 2013 17:44:43 +0000 (17:44 +0000)
When secureAndSplit gets a single colon as input, the leading colon
is stripped and produces a title with a empty string. This change makes
that impossible by moving the empty string check to after the substring
removal of the colon.

Bug: 54044
Change-Id: I574168c9ed281c535901c36dea7c179a4e794d20

includes/Title.php
resources/mediawiki/mediawiki.Title.js
tests/phpunit/includes/TitleTest.php
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js

index 820842f..a949ac3 100644 (file)
@@ -3163,10 +3163,6 @@ class Title {
                $dbkey = preg_replace( '/[ _\xA0\x{1680}\x{180E}\x{2000}-\x{200A}\x{2028}\x{2029}\x{202F}\x{205F}\x{3000}]+/u', '_', $dbkey );
                $dbkey = trim( $dbkey, '_' );
 
-               if ( $dbkey == '' ) {
-                       return false;
-               }
-
                if ( strpos( $dbkey, UTF8_REPLACEMENT ) !== false ) {
                        # Contained illegal UTF-8 sequences or forbidden Unicode chars.
                        return false;
@@ -3176,12 +3172,16 @@ class Title {
 
                # Initial colon indicates main namespace rather than specified default
                # but should not create invalid {ns,title} pairs such as {0,Project:Foo}
-               if ( ':' == $dbkey[0] ) {
+               if ( $dbkey !== '' && ':' == $dbkey[0] ) {
                        $this->mNamespace = NS_MAIN;
                        $dbkey = substr( $dbkey, 1 ); # remove the colon but continue processing
                        $dbkey = trim( $dbkey, '_' ); # remove any subsequent whitespace
                }
 
+               if ( $dbkey == '' ) {
+                       return false;
+               }
+
                # Namespace or interwiki prefix
                $firstPass = true;
                $prefixRegexp = "/^(.+?)_*:_*(.*)$/S";
index de2d013..51770fd 100644 (file)
                        // Trim underscores
                        .replace( rUnderscoreTrim, '' );
 
-               if ( title === '' ) {
-                       return false;
-               }
-
                // Process initial colon
-               if ( title.charAt( 0 ) === ':' ) {
+               if ( title !== '' && title.charAt( 0 ) === ':' ) {
                        // Initial colon means main namespace instead of specified default
                        namespace = NS_MAIN;
                        title = title
                                .replace( rUnderscoreTrim, '' );
                }
 
+               if ( title === '' ) {
+                       return false;
+               }
+
                // Process namespace prefix (if any)
                m = title.match( rSplit );
                if ( m ) {
index 6bfe545..58f0146 100644 (file)
@@ -66,6 +66,7 @@ class TitleTest extends MediaWikiTestCase {
                // Invalid
                foreach ( array(
                        '',
+                       ':',
                        '__  __',
                        '  __  ',
                        // Bad characters forbidden regardless of wgLegalTitleChars
index cb0bf69..4083564 100644 (file)
@@ -80,6 +80,7 @@
                ],
                invalid: [
                        '',
+                       ':',
                        '__  __',
                        '  __  ',
                        // Bad characters forbidden regardless of wgLegalTitleChars