From 94afcffb5eed89ba2df57c4a25ab6df5f53a6faa Mon Sep 17 00:00:00 2001 From: valentynk Date: Mon, 9 Jan 2023 13:35:47 -0800 Subject: [PATCH 1/3] added credentialsRefresher --- .gitignore | 1 + .../src/connection/connection-channel.js | 12 +++++++++++- .../bolt-connection/src/packstream/packstream-v1.js | 4 ++-- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index dab77719f..f96906491 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ coverage *.code-workspace /testkit/CAs /testkit/CustomCAs +/.vs diff --git a/packages/bolt-connection/src/connection/connection-channel.js b/packages/bolt-connection/src/connection/connection-channel.js index 390eedb7e..dfc20114c 100644 --- a/packages/bolt-connection/src/connection/connection-channel.js +++ b/packages/bolt-connection/src/connection/connection-channel.js @@ -172,7 +172,17 @@ export default class ChannelConnection extends Connection { * @return {Promise} promise resolved with the current connection if connection is successful. Rejected promise otherwise. */ connect (userAgent, authToken) { - return this._initialize(userAgent, authToken) + const self = this + // credentialsRefresher is function to refresh credentials + if (authToken && authToken.credentialsRefresher) { + var maybePromise = authToken.credentialsRefresher(authToken) + return Promise.resolve(maybePromise).then(function(creds) { + authToken.credentials = creds + return self._initialize(userAgent, authToken); + }) + } + + return self._initialize(userAgent, authToken) } /** diff --git a/packages/bolt-connection/src/packstream/packstream-v1.js b/packages/bolt-connection/src/packstream/packstream-v1.js index b71ef43f0..f039e48e1 100644 --- a/packages/bolt-connection/src/packstream/packstream-v1.js +++ b/packages/bolt-connection/src/packstream/packstream-v1.js @@ -119,14 +119,14 @@ class Packer { let count = 0 for (let i = 0; i < keys.length; i++) { - if (x[keys[i]] !== undefined) { + if (x[keys[i]] !== undefined && keys[i] !== "credentialsRefresher") { count++ } } this.packMapHeader(count) for (let i = 0; i < keys.length; i++) { const key = keys[i] - if (x[key] !== undefined) { + if (x[key] !== undefined && key !== "credentialsRefresher") { this.packString(key) this.packable(x[key], dehydrateStruct)() } From b5605c457ee0883c22ab8e48ca17f70ad72d248f Mon Sep 17 00:00:00 2001 From: valentynk Date: Wed, 11 Jan 2023 13:58:41 -0800 Subject: [PATCH 2/3] added unit test --- .../src/connection/connection-channel.js | 10 +++++----- .../test/packstream/packstream-v1.test.js | 7 +++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/bolt-connection/src/connection/connection-channel.js b/packages/bolt-connection/src/connection/connection-channel.js index dfc20114c..0a885cbe2 100644 --- a/packages/bolt-connection/src/connection/connection-channel.js +++ b/packages/bolt-connection/src/connection/connection-channel.js @@ -175,11 +175,11 @@ export default class ChannelConnection extends Connection { const self = this // credentialsRefresher is function to refresh credentials if (authToken && authToken.credentialsRefresher) { - var maybePromise = authToken.credentialsRefresher(authToken) - return Promise.resolve(maybePromise).then(function(creds) { - authToken.credentials = creds - return self._initialize(userAgent, authToken); - }) + const maybePromise = authToken.credentialsRefresher() + return Promise.resolve(maybePromise).then(function (creds) { + authToken.credentials = creds + return self._initialize(userAgent, authToken) + }) } return self._initialize(userAgent, authToken) diff --git a/packages/bolt-connection/test/packstream/packstream-v1.test.js b/packages/bolt-connection/test/packstream/packstream-v1.test.js index 038c49bbf..652fb9532 100644 --- a/packages/bolt-connection/test/packstream/packstream-v1.test.js +++ b/packages/bolt-connection/test/packstream/packstream-v1.test.js @@ -182,6 +182,13 @@ describe('#unit PackStreamV1', () => { expect(unpacked[0]).toBe(list[0]) expect(unpacked[1]).toBe(list[1]) }) + + it('should pack object with credentialsRefresher function', () => { + const obj = { foo: 'bar', credentialsRefresher: () => 'top-secret-password' } + const unpacked = packAndUnpack(obj) + expect(unpacked.foo).toBe(obj.foo) + expect(unpacked.credentialsRefresher).toBe(undefined) + }) }) function packAndUnpack ( From f5dca23fb4422db6bdbf59063ae31c69ef524b58 Mon Sep 17 00:00:00 2001 From: valentynk Date: Wed, 11 Jan 2023 15:20:57 -0800 Subject: [PATCH 3/3] added credentialsRefresher to AuthToken interface --- packages/core/src/types.ts | 1 + packages/neo4j-driver-deno/lib/core/types.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index 63140cc16..06aae52ce 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -47,6 +47,7 @@ export interface AuthToken { credentials: string realm?: string parameters?: Parameters + credentialsRefresher?: () => string | Promise } export interface Config { encrypted?: boolean | EncryptionLevel diff --git a/packages/neo4j-driver-deno/lib/core/types.ts b/packages/neo4j-driver-deno/lib/core/types.ts index 63140cc16..06aae52ce 100644 --- a/packages/neo4j-driver-deno/lib/core/types.ts +++ b/packages/neo4j-driver-deno/lib/core/types.ts @@ -47,6 +47,7 @@ export interface AuthToken { credentials: string realm?: string parameters?: Parameters + credentialsRefresher?: () => string | Promise } export interface Config { encrypted?: boolean | EncryptionLevel