Patch #15234 » session_expired_popup_message.diff
config/routes.rb (working copy) | ||
---|---|---|
17 | 17 | |
18 | 18 |
RedmineApp::Application.routes.draw do |
19 | 19 |
root :to => 'welcome#index', :as => 'home' |
20 |
|
|
21 |
get '/session_heartbeat', :to => 'application#session_heartbeat' |
|
20 | 22 | |
21 | 23 |
match 'login', :to => 'account#login', :as => 'signin', :via => [:get, :post] |
22 | 24 |
match 'logout', :to => 'account#logout', :as => 'signout', :via => [:get, :post] |
public/javascripts/application.js (working copy) | ||
---|---|---|
591 | 591 |
$(document).ready(setupAjaxIndicator); |
592 | 592 |
$(document).ready(hideOnLoad); |
593 | 593 |
$(document).ready(addFormObserversForDoubleSubmit); |
594 | ||
595 |
function SessionHeartbeat() { |
|
596 |
$.ajax( { |
|
597 |
url: '/session_heartbeat', |
|
598 |
success: function(data) { |
|
599 |
if(data.expired) { |
|
600 |
alert(data.message); |
|
601 |
} |
|
602 |
else if(data.remain > 0) { |
|
603 |
setTimeout(SessionHeartbeat, data.remain); |
|
604 |
} |
|
605 |
} |
|
606 |
} |
|
607 |
); |
|
608 |
} |
app/helpers/application_helper.rb (working copy) | ||
---|---|---|
1227 | 1227 |
unless User.current.pref.warn_on_leaving_unsaved == '0' |
1228 | 1228 |
tags << "\n".html_safe + javascript_tag("$(window).load(function(){ warnLeavingUnsaved('#{escape_javascript l(:text_warn_on_leaving_unsaved)}'); });") |
1229 | 1229 |
end |
1230 |
if User.current && (!User.current.anonymous?) && (Setting.session_timeout || Setting.session_lifetime) |
|
1231 |
lifetime = Setting.session_lifetime ? Setting.session_lifetime.to_i : 0 |
|
1232 |
timeout = Setting.session_timeout ? Setting.session_timeout.to_i : 0 |
|
1233 |
timeout = lifetime if lifetime > 0 && lifetime < timeout |
|
1234 |
unless timeout == 0 |
|
1235 |
tags << "\n".html_safe + javascript_tag("setTimeout(SessionHeartbeat, #{timeout * 60000});") |
|
1236 |
end |
|
1237 |
end |
|
1230 | 1238 |
tags |
1231 | 1239 |
end |
1232 | 1240 |
app/controllers/application_controller.rb (working copy) | ||
---|---|---|
48 | 48 |
include Redmine::MenuManager::MenuController |
49 | 49 |
helper Redmine::MenuManager::MenuHelper |
50 | 50 | |
51 |
def session_heartbeat |
|
52 |
remain = 0 |
|
53 |
if Setting.session_lifetime? && session[:ctime] |
|
54 |
remain = (Setting.session_lifetime.to_i * 60) - (Time.now.utc.to_i - session[:ctime].to_i) |
|
55 |
end |
|
56 |
if Setting.session_timeout? && session[:atime] |
|
57 |
if remain > 0 |
|
58 |
remain = [remain, (Setting.session_timeout.to_i * 60) - (Time.now.utc.to_i - session[:atime].to_i)].min |
|
59 |
else |
|
60 |
remain = (Setting.session_timeout.to_i * 60) - (Time.now.utc.to_i - session[:atime].to_i) |
|
61 |
end |
|
62 |
end |
|
63 |
if session_expired? || remain <= 0 |
|
64 |
render json: { expired: true, message: l(:error_session_expired) } |
|
65 |
else |
|
66 |
render json: { expired: false, remain: (remain * 1000) } |
|
67 |
end |
|
68 |
end |
|
69 | ||
51 | 70 |
def session_expiration |
71 |
# Skip session heartbeat |
|
72 |
return if ((params[:controller] == 'application') && (params[:action] = 'session_heartbeat')) |
|
52 | 73 |
if session[:user_id] |
53 | 74 |
if session_expired? && !try_to_autologin |
54 | 75 |
reset_session |