Skip to content

Commit 3f372e5

Browse files
authored
Merge pull request #119 from malthe/issue-118-ssl-configuration
Fix SSL configuration issue
2 parents fe7e707 + a571208 commit 3f372e5

File tree

4 files changed

+72
-43
lines changed

4 files changed

+72
-43
lines changed

CHANGES.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
In next release ...
22

3-
-
3+
- Fix SSL configuration issue where the `ssl` configuration option was not
4+
correctly processed for the _prefer_ and _require_ settings.
45

56
## v2.0.1 (2024-03-10)
67

src/client.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -256,13 +256,13 @@ export class ClientImpl {
256256
}
257257

258258
const ssl =
259-
(
260-
this.config.ssl ??
259+
this.config.ssl ??
260+
((
261261
((DEFAULTS.sslMode as SSLMode) || SSLMode.Disable) ===
262-
SSLMode.Disable
262+
SSLMode.Disable
263263
) ?
264264
SSLMode.Disable
265-
: { mode: SSLMode.Prefer, options: undefined };
265+
: { mode: SSLMode.Prefer, options: undefined });
266266

267267
const settings = {
268268
user: this.config.user || DEFAULTS.user,

test/client.test.ts

+60-36
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
Result,
1515
ResultIterator,
1616
ResultRecord,
17+
SSL,
1718
SSLMode,
1819
} from '../src/index.js';
1920

@@ -149,45 +150,68 @@ function testSelect(
149150
}
150151

151152
describe('Connection', () => {
152-
test('Info', async ({ client }) => {
153-
equal(
154-
client.encrypted,
155-
!!(client.config.ssl && client.config.ssl !== SSLMode.Disable),
156-
);
157-
});
158-
test('Timeout', async ({ connect }) => {
159-
const server = createServer();
160-
await new Promise((resolve) => {
161-
server.listen(0, 'localhost', 1, () => {
162-
resolve(undefined);
153+
test(
154+
'Timeout',
155+
async ({ connect }) => {
156+
const server = createServer();
157+
await new Promise((resolve) => {
158+
server.listen(0, 'localhost', 1, () => {
159+
resolve(undefined);
160+
});
163161
});
164-
});
165-
const sockets = new Set<Socket>();
166-
server.on('connection', (socket) => {
167-
sockets.add(socket);
168-
server.once('close', () => {
169-
sockets.delete(socket);
162+
const sockets = new Set<Socket>();
163+
server.on('connection', (socket) => {
164+
sockets.add(socket);
165+
server.once('close', () => {
166+
sockets.delete(socket);
167+
});
170168
});
171-
});
172-
strictEqual(server.listening, true);
173-
const address = server.address() as AddressInfo;
174-
await rejects(
175-
connect({
176-
host: address.address,
177-
port: address.port,
178-
connectionTimeout: 250,
179-
}),
180-
/Timeout after 250 ms/,
181-
);
182-
for (const socket of sockets.values()) {
183-
socket.destroy();
184-
}
185-
return new Promise((resolve) => {
186-
server.close(() => {
187-
resolve(undefined);
169+
strictEqual(server.listening, true);
170+
const address = server.address() as AddressInfo;
171+
await rejects(
172+
connect({
173+
host: address.address,
174+
port: address.port,
175+
connectionTimeout: 250,
176+
}),
177+
/Timeout after 250 ms/,
178+
);
179+
for (const socket of sockets.values()) {
180+
socket.destroy();
181+
}
182+
return new Promise((resolve) => {
183+
server.close(() => {
184+
resolve(undefined);
185+
});
188186
});
189-
});
190-
}, 500);
187+
},
188+
{ timeout: 500 },
189+
);
190+
test(
191+
'SSL',
192+
async ({ connect }) => {
193+
const test = async (ssl: SSL, encrypted: boolean) => {
194+
const client = await connect({ ssl });
195+
equal(client.encrypted, encrypted);
196+
await client.end();
197+
};
198+
try {
199+
await test({ mode: SSLMode.Require }, true);
200+
} catch (err) {
201+
if (
202+
err instanceof Error &&
203+
err.toString() ==
204+
'Error: Server does not support SSL connections'
205+
) {
206+
await test({ mode: SSLMode.Prefer }, false);
207+
return;
208+
}
209+
throw err;
210+
}
211+
await test({ mode: SSLMode.Prefer }, true);
212+
},
213+
{ skip: env['PGSSLMODE'] == 'disable' },
214+
);
191215
});
192216

193217
describe('Query', () => {

test/helper.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ type Test = (context: {
77
connect: typeof connect;
88
}) => Promise<void>;
99

10-
function testWithClient(name: string, fn: Test, timeout?: number) {
11-
return test(name, { timeout: timeout }, async () => {
10+
function testWithClient(
11+
name: string,
12+
fn: Test,
13+
options?: { timeout?: number; skip?: boolean },
14+
) {
15+
return test(name, options, async () => {
1216
const baseConfig = {
1317
extraFloatDigits: 2,
1418
preparedStatementPrefix: name + ' ',

0 commit comments

Comments
 (0)