2013-05-31 06:41:29 +08:00
|
|
|
require 'cache'
|
2013-08-23 14:21:52 +08:00
|
|
|
require_dependency 'plugin/instance'
|
2013-10-09 12:10:37 +08:00
|
|
|
require_dependency 'auth/default_current_user_provider'
|
2013-05-31 06:41:29 +08:00
|
|
|
|
2013-02-06 03:16:51 +08:00
|
|
|
module Discourse
|
|
|
|
|
2013-06-19 08:31:19 +08:00
|
|
|
# Expected less matches than what we got in a find
|
|
|
|
class TooManyMatches < Exception; end
|
|
|
|
|
2013-02-26 00:42:20 +08:00
|
|
|
# When they try to do something they should be logged in for
|
2013-02-06 03:16:51 +08:00
|
|
|
class NotLoggedIn < Exception; end
|
|
|
|
|
|
|
|
# When the input is somehow bad
|
|
|
|
class InvalidParameters < Exception; end
|
|
|
|
|
|
|
|
# When they don't have permission to do something
|
|
|
|
class InvalidAccess < Exception; end
|
|
|
|
|
|
|
|
# When something they want is not found
|
|
|
|
class NotFound < Exception; end
|
|
|
|
|
2013-06-05 06:34:53 +08:00
|
|
|
# When a setting is missing
|
|
|
|
class SiteSettingMissing < Exception; end
|
|
|
|
|
2013-07-29 13:13:13 +08:00
|
|
|
# Cross site request forgery
|
|
|
|
class CSRF < Exception; end
|
|
|
|
|
2013-08-01 13:59:57 +08:00
|
|
|
def self.activate_plugins!
|
2013-08-23 14:21:52 +08:00
|
|
|
@plugins = Plugin::Instance.find_all("#{Rails.root}/plugins")
|
2013-08-01 13:59:57 +08:00
|
|
|
@plugins.each do |plugin|
|
|
|
|
plugin.activate!
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.plugins
|
|
|
|
@plugins
|
|
|
|
end
|
|
|
|
|
2013-08-26 09:04:16 +08:00
|
|
|
def self.authenticators
|
|
|
|
# TODO: perhaps we don't need auth providers and authenticators maybe one object is enough
|
|
|
|
|
|
|
|
# NOTE: this bypasses the site settings and gives a list of everything, we need to register every middleware
|
|
|
|
# for the cases of multisite
|
|
|
|
# In future we may change it so we don't include them all for cases where we are not a multisite, but we would
|
|
|
|
# require a restart after site settings change
|
|
|
|
Users::OmniauthCallbacksController::BUILTIN_AUTH + auth_providers.map(&:authenticator)
|
|
|
|
end
|
|
|
|
|
2013-08-01 13:59:57 +08:00
|
|
|
def self.auth_providers
|
2013-08-01 14:05:46 +08:00
|
|
|
providers = []
|
2013-08-01 13:59:57 +08:00
|
|
|
if plugins
|
|
|
|
plugins.each do |p|
|
|
|
|
next unless p.auth_providers
|
|
|
|
p.auth_providers.each do |prov|
|
|
|
|
providers << prov
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
providers
|
|
|
|
end
|
|
|
|
|
2013-05-31 06:41:29 +08:00
|
|
|
def self.cache
|
|
|
|
@cache ||= Cache.new
|
|
|
|
end
|
2013-02-06 03:16:51 +08:00
|
|
|
|
|
|
|
# Get the current base URL for the current site
|
|
|
|
def self.current_hostname
|
2013-05-31 06:48:34 +08:00
|
|
|
if SiteSetting.force_hostname.present?
|
|
|
|
SiteSetting.force_hostname
|
|
|
|
else
|
|
|
|
RailsMultisite::ConnectionManagement.current_hostname
|
|
|
|
end
|
2013-05-31 06:41:29 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
def self.base_uri default_value=""
|
|
|
|
if !ActionController::Base.config.relative_url_root.blank?
|
|
|
|
return ActionController::Base.config.relative_url_root
|
2013-03-14 20:01:52 +08:00
|
|
|
else
|
2013-05-31 06:41:29 +08:00
|
|
|
return default_value
|
2013-03-14 20:01:52 +08:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-05-31 06:41:29 +08:00
|
|
|
def self.base_url_no_prefix
|
2013-05-31 06:48:34 +08:00
|
|
|
default_port = 80
|
2013-02-06 03:16:51 +08:00
|
|
|
protocol = "http"
|
2013-05-31 06:48:34 +08:00
|
|
|
|
|
|
|
if SiteSetting.use_ssl?
|
|
|
|
protocol = "https"
|
|
|
|
default_port = 443
|
2013-05-31 06:39:52 +08:00
|
|
|
end
|
2013-05-31 06:48:34 +08:00
|
|
|
|
|
|
|
result = "#{protocol}://#{current_hostname}"
|
|
|
|
|
|
|
|
port = SiteSetting.port.present? && SiteSetting.port.to_i > 0 ? SiteSetting.port.to_i : default_port
|
|
|
|
|
|
|
|
result << ":#{SiteSetting.port}" if port != default_port
|
2013-05-31 06:39:52 +08:00
|
|
|
result
|
2013-04-05 18:38:20 +08:00
|
|
|
end
|
|
|
|
|
2013-05-31 06:41:29 +08:00
|
|
|
def self.base_url
|
|
|
|
return base_url_no_prefix + base_uri
|
|
|
|
end
|
|
|
|
|
2013-02-06 03:16:51 +08:00
|
|
|
def self.enable_maintenance_mode
|
|
|
|
$redis.set maintenance_mode_key, 1
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.disable_maintenance_mode
|
|
|
|
$redis.del maintenance_mode_key
|
|
|
|
true
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.maintenance_mode?
|
|
|
|
!!$redis.get( maintenance_mode_key )
|
|
|
|
end
|
|
|
|
|
2013-02-18 14:39:54 +08:00
|
|
|
def self.git_version
|
2013-02-26 00:42:20 +08:00
|
|
|
return $git_version if $git_version
|
2013-08-03 05:25:57 +08:00
|
|
|
|
|
|
|
# load the version stamped by the "build:stamp" task
|
|
|
|
f = Rails.root.to_s + "/config/version"
|
2013-02-18 15:00:49 +08:00
|
|
|
require f if File.exists?("#{f}.rb")
|
|
|
|
|
2013-02-18 14:39:54 +08:00
|
|
|
begin
|
2013-02-18 15:00:49 +08:00
|
|
|
$git_version ||= `git rev-parse HEAD`.strip
|
2013-02-18 14:39:54 +08:00
|
|
|
rescue
|
|
|
|
$git_version = "unknown"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-09-06 15:28:37 +08:00
|
|
|
# Either returns the site_contact_username user or the first admin.
|
|
|
|
def self.site_contact_user
|
|
|
|
user = User.where(username_lower: SiteSetting.site_contact_username).first if SiteSetting.site_contact_username.present?
|
2013-09-06 12:07:23 +08:00
|
|
|
user ||= User.admins.real.order(:id).first
|
2013-05-31 06:41:29 +08:00
|
|
|
end
|
2013-02-06 03:16:51 +08:00
|
|
|
|
2013-09-06 15:28:37 +08:00
|
|
|
def self.system_user
|
|
|
|
User.where(id: -1).first
|
|
|
|
end
|
|
|
|
|
2013-08-01 05:26:34 +08:00
|
|
|
def self.store
|
|
|
|
if SiteSetting.enable_s3_uploads?
|
|
|
|
@s3_store_loaded ||= require 'file_store/s3_store'
|
|
|
|
S3Store.new
|
|
|
|
else
|
|
|
|
@local_store_loaded ||= require 'file_store/local_store'
|
|
|
|
LocalStore.new
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2013-10-09 12:10:37 +08:00
|
|
|
def self.current_user_provider
|
|
|
|
@current_user_provider || Auth::DefaultCurrentUserProvider
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.current_user_provider=(val)
|
|
|
|
@current_user_provider = val
|
|
|
|
end
|
|
|
|
|
2013-02-06 03:16:51 +08:00
|
|
|
private
|
|
|
|
|
|
|
|
def self.maintenance_mode_key
|
|
|
|
'maintenance_mode'
|
|
|
|
end
|
|
|
|
end
|