+ rescue Timeout::Error
+ raise OSM::APITimeoutError
+ end
+
+ ##
+ # wrap a web page in a timeout
+ def web_timeout
+ OSM::Timer.timeout(WEB_TIMEOUT, Timeout::Error) do
+ yield
+ end
+ rescue ActionView::Template::Error => ex
+ ex = ex.original_exception
+
+ if ex.is_a?(Timeout::Error) ||
+ (ex.is_a?(ActiveRecord::StatementInvalid) && ex.message =~ /execution expired/)
+ render :action => "timeout"
+ else
+ raise
+ end
+ rescue Timeout::Error
+ render :action => "timeout"
+ end
+
+ ##
+ # ensure that there is a "this_user" instance variable
+ def lookup_this_user
+ unless @this_user = User.active.find_by(:display_name => params[:display_name])
+ render_unknown_user params[:display_name]
+ end
+ end
+
+ ##
+ # render a "no such user" page
+ def render_unknown_user(name)
+ @title = t "user.no_such_user.title"
+ @not_found_user = name
+
+ respond_to do |format|
+ format.html { render :template => "user/no_such_user", :status => :not_found }
+ format.all { head :not_found }
+ end
+ end
+
+ ##
+ # Unfortunately if a PUT or POST request that has a body fails to
+ # read it then Apache will sometimes fail to return the response it
+ # is given to the client properly, instead erroring:
+ #
+ # https://issues.apache.org/bugzilla/show_bug.cgi?id=44782
+ #
+ # To work round this we call rewind on the body here, which is added
+ # as a filter, to force it to be fetched from Apache into a file.
+ def fetch_body
+ request.body.rewind
+ end
+
+ def map_layout
+ append_content_security_policy_directives(
+ :connect_src => %w[nominatim.openstreetmap.org overpass-api.de router.project-osrm.org valhalla.mapzen.com],
+ :script_src => %w[graphhopper.com open.mapquestapi.com],
+ :img_src => %w[developer.mapquest.com]
+ )
+
+ if STATUS == :database_offline || STATUS == :api_offline
+ flash.now[:warning] = t("layouts.osm_offline")
+ elsif STATUS == :database_readonly || STATUS == :api_readonly
+ flash.now[:warning] = t("layouts.osm_read_only")
+ end
+
+ request.xhr? ? "xhr" : "map"
+ end
+
+ def preferred_editor
+ editor = if params[:editor]
+ params[:editor]
+ elsif @user && @user.preferred_editor
+ @user.preferred_editor
+ else
+ DEFAULT_EDITOR
+ end
+
+ editor
+ end
+
+ helper_method :preferred_editor
+
+ def update_totp
+ if defined?(TOTP_KEY)
+ cookies["_osm_totp_token"] = {
+ :value => ROTP::TOTP.new(TOTP_KEY, :interval => 3600).now,
+ :domain => "openstreetmap.org",
+ :expires => 1.hour.from_now
+ }
+ end