From b5890b788f842726d63cb3678b5cf721e294f19d Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 16 May 2023 09:50:23 +0200 Subject: [PATCH 01/11] Append auth on verification --- packages/server/src/api/controllers/datasource.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/server/src/api/controllers/datasource.ts b/packages/server/src/api/controllers/datasource.ts index 3534fc3076..65c910bcc0 100644 --- a/packages/server/src/api/controllers/datasource.ts +++ b/packages/server/src/api/controllers/datasource.ts @@ -25,6 +25,7 @@ import { DatasourcePlus, } from "@budibase/types" import sdk from "../../sdk" +import _ from "lodash" function getErrorTables(errors: any, errorType: string) { return Object.entries(errors) @@ -126,8 +127,13 @@ export async function fetch(ctx: UserCtx) { export async function verify( ctx: UserCtx ) { - const datasource = ctx.request.body.datasource - const connector = (await getConnector(datasource)) as IntegrationBase + const { datasource } = ctx.request.body + + const { config: { auth } = {} } = await sdk.datasources.get(datasource._id!) + + const connector = await getConnector( + _.merge({ config: { auth } }, datasource) + ) if (!connector.testConnection) { ctx.throw(400, "Connection information verification not supported") } From 77102cea120ec32ebee1909b9d1d8cb88da14861 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 16 May 2023 09:50:40 +0200 Subject: [PATCH 02/11] Typing --- packages/types/src/documents/app/datasource.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/types/src/documents/app/datasource.ts b/packages/types/src/documents/app/datasource.ts index 8dfdfe6d0f..89e7422cb4 100644 --- a/packages/types/src/documents/app/datasource.ts +++ b/packages/types/src/documents/app/datasource.ts @@ -9,7 +9,7 @@ export interface Datasource extends Document { // the config is defined by the schema config?: { [key: string]: string | number | boolean | any[] - } + } & { auth?: object } plus?: boolean entities?: { [key: string]: Table From cd93d327a5b1368abcb02a51ccf9325cb5876af9 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 16 May 2023 10:02:11 +0200 Subject: [PATCH 03/11] Test google sheets --- packages/server/src/integrations/googlesheets.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/server/src/integrations/googlesheets.ts b/packages/server/src/integrations/googlesheets.ts index 0b2be54fb3..6cad048c83 100644 --- a/packages/server/src/integrations/googlesheets.ts +++ b/packages/server/src/integrations/googlesheets.ts @@ -141,6 +141,16 @@ class GoogleSheetsIntegration implements DatasourcePlus { this.client = new GoogleSpreadsheet(spreadsheetId) } + async testConnection() { + try { + await this.connect() + await this.client.loadInfo() + return true + } catch (e: any) { + return { error: e.message as string } + } + } + getBindingIdentifier() { return "" } From a676e42b1f356dc3fd563dd12a62ad20abf7eb40 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 16 May 2023 10:44:41 +0200 Subject: [PATCH 04/11] Handle config --- packages/server/src/api/controllers/datasource.ts | 6 ++---- packages/types/src/documents/app/datasource.ts | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/server/src/api/controllers/datasource.ts b/packages/server/src/api/controllers/datasource.ts index 65c910bcc0..686515b293 100644 --- a/packages/server/src/api/controllers/datasource.ts +++ b/packages/server/src/api/controllers/datasource.ts @@ -129,11 +129,9 @@ export async function verify( ) { const { datasource } = ctx.request.body - const { config: { auth } = {} } = await sdk.datasources.get(datasource._id!) + const { config } = await sdk.datasources.get(datasource._id!) - const connector = await getConnector( - _.merge({ config: { auth } }, datasource) - ) + const connector = await getConnector(_.merge(datasource, { config })) if (!connector.testConnection) { ctx.throw(400, "Connection information verification not supported") } diff --git a/packages/types/src/documents/app/datasource.ts b/packages/types/src/documents/app/datasource.ts index 89e7422cb4..8dfdfe6d0f 100644 --- a/packages/types/src/documents/app/datasource.ts +++ b/packages/types/src/documents/app/datasource.ts @@ -9,7 +9,7 @@ export interface Datasource extends Document { // the config is defined by the schema config?: { [key: string]: string | number | boolean | any[] - } & { auth?: object } + } plus?: boolean entities?: { [key: string]: Table From 5e7d839cb1c2fc8b35e44f268df2692b4615ebe6 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 16 May 2023 10:50:27 +0200 Subject: [PATCH 05/11] Use existing merge --- packages/server/src/api/controllers/datasource.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/server/src/api/controllers/datasource.ts b/packages/server/src/api/controllers/datasource.ts index 686515b293..a87c8c68f6 100644 --- a/packages/server/src/api/controllers/datasource.ts +++ b/packages/server/src/api/controllers/datasource.ts @@ -25,7 +25,6 @@ import { DatasourcePlus, } from "@budibase/types" import sdk from "../../sdk" -import _ from "lodash" function getErrorTables(errors: any, errorType: string) { return Object.entries(errors) @@ -128,10 +127,14 @@ export async function verify( ctx: UserCtx ) { const { datasource } = ctx.request.body + const existingDatasource = await sdk.datasources.get(datasource._id!) - const { config } = await sdk.datasources.get(datasource._id!) + const enrichedDatasource = sdk.datasources.mergeConfigs( + datasource, + existingDatasource + ) - const connector = await getConnector(_.merge(datasource, { config })) + const connector = await getConnector(enrichedDatasource) if (!connector.testConnection) { ctx.throw(400, "Connection information verification not supported") } From a21039d5b4be12455f676df304e41ab0915f3b71 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 16 May 2023 10:56:46 +0200 Subject: [PATCH 06/11] Fix auth checks when specified auth --- packages/server/src/sdk/app/datasources/datasources.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/server/src/sdk/app/datasources/datasources.ts b/packages/server/src/sdk/app/datasources/datasources.ts index dee0a221aa..c886e6a15f 100644 --- a/packages/server/src/sdk/app/datasources/datasources.ts +++ b/packages/server/src/sdk/app/datasources/datasources.ts @@ -13,6 +13,7 @@ import { import { cloneDeep } from "lodash/fp" import { getEnvironmentVariables } from "../../utils" import { getDefinitions, getDefinition } from "../../../integrations" +import _ from "lodash" const ENV_VAR_PREFIX = "env." @@ -147,6 +148,11 @@ export function mergeConfigs(update: Datasource, old: Datasource) { } } } + + if (old.config?.auth) { + update.config = _.merge(old.config, update.config) + } + // update back to actual passwords for everything else for (let [key, value] of Object.entries(update.config)) { if (value !== PASSWORD_REPLACEMENT) { From 911a0720694a54546e40502a2a4df2007f649f77 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 16 May 2023 11:44:58 +0200 Subject: [PATCH 07/11] Update types --- packages/server/src/integrations/googlesheets.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/server/src/integrations/googlesheets.ts b/packages/server/src/integrations/googlesheets.ts index 6cad048c83..a8fd966782 100644 --- a/packages/server/src/integrations/googlesheets.ts +++ b/packages/server/src/integrations/googlesheets.ts @@ -1,5 +1,5 @@ import { - DatasourceFeature, + ConnectionInfo, DatasourceFieldType, DatasourcePlus, FieldType, @@ -141,13 +141,16 @@ class GoogleSheetsIntegration implements DatasourcePlus { this.client = new GoogleSpreadsheet(spreadsheetId) } - async testConnection() { + async testConnection(): Promise { try { await this.connect() await this.client.loadInfo() - return true + return { connected: true } } catch (e: any) { - return { error: e.message as string } + return { + connected: false, + error: e.message as string, + } } } From d6473aab87b80be32aaae9c9810358e737d31355 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 16 May 2023 09:50:23 +0200 Subject: [PATCH 08/11] Append auth on verification --- packages/server/src/api/controllers/datasource.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/server/src/api/controllers/datasource.ts b/packages/server/src/api/controllers/datasource.ts index a87c8c68f6..a6609abff2 100644 --- a/packages/server/src/api/controllers/datasource.ts +++ b/packages/server/src/api/controllers/datasource.ts @@ -25,6 +25,7 @@ import { DatasourcePlus, } from "@budibase/types" import sdk from "../../sdk" +import _ from "lodash" function getErrorTables(errors: any, errorType: string) { return Object.entries(errors) From b3b962534f692a4bab7cf8d460323f70a79eed95 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 16 May 2023 11:40:29 +0200 Subject: [PATCH 09/11] Test snowflake connection --- packages/server/src/integrations/snowflake.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/server/src/integrations/snowflake.ts b/packages/server/src/integrations/snowflake.ts index 46a40b8b03..7b35968aaf 100644 --- a/packages/server/src/integrations/snowflake.ts +++ b/packages/server/src/integrations/snowflake.ts @@ -71,6 +71,15 @@ class SnowflakeIntegration { this.client = new Snowflake(config) } + async testConnection() { + try { + await this.client.connect() + return true + } catch (e: any) { + return { error: e.message as string } + } + } + async internalQuery(query: SqlQuery) { await this.client.connect() try { From 062127b1f10b4bf74ae6158d0922035ef441a180 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 16 May 2023 11:48:40 +0200 Subject: [PATCH 10/11] Fix types --- packages/server/src/integrations/snowflake.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/server/src/integrations/snowflake.ts b/packages/server/src/integrations/snowflake.ts index 7b35968aaf..dc5fb66c55 100644 --- a/packages/server/src/integrations/snowflake.ts +++ b/packages/server/src/integrations/snowflake.ts @@ -1,4 +1,5 @@ import { + ConnectionInfo, DatasourceFeature, Integration, QueryType, @@ -71,12 +72,15 @@ class SnowflakeIntegration { this.client = new Snowflake(config) } - async testConnection() { + async testConnection(): Promise { try { await this.client.connect() - return true + return { connected: true } } catch (e: any) { - return { error: e.message as string } + return { + connected: false, + error: e.message as string, + } } } From 2176ac8da746b3b9512f73e0423831d8f6389118 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Tue, 16 May 2023 11:49:51 +0200 Subject: [PATCH 11/11] Clean code --- packages/server/src/api/controllers/datasource.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/server/src/api/controllers/datasource.ts b/packages/server/src/api/controllers/datasource.ts index a6609abff2..a87c8c68f6 100644 --- a/packages/server/src/api/controllers/datasource.ts +++ b/packages/server/src/api/controllers/datasource.ts @@ -25,7 +25,6 @@ import { DatasourcePlus, } from "@budibase/types" import sdk from "../../sdk" -import _ from "lodash" function getErrorTables(errors: any, errorType: string) { return Object.entries(errors)