From cfa10d90137e49008c08bc88bf2b79d1429fd0f8 Mon Sep 17 00:00:00 2001 From: Lucas Di Pentima Date: Thu, 8 Feb 2018 16:49:42 -0300 Subject: [PATCH] 11454: Syntax errors fixes. Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima --- .../assets/javascripts/components/sessions.js | 34 +- .../assets/javascripts/models/session_db.js | 315 +++++++++--------- 2 files changed, 181 insertions(+), 168 deletions(-) diff --git a/apps/workbench/app/assets/javascripts/components/sessions.js b/apps/workbench/app/assets/javascripts/components/sessions.js index 231db9ba15..8e947cb419 100644 --- a/apps/workbench/app/assets/javascripts/components/sessions.js +++ b/apps/workbench/app/assets/javascripts/components/sessions.js @@ -3,28 +3,28 @@ // SPDX-License-Identifier: AGPL-3.0 $(document).on('ready', function() { - var db = new SessionDB() - db.checkForNewToken() - db.fillMissingUUIDs() - db.migrateNonFederatedSessions() - db.autoLoadRemoteHosts() -}) + var db = new SessionDB(); + db.checkForNewToken(); + db.fillMissingUUIDs(); + db.migrateNonFederatedSessions(); + db.autoLoadRemoteHosts(); +}); window.SessionsTable = { oninit: function(vnode) { - vnode.state.db = new SessionDB() - vnode.state.hostToAdd = m.stream('') - vnode.state.error = m.stream() - vnode.state.checking = m.stream() + vnode.state.db = new SessionDB(); + vnode.state.hostToAdd = m.stream(''); + vnode.state.error = m.stream(); + vnode.state.checking = m.stream(); }, view: function(vnode) { - var db = vnode.state.db - var sessions = db.loadAll() + var db = vnode.state.db; + var sessions = db.loadAll(); return m('.container', [ m('p', [ 'You can log in to multiple Arvados sites here, then use the ', m('a[href="/search"]', 'multi-site search'), - ' page to search collections and projects on all sites at once.', + ' page to search collections and projects on all sites at once.' ]), m('table.table.table-condensed.table-hover', [ m('thead', m('tr', [ @@ -33,7 +33,7 @@ window.SessionsTable = { m('th', 'username'), m('th', 'email'), m('th', 'actions'), - m('th'), + m('th') ])), m('tbody', [ Object.keys(sessions).map(function(uuidPrefix) { @@ -46,14 +46,14 @@ window.SessionsTable = { m('td', {title: session.baseURL}, [ m('a', { href: db.workbenchBaseURL(session) + '?api_token=' + session.token - }, uuidPrefix), + }, uuidPrefix) ]), m('td', session.user.username), m('td', session.user.email), m('td', session.isFromRails ? null : m('button.btn.btn-xs.btn-default', { uuidPrefix: uuidPrefix, onclick: m.withAttr('uuidPrefix', db.logout), - }, session.listedHost ? 'Disable ':'Log out ', m('span.glyphicon.glyphicon-log-out'))), + }, session.listedHost ? 'Disable ':'Log out ', m('span.glyphicon.glyphicon-log-out'))) ] : [ m('td', m('span.label.label-default', 'logged out')), m('td', {title: session.baseURL}, uuidPrefix), @@ -62,7 +62,7 @@ window.SessionsTable = { m('td', m('a.btn.btn-xs.btn-primary', { uuidPrefix: uuidPrefix, onclick: db.login.bind(db, session.baseURL), - }, session.listedHost ? 'Enable ':'Log in ', m('span.glyphicon.glyphicon-log-in'))), + }, session.listedHost ? 'Enable ':'Log in ', m('span.glyphicon.glyphicon-log-in'))) ], m('td', session.isFromRails ? null : m('button.btn.btn-xs.btn-default', { uuidPrefix: uuidPrefix, diff --git a/apps/workbench/app/assets/javascripts/models/session_db.js b/apps/workbench/app/assets/javascripts/models/session_db.js index f9e17b2c36..99768db544 100644 --- a/apps/workbench/app/assets/javascripts/models/session_db.js +++ b/apps/workbench/app/assets/javascripts/models/session_db.js @@ -3,80 +3,85 @@ // SPDX-License-Identifier: AGPL-3.0 window.SessionDB = function() { - var db = this + var db = this; Object.assign(db, { discoveryCache: {}, tokenUUIDCache: null, loadFromLocalStorage: function() { try { - return JSON.parse(window.localStorage.getItem('sessions')) || {} + return JSON.parse(window.localStorage.getItem('sessions')) || {}; } catch(e) {} - return {} + return {}; }, loadAll: function() { - var all = db.loadFromLocalStorage() + var all = db.loadFromLocalStorage(); if (window.defaultSession) { - window.defaultSession.isFromRails = true - all[window.defaultSession.user.uuid.slice(0, 5)] = window.defaultSession + window.defaultSession.isFromRails = true; + all[window.defaultSession.user.uuid.slice(0, 5)] = window.defaultSession; } - return all + return all; }, loadActive: function() { - var sessions = db.loadAll() + var sessions = db.loadAll(); Object.keys(sessions).forEach(function(key) { - if (!sessions[key].token || (sessions[key].user && !sessions[key].user.is_active)) - delete sessions[key] - }) - return sessions + if (!sessions[key].token || (sessions[key].user && !sessions[key].user.is_active)) { + delete sessions[key]; + } + }); + return sessions; }, loadLocal: function() { - var sessions = db.loadActive() - var s = false - Object.values(sessions).forEach(function(session) { - if (session.isFromRails) { - s = session - return + var sessions = db.loadActive(); + var s = false; + Object.keys(sessions).forEach(function(key) { + if (sessions[key].isFromRails) { + s = sessions[key]; + return; } - }) - return s + }); + return s; }, save: function(k, v) { - var sessions = db.loadAll() - sessions[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)) + if (sessions[key].isFromRails) { + delete sessions[key]; + } + }); + window.localStorage.setItem('sessions', JSON.stringify(sessions)); }, trash: function(k) { - var sessions = db.loadAll() - delete sessions[k] - window.localStorage.setItem('sessions', JSON.stringify(sessions)) + var sessions = db.loadAll(); + delete sessions[k]; + window.localStorage.setItem('sessions', JSON.stringify(sessions)); }, findAPI: function(url) { // Given a Workbench or API host or URL, return a promise // for the corresponding API server's base URL. Typical // use: // sessionDB.findAPI('https://workbench.example/foo').then(sessionDB.login) - if (url.length === 5 && url.indexOf('.') < 0) - url += '.arvadosapi.com' - if (url.indexOf('://') < 0) - url = 'https://' + url - url = new URL(url) + if (url.length === 5 && url.indexOf('.') < 0) { + url += '.arvadosapi.com'; + } + if (url.indexOf('://') < 0) { + url = 'https://' + url; + } + url = new URL(url); return m.request(url.origin + '/discovery/v1/apis/arvados/v1/rest').then(function() { - return url.origin + '/' + return url.origin + '/'; }).catch(function(err) { // If url is a Workbench site (and isn't too old), // /status.json will tell us its API host. return m.request(url.origin + '/status.json').then(function(resp) { - if (!resp.apiBaseURL) - throw 'no apiBaseURL in status response' - return resp.apiBaseURL - }) - }) + if (!resp.apiBaseURL) { + throw 'no apiBaseURL in status response'; + } + return resp.apiBaseURL; + }); + }); }, - login: function(baseURL, fallbackLogin = true) { + login: function(baseURL, fallbackLogin) { // Initiate login procedure with given API base URL (e.g., // "http://api.example/"). // @@ -84,9 +89,12 @@ window.SessionDB = function() { // also call checkForNewToken() on (at least) its first // render. Otherwise, the login procedure can't be // completed. - var session = db.loadLocal() - var uuidPrefix = session.user.owner_uuid.slice(0, 5) - var apiHostname = new URL(session.baseURL).hostname + if (fallbackLogin === undefined) { + 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) { if (uuidPrefix in dd.remoteHosts || @@ -95,17 +103,17 @@ window.SessionDB = function() { db.saltedToken(dd.uuidPrefix).then(function(token) { m.request(baseURL+'arvados/v1/users/current', { headers: { - authorization: 'Bearer '+token, - }, + authorization: 'Bearer '+token + } }).then(function(user) { // Federated login successful. var remoteSession = { user: user, baseURL: baseURL, token: token, - listedHost: (dd.uuidPrefix in localDD.remoteHosts), - } - db.save(dd.uuidPrefix, remoteSession) + listedHost: (dd.uuidPrefix in localDD.remoteHosts) + }; + db.save(dd.uuidPrefix, remoteSession); }).catch(function(e) { if (dd.uuidPrefix in localDD.remoteHosts) { // If the remote system is configured to allow federated @@ -113,170 +121,174 @@ window.SessionDB = function() { // token, save as a logged out session anyways. var remoteSession = { baseURL: baseURL, - listedHost: true, - } - db.save(dd.uuidPrefix, remoteSession) + listedHost: true + }; + db.save(dd.uuidPrefix, remoteSession); } else if (fallbackLogin) { // Remote cluster not listed as a remote host and rejecting // the salted token, try classic login. - db.loginClassic(baseURL) + db.loginClassic(baseURL); } - }) - }) + }); + }); } else if (fallbackLogin) { // Classic login will be used when the remote system doesn't list this // cluster as part of the federation. - db.loginClassic(baseURL) + db.loginClassic(baseURL); } - }) - }) - return false + }); + }); + return false; }, loginClassic: function(baseURL) { - document.location = baseURL + 'login?return_to=' + encodeURIComponent(document.location.href.replace(/\?.*/, '')+'?baseURL='+encodeURIComponent(baseURL)) + document.location = baseURL + 'login?return_to=' + encodeURIComponent(document.location.href.replace(/\?.*/, '')+'?baseURL='+encodeURIComponent(baseURL)); }, logout: function(k) { // Forget the token, but leave the other info in the db so // the user can log in again without providing the login // host again. - var sessions = db.loadAll() - delete sessions[k].token - db.save(k, sessions[k]) + var sessions = db.loadAll(); + delete sessions[k].token; + db.save(k, sessions[k]); }, saltedToken: function(uuid_prefix) { // Takes a cluster UUID prefix and returns a salted token to allow // log into said cluster using federated identity. - var session = db.loadLocal() - return db.tokenUUID().then(function(token_uuid){ - var shaObj = new jsSHA("SHA-1", "TEXT") - shaObj.setHMACKey(session.token, "TEXT") - shaObj.update(uuid_prefix) - var hmac = shaObj.getHMAC("HEX") - return 'v2/' + token_uuid + '/' + hmac - }) + var session = db.loadLocal(); + return db.tokenUUID().then(function(token_uuid) { + var shaObj = new jsSHA("SHA-1", "TEXT"); + shaObj.setHMACKey(session.token, "TEXT"); + shaObj.update(uuid_prefix); + var hmac = shaObj.getHMAC("HEX"); + return 'v2/' + token_uuid + '/' + hmac; + }); }, checkForNewToken: function() { // If there's a token and baseURL in the location bar (i.e., // we just landed here after a successful login), save it and // scrub the location bar. - if (document.location.search[0] != '?') - return - var params = {} + if (document.location.search[0] != '?') { return; } + var params = {}; document.location.search.slice(1).split('&').map(function(kv) { - var e = kv.indexOf('=') - if (e < 0) - return - params[decodeURIComponent(kv.slice(0, e))] = decodeURIComponent(kv.slice(e+1)) - }) - if (!params.baseURL || !params.api_token) + var e = kv.indexOf('='); + if (e < 0) { + return; + } + params[decodeURIComponent(kv.slice(0, e))] = decodeURIComponent(kv.slice(e+1)); + }); + if (!params.baseURL || !params.api_token) { // Have a query string, but it's not a login callback. - return - params.token = params.api_token - delete params.api_token - db.save(params.baseURL, params) - history.replaceState({}, '', document.location.origin + document.location.pathname) + return; + } + params.token = params.api_token; + delete params.api_token; + db.save(params.baseURL, params); + history.replaceState({}, '', document.location.origin + document.location.pathname); }, fillMissingUUIDs: function() { - var sessions = db.loadAll() + var sessions = db.loadAll(); Object.keys(sessions).map(function(key) { - if (key.indexOf('://') < 0) - return + if (key.indexOf('://') < 0) { + return; + } // key is the baseURL placeholder. We need to get our user // record to find out the cluster's real uuid prefix. - var session = sessions[key] + var session = sessions[key]; m.request(session.baseURL+'arvados/v1/users/current', { headers: { - authorization: 'OAuth2 '+session.token, - }, + authorization: 'OAuth2 '+session.token + } }).then(function(user) { - session.user = user - db.save(user.owner_uuid.slice(0, 5), session) - db.trash(key) - }) - }) + session.user = user; + db.save(user.owner_uuid.slice(0, 5), session); + db.trash(key); + }); + }); }, // Return the Workbench base URL advertised by the session's // API server, or a reasonable guess, or (if neither strategy // works out) null. workbenchBaseURL: function(session) { - var dd = db.discoveryDoc(session)() - if (!dd) + var dd = db.discoveryDoc(session)(); + if (!dd) { // Don't fall back to guessing until we receive the discovery doc - return null - if (dd.workbenchUrl) - return dd.workbenchUrl + return null; + } + if (dd.workbenchUrl) { + return dd.workbenchUrl; + } // Guess workbench.{apihostport} is a Workbench... unless // the host part of apihostport is an IPv4 or [IPv6] // address. if (!session.baseURL.match('://(\\[|\\d+\\.\\d+\\.\\d+\\.\\d+[:/])')) { - var wbUrl = session.baseURL.replace('://', '://workbench.') + var wbUrl = session.baseURL.replace('://', '://workbench.'); // Remove the trailing slash, if it's there. - return wbUrl.slice(-1) == '/' ? wbUrl.slice(0, -1) : wbUrl + return wbUrl.slice(-1) === '/' ? wbUrl.slice(0, -1) : wbUrl; } - return null + return null; }, // Return a m.stream that will get fulfilled with the // discovery doc from a session's API server. discoveryDoc: function(session) { - var cache = db.discoveryCache[session.baseURL] + var cache = db.discoveryCache[session.baseURL]; if (!cache) { - db.discoveryCache[session.baseURL] = cache = m.stream() - m.request(session.baseURL+'discovery/v1/apis/arvados/v1/rest').then(cache) + db.discoveryCache[session.baseURL] = cache = m.stream(); + m.request(session.baseURL+'discovery/v1/apis/arvados/v1/rest').then(cache); } - return cache + return cache; }, // Return a promise with the local session token's UUID from the API server. tokenUUID: function() { - var cache = db.tokenUUIDCache + var cache = db.tokenUUIDCache; if (!cache) { - var session = db.loadLocal() + var session = db.loadLocal(); return db.request(session, '/arvados/v1/api_client_authorizations', { data: { - filters: JSON.stringify([['api_token', '=', session.token]]), + filters: JSON.stringify([['api_token', '=', session.token]]) } }).then(function(resp) { - var uuid = resp.items[0].uuid - db.tokenUUIDCache = uuid - return uuid - }) + var uuid = resp.items[0].uuid; + db.tokenUUIDCache = uuid; + return uuid; + }); } else { return new Promise(function(resolve, reject) { - resolve(cache) - }) + resolve(cache); + }); } }, request: function(session, path, opts) { - opts = opts || {} - opts.headers = opts.headers || {} - opts.headers.authorization = 'OAuth2 '+ session.token - return m.request(session.baseURL + path, opts) + opts = opts || {}; + opts.headers = opts.headers || {}; + 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() + var sessions = db.loadActive(); Object.keys(sessions).map(function(uuidPrefix) { - session = sessions[uuidPrefix] + session = sessions[uuidPrefix]; if (!session.isFromRails && session.token && session.token.indexOf('v2/') < 0) { // Only try the federated login - db.login(session.baseURL, false) + 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. autoLoadRemoteHosts: function() { - var activeSessions = db.loadActive() - var doc = db.discoveryDoc(db.loadLocal()) + var activeSessions = db.loadActive(); + var doc = db.discoveryDoc(db.loadLocal()); doc.map(function(d) { Object.keys(d.remoteHosts).map(function(uuidPrefix) { if (!(uuidPrefix in Object.keys(activeSessions))) { db.findAPI(d.remoteHosts[uuidPrefix]).then(function(baseURL) { - db.login(baseURL, false) - }) + db.login(baseURL, false); + }); } - }) - }) + }); + }); }, // If the current logged in account is from a remote federated cluster, // redirect the user to their home cluster's workbench. @@ -284,34 +296,35 @@ window.SessionDB = function() { // result on the home cluster's multi site search page, landing on the // remote workbench and later trying to do another search by just clicking // on the multi site search button instead of going back with the browser. - autoRedirectToHomeCluster: function(path = '/') { - var session = db.loadLocal() - var userUUIDPrefix = session.user.uuid.slice(0, 5) + autoRedirectToHomeCluster: function(path) { + path = path || '/'; + var session = db.loadLocal(); + var userUUIDPrefix = session.user.uuid.slice(0, 5); // If the current user is local to the cluster, do nothing. - if (userUUIDPrefix == session.user.owner_uuid.slice(0, 5)) { - return + if (userUUIDPrefix === session.user.owner_uuid.slice(0, 5)) { + return; } - var doc = db.discoveryDoc(session) + var doc = db.discoveryDoc(session); doc.map(function(d) { // Guess the remote host from the local discovery doc settings - var rHost = null + var rHost = null; if (d.remoteHosts[userUUIDPrefix]) { - rHost = d.remoteHosts[userUUIDPrefix] + rHost = d.remoteHosts[userUUIDPrefix]; } else if (d.remoteHostsViaDNS) { - rHost = userUUIDPrefix + '.arvadosapi.com' + rHost = userUUIDPrefix + '.arvadosapi.com'; } else { // This should not happen: having remote user whose uuid prefix // isn't listed on remoteHosts and dns mechanism is deactivated - return + return; } // Get the remote cluster workbench url & redirect there. - db.findAPI(rHost).then(function(apiUrl) { - var doc = db.discoveryDoc({baseURL: apiUrl}) - doc.map(function(d) { - document.location = d.workbenchUrl + path - }) - }) - }) - }, - }) -} + db.findAPI(rHost).then(function (apiUrl) { + var doc = db.discoveryDoc({baseURL: apiUrl}); + doc.map(function (d) { + document.location = d.workbenchUrl + path; + }); + }); + }); + } + }); +}; -- 2.30.2