From f2028c14fb852a2409db36c86412eeaead9b3814 Mon Sep 17 00:00:00 2001 From: evazion Date: Fri, 11 Mar 2022 23:50:17 -0600 Subject: [PATCH] Fix #5045: Exception on uploads when SauceNAO is the referrer URL. Bug: We assumed the referer URL was from the same site as the target URL. We tried to call methods on the referer only supported by the target URL. Fix: Ignore the referer URL when it's from a different site than the target URL. --- app/logical/sources/strategies/base.rb | 23 +++++++++++--------- app/logical/sources/strategies/nico_seiga.rb | 1 - test/unit/sources/moebooru_test.rb | 16 +++++++++++++- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/app/logical/sources/strategies/base.rb b/app/logical/sources/strategies/base.rb index 9f7383ba0..96a159612 100644 --- a/app/logical/sources/strategies/base.rb +++ b/app/logical/sources/strategies/base.rb @@ -30,22 +30,25 @@ module Sources true end - # * url - Should point to a resource suitable for - # downloading. This may sometimes point to the binary file. - # It may also point to the artist's profile page, in cases - # where this class is being used to normalize artist urls. - # Implementations should be smart enough to detect this and - # behave accordingly. - # * referer_url - Sometimes the HTML page cannot be - # determined from url. You should generally pass in a - # referrer_url so the strategy can discover the HTML - # page and other information. + # Extract information from a target URL. The target URL may be either a + # direct image URL, or the URL of a HTML page containing one or more + # images. + # + # The referer URL is optionally provided when uploading direct image URLs + # with the bookmarklet. This lets us find the page containing the image + # for sites like Twitter, where the image URL by itself doesn't have + # enough information to find the page containing the image. + # + # @param url [String] The target URL + # @param referer_url [String] If the the target URL is an image URL, this + # should be the HTML page containing the image. def initialize(url, referer_url = nil) @url = url.to_s @referer_url = referer_url&.to_s @parsed_url = Source::URL.parse(url) @parsed_referer = Source::URL.parse(referer_url) if referer_url.present? + @parsed_referer = nil if parsed_url&.site_name != parsed_referer&.site_name end # Should return true if this strategy should be used. By default, checks diff --git a/app/logical/sources/strategies/nico_seiga.rb b/app/logical/sources/strategies/nico_seiga.rb index c4d6dc284..5eff5caa0 100644 --- a/app/logical/sources/strategies/nico_seiga.rb +++ b/app/logical/sources/strategies/nico_seiga.rb @@ -36,7 +36,6 @@ module Sources end def page_url - # XXX what if referer isn't from NicoSeiga? parsed_referer&.page_url || parsed_url.page_url end diff --git a/test/unit/sources/moebooru_test.rb b/test/unit/sources/moebooru_test.rb index 72807fed6..8f814f3d4 100644 --- a/test/unit/sources/moebooru_test.rb +++ b/test/unit/sources/moebooru_test.rb @@ -3,7 +3,7 @@ require "test_helper" module Sources class MoebooruTest < ActiveSupport::TestCase def assert_source_data_equals(url, referer = nil, site_name: nil, image_url: nil, page_url: nil, size: nil, tags: [], profile_url: nil, **params) - site = Sources::Strategies.find(url) + site = Sources::Strategies.find(url, referer) assert_equal(site_name, site.site_name) assert_equal([image_url], site.image_urls) @@ -71,6 +71,20 @@ module Sources assert_source_data_equals(@full, **@data) end end + + context "When the referer URL is SauceNao" do + should "ignore the referer" do + @url = "https://yande.re/post/show/469929" + @ref = "https://saucenao.com/" + + assert_source_data_equals(@url, @ref, + site_name: "Yande.re", + image_url: "https://files.yande.re/image/36b031b266605d89aed2b62d479e64b1/yande.re%20469929.jpg", + page_url: "https://yande.re/post/show/469929", + tags: %w[anchovy bandages darjeeling girls_und_panzer katyusha kay_(girls_und_panzer) mika_(girls_und_panzer) nishi_kinuyo nishizumi_maho nishizumi_miho shimada_arisu uniform], + ) + end + end end context "Konachan.com:" do