2018-01-15 12:43:07 +11:00
|
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
2023-04-04 10:04:59 +01:00
|
|
|
|
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new("3.2.0")
|
|
|
|
|
|
STDERR.puts "Discourse requires Ruby 3.2 or above"
|
2018-05-22 09:21:47 +10:00
|
|
|
|
exit 1
|
|
|
|
|
|
end
|
|
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
|
require File.expand_path("../boot", __FILE__)
|
2019-02-06 17:45:48 +11:00
|
|
|
|
require "active_record/railtie"
|
|
|
|
|
|
require "action_controller/railtie"
|
|
|
|
|
|
require "action_view/railtie"
|
|
|
|
|
|
require "action_mailer/railtie"
|
|
|
|
|
|
require "sprockets/railtie"
|
2020-06-15 15:56:57 +08:00
|
|
|
|
|
2022-12-28 10:09:15 +00:00
|
|
|
|
if !Rails.env.production?
|
|
|
|
|
|
recommended = File.read(".ruby-version.sample").strip
|
|
|
|
|
|
if Gem::Version.new(RUBY_VERSION) < Gem::Version.new(recommended)
|
|
|
|
|
|
STDERR.puts "[Warning] Discourse recommends developing using Ruby v#{recommended} or above. You are using v#{RUBY_VERSION}."
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
|
# Plugin related stuff
|
2022-03-21 15:28:52 +01:00
|
|
|
|
require_relative "../lib/plugin"
|
2014-07-22 19:02:22 -04:00
|
|
|
|
require_relative "../lib/discourse_event"
|
2013-05-01 14:10:51 -07:00
|
|
|
|
require_relative "../lib/discourse_plugin_registry"
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
2017-01-09 17:10:14 -05:00
|
|
|
|
require_relative "../lib/plugin_gem"
|
|
|
|
|
|
|
2013-12-20 16:17:21 +11:00
|
|
|
|
# Global config
|
|
|
|
|
|
require_relative "../app/models/global_setting"
|
2017-01-09 17:10:14 -05:00
|
|
|
|
GlobalSetting.configure!
|
2022-01-11 12:30:22 +00:00
|
|
|
|
if GlobalSetting.load_plugins?
|
2022-03-21 15:28:52 +01:00
|
|
|
|
# Support for plugins to register custom setting providers. They can do this
|
|
|
|
|
|
# by having a file, `register_provider.rb` in their root that will be run
|
|
|
|
|
|
# at this point.
|
|
|
|
|
|
|
|
|
|
|
|
Dir.glob(File.join(File.dirname(__FILE__), "../plugins", "*", "register_provider.rb")) do |p|
|
|
|
|
|
|
require p
|
|
|
|
|
|
end
|
2017-01-09 17:10:14 -05:00
|
|
|
|
end
|
|
|
|
|
|
GlobalSetting.load_defaults
|
2020-03-05 15:37:49 -05:00
|
|
|
|
if GlobalSetting.try(:cdn_url).present? && GlobalSetting.cdn_url !~ %r{^https?://}
|
|
|
|
|
|
STDERR.puts "WARNING: Your CDN URL does not begin with a protocol like `https://` - this is probably not going to work"
|
|
|
|
|
|
end
|
2013-12-20 16:17:21 +11:00
|
|
|
|
|
2019-06-13 12:58:27 +10:00
|
|
|
|
if ENV["SKIP_DB_AND_REDIS"] == "1"
|
|
|
|
|
|
GlobalSetting.skip_db = true
|
|
|
|
|
|
GlobalSetting.skip_redis = true
|
|
|
|
|
|
end
|
|
|
|
|
|
|
2020-06-15 16:02:30 +08:00
|
|
|
|
require "rails_failover/active_record" if !GlobalSetting.skip_db?
|
|
|
|
|
|
|
2020-06-15 16:04:41 +08:00
|
|
|
|
require "rails_failover/redis" if !GlobalSetting.skip_redis?
|
2020-06-15 16:02:30 +08:00
|
|
|
|
|
2014-08-18 12:12:48 +05:30
|
|
|
|
require "pry-rails" if Rails.env.development?
|
2022-11-10 09:58:39 +10:00
|
|
|
|
require "pry-byebug" if Rails.env.development?
|
2014-05-26 19:46:57 +10:00
|
|
|
|
|
2020-08-31 13:14:09 +03:00
|
|
|
|
require "discourse_fonts"
|
|
|
|
|
|
|
2022-04-21 16:26:34 +01:00
|
|
|
|
require_relative "../lib/ember_cli"
|
|
|
|
|
|
|
2019-05-02 13:24:30 +08:00
|
|
|
|
if defined?(Bundler)
|
|
|
|
|
|
bundler_groups = [:default]
|
|
|
|
|
|
|
|
|
|
|
|
if !Rails.env.production?
|
|
|
|
|
|
bundler_groups = bundler_groups.concat(Rails.groups(assets: %w[development test profile]))
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
Bundler.require(*bundler_groups)
|
2014-01-14 16:59:55 +11:00
|
|
|
|
end
|
|
|
|
|
|
|
2022-03-29 13:38:42 +08:00
|
|
|
|
require_relative "../lib/require_dependency_backward_compatibility"
|
|
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
|
module Discourse
|
|
|
|
|
|
class Application < Rails::Application
|
2014-05-14 10:20:23 +10:00
|
|
|
|
def config.database_configuration
|
2014-08-18 12:12:48 +05:30
|
|
|
|
if Rails.env.production?
|
2014-05-14 10:20:23 +10:00
|
|
|
|
GlobalSetting.database_config
|
|
|
|
|
|
else
|
|
|
|
|
|
super
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
2013-02-05 14:16:51 -05:00
|
|
|
|
# Settings in config/environments/* take precedence over those specified here.
|
|
|
|
|
|
# Application configuration should go into files in config/initializers
|
|
|
|
|
|
# -- all .rb files in that directory are automatically loaded.
|
|
|
|
|
|
|
2022-03-21 15:28:52 +01:00
|
|
|
|
require "discourse"
|
|
|
|
|
|
require "js_locale_helper"
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
2018-11-08 16:12:18 +11:00
|
|
|
|
# tiny file needed by site settings
|
2022-03-21 15:28:52 +01:00
|
|
|
|
require "highlight_js"
|
2015-03-13 16:15:13 +11:00
|
|
|
|
|
2022-05-19 16:58:31 +02:00
|
|
|
|
config.load_defaults 6.1
|
|
|
|
|
|
config.active_record.cache_versioning = false # our custom cache class doesn’t support this
|
|
|
|
|
|
config.action_controller.forgery_protection_origin_check = false
|
|
|
|
|
|
config.active_record.belongs_to_required_by_default = false
|
2022-07-15 13:14:57 +01:00
|
|
|
|
config.active_record.yaml_column_permitted_classes = [
|
|
|
|
|
|
Hash,
|
|
|
|
|
|
HashWithIndifferentAccess,
|
|
|
|
|
|
Time,
|
|
|
|
|
|
Symbol,
|
|
|
|
|
|
]
|
2022-05-19 16:58:31 +02:00
|
|
|
|
|
2020-05-08 10:44:51 +10:00
|
|
|
|
# we skip it cause we configure it in the initializer
|
2021-05-20 21:43:47 -04:00
|
|
|
|
# the railtie for message_bus would insert it in the
|
2020-05-08 10:44:51 +10:00
|
|
|
|
# wrong position
|
|
|
|
|
|
config.skip_message_bus_middleware = true
|
|
|
|
|
|
config.skip_multisite_middleware = true
|
2020-06-05 09:05:19 +08:00
|
|
|
|
config.skip_rails_failover_active_record_middleware = true
|
2020-05-08 10:44:51 +10:00
|
|
|
|
|
2021-10-06 13:24:50 -05:00
|
|
|
|
multisite_config_path =
|
|
|
|
|
|
ENV["DISCOURSE_MULTISITE_CONFIG_PATH"] || GlobalSetting.multisite_config_path
|
|
|
|
|
|
config.multisite_config_path = File.absolute_path(multisite_config_path, Rails.root)
|
2021-09-10 14:19:52 -05:00
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
|
# Custom directories with classes and modules you want to be autoloadable.
|
2022-03-21 15:28:52 +01:00
|
|
|
|
config.autoload_paths << "#{root}/lib"
|
|
|
|
|
|
config.autoload_paths << "#{root}/lib/guardian"
|
|
|
|
|
|
config.autoload_paths << "#{root}/lib/i18n"
|
|
|
|
|
|
config.autoload_paths << "#{root}/lib/validators"
|
2021-04-29 15:40:55 +01:00
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
|
# Only load the plugins named here, in the order given (default is alphabetical).
|
|
|
|
|
|
# :all can be used as a placeholder for all plugins not explicitly named.
|
|
|
|
|
|
# config.plugins = [ :exception_notification, :ssl_requirement, :all ]
|
|
|
|
|
|
|
2021-05-20 21:43:47 -04:00
|
|
|
|
# Allows us to skip minification on some files
|
2015-02-20 15:48:45 -05:00
|
|
|
|
config.assets.skip_minification = []
|
|
|
|
|
|
|
2013-02-05 14:16:51 -05:00
|
|
|
|
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
|
|
|
|
|
|
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
|
2014-10-27 11:31:09 -04:00
|
|
|
|
config.time_zone = "UTC"
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
2015-04-09 17:04:14 +02:00
|
|
|
|
# auto-load locales in plugins
|
|
|
|
|
|
# NOTE: we load both client & server locales since some might be used by PrettyText
|
|
|
|
|
|
config.i18n.load_path += Dir["#{Rails.root}/plugins/*/config/locales/*.yml"]
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
|
|
|
|
|
# Configure the default encoding used in templates for Ruby 1.9.
|
2013-02-18 17:34:43 +11:00
|
|
|
|
config.encoding = "utf-8"
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
2013-02-25 19:42:20 +03:00
|
|
|
|
# see: http://stackoverflow.com/questions/11894180/how-does-one-correctly-add-custom-sql-dml-in-migrations/11894420#11894420
|
2013-02-05 14:16:51 -05:00
|
|
|
|
config.active_record.schema_format = :sql
|
|
|
|
|
|
|
2021-04-30 10:54:49 +01:00
|
|
|
|
# We use this in development-mode only (see development.rb)
|
|
|
|
|
|
config.active_record.use_schema_cache_dump = false
|
|
|
|
|
|
|
2013-02-25 19:42:20 +03:00
|
|
|
|
# per https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet
|
2023-04-11 11:56:20 +01:00
|
|
|
|
config.pbkdf2_iterations = 600_000
|
2013-07-22 21:36:01 -04:00
|
|
|
|
config.pbkdf2_algorithm = "sha256"
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
2013-10-10 14:16:09 +11:00
|
|
|
|
# rack lock is nothing but trouble, get rid of it
|
|
|
|
|
|
# for some reason still seeing it in Rails 4
|
|
|
|
|
|
config.middleware.delete Rack::Lock
|
|
|
|
|
|
|
2018-01-19 08:26:18 +11:00
|
|
|
|
# wrong place in middleware stack AND request tracker handles it
|
|
|
|
|
|
config.middleware.delete Rack::Runtime
|
|
|
|
|
|
|
2014-07-10 15:18:31 +10:00
|
|
|
|
# ETags are pointless, we are dynamically compressing
|
|
|
|
|
|
# so nginx strips etags, may revisit when mainline nginx
|
|
|
|
|
|
# supports etags (post 1.7)
|
|
|
|
|
|
config.middleware.delete Rack::ETag
|
|
|
|
|
|
|
2020-01-07 12:22:58 +00:00
|
|
|
|
if !(Rails.env.development? || ENV["SKIP_ENFORCE_HOSTNAME"] == "1")
|
2018-11-19 22:34:02 -05:00
|
|
|
|
require "middleware/enforce_hostname"
|
|
|
|
|
|
config.middleware.insert_after Rack::MethodOverride, Middleware::EnforceHostname
|
|
|
|
|
|
end
|
2018-11-15 15:22:02 +11:00
|
|
|
|
|
2018-11-30 09:51:45 -05:00
|
|
|
|
require "content_security_policy/middleware"
|
2018-10-22 13:22:23 -04:00
|
|
|
|
config.middleware.swap ActionDispatch::ContentSecurityPolicy::Middleware,
|
|
|
|
|
|
ContentSecurityPolicy::Middleware
|
|
|
|
|
|
|
2023-07-28 12:53:44 +01:00
|
|
|
|
require "middleware/gtm_script_nonce_injector"
|
|
|
|
|
|
config.middleware.insert_after(ActionDispatch::Flash, Middleware::GtmScriptNonceInjector)
|
|
|
|
|
|
|
2018-01-12 14:15:10 +11:00
|
|
|
|
require "middleware/discourse_public_exceptions"
|
|
|
|
|
|
config.exceptions_app = Middleware::DiscoursePublicExceptions.new(Rails.public_path)
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
2020-03-11 09:43:55 -04:00
|
|
|
|
require "discourse_js_processor"
|
2022-05-11 10:23:32 +01:00
|
|
|
|
require "discourse_sourcemapping_url_processor"
|
2020-03-11 09:43:55 -04:00
|
|
|
|
|
|
|
|
|
|
Sprockets.register_mime_type "application/javascript",
|
|
|
|
|
|
extensions: %w[.js .es6 .js.es6],
|
|
|
|
|
|
charset: :unicode
|
|
|
|
|
|
Sprockets.register_postprocessor "application/javascript", DiscourseJsProcessor
|
|
|
|
|
|
|
2023-09-26 16:25:07 +01:00
|
|
|
|
class SprocketsSassUnsupported
|
|
|
|
|
|
def self.call(*args)
|
|
|
|
|
|
raise "Discourse does not support compiling scss/sass files via Sprockets"
|
|
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
Sprockets.register_engine(".sass", SprocketsSassUnsupported, silence_deprecation: true)
|
|
|
|
|
|
Sprockets.register_engine(".scss", SprocketsSassUnsupported, silence_deprecation: true)
|
|
|
|
|
|
|
2022-06-20 16:33:05 +02:00
|
|
|
|
Discourse::Application.initializer :prepend_ember_assets do |app|
|
|
|
|
|
|
# Needs to be in its own initializer so it runs after the append_assets_path initializer defined by Sprockets
|
|
|
|
|
|
app
|
|
|
|
|
|
.config
|
|
|
|
|
|
.assets
|
|
|
|
|
|
.paths.unshift "#{app.config.root}/app/assets/javascripts/discourse/dist/assets"
|
|
|
|
|
|
Sprockets.unregister_postprocessor "application/javascript",
|
|
|
|
|
|
Sprockets::Rails::SourcemappingUrlProcessor
|
|
|
|
|
|
Sprockets.register_postprocessor "application/javascript", DiscourseSourcemappingUrlProcessor
|
2022-04-21 16:26:34 +01:00
|
|
|
|
end
|
|
|
|
|
|
|
2013-03-11 05:33:20 -07:00
|
|
|
|
require "discourse_redis"
|
2014-05-07 08:23:52 +10:00
|
|
|
|
require "logster/redis_store"
|
2013-02-05 14:16:51 -05:00
|
|
|
|
# Use redis for our cache
|
2013-03-11 05:33:20 -07:00
|
|
|
|
config.cache_store = DiscourseRedis.new_redis_store
|
2022-01-08 23:39:46 +01:00
|
|
|
|
Discourse.redis = DiscourseRedis.new
|
2014-05-08 06:52:47 +10:00
|
|
|
|
Logster.store = Logster::RedisStore.new(DiscourseRedis.new)
|
2013-02-05 14:16:51 -05:00
|
|
|
|
|
2022-01-08 23:39:46 +01:00
|
|
|
|
# Deprecated
|
|
|
|
|
|
$redis = Discourse.redis # rubocop:disable Style/GlobalVars
|
|
|
|
|
|
|
2013-04-11 16:24:08 +10:00
|
|
|
|
# we configure rack cache on demand in an initializer
|
|
|
|
|
|
# our setup does not use rack cache and instead defers to nginx
|
2013-02-05 14:16:51 -05:00
|
|
|
|
config.action_dispatch.rack_cache = nil
|
|
|
|
|
|
|
2013-08-26 12:52:36 +10:00
|
|
|
|
require "auth"
|
2013-08-01 15:59:57 +10:00
|
|
|
|
|
2018-01-15 15:42:31 -05:00
|
|
|
|
if GlobalSetting.relative_url_root.present?
|
|
|
|
|
|
config.relative_url_root = GlobalSetting.relative_url_root
|
|
|
|
|
|
end
|
|
|
|
|
|
|
2022-01-11 12:30:22 +00:00
|
|
|
|
if Rails.env.test? && GlobalSetting.load_plugins?
|
|
|
|
|
|
Discourse.activate_plugins!
|
|
|
|
|
|
elsif GlobalSetting.load_plugins?
|
2022-03-21 15:28:52 +01:00
|
|
|
|
Plugin.initialization_guard { Discourse.activate_plugins! }
|
2015-03-09 11:45:36 +11:00
|
|
|
|
end
|
|
|
|
|
|
|
2020-08-31 13:14:09 +03:00
|
|
|
|
# Use discourse-fonts gem to symlink fonts and generate .scss file
|
|
|
|
|
|
fonts_path = File.join(config.root, "public/fonts")
|
|
|
|
|
|
Discourse::Utils.atomic_ln_s(DiscourseFonts.path_for_fonts, fonts_path)
|
|
|
|
|
|
|
2022-03-21 15:28:52 +01:00
|
|
|
|
require "stylesheet/manager"
|
|
|
|
|
|
require "svg_sprite"
|
2017-04-12 10:52:52 -04:00
|
|
|
|
|
2013-02-25 19:42:20 +03:00
|
|
|
|
config.after_initialize do
|
2017-08-12 04:22:22 +02:00
|
|
|
|
# Load plugins
|
2019-10-06 20:47:33 +02:00
|
|
|
|
Plugin.initialization_guard { Discourse.plugins.each(&:notify_after_initialize) }
|
2017-07-27 12:08:10 -04:00
|
|
|
|
|
2017-10-30 14:24:15 +11:00
|
|
|
|
# we got to clear the pool in case plugins connect
|
|
|
|
|
|
ActiveRecord::Base.connection_handler.clear_active_connections!
|
2013-02-05 14:16:51 -05:00
|
|
|
|
end
|
2013-09-16 12:58:26 +10:00
|
|
|
|
|
2013-11-20 10:10:12 +11:00
|
|
|
|
require "rbtrace" if ENV["RBTRACE"] == "1"
|
|
|
|
|
|
|
2022-07-08 08:57:09 +08:00
|
|
|
|
config.active_record.query_log_tags_enabled = true if ENV["RAILS_QUERY_LOG_TAGS"] == "1"
|
|
|
|
|
|
|
2016-12-08 11:49:39 +08:00
|
|
|
|
config.generators { |g| g.test_framework :rspec, fixture: false }
|
2013-02-05 14:16:51 -05:00
|
|
|
|
end
|
|
|
|
|
|
end
|