2019-05-03 06:17:27 +08:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2014-01-01 03:37:43 +08:00
|
|
|
class EmbedController < ApplicationController
|
2019-08-16 01:41:06 +08:00
|
|
|
include TopicQueryParams
|
|
|
|
|
2017-08-31 12:06:56 +08:00
|
|
|
skip_before_action :check_xhr, :preload_json, :verify_authenticity_token
|
2015-05-06 09:00:31 +08:00
|
|
|
|
2019-08-16 01:41:06 +08:00
|
|
|
before_action :ensure_embeddable, except: [ :info, :topics ]
|
2019-09-11 00:27:07 +08:00
|
|
|
before_action :prepare_embeddable, except: [ :info ]
|
2017-08-31 12:06:56 +08:00
|
|
|
before_action :ensure_api_request, only: [ :info ]
|
2014-01-01 03:37:43 +08:00
|
|
|
|
|
|
|
layout 'embed'
|
|
|
|
|
2016-12-14 03:37:37 +08:00
|
|
|
rescue_from Discourse::InvalidAccess do
|
|
|
|
response.headers['X-Frame-Options'] = "ALLOWALL"
|
|
|
|
if current_user.try(:admin?)
|
|
|
|
@setup_url = "#{Discourse.base_url}/admin/customize/embedding"
|
|
|
|
@show_reason = true
|
|
|
|
@hosts = EmbeddableHost.all
|
|
|
|
end
|
2019-08-16 01:41:06 +08:00
|
|
|
render 'embed_error', status: 400
|
|
|
|
end
|
|
|
|
|
|
|
|
def topics
|
|
|
|
discourse_expires_in 1.minute
|
|
|
|
|
|
|
|
response.headers['X-Frame-Options'] = "ALLOWALL"
|
|
|
|
unless SiteSetting.embed_topics_list?
|
|
|
|
render 'embed_topics_error', status: 400
|
|
|
|
return
|
|
|
|
end
|
|
|
|
|
|
|
|
if @embed_id = params[:discourse_embed_id]
|
|
|
|
raise Discourse::InvalidParameters.new(:embed_id) unless @embed_id =~ /^de\-[a-zA-Z0-9]+$/
|
|
|
|
end
|
|
|
|
|
2019-09-04 16:01:46 +08:00
|
|
|
if params.has_key?(:template) && params[:template] == "complete"
|
|
|
|
@template = "complete"
|
2019-09-02 22:25:44 +08:00
|
|
|
else
|
|
|
|
@template = "basic"
|
|
|
|
end
|
|
|
|
|
2019-08-16 01:41:06 +08:00
|
|
|
list_options = build_topic_list_options
|
2020-07-20 19:13:35 +08:00
|
|
|
|
|
|
|
if params.has_key?(:per_page)
|
|
|
|
list_options[:per_page] =
|
|
|
|
[params[:per_page].to_i, SiteSetting.embed_topic_limit_per_page].min
|
|
|
|
end
|
2019-11-02 03:19:10 +08:00
|
|
|
|
|
|
|
if params[:allow_create]
|
|
|
|
@allow_create = true
|
|
|
|
create_url_params = {}
|
|
|
|
create_url_params[:category_id] = params[:category] if params[:category].present?
|
|
|
|
create_url_params[:tags] = params[:tags] if params[:tags].present?
|
|
|
|
@create_url = "#{Discourse.base_url}/new-topic?#{create_url_params.to_query}"
|
|
|
|
end
|
|
|
|
|
2019-08-16 01:41:06 +08:00
|
|
|
topic_query = TopicQuery.new(current_user, list_options)
|
|
|
|
@list = topic_query.list_latest
|
2016-12-14 03:37:37 +08:00
|
|
|
end
|
|
|
|
|
2014-01-04 01:52:24 +08:00
|
|
|
def comments
|
2015-06-10 04:24:04 +08:00
|
|
|
embed_url = params[:embed_url]
|
2016-02-25 19:16:27 +08:00
|
|
|
embed_username = params[:discourse_username]
|
2015-06-10 04:24:04 +08:00
|
|
|
|
|
|
|
topic_id = nil
|
|
|
|
if embed_url.present?
|
|
|
|
topic_id = TopicEmbed.topic_id_for_embed(embed_url)
|
|
|
|
else
|
|
|
|
topic_id = params[:topic_id].to_i
|
|
|
|
end
|
2014-01-01 03:37:43 +08:00
|
|
|
|
|
|
|
if topic_id
|
2014-06-19 05:39:12 +08:00
|
|
|
@topic_view = TopicView.new(topic_id,
|
|
|
|
current_user,
|
|
|
|
limit: SiteSetting.embed_post_limit,
|
2021-01-22 01:47:03 +08:00
|
|
|
only_regular: true,
|
2014-06-19 05:39:12 +08:00
|
|
|
exclude_first: true,
|
2016-05-04 03:01:20 +08:00
|
|
|
exclude_deleted_users: true,
|
|
|
|
exclude_hidden: true)
|
2014-06-19 05:39:12 +08:00
|
|
|
|
2014-01-03 01:15:48 +08:00
|
|
|
@second_post_url = "#{@topic_view.topic.url}/2" if @topic_view
|
2014-01-04 03:55:37 +08:00
|
|
|
@posts_left = 0
|
|
|
|
if @topic_view && @topic_view.posts.size == SiteSetting.embed_post_limit
|
2015-05-11 16:26:21 +08:00
|
|
|
@posts_left = @topic_view.topic.posts_count - SiteSetting.embed_post_limit - 1
|
2014-01-04 03:55:37 +08:00
|
|
|
end
|
2015-06-10 04:24:04 +08:00
|
|
|
|
2015-11-21 03:27:30 +08:00
|
|
|
if @topic_view
|
|
|
|
@reply_count = @topic_view.topic.posts_count - 1
|
|
|
|
@reply_count = 0 if @reply_count < 0
|
|
|
|
end
|
2015-06-10 04:24:04 +08:00
|
|
|
elsif embed_url.present?
|
2016-04-25 08:47:38 +08:00
|
|
|
Jobs.enqueue(:retrieve_topic,
|
|
|
|
user_id: current_user.try(:id),
|
|
|
|
embed_url: embed_url,
|
|
|
|
author_username: embed_username,
|
|
|
|
referer: request.env['HTTP_REFERER']
|
|
|
|
)
|
2014-01-01 03:37:43 +08:00
|
|
|
render 'loading'
|
|
|
|
end
|
|
|
|
|
|
|
|
discourse_expires_in 1.minute
|
|
|
|
end
|
|
|
|
|
2015-05-06 09:00:31 +08:00
|
|
|
def info
|
|
|
|
embed_url = params.require(:embed_url)
|
|
|
|
@topic_embed = TopicEmbed.where(embed_url: embed_url).first
|
|
|
|
|
|
|
|
raise Discourse::NotFound if @topic_embed.nil?
|
|
|
|
|
|
|
|
render_serialized(@topic_embed, TopicEmbedSerializer, root: false)
|
|
|
|
end
|
|
|
|
|
2014-01-14 01:47:24 +08:00
|
|
|
def count
|
2014-05-21 03:20:02 +08:00
|
|
|
embed_urls = params[:embed_url]
|
2014-01-14 01:47:24 +08:00
|
|
|
by_url = {}
|
2014-05-21 03:20:02 +08:00
|
|
|
|
|
|
|
if embed_urls.present?
|
|
|
|
urls = embed_urls.map { |u| u.sub(/#discourse-comments$/, '').sub(/\/$/, '') }
|
|
|
|
topic_embeds = TopicEmbed.where(embed_url: urls).includes(:topic).references(:topic)
|
|
|
|
|
|
|
|
topic_embeds.each do |te|
|
2015-05-01 21:04:45 +08:00
|
|
|
url = te.embed_url
|
2014-05-21 03:20:02 +08:00
|
|
|
url = "#{url}#discourse-comments" unless params[:embed_url].include?(url)
|
2016-08-25 09:27:00 +08:00
|
|
|
if te.topic.present?
|
|
|
|
by_url[url] = I18n.t('embed.replies', count: te.topic.posts_count - 1)
|
|
|
|
else
|
|
|
|
by_url[url] = I18n.t('embed.replies', count: 0)
|
|
|
|
end
|
2014-05-21 03:20:02 +08:00
|
|
|
end
|
2014-01-14 01:47:24 +08:00
|
|
|
end
|
|
|
|
|
2014-04-15 00:15:41 +08:00
|
|
|
render json: { counts: by_url }, callback: params[:callback]
|
2014-01-14 01:47:24 +08:00
|
|
|
end
|
|
|
|
|
2014-01-01 03:37:43 +08:00
|
|
|
private
|
|
|
|
|
2019-09-11 00:27:07 +08:00
|
|
|
def prepare_embeddable
|
2017-05-09 00:58:36 +08:00
|
|
|
@embeddable_css_class = ""
|
|
|
|
embeddable_host = EmbeddableHost.record_for_url(request.referer)
|
|
|
|
@embeddable_css_class = " class=\"#{embeddable_host.class_name}\"" if embeddable_host.present? && embeddable_host.class_name.present?
|
2019-09-11 00:27:07 +08:00
|
|
|
|
|
|
|
@data_referer = request.referer
|
|
|
|
@data_referer = '*' if SiteSetting.embed_any_origin? && @data_referer.blank?
|
2017-05-09 00:58:36 +08:00
|
|
|
end
|
|
|
|
|
2015-05-06 09:00:31 +08:00
|
|
|
def ensure_api_request
|
|
|
|
raise Discourse::InvalidAccess.new('api key not set') if !is_api?
|
|
|
|
end
|
|
|
|
|
2014-01-01 03:37:43 +08:00
|
|
|
def ensure_embeddable
|
2018-03-28 16:20:08 +08:00
|
|
|
if !(Rails.env.development? && current_user&.admin?)
|
|
|
|
referer = request.referer
|
2014-01-03 00:32:50 +08:00
|
|
|
|
2018-03-28 16:20:08 +08:00
|
|
|
unless referer && EmbeddableHost.url_allowed?(referer)
|
|
|
|
raise Discourse::InvalidAccess.new('invalid referer host')
|
2014-01-03 00:32:50 +08:00
|
|
|
end
|
2014-01-01 03:37:43 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
response.headers['X-Frame-Options'] = "ALLOWALL"
|
2018-08-14 18:23:32 +08:00
|
|
|
rescue URI::Error
|
2014-01-01 03:37:43 +08:00
|
|
|
raise Discourse::InvalidAccess.new('invalid referer host')
|
2018-06-07 13:28:18 +08:00
|
|
|
end
|
|
|
|
|
2014-01-01 03:37:43 +08:00
|
|
|
end
|