class ApplicationController < ActionController::Base protect_from_forgery helper :pagination before_filter :reset_current_user before_filter :set_current_user after_filter :reset_current_user before_filter :set_title before_filter :normalize_search before_filter :set_started_at_session before_filter :api_check before_filter :set_safe_mode # before_filter :secure_cookies_check layout "default" force_ssl :if => :ssl_login? helper_method :show_moderation_notice? rescue_from Exception, :with => :rescue_exception rescue_from User::PrivilegeError, :with => :access_denied rescue_from SessionLoader::AuthenticationFailure, :with => :authentication_failed rescue_from Danbooru::Paginator::PaginationError, :with => :render_pagination_limit protected def show_moderation_notice? CurrentUser.can_approve_posts? && (cookies[:moderated].blank? || Time.at(cookies[:moderated].to_i) < 1.day.ago) end def ssl_login? cookies[:ssl_login].present? end def enable_cors response.headers["Access-Control-Allow-Origin"] = "*" end def require_shared_key unless params[:key] == Danbooru.config.shared_remote_key render(text: "forbidden", status: 403) return false end end def api_check if request.format.to_s =~ /\/json|\/xml/ || params[:controller] == "iqdb" if ApiLimiter.throttled?(request.remote_ip, request.request_method) render :text => "421 User Throttled\n", :layout => false, :status => 421 return false end end return true end def rescue_exception(exception) @exception = exception if exception.is_a?(::ActiveRecord::StatementInvalid) && exception.to_s =~ /statement timeout/ if Rails.env.production? NewRelic::Agent.notice_error(exception, :uri => request.original_url, :referer => request.referer, :request_params => params, :custom_params => {:user_id => CurrentUser.user.id, :user_ip_addr => CurrentUser.ip_addr}) end @error_message = "The database timed out running your query." render :template => "static/error", :status => 500 elsif exception.is_a?(::ActiveRecord::RecordNotFound) @error_message = "That record was not found" render :template => "static/error", :status => 404 else render :template => "static/error", :status => 500 end end def render_pagination_limit @error_message = "You can only view up to #{Danbooru.config.max_numbered_pages} pages. Please narrow your search terms." render :template => "static/error", :status => 410 end def authentication_failed respond_to do |fmt| fmt.html do render :text => "authentication failed", :status => 401 end fmt.xml do render :xml => {:sucess => false, :reason => "authentication failed"}.to_xml(:root => "response"), :status => 401 end fmt.json do render :json => {:success => false, :reason => "authentication failed"}.to_json, :status => 401 end end end def access_denied(exception = nil) previous_url = params[:url] || request.fullpath respond_to do |fmt| fmt.html do if CurrentUser.is_anonymous? if request.get? redirect_to new_session_path(:url => previous_url), :notice => "Access denied" else redirect_to new_session_path, :notice => "Access denied" end else render :template => "static/access_denied", :status => 403 end end fmt.xml do render :xml => {:success => false, :reason => "access denied"}.to_xml(:root => "response"), :status => 403 end fmt.json do render :json => {:success => false, :reason => "access denied"}.to_json, :status => 403 end fmt.js do render :nothing => true, :status => 403 end end end def set_current_user session_loader = SessionLoader.new(session, cookies, request, params) session_loader.load end def reset_current_user CurrentUser.user = nil CurrentUser.ip_addr = nil CurrentUser.mobile_mode = false end def set_started_at_session if session[:started_at].blank? session[:started_at] = Time.now end end User::Roles.each do |role| define_method("#{role}_only") do if !CurrentUser.user.is_banned_or_ip_banned? && CurrentUser.user.__send__("is_#{role}?") true else access_denied() false end end end def set_title @page_title = Danbooru.config.app_name + "/#{params[:controller]}" end def normalize_search if request.get? if params[:search].blank? params[:search] = {} end if params[:search].is_a?(Hash) changed = params[:search].reject! {|k,v| v.blank?} unless changed.nil? redirect_to url_for(params) end end end end def set_safe_mode CurrentUser.set_safe_mode(request) end def secure_cookies_check if request.ssl? Rails.application.config.session_store :cookie_store, :key => '_danbooru_session', :secure => true else Rails.application.config.session_store :cookie_store, :key => '_danbooru_session', :secure => false end end end