13851: Reverted use of discoveryDoc() on findAPI()
[arvados.git] / apps / workbench / app / assets / javascripts / models / session_db.js
index 99768db54467400bad8a4dcfa70993b3edf51c1f..5d42fdf07f668c3f1f25ad26543a4ecc2b26f05c 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) {
-                m.request(baseURL+'discovery/v1/apis/arvados/v1/rest').then(function(dd) {
+            db.discoveryDoc(session).map(function(localDD) {
+                var uuidPrefix = localDD.uuidPrefix;
+                db.discoveryDoc({baseURL: baseURL}).map(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', {
@@ -231,9 +231,22 @@ window.SessionDB = function() {
         // discovery doc from a session's API server.
         discoveryDoc: function(session) {
             var cache = db.discoveryCache[session.baseURL];
-            if (!cache) {
+            if (!cache && session) {
                 db.discoveryCache[session.baseURL] = cache = m.stream();
-                m.request(session.baseURL+'discovery/v1/apis/arvados/v1/rest').then(cache);
+                var baseURL = session.baseURL;
+                if (baseURL[baseURL.length - 1] !== '/') {
+                    baseURL += '/';
+                }
+                m.request(baseURL+'discovery/v1/apis/arvados/v1/rest')
+                    .then(function (dd) {
+                        // Just in case we're talking with an old API server.
+                        dd.remoteHosts = dd.remoteHosts || {};
+                        if (dd.remoteHostsViaDNS === undefined) {
+                            dd.remoteHostsViaDNS = false;
+                        }
+                        return dd;
+                    })
+                    .then(cache);
             }
             return cache;
         },
@@ -269,20 +282,25 @@ 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());
+            if (doc === undefined) { return; }
             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);
                         });
@@ -304,8 +322,7 @@ window.SessionDB = function() {
             if (userUUIDPrefix === session.user.owner_uuid.slice(0, 5)) {
                 return;
             }
-            var doc = db.discoveryDoc(session);
-            doc.map(function(d) {
+            db.discoveryDoc(session).map(function (d) {
                 // Guess the remote host from the local discovery doc settings
                 var rHost = null;
                 if (d.remoteHosts[userUUIDPrefix]) {
@@ -319,8 +336,7 @@ window.SessionDB = function() {
                 }
                 // Get the remote cluster workbench url & redirect there.
                 db.findAPI(rHost).then(function (apiUrl) {
-                    var doc = db.discoveryDoc({baseURL: apiUrl});
-                    doc.map(function (d) {
+                    db.discoveryDoc({baseURL: apiUrl}).map(function (d) {
                         document.location = d.workbenchUrl + path;
                     });
                 });