Skip to content

Commit 6741fca

Browse files
authored
Set referrerpolicy to images when rendering rich text (#990)
1 parent 8e41ad4 commit 6741fca

File tree

3 files changed

+15
-5
lines changed

3 files changed

+15
-5
lines changed

app/lib/rich_text.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ def initialize(text:)
1111
# Iterate over all images and unlink tracking pixels
1212
css('img[src]').each do |node|
1313
node.unlink if TrackingDetection.tracking_pixel?(node)
14+
15+
# Don't send referrer when requesting images
16+
node.set_attribute('referrerpolicy', 'no-referrer')
1417
end
1518
end
1619

1720
# Iterate over all urls in the document
1821
# If the block returns a new url, the element gets replaced
19-
# rubocop:disable Metrics/AbcSize
20-
def handle_img_urls(&)
22+
def handle_img_urls(&) # rubocop:disable Metrics/AbcSize
2123
css('img[src]').each do |node|
2224
node.set_attribute('src', yield(node['src']))
2325
end
@@ -31,7 +33,6 @@ def handle_img_urls(&)
3133
node.set_attribute('style', urls_in_styles(node['style'], &))
3234
end
3335
end
34-
# rubocop:enable Metrics/AbcSize
3536

3637
def add_to_head(node_or_string)
3738
at_css('head').add_child(node_or_string)

test/components/entry_component_test.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ class EntryComponentTest < ViewComponent::TestCase
4040
render_inline(EntryComponent.new(entry:))
4141

4242
assert_selector '.entry__iframe'
43-
assert_includes page.find('.entry__iframe')[:srcdoc], '<body><div><img src="https://example.com/image.jpg"></div></body>'
43+
assert_includes page.find('.entry__iframe')[:srcdoc],
44+
'<body><div><img src="https://example.com/image.jpg" referrerpolicy="no-referrer"></div></body>'
4445
end
4546

4647
test 'should replace image src when proxied' do
@@ -55,7 +56,7 @@ class EntryComponentTest < ViewComponent::TestCase
5556

5657
assert_selector '.entry__iframe'
5758

58-
regex = %r{<img src="/rails/active_storage/blobs/redirect/[A-Za-z\d=-]+/image.jpg">}
59+
regex = %r{<img src="/rails/active_storage/blobs/redirect/[A-Za-z\d=-]+/image.jpg"}
5960

6061
assert_match regex, page.find('.entry__iframe')[:srcdoc]
6162
end

test/lib/rich_text_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,14 @@
33
require 'test_helper'
44

55
class RichTextTest < ActiveSupport::TestCase
6+
test 'should set no-referrer for all images' do
7+
text = RichText.new(
8+
text: '<div><img src="https://example.com/image.jpg" /></div>'
9+
)
10+
11+
assert_includes text.to_html, '<img src="https://example.com/image.jpg" referrerpolicy="no-referrer">'
12+
end
13+
614
# Handle_img_urls
715
test 'should detect url is srcset' do
816
text = RichText.new(

0 commit comments

Comments
 (0)