diff --git a/packages/api/src/utility/connectUtility.js b/packages/api/src/utility/connectUtility.js index 4a56c98d7..fb37d71df 100644 --- a/packages/api/src/utility/connectUtility.js +++ b/packages/api/src/utility/connectUtility.js @@ -4,6 +4,7 @@ const { getSshTunnelProxy } = require('./sshTunnelProxy'); const platformInfo = require('../utility/platformInfo'); const connections = require('../controllers/connections'); const _ = require('lodash'); +const { getCloudFolderEncryptor } = require('./cloudIntf'); async function loadConnection(driver, storedConnection, connectionMode) { const { allowShellConnection, allowConnectionFromEnvVariables } = platformInfo; @@ -88,13 +89,31 @@ async function extractConnectionSslParams(connection) { return ssl; } +async function decryptCloudConnection(connection) { + const m = connection?._id?.match(/^cloud\:\/\/(.+)\/(.+)$/); + if (!m) { + throw new Error('Invalid cloud connection ID format'); + } + + const folid = m[1]; + const cntid = m[2]; + + const folderEncryptor = await getCloudFolderEncryptor(folid); + return decryptConnection(connection, folderEncryptor); +} + async function connectUtility(driver, storedConnection, connectionMode, additionalOptions = null) { const connectionLoaded = await loadConnection(driver, storedConnection, connectionMode); - const connection = { - database: connectionLoaded.defaultDatabase, - ...decryptConnection(connectionLoaded), - }; + const connection = connectionLoaded?._id?.startsWith('cloud://') + ? { + database: connectionLoaded.defaultDatabase, + ...(await decryptCloudConnection(connectionLoaded)), + } + : { + database: connectionLoaded.defaultDatabase, + ...decryptConnection(connectionLoaded), + }; if (!connection.port && driver.defaultPort) { connection.port = driver.defaultPort.toString(); diff --git a/packages/api/src/utility/crypting.js b/packages/api/src/utility/crypting.js index 4d3e9070a..4ff5df522 100644 --- a/packages/api/src/utility/crypting.js +++ b/packages/api/src/utility/crypting.js @@ -91,11 +91,11 @@ function encryptObjectPasswordField(obj, field, encryptor = null) { return obj; } -function decryptObjectPasswordField(obj, field) { +function decryptObjectPasswordField(obj, field, encryptor = null) { if (obj && obj[field] && obj[field].startsWith('crypt:')) { return { ...obj, - [field]: getInternalEncryptor().decrypt(obj[field].substring('crypt:'.length)), + [field]: (encryptor || getInternalEncryptor()).decrypt(obj[field].substring('crypt:'.length)), }; } return obj; @@ -115,10 +115,10 @@ function maskConnection(connection) { return _.omit(connection, ['password', 'sshPassword', 'sshKeyfilePassword']); } -function decryptConnection(connection) { - connection = decryptObjectPasswordField(connection, 'password'); - connection = decryptObjectPasswordField(connection, 'sshPassword'); - connection = decryptObjectPasswordField(connection, 'sshKeyfilePassword'); +function decryptConnection(connection, encryptor = null) { + connection = decryptObjectPasswordField(connection, 'password', encryptor); + connection = decryptObjectPasswordField(connection, 'sshPassword', encryptor); + connection = decryptObjectPasswordField(connection, 'sshKeyfilePassword', encryptor); return connection; } diff --git a/packages/web/src/utility/api.ts b/packages/web/src/utility/api.ts index d2187a1e9..9a248c762 100644 --- a/packages/web/src/utility/api.ts +++ b/packages/web/src/utility/api.ts @@ -14,7 +14,7 @@ import { batchDispatchCacheTriggers, dispatchCacheChange } from './cache'; import { isAdminPage, isOneOfPage } from './pageDefs'; import { openWebLink } from './simpleTools'; import { serializeJsTypesReplacer } from 'dbgate-tools'; -import { cloudSigninTokenHolder } from '../stores'; +import { cloudSigninTokenHolder, selectedWidget } from '../stores'; import LicenseLimitMessageModal from '../modals/LicenseLimitMessageModal.svelte'; export const strmid = uuidv1(); @@ -290,8 +290,9 @@ export function installNewVolatileConnectionListener() { export function installNewCloudTokenListener() { apiOn('got-cloud-token', async tokenHolder => { - console.log('HOLDER', tokenHolder); + // console.log('HOLDER', tokenHolder); cloudSigninTokenHolder.set(tokenHolder); + selectedWidget.set('cloud-private'); }); } diff --git a/packages/web/src/widgets/PrivateCloudWidget.svelte b/packages/web/src/widgets/PrivateCloudWidget.svelte index 29b80004c..0b4546921 100644 --- a/packages/web/src/widgets/PrivateCloudWidget.svelte +++ b/packages/web/src/widgets/PrivateCloudWidget.svelte @@ -35,6 +35,9 @@ import { showSnackbarInfo } from '../utility/snackbar'; import { isProApp } from '../utility/proTools'; import { useCloudContentColorFactory, useConnectionColorFactory } from '../utility/useConnectionColor'; + import ErrorInfo from '../elements/ErrorInfo.svelte'; + import FormStyledButton from '../buttons/FormStyledButton.svelte'; + import runCommand from '../commands/runCommand'; let filter = ''; let domSqlObjectList = null; @@ -250,8 +253,32 @@ }} groupContextMenu={createGroupContextMenu} /> + + {#if !cloudContentFlat?.length} + +
+
+ { + runCommand('new.connectionOnCloud'); + }} + /> +
+ {/if} + +