11454: Show a link to the remote workbench on the sessions page.
authorLucas Di Pentima <ldipentima@veritasgenetics.com>
Thu, 1 Feb 2018 16:40:17 +0000 (13:40 -0300)
committerLucas Di Pentima <ldipentima@veritasgenetics.com>
Thu, 1 Feb 2018 16:40:17 +0000 (13:40 -0300)
On page load, detect those non-federated active sessions and try to
migrate them to federated logins just in case they're stale sessions.
If the federated login doesn't succeed, keep the session's previous state.
Removed workbench remote_hosts config.

Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <ldipentima@veritasgenetics.com>

apps/workbench/app/assets/javascripts/components/search.js
apps/workbench/app/assets/javascripts/components/sessions.js
apps/workbench/app/assets/javascripts/models/session_db.js
apps/workbench/app/views/search/index.html [moved from apps/workbench/app/views/search/index.html.erb with 52% similarity]
apps/workbench/config/application.default.yml

index 9a23648dc3c45676984aba14c72aab8d03756d08..0839491696277baebebbc603cec1045b43dae9a9 100644 (file)
@@ -2,6 +2,11 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
+$(document).on('ready', function() {
+    var db = new SessionDB()
+    db.migrateNonFederatedSessions()
+})
+
 window.SearchResultsTable = {
     maybeLoadMore: function(dom) {
         var loader = this.loader
@@ -90,7 +95,7 @@ window.SearchResultsTable = {
 
 window.Search = {
     oninit: function(vnode) {
-        vnode.state.sessionDB = new SessionDB(vnode.attrs.remoteHosts)
+        vnode.state.sessionDB = new SessionDB()
         vnode.state.searchEntered = m.stream()
         vnode.state.searchActive = m.stream()
         // When searchActive changes (e.g., when restoring state
index 964f89a09390ca4e66be8cb3481536e2c2252a20..6a203420447bc2904dfbee7b74a3d62ff71eac35 100644 (file)
@@ -6,6 +6,7 @@ $(document).on('ready', function() {
     var db = new SessionDB()
     db.checkForNewToken()
     db.fillMissingUUIDs()
+    db.migrateNonFederatedSessions()
 })
 
 window.SessionsTable = {
@@ -41,7 +42,11 @@ window.SessionsTable = {
                                 m('td', session.user.is_active ?
                                     m('span.label.label-success', 'logged in') :
                                     m('span.label.label-warning', 'inactive')),
-                                m('td', {title: session.baseURL}, uuidPrefix),
+                                m('td', {title: session.baseURL}, [
+                                    m('a', {
+                                        href: db.workbenchBaseURL(session) + '?api_token=' + session.token
+                                    }, uuidPrefix),
+                                ]),
                                 m('td', session.user.username),
                                 m('td', session.user.email),
                                 m('td', session.isFromRails ? null : m('button.btn.btn-xs.btn-default', {
index 52d8930f93815e6329d2ebe1764c85663a40a463..26306b8b104e3d762281bbc50cdefb9e6e7907c8 100644 (file)
@@ -2,10 +2,9 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-window.SessionDB = function(rhosts) {
+window.SessionDB = function() {
     var db = this
     Object.assign(db, {
-        remoteHosts: rhosts || [],
         discoveryCache: {},
         tokenUUIDCache: null,
         loadFromLocalStorage: function() {
@@ -75,7 +74,7 @@ window.SessionDB = function(rhosts) {
                 })
             })
         },
-        login: function(baseURL) {
+        login: function(baseURL, fallbackLogin = true) {
             // Initiate login procedure with given API base URL (e.g.,
             // "http://api.example/").
             //
@@ -104,7 +103,7 @@ window.SessionDB = function(rhosts) {
                             db.save(user.owner_uuid.slice(0, 5), remoteSession)
                         })
                     })
-                } else {
+                } else if (fallbackLogin) {
                     // Classic login
                     document.location = baseURL + 'login?return_to=' + encodeURIComponent(document.location.href.replace(/\?.*/, '')+'?baseURL='+encodeURIComponent(baseURL))
                 }
@@ -227,5 +226,17 @@ window.SessionDB = function(rhosts) {
             opts.headers.authorization = 'OAuth2 '+ session.token
             return m.request(session.baseURL + path, opts)
         },
+        // Check non-federated remote active sessions if they should be migrated to
+        // a salted token.
+        migrateNonFederatedSessions: function() {
+            var sessions = db.loadActive()
+            Object.keys(sessions).map(function(uuidPrefix) {
+                session = sessions[uuidPrefix]
+                if (!session.isFromRails && session.token && session.token.indexOf('v2/') < 0) {
+                    // Only try the federated login
+                    db.login(session.baseURL, false)
+                }
+            })
+        },
     })
 }
similarity index 52%
rename from apps/workbench/app/views/search/index.html.erb
rename to apps/workbench/app/views/search/index.html
index ff3e19098c67b4ac56c7ccda6fd4157a20b4bbc2..d2a8386405e3127567013ba39307bca439c84b26 100644 (file)
@@ -2,6 +2,5 @@
 
 SPDX-License-Identifier: AGPL-3.0 -->
 
-<div data-mount-mithril="Search" 
-    data-remote-hosts="<%= Rails.configuration.remote_hosts %>">
+<div data-mount-mithril="Search">
 </div>
index 4cf7b5ed2675a322d83ae0241efbf7b4969391d8..76f7a3081751df228bb32b810b50208902aac8bc 100644 (file)
@@ -314,8 +314,3 @@ common:
   # Link to use for Arvados Workflow Composer app, or false if not available.
   #
   composer_url: false
-
-  # Multi site search federation feature:
-  # * remote_hosts: List of API servers that allow logins from accounts on this
-  #   workbench's cluster.
-  remote_hosts: []