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}
+