From ca145967dccd9f2e484550acc0f9e3a62fa988d3 Mon Sep 17 00:00:00 2001 From: "SPRINX0\\prochazka" Date: Fri, 25 Jul 2025 07:52:30 +0200 Subject: [PATCH] SYNC: Merge branch 'feature/firestore' --- packages/api/.env | 1 + packages/api/src/utility/crypting.js | 24 ++++---- packages/types/engines.d.ts | 2 +- .../web/src/forms/FormFileInputField.svelte | 58 +++++++++++++++++++ .../settings/ConnectionDriverFields.svelte | 8 +-- packages/web/src/utility/parseFileAsJson.js | 23 -------- packages/web/src/utility/parseFileAsString.js | 15 +++++ 7 files changed, 91 insertions(+), 40 deletions(-) create mode 100644 packages/web/src/forms/FormFileInputField.svelte create mode 100644 packages/web/src/utility/parseFileAsString.js diff --git a/packages/api/.env b/packages/api/.env index 9ab8fc3d2..244811b8c 100644 --- a/packages/api/.env +++ b/packages/api/.env @@ -25,3 +25,4 @@ DEVWEB=1 # LOGIN_PASSWORD_test=test # LOGIN_PERMISSIONS_test=~*, widgets/database # WORKSPACE_DIR=/home/jena/dbgate-data-2 +DBGATE_LICENSE=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InNhbGVzQGRiZ2F0ZS5ldSIsIm5hbWUiOiJEYkdhdGUgdGVzdCIsImxpY2Vuc2VJZCI6Ijk2ODJhODhiLTkwOWYtNDhiMS1hZGJmLWMwMzYyMjg4NDQyMSIsImNyZWF0ZWQiOiIyMDI1LTA2LTEyVDE1OjQ0OjAwLjY0NloiLCJlbmQiOjE3ODEyNzkwNDEsImV4cCI6MTc4MTg4Mzg0MSwiaWF0IjoxNzQ5NzQzMDQwfQ.h-pYymeb8ivJMo695PLo-tKxqfr3ZBiyZA4GllnAZbLDwBtxKY54BKfI2j70AtckuohAhn4i6VZn7UG_MIQSZVE7z8pwZyP4Jj8NUt9fYpCOFUfJMl_3iP6WOQ0eb9cyHfNsbKkXbi9wEuXoblLDCi2ve76ODqByPwA7FfCuY97zrxe9Zzth09Z4M0KjfeX7L50tQzMBVqW2rQAH1yc48fsaRbX8IABUqpvIjmhQBAgKlNltZlQrUfd1Egyi8TBSqvXhgqDz-gnJW_oe5eb2-emWZln38p7QwQy4smvvtOVZuUozv0boLS3wfzp9JaDZ4SXjWpBx-la7vm8L6wQYBQ diff --git a/packages/api/src/utility/crypting.js b/packages/api/src/utility/crypting.js index 4ff5df522..822d74c1b 100644 --- a/packages/api/src/utility/crypting.js +++ b/packages/api/src/utility/crypting.js @@ -101,24 +101,26 @@ function decryptObjectPasswordField(obj, field, encryptor = null) { return obj; } +const fieldsToEncrypt = ['password', 'sshPassword', 'sshKeyfilePassword', 'connectionDefinition']; + function encryptConnection(connection, encryptor = null) { if (connection.passwordMode != 'saveRaw') { - connection = encryptObjectPasswordField(connection, 'password', encryptor); - connection = encryptObjectPasswordField(connection, 'sshPassword', encryptor); - connection = encryptObjectPasswordField(connection, 'sshKeyfilePassword', encryptor); + for (const field of fieldsToEncrypt) { + connection = encryptObjectPasswordField(connection, field, encryptor); + } } return connection; } function maskConnection(connection) { if (!connection) return connection; - return _.omit(connection, ['password', 'sshPassword', 'sshKeyfilePassword']); + return _.omit(connection, fieldsToEncrypt); } -function decryptConnection(connection, encryptor = null) { - connection = decryptObjectPasswordField(connection, 'password', encryptor); - connection = decryptObjectPasswordField(connection, 'sshPassword', encryptor); - connection = decryptObjectPasswordField(connection, 'sshKeyfilePassword', encryptor); +function decryptConnection(connection) { + for (const field of fieldsToEncrypt) { + connection = decryptObjectPasswordField(connection, field); + } return connection; } @@ -188,9 +190,9 @@ function recryptObjectPasswordFieldInPlace(obj, field, decryptEncryptor, encrypt } function recryptConnection(connection, decryptEncryptor, encryptEncryptor) { - connection = recryptObjectPasswordField(connection, 'password', decryptEncryptor, encryptEncryptor); - connection = recryptObjectPasswordField(connection, 'sshPassword', decryptEncryptor, encryptEncryptor); - connection = recryptObjectPasswordField(connection, 'sshKeyfilePassword', decryptEncryptor, encryptEncryptor); + for (const field of fieldsToEncrypt) { + connection = recryptObjectPasswordField(connection, field, decryptEncryptor, encryptEncryptor); + } return connection; } diff --git a/packages/types/engines.d.ts b/packages/types/engines.d.ts index c74010947..12fba070f 100644 --- a/packages/types/engines.d.ts +++ b/packages/types/engines.d.ts @@ -241,7 +241,7 @@ export interface EngineDriver extends FilterBehaviourProvider { defaultSocketPath?: string; authTypeLabel?: string; importExportArgs?: any[]; - connect({ server, port, user, password, database, certificateJson }): Promise>; + connect({ server, port, user, password, database, connectionDefinition }): Promise>; close(dbhan: DatabaseHandle): Promise; query(dbhan: DatabaseHandle, sql: string, options?: QueryOptions): Promise; stream(dbhan: DatabaseHandle, sql: string, options: StreamOptions); diff --git a/packages/web/src/forms/FormFileInputField.svelte b/packages/web/src/forms/FormFileInputField.svelte new file mode 100644 index 000000000..be7205d3e --- /dev/null +++ b/packages/web/src/forms/FormFileInputField.svelte @@ -0,0 +1,58 @@ + + + + + diff --git a/packages/web/src/settings/ConnectionDriverFields.svelte b/packages/web/src/settings/ConnectionDriverFields.svelte index 0e578d650..8830861d3 100644 --- a/packages/web/src/settings/ConnectionDriverFields.svelte +++ b/packages/web/src/settings/ConnectionDriverFields.svelte @@ -18,9 +18,7 @@ import FormDropDownTextField from '../forms/FormDropDownTextField.svelte'; import { getConnectionLabel } from 'dbgate-tools'; import { _t } from '../translations'; - import FilesInput from '../impexp/FilesInput.svelte'; - import SimpleFilesInput from '../impexp/SimpleFilesInput.svelte'; - import FormJsonFileInputField from '../forms/FormJsonFileInputField.svelte'; + import FormFileInputField from '../forms/FormFileInputField.svelte'; export let getDatabaseList; export let currentConnection; @@ -465,8 +463,8 @@ /> {/if} -{#if driver?.showConnectionField('certificateJson', $values, showConnectionFieldArgs)} - +{#if driver?.showConnectionField('connectionDefinition', $values, showConnectionFieldArgs)} + {/if} {#if driver} diff --git a/packages/web/src/utility/parseFileAsJson.js b/packages/web/src/utility/parseFileAsJson.js index 079e284c1..0d0ed8a09 100644 --- a/packages/web/src/utility/parseFileAsJson.js +++ b/packages/web/src/utility/parseFileAsJson.js @@ -1,26 +1,3 @@ -/** - * @template [T = any] - * @typedef {Object} FileParseResultSuccess - * @property {true} success - * @property {T} data - */ - -/** - * @typedef {Object} FileParseResultError - * @property {false} success - * @property {string} error - */ - -/** - * @template [T = any] - * @typedef {FileParseResultSuccess | FileParseResultError} FileParseResult - */ - -/** - * @template [T = any] - * @param {File} file - * @returns {Promise>} - */ export async function parseFileAsJson(file) { try { const text = await file.text(); diff --git a/packages/web/src/utility/parseFileAsString.js b/packages/web/src/utility/parseFileAsString.js new file mode 100644 index 000000000..f34676746 --- /dev/null +++ b/packages/web/src/utility/parseFileAsString.js @@ -0,0 +1,15 @@ +export async function parseFileAsString(file) { + try { + const text = await file.text(); + const data = text; + return { + success: true, + data, + }; + } catch (error) { + return { + success: false, + error: error instanceof Error ? error.message : 'Unknown parsing error', + }; + } +}