Skip to content

Fix SSL configuration issue #119

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion CHANGES.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
In next release ...

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

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

Expand Down
8 changes: 4 additions & 4 deletions src/client.ts
Original file line number Diff line number Diff line change
Expand Up @@ -256,13 +256,13 @@ export class ClientImpl {
}

const ssl =
(
this.config.ssl ??
this.config.ssl ??
((
((DEFAULTS.sslMode as SSLMode) || SSLMode.Disable) ===
SSLMode.Disable
SSLMode.Disable
) ?
SSLMode.Disable
: { mode: SSLMode.Prefer, options: undefined };
: { mode: SSLMode.Prefer, options: undefined });

const settings = {
user: this.config.user || DEFAULTS.user,
Expand Down
96 changes: 60 additions & 36 deletions test/client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
Result,
ResultIterator,
ResultRecord,
SSL,
SSLMode,
} from '../src/index.js';

Expand Down Expand Up @@ -149,45 +150,68 @@ function testSelect(
}

describe('Connection', () => {
test('Info', async ({ client }) => {
equal(
client.encrypted,
!!(client.config.ssl && client.config.ssl !== SSLMode.Disable),
);
});
test('Timeout', async ({ connect }) => {
const server = createServer();
await new Promise((resolve) => {
server.listen(0, 'localhost', 1, () => {
resolve(undefined);
test(
'Timeout',
async ({ connect }) => {
const server = createServer();
await new Promise((resolve) => {
server.listen(0, 'localhost', 1, () => {
resolve(undefined);
});
});
});
const sockets = new Set<Socket>();
server.on('connection', (socket) => {
sockets.add(socket);
server.once('close', () => {
sockets.delete(socket);
const sockets = new Set<Socket>();
server.on('connection', (socket) => {
sockets.add(socket);
server.once('close', () => {
sockets.delete(socket);
});
});
});
strictEqual(server.listening, true);
const address = server.address() as AddressInfo;
await rejects(
connect({
host: address.address,
port: address.port,
connectionTimeout: 250,
}),
/Timeout after 250 ms/,
);
for (const socket of sockets.values()) {
socket.destroy();
}
return new Promise((resolve) => {
server.close(() => {
resolve(undefined);
strictEqual(server.listening, true);
const address = server.address() as AddressInfo;
await rejects(
connect({
host: address.address,
port: address.port,
connectionTimeout: 250,
}),
/Timeout after 250 ms/,
);
for (const socket of sockets.values()) {
socket.destroy();
}
return new Promise((resolve) => {
server.close(() => {
resolve(undefined);
});
});
});
}, 500);
},
{ timeout: 500 },
);
test(
'SSL',
async ({ connect }) => {
const test = async (ssl: SSL, encrypted: boolean) => {
const client = await connect({ ssl });
equal(client.encrypted, encrypted);
await client.end();
};
try {
await test({ mode: SSLMode.Require }, true);
} catch (err) {
if (
err instanceof Error &&
err.toString() ==
'Error: Server does not support SSL connections'
) {
await test({ mode: SSLMode.Prefer }, false);
return;
}
throw err;
}
await test({ mode: SSLMode.Prefer }, true);
},
{ skip: env['PGSSLMODE'] == 'disable' },
);
});

describe('Query', () => {
Expand Down
8 changes: 6 additions & 2 deletions test/helper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,12 @@ type Test = (context: {
connect: typeof connect;
}) => Promise<void>;

function testWithClient(name: string, fn: Test, timeout?: number) {
return test(name, { timeout: timeout }, async () => {
function testWithClient(
name: string,
fn: Test,
options?: { timeout?: number; skip?: boolean },
) {
return test(name, options, async () => {
const baseConfig = {
extraFloatDigits: 2,
preparedStatementPrefix: name + ' ',
Expand Down
Loading