2017-12-12 11:56:28 -05:00
|
|
|
require_dependency 'url_helper'
|
|
|
|
|
2015-08-18 17:15:46 -04:00
|
|
|
class EmbeddableHost < ActiveRecord::Base
|
2016-01-11 11:06:09 -05:00
|
|
|
validate :host_must_be_valid
|
2015-08-18 17:15:46 -04:00
|
|
|
belongs_to :category
|
|
|
|
|
|
|
|
before_validation do
|
|
|
|
self.host.sub!(/^https?:\/\//, '')
|
|
|
|
self.host.sub!(/\/.*$/, '')
|
|
|
|
end
|
|
|
|
|
2016-08-23 14:55:52 -04:00
|
|
|
def self.record_for_url(uri)
|
|
|
|
|
|
|
|
if uri.is_a?(String)
|
2017-12-12 11:56:28 -05:00
|
|
|
uri = URI(UrlHelper.escape_uri(uri)) rescue nil
|
2016-08-23 14:55:52 -04:00
|
|
|
end
|
2015-08-18 17:15:46 -04:00
|
|
|
return false unless uri.present?
|
|
|
|
|
|
|
|
host = uri.host
|
|
|
|
return false unless host.present?
|
|
|
|
|
2017-02-27 12:17:52 -05:00
|
|
|
if uri.port.present? && uri.port != 80 && uri.port != 443
|
|
|
|
host << ":#{uri.port}"
|
|
|
|
end
|
|
|
|
|
2016-08-26 12:47:21 -04:00
|
|
|
path = uri.path
|
|
|
|
path << "?" << uri.query if uri.query.present?
|
|
|
|
|
2017-02-17 12:39:33 -05:00
|
|
|
where("lower(host) = ?", host).each do |eh|
|
2017-12-12 11:56:28 -05:00
|
|
|
return eh if eh.path_whitelist.blank?
|
|
|
|
|
|
|
|
path_regexp = Regexp.new(eh.path_whitelist)
|
|
|
|
return eh if path_regexp.match(path) || path_regexp.match(URI.unescape(path))
|
2017-02-17 12:39:33 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
nil
|
|
|
|
end
|
2016-08-26 12:47:21 -04:00
|
|
|
|
2017-02-17 12:39:33 -05:00
|
|
|
def self.url_allowed?(url)
|
2017-08-02 16:43:31 -04:00
|
|
|
# Work around IFRAME reload on WebKit where the referer will be set to the Forum URL
|
|
|
|
return true if url&.starts_with?(Discourse.base_url)
|
|
|
|
|
2017-12-12 11:56:28 -05:00
|
|
|
uri = URI(UrlHelper.escape_uri(url)) rescue nil
|
2017-02-17 12:39:33 -05:00
|
|
|
uri.present? && record_for_url(uri).present?
|
2015-08-18 17:15:46 -04:00
|
|
|
end
|
|
|
|
|
2016-01-11 11:06:09 -05:00
|
|
|
private
|
|
|
|
|
|
|
|
def host_must_be_valid
|
2017-04-15 07:06:51 -04:00
|
|
|
if host !~ /\A[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,10}(:[0-9]{1,5})?(\/.*)?\Z/i &&
|
2017-03-15 17:16:34 -04:00
|
|
|
host !~ /\A(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})(:[0-9]{1,5})?(\/.*)?\Z/ &&
|
2016-07-22 15:33:21 -04:00
|
|
|
host !~ /\A([a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.)?localhost(\:[0-9]{1,5})?(\/.*)?\Z/i
|
2016-01-11 11:06:09 -05:00
|
|
|
errors.add(:host, I18n.t('errors.messages.invalid'))
|
|
|
|
end
|
|
|
|
end
|
2015-08-18 17:15:46 -04:00
|
|
|
end
|
2015-09-17 20:41:10 -04:00
|
|
|
|
|
|
|
# == Schema Information
|
|
|
|
#
|
|
|
|
# Table name: embeddable_hosts
|
|
|
|
#
|
2016-10-31 05:32:11 -04:00
|
|
|
# id :integer not null, primary key
|
2018-02-20 01:28:58 -05:00
|
|
|
# host :string not null
|
2016-10-31 05:32:11 -04:00
|
|
|
# category_id :integer not null
|
2018-02-20 01:28:58 -05:00
|
|
|
# created_at :datetime not null
|
|
|
|
# updated_at :datetime not null
|
2016-10-31 05:32:11 -04:00
|
|
|
# path_whitelist :string
|
2017-05-12 14:46:57 -04:00
|
|
|
# class_name :string
|
2015-09-17 20:41:10 -04:00
|
|
|
#
|