]> source.dussan.org Git - redmine.git/commitdiff
Backported r9797 from trunk.
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 10 Jun 2012 20:30:58 +0000 (20:30 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 10 Jun 2012 20:30:58 +0000 (20:30 +0000)
git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/branches/1.4-stable@9810 e93f8b46-1217-0410-a6f0-8f06a7374b81

52 files changed:
app/controllers/application_controller.rb
app/views/settings/_authentication.html.erb
config/locales/ar.yml
config/locales/bg.yml
config/locales/bs.yml
config/locales/ca.yml
config/locales/cs.yml
config/locales/da.yml
config/locales/de.yml
config/locales/el.yml
config/locales/en-GB.yml
config/locales/en.yml
config/locales/es.yml
config/locales/et.yml
config/locales/eu.yml
config/locales/fa.yml
config/locales/fi.yml
config/locales/fr.yml
config/locales/gl.yml
config/locales/he.yml
config/locales/hr.yml
config/locales/hu.yml
config/locales/id.yml
config/locales/it.yml
config/locales/ja.yml
config/locales/ko.yml
config/locales/lt.yml
config/locales/lv.yml
config/locales/mk.yml
config/locales/mn.yml
config/locales/nl.yml
config/locales/no.yml
config/locales/pl.yml
config/locales/pt-BR.yml
config/locales/pt.yml
config/locales/ro.yml
config/locales/ru.yml
config/locales/sk.yml
config/locales/sl.yml
config/locales/sq.yml
config/locales/sr-YU.yml
config/locales/sr.yml
config/locales/sv.yml
config/locales/th.yml
config/locales/tr.yml
config/locales/uk.yml
config/locales/vi.yml
config/locales/zh-TW.yml
config/locales/zh.yml
config/settings.yml
doc/CHANGELOG
test/functional/sessions_test.rb [new file with mode: 0644]

index c0793a4bfd6c220af98cd28888d215d25aaf6c1a..c5edb6e1f5b395aaaf9ec12b095f9b6e07c4000a 100644 (file)
@@ -56,7 +56,7 @@ class ApplicationController < ActionController::Base
     end
   end
 
-  before_filter :user_setup, :check_if_login_required, :set_localization
+  before_filter :session_expiration, :user_setup, :check_if_login_required, :set_localization
   filter_parameter_logging :password
 
   rescue_from ActionController::InvalidAuthenticityToken, :with => :invalid_authenticity_token
@@ -70,6 +70,38 @@ class ApplicationController < ActionController::Base
     require_dependency "repository/#{scm.underscore}"
   end
 
+  def session_expiration
+    if session[:user_id]
+      if session_expired? && !try_to_autologin
+        reset_session
+        flash[:error] = l(:error_session_expired)
+        redirect_to signin_url
+      else
+        session[:atime] = Time.now.utc.to_i
+      end
+    end
+  end
+
+  def session_expired?
+    if Setting.session_lifetime?
+      unless session[:ctime] && (Time.now.utc.to_i - session[:ctime].to_i <= Setting.session_lifetime.to_i * 60)
+        return true
+      end
+    end
+    if Setting.session_timeout?
+      unless session[:atime] && (Time.now.utc.to_i - session[:atime].to_i <= Setting.session_timeout.to_i * 60)
+        return true
+      end
+    end
+    false
+  end
+
+  def start_user_session(user)
+    session[:user_id] = user.id
+    session[:ctime] = Time.now.utc.to_i
+    session[:atime] = Time.now.utc.to_i
+  end
+
   def user_setup
     # Check the settings cache for each request
     Setting.check_cache
@@ -83,10 +115,7 @@ class ApplicationController < ActionController::Base
     if session[:user_id]
       # existing session
       (User.active.find(session[:user_id]) rescue nil)
-    elsif cookies[:autologin] && Setting.autologin?
-      # auto-login feature starts a new session
-      user = User.try_to_autologin(cookies[:autologin])
-      session[:user_id] = user.id if user
+    elsif user = try_to_autologin
       user
     elsif params[:format] == 'atom' && params[:key] && request.get? && accept_rss_auth?
       # RSS key authentication does not start a session
@@ -104,12 +133,24 @@ class ApplicationController < ActionController::Base
     end
   end
 
+  def try_to_autologin
+    if cookies[:autologin] && Setting.autologin?
+      # auto-login feature starts a new session
+      user = User.try_to_autologin(cookies[:autologin])
+      if user
+        reset_session
+        start_user_session(user)
+      end
+      user
+    end
+  end
+
   # Sets the logged in user
   def logged_user=(user)
     reset_session
     if user && user.is_a?(User)
       User.current = user
-      session[:user_id] = user.id
+      start_user_session(user)
     else
       User.current = User.anonymous
     end
index 14396e274cb151eb314d0cda7effb8367f093193..083aec83a5d219e249939fa741fb13d05a9f6b90 100644 (file)
 <p><%= setting_check_box :rest_api_enabled %></p>
 </div>
 
+<fieldset class="box">
+  <legend><%= l(:label_session_expiration) %></legend>
+
+  <div class="tabular settings">
+    <p><%= setting_select :session_lifetime, [[l(:label_disabled), 0]] + [1, 7, 30, 60, 365].collect{|days| [l('datetime.distance_in_words.x_days', :count => days), (days * 60 * 24).to_s]} %></p>
+    <p><%= setting_select :session_timeout, [[l(:label_disabled), 0]] + [1, 2, 4, 8, 12, 24, 48].collect{|hours| [l('datetime.distance_in_words.x_hours', :count => hours), (hours * 60).to_s]} %></p>
+  </div>
+  
+  <p><em class="info"><%= l(:text_session_expiration_settings) %></em></p>
+</fieldset>
+
 <%= submit_tag l(:button_save) %>
 <% end %>
index 7dbdb564663348a0f155540fd093f1b4bc00482a..9a88cc89a10d7428a53aefaa126d4a117b9b59d3 100644 (file)
@@ -49,6 +49,9 @@ ar:
       about_x_hours:
         one:   "حوالي ساعة"
         other: "ساعات %{count}حوالي "
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "يوم"
         other: "%{count} أيام"
@@ -1031,3 +1034,8 @@ ar:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index db574321f9b3c27e848ec6743b4c0ff05a13e68d..ea2d9a378c2aaea84ea0ed27e2962a2c2d76ee0c 100644 (file)
@@ -50,6 +50,9 @@ bg:
       about_x_hours:
         one:   "около 1 час"
         other: "около %{count} часа"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 ден"
         other: "%{count} дена"
@@ -1028,3 +1031,8 @@ bg:
   description_date_range_interval: Изберете диапазон чрез задаване на начална и крайна дати
   description_date_from: Въведете начална дата
   description_date_to: Въведете крайна дата
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 7e80c3b0a0cc0478c8a3548c0864c36e41000890..39aac6339f4cb43dc5647cce05f0c2379e87cbb4 100644 (file)
@@ -48,6 +48,9 @@ bs:
       about_x_hours:
         one:   "oko 1 sahat"
         other: "oko %{count} sahata"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 dan"
         other: "%{count} dana"
@@ -1045,3 +1048,8 @@ bs:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 304c5123d746bae482331031f515b6e87f021f07..71d3361aa04c83cf503caa09cffca4395adfc8cf 100644 (file)
@@ -52,6 +52,9 @@ ca:
       about_x_hours:
         one:   "aproximadament 1 hora"
         other: "aproximadament %{count} hores"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 dia"
         other: "%{count} dies"
@@ -1033,3 +1036,8 @@ ca:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 1e6a8c668ba51d40d7f7db7f08672ba69f430331..163e1b02f62cf5f53ef9973e38730bd557d5f7fb 100644 (file)
@@ -53,6 +53,9 @@ cs:
       about_x_hours:
         one:   "asi 1 hodina"
         other: "asi %{count} hodin"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 den"
         other: "%{count} dnů"
@@ -1034,3 +1037,8 @@ cs:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 5cb6d9084d8d43cfe1a726aa935862141084e02d..dd610a22a7d6267b6000d2063d344872cfcb9ea4 100644 (file)
@@ -51,6 +51,9 @@ da:
       about_x_hours:
         one:  "cirka en time"
         other: "cirka %{count} timer"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:  "en dag"
         other: "%{count} dage"
@@ -1048,3 +1051,8 @@ da:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 49d38e657656a8835f86f1d933c2fcd293b911dd..374fcb2ea9509ad0063b7969537a5477f17b7da3 100644 (file)
@@ -52,6 +52,9 @@ de:
       about_x_hours:
         one: 'etwa 1 Stunde'
         other: 'etwa %{count} Stunden'
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one: '1 Tag'
         other: '%{count} Tagen'
@@ -1049,3 +1052,8 @@ de:
   setting_unsubscribe: Erlaubt Benutzern das eigene Benutzerkonto zu löschen
   button_delete_my_account: Mein Benutzerkonto löschen 
   text_account_destroy_confirmation: Möchten Sie wirklich fortfahren?\nIhr Benutzerkonto wird für immer gelöscht und kann nicht wiederhergestellt werden.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 88e135808213495712ec3562ff792a77ff6966c7..a2c81681ad0f9166e367dedb644bc1b6d65ff082 100644 (file)
@@ -51,6 +51,9 @@ el:
       about_x_hours:
         one:   "περίπου 1 ώρα"
         other: "περίπου %{count} ώρες"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 ημέρα"
         other: "%{count} ημέρες"
@@ -1031,3 +1034,8 @@ el:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 9b885ec2af87b08d37f5747c5fb5112f03ff03f2..f01c41e9a700dfe4fc0a99ea0be4399b2b490419 100644 (file)
@@ -48,6 +48,9 @@ en-GB:
       about_x_hours:
         one:   "about 1 hour"
         other: "about %{count} hours"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 day"
         other: "%{count} days"
@@ -1033,3 +1036,8 @@ en-GB:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 6c13393fcfcef0dfcc507f0c9bb8efc35856fc75..2c587d8df74c0671d527a1a6841aa24261ccd2bc 100644 (file)
@@ -49,6 +49,9 @@ en:
       about_x_hours:
         one:   "about 1 hour"
         other: "about %{count} hours"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 day"
         other: "%{count} days"
@@ -194,6 +197,7 @@ en:
   error_unable_delete_issue_status: 'Unable to delete issue status'
   error_unable_to_connect: "Unable to connect (%{value})"
   error_attachment_too_big: "This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})"
+  error_session_expired: "Your session has expired. Please login again."
   warning_attachments_not_saved: "%{count} file(s) could not be saved."
 
   mail_subject_lost_password: "Your %{value} password"
@@ -385,6 +389,8 @@ en:
   setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
   setting_commit_cross_project_ref: Allow issues of all the other projects to be referenced and fixed
   setting_unsubscribe: Allow users to delete their own account
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
 
   permission_add_project: Create project
   permission_add_subprojects: Create subprojects
@@ -847,6 +853,7 @@ en:
   label_item_position: "%{position} of %{count}"
   label_completed_versions: Completed versions
   label_search_for_watchers: Search for watchers to add
+  label_session_expiration: Session expiration
 
   button_login: Login
   button_submit: Submit
@@ -982,6 +989,7 @@ en:
   text_issue_conflict_resolution_add_notes: "Add my notes and discard my other changes"
   text_issue_conflict_resolution_cancel: "Discard all my changes and redisplay %{link}"
   text_account_destroy_confirmation: "Are you sure you want to proceed?\nYour account will be permanently deleted, with no way to reactivate it."
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
 
   default_role_manager: Manager
   default_role_developer: Developer
index 9a0a9096abf404417831f4763486d76a5cf1cf23..fa22b782a2062efaa1f0558ffbb9257e9f6e62d0 100644 (file)
@@ -79,6 +79,9 @@ es:
       about_x_hours:
         one:  "alrededor de 1 hora"
         other: "alrededor de %{count} horas"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:  "1 día"
         other: "%{count} días"
@@ -1068,3 +1071,8 @@ es:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 14f4079739038d921482bdf2006a0b6fa2a1b453..2c6c38313a6e2d85ed787597867cb46e3c35e64f 100644 (file)
@@ -67,6 +67,9 @@ et:
       about_x_hours:
         one:   "umbes 1 tund"
         other: "umbes %{count} tundi"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 päev"
         other: "%{count} päeva"
@@ -1047,3 +1050,8 @@ et:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 2c6eaec4d4732f6cc080b8f894b5c191e71cd537..e836e6bbf8a3aab1653086435b29c7bdb1a8eb9c 100644 (file)
@@ -52,6 +52,9 @@ eu:
       about_x_hours:
         one:   "ordu 1 inguru"
         other: "%{count} ordu inguru"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "egun 1"
         other: "%{count} egun"
@@ -1034,3 +1037,8 @@ eu:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 7d071aa7f0fae5da38c7c18ede5675f4e17edc11..8030080de46657208a0a937916b123493341eac4 100644 (file)
@@ -49,6 +49,9 @@ fa:
       about_x_hours:
         one:   "نزدیک 1 ساعت"
         other: "نزدیک %{count} ساعت"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 روز"
         other: "%{count} روز"
@@ -1033,3 +1036,8 @@ fa:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 5b43fa8754ed66cdce8feaa53f71b5140ae12a35..7ab7a6a679171be31aa2008093855336c614837a 100644 (file)
@@ -94,6 +94,9 @@ fi:
       about_x_hours:
         one:   "noin tunti"
         other: "noin %{count} tuntia"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "päivä"
         other: "%{count} päivää"
@@ -1052,3 +1055,8 @@ fi:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index d3e2a5473d6b1056393abd1082952489a3afeac7..976d62a28df895dca3252e42c90020941d3a7375 100644 (file)
@@ -53,6 +53,9 @@ fr:
       about_x_hours:
         one:   "environ une heure"
         other: "environ %{count} heures"
+      x_hours:
+        one:   "une heure"
+        other: "%{count} heures"
       x_days:
         one:   "un jour"
         other: "%{count} jours"
@@ -201,6 +204,7 @@ fr:
   error_workflow_copy_target: 'Veuillez sélectionner les trackers et rôles cibles'
   error_issue_done_ratios_not_updated: L'avancement des demandes n'a pas pu être mis à jour.
   error_attachment_too_big: Ce fichier ne peut pas être attaché car il excède la taille maximale autorisée (%{max_size})
+  error_session_expired: "Votre session a expiré. Veuillez vous reconnecter."
 
   warning_attachments_not_saved: "%{count} fichier(s) n'ont pas pu être sauvegardés."
 
@@ -381,6 +385,8 @@ fr:
   setting_default_issue_start_date_to_creation_date: Donner à la date de début d'une nouvelle demande la valeur de la date du jour
   setting_commit_cross_project_ref: Permettre le référencement et la résolution des demandes de tous les autres projets
   setting_unsubscribe: Permettre aux utilisateurs de supprimer leur propre compte
+  setting_session_lifetime: Durée de vie maximale des sessions
+  setting_session_timeout: Durée maximale d'inactivité
 
   permission_add_project: Créer un projet
   permission_add_subprojects: Créer des sous-projets
@@ -822,6 +828,7 @@ fr:
   label_copy_attachments: Copier les fichiers
   label_item_position: "%{position} sur %{count}"
   label_completed_versions: Versions passées
+  label_session_expiration: Expiration des sessions
 
   button_login: Connexion
   button_submit: Soumettre
@@ -938,6 +945,7 @@ fr:
   text_issue_conflict_resolution_add_notes: "Ajouter mes notes et ignorer mes autres changements"
   text_issue_conflict_resolution_cancel: "Annuler ma mise à jour et réafficher %{link}"
   text_account_destroy_confirmation: "Êtes-vous sûr de vouloir continuer ?\nVotre compte sera définitivement supprimé, sans aucune possibilité de le réactiver."
+  text_session_expiration_settings: "Attention : le changement de ces paramètres peut entrainer l'expiration des sessions utilisateurs en cours, y compris la vôtre."
 
   default_role_manager: "Manager "
   default_role_developer: "Développeur "
index 94df2918f27d0e8631f7463591a389cb04b91c61..b60060c37d640f91dd7906bd6e759d8de4606fe9 100644 (file)
@@ -90,6 +90,9 @@ gl:
       about_x_hours:
         one: 'aproximadamente unha hora'
         other: '%{count} horas'
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one: '1 día'
         other: '%{count} días'
@@ -1042,3 +1045,8 @@ gl:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index fde9b4e59c5cde2cd253d58951820164cd5fbc8d..c059bb181ae95ea4238710af035e6462cd7a67e3 100644 (file)
@@ -55,6 +55,9 @@ he:
       about_x_hours:
         one: 'בערך שעה אחת'
         other: 'בערך %{count} שעות'
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one: 'יום אחד'
         other: '%{count} ימים'
@@ -1036,3 +1039,8 @@ he:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index e6efe76f7cdbbcc4ba3db2d9a3badd628a6de4d9..c5d8c3090948617c88b49edbeb8cd0a231891888 100644 (file)
@@ -48,6 +48,9 @@ hr:
       about_x_hours:
         one:   "oko sat vremena"
         other: "oko %{count} sati"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 dan"
         other: "%{count} dana"
@@ -1034,3 +1037,8 @@ hr:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 85d7aa3f925dd73895559a8101978e80f6e0f891..311dfff729aa7378ef99b86cc391d5add1c328e4 100644 (file)
@@ -50,6 +50,9 @@
       about_x_hours:
         one: 'csaknem 1 órája'
         other: 'csaknem %{count} órája'
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one: '1 napja'
         other: '%{count} napja'
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 15b38c94581dbdd871e04e2e5eccd88fbd1e25c0..c61a36f4e60fa964bc4d668e1409e90778fe58e3 100644 (file)
@@ -46,6 +46,9 @@ id:
       about_x_hours:
         one:   "sekitar sejam"
         other: "sekitar %{count} jam"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "sehari"
         other: "%{count} hari"
@@ -1037,3 +1040,8 @@ id:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index a5aa649f8505f0639c2884d768705feaf77c5de7..b3dfd5ec4bbcfa03a867bb8744b1790ba39ee6ec 100644 (file)
@@ -54,6 +54,9 @@ it:
       about_x_hours:
         one:  "circa un'ora"
         other: "circa %{count} ore"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:  "1 giorno"
         other: "%{count} giorni"
@@ -1032,3 +1035,8 @@ it:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index c65cdec900adf1e51cbdeb80f7a5a7116dcb357f..fcf8383acfedc2d73924501f37ad1f4d8cad1a3a 100644 (file)
@@ -52,6 +52,9 @@ ja:
       about_x_hours:
         one:   "約1時間"
         other: "約%{count}時間"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1日"
         other: "%{count}日"
@@ -1061,3 +1064,8 @@ ja:
   text_account_destroy_confirmation: |-
     本当にアカウントを削除しますか?
     アカウントは恒久的に削除されます。削除後に再度アカウントを有効にする手段はありません。
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 0ceebd145dce0148959ab6497db6c6ddae771bc9..9551516bac58e3674e78287a3b38046b03248910 100644 (file)
@@ -49,6 +49,9 @@ ko:
       about_x_hours:
         one:   "약 한시간"
         other: "약 %{count}시간"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "하루"
         other: "%{count}일"
@@ -1081,3 +1084,8 @@ ko:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 9e6d434bc99fc51d18bea2e48d65bb76734b4d7e..381919bb96e6269c1335a5f7e5b8b71151ee7433 100644 (file)
@@ -58,6 +58,9 @@ lt:
       about_x_hours:
         one:   "apie 1 valanda"
         other: "apie %{count} valandų"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 diena"
         other: "%{count} dienų"
@@ -1091,3 +1094,8 @@ lt:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 6933d45de6d41c8561cf58ab92e19cdead9e4fcb..e0ad5a3903647f229875d1c4391d335f79e5d66f 100644 (file)
@@ -45,6 +45,9 @@ lv:
       about_x_hours:
         one:   "aptuveni 1 stunda"
         other: "aptuveni %{count} stundas"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 diena"
         other: "%{count} dienas"
@@ -1025,3 +1028,8 @@ lv:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index f88ab87cccfa046a574f440eb6b654dd65c996e9..10ae05db1ba3df3da6ed12c5ea4597d927c9d3ae 100644 (file)
@@ -49,6 +49,9 @@ mk:
       about_x_hours:
         one:   "околу 1 час"
         other: "околу %{count} часа"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 ден"
         other: "%{count} дена"
@@ -1031,3 +1034,8 @@ mk:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 5e301356304321875da3f9cca15a1c675eb2d3ce..2c3c7bf8cf7a1ebf4f2eceb8c9e0a05f979532a5 100644 (file)
@@ -48,6 +48,9 @@ mn:
       about_x_hours:
         one:   "1 цаг орчим"
         other: "ойролцоогоор %{count} цаг"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 өдөр"
         other: "%{count} өдөр"
@@ -1031,3 +1034,8 @@ mn:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 8b6c2e65835e6925971e68ead4cfcd5cb96374a9..18b9782cdeaedabee5d1df2ff0f23048ceb29a97 100644 (file)
@@ -48,6 +48,9 @@ nl:
       about_x_hours:
         one:   "ongeveer 1 uur"
         other: "ongeveer %{count} uren"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 dag"
         other: "%{count} dagen"
@@ -1013,3 +1016,8 @@ nl:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 404a44404a3e3d539ed8374a0c1e5e9fbcf7ae26..be87bd5eba175600993ab80241e502b50ab9aebf 100644 (file)
@@ -43,6 +43,9 @@
       about_x_hours:
         one: "rundt 1 time"
         other: "rundt %{count} timer"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one: "1 dag"
         other: "%{count} dager"
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 1869cdafaa2380ad70c4ed1389b200f2fe0d4117..310f49119b403e69348105cc33df3f233b8c9d8e 100644 (file)
@@ -81,6 +81,9 @@ pl:
       about_x_hours:
         one:   "około godziny"
         other: "około %{count} godzin"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 dzień"
         other: "%{count} dni"
@@ -1048,3 +1051,8 @@ pl:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 3796a3651617c5bbcd91097b764288bd71a50411..b3aaef3e5ddc6a74cf77918b09981c2ca411e37c 100644 (file)
@@ -52,6 +52,9 @@ pt-BR:
       about_x_hours:
         one: 'aproximadamente 1 hora'
         other: 'aproximadamente %{count} horas'
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
 
       x_days:
         one: '1 dia'
@@ -1053,3 +1056,8 @@ pt-BR:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index ae1fed497f969363b3dc12742e44b327b20f3d45..fe69ecc9c50862be06be66cad5dc4803dd3e365b 100644 (file)
@@ -50,6 +50,9 @@ pt:
       about_x_hours:
         one: "aproximadamente 1 hora"
         other: "aproximadamente %{count} horas"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one: "1 dia"
         other: "%{count} dias"
@@ -1036,3 +1039,8 @@ pt:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 14c8a63c547035b149e0d5a40dcf991f4e551198..0448defc34c020ab89168e6cf6ef5129c3c78408 100644 (file)
@@ -46,6 +46,9 @@ ro:
       about_x_hours:
         one:   "aproximativ o oră"
         other: "aproximativ %{count} ore"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "o zi"
         other: "%{count} zile"
@@ -1028,3 +1031,8 @@ ro:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index de1260e6a2d2637e99d3eded2e35fd6e6791fa03..95a45b79e6d6a9939b3e9983c043019a2aeee33c 100644 (file)
@@ -116,6 +116,9 @@ ru:
         few:   "около %{count} часов"
         many:  "около %{count} часов"
         other: "около %{count} часа"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "%{count} день"
         few:   "%{count} дня"
@@ -1144,3 +1147,8 @@ ru:
   setting_unsubscribe: "Разрешить пользователям удалять свои учетные записи" 
   button_delete_my_account: "Удалить мою учетную запись" 
   text_account_destroy_confirmation: "Ваша учетная запись будет полностью удалена без возможности восстановления.\nВы уверены, что хотите продолжить?" 
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index bc66a0ca051bfe4ee3f90d2a9e84adde15e4d944..e9339925189a2de76178e3e0d09343f750a21958 100644 (file)
@@ -48,6 +48,9 @@ sk:
       about_x_hours:
         one:   "okolo 1 hodiny"
         other: "okolo %{count} hodín"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 deň"
         other: "%{count} dní"
@@ -1031,3 +1034,8 @@ sk:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index ca8269d18d67255311e005f9e55193db455d5d33..6ac328a11c8677f1ba29da60dad86935d757b9c4 100644 (file)
@@ -49,6 +49,9 @@ sl:
       about_x_hours:
         one:   "okrog 1. ure"
         other: "okrog %{count} ur"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 dan"
         other: "%{count} dni"
@@ -1031,3 +1034,8 @@ sl:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 353278dcf0ea1483354ab70457a7049980c20759..f9956add740713b62983caedcf3065080fbae5d6 100644 (file)
@@ -49,6 +49,9 @@ sq:
       about_x_hours:
         one:   "about 1 hour"
         other: "about %{count} hours"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 day"
         other: "%{count} days"
@@ -1027,3 +1030,8 @@ sq:
   description_date_range_interval: Choose range by selecting start and end date
   description_date_from: Enter start date
   description_date_to: Enter end date
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 06e4df19c0c12a710b891337d2aa727f1ea5ffd3..c088223cd46aff412545659260ddd102fa408280 100644 (file)
@@ -50,6 +50,9 @@ sr-YU:
       about_x_hours:
         one:   "približno jedan sat"
         other: "približno %{count} sati"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "jedan dan"
         other: "%{count} dana"
@@ -1031,3 +1034,8 @@ sr-YU:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index c7a2e692e5f90e1e9d61ce2d99001935a1888fc2..40ef2a6bf6aa6a73a5bc489c74029dd654cfc484 100644 (file)
@@ -50,6 +50,9 @@ sr:
       about_x_hours:
         one:   "приближно један сат"
         other: "приближно %{count} сати"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "један дан"
         other: "%{count} дана"
@@ -1032,3 +1035,8 @@ sr:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index b7fc051b610a28b997182dafc1fa941bd9adda30..aef59843fe8bcd7b382ff3924bbfc525231fb742 100644 (file)
@@ -78,6 +78,9 @@ sv:
       about_x_hours:
         one:   "ungefär en timme"
         other: "ungefär %{count} timmar"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "en dag"
         other: "%{count} dagar"
@@ -1069,3 +1072,8 @@ sv:
   description_date_range_interval: Ange intervall genom att välja start- och slutdatum
   description_date_from: Ange startdatum
   description_date_to: Ange slutdatum
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 2cb817142de0ea3fad25070ad945b66bb47f3536..0a4fdc98c95ac85d3d22d3d091e2b922fa7f297d 100644 (file)
@@ -48,6 +48,9 @@ th:
       about_x_hours:
         one:   "about 1 hour"
         other: "about %{count} hours"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 day"
         other: "%{count} days"
@@ -1028,3 +1031,8 @@ th:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 65ad2bba5c2dfbc9be86c4b306bcd024f3cf4d82..17e26f275a68e49ff797e7faeab86d80dfd1313f 100644 (file)
@@ -55,6 +55,9 @@ tr:
       about_x_hours:
         one: 'yaklaşık 1 saat'
         other: 'yaklaşık %{count} saat'
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one: '1 gün'
         other: '%{count} gün'
@@ -1050,3 +1053,8 @@ tr:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index b2536ea1eb31db35ea43a49a4e0e726eefc29a6b..16916c08e6876f077a4cf4e33a13aadd326fe88a 100644 (file)
@@ -48,6 +48,9 @@ uk:
       about_x_hours:
         one:   "about 1 hour"
         other: "about %{count} hours"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 day"
         other: "%{count} days"
@@ -1026,3 +1029,8 @@ uk:
   setting_unsubscribe: "Дозволити користувачам видаляти свої облікові записи" 
   button_delete_my_account: "Видалити мій обліковий запис" 
   text_account_destroy_confirmation: "Ваш обліковий запис буде повністю видалений без можливості відновлення.\nВи певні, что бажаете продовжити?" 
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 75e821b422411ad555b1f7aa573d47a59d87d39c..1c046646b2b14da072153ec67582fd5c948512e1 100644 (file)
@@ -79,6 +79,9 @@ vi:
       about_x_hours:
         one:   "khoảng 1 giờ"
         other: "khoảng %{count} giờ"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one:   "1 ngày"
         other: "%{count} ngày"
@@ -1082,3 +1085,8 @@ vi:
   text_account_destroy_confirmation: |-
     Are you sure you want to proceed?
     Your account will be permanently deleted, with no way to reactivate it.
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 62579d305752cb19549186536213c4a92f7a3acd..7628069e77050c1c902e0dc1062d8212e6187fd0 100644 (file)
       about_x_hours:
         one: "約 1 小時"
         other: "約 %{count} 小時"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one: "1 天"
         other: "%{count} 天"
   description_date_range_interval: 選擇起始與結束日期以設定範圍區間
   description_date_from: 輸入起始日期
   description_date_to: 輸入結束日期
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 6d84ebc31ed6534199f5b67231451e9afabc1c3d..ca4f93b122ceec58b08fb250c8cf8578ff754534 100644 (file)
@@ -51,6 +51,9 @@ zh:
       about_x_hours:
         one: "大约一小时"
         other: "大约 %{count} 小时"
+      x_hours:
+        one:   "1 hour"
+        other: "%{count} hours"
       x_days:
         one: "一天"
         other: "%{count} 天"
@@ -1033,3 +1036,8 @@ zh:
   text_account_destroy_confirmation: |-
     确定继续处理?
     您的账号一旦删除,将无法再次激活使用。
+  error_session_expired: Your session has expired. Please login again.
+  text_session_expiration_settings: "Warning: changing these settings may expire the current sessions including yours."
+  setting_session_lifetime: Session maximum lifetime
+  setting_session_timeout: Session inactivity timeout
+  label_session_expiration: Session expiration
index 66bc78e15816786ba5de2141e7b5f271a905ebce..67c8f6ca7e6c0ecacbdbeb059817d1167383470a 100644 (file)
@@ -36,6 +36,14 @@ unsubscribe:
 password_min_length:
   format: int
   default: 4
+# Maximum lifetime of user sessions in minutes
+session_lifetime:
+  format: int
+  default: 0
+# User session timeout in minutes
+session_timeout:
+  format: int
+  default: 0
 attachment_max_size:
   format: int
   default: 5120
index 2c2f69aec6d174078345699004aa623984f9eee7..b6d443a6c64e5e2b57666ca2e00f3f2cda5356e8 100644 (file)
@@ -7,6 +7,7 @@ http://www.redmine.org/
 == TBD v1.4.4
 
 * Defect #11112: REST API - custom fields in POST/PUT ignored for time_entries
+* Feature #6597: Configurable session lifetime and timeout
 * Patch #11113: Small glitch in German localization
 
 == 2012-06-05 v1.4.3
diff --git a/test/functional/sessions_test.rb b/test/functional/sessions_test.rb
new file mode 100644 (file)
index 0000000..d469f50
--- /dev/null
@@ -0,0 +1,113 @@
+# Redmine - project management software
+# Copyright (C) 2006-2012  Jean-Philippe Lang
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+
+require File.expand_path('../../test_helper', __FILE__)
+
+class SessionStartTest < ActionController::TestCase
+  tests AccountController
+
+  def test_login_should_set_session_timestamps
+    post :login, :username => 'jsmith', :password => 'jsmith'
+    assert_response 302
+    assert_equal 2, session[:user_id]
+    assert_not_nil session[:ctime]
+    assert_not_nil session[:atime]
+  end
+end
+
+class SessionsTest < ActionController::TestCase
+  tests WelcomeController
+
+  def test_atime_from_user_session_should_be_updated
+    created = 2.hours.ago.utc.to_i
+    get :index, {}, {:user_id => 2, :ctime => created, :atime => created}
+    assert_response :success
+    assert_equal created, session[:ctime]
+    assert_not_equal created, session[:atime]
+    assert session[:atime] > created
+  end
+
+  def test_user_session_should_not_be_reset_if_lifetime_and_timeout_disabled
+    with_settings :session_lifetime => '0', :session_timeout => '0' do
+      get :index, {}, {:user_id => 2}
+      assert_response :success
+    end
+  end
+
+  def test_user_session_without_ctime_should_be_reset_if_lifetime_enabled
+    with_settings :session_lifetime => '720' do
+      get :index, {}, {:user_id => 2}
+      assert_redirected_to '/login'
+    end
+  end
+
+  def test_user_session_with_expired_ctime_should_be_reset_if_lifetime_enabled
+    with_settings :session_timeout => '720' do
+      get :index, {}, {:user_id => 2, :atime => 2.days.ago.utc.to_i}
+      assert_redirected_to '/login'
+    end
+  end
+
+  def test_user_session_with_valid_ctime_should_not_be_reset_if_lifetime_enabled
+    with_settings :session_timeout => '720' do
+      get :index, {}, {:user_id => 2, :atime => 3.hours.ago.utc.to_i}
+      assert_response :success
+    end
+  end
+
+  def test_user_session_without_atime_should_be_reset_if_timeout_enabled
+    with_settings :session_timeout => '60' do
+      get :index, {}, {:user_id => 2}
+      assert_redirected_to '/login'
+    end
+  end
+
+  def test_user_session_with_expired_atime_should_be_reset_if_timeout_enabled
+    with_settings :session_timeout => '60' do
+      get :index, {}, {:user_id => 2, :atime => 4.hours.ago.utc.to_i}
+      assert_redirected_to '/login'
+    end
+  end
+
+  def test_user_session_with_valid_atime_should_not_be_reset_if_timeout_enabled
+    with_settings :session_timeout => '60' do
+      get :index, {}, {:user_id => 2, :atime => 10.minutes.ago.utc.to_i}
+      assert_response :success
+    end
+  end
+
+  def test_expired_user_session_should_be_restarted_if_autologin
+    with_settings :session_lifetime => '720', :session_timeout => '60', :autologin => 7 do
+      token = Token.create!(:user_id => 2, :action => 'autologin', :created_on => 1.day.ago)
+      @request.cookies['autologin'] = token.value
+      created = 2.hours.ago.utc.to_i
+
+      get :index, {}, {:user_id => 2, :ctime => created, :atime => created}
+      assert_equal 2, session[:user_id]
+      assert_response :success
+      assert_not_equal created, session[:ctime]
+      assert session[:ctime] >= created
+    end
+  end
+
+  def test_anonymous_session_should_not_be_reset
+    with_settings :session_lifetime => '720', :session_timeout => '60' do
+      get :index
+      assert_response :success
+    end
+  end
+end