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