jenkins-bot has submitted this change and it was merged.

Change subject: Better support usernames with spaces in them
......................................................................


Better support usernames with spaces in them

Change-Id: I0b9e077789e560a7ca4822f80cfe206f41579662
(cherry picked from commit b968eeb43e87f7d35397187a31c1c237d925c137)
---
M removeOldManualUserPages.php
M tests/RemoveOldManualUserPagesTest.php
2 files changed, 87 insertions(+), 5 deletions(-)

Approvals:
  Krinkle: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/removeOldManualUserPages.php b/removeOldManualUserPages.php
index 9f11ef4..8dfd040 100644
--- a/removeOldManualUserPages.php
+++ b/removeOldManualUserPages.php
@@ -88,8 +88,22 @@
                $this->output( "{$title->getPrefixedText()} was deleted.\n" );
        }
 
-       public function checkCss( $text, $domain, $userName ) {
+       /**
+        * Given a username, normalize and escape it to be
+        * safely used in regex
+        *
+        * @param string $userName
+        * @return string
+        */
+       public function normalizeUserName( $userName ) {
                $userName = preg_quote( $userName );
+               // Spaces can be represented as space, underscore, plus, or %20.
+               $userName = str_replace( ' ', '( |_|\+|%20)', $userName );
+               return $userName;
+       }
+
+       public function checkCss( $text, $domain, $userName ) {
+               $userName = $this->normalizeUserName( $userName );
                preg_match( "/@import 
url\('(https?:)?\/\/$domain\/w\/index\.php\?title=User:$userName\/global\.css&action=raw&ctype=text\/css'\);/",
 $text, $matches );
                return isset( $matches[0] ) ? $matches[0] === $text : false;
        }
@@ -137,8 +151,8 @@
 
        public function checkJs( $text, $domain, $userName ) {
                $text = $this->stripComments( $text );
-               $userName = preg_quote( $userName );
-               preg_match( 
"/(mw\.loader\.load|importScriptURI)\s*\(\s*'(https?:)?\/\/$domain\/w\/index\.php\?title=User:$userName\/global\.js&action=raw&ctype=text\/javascript(&smaxage=\d*?)?(&maxage=\d*?)?'\s*\)\s*;?/",
 $text, $matches );
+               $userName = $this->normalizeUserName( $userName );
+               preg_match( 
"/(mw\.loader\.load|importScriptURI)\s*\(\s*('|\")(https?:)?\/\/$domain\/w\/index\.php\?title=User:$userName\/global\.js&action=raw&ctype=text\/javascript(&smaxage=\d*?)?(&maxage=\d*?)?('|\")\s*\)\s*;?/",
 $text, $matches );
                return isset( $matches[0] ) ? $matches[0] === $text : false;
        }
 
diff --git a/tests/RemoveOldManualUserPagesTest.php 
b/tests/RemoveOldManualUserPagesTest.php
index 0573366..577f77b 100644
--- a/tests/RemoveOldManualUserPagesTest.php
+++ b/tests/RemoveOldManualUserPagesTest.php
@@ -14,62 +14,110 @@
                        array(
                                
"mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:UserName/global.js&action=raw&ctype=text/javascript');",
                                true,
+                               'UserName',
                                'mw.loader.load with a proto-rel link',
+                       ),
+                       array(
+                               
'mw.loader.load("//meta.wikimedia.org/w/index.php?title=User:UserName/global.js&action=raw&ctype=text/javascript");',
+                               true,
+                               'UserName',
+                               'double quotes',
                        ),
                        array(
                                
"importScriptURI('//meta.wikimedia.org/w/index.php?title=User:UserName/global.js&action=raw&ctype=text/javascript');",
                                true,
+                               'UserName',
                                'using importScriptURI',
                        ),
                        array(
                                
"mw.loader.load('http://meta.wikimedia.org/w/index.php?title=User:UserName/global.js&action=raw&ctype=text/javascript');",
                                true,
+                               'UserName',
                                'mw.loader.load with a http:// link',
                        ),
                        array(
                                
"mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:SomeOtherUserName/global.js&action=raw&ctype=text/javascript');",
                                false,
+                               'UserName',
                                'Loading a different user\'s global.js',
                        ),
                        array(
                                
"mw.loader.load('//en.wikipedia.org/w/index.php?title=User:UserName/global.js&action=raw&ctype=text/javascript');",
                                false,
+                               'UserName',
                                'Loading from a different site',
                        ),
                        array(
                                
"mw.loader.load('//en.wikipedia.org/w/index.php?title=User:UserName/common.js&action=raw&ctype=text/javascript');",
                                false,
+                               'UserName',
                                'Loading from a different page',
                        ),
                        array(
                                
"mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:UserName/global.js&action=raw&ctype=text/javascript')",
                                true,
+                               'UserName',
                                'No trailing ;',
                        ),
                        array(
                                "mw.loader.load ( 
'//meta.wikimedia.org/w/index.php?title=User:UserName/global.js&action=raw&ctype=text/javascript'
 ) ;",
                                true,
+                               'UserName',
                                'Spaces around ( and )',
                        ),
                        array(
                                "//some comment\n//another 
comment\nmw.loader.load('//meta.wikimedia.org/w/index.php?title=User:UserName/global.js&action=raw&ctype=text/javascript');",
                                true,
+                               'UserName',
                                'comments before the mw.loader.load call',
                        ),
                        array(
                                
"mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:UserName/global.js&action=raw&ctype=text/javascript');\nsomeOtherJavaScript();",
                                false,
+                               'UserName',
                                'page contains some other javascript',
                        ),
                        array(
                                "\n\n//some comment\n\n\n//another 
comment\n\nmw.loader.load('//meta.wikimedia.org/w/index.php?title=User:UserName/global.js&action=raw&ctype=text/javascript');",
                                true,
+                               'UserName',
                                'empty lines are also stripped in between 
comments',
                        ),
                        array(
                                
"mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:UserName/global.js&action=raw&ctype=text/javascript&smaxage=86400&maxage=86400');",
                                true,
+                               'UserName',
                                '(s)maxage parameters are accepted',
+                       ),
+                       array(
+                               
"mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:John_F._Lewis/global.js&action=raw&ctype=text/javascript');",
+                               true,
+                               'John F. Lewis',
+                               'A username with spaces in it using 
underscores',
+                       ),
+                       array(
+                               
"mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:Jdforrester 
(WMF)/global.js&action=raw&ctype=text/javascript');",
+                               true,
+                               'Jdforrester (WMF)',
+                               'A username with spaces in it using spaces',
+                       ),
+                       array(
+                               
"mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:Jdforrester+(WMF)/global.js&action=raw&ctype=text/javascript');",
+                               true,
+                               'Jdforrester (WMF)',
+                               'A username with spaces in it using +',
+                       ),
+                       array(
+                               
"mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:Jdforrester%20(WMF)/global.js&action=raw&ctype=text/javascript');",
+                               true,
+                               'Jdforrester (WMF)',
+                               'A username with spaces in it using %20',
+                       ),
+                       array(
+                               
"mw.loader.load('//meta.wikimedia.org/w/index.php?title=User:संतोष 
दहिवळ/global.js&action=raw&ctype=text/javascript');",
+                               true,
+                               'संतोष दहिवळ',
+                               'A username with spaces and unicode!',
                        ),
                );
        }
