diff --git a/packages/api/src/controllers/cloud.js b/packages/api/src/controllers/cloud.js index 50cfd61c5..c5db7fb37 100644 --- a/packages/api/src/controllers/cloud.js +++ b/packages/api/src/controllers/cloud.js @@ -7,6 +7,7 @@ const { getCloudFolderEncryptor, getCloudContent, putCloudContent, + removeCloudCachedConnection, } = require('../utility/cloudIntf'); const connections = require('./connections'); const socket = require('../utility/socket'); @@ -128,17 +129,32 @@ module.exports = { saveConnection_meta: true, async saveConnection({ folid, connection }) { + let cntid = undefined; + if (connection._id) { + const m = connection._id.match(/^cloud\:\/\/(.+)\/(.+)$/); + if (!m) { + throw new Error('Invalid cloud connection ID format'); + } + folid = m[1]; + cntid = m[2]; + } + + if (!folid) { + throw new Error('Missing cloud folder ID'); + } + const folderEncryptor = await getCloudFolderEncryptor(folid); const recryptedConn = encryptConnection(connection, folderEncryptor); const resp = await putCloudContent( folid, - undefined, + cntid, JSON.stringify(recryptedConn), getConnectionLabel(recryptedConn), 'connection' ); - const { cntid } = resp; + removeCloudCachedConnection(folid, resp.cntid); + cntid = resp.cntid; socket.emitChanged('cloud-content-changed'); return { ...recryptedConn, diff --git a/packages/api/src/proc/connectProcess.js b/packages/api/src/proc/connectProcess.js index 6d375c596..58d2ac454 100644 --- a/packages/api/src/proc/connectProcess.js +++ b/packages/api/src/proc/connectProcess.js @@ -28,14 +28,7 @@ function start() { let version = { version: 'Unknown', }; - try { - version = await driver.getVersion(dbhan); - } catch (err) { - logger.error(extractErrorLogData(err), 'Error getting DB server version'); - version = { - version: 'Unknown', - }; - } + version = await driver.getVersion(dbhan); let databases = undefined; if (requestDbList) { databases = await driver.listDatabases(dbhan); diff --git a/packages/api/src/utility/cloudIntf.js b/packages/api/src/utility/cloudIntf.js index a12980bf6..d1dfbdc7d 100644 --- a/packages/api/src/utility/cloudIntf.js +++ b/packages/api/src/utility/cloudIntf.js @@ -271,7 +271,7 @@ async function callCloudApiPost(endpoint, body, signinHolder = null) { async function getCloudFolderEncryptor(folid) { const { encryptionKey } = await callCloudApiGet(`folder-key/${folid}`); if (!encryptionKey) { - throw new Error('No encryption key'); + throw new Error('No encryption key for folder: ' + folid); } return simpleEncryptor.createEncryptor(encryptionKey); } @@ -336,6 +336,11 @@ async function loadCachedCloudConnection(folid, cntid) { return cloudConnectionCache[cacheKey]; } +function removeCloudCachedConnection(folid, cntid) { + const cacheKey = `${folid}|${cntid}`; + delete cloudConnectionCache[cacheKey]; +} + module.exports = { createDbGateIdentitySession, startCloudTokenChecking, @@ -349,4 +354,5 @@ module.exports = { getCloudContent, loadCachedCloudConnection, putCloudContent, + removeCloudCachedConnection, }; diff --git a/packages/web/src/tabs/ConnectionTab.svelte b/packages/web/src/tabs/ConnectionTab.svelte index ebc5d2fa3..5df80d76f 100644 --- a/packages/web/src/tabs/ConnectionTab.svelte +++ b/packages/web/src/tabs/ConnectionTab.svelte @@ -159,7 +159,7 @@ $: currentConnection = getCurrentConnectionCore($values, driver); async function handleSave() { - if (saveOnCloud) { + if (saveOnCloud && !getCurrentConnection()?._id) { showModal(ChooseCloudFolderModal, { requiredRoleVariants: ['write', 'admin'], message: 'Choose cloud folder to saved connection', @@ -184,6 +184,17 @@ } }, }); + } else if ( + // @ts-ignore + getCurrentConnection()?._id?.startsWith('cloud://') + ) { + let connection = getCurrentConnection(); + await apiCall('cloud/save-connection', { connection }); + showSnackbarSuccess('Connection saved'); + changeTab(tabid, tab => ({ + ...tab, + title: getConnectionLabel(connection), + })); } else { let connection = getCurrentConnection(); connection = { @@ -210,19 +221,32 @@ async function handleConnect() { let connection = getCurrentConnection(); - if (!connection._id) { - connection = { - ...connection, - unsaved: true, + + if ( + // @ts-ignore + connection?._id?.startsWith('cloud://') + ) { + const saved = await apiCall('cloud/save-connection', { connection }); + changeTab(tabid, tab => ({ + ...tab, + title: getConnectionLabel(connection), + })); + openConnection(saved); + } else { + if (!connection._id) { + connection = { + ...connection, + unsaved: true, + }; + } + const saved = await apiCall('connections/save', connection); + $values = { + ...$values, + unsaved: connection.unsaved, + _id: saved._id, }; + openConnection(saved); } - const saved = await apiCall('connections/save', connection); - $values = { - ...$values, - unsaved: connection.unsaved, - _id: saved._id, - }; - openConnection(saved); // closeMultipleTabs(x => x.tabid == tabid, true); } diff --git a/packages/web/src/widgets/PrivateCloudWidget.svelte b/packages/web/src/widgets/PrivateCloudWidget.svelte index e67dcb5c6..49d2c01e9 100644 --- a/packages/web/src/widgets/PrivateCloudWidget.svelte +++ b/packages/web/src/widgets/PrivateCloudWidget.svelte @@ -20,6 +20,7 @@ currentDatabase, expandedConnections, openedConnections, + openedSingleDatabaseConnections, } from '../stores'; import _ from 'lodash'; import { plusExpandIcon } from '../icons/expandIcons'; @@ -74,12 +75,26 @@ }; } - onMount(() => { - const currentConid = $currentDatabase?.connection?._id; - if (currentConid?.startsWith('cloud://') && !$cloudConnectionsStore[currentConid]) { - loadCloudConnection(currentConid); - } - }); + function ensureCloudConnectionsLoaded(...conids) { + _.uniq(conids).forEach(conid => { + if (conid?.startsWith('cloud://') && !$cloudConnectionsStore[conid]) { + loadCloudConnection(conid); + } + }); + } + + $: ensureCloudConnectionsLoaded( + $currentDatabase?.connection?._id, + ...$openedSingleDatabaseConnections, + ...$openedConnections + ); + + // onMount(() => { + // const currentConid = $currentDatabase?.connection?._id; + // if (currentConid?.startsWith('cloud://') && !$cloudConnectionsStore[currentConid]) { + // loadCloudConnection(currentConid); + // } + // }); function createAddMenu() { return [