From 5937d1b9761197feeeb5b01ae29b2164c9f1b002 Mon Sep 17 00:00:00 2001 From: Ganesh Kumar Date: Wed, 26 Jul 2023 13:58:29 +0530 Subject: [PATCH 1/3] added SSL option for Rest API --- plugins/packages/restapi/lib/index.ts | 48 ++++++-- plugins/packages/restapi/lib/manifest.json | 133 +++++++++++++++++---- 2 files changed, 151 insertions(+), 30 deletions(-) diff --git a/plugins/packages/restapi/lib/index.ts b/plugins/packages/restapi/lib/index.ts index 30bfbaa961..1b339a389b 100644 --- a/plugins/packages/restapi/lib/index.ts +++ b/plugins/packages/restapi/lib/index.ts @@ -47,6 +47,7 @@ export default class RestapiQueryService implements QueryService { Object.entries(customQueryParams).map(([key, value]) => authUrl.searchParams.append(key, value)); return authUrl.toString(); } + /* Headers of the source will be overridden by headers of the query */ headers(sourceOptions: any, queryOptions: any, hasDataSource: boolean): Headers { const _headers = (queryOptions.headers || []).filter((o) => { @@ -120,7 +121,7 @@ export default class RestapiQueryService implements QueryService { const isUrlEncoded = this.checkIfContentTypeIsURLenc(queryOptions['headers']); const isMultiAuthEnabled = sourceOptions['multiple_auth_enabled']; - /* Chceck if OAuth tokens exists for the source if query requires OAuth */ + /* Check if OAuth tokens exists for the source if query requires OAuth */ if (requiresOauth) { const tokenData = sourceOptions['tokenData']; const isAppPublic = context?.app.isPublic; @@ -164,7 +165,7 @@ export default class RestapiQueryService implements QueryService { const requestOptions: OptionsOfTextResponseBody = { method, headers, - ...this.fetchHttpsCertsForCustomCA(), + ...this.fetchHttpsCertsForCustomCA(sourceOptions), searchParams: { ...paramsFromUrl, ...this.searchParams(sourceOptions, queryOptions, hasDataSource), @@ -232,14 +233,43 @@ export default class RestapiQueryService implements QueryService { }; } - fetchHttpsCertsForCustomCA() { - if (!process.env.NODE_EXTRA_CA_CERTS) return {}; + fetchHttpsCertsForCustomCA(sourceOptions: any) { + let httpsParams: any = {}; + switch (sourceOptions.ssl_certificate) { + case 'ca_certificate': + httpsParams = { + https: { + certificateAuthority: [sourceOptions.ca_cert], + }, + }; + break; + case 'client_certificate': + httpsParams = { + https: { + certificateAuthority: [sourceOptions.ca_cert], + key: [sourceOptions.client_key], + certificate: [sourceOptions.client_cert], + }, + }; + break; + default: + break; + } - return { - https: { - certificateAuthority: [...tls.rootCertificates, readFileSync(process.env.NODE_EXTRA_CA_CERTS)].join('\n'), - }, - }; + if (process.env.NODE_EXTRA_CA_CERTS) { + 'https' in httpsParams + ? (httpsParams.https.certificateAuthority = httpsParams.https?.certificateAuthority.concat([ + ...tls.rootCertificates, + readFileSync(process.env.NODE_EXTRA_CA_CERTS), + ])) + : (httpsParams = { + https: { + certificateAuthority: [...tls.rootCertificates, readFileSync(process.env.NODE_EXTRA_CA_CERTS)].join('\n'), + }, + }); + } + + return httpsParams; } private getResponse(response) { diff --git a/plugins/packages/restapi/lib/manifest.json b/plugins/packages/restapi/lib/manifest.json index 6ffacaa5e1..fcb1e9a862 100644 --- a/plugins/packages/restapi/lib/manifest.json +++ b/plugins/packages/restapi/lib/manifest.json @@ -52,6 +52,18 @@ }, "custom_auth_params": { "type": "array" + }, + "ca_cert": { + "encrypted": true + }, + "client_key": { + "encrypted": true + }, + "client_cert": { + "encrypted": true + }, + "root_cert": { + "encrypted": true } }, "exposedVariables": { @@ -105,40 +117,119 @@ "value": "header" }, "headers": { - "value": [["", ""]] + "value": [ + [ + "", + "" + ] + ] }, "custom_query_params": { - "value": [["", ""]] + "value": [ + [ + "", + "" + ] + ] }, "custom_auth_params": { - "value": [["", ""]] + "value": [ + [ + "", + "" + ] + ] }, "access_token_custom_headers": { - "value": [["", ""]] + "value": [ + [ + "", + "" + ] + ] }, "multiple_auth_enabled": { "value": false + }, + "ssl_certificate": { + "value": "none" } }, "properties": { - "url": { - "label": "Base URL", - "key": "url", - "type": "text", - "description": "https://api.example.com/v1/" + "ssl_certificate": { + "label": "SSL Certificate", + "key": "ssl_certificate", + "type": "dropdown-component-flip", + "description": "Single select dropdown for choosing certificates", + "list": [ + { + "value": "ca_certificate", + "name": "CA certificate" + }, + { + "value": "client_certificate", + "name": "Client certificate" + }, + { + "value": "none", + "name": "None" + } + ], + "commonFields": { + "url": { + "label": "Base URL", + "key": "url", + "type": "text", + "description": "https://api.example.com/v1/" + }, + "headers": { + "label": "Headers", + "key": "headers", + "type": "react-component-headers", + "description": "key-value pair headers for rest api" + }, + "auth_type": { + "label": "Authentication Type", + "key": "auth_type", + "type": "react-component-oauth-authentication", + "description": "key-value pair headers for rest api" + } + } }, - "headers": { - "label": "Headers", - "key": "headers", - "type": "react-component-headers", - "description": "key-value pair headers for rest api" + "ca_certificate": { + "ca_cert": { + "label": "CA Cert", + "key": "ca_cert", + "type": "textarea", + "encrypted": true, + "description": "Enter ca certificate" + } }, - "auth_type": { - "label": "Authentication Type", - "key": "auth_type", - "type": "react-component-oauth-authentication", - "description": "key-value pair headers for rest api" + "client_certificate": { + "client_key": { + "label": "Client Key", + "key": "client_key", + "type": "textarea", + "encrypted": true, + "description": "Enter client key" + }, + "client_cert": { + "label": "Client Cert", + "key": "client_cert", + "type": "textarea", + "encrypted": true, + "description": "Enter client certificate" + }, + "ca_cert": { + "label": "CA Cert", + "key": "ca_cert", + "type": "textarea", + "encrypted": true, + "description": "Enter ca certificate" + } } }, - "required": ["url"] -} + "required": [ + "url" + ] +} \ No newline at end of file From 74c5d14964f5baa96040dbc46d6393a69957a440 Mon Sep 17 00:00:00 2001 From: Ganesh Kumar Date: Thu, 27 Jul 2023 11:32:09 +0530 Subject: [PATCH 2/3] changes in package lock file of server --- server/package-lock.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/package-lock.json b/server/package-lock.json index ae65bfd39f..8cd5d29c55 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -114,6 +114,7 @@ "@tooljet-plugins/amazonses": "file:packages/amazonses", "@tooljet-plugins/appwrite": "file:packages/appwrite", "@tooljet-plugins/athena": "file:packages/athena", + "@tooljet-plugins/azureblobstorage": "file:packages/azureblobstorage", "@tooljet-plugins/baserow": "file:packages/baserow", "@tooljet-plugins/bigquery": "file:packages/bigquery", "@tooljet-plugins/clickhouse": "file:packages/clickhouse", @@ -14869,6 +14870,7 @@ "@tooljet-plugins/amazonses": "file:packages/amazonses", "@tooljet-plugins/appwrite": "file:packages/appwrite", "@tooljet-plugins/athena": "file:packages/athena", + "@tooljet-plugins/azureblobstorage": "file:packages/azureblobstorage", "@tooljet-plugins/baserow": "file:packages/baserow", "@tooljet-plugins/bigquery": "file:packages/bigquery", "@tooljet-plugins/clickhouse": "file:packages/clickhouse", From 06262076a5872ed88d36736deb06efa9cfd509ab Mon Sep 17 00:00:00 2001 From: Adish M <44204658+adishM98@users.noreply.github.com> Date: Fri, 4 Aug 2023 18:17:29 +0530 Subject: [PATCH 3/3] Update preview.Dockerfile --- docker/preview.Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/preview.Dockerfile b/docker/preview.Dockerfile index 328d2e9221..d945ad4a88 100644 --- a/docker/preview.Dockerfile +++ b/docker/preview.Dockerfile @@ -42,7 +42,7 @@ RUN apt-get update && apt-get install -y postgresql-client freetds-dev libaio1 w # Install Instantclient Basic Light Oracle and Dependencies WORKDIR /opt/oracle -RUN wget https://download.oracle.com/otn_software/linux/instantclient/instantclient-basiclite-linuxx64.zip && \ +RUN wget https://tooljet-plugins-production.s3.us-east-2.amazonaws.com/marketplace-assets/oracledb/instantclients/instantclient-basiclite-linuxx64.zip && \ wget https://tooljet-plugins-production.s3.us-east-2.amazonaws.com/marketplace-assets/oracledb/instantclients/instantclient-basiclite-linux.x64-11.2.0.4.0.zip && \ unzip instantclient-basiclite-linuxx64.zip && rm -f instantclient-basiclite-linuxx64.zip && \ unzip instantclient-basiclite-linux.x64-11.2.0.4.0.zip && rm -f instantclient-basiclite-linux.x64-11.2.0.4.0.zip && \