Browse Source

HUE-3386 [core] After TTL expires the UI should exit and logout the user

Enrico Berti 9 years ago
parent
commit
50512c6

+ 2 - 0
apps/filebrowser/src/filebrowser/templates/listdir.mako

@@ -166,5 +166,7 @@ ${ fb_components.menubar() }
   <p class="hoverText"></p>
 </div>
 
+</div>
+
 
 ${ commonfooter(request, messages) | n,unicode }

+ 2 - 3
apps/useradmin/src/useradmin/middleware.py

@@ -81,11 +81,10 @@ class LastActivityMiddleware(object):
     logout = False
 
     if profile.last_activity and expires_after > 0 and self._total_seconds(now - profile.last_activity) > expires_after:
-      messages.info(request, _('Your session has been timed out due to inactivity.'))
       logout = True
 
-    # Save last activity for user except when polling jobbrowser
-    if not (request.path.strip('/') == 'jobbrowser' and request.GET.get('format') == 'json'):
+    # Save last activity for user except when polling
+    if not (request.path.strip('/') == 'jobbrowser' and request.GET.get('format') == 'json') and not (request.path == '/desktop/debug/is_idle'):
       try:
         profile.last_activity = datetime.now()
         profile.save()

+ 10 - 1
desktop/core/src/desktop/static/desktop/css/hue3.css

@@ -2546,4 +2546,13 @@ body {
   width: 1em;
   height: 1em;
   fill: currentColor;
-}
+}
+
+.blurred {
+  -webkit-filter: blur(5px);
+  -moz-filter: blur(5px);
+  -o-filter: blur(5px);
+  -ms-filter: blur(5px);
+  filter: blur(5px);
+}
+

+ 13 - 6
desktop/core/src/desktop/templates/common_footer.mako

@@ -51,18 +51,25 @@ ${ smart_unicode(login_modal(request).content) | n,unicode }
 
     // global catch for ajax calls after the user has logged out
     var isLoginRequired = false;
-    $(document).ajaxSuccess(function (event, xhr, settings, data) {
-      if (data === '/* login required */' && !isLoginRequired) {
+    $(document).ajaxComplete(function (event, xhr, settings) {
+      if (xhr.responseText === '/* login required */' && !isLoginRequired) {
         isLoginRequired = true;
-        $('#login-modal').modal('show');
-        window.setTimeout(function () {
-          $('.jHueNotify').remove();
-        }, 200);
+        $('body').children(':not(#login-modal)').addClass('blurred');
+        if ($('#login-modal').length > 0){
+          $('#login-modal').modal('show');
+          window.setTimeout(function () {
+            $('.jHueNotify').remove();
+          }, 200);
+        }
+        else {
+          location.reload();
+        }
       }
     });
 
     $('#login-modal').on('hidden', function () {
       isLoginRequired = false;
+      $('.blurred').removeClass('blurred');
     });
 
     huePubSub.subscribe('hue.login.result', function (response) {

+ 16 - 0
desktop/core/src/desktop/templates/common_header.mako

@@ -232,6 +232,22 @@ if USE_NEW_EDITOR.get():
         top.location = self.location;
       }
 
+      %if conf.AUTH.IDLE_SESSION_TIMEOUT.get() > -1 and not skip_idle_timeout:
+      var idleTimer;
+      function resetIdleTimer() {
+        clearTimeout(idleTimer);
+        idleTimer = setTimeout(function () {
+          // Check if logged out
+          $.get('/desktop/debug/is_idle');
+        }, (${conf.AUTH.IDLE_SESSION_TIMEOUT.get()} * 1000) + 1000);
+      }
+
+      $(document).on('mousemove', resetIdleTimer);
+      $(document).on('keydown', resetIdleTimer);
+      $(document).on('click', resetIdleTimer);
+      resetIdleTimer();
+      %endif
+
       $("input, textarea").placeholder();
       $(".submitter").keydown(function (e) {
         if (e.keyCode == 13) {

+ 1 - 1
desktop/core/src/desktop/templates/login.mako

@@ -21,7 +21,7 @@
   from useradmin.password_policy import is_password_policy_enabled, get_password_hint
 %>
 
-${ commonheader(_("Welcome to Hue"), "login", user, "50px", True) | n,unicode }
+${ commonheader(_("Welcome to Hue"), "login", user, "50px", True, True) | n,unicode }
 
 <link rel="stylesheet" href="${ static('desktop/css/login.css') }">
 <link rel="stylesheet" href="${ static('desktop/ext/chosen/chosen.min.css') }">

+ 1 - 1
desktop/core/src/desktop/templates/login_modal.mako

@@ -24,7 +24,7 @@
 <link rel="stylesheet" href="${ static('desktop/css/login.css') }">
 <link rel="stylesheet" href="${ static('desktop/ext/chosen/chosen.min.css') }">
 
-<div id="login-modal" class="modal fade hide" data-backdrop="true" style="padding: 0px!important;box-shadow: none;background: transparent;">
+<div id="login-modal" class="modal fade hide" data-backdrop="static" data-keyboard="false" style="padding: 0px!important;box-shadow: none;background: transparent;">
   <div class="login-box">
     <form method="POST" action="${action}">
     <input type="hidden" name="csrfmiddlewaretoken" value="">

+ 1 - 0
desktop/core/src/desktop/urls.py

@@ -80,6 +80,7 @@ dynamic_patterns += patterns('desktop.views',
   (r'^desktop/prefs/(?P<key>\w+)?$', 'prefs'),
   (r'^desktop/status_bar/?$', 'status_bar'),
   (r'^desktop/debug/is_alive$','is_alive'),
+  (r'^desktop/debug/is_idle$','is_idle'),
   (r'^desktop/debug/threads$', 'threads'),
   (r'^desktop/debug/memory$', 'memory'),
   (r'^desktop/debug/check_config$', 'check_config'),

+ 5 - 1
desktop/core/src/desktop/views.py

@@ -372,7 +372,7 @@ def log_frontend_event(request):
   _LOG_FRONTEND_LOGGER.log(level, msg)
   return HttpResponse("")
 
-def commonheader(title, section, user, padding="90px", skip_topbar=False):
+def commonheader(title, section, user, padding="90px", skip_topbar=False, skip_idle_timeout=False):
   """
   Returns the rendered common header
   """
@@ -400,6 +400,7 @@ def commonheader(title, section, user, padding="90px", skip_topbar=False):
     'padding': padding,
     'user': user,
     'skip_topbar': skip_topbar,
+    'skip_idle_timeout': skip_idle_timeout,
     'leaflet': {
       'layer': desktop.conf.LEAFLET_TILE_LAYER.get(),
       'attribution': desktop.conf.LEAFLET_TILE_LAYER_ATTRIBUTION.get()
@@ -420,6 +421,9 @@ def commonimportexport(request):
 def login_modal(request):
   return desktop.auth.views.dt_login(request, True)
 
+def is_idle(request):
+  return HttpResponse("no!")
+
 def commonfooter(request, messages=None):
   """
   Returns the rendered common footer