Project

General

Profile

Download (1.63 KB) Statistics
| Branch: | Tag: | Revision:
module Foreman::Controller::Session
extend ActiveSupport::Concern

def session_expiry
return if ignore_api_request?
if session[:expires_at].blank? || (session[:expires_at].utc - Time.now.utc).to_i < 0
session[:original_uri] = request.fullpath
backup_session_content { expire_session }
end
rescue => e
logger.warn "failed to determine if user sessions needs to be expired, expiring anyway: #{e}"
expire_session
end

# Backs up some state from a user's session around a supplied block, which
# will usually expire or reset the session in some way
def backup_session_content
save_items = session.to_hash.slice('organization_id', 'location_id', 'original_uri').symbolize_keys
yield if block_given?
session.merge!(save_items)
end

def update_activity_time
return if ignore_api_request?
session[:expires_at] = Setting[:idle_timeout].minutes.from_now.utc
end

def expire_session
logger.info "Session for #{User.current} is expired."
reset_session
if api_request?
render :text => '', :status => 401
else
sso = get_sso_method
if sso.nil? || !sso.support_expiration?
flash[:warning] = _("Your session has expired, please login again")
redirect_to main_app.login_users_path
else
redirect_to sso.expiration_url
end
end
end

# If an API is invoked from the UI, the session will include an :expires_at.
# When :expires_at is received, it must be managed and the request denied
# when an expiration has occurred; otherwise, it may be ignored.
def ignore_api_request?
api_request? && session[:expires_at].blank?
end
end
(5-5/9)