Merge branch '11454-wb-federated-search'
authorLucas Di Pentima <ldipentima@veritasgenetics.com>
Mon, 12 Feb 2018 18:41:44 +0000 (15:41 -0300)
committerLucas Di Pentima <ldipentima@veritasgenetics.com>
Mon, 12 Feb 2018 18:41:44 +0000 (15:41 -0300)
Closes #11454
Refs #12959

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
apps/workbench/app/views/sessions/index.html

index 51d352ab829b065c8ec932c10eff498262b40f1a..04572ec3cc9ebd82e5ef896d086339337771a431 100644 (file)
@@ -57,20 +57,24 @@ window.SearchResultsTable = {
                     // Add the salted token to search result links from federated
                     // remote hosts.
                     if (!session.isFromRails && session.token.indexOf('v2/') == 0) {
-                        tokenParam = '?api_token='+session.token
+                        tokenParam = session.token
                     }
                     return m('tr', [
-                        m('td', [
+                        m('td', m('form', {
+                            action: item.workbenchBaseURL() + '/' + item.objectType.wb_path + '/' + item.uuid,
+                            method: 'GET'
+                        }, [
+                            tokenParam !== '' &&
+                                m('input[type=hidden][name=api_token]', {value: tokenParam}),
                             item.workbenchBaseURL() &&
-                                m('a.btn.btn-xs.btn-default', {
+                                m('button.btn.btn-xs.btn-default[type=submit]', {
                                     'data-original-title': 'show '+item.objectType.description,
                                     'data-placement': 'top',
                                     'data-toggle': 'tooltip',
-                                    href: item.workbenchBaseURL()+'/'+item.objectType.wb_path+'/'+item.uuid+tokenParam,
                                     // Bootstrap's tooltip feature
                                     oncreate: function(vnode) { $(vnode.dom).tooltip() },
                                 }, iconsMap[item.objectType.wb_path]),
-                        ]),
+                        ])),
                         m('td.arvados-uuid', item.uuid),
                         m('td', item.name || '(unnamed)'),
                         m('td', m(LocalizedDateTime, {parse: item.modified_at})),
@@ -100,6 +104,7 @@ window.SearchResultsTable = {
 window.Search = {
     oninit: function(vnode) {
         vnode.state.sessionDB = new SessionDB()
+        vnode.state.sessionDB.autoRedirectToHomeCluster('/search')
         vnode.state.searchEntered = m.stream()
         vnode.state.searchActive = m.stream()
         // When searchActive changes (e.g., when restoring state
index 8e947cb4193d81d72337e01dff44dcc2f62583e1..e172d3a3f3500c36b3b978b3cf3da79ce7693f01 100644 (file)
@@ -6,13 +6,14 @@ $(document).on('ready', function() {
     var db = new SessionDB();
     db.checkForNewToken();
     db.fillMissingUUIDs();
-    db.migrateNonFederatedSessions();
     db.autoLoadRemoteHosts();
 });
 
 window.SessionsTable = {
     oninit: function(vnode) {
         vnode.state.db = new SessionDB();
+        vnode.state.db.autoRedirectToHomeCluster('/sessions');
+        vnode.state.db.migrateNonFederatedSessions();
         vnode.state.hostToAdd = m.stream('');
         vnode.state.error = m.stream();
         vnode.state.checking = m.stream();
@@ -37,17 +38,13 @@ window.SessionsTable = {
                 ])),
                 m('tbody', [
                     Object.keys(sessions).map(function(uuidPrefix) {
-                        var session = sessions[uuidPrefix]
+                        var session = sessions[uuidPrefix];
                         return m('tr', [
                             session.token && session.user ? [
                                 m('td', session.user.is_active ?
                                     m('span.label.label-success', 'logged in') :
                                     m('span.label.label-warning', 'inactive')),
-                                m('td', {title: session.baseURL}, [
-                                    m('a', {
-                                        href: db.workbenchBaseURL(session) + '?api_token=' + session.token
-                                    }, uuidPrefix)
-                                ]),
+                                m('td', {title: session.baseURL}, uuidPrefix),
                                 m('td', session.user.username),
                                 m('td', session.user.email),
                                 m('td', session.isFromRails ? null : m('button.btn.btn-xs.btn-default', {
index 99768db54467400bad8a4dcfa70993b3edf51c1f..fab8fe3925c00da42f5223a763a659ff18e70441 100644 (file)
@@ -93,12 +93,12 @@ window.SessionDB = function() {
                 fallbackLogin = true;
             }
             var session = db.loadLocal();
-            var uuidPrefix = session.user.owner_uuid.slice(0, 5);
             var apiHostname = new URL(session.baseURL).hostname;
             m.request(session.baseURL+'discovery/v1/apis/arvados/v1/rest').then(function(localDD) {
+                var uuidPrefix = localDD.uuidPrefix;
                 m.request(baseURL+'discovery/v1/apis/arvados/v1/rest').then(function(dd) {
                     if (uuidPrefix in dd.remoteHosts ||
-                        (dd.remoteHostsViaDNS && apiHostname.indexOf('arvadosapi.com') >= 0)) {
+                        (dd.remoteHostsViaDNS && apiHostname.endsWith('.arvadosapi.com'))) {
                         // Federated identity login via salted token
                         db.saltedToken(dd.uuidPrefix).then(function(token) {
                             m.request(baseURL+'arvados/v1/users/current', {
@@ -269,20 +269,24 @@ window.SessionDB = 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);
+                if (!session.isFromRails && session.token) {
+                    db.saltedToken(uuidPrefix).then(function(saltedToken) {
+                        if (session.token != saltedToken) {
+                            // Only try the federated login
+                            db.login(session.baseURL, false);
+                        }
+                    });
                 }
             });
         },
-        // If remoteHosts is listed on the local API discovery doc, try to add any
-        // listed remote without an active session.
+        // If remoteHosts is populated on the local API discovery doc, try to
+        // add any listed missing session.
         autoLoadRemoteHosts: function() {
-            var activeSessions = db.loadActive();
+            var sessions = db.loadAll();
             var doc = db.discoveryDoc(db.loadLocal());
             doc.map(function(d) {
                 Object.keys(d.remoteHosts).map(function(uuidPrefix) {
-                    if (!(uuidPrefix in Object.keys(activeSessions))) {
+                    if (!(sessions[uuidPrefix])) {
                         db.findAPI(d.remoteHosts[uuidPrefix]).then(function(baseURL) {
                             db.login(baseURL, false);
                         });
index c26a643d616d08b3e60396bea597dd8c1af66880..6bcad0b1ae2c245ccd9b65afda7d3eac373088a7 100644 (file)
@@ -2,11 +2,4 @@
 
 SPDX-License-Identifier: AGPL-3.0 -->
 
-<script type="text/javascript">
-    $(document).on('ready', function() {
-        var db = new SessionDB()
-        db.autoRedirectToHomeCluster('/search')
-    })
-</script>
-
 <div data-mount-mithril="Search"></div>
index ee1f63659e88fed3bfef9a7b06d8df3938629e74..bf23028ce7c6a75efa2a9a8fac02057bce865822 100644 (file)
@@ -2,11 +2,4 @@
 
 SPDX-License-Identifier: AGPL-3.0 -->
 
-<script type="text/javascript">
-    $(document).on('ready', function() {
-        var db = new SessionDB()
-        db.autoRedirectToHomeCluster('/sessions')
-    })
-</script>
-
 <div data-mount-mithril="SessionsTable"></div>