jenkins-bot has submitted this change and it was merged. Change subject: Fix url encoding in URL guesser ......................................................................
Fix url encoding in URL guesser Change-Id: I99757913cd2fe5170db37c79a2d2986b12b5aa45 Mingle: https://wikimedia.mingle.thoughtworks.com/projects/multimedia/cards/594 --- M resources/mmv/provider/mmv.provider.GuessedThumbnailInfo.js M tests/qunit/mmv/provider/mmv.provider.GuessedThumbnailInfo.test.js 2 files changed, 35 insertions(+), 12 deletions(-) Approvals: Gilles: Looks good to me, approved jenkins-bot: Verified diff --git a/resources/mmv/provider/mmv.provider.GuessedThumbnailInfo.js b/resources/mmv/provider/mmv.provider.GuessedThumbnailInfo.js index d5b929a..a2e38c9 100644 --- a/resources/mmv/provider/mmv.provider.GuessedThumbnailInfo.js +++ b/resources/mmv/provider/mmv.provider.GuessedThumbnailInfo.js @@ -60,7 +60,7 @@ * to guess how the URL would look. If that's the case, the promise just rejects. * * @param {mw.Title} file - * @param {string} sampleUrl a thumbnail URL for the same file (but with different size) + * @param {string} sampleUrl a thumbnail URL for the same file (but with different size). * @param {number} width thumbnail width in pixels * @param {number} originalWidth width of original image in pixels * @param {number} originalHeight height of original image in pixels @@ -145,9 +145,12 @@ * @return {string} thumbnnail URL with occurences of the filename replaced by `<filename>` */ GuessedThumbnailInfo.prototype.obscureFilename = function ( url, file ) { + // corresponds to File::getUrlRel() which uses rawurlencode() + var filenameInUrl = mw.util.rawurlencode( file.getMain() ); + // In the URL to the original file the filename occurs once. In a thumbnail URL it usually // occurs twice, but can occur once if it is too short. We replace twice, can't hurt. - return url.replace( file.getMain(), '<filename>' ).replace( file.getMain(), '<filename>' ); + return url.replace( filenameInUrl, '<filename>' ).replace( filenameInUrl, '<filename>' ); }; /** @@ -158,8 +161,11 @@ * @return {string} original thumbnnail URL */ GuessedThumbnailInfo.prototype.restoreFilename = function ( url, file ) { + // corresponds to File::getUrlRel() which uses rawurlencode() + var filenameInUrl = mw.util.rawurlencode( file.getMain() ); + // <> cannot be used in titles, so this is safe - return url.replace( '<filename>', file.getMain() ).replace( '<filename>', file.getMain() ); + return url.replace( '<filename>', filenameInUrl ).replace( '<filename>', filenameInUrl ); }; /** @@ -253,6 +259,11 @@ GuessedThumbnailInfo.prototype.guessFullUrl = function ( file, thumbnailUrl ) { var url = this.obscureFilename( thumbnailUrl, file ); + if ( url === thumbnailUrl ) { + // Did not find the filename, maybe due to URL encoding issues. Bail out. + return undefined; + } + // this depends on some config settings, but will work with default or WMF settings. url = url.replace( /<filename>.*/, '<filename>' ); url = url.replace( '/thumb', '' ); diff --git a/tests/qunit/mmv/provider/mmv.provider.GuessedThumbnailInfo.test.js b/tests/qunit/mmv/provider/mmv.provider.GuessedThumbnailInfo.test.js index fcedbb5..91ad910 100644 --- a/tests/qunit/mmv/provider/mmv.provider.GuessedThumbnailInfo.test.js +++ b/tests/qunit/mmv/provider/mmv.provider.GuessedThumbnailInfo.test.js @@ -129,12 +129,17 @@ 'Original url recognized as being full size' ); } ); - QUnit.test( 'obscureFilename()', 1, function ( assert ) { + QUnit.test( 'obscureFilename()', 2, function ( assert ) { var provider = new mw.mmv.provider.GuessedThumbnailInfo(), file = new mw.Title( 'File:Copyleft.svg' ); assert.strictEqual( provider.obscureFilename( 'http://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Copyleft.svg/300px-Copyleft.svg.png', file ), 'http://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/<filename>/300px-<filename>.png', 'Filename correctly obscured' ); + + file = new mw.Title( 'File:Hoag\'s_object.jpg' ); + + assert.strictEqual( provider.obscureFilename( 'http://upload.wikimedia.org/wikipedia/commons/thumb/d/da/Hoag%27s_object.jpg/180px-Hoag%27s_object.jpg', file ), + 'http://upload.wikimedia.org/wikipedia/commons/thumb/d/da/<filename>/180px-<filename>', 'Filename with urlencoded character correctly obscured' ); } ); QUnit.test( 'restoreFilename()', 1, function ( assert ) { @@ -246,23 +251,30 @@ 'https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/Ranunculus_gmelinii_NRCS-2.tiff/lossy-page1-220px-Ranunculus_gmelinii_NRCS-2.tiff.jpg', 'Works with extra parameters' ); } ); - QUnit.test( 'guessFullUrl()', 2, function ( assert ) { + QUnit.test( 'guessFullUrl()', 3, function ( assert ) { var provider = new mw.mmv.provider.GuessedThumbnailInfo(), file = new mw.Title( 'File:Copyleft.svg' ), fullUrl = 'http://upload.wikimedia.org/wikipedia/commons/8/8b/Copyleft.svg', sampleUrl = 'http://upload.wikimedia.org/wikipedia/commons/thumb/8/8b/Copyleft.svg/300px-Copyleft.svg.png', result; - result = provider.guessFullUrl( file, sampleUrl ); + result = provider.guessFullUrl( file, sampleUrl ); - assert.strictEqual( result, fullUrl, 'guessFullUrl returns correct full URL for SVG' ); + assert.strictEqual( result, fullUrl, 'guessFullUrl returns correct full URL for SVG' ); - file = new mw.Title( 'File:அணில்-3-தென்னையின்_வளர்நிலை.jpg' ); - fullUrl = 'http://upload.beta.wmflabs.org/wikipedia/en/1/15/அணில்-3-தென்னையின்_வளர்நிலை.jpg'; - sampleUrl = 'http://upload.beta.wmflabs.org/wikipedia/en/1/15/அணில்-3-தென்னையின்_வளர்நிலை.jpg/800px-அணில்-3-தென்னையின்_வளர்நிலை.jpg'; + file = new mw.Title( 'File:அணில்-3-தென்னையின்_வளர்நிலை.jpg' ); + fullUrl = 'https://upload.wikimedia.org/wikipedia/commons/1/15/%E0%AE%85%E0%AE%A3%E0%AE%BF%E0%AE%B2%E0%AF%8D-3-%E0%AE%A4%E0%AF%86%E0%AE%A9%E0%AF%8D%E0%AE%A9%E0%AF%88%E0%AE%AF%E0%AE%BF%E0%AE%A9%E0%AF%8D_%E0%AE%B5%E0%AE%B3%E0%AE%B0%E0%AF%8D%E0%AE%A8%E0%AE%BF%E0%AE%B2%E0%AF%88.jpg'; + sampleUrl = 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/%E0%AE%85%E0%AE%A3%E0%AE%BF%E0%AE%B2%E0%AF%8D-3-%E0%AE%A4%E0%AF%86%E0%AE%A9%E0%AF%8D%E0%AE%A9%E0%AF%88%E0%AE%AF%E0%AE%BF%E0%AE%A9%E0%AF%8D_%E0%AE%B5%E0%AE%B3%E0%AE%B0%E0%AF%8D%E0%AE%A8%E0%AE%BF%E0%AE%B2%E0%AF%88.jpg/800px-%E0%AE%85%E0%AE%A3%E0%AE%BF%E0%AE%B2%E0%AF%8D-3-%E0%AE%A4%E0%AF%86%E0%AE%A9%E0%AF%8D%E0%AE%A9%E0%AF%88%E0%AE%AF%E0%AE%BF%E0%AE%A9%E0%AF%8D_%E0%AE%B5%E0%AE%B3%E0%AE%B0%E0%AF%8D%E0%AE%A8%E0%AE%BF%E0%AE%B2%E0%AF%88.jpg'; - result = provider.guessFullUrl( file, sampleUrl ); + result = provider.guessFullUrl( file, sampleUrl ); - assert.strictEqual( result, fullUrl, 'guessFullUrl returns correct full URL for JPG with unicode name' ); + assert.strictEqual( result, fullUrl, 'guessFullUrl returns correct full URL for JPG with unicode name' ); + + file = new mw.Title( 'File:அணில்-3-தென்னையின்_வளர்நிலை.jpg' ); + sampleUrl = 'https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/அணில்-3-தென்னையின்_வளர்நிலை.jpg/800px-அணில்-3-தென்னையின்_வளர்நிலை.jpg'; + + result = provider.guessFullUrl( file, sampleUrl ); + + assert.strictEqual( result, undefined, 'guessFullUrl bails out when URL encoding is not as expected' ); } ); }( mediaWiki ) ); -- To view, visit https://gerrit.wikimedia.org/r/132585 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I99757913cd2fe5170db37c79a2d2986b12b5aa45 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/MultimediaViewer Gerrit-Branch: master Gerrit-Owner: Gergő Tisza <gti...@wikimedia.org> Gerrit-Reviewer: Gilles <gdu...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits