diff --git a/integration-tests/__tests__/deploy-database.spec.js b/integration-tests/__tests__/deploy-database.spec.js index 809794aae..438f7d554 100644 --- a/integration-tests/__tests__/deploy-database.spec.js +++ b/integration-tests/__tests__/deploy-database.spec.js @@ -6,7 +6,7 @@ const engines = require('../engines'); const deployDb = require('dbgate-api/src/shell/deployDb'); const { databaseInfoFromYamlModel, runQueryOnDriver, formatQueryWithoutParams } = require('dbgate-tools'); const generateDeploySql = require('dbgate-api/src/shell/generateDeploySql'); -const connectUtility = require('dbgate-api/src/utility/connectUtility'); +const { connectUtility } = require('dbgate-api/src/utility/connectUtility'); function checkStructure( engine, diff --git a/package.json b/package.json index 6d51118d2..bcfba9c20 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "start:api:dblogin": "yarn workspace dbgate-api start:dblogin | pino-pretty", "start:api:storage": "yarn workspace dbgate-api start:storage | pino-pretty", "start:api:storage:built": "yarn workspace dbgate-api start:storage:built | pino-pretty", + "start:api:azure": "yarn workspace dbgate-api start:azure | pino-pretty", "sync:pro": "cd sync && yarn start", "start:web": "yarn workspace dbgate-web dev", "start:sqltree": "yarn workspace dbgate-sqltree start", diff --git a/packages/api/package.json b/packages/api/package.json index 897a809a3..8a4523b2f 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -74,6 +74,7 @@ "start:storage": "env-cmd -f env/storage/.env node src/index.js --listen-api", "start:storage:built": "env-cmd -f env/storage/.env cross-env DEVMODE= BUILTWEBMODE=1 node dist/bundle.js --listen-api", "start:singleconn": "env-cmd node src/index.js --server localhost --user root --port 3307 --engine mysql@dbgate-plugin-mysql --password test --listen-api", + "start:azure": "env-cmd -f env/azure/.env node src/index.js --listen-api", "ts": "tsc", "build": "webpack", "build:doc": "jsdoc2md --template doctpl.hbs ./src/shell/* > ../../../dbgate.github.io/_docs/apidoc.md" diff --git a/packages/api/src/proc/connectProcess.js b/packages/api/src/proc/connectProcess.js index eec20597e..39560e6bf 100644 --- a/packages/api/src/proc/connectProcess.js +++ b/packages/api/src/proc/connectProcess.js @@ -1,6 +1,6 @@ const childProcessChecker = require('../utility/childProcessChecker'); const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const { handleProcessCommunication } = require('../utility/processComm'); const { pickSafeConnectionInfo } = require('../utility/crypting'); const _ = require('lodash'); diff --git a/packages/api/src/proc/databaseConnectionProcess.js b/packages/api/src/proc/databaseConnectionProcess.js index 448b9286d..c691aaf59 100644 --- a/packages/api/src/proc/databaseConnectionProcess.js +++ b/packages/api/src/proc/databaseConnectionProcess.js @@ -11,7 +11,7 @@ const { extractErrorLogData, } = require('dbgate-tools'); const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const { handleProcessCommunication } = require('../utility/processComm'); const { SqlGenerator } = require('dbgate-tools'); const generateDeploySql = require('../shell/generateDeploySql'); diff --git a/packages/api/src/proc/serverConnectionProcess.js b/packages/api/src/proc/serverConnectionProcess.js index 327c4f44f..0e41dbfeb 100644 --- a/packages/api/src/proc/serverConnectionProcess.js +++ b/packages/api/src/proc/serverConnectionProcess.js @@ -2,7 +2,7 @@ const stableStringify = require('json-stable-stringify'); const { extractBoolSettingsValue, extractIntSettingsValue, getLogger, extractErrorLogData } = require('dbgate-tools'); const childProcessChecker = require('../utility/childProcessChecker'); const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const { handleProcessCommunication } = require('../utility/processComm'); const logger = getLogger('srvconnProcess'); diff --git a/packages/api/src/proc/sessionProcess.js b/packages/api/src/proc/sessionProcess.js index 04997c43b..176c24dbe 100644 --- a/packages/api/src/proc/sessionProcess.js +++ b/packages/api/src/proc/sessionProcess.js @@ -8,7 +8,7 @@ const { splitQuery } = require('dbgate-query-splitter'); const { jsldir } = require('../utility/directories'); const requireEngineDriver = require('../utility/requireEngineDriver'); const { decryptConnection } = require('../utility/crypting'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const { handleProcessCommunication } = require('../utility/processComm'); const { getLogger, extractIntSettingsValue, extractBoolSettingsValue } = require('dbgate-tools'); diff --git a/packages/api/src/shell/dataDuplicator.js b/packages/api/src/shell/dataDuplicator.js index f47c5c7a7..750563ff3 100644 --- a/packages/api/src/shell/dataDuplicator.js +++ b/packages/api/src/shell/dataDuplicator.js @@ -2,7 +2,7 @@ const stream = require('stream'); const path = require('path'); const { quoteFullName, fullNameToString, getLogger } = require('dbgate-tools'); const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const logger = getLogger('dataDuplicator'); const { DataDuplicator } = require('dbgate-datalib'); const copyStream = require('./copyStream'); diff --git a/packages/api/src/shell/deployDb.js b/packages/api/src/shell/deployDb.js index 331613240..abbcc4160 100644 --- a/packages/api/src/shell/deployDb.js +++ b/packages/api/src/shell/deployDb.js @@ -1,7 +1,7 @@ const generateDeploySql = require('./generateDeploySql'); const executeQuery = require('./executeQuery'); const { ScriptDrivedDeployer } = require('dbgate-datalib'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const requireEngineDriver = require('../utility/requireEngineDriver'); const loadModelFolder = require('../utility/loadModelFolder'); const crypto = require('crypto'); diff --git a/packages/api/src/shell/dropAllDbObjects.js b/packages/api/src/shell/dropAllDbObjects.js index e6bed8376..4ba806052 100644 --- a/packages/api/src/shell/dropAllDbObjects.js +++ b/packages/api/src/shell/dropAllDbObjects.js @@ -1,6 +1,6 @@ const executeQuery = require('./executeQuery'); const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const { getLogger, extendDatabaseInfo } = require('dbgate-tools'); const logger = getLogger('dropAllDbObjects'); diff --git a/packages/api/src/shell/dumpDatabase.js b/packages/api/src/shell/dumpDatabase.js index 20465c444..45644e038 100644 --- a/packages/api/src/shell/dumpDatabase.js +++ b/packages/api/src/shell/dumpDatabase.js @@ -1,5 +1,5 @@ const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const { getLogger } = require('dbgate-tools'); const logger = getLogger('dumpDb'); diff --git a/packages/api/src/shell/executeQuery.js b/packages/api/src/shell/executeQuery.js index a08660144..0adcf3700 100644 --- a/packages/api/src/shell/executeQuery.js +++ b/packages/api/src/shell/executeQuery.js @@ -1,6 +1,6 @@ const fs = require('fs-extra'); const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const { getLogger, getLimitedQuery } = require('dbgate-tools'); const logger = getLogger('execQuery'); diff --git a/packages/api/src/shell/generateDeploySql.js b/packages/api/src/shell/generateDeploySql.js index 0edc0dc3f..dad7a9e0d 100644 --- a/packages/api/src/shell/generateDeploySql.js +++ b/packages/api/src/shell/generateDeploySql.js @@ -13,7 +13,7 @@ const { } = require('dbgate-tools'); const importDbModel = require('../utility/importDbModel'); const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); /** * Generates query for deploying model into database diff --git a/packages/api/src/shell/importDatabase.js b/packages/api/src/shell/importDatabase.js index 56bded426..a10cb4632 100644 --- a/packages/api/src/shell/importDatabase.js +++ b/packages/api/src/shell/importDatabase.js @@ -1,6 +1,6 @@ const fs = require('fs'); const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const { splitQueryStream } = require('dbgate-query-splitter/lib/splitQueryStream'); const download = require('./download'); const stream = require('stream'); diff --git a/packages/api/src/shell/loadDatabase.js b/packages/api/src/shell/loadDatabase.js index d19adee2e..d657e61aa 100644 --- a/packages/api/src/shell/loadDatabase.js +++ b/packages/api/src/shell/loadDatabase.js @@ -1,5 +1,5 @@ const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const { getLogger } = require('dbgate-tools'); const exportDbModel = require('../utility/exportDbModel'); diff --git a/packages/api/src/shell/queryReader.js b/packages/api/src/shell/queryReader.js index 9d8df321c..dd76a296c 100644 --- a/packages/api/src/shell/queryReader.js +++ b/packages/api/src/shell/queryReader.js @@ -1,5 +1,5 @@ const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const { getLogger } = require('dbgate-tools'); const logger = getLogger('queryReader'); diff --git a/packages/api/src/shell/tableReader.js b/packages/api/src/shell/tableReader.js index 5c42418c9..6ec0d1fb8 100644 --- a/packages/api/src/shell/tableReader.js +++ b/packages/api/src/shell/tableReader.js @@ -1,6 +1,6 @@ const { quoteFullName, fullNameToString, getLogger } = require('dbgate-tools'); const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const logger = getLogger('tableReader'); /** diff --git a/packages/api/src/shell/tableWriter.js b/packages/api/src/shell/tableWriter.js index 80fe5ad4c..727bc6d4a 100644 --- a/packages/api/src/shell/tableWriter.js +++ b/packages/api/src/shell/tableWriter.js @@ -1,6 +1,6 @@ const { fullNameToString, getLogger } = require('dbgate-tools'); const requireEngineDriver = require('../utility/requireEngineDriver'); -const connectUtility = require('../utility/connectUtility'); +const { connectUtility } = require('../utility/connectUtility'); const logger = getLogger('tableWriter'); /** diff --git a/packages/api/src/utility/connectUtility.js b/packages/api/src/utility/connectUtility.js index 45d3f5a42..757df2a6e 100644 --- a/packages/api/src/utility/connectUtility.js +++ b/packages/api/src/utility/connectUtility.js @@ -47,6 +47,47 @@ async function loadConnection(driver, storedConnection, connectionMode) { return storedConnection; } +async function extractConnectionSslParams(connection) { + /** @type {any} */ + let ssl = undefined; + if (connection.useSsl) { + ssl = {}; + + if (connection.sslCaFile) { + ssl.ca = await fs.readFile(connection.sslCaFile); + ssl.sslCaFile = connection.sslCaFile; + } + + if (connection.sslCertFile) { + ssl.cert = await fs.readFile(connection.sslCertFile); + ssl.sslCertFile = connection.sslCertFile; + } + + if (connection.sslKeyFile) { + ssl.key = await fs.readFile(connection.sslKeyFile); + ssl.sslKeyFile = connection.sslKeyFile; + } + + if (connection.sslCertFilePassword) { + ssl.password = connection.sslCertFilePassword; + } + + if (!ssl.key && !ssl.ca && !ssl.cert) { + // TODO: provide this as an option in settings + // or per-connection as 'reject self-signed certs' + // How it works: + // if false, cert can be self-signed + // if true, has to be from a public CA + // Heroku certs are self-signed. + // if you provide ca/cert/key files, it overrides this + ssl.rejectUnauthorized = false; + } else { + ssl.rejectUnauthorized = connection.sslRejectUnauthorized; + } + } + return ssl; +} + async function connectUtility(driver, storedConnection, connectionMode, additionalOptions = null) { const connectionLoaded = await loadConnection(driver, storedConnection, connectionMode); @@ -67,45 +108,13 @@ async function connectUtility(driver, storedConnection, connectionMode, addition connection.port = tunnel.localPort; } - // SSL functionality - copied from https://github.com/beekeeper-studio/beekeeper-studio - if (connection.useSsl) { - connection.ssl = {}; - - if (connection.sslCaFile) { - connection.ssl.ca = await fs.readFile(connection.sslCaFile); - connection.ssl.sslCaFile = connection.sslCaFile; - } - - if (connection.sslCertFile) { - connection.ssl.cert = await fs.readFile(connection.sslCertFile); - connection.ssl.sslCertFile = connection.sslCertFile; - } - - if (connection.sslKeyFile) { - connection.ssl.key = await fs.readFile(connection.sslKeyFile); - connection.ssl.sslKeyFile = connection.sslKeyFile; - } - - if (connection.sslCertFilePassword) { - connection.ssl.password = connection.sslCertFilePassword; - } - - if (!connection.ssl.key && !connection.ssl.ca && !connection.ssl.cert) { - // TODO: provide this as an option in settings - // or per-connection as 'reject self-signed certs' - // How it works: - // if false, cert can be self-signed - // if true, has to be from a public CA - // Heroku certs are self-signed. - // if you provide ca/cert/key files, it overrides this - connection.ssl.rejectUnauthorized = false; - } else { - connection.ssl.rejectUnauthorized = connection.sslRejectUnauthorized; - } - } + connection.ssl = await extractConnectionSslParams(connection); const conn = await driver.connect({ ...connection, ...additionalOptions }); return conn; } -module.exports = connectUtility; +module.exports = { + extractConnectionSslParams, + connectUtility, +};