From cd1c60bc850b3c426fdcc2626dfca58907071a9f Mon Sep 17 00:00:00 2001 From: Tyler Anthony Romeo Date: Fri, 18 Jan 2013 12:46:02 -0500 Subject: [PATCH] (bug 42513) mediawiki.Uri: Fix parsing of URIs with @ in path. The regexes for URI parsing in mediawiki.Uri did not make sure there were no slashes (/), question marks (?) or hashes (#) in the username or password of the URI. As a result an @ symbol later on in the url messed up the result. This commit fixes the regexes so that URIs with an @ symbol in the path, query, or fragment don't get interpreted as having a username when they actually don't. Change-Id: I4954bfd3750d5c990e91cc0dc8a175225ccbad1e --- resources/mediawiki/mediawiki.Uri.js | 4 +-- .../resources/mediawiki/mediawiki.Uri.test.js | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/resources/mediawiki/mediawiki.Uri.js b/resources/mediawiki/mediawiki.Uri.js index 2cb4c3abf5..643e5c3e49 100644 --- a/resources/mediawiki/mediawiki.Uri.js +++ b/resources/mediawiki/mediawiki.Uri.js @@ -76,8 +76,8 @@ // Regular expressions to parse many common URIs. var parser = { - strict: /^(?:([^:\/?#]+):)?(?:\/\/(?:(?:([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)?((?:[^?#\/]*\/)*[^?#]*)(?:\?([^#]*))?(?:#(.*))?/, - loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?(?:(?:([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?((?:\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?[^?#\/]*)(?:\?([^#]*))?(?:#(.*))?/ + strict: /^(?:([^:\/?#]+):)?(?:\/\/(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?)?((?:[^?#\/]*\/)*[^?#]*)(?:\?([^#]*))?(?:#(.*))?/, + loose: /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?(?:(?:([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?([^:\/?#]*)(?::(\d*))?((?:\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?[^?#\/]*)(?:\?([^#]*))?(?:#(.*))?/ }, // The order here matches the order of captured matches in the above parser regexes. diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js index 7fc7453aba..9eb2efc24a 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js @@ -361,6 +361,36 @@ assert.ok( relativePath.indexOf( uri.fragment ) >= 0, 'fragement in relative path' ); } ); + QUnit.test( 'Parse a uri with an @ symbol in the path and query', 1, function ( assert ) { + var uri = new mw.Uri( 'http://www.example.com/test@test?x=@uri&y@=uri&z@=@' ); + + assert.deepEqual( + { + protocol: uri.protocol, + user: uri.user, + password: uri.password, + host: uri.host, + port: uri.port, + path: uri.path, + query: uri.query, + fragment: uri.fragment, + queryString: uri.getQueryString() + }, + { + protocol: 'http', + user: undefined, + password: undefined, + host: 'www.example.com', + port: undefined, + path: '/test@test', + query: { x: '@uri', 'y@': 'uri', 'z@': '@' }, + fragment: undefined, + queryString: 'x=%40uri&y%40=uri&z%40=%40' + }, + 'basic object properties' + ); + } ); + QUnit.test( 'Handle protocol-relative URLs', 5, function ( assert ) { var UriRel, uri; -- 2.20.1