From 07ac095ee9dc0f91c70310b052e5e478c03da176 Mon Sep 17 00:00:00 2001 From: mjgp2 Date: Tue, 3 May 2022 18:48:02 +0100 Subject: [PATCH] Add support for password function to native --- packages/pg/lib/connection-parameters.js | 22 ++++++++++++++--- .../connection-parameters/creation-tests.js | 24 +++++++++++++++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/packages/pg/lib/connection-parameters.js b/packages/pg/lib/connection-parameters.js index 6a535a820..0c0dbb32c 100644 --- a/packages/pg/lib/connection-parameters.js +++ b/packages/pg/lib/connection-parameters.js @@ -125,9 +125,25 @@ class ConnectionParameters { } getLibpqConnectionString(cb) { - var params = [] - add(params, this, 'user') - add(params, this, 'password') + if (typeof this.password === 'function') { + const pw = this.password(); + if (typeof pw === 'string') { + return this._getLibpqConnectionString(cb, pw) + } + pw.then((pwString) => this._getLibpqConnectionString(cb, pwString)).catch((e) => cb(e)) + return + } + this._getLibpqConnectionString(cb); + } + + _getLibpqConnectionString(cb, pw) { + var params = []; + add(params, this, 'user'); + if (pw != null) { + params.push('password=' + quoteParamValue(pw)) + } else { + add(params, this, 'password'); + } add(params, this, 'port') add(params, this, 'application_name') add(params, this, 'fallback_application_name') diff --git a/packages/pg/test/unit/connection-parameters/creation-tests.js b/packages/pg/test/unit/connection-parameters/creation-tests.js index cd27d5011..2767b4400 100644 --- a/packages/pg/test/unit/connection-parameters/creation-tests.js +++ b/packages/pg/test/unit/connection-parameters/creation-tests.js @@ -187,6 +187,30 @@ suite.testAsync('builds simple string', async function () { }) }) +suite.testAsync('builds simple string with pw function', async function () { + var config = { + user: 'brian', + password: () => 'xyz', + port: 888, + host: 'localhost', + database: 'bam', + } + var subject = new ConnectionParameters(config) + const dnsHost = await getDNSHost(config.host) + return new Promise((resolve) => { + subject.getLibpqConnectionString(function (err, constring) { + assert(!err) + var parts = constring.split(' ') + checkForPart(parts, "user='brian'") + checkForPart(parts, "password='xyz'") + checkForPart(parts, "port='888'") + checkForPart(parts, `hostaddr='${dnsHost}'`) + checkForPart(parts, "dbname='bam'") + resolve() + }) + }) +}) + suite.test('builds dns string', async function () { var config = { user: 'brian',