| 
									
										
										
										
											2016-11-15 16:56:29 +01:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-20 22:53:20 +01:00
										 |  |  | class ApplicationController < ActionController::Base | 
					
						
							|  |  |  |   # Prevent CSRF attacks by raising an exception. | 
					
						
							|  |  |  |   # For APIs, you may want to use :null_session instead. | 
					
						
							|  |  |  |   protect_from_forgery with: :exception | 
					
						
							| 
									
										
										
										
											2016-03-25 14:12:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-23 20:44:05 -04:00
										 |  |  |   force_ssl if: :https_enabled? | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-08 02:30:50 +02:00
										 |  |  |   include Localized | 
					
						
							| 
									
										
										
										
											2017-04-29 18:28:16 -04:00
										 |  |  |   include UserTrackingConcern | 
					
						
							| 
									
										
										
										
											2017-04-16 12:51:30 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   helper_method :current_account | 
					
						
							| 
									
										
										
										
											2017-06-25 23:51:32 +02:00
										 |  |  |   helper_method :current_session | 
					
						
							| 
									
										
										
										
											2017-09-19 07:36:23 -07:00
										 |  |  |   helper_method :current_theme | 
					
						
							| 
									
										
										
										
											2017-04-16 12:51:30 +02:00
										 |  |  |   helper_method :single_user_mode? | 
					
						
							| 
									
										
										
										
											2016-08-24 17:56:44 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 02:40:51 +02:00
										 |  |  |   rescue_from ActionController::RoutingError, with: :not_found | 
					
						
							|  |  |  |   rescue_from ActiveRecord::RecordNotFound, with: :not_found | 
					
						
							| 
									
										
										
										
											2017-01-15 10:30:23 +11:00
										 |  |  |   rescue_from ActionController::InvalidAuthenticityToken, with: :unprocessable_entity | 
					
						
							| 
									
										
										
										
											2017-11-11 20:23:33 +01:00
										 |  |  |   rescue_from Mastodon::NotPermittedError, with: :forbidden | 
					
						
							| 
									
										
										
										
											2016-09-08 02:40:51 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-06 15:42:00 +02:00
										 |  |  |   before_action :store_current_location, except: :raise_not_found, unless: :devise_controller? | 
					
						
							| 
									
										
										
										
											2016-12-06 18:03:30 +01:00
										 |  |  |   before_action :check_suspension, if: :user_signed_in? | 
					
						
							| 
									
										
										
										
											2016-10-02 17:11:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-08 02:40:51 +02:00
										 |  |  |   def raise_not_found | 
					
						
							| 
									
										
										
										
											2016-09-29 21:28:21 +02:00
										 |  |  |     raise ActionController::RoutingError, "No route matches #{params[:unmatched_route]}" | 
					
						
							| 
									
										
										
										
											2016-09-08 02:40:51 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-02 17:11:08 +02:00
										 |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-23 20:44:05 -04:00
										 |  |  |   def https_enabled? | 
					
						
							|  |  |  |     Rails.env.production? && ENV['LOCAL_HTTPS'] == 'true' | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-02 17:11:08 +02:00
										 |  |  |   def store_current_location | 
					
						
							|  |  |  |     store_location_for(:user, request.url) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-28 18:45:13 +01:00
										 |  |  |   def require_admin! | 
					
						
							|  |  |  |     redirect_to root_path unless current_user&.admin? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-11 20:23:33 +01:00
										 |  |  |   def require_staff! | 
					
						
							|  |  |  |     redirect_to root_path unless current_user&.staff? | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-06 18:03:30 +01:00
										 |  |  |   def check_suspension | 
					
						
							| 
									
										
										
										
											2017-05-24 23:39:09 +09:00
										 |  |  |     forbidden if current_user.account.suspended? | 
					
						
							| 
									
										
										
										
											2016-12-06 18:03:30 +01:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-05 04:24:58 +02:00
										 |  |  |   def after_sign_out_path_for(_resource_or_scope) | 
					
						
							|  |  |  |     new_user_session_path | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 17:13:41 +02:00
										 |  |  |   protected | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-01 16:24:36 -04:00
										 |  |  |   def forbidden | 
					
						
							|  |  |  |     respond_with_error(403) | 
					
						
							| 
									
										
										
										
											2016-09-08 02:40:51 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-01 16:24:36 -04:00
										 |  |  |   def not_found | 
					
						
							|  |  |  |     respond_with_error(404) | 
					
						
							| 
									
										
										
										
											2017-01-15 10:30:23 +11:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-01 16:24:36 -04:00
										 |  |  |   def gone | 
					
						
							|  |  |  |     respond_with_error(410) | 
					
						
							| 
									
										
										
										
											2017-04-22 20:21:10 -07:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-01-15 10:30:23 +11:00
										 |  |  |   def unprocessable_entity | 
					
						
							| 
									
										
										
										
											2017-05-01 16:24:36 -04:00
										 |  |  |     respond_with_error(422) | 
					
						
							| 
									
										
										
										
											2016-10-05 13:26:44 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:27 +02:00
										 |  |  |   def single_user_mode? | 
					
						
							| 
									
										
										
										
											2017-05-22 22:02:30 +09:00
										 |  |  |     @single_user_mode ||= Rails.configuration.x.single_user_mode && Account.exists? | 
					
						
							| 
									
										
										
										
											2017-04-15 16:46:27 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-18 17:13:41 +02:00
										 |  |  |   def current_account | 
					
						
							| 
									
										
										
										
											2016-11-23 09:20:34 +01:00
										 |  |  |     @current_account ||= current_user.try(:account) | 
					
						
							| 
									
										
										
										
											2016-08-18 17:13:41 +02:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-11-29 15:49:39 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-25 23:51:32 +02:00
										 |  |  |   def current_session | 
					
						
							| 
									
										
										
										
											2017-07-07 23:25:15 +02:00
										 |  |  |     @current_session ||= SessionActivation.find_by(session_id: cookies.signed['_session_id']) | 
					
						
							| 
									
										
										
										
											2017-06-25 23:51:32 +02:00
										 |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-19 07:36:23 -07:00
										 |  |  |   def current_theme | 
					
						
							|  |  |  |     return Setting.default_settings['theme'] unless Themes.instance.names.include? current_user&.setting_theme | 
					
						
							|  |  |  |     current_user.setting_theme | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-29 15:49:39 +01:00
										 |  |  |   def cache_collection(raw, klass) | 
					
						
							| 
									
										
										
										
											2016-11-30 15:57:56 +01:00
										 |  |  |     return raw unless klass.respond_to?(:with_includes) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-03 18:21:26 +01:00
										 |  |  |     raw                    = raw.cache_ids.to_a if raw.is_a?(ActiveRecord::Relation) | 
					
						
							| 
									
										
										
										
											2016-11-29 15:49:39 +01:00
										 |  |  |     uncached_ids           = [] | 
					
						
							|  |  |  |     cached_keys_with_value = Rails.cache.read_multi(*raw.map(&:cache_key)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     raw.each do |item| | 
					
						
							|  |  |  |       uncached_ids << item.id unless cached_keys_with_value.key?(item.cache_key) | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-03 18:21:26 +01:00
										 |  |  |     klass.reload_stale_associations!(cached_keys_with_value.values) if klass.respond_to?(:reload_stale_associations!) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-29 15:49:39 +01:00
										 |  |  |     unless uncached_ids.empty? | 
					
						
							|  |  |  |       uncached = klass.where(id: uncached_ids).with_includes.map { |item| [item.id, item] }.to_h | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-11-17 02:06:26 +01:00
										 |  |  |       uncached.each_value do |item| | 
					
						
							| 
									
										
										
										
											2016-11-29 15:49:39 +01:00
										 |  |  |         Rails.cache.write(item.cache_key, item) | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     raw.map { |item| cached_keys_with_value[item.cache_key] || uncached[item.id] }.compact | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2017-04-21 23:11:20 +07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   def respond_with_error(code) | 
					
						
							| 
									
										
										
										
											2017-05-01 16:24:36 -04:00
										 |  |  |     respond_to do |format| | 
					
						
							|  |  |  |       format.any  { head code } | 
					
						
							|  |  |  |       format.html do | 
					
						
							|  |  |  |         set_locale | 
					
						
							|  |  |  |         render "errors/#{code}", layout: 'error', status: code | 
					
						
							|  |  |  |       end | 
					
						
							|  |  |  |     end | 
					
						
							| 
									
										
										
										
											2017-04-21 23:11:20 +07:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-02-20 22:53:20 +01:00
										 |  |  | end |