diff --git a/packages/nc-gui/components.d.ts b/packages/nc-gui/components.d.ts index dfc7bfcf49..882750efe1 100644 --- a/packages/nc-gui/components.d.ts +++ b/packages/nc-gui/components.d.ts @@ -156,6 +156,7 @@ declare module '@vue/runtime-core' { MdiFileDocumentOutline: typeof import('~icons/mdi/file-document-outline')['default'] MdiFileExcel: typeof import('~icons/mdi/file-excel')['default'] MdiFileEyeOutline: typeof import('~icons/mdi/file-eye-outline')['default'] + MdiFilePdf: typeof import('~icons/mdi/file-pdf')['default'] MdiFilePlusOutline: typeof import('~icons/mdi/file-plus-outline')['default'] MdiFileUploadOutline: typeof import('~icons/mdi/file-upload-outline')['default'] MdiFilterOutline: typeof import('~icons/mdi/filter-outline')['default'] diff --git a/packages/nc-gui/pages/index/index/create-external.vue b/packages/nc-gui/pages/index/index/create-external.vue index e73d5c004b..0c6e1f6093 100644 --- a/packages/nc-gui/pages/index/index/create-external.vue +++ b/packages/nc-gui/pages/index/index/create-external.vue @@ -76,20 +76,20 @@ const validators = computed(() => { 'dataSource.client': [fieldRequiredValidator], ...(formState.dataSource.client === ClientType.SQLITE ? { - 'dataSource.connection.connection.filename': [fieldRequiredValidator], - } + 'dataSource.connection.connection.filename': [fieldRequiredValidator], + } : { - 'dataSource.connection.host': [fieldRequiredValidator], - 'dataSource.connection.port': [fieldRequiredValidator], - 'dataSource.connection.user': [fieldRequiredValidator], - 'dataSource.connection.password': [fieldRequiredValidator], - 'dataSource.connection.database': [fieldRequiredValidator], - ...([ClientType.PG, ClientType.MSSQL].includes(formState.dataSource.client) - ? { - 'dataSource.searchPath.0': [fieldRequiredValidator], - } - : {}), - }), + 'dataSource.connection.host': [fieldRequiredValidator], + 'dataSource.connection.port': [fieldRequiredValidator], + 'dataSource.connection.user': [fieldRequiredValidator], + 'dataSource.connection.password': [fieldRequiredValidator], + 'dataSource.connection.database': [fieldRequiredValidator], + ...([ClientType.PG, ClientType.MSSQL].includes(formState.dataSource.client) + ? { + 'dataSource.searchPath.0': [fieldRequiredValidator], + } + : {}), + }), } }) @@ -112,7 +112,9 @@ const onSSLModeChange = ((mode: SSLUsage) => { delete connection.ssl break case SSLUsage.Allowed: - connection.ssl = 'true' + connection.ssl = { + rejectUnauthorized: false, + } break default: connection.ssl = { @@ -129,7 +131,7 @@ const updateSSLUse = () => { if (formState.dataSource.client !== ClientType.SQLITE) { const connection = formState.dataSource.connection as DefaultConnection if (connection.ssl) { - if (typeof connection.ssl === 'string') { + if (typeof connection.ssl === 'object' && !connection.ssl.rejectUnauthorized) { formState.sslUse = SSLUsage.Allowed } else { formState.sslUse = SSLUsage.Preferred @@ -335,7 +337,8 @@ onMounted(() => {
- +
{ {{ client.text }} + >{{ client.text }} @@ -378,7 +381,8 @@ onMounted(() => { - {{ opt }} + {{ opt }} + @@ -476,14 +482,16 @@ onMounted(() => { - + - +
@@ -497,7 +505,9 @@ onMounted(() => {
-
+
+ +
diff --git a/packages/nc-gui/utils/projectCreateUtils.ts b/packages/nc-gui/utils/projectCreateUtils.ts index ac66ced32d..c5b204d261 100644 --- a/packages/nc-gui/utils/projectCreateUtils.ts +++ b/packages/nc-gui/utils/projectCreateUtils.ts @@ -21,7 +21,7 @@ export interface DefaultConnection { user: string password: string port: number | string - ssl?: Record | 'true' + ssl?: Record | 'true' } export interface SQLiteConnection { diff --git a/packages/nocodb/src/lib/utils/NcConfigFactory.ts b/packages/nocodb/src/lib/utils/NcConfigFactory.ts index 3cfc471ca7..5c736056dc 100644 --- a/packages/nocodb/src/lib/utils/NcConfigFactory.ts +++ b/packages/nocodb/src/lib/utils/NcConfigFactory.ts @@ -1,22 +1,22 @@ -import fs from 'fs'; -import parseDbUrl from 'parse-database-url'; -import { URL } from 'url'; +import fs from 'fs' +import parseDbUrl from 'parse-database-url' +import { URL } from 'url' import { AuthConfig, DbConfig, MailerConfig, NcConfig, -} from '../../interface/config'; -import * as path from 'path'; -import SqlClientFactory from '../db/sql-client/lib/SqlClientFactory'; +} from '../../interface/config' +import * as path from 'path' +import SqlClientFactory from '../db/sql-client/lib/SqlClientFactory' const { uniqueNamesGenerator, starWars, adjectives, animals, -} = require('unique-names-generator'); +} = require('unique-names-generator') const driverClientMapping = { mysql: 'mysql2', @@ -25,7 +25,7 @@ const driverClientMapping = { postgresql: 'pg', sqlite: 'sqlite3', mssql: 'mssql', -}; +} const defaultClientPortMapping = { mysql: 3306, @@ -33,13 +33,13 @@ const defaultClientPortMapping = { postgres: 5432, pg: 5432, mssql: 1433, -}; +} const defaultConnectionConfig: any = { // https://github.com/knex/knex/issues/97 // timezone: process.env.NC_TIMEZONE || 'UTC', dateStrings: true, -}; +} const knownQueryParams = [ { @@ -78,51 +78,51 @@ const knownQueryParams = [ parameter: 'options', aliases: ['opt', 'opts'], }, -]; +] export default class NcConfigFactory implements NcConfig { public static make(): NcConfig { - this.jdbcToXcUrl(); + this.jdbcToXcUrl() - const ncConfig = new NcConfigFactory(); + const ncConfig = new NcConfigFactory() ncConfig.auth = { jwt: { secret: process.env.NC_AUTH_JWT_SECRET, }, - }; + } - ncConfig.port = +(process?.env?.PORT ?? 8080); - ncConfig.env = '_noco'; // process.env?.NODE_ENV || 'dev'; - ncConfig.workingEnv = '_noco'; // process.env?.NODE_ENV || 'dev'; + ncConfig.port = +(process?.env?.PORT ?? 8080) + ncConfig.env = '_noco' // process.env?.NODE_ENV || 'dev'; + ncConfig.workingEnv = '_noco' // process.env?.NODE_ENV || 'dev'; // ncConfig.toolDir = this.getToolDir(); ncConfig.projectType = - ncConfig?.envs?.[ncConfig.workingEnv]?.db?.[0]?.meta?.api?.type || 'rest'; + ncConfig?.envs?.[ncConfig.workingEnv]?.db?.[0]?.meta?.api?.type || 'rest' if (ncConfig.meta?.db?.connection?.filename) { ncConfig.meta.db.connection.filename = path.join( this.getToolDir(), - ncConfig.meta.db.connection.filename - ); + ncConfig.meta.db.connection.filename, + ) } if (process.env.NC_DB) { - ncConfig.meta.db = this.metaUrlToDbConfig(process.env.NC_DB); + ncConfig.meta.db = this.metaUrlToDbConfig(process.env.NC_DB) } else if (process.env.NC_DB_JSON) { - ncConfig.meta.db = JSON.parse(process.env.NC_DB_JSON); + ncConfig.meta.db = JSON.parse(process.env.NC_DB_JSON) } else if (process.env.NC_DB_JSON_FILE) { - const filePath = process.env.NC_DB_JSON_FILE; + const filePath = process.env.NC_DB_JSON_FILE if (!fs.existsSync(filePath)) { - throw new Error(`NC_DB_JSON_FILE not found: ${filePath}`); + throw new Error(`NC_DB_JSON_FILE not found: ${filePath}`) } - const fileContent = fs.readFileSync(filePath, { encoding: 'utf8' }); - ncConfig.meta.db = JSON.parse(fileContent); + const fileContent = fs.readFileSync(filePath, { encoding: 'utf8' }) + ncConfig.meta.db = JSON.parse(fileContent) } if (process.env.NC_TRY) { - ncConfig.try = true; + ncConfig.try = true ncConfig.meta.db = { client: 'sqlite3', connection: ':memory:', @@ -132,54 +132,54 @@ export default class NcConfigFactory implements NcConfig { // disposeTimeout: 360000*1000, idleTimeoutMillis: 360000 * 1000, }, - } as any; + } as any } if (process.env.NC_PUBLIC_URL) { - ncConfig.envs['_noco'].publicUrl = process.env.NC_PUBLIC_URL; + ncConfig.envs['_noco'].publicUrl = process.env.NC_PUBLIC_URL // ncConfig.envs[process.env.NODE_ENV || 'dev'].publicUrl = process.env.NC_PUBLIC_URL; - ncConfig.publicUrl = process.env.NC_PUBLIC_URL; + ncConfig.publicUrl = process.env.NC_PUBLIC_URL } if (process.env.NC_DASHBOARD_URL) { - ncConfig.dashboardPath = process.env.NC_DASHBOARD_URL; + ncConfig.dashboardPath = process.env.NC_DASHBOARD_URL } - return ncConfig; + return ncConfig } public static getToolDir() { - return process.env.NC_TOOL_DIR || process.cwd(); + return process.env.NC_TOOL_DIR || process.cwd() } public static hasDbUrl(): boolean { return Object.keys(process.env).some((envKey) => - envKey.startsWith('NC_DB_URL') - ); + envKey.startsWith('NC_DB_URL'), + ) } public static makeFromUrls(urls: string[]): NcConfig { - const config = new NcConfigFactory(); + const config = new NcConfigFactory() // config.envs[process.env.NODE_ENV || 'dev'].db = []; - config.envs['_noco'].db = []; + config.envs['_noco'].db = [] for (const [i, url] of Object.entries(urls)) { // config.envs[process.env.NODE_ENV || 'dev'].db.push(this.urlToDbConfig(url, i)); - config.envs['_noco'].db.push(this.urlToDbConfig(url, i)); + config.envs['_noco'].db.push(this.urlToDbConfig(url, i)) } - return config; + return config } public static urlToDbConfig( urlString: string, key = '', config?: NcConfigFactory, - type?: string + type?: string, ): DbConfig { - const url = new URL(urlString); + const url = new URL(urlString) - let dbConfig: DbConfig; + let dbConfig: DbConfig if (url.protocol.startsWith('sqlite3')) { dbConfig = { @@ -194,17 +194,17 @@ export default class NcConfigFactory implements NcConfig { url.searchParams.get('d') || url.searchParams.get('database'), useNullAsDefault: true, }, - } as any; + } as any } else { - const parsedQuery = {}; + const parsedQuery = {} for (const [key, value] of url.searchParams.entries()) { const fnd = knownQueryParams.find( - (param) => param.parameter === key || param.aliases.includes(key) - ); + (param) => param.parameter === key || param.aliases.includes(key), + ) if (fnd) { - parsedQuery[fnd.parameter] = value; + parsedQuery[fnd.parameter] = value } else { - parsedQuery[key] = value; + parsedQuery[key] = value } } @@ -220,10 +220,10 @@ export default class NcConfigFactory implements NcConfig { // max: 1 // }, acquireConnectionTimeout: 600000, - } as any; + } as any if (process.env.NODE_TLS_REJECT_UNAUTHORIZED) { - dbConfig.connection.ssl = true; + dbConfig.connection.ssl = true } if ( @@ -235,7 +235,7 @@ export default class NcConfigFactory implements NcConfig { keyFilePath: url.searchParams.get('keyFilePath'), certFilePath: url.searchParams.get('certFilePath'), caFilePath: url.searchParams.get('caFilePath'), - }; + } } } @@ -243,7 +243,7 @@ export default class NcConfigFactory implements NcConfig { config.title = url.searchParams.get('t') || url.searchParams.get('title') || - this.generateRandomTitle(); + this.generateRandomTitle() } Object.assign(dbConfig, { @@ -268,28 +268,28 @@ export default class NcConfigFactory implements NcConfig { name: 'nc_evolutions', }, }, - }); + }) - return dbConfig; + return dbConfig } private static generateRandomTitle(): string { return uniqueNamesGenerator({ dictionaries: [[starWars], [adjectives, animals]][ Math.floor(Math.random() * 2) - ], + ], }) .toLowerCase() - .replace(/[ -]/g, '_'); + .replace(/[ -]/g, '_') } static metaUrlToDbConfig(urlString) { - const url = new URL(urlString); + const url = new URL(urlString) - let dbConfig; + let dbConfig if (url.protocol.startsWith('sqlite3')) { - const db = url.searchParams.get('d') || url.searchParams.get('database'); + const db = url.searchParams.get('d') || url.searchParams.get('database') dbConfig = { client: 'sqlite3', connection: { @@ -297,25 +297,25 @@ export default class NcConfigFactory implements NcConfig { }, ...(db === ':memory:' ? { - pool: { - min: 1, - max: 1, - // disposeTimeout: 360000*1000, - idleTimeoutMillis: 360000 * 1000, - }, - } + pool: { + min: 1, + max: 1, + // disposeTimeout: 360000*1000, + idleTimeoutMillis: 360000 * 1000, + }, + } : {}), - }; + } } else { - const parsedQuery = {}; + const parsedQuery = {} for (const [key, value] of url.searchParams.entries()) { const fnd = knownQueryParams.find( - (param) => param.parameter === key || param.aliases.includes(key) - ); + (param) => param.parameter === key || param.aliases.includes(key), + ) if (fnd) { - parsedQuery[fnd.parameter] = value; + parsedQuery[fnd.parameter] = value } else { - parsedQuery[key] = value; + parsedQuery[key] = value } } @@ -329,22 +329,22 @@ export default class NcConfigFactory implements NcConfig { acquireConnectionTimeout: 600000, ...(url.searchParams.has('search_path') ? { - searchPath: url.searchParams.get('search_path').split(','), - } + searchPath: url.searchParams.get('search_path').split(','), + } : {}), - }; + } if (process.env.NODE_TLS_REJECT_UNAUTHORIZED) { - dbConfig.connection.ssl = true; + dbConfig.connection.ssl = true } } url.searchParams.forEach((_value, key) => { - let value: any = _value; + let value: any = _value if (value === 'true') { - value = true; + value = true } else if (value === 'false') { - value = false; + value = false } else if (/^\d+$/.test(value)) { - value = +value; + value = +value } // todo: implement config read from JSON file or JSON env val read if ( @@ -359,10 +359,10 @@ export default class NcConfigFactory implements NcConfig { ].includes(key) ) { key.split('.').reduce((obj, k, i, arr) => { - return (obj[k] = i === arr.length - 1 ? value : obj[k] || {}); - }, dbConfig); + return (obj[k] = i === arr.length - 1 ? value : obj[k] || {}) + }, dbConfig) } - }); + }) if ( dbConfig?.connection?.ssl && @@ -371,12 +371,12 @@ export default class NcConfigFactory implements NcConfig { if (dbConfig.connection.ssl.caFilePath && !dbConfig.connection.ssl.ca) { dbConfig.connection.ssl.ca = fs .readFileSync(dbConfig.connection.ssl.caFilePath) - .toString(); + .toString() } if (dbConfig.connection.ssl.keyFilePath && !dbConfig.connection.ssl.key) { dbConfig.connection.ssl.key = fs .readFileSync(dbConfig.connection.ssl.keyFilePath) - .toString(); + .toString() } if ( dbConfig.connection.ssl.certFilePath && @@ -384,29 +384,32 @@ export default class NcConfigFactory implements NcConfig { ) { dbConfig.connection.ssl.cert = fs .readFileSync(dbConfig.connection.ssl.certFilePath) - .toString(); + .toString() + } + if (dbConfig?.connection?.ssl === 'rejectUnauthorized') { + dbConfig.connection.ssl = { rejectUnauthorized: false } } } - return dbConfig; + return dbConfig } public static makeProjectConfigFromUrl(url, type?: string): NcConfig { - const config = new NcConfigFactory(); - const dbConfig = this.urlToDbConfig(url, '', config, type); + const config = new NcConfigFactory() + const dbConfig = this.urlToDbConfig(url, '', config, type) // config.envs[process.env.NODE_ENV || 'dev'].db.push(dbConfig); - config.envs['_noco'].db.push(dbConfig); + config.envs['_noco'].db.push(dbConfig) if (process.env.NC_AUTH_ADMIN_SECRET) { config.auth = { masterKey: { secret: process.env.NC_AUTH_ADMIN_SECRET, }, - }; + } } else if (process.env.NC_NO_AUTH) { config.auth = { disabled: true, - }; + } // } else if (config?.envs?.[process.env.NODE_ENV || 'dev']?.db?.[0]) { } else if (config?.envs?.['_noco']?.db?.[0]) { config.auth = { @@ -417,15 +420,15 @@ export default class NcConfigFactory implements NcConfig { config.envs['_noco'].db[0].meta.dbAlias, secret: process.env.NC_AUTH_JWT_SECRET, }, - }; + } } if (process.env.NC_DB) { - config.meta.db = this.metaUrlToDbConfig(process.env.NC_DB); + config.meta.db = this.metaUrlToDbConfig(process.env.NC_DB) } if (process.env.NC_TRY) { - config.try = true; + config.try = true config.meta.db = { client: 'sqlite3', connection: ':memory:', @@ -435,7 +438,7 @@ export default class NcConfigFactory implements NcConfig { // disposeTimeout: 360000*1000, idleTimeoutMillis: 360000 * 1000, }, - } as any; + } as any } if (process.env.NC_MAILER) { @@ -450,35 +453,35 @@ export default class NcConfigFactory implements NcConfig { pass: process.env.NC_MAILER_PASS, }, }, - }; + } } if (process.env.NC_PUBLIC_URL) { // config.envs[process.env.NODE_ENV || 'dev'].publicUrl = process.env.NC_PUBLIC_URL; - config.envs['_noco'].publicUrl = process.env.NC_PUBLIC_URL; - config.publicUrl = process.env.NC_PUBLIC_URL; + config.envs['_noco'].publicUrl = process.env.NC_PUBLIC_URL + config.publicUrl = process.env.NC_PUBLIC_URL } - config.port = +(process?.env?.PORT ?? 8080); + config.port = +(process?.env?.PORT ?? 8080) // config.env = process.env?.NODE_ENV || 'dev'; // config.workingEnv = process.env?.NODE_ENV || 'dev'; - config.env = '_noco'; - config.workingEnv = '_noco'; - config.toolDir = this.getToolDir(); + config.env = '_noco' + config.workingEnv = '_noco' + config.toolDir = this.getToolDir() config.projectType = type || config?.envs?.[config.workingEnv]?.db?.[0]?.meta?.api?.type || - 'rest'; + 'rest' - return config; + return config } public static makeProjectConfigFromConnection( dbConnectionConfig: any, - type?: string + type?: string, ): NcConfig { - const config = new NcConfigFactory(); - let dbConfig = dbConnectionConfig; + const config = new NcConfigFactory() + let dbConfig = dbConnectionConfig if (dbConfig.client === 'sqlite3') { dbConfig = { @@ -488,11 +491,11 @@ export default class NcConfigFactory implements NcConfig { database: dbConnectionConfig.connection.filename, useNullAsDefault: true, }, - }; + } } // todo: - const key = ''; + const key = '' Object.assign(dbConfig, { meta: { tn: 'nc_evolutions', @@ -508,21 +511,21 @@ export default class NcConfigFactory implements NcConfig { name: 'nc_evolutions', }, }, - }); + }) // config.envs[process.env.NODE_ENV || 'dev'].db.push(dbConfig); - config.envs['_noco'].db.push(dbConfig); + config.envs['_noco'].db.push(dbConfig) if (process.env.NC_AUTH_ADMIN_SECRET) { config.auth = { masterKey: { secret: process.env.NC_AUTH_ADMIN_SECRET, }, - }; + } } else if (process.env.NC_NO_AUTH) { config.auth = { disabled: true, - }; + } // } else if (config?.envs?.[process.env.NODE_ENV || 'dev']?.db?.[0]) { } else if (config?.envs?.['_noco']?.db?.[0]) { config.auth = { @@ -533,15 +536,15 @@ export default class NcConfigFactory implements NcConfig { config.envs['_noco'].db[0].meta.dbAlias, secret: process.env.NC_AUTH_JWT_SECRET, }, - }; + } } if (process.env.NC_DB) { - config.meta.db = this.metaUrlToDbConfig(process.env.NC_DB); + config.meta.db = this.metaUrlToDbConfig(process.env.NC_DB) } if (process.env.NC_TRY) { - config.try = true; + config.try = true config.meta.db = { client: 'sqlite3', connection: ':memory:', @@ -551,27 +554,27 @@ export default class NcConfigFactory implements NcConfig { // disposeTimeout: 360000*1000, idleTimeoutMillis: 360000 * 1000, }, - } as any; + } as any } if (process.env.NC_PUBLIC_URL) { // config.envs[process.env.NODE_ENV || 'dev'].publicUrl = process.env.NC_PUBLIC_URL; - config.envs['_noco'].publicUrl = process.env.NC_PUBLIC_URL; - config.publicUrl = process.env.NC_PUBLIC_URL; + config.envs['_noco'].publicUrl = process.env.NC_PUBLIC_URL + config.publicUrl = process.env.NC_PUBLIC_URL } - config.port = +(process?.env?.PORT ?? 8080); + config.port = +(process?.env?.PORT ?? 8080) // config.env = process.env?.NODE_ENV || 'dev'; // config.workingEnv = process.env?.NODE_ENV || 'dev'; - config.env = '_noco'; - config.workingEnv = '_noco'; - config.toolDir = process.env.NC_TOOL_DIR || process.cwd(); + config.env = '_noco' + config.workingEnv = '_noco' + config.toolDir = process.env.NC_TOOL_DIR || process.cwd() config.projectType = type || config?.envs?.[config.workingEnv]?.db?.[0]?.meta?.api?.type || - 'rest'; + 'rest' - return config; + return config } public static async metaDbCreateIfNotExist(args: NcConfig) { @@ -579,14 +582,14 @@ export default class NcConfigFactory implements NcConfig { const metaSqlClient = SqlClientFactory.create({ ...args.meta.db, connection: args.meta.db, - }); + }) await metaSqlClient.createDatabaseIfNotExists({ database: args.meta.db?.connection?.filename, - }); + }) } else { - const metaSqlClient = SqlClientFactory.create(args.meta.db); - await metaSqlClient.createDatabaseIfNotExists(args.meta.db?.connection); - await metaSqlClient.knex.destroy(); + const metaSqlClient = SqlClientFactory.create(args.meta.db) + await metaSqlClient.createDatabaseIfNotExists(args.meta.db?.connection) + await metaSqlClient.knex.destroy() } /* const dbPath = path.join(args.toolDir, 'xc.db') @@ -597,21 +600,21 @@ export default class NcConfigFactory implements NcConfig { }*/ } - public version = '0.6'; - public port: number; - public auth?: AuthConfig; - public env: 'production' | 'dev' | 'test' | string; - public workingEnv: string; - public toolDir: string; + public version = '0.6' + public port: number + public auth?: AuthConfig + public env: 'production' | 'dev' | 'test' | string + public workingEnv: string + public toolDir: string public envs: { [p: string]: { db: DbConfig[]; api?: any; publicUrl?: string }; - }; + } // public projectType: "rest" | "graphql" | "grpc"; - public queriesFolder: string | string[] = ''; - public seedsFolder: string | string[]; - public title: string; - public publicUrl: string; - public projectType; + public queriesFolder: string | string[] = '' + public seedsFolder: string | string[] + public title: string + public publicUrl: string + public projectType public meta = { db: { client: 'sqlite3', @@ -619,37 +622,38 @@ export default class NcConfigFactory implements NcConfig { filename: 'noco.db', }, }, - }; - public mailer: MailerConfig; - public try = false; + } + public mailer: MailerConfig + public try = false - public dashboardPath = '/dashboard'; + public dashboardPath = '/dashboard' constructor() { - this.envs = { _noco: { db: [] } }; + this.envs = { _noco: { db: [] } } } public static jdbcToXcUrl() { if (process.env.NC_DATABASE_URL_FILE || process.env.DATABASE_URL_FILE) { const database_url = fs.readFileSync( process.env.NC_DATABASE_URL_FILE || process.env.DATABASE_URL_FILE, - 'utf-8' - ); - process.env.NC_DB = this.extractXcUrlFromJdbc(database_url); + 'utf-8', + ) + process.env.NC_DB = this.extractXcUrlFromJdbc(database_url) } else if (process.env.NC_DATABASE_URL || process.env.DATABASE_URL) { process.env.NC_DB = this.extractXcUrlFromJdbc( - process.env.NC_DATABASE_URL || process.env.DATABASE_URL - ); + process.env.NC_DATABASE_URL || process.env.DATABASE_URL, + ) } } public static extractXcUrlFromJdbc(url: string, rtConfig = false) { // drop the jdbc prefix if (url.startsWith('jdbc:')) { - url = url.substring(5); + url = url.substring(5) } + const extraParams = [] - const config = parseDbUrl(url); + const config = parseDbUrl(url) const parsedConfig: { driver?: string; @@ -658,69 +662,72 @@ export default class NcConfigFactory implements NcConfig { database?: string; user?: string; password?: string; - ssl?: string; - } = {}; + ssl?: string | Record; + } = {} for (const [key, value] of Object.entries(config)) { const fnd = knownQueryParams.find( - (param) => param.parameter === key || param.aliases.includes(key) - ); + (param) => param.parameter === key || param.aliases.includes(key), + ) if (fnd) { - parsedConfig[fnd.parameter] = value; + parsedConfig[fnd.parameter] = value } else { - parsedConfig[key] = value; + parsedConfig[key] = value } } if (!parsedConfig?.port) parsedConfig.port = defaultClientPortMapping[ - driverClientMapping[parsedConfig.driver] || parsedConfig.driver - ]; + driverClientMapping[parsedConfig.driver] || parsedConfig.driver + ] - if (rtConfig) { - const { driver, ...connectionConfig } = parsedConfig; + const { driver, ...connectionConfig } = parsedConfig - const client = driverClientMapping[driver] || driver; + const client = driverClientMapping[driver] || driver - const avoidSSL = [ - 'localhost', - '127.0.0.1', - 'host.docker.internal', - '172.17.0.1', - ]; + const avoidSSL = [ + 'localhost', + '127.0.0.1', + 'host.docker.internal', + '172.17.0.1', + ] - if ( - client === 'pg' && - !connectionConfig?.ssl && - !avoidSSL.includes(connectionConfig.host) - ) { - connectionConfig.ssl = 'true'; + if ( + client === 'pg' && + !connectionConfig?.ssl && + !avoidSSL.includes(connectionConfig.host) + ) { + connectionConfig.ssl = { + rejectUnauthorized: false, } + parsedConfig['connection.ssl'] = 'rejectUnauthorized' + } + if (rtConfig) { return { client: client, connection: { ...connectionConfig, }, - } as any; + } as any } - const { driver, host, port, database, user, password, ...extra } = - parsedConfig; - const extraParams = []; + const { host, port, database, user, password, ...extra } = + parsedConfig + for (const [key, value] of Object.entries(extra)) { - extraParams.push(`${key}=${value}`); + extraParams.push(`${key}=${value}`) } const res = `${driverClientMapping[driver] || driver}://${host}${ port ? `:${port}` : '' }?${user ? `u=${user}&` : ''}${password ? `p=${password}&` : ''}${ database ? `d=${database}&` : '' - }${extraParams.join('&')}`; + }${extraParams.join('&')}` - return res; + return res } // public static initOneClickDeployment() { @@ -731,7 +738,7 @@ export default class NcConfigFactory implements NcConfig { // } } -export { defaultConnectionConfig }; +export { defaultConnectionConfig } /** * @copyright Copyright (c) 2021, Xgene Cloud Ltd