@@ -79,12 +127,13 @@
         * @dataProvider provideCheckJs
         * @param string $text page content
         * @param bool $expected should it match?
+        * @param string $userName to use
         * @param string $desc description of test case
         */
-       public function testCheckJs( $text, $expected, $desc) {
+       public function testCheckJs( $text, $expected, $userName, $desc) {
                $this->load();
                $r = new RemoveOldManualUserPages();
-               $matched = $r->checkJs( $text, 'meta\.wikimedia\.org', 
'UserName' );
+               $matched = $r->checkJs( $text, 'meta\.wikimedia\.org', 
$userName );
                $this->assertEquals( $expected, $matched, $desc );
        }
 
@@ -131,4 +180,23 @@
                $matched = $r->checkCss( $text, 'meta\.wikimedia\.org', 
'UserName' );
                $this->assertEquals( $expected, $matched, $desc );
        }
+
+       public static function provideNormalizeUserName() {
+               return array(
+                       array( 'UserName', 'UserName', 'A regular name with no 
fancy things' ),
+                       array( 'John F. Lewis', 'John( |_|\+|%20)F\.( 
|_|\+|%20)Lewis', 'A name with spaces and a period' ),
+                       array( 'Jdforrester (WMF)', 'Jdforrester( 
|_|\+|%20)\(WMF\)', 'A name with spaces and parenthesis' ),
+                       array( 'संतोष दहिवळ', 'संतोष( |_|\+|%20)दहिवळ', 'A name 
with spaces and unicode' ),
+               );
+       }
+
+       /**
+        * @covers RemoveOldManualUserPages::normalizeUserName
+        * @dataProvider provideNormalizeUserName
+        */
+       public function testNormalizeUserName( $name, $expected, $desc ) {
+               $this->load();
+               $r = new RemoveOldManualUserPages();
+               $this->assertEquals( $expected, $r->normalizeUserName( $name ), 
$desc );
+       }
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/156534
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I0b9e077789e560a7ca4822f80cfe206f41579662
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/GlobalCssJs
Gerrit-Branch: wmf/1.24wmf18
Gerrit-Owner: Krinkle <krinklem...@gmail.com>
Gerrit-Reviewer: Krinkle <krinklem...@gmail.com>
Gerrit-Reviewer: Legoktm <legoktm.wikipe...@gmail.com>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to