Files
danbooru/app/controllers/application_controller.rb
Toks c2d38720ad Trim down unnecessarily long query strings
When submitting search forms, fields that aren't filled out will still
appear in the url, taking up space and making the url harder to
understand.

This commit removes blank parameters from the query string and redirects
to the new url. Since these blank parameters were already ignored by the
individual #search methods this shouldn't negatively affect anything.
2013-11-29 16:15:41 -05:00

125 lines
3.5 KiB
Ruby

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"
rescue_from User::PrivilegeError, :with => :access_denied
rescue_from Danbooru::Paginator::PaginationError, :with => :render_pagination_limit
protected
def api_check
if request.format.to_s =~ /\/json|\/xml/
if ApiLimiter.throttled?(request.remote_ip)
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/
@exception = nil
@error_message = "The database timed out running your query."
render :template => "static/error", :status => 500
elsif exception.is_a?(::ActiveRecord::RecordNotFound)
@exception = nil
@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 access_denied(exception = nil)
previous_url = params[:url] || request.fullpath
respond_to do |fmt|
fmt.html do
if request.get?
redirect_to new_session_path(:url => previous_url), :notice => "Access denied"
else
redirect_to new_session_path, :notice => "Access denied"
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
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
%w(member banned builder gold platinum contributor janitor moderator admin).each do |level|
define_method("#{level}_only") do
if !CurrentUser.user.is_banned? && CurrentUser.user.__send__("is_#{level}?")
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?
params[:search] ||= {}
changed = params[:search].reject! {|k,v| v.blank?}
unless changed.nil?
redirect_to params
end
end
end
def set_safe_mode
CurrentUser.set_safe_mode(request)
end
def secure_cookies_check
if request.ssl?
Danbooru::Application.config.session_store :cookie_store, :key => '_danbooru_session', :secure => true
else
Danbooru::Application.config.session_store :cookie_store, :key => '_danbooru_session', :secure => false
end
end
end