Skip to content

Commit 8d36633

Browse files
committed
Correctly sanitize pool configs
1 parent a5e90a1 commit 8d36633

File tree

3 files changed

+33
-29
lines changed

3 files changed

+33
-29
lines changed

src/v1/driver.js

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,9 @@ import {newError, SERVICE_UNAVAILABLE} from './error';
2525
import {DirectConnectionProvider} from './internal/connection-providers';
2626
import Bookmark from './internal/bookmark';
2727
import ConnectivityVerifier from './internal/connectivity-verifier';
28-
import PoolConfig from './internal/pool-config';
28+
import PoolConfig, {DEFAULT_ACQUISITION_TIMEOUT, DEFAULT_MAX_SIZE} from './internal/pool-config';
29+
30+
const DEFAULT_MAX_CONNECTION_LIFETIME = 60 * 60 * 1000; // 1 hour
2931

3032
const READ = 'READ', WRITE = 'WRITE';
3133
/**
@@ -115,14 +117,8 @@ class Driver {
115117
}
116118

117119
const maxConnectionLifetime = this._config.maxConnectionLifetime;
118-
if (maxConnectionLifetime) {
119-
const lifetime = Date.now() - conn.creationTimestamp;
120-
if (lifetime > maxConnectionLifetime) {
121-
return false;
122-
}
123-
}
124-
125-
return true;
120+
const lifetime = Date.now() - conn.creationTimestamp;
121+
return lifetime <= maxConnectionLifetime;
126122
}
127123

128124
/**
@@ -238,19 +234,20 @@ class _ConnectionStreamObserver extends StreamObserver {
238234
* @private
239235
*/
240236
function sanitizeConfig(config) {
241-
config.maxConnectionLifetime = sanitizeIntValue(config.maxConnectionLifetime, 60*60*1000);
242-
config.maxConnectionPoolSize = sanitizeIntValue(config.maxConnectionPoolSize);
243-
config.connectionAcquisitionTimeout = sanitizeIntValue(config.connectionAcquisitionTimeout);
237+
config.maxConnectionLifetime = sanitizeIntValue(config.maxConnectionLifetime, DEFAULT_MAX_CONNECTION_LIFETIME);
238+
config.maxConnectionPoolSize = sanitizeIntValue(config.maxConnectionPoolSize, DEFAULT_MAX_SIZE);
239+
config.connectionAcquisitionTimeout = sanitizeIntValue(config.connectionAcquisitionTimeout, DEFAULT_ACQUISITION_TIMEOUT);
244240
}
245241

246-
function sanitizeIntValue(value, defaultValue=null) {
247-
if (value) {
248-
const sanitizedValue = parseInt(value, 10);
249-
if (sanitizedValue && sanitizedValue > 0) {
250-
return sanitizedValue;
251-
}
242+
function sanitizeIntValue(rawValue, defaultWhenAbsent) {
243+
const sanitizedValue = parseInt(rawValue, 10);
244+
if (sanitizedValue > 0 || sanitizedValue === 0) {
245+
return sanitizedValue;
246+
} else if (sanitizedValue < 0) {
247+
return Number.MAX_SAFE_INTEGER;
248+
} else {
249+
return defaultWhenAbsent;
252250
}
253-
return defaultValue;
254251
}
255252

256253
export {Driver, READ, WRITE}

src/v1/internal/pool-config.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919

2020
const DEFAULT_MAX_SIZE = 100;
21-
const DEFAULT_ACQUISITION_TIMEOUT = 60000;
21+
const DEFAULT_ACQUISITION_TIMEOUT = 60 * 1000; // 60 seconds
2222

2323
export default class PoolConfig {
2424

test/v1/driver.test.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import neo4j from '../../src/v1';
2121
import sharedNeo4j from '../internal/shared-neo4j';
2222
import FakeConnection from '../internal/fake-connection';
2323
import lolex from 'lolex';
24+
import {DEFAULT_ACQUISITION_TIMEOUT, DEFAULT_MAX_SIZE} from '../../src/v1/internal/pool-config';
2425

2526
describe('driver', () => {
2627

@@ -191,13 +192,10 @@ describe('driver', () => {
191192
expect(() => neo4j.driver('bolt://localhost:7687/?policy=my_policy')).toThrow();
192193
});
193194

194-
it('should sanitize maxConnectionLifetime in the config', () => {
195-
validateMaxConnectionLifetime({}, null);
196-
validateMaxConnectionLifetime({maxConnectionLifetime: 42}, 42);
197-
validateMaxConnectionLifetime({maxConnectionLifetime: 0}, null);
198-
validateMaxConnectionLifetime({maxConnectionLifetime: '42'}, 42);
199-
validateMaxConnectionLifetime({maxConnectionLifetime: '042'}, 42);
200-
validateMaxConnectionLifetime({maxConnectionLifetime: -42}, null);
195+
it('should sanitize pool setting values in the config', () => {
196+
testConfigSanitizing('maxConnectionLifetime', 60 * 60 * 1000);
197+
testConfigSanitizing('maxConnectionPoolSize', DEFAULT_MAX_SIZE);
198+
testConfigSanitizing('connectionAcquisitionTimeout', DEFAULT_ACQUISITION_TIMEOUT);
201199
});
202200

203201
it('should treat closed connections as invalid', () => {
@@ -321,10 +319,19 @@ describe('driver', () => {
321319
return neo4j.auth.basic('neo4j', 'who would use such a password');
322320
}
323321

324-
function validateMaxConnectionLifetime(config, expectedValue) {
322+
function testConfigSanitizing(configProperty, defaultValue) {
323+
validateConfigSanitizing({}, defaultValue);
324+
validateConfigSanitizing({[configProperty]: 42}, 42);
325+
validateConfigSanitizing({[configProperty]: 0}, 0);
326+
validateConfigSanitizing({[configProperty]: '42'}, 42);
327+
validateConfigSanitizing({[configProperty]: '042'}, 42);
328+
validateConfigSanitizing({[configProperty]: -42}, Number.MAX_SAFE_INTEGER);
329+
}
330+
331+
function validateConfigSanitizing(config, configProperty, expectedValue) {
325332
const driver = neo4j.driver('bolt://localhost', sharedNeo4j.authToken, config);
326333
try {
327-
expect(driver._config.maxConnectionLifetime).toEqual(expectedValue);
334+
expect(driver._config[configProperty]).toEqual(expectedValue);
328335
} finally {
329336
driver.close();
330337
}

0 commit comments

Comments
 (0)