discourse/lib/onebox/engine/image_onebox.rb
Mark Doerr 2fb976fab1
FIX: Support Dropbox /scl/ URL format in video and image oneboxes (#38394)
Dropbox has introduced a new sharing URL format using `/scl/fi/` instead
of the legacy `/s/` path. This updates VideoOnebox and ImageOnebox to:

- Detect and transform new `/scl/` format URLs
- Convert to dl.dropboxusercontent.com domain
- Ensure raw=1 parameter is present for direct download
- Maintain backward compatibility with legacy `/s/` format
- Also...added test coverage for both old and new Dropbox formats. All
existing tests continue to pass.

Co-Authored-By: Claude Sonnet 4.5

---------

Co-authored-by: Loïc Guitaut <loic@discourse.org>
2026-03-11 10:37:57 +01:00

26 lines
747 B
Ruby

# frozen_string_literal: true
module Onebox
module Engine
class ImageOnebox
include Engine
matches_content_type(%r{^image/(png|jpg|jpeg|gif|bmp|tif|tiff|webp|avif)$})
matches_regexp(%r{^(https?:)?//.+\.(png|jpg|jpeg|gif|bmp|tif|tiff|webp|avif)(\?.*)?$}i)
def always_https?
AllowlistedGenericOnebox.host_matches(uri, AllowlistedGenericOnebox.https_hosts)
end
def to_html
url = ::Onebox::Helpers.normalize_dropbox_url(@url)
escaped_url = ::Onebox::Helpers.normalize_url_for_output(url)
<<-HTML
<a href="#{escaped_url}" target="_blank" rel="noopener" class="onebox">
<img src="#{escaped_url}">
</a>
HTML
end
end
end
end