posts: fix exception when viewing post with source Blog..
Fix a PublicSuffix::DomainNotAllowed exception raised with viewing or editing a post
with a source like `Blog.`.
This happened when parsing the post's source. `Danbooru::URL.parse("Blog.")` would
heuristically parse the source into `http://blog`. Calling any methods related to the
URL's hostname or domain would lead to calling `PublicSuffix.parse("blog")`, which
would fail with PublicSuffix::DomainNotAllowed.
This commit is contained in:
@@ -45,6 +45,7 @@ module Danbooru
|
|||||||
@url.path = nil if @url.path == "/"
|
@url.path = nil if @url.path == "/"
|
||||||
|
|
||||||
raise Error, "#{original_url} is not an http:// URL" if !@url.normalized_scheme.in?(["http", "https"])
|
raise Error, "#{original_url} is not an http:// URL" if !@url.normalized_scheme.in?(["http", "https"])
|
||||||
|
raise Error, "#{original_url} is not a valid hostname" if parsed_domain.nil?
|
||||||
rescue Addressable::URI::InvalidURIError => e
|
rescue Addressable::URI::InvalidURIError => e
|
||||||
raise Error, e
|
raise Error, e
|
||||||
end
|
end
|
||||||
@@ -113,6 +114,8 @@ module Danbooru
|
|||||||
# @return [PublicSuffix::Domain]
|
# @return [PublicSuffix::Domain]
|
||||||
def parsed_domain
|
def parsed_domain
|
||||||
@parsed_domain ||= PublicSuffix.parse(host)
|
@parsed_domain ||= PublicSuffix.parse(host)
|
||||||
|
rescue PublicSuffix::DomainNotAllowed
|
||||||
|
nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -308,11 +308,12 @@ class Post < ApplicationRecord
|
|||||||
end
|
end
|
||||||
|
|
||||||
def normalized_source
|
def normalized_source
|
||||||
|
return source unless web_source?
|
||||||
Sources::Strategies.normalize_source(source)
|
Sources::Strategies.normalize_source(source)
|
||||||
end
|
end
|
||||||
|
|
||||||
def source_domain
|
def source_domain
|
||||||
return "" unless source =~ %r{\Ahttps?://}i
|
return "" unless web_source?
|
||||||
|
|
||||||
Danbooru::URL.parse(normalized_source)&.domain.to_s
|
Danbooru::URL.parse(normalized_source)&.domain.to_s
|
||||||
end
|
end
|
||||||
@@ -475,7 +476,7 @@ class Post < ApplicationRecord
|
|||||||
tags << "ugoira"
|
tags << "ugoira"
|
||||||
end
|
end
|
||||||
|
|
||||||
if source.present? && source !~ %r{\Ahttps?://}i
|
if source.present? && !web_source?
|
||||||
tags << "non-web_source"
|
tags << "non-web_source"
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -645,6 +646,10 @@ class Post < ApplicationRecord
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def web_source?
|
||||||
|
source.match?(%r{\Ahttps?://}i)
|
||||||
|
end
|
||||||
|
|
||||||
def has_tag?(tag)
|
def has_tag?(tag)
|
||||||
tag_string.match?(/(?:^| )(?:#{tag})(?:$| )/)
|
tag_string.match?(/(?:^| )(?:#{tag})(?:$| )/)
|
||||||
end
|
end
|
||||||
@@ -1149,6 +1154,7 @@ class Post < ApplicationRecord
|
|||||||
module PixivMethods
|
module PixivMethods
|
||||||
def parse_pixiv_id
|
def parse_pixiv_id
|
||||||
self.pixiv_id = nil
|
self.pixiv_id = nil
|
||||||
|
return unless web_source?
|
||||||
|
|
||||||
site = Sources::Strategies::Pixiv.new(source)
|
site = Sources::Strategies::Pixiv.new(source)
|
||||||
if site.match?
|
if site.match?
|
||||||
@@ -1255,7 +1261,7 @@ class Post < ApplicationRecord
|
|||||||
|
|
||||||
def has_artist_tag
|
def has_artist_tag
|
||||||
return if !new_record?
|
return if !new_record?
|
||||||
return if source !~ %r{\Ahttps?://}
|
return if !web_source?
|
||||||
return if has_tag?("artist_request") || has_tag?("official_art")
|
return if has_tag?("artist_request") || has_tag?("official_art")
|
||||||
return if tags.any?(&:artist?)
|
return if tags.any?(&:artist?)
|
||||||
return if Sources::Strategies.find(source).is_a?(Sources::Strategies::Null)
|
return if Sources::Strategies.find(source).is_a?(Sources::Strategies::Null)
|
||||||
|
|||||||
@@ -646,6 +646,15 @@ class PostsControllerTest < ActionDispatch::IntegrationTest
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "with a non-web source" do
|
||||||
|
should "render" do
|
||||||
|
@post.update!(source: "Blog.")
|
||||||
|
get post_path(@post)
|
||||||
|
|
||||||
|
assert_response :success
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
should "respect the disable tagged filenames option in the Download link" do
|
should "respect the disable tagged filenames option in the Download link" do
|
||||||
@user.update!(disable_tagged_filenames: true)
|
@user.update!(disable_tagged_filenames: true)
|
||||||
get_auth post_path(@post), @user
|
get_auth post_path(@post), @user
|
||||||
|
|||||||
@@ -1368,6 +1368,13 @@ class PostTest < ActiveSupport::TestCase
|
|||||||
@post.pixiv_id = nil
|
@post.pixiv_id = nil
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "like 'Blog.'" do
|
||||||
|
should "not raise an exception" do
|
||||||
|
@post.update!(source: "Blog.")
|
||||||
|
assert_equal("Blog.", @post.source)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context "when validating tags" do
|
context "when validating tags" do
|
||||||
|
|||||||
Reference in New Issue
Block a user