/
opt
/
canhelp
/
node_modules
/
pg-connection-string
/
/opt/canhelp/node_modules/pg-connection-string
mkdir
upload
Name
Size
Mode
Actions
esm/
-
0755
rm
index.d.ts
911
0644
edit
dl
rm
index.js
7157
0644
edit
dl
rm
LICENSE
1082
0644
edit
dl
rm
package.json
1376
0644
edit
dl
rm
README.md
4933
0644
edit
dl
rm
Edit:
/opt/canhelp/node_modules/pg-connection-string/index.js
(7157B)
'use strict' //Parse method copied from https://github.com/brianc/node-postgres //Copyright (c) 2010-2014 Brian Carlson (brian.m.carlson@gmail.com) //MIT License //parses a connection string function parse(str, options = {}) { //unix socket if (str.charAt(0) === '/') { const config = str.split(' ') return { host: config[0], database: config[1] } } // Check for empty host in URL const config = {} let result let dummyHost = false if (/ |%[^a-f0-9]|%[a-f0-9][^a-f0-9]/i.test(str)) { // Ensure spaces are encoded as %20 str = encodeURI(str).replace(/%25(\d\d)/g, '%$1') } try { try { result = new URL(str, 'postgres://base') } catch (e) { // The URL is invalid so try again with a dummy host result = new URL(str.replace('@/', '@___DUMMY___/'), 'postgres://base') dummyHost = true } } catch (err) { // Remove the input from the error message to avoid leaking sensitive information err.input && (err.input = '*****REDACTED*****') throw err } // We'd like to use Object.fromEntries() here but Node.js 10 does not support it for (const entry of result.searchParams.entries()) { config[entry[0]] = entry[1] } config.user = config.user || decodeURIComponent(result.username) config.password = config.password || decodeURIComponent(result.password) if (result.protocol == 'socket:') { config.host = decodeURI(result.pathname) config.database = result.searchParams.get('db') config.client_encoding = result.searchParams.get('encoding') return config } const hostname = dummyHost ? '' : result.hostname if (!config.host) { // Only set the host if there is no equivalent query param. config.host = decodeURIComponent(hostname) } else if (hostname && /^%2f/i.test(hostname)) { // Only prepend the hostname to the pathname if it is not a URL encoded Unix socket host. result.pathname = hostname + result.pathname } if (!config.port) { // Only set the port if there is no equivalent query param. config.port = result.port } const pathname = result.pathname.slice(1) || null config.database = pathname ? decodeURI(pathname) : null if (config.ssl === 'true' || config.ssl === '1') { config.ssl = true } if (config.ssl === '0') { config.ssl = false } if (config.sslcert || config.sslkey || config.sslrootcert || config.sslmode) { config.ssl = {} } // Only try to load fs if we expect to read from the disk const fs = config.sslcert || config.sslkey || config.sslrootcert ? require('fs') : null if (config.sslcert) { config.ssl.cert = fs.readFileSync(config.sslcert).toString() } if (config.sslkey) { config.ssl.key = fs.readFileSync(config.sslkey).toString() } if (config.sslrootcert) { config.ssl.ca = fs.readFileSync(config.sslrootcert).toString() } if (options.useLibpqCompat && config.uselibpqcompat) { throw new Error('Both useLibpqCompat and uselibpqcompat are set. Please use only one of them.') } if (config.uselibpqcompat === 'true' || options.useLibpqCompat) { switch (config.sslmode) { case 'disable': { config.ssl = false break } case 'prefer': { config.ssl.rejectUnauthorized = false break } case 'require': { if (config.sslrootcert) { // If a root CA is specified, behavior of `sslmode=require` will be the same as that of `verify-ca` config.ssl.checkServerIdentity = function () {} } else { config.ssl.rejectUnauthorized = false } break } case 'verify-ca': { if (!config.ssl.ca) { throw new Error( 'SECURITY WARNING: Using sslmode=verify-ca requires specifying a CA with sslrootcert. If a public CA is used, verify-ca allows connections to a server that somebody else may have registered with the CA, making you vulnerable to Man-in-the-Middle attacks. Either specify a custom CA certificate with sslrootcert parameter or use sslmode=verify-full for proper security.' ) } config.ssl.checkServerIdentity = function () {} break } case 'verify-full': { break } } } else { switch (config.sslmode) { case 'disable': { config.ssl = false break } case 'prefer': case 'require': case 'verify-ca': case 'verify-full': { if (config.sslmode !== 'verify-full') { deprecatedSslModeWarning(config.sslmode) } break } case 'no-verify': { config.ssl.rejectUnauthorized = false break } } } return config } // convert pg-connection-string ssl config to a ClientConfig.ConnectionOptions function toConnectionOptions(sslConfig) { const connectionOptions = Object.entries(sslConfig).reduce((c, [key, value]) => { // we explicitly check for undefined and null instead of `if (value)` because some // options accept falsy values. Example: `ssl.rejectUnauthorized = false` if (value !== undefined && value !== null) { c[key] = value } return c }, {}) return connectionOptions } // convert pg-connection-string config to a ClientConfig function toClientConfig(config) { const poolConfig = Object.entries(config).reduce((c, [key, value]) => { if (key === 'ssl') { const sslConfig = value if (typeof sslConfig === 'boolean') { c[key] = sslConfig } if (typeof sslConfig === 'object') { c[key] = toConnectionOptions(sslConfig) } } else if (value !== undefined && value !== null) { if (key === 'port') { // when port is not specified, it is converted into an empty string // we want to avoid NaN or empty string as a values in ClientConfig if (value !== '') { const v = parseInt(value, 10) if (isNaN(v)) { throw new Error(`Invalid ${key}: ${value}`) } c[key] = v } } else { c[key] = value } } return c }, {}) return poolConfig } // parses a connection string into ClientConfig function parseIntoClientConfig(str) { return toClientConfig(parse(str)) } function deprecatedSslModeWarning(sslmode) { if (!deprecatedSslModeWarning.warned && typeof process !== 'undefined' && process.emitWarning) { deprecatedSslModeWarning.warned = true process.emitWarning(`SECURITY WARNING: The SSL modes 'prefer', 'require', and 'verify-ca' are treated as aliases for 'verify-full'. In the next major version (pg-connection-string v3.0.0 and pg v9.0.0), these modes will adopt standard libpq semantics, which have weaker security guarantees. To prepare for this change: - If you want the current behavior, explicitly use 'sslmode=verify-full' - If you want libpq compatibility now, use 'uselibpqcompat=true&sslmode=${sslmode}' See https://www.postgresql.org/docs/current/libpq-ssl.html for libpq SSL mode definitions.`) } } module.exports = parse parse.parse = parse parse.toClientConfig = toClientConfig parse.parseIntoClientConfig = parseIntoClientConfig
Save
cmd:
run