X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/abca51e4d8a51cb484598840a1b2459c651e1e67..0bdc865d9fb8da48852372351b86bd42f9772266:/app/controllers/application_controller.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 8adea79a4..d571535d3 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -1,4 +1,6 @@ class ApplicationController < ActionController::Base + require "timeout" + include SessionPersistence protect_from_forgery :with => :exception @@ -23,7 +25,11 @@ class ApplicationController < ActionController::Base if session[:user] self.current_user = User.where(:id => session[:user]).where("status IN ('active', 'confirmed', 'suspended')").first - if current_user.status == "suspended" + if session[:fingerprint] && + session[:fingerprint] != current_user.fingerprint + reset_session + self.current_user = nil + elsif current_user.status == "suspended" session.delete(:user) session_expires_automatically @@ -42,6 +48,8 @@ class ApplicationController < ActionController::Base elsif session[:token] session[:user] = current_user.id if self.current_user = User.authenticate(:token => session[:token]) end + + session[:fingerprint] = current_user.fingerprint if current_user && session[:fingerprint].nil? rescue StandardError => e logger.info("Exception authorizing user: #{e}") reset_session @@ -51,7 +59,7 @@ class ApplicationController < ActionController::Base def require_user unless current_user if request.get? - redirect_to :controller => "users", :action => "login", :referer => request.fullpath + redirect_to login_path(:referer => request.fullpath) else head :forbidden end @@ -78,7 +86,7 @@ class ApplicationController < ActionController::Base end end - def check_database_readable(need_api = false) + def check_database_readable(need_api: false) if Settings.status == "database_offline" || (need_api && Settings.status == "api_offline") if request.xhr? report_error "Database offline for maintenance", :service_unavailable @@ -88,7 +96,7 @@ class ApplicationController < ActionController::Base end end - def check_database_writable(need_api = false) + def check_database_writable(need_api: false) if Settings.status == "database_offline" || Settings.status == "database_readonly" || (need_api && (Settings.status == "api_offline" || Settings.status == "api_readonly")) if request.xhr? @@ -165,7 +173,7 @@ class ApplicationController < ActionController::Base end end - def preferred_languages(reset = false) + def preferred_languages(reset: false) @preferred_languages = nil if reset @preferred_languages ||= if params[:locale] Locale.list(params[:locale]) @@ -178,13 +186,13 @@ class ApplicationController < ActionController::Base helper_method :preferred_languages - def set_locale(reset = false) + def set_locale(reset: false) if current_user&.languages&.empty? && !http_accept_language.user_preferred_languages.empty? current_user.languages = http_accept_language.user_preferred_languages current_user.save end - I18n.locale = Locale.available.preferred(preferred_languages(reset)) + I18n.locale = Locale.available.preferred(preferred_languages(:reset => reset)) response.headers["Vary"] = "Accept-Language" response.headers["Content-Language"] = I18n.locale.to_s @@ -223,7 +231,7 @@ class ApplicationController < ActionController::Base ## # wrap an api call in a timeout def api_call_timeout(&block) - OSM::Timer.timeout(Settings.api_timeout, Timeout::Error, &block) + Timeout.timeout(Settings.api_timeout, Timeout::Error, &block) rescue Timeout::Error raise OSM::APITimeoutError end @@ -231,7 +239,7 @@ class ApplicationController < ActionController::Base ## # wrap a web page in a timeout def web_timeout(&block) - OSM::Timer.timeout(Settings.web_timeout, Timeout::Error, &block) + Timeout.timeout(Settings.web_timeout, Timeout::Error, &block) rescue ActionView::Template::Error => e e = e.cause @@ -348,7 +356,7 @@ class ApplicationController < ActionController::Base end elsif request.get? respond_to do |format| - format.html { redirect_to :controller => "users", :action => "login", :referer => request.fullpath } + format.html { redirect_to login_path(:referer => request.fullpath) } format.any { head :forbidden } end else @@ -385,6 +393,8 @@ class ApplicationController < ActionController::Base referer = nil end + referer = nil if referer&.path&.first != "/" + referer.to_s end end