diff --git a/Gemfile b/Gemfile
index b132eb07c02..a8298ab21b9 100644
--- a/Gemfile
+++ b/Gemfile
@@ -145,6 +145,7 @@ group :test do
gem "selenium-webdriver", require: false
gem "test-prof"
gem "webdrivers", require: false
+ gem "rails-dom-testing", require: false
end
group :test, :development do
diff --git a/Gemfile.lock b/Gemfile.lock
index 3e0c626b632..611ca40e714 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -624,6 +624,7 @@ DEPENDENCIES
rack
rack-mini-profiler
rack-protection
+ rails-dom-testing
rails_failover
rails_multisite
railties (= 7.0.4.3)
@@ -671,4 +672,4 @@ DEPENDENCIES
yard
BUNDLED WITH
- 2.4.4
+ 2.4.13
diff --git a/app/jobs/regular/pull_hotlinked_images.rb b/app/jobs/regular/pull_hotlinked_images.rb
index 43a64f519eb..ec8a7c78d6b 100644
--- a/app/jobs/regular/pull_hotlinked_images.rb
+++ b/app/jobs/regular/pull_hotlinked_images.rb
@@ -24,6 +24,7 @@ module Jobs
extract_images_from(post.cooked).each do |node|
download_src =
original_src = node["src"] || node[PrettyText::BLOCKED_HOTLINKED_SRC_ATTR] || node["href"]
+ download_src = replace_encoded_src(download_src)
download_src =
"#{SiteSetting.force_https ? "https" : "http"}:#{original_src}" if original_src.start_with?(
"//",
@@ -198,6 +199,10 @@ module Jobs
protected
+ def replace_encoded_src(src)
+ PostHotlinkedMedia.normalize_src(src, reset_scheme: false)
+ end
+
def normalize_src(src)
PostHotlinkedMedia.normalize_src(src)
end
diff --git a/app/models/post_hotlinked_media.rb b/app/models/post_hotlinked_media.rb
index de7d6aca7a5..53477bf7563 100644
--- a/app/models/post_hotlinked_media.rb
+++ b/app/models/post_hotlinked_media.rb
@@ -10,10 +10,10 @@ class PostHotlinkedMedia < ActiveRecord::Base
upload_create_failed: "upload_create_failed",
}
- def self.normalize_src(src)
+ def self.normalize_src(src, reset_scheme: true)
uri = Addressable::URI.heuristic_parse(src)
uri.normalize!
- uri.scheme = nil
+ uri.scheme = nil if reset_scheme
uri.to_s
rescue URI::Error, Addressable::URI::InvalidURIError
src
diff --git a/lib/cooked_post_processor.rb b/lib/cooked_post_processor.rb
index 9550a83690a..0d3a6d78367 100644
--- a/lib/cooked_post_processor.rb
+++ b/lib/cooked_post_processor.rb
@@ -26,7 +26,7 @@ class CookedPostProcessor
@category_id = @post&.topic&.category_id
cooked = post.cook(post.raw, @cooking_options)
- @doc = Loofah.fragment(cooked)
+ @doc = Loofah.html5_fragment(cooked)
@has_oneboxes = post.post_analyzer.found_oneboxes?
@size_cache = {}
diff --git a/lib/oneboxer.rb b/lib/oneboxer.rb
index 9bee58b6a34..781f4308cab 100644
--- a/lib/oneboxer.rb
+++ b/lib/oneboxer.rb
@@ -206,14 +206,14 @@ module Oneboxer
def self.apply(string_or_doc, extra_paths: nil)
doc = string_or_doc
- doc = Loofah.fragment(doc) if doc.is_a?(String)
+ doc = Loofah.html5_fragment(doc) if doc.is_a?(String)
changed = false
each_onebox_link(doc, extra_paths: extra_paths) do |url, element|
onebox, _ = yield(url, element)
next if onebox.blank?
- parsed_onebox = Loofah.fragment(onebox)
+ parsed_onebox = Loofah.html5_fragment(onebox)
next if parsed_onebox.children.blank?
changed = true
diff --git a/lib/pretty_text.rb b/lib/pretty_text.rb
index f3a4b6e4420..bbcaacee836 100644
--- a/lib/pretty_text.rb
+++ b/lib/pretty_text.rb
@@ -312,7 +312,7 @@ module PrettyText
add_mentions(doc, user_id: opts[:user_id]) if SiteSetting.enable_mentions
scrubber = Loofah::Scrubber.new { |node| node.remove if node.name == "script" }
- loofah_fragment = Loofah.fragment(doc.to_html)
+ loofah_fragment = Loofah.html5_fragment(doc.to_html)
loofah_fragment.scrub!(scrubber).to_html
end
diff --git a/plugins/chat/spec/integration/post_chat_quote_spec.rb b/plugins/chat/spec/integration/post_chat_quote_spec.rb
index c3343d1c199..113fa04e155 100644
--- a/plugins/chat/spec/integration/post_chat_quote_spec.rb
+++ b/plugins/chat/spec/integration/post_chat_quote_spec.rb
@@ -16,12 +16,10 @@ describe "chat bbcode quoting in posts" do
martin
-
-
+
-
This is a chat message.
-
+ This is a chat message.
COOKED
end
@@ -34,19 +32,16 @@ describe "chat bbcode quoting in posts" do
expect(post.cooked.chomp).to eq(<<~COOKED.chomp)
-
This is a chat message.
-
+ This is a chat message.
COOKED
end
@@ -63,14 +58,11 @@ describe "chat bbcode quoting in posts" do
martin
+
- #Cool Cats Club
-
+ #Cool Cats Club
-
This is a chat message.
-
+ This is a chat message.
COOKED
end
@@ -87,14 +79,11 @@ describe "chat bbcode quoting in posts" do
martin
+
- #Cool Cats Club
-
+ #Cool Cats Club
-
This is a chat message.
-
+ This is a chat message.
COOKED
end
@@ -107,19 +96,16 @@ describe "chat bbcode quoting in posts" do
expect(post.cooked.chomp).to eq(<<~COOKED.chomp)
-
This is a chat message.
-
+ This is a chat message.
COOKED
end
@@ -137,14 +123,11 @@ describe "chat bbcode quoting in posts" do
martin
+
- #Cool Cats Club
-
+ #Cool Cats Club
-
This is a chat message.
-
+
This is a chat message.
+##{channel.name}
+##{channel.name}
-
-
+#{message2.message}
+
COOKED
end
diff --git a/plugins/chat/spec/models/chat/message_spec.rb b/plugins/chat/spec/models/chat/message_spec.rb
index 5ddfb92adaa..a9c332c0800 100644
--- a/plugins/chat/spec/models/chat/message_spec.rb
+++ b/plugins/chat/spec/models/chat/message_spec.rb
@@ -87,8 +87,7 @@ describe Chat::Message do