discourse/lib/discourse.rb

207 lines
5.1 KiB
Ruby
Raw Normal View History

require 'cache'
require_dependency 'plugin/instance'
require_dependency 'auth/default_current_user_provider'
2013-02-05 14:16:51 -05:00
module Discourse
# Expected less matches than what we got in a find
class TooManyMatches < Exception; end
2013-02-25 11:42:20 -05:00
# When they try to do something they should be logged in for
2013-02-05 14:16:51 -05: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-04 18:34:53 -04:00
# When a setting is missing
class SiteSettingMissing < Exception; end
2013-11-05 13:04:47 -05:00
# When ImageMagick is missing
class ImageMagickMissing < Exception; end
class InvalidPost < Exception; end
# Cross site request forgery
class CSRF < Exception; end
2013-12-23 18:50:36 -05:00
def self.filters
2014-01-09 16:22:54 -05:00
@filters ||= [:latest, :hot, :unread, :new, :starred, :read, :posted]
2013-12-23 18:50:36 -05:00
end
def self.anonymous_filters
@anonymous_filters ||= [:latest, :hot]
end
def self.logged_in_filters
@logged_in_filters ||= Discourse.filters - Discourse.anonymous_filters
end
def self.top_menu_items
@top_menu_items ||= Discourse.filters.concat([:category, :categories, :top])
end
def self.anonymous_top_menu_items
@anonymous_top_menu_items ||= Discourse.anonymous_filters.concat([:category, :categories, :top])
end
def self.activate_plugins!
@plugins = Plugin::Instance.find_all("#{Rails.root}/plugins")
2013-12-23 18:50:36 -05:00
@plugins.each { |plugin| plugin.activate! }
end
def self.plugins
@plugins
end
def self.assets_digest
@assets_digest ||= begin
digest = Digest::MD5.hexdigest(ActionView::Base.assets_manifest.assets.values.sort.join)
channel = "/global/asset-version"
message = MessageBus.last_message(channel)
unless message && message.data == digest
MessageBus.publish channel, digest
end
digest
end
end
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
def self.auth_providers
providers = []
if plugins
plugins.each do |p|
next unless p.auth_providers
p.auth_providers.each do |prov|
providers << prov
end
end
end
providers
end
def self.cache
@cache ||= Cache.new
end
2013-02-05 14:16:51 -05:00
# Get the current base URL for the current site
def self.current_hostname
if SiteSetting.force_hostname.present?
SiteSetting.force_hostname
else
RailsMultisite::ConnectionManagement.current_hostname
end
end
2013-11-05 13:04:47 -05:00
def self.base_uri(default_value = "")
if !ActionController::Base.config.relative_url_root.blank?
2013-11-05 13:04:47 -05:00
ActionController::Base.config.relative_url_root
else
2013-11-05 13:04:47 -05:00
default_value
end
end
def self.base_url_no_prefix
default_port = 80
2013-02-05 14:16:51 -05:00
protocol = "http"
if SiteSetting.use_https?
protocol = "https"
default_port = 443
2013-05-30 18:39:52 -04:00
end
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-30 18:39:52 -04:00
result
end
def self.base_url
return base_url_no_prefix + base_uri
end
2013-02-05 14:16:51 -05: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
def self.git_version
2013-02-25 11:42:20 -05:00
return $git_version if $git_version
2013-08-02 17:25:57 -04:00
# load the version stamped by the "build:stamp" task
f = Rails.root.to_s + "/config/version"
2013-02-18 02:00:49 -05:00
require f if File.exists?("#{f}.rb")
begin
2013-02-18 02:00:49 -05:00
$git_version ||= `git rev-parse HEAD`.strip
rescue
$git_version = "unknown"
end
end
# 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?
user ||= User.admins.real.order(:id).first
end
2013-02-05 14:16:51 -05:00
def self.system_user
User.where(id: -1).first
end
def self.store
if SiteSetting.enable_s3_uploads?
@s3_store_loaded ||= require 'file_store/s3_store'
2013-11-05 13:04:47 -05:00
FileStore::S3Store.new
else
@local_store_loaded ||= require 'file_store/local_store'
2013-11-05 13:04:47 -05:00
FileStore::LocalStore.new
end
end
def self.current_user_provider
@current_user_provider || Auth::DefaultCurrentUserProvider
end
def self.current_user_provider=(val)
@current_user_provider = val
end
2013-11-05 13:04:47 -05:00
def self.asset_host
Rails.configuration.action_controller.asset_host
end
2013-02-05 14:16:51 -05:00
private
def self.maintenance_mode_key
'maintenance_mode'
end
end