-
Notifications
You must be signed in to change notification settings - Fork 163
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
copy from the latest discourse/lib/onebox
- Loading branch information
Showing
109 changed files
with
6,059 additions
and
79 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
# frozen_string_literal: true | ||
|
||
module Onebox | ||
class DomainChecker | ||
def self.is_blocked?(hostname) | ||
SiteSetting | ||
.blocked_onebox_domains | ||
&.split("|") | ||
&.any? { |blocked| hostname == blocked || hostname.end_with?(".#{blocked}") } | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,213 @@ | ||
# frozen_string_literal: true | ||
|
||
module Onebox | ||
module Engine | ||
def self.included(object) | ||
object.extend(ClassMethods) | ||
end | ||
|
||
def self.engines | ||
constants.select { |constant| constant.to_s =~ /Onebox\z/ }.sort.map(&method(:const_get)) | ||
end | ||
|
||
def self.all_iframe_origins | ||
engines.flat_map { |e| e.iframe_origins }.uniq.compact | ||
end | ||
|
||
def self.origins_to_regexes(origins) | ||
return [/.*/] if origins.include?("*") | ||
|
||
origins.map do |origin| | ||
escaped_origin = Regexp.escape(origin) | ||
if origin.start_with?("*.", "https://*.", "http://*.") | ||
escaped_origin = escaped_origin.sub("\\*", '\S*') | ||
end | ||
|
||
Regexp.new("\\A#{escaped_origin}", "i") | ||
end | ||
end | ||
|
||
attr_reader :url, :uri, :options, :timeout | ||
attr :errors | ||
|
||
def options=(opt) | ||
return @options if opt.nil? # make sure options provided | ||
opt = opt.to_h if opt.instance_of?(OpenStruct) | ||
@options.merge!(opt) | ||
end | ||
|
||
def initialize(url, timeout = nil) | ||
@errors = {} | ||
@options = {} | ||
class_name = self.class.name.split("::").last.to_s | ||
|
||
# Set the engine options extracted from global options. | ||
self.options = Onebox.options[class_name] || {} | ||
|
||
@url = url | ||
@uri = URI(url) | ||
if always_https? | ||
@uri.scheme = "https" | ||
@url = @uri.to_s | ||
end | ||
@timeout = timeout || Onebox.options.timeout | ||
end | ||
|
||
# raises error if not defined in onebox engine. | ||
# This is the output method for an engine. | ||
def to_html | ||
fail NoMethodError, "Engines need to implement this method" | ||
end | ||
|
||
# Some oneboxes create iframes or other complicated controls. If you're using | ||
# a live editor with HTML preview, rendering those complicated controls can | ||
# be slow or cause flickering. | ||
# | ||
# This method allows engines to produce a placeholder such as static image | ||
# frame of a video. | ||
# | ||
# By default it just calls `to_html` unless implemented. | ||
def placeholder_html | ||
to_html | ||
end | ||
|
||
private | ||
|
||
# raises error if not defined in onebox engine | ||
# in each onebox, uses either Nokogiri or StandardEmbed to get raw HTML from url | ||
def raw | ||
fail NoMethodError, "Engines need to implement this method" | ||
end | ||
|
||
# raises error if not defined in onebox engine | ||
# in each onebox, returns hash of desired onebox content | ||
def data | ||
fail NoMethodError, "Engines need this method defined" | ||
end | ||
|
||
def link | ||
::Onebox::Helpers.uri_encode(@url) | ||
end | ||
|
||
def always_https? | ||
self.class.always_https? | ||
end | ||
|
||
module ClassMethods | ||
def handles_content_type?(other) | ||
if other && class_variable_defined?(:@@matcher_content_type) | ||
!!(other.to_s =~ class_variable_get(:@@matcher_content_type)) | ||
end | ||
end | ||
|
||
def ===(other) | ||
if other.kind_of?(URI) | ||
!!(other.to_s =~ class_variable_get(:@@matcher)) | ||
else | ||
super | ||
end | ||
end | ||
|
||
def priority | ||
100 | ||
end | ||
|
||
def matches_regexp(r) | ||
class_variable_set :@@matcher, r | ||
end | ||
|
||
def matches_content_type(ct) | ||
class_variable_set :@@matcher_content_type, ct | ||
end | ||
|
||
def requires_iframe_origins(*origins) | ||
class_variable_set :@@iframe_origins, origins | ||
end | ||
|
||
def iframe_origins | ||
class_variable_defined?(:@@iframe_origins) ? class_variable_get(:@@iframe_origins) : [] | ||
end | ||
|
||
# calculates a name for onebox using the class name of engine | ||
def onebox_name | ||
name.split("::").last.downcase.gsub(/onebox/, "") | ||
end | ||
|
||
def always_https | ||
@https = true | ||
end | ||
|
||
def always_https? | ||
defined?(@https) ? @https : false | ||
end | ||
end | ||
end | ||
end | ||
|
||
require_relative "helpers" | ||
require_relative "layout_support" | ||
require_relative "file_type_finder" | ||
require_relative "engine/standard_embed" | ||
require_relative "engine/html" | ||
require_relative "engine/json" | ||
require_relative "engine/amazon_onebox" | ||
require_relative "engine/github_issue_onebox" | ||
require_relative "engine/github_blob_onebox" | ||
require_relative "engine/github_commit_onebox" | ||
require_relative "engine/github_folder_onebox" | ||
require_relative "engine/github_gist_onebox" | ||
require_relative "engine/github_pull_request_onebox" | ||
require_relative "engine/google_calendar_onebox" | ||
require_relative "engine/google_docs_onebox" | ||
require_relative "engine/google_maps_onebox" | ||
require_relative "engine/google_play_app_onebox" | ||
require_relative "engine/image_onebox" | ||
require_relative "engine/video_onebox" | ||
require_relative "engine/audio_onebox" | ||
require_relative "engine/threads_status_onebox" | ||
require_relative "engine/stack_exchange_onebox" | ||
require_relative "engine/twitter_status_onebox" | ||
require_relative "engine/wikimedia_onebox" | ||
require_relative "engine/wikipedia_onebox" | ||
require_relative "engine/youtube_onebox" | ||
require_relative "engine/youku_onebox" | ||
require_relative "engine/allowlisted_generic_onebox" | ||
require_relative "engine/pubmed_onebox" | ||
require_relative "engine/sound_cloud_onebox" | ||
require_relative "engine/imgur_onebox" | ||
require_relative "engine/pastebin_onebox" | ||
require_relative "engine/slides_onebox" | ||
require_relative "engine/xkcd_onebox" | ||
require_relative "engine/animated_image_onebox" | ||
require_relative "engine/gfycat_onebox" | ||
require_relative "engine/typeform_onebox" | ||
require_relative "engine/vimeo_onebox" | ||
require_relative "engine/steam_store_onebox" | ||
require_relative "engine/sketch_fab_onebox" | ||
require_relative "engine/audioboom_onebox" | ||
require_relative "engine/replit_onebox" | ||
require_relative "engine/asciinema_onebox" | ||
require_relative "engine/mixcloud_onebox" | ||
require_relative "engine/band_camp_onebox" | ||
require_relative "engine/coub_onebox" | ||
require_relative "engine/flickr_onebox" | ||
require_relative "engine/flickr_shortened_onebox" | ||
require_relative "engine/five_hundred_px_onebox" | ||
require_relative "engine/pdf_onebox" | ||
require_relative "engine/twitch_clips_onebox" | ||
require_relative "engine/twitch_stream_onebox" | ||
require_relative "engine/twitch_video_onebox" | ||
require_relative "engine/trello_onebox" | ||
require_relative "engine/cloud_app_onebox" | ||
require_relative "engine/wistia_onebox" | ||
require_relative "engine/simplecast_onebox" | ||
require_relative "engine/instagram_onebox" | ||
require_relative "engine/gitlab_blob_onebox" | ||
require_relative "engine/google_photos_onebox" | ||
require_relative "engine/kaltura_onebox" | ||
require_relative "engine/reddit_media_onebox" | ||
require_relative "engine/google_drive_onebox" | ||
require_relative "engine/facebook_media_onebox" | ||
require_relative "engine/hackernews_onebox" | ||
require_relative "engine/motoko_onebox" | ||
require_relative "engine/tiktok_onebox" |
Oops, something went wrong.