12033: Ensure current Rails login is always in sessions list.
authorTom Clegg <tom@curoverse.com>
Fri, 11 Aug 2017 14:03:30 +0000 (10:03 -0400)
committerTom Clegg <tom@curoverse.com>
Fri, 11 Aug 2017 14:03:30 +0000 (10:03 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curoverse.com>

apps/workbench/app/assets/javascripts/components/sessions.js
apps/workbench/app/assets/javascripts/models/session_db.js
apps/workbench/app/controllers/sessions_controller.rb
apps/workbench/app/views/layouts/application.html.erb

index be4b7e39dd8fd59885cff4c898d6fb9335f7603b..3ff9f4de122621b11387fc6629725b55227a2830 100644 (file)
@@ -23,7 +23,7 @@ window.components.sessions = {
                     var session = sessions[uuidPrefix]
                     return m('tr', [
                         session.token && session.user ? [
-                            m('td', m('a.btn.btn-xs.btn-default', {
+                            m('td', session.isFromRails ? null : m('a.btn.btn-xs.btn-default', {
                                 uuidPrefix: uuidPrefix,
                                 onclick: m.withAttr('uuidPrefix', db.logout),
                             }, 'log out')),
@@ -41,7 +41,7 @@ window.components.sessions = {
                             m('td'),
                             m('td'),
                         ],
-                        m('td', m('a.glyphicon.glyphicon-trash', {
+                        m('td', session.isFromRails ? null : m('a.glyphicon.glyphicon-trash', {
                             uuidPrefix: uuidPrefix,
                             onclick: m.withAttr('uuidPrefix', db.trash),
                         })),
index 75fe6f9e17206850596b237e0e55dec3418806ca..fde02f637a8ba6106d745bcb788c658363fae956 100644 (file)
@@ -6,15 +6,27 @@ window.models = window.models || {}
 window.models.SessionDB = function() {
     var db = this
     Object.assign(db, {
-        loadAll: function() {
+        loadFromLocalStorage: function() {
             try {
                 return JSON.parse(window.localStorage.getItem('sessions')) || {}
             } catch(e) {}
             return {}
         },
+        loadAll: function() {
+            var all = db.loadFromLocalStorage()
+            if (window.defaultSession) {
+                window.defaultSession.isFromRails = true
+                all[window.defaultSession.user.uuid.slice(0, 5)] = window.defaultSession
+            }
+            return all
+        },
         save: function(k, v) {
             var sessions = db.loadAll()
             sessions[k] = v
+            Object.keys(sessions).forEach(function(key) {
+                if (sessions[key].isFromRails)
+                    delete sessions[key]
+            })
             window.localStorage.setItem('sessions', JSON.stringify(sessions))
         },
         trash: function(k) {
index f72b45177e468b56779a72e38379d9f04b3ebe14..48fbc6bd04a708326d2dfe0f01afd5ae5383c12f 100644 (file)
@@ -3,9 +3,9 @@
 # SPDX-License-Identifier: AGPL-3.0
 
 class SessionsController < ApplicationController
-  skip_around_filter :require_thread_api_token, :only => [:destroy, :index]
-  skip_around_filter :set_thread_api_token, :only => [:destroy, :index]
-  skip_before_filter :find_object_by_uuid, :only => [:destroy, :index]
+  skip_around_filter :require_thread_api_token, :only => [:destroy, :logged_out]
+  skip_around_filter :set_thread_api_token, :only => [:destroy, :logged_out]
+  skip_before_filter :find_object_by_uuid
   skip_before_filter :find_objects_for_index
   skip_before_filter :ensure_arvados_api_exists
 
index 71b1cd15984e6b45151e8ab7ec8ad2d8a60f32bb..b59bad4ec151b6dc003e18020b36a6391fc9f609 100644 (file)
@@ -18,6 +18,11 @@ SPDX-License-Identifier: AGPL-3.0 %>
   <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
   <meta name="description" content="">
   <meta name="author" content="">
+  <% if current_user %>
+    <% content_for :js do %>
+      window.defaultSession = <%=raw({baseURL: Rails.configuration.arvados_v1_base.sub(/\/arvados\/v1$/, '/'), token: Thread.current[:arvados_api_token], user: current_user}.to_json)%>
+    <% end %>
+  <% end %>
   <% if current_user and $arvados_api_client.discovery[:websocketUrl] %>
   <meta name="arv-websocket-url" content="<%=$arvados_api_client.discovery[:websocketUrl]%>?api_token=<%=Thread.current[:arvados_api_token]%>">
   <% end %>