@antelopejs/postgres 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/config.d.ts +1 -1
- package/dist/config.js +51 -0
- package/dist/config.js.map +1 -1
- package/dist/implementations/database/external-access.d.ts +22 -0
- package/dist/implementations/database/external-access.js +59 -0
- package/dist/implementations/database/external-access.js.map +1 -0
- package/dist/implementations/database/external-catalog.d.ts +0 -1
- package/dist/implementations/database/external-catalog.js +2 -3
- package/dist/implementations/database/external-catalog.js.map +1 -1
- package/dist/implementations/database/external-discovery.d.ts +1 -15
- package/dist/implementations/database/external-discovery.js +4 -44
- package/dist/implementations/database/external-discovery.js.map +1 -1
- package/dist/implementations/database/external-profile.d.ts +1 -1
- package/dist/implementations/database/external-profile.js.map +1 -1
- package/dist/implementations/database/external-reference.js.map +1 -1
- package/dist/implementations/database/external-sample.d.ts +1 -1
- package/dist/implementations/database/member.js.map +1 -1
- package/dist/implementations/database/schema.d.ts +1 -0
- package/dist/implementations/database/schema.js +4 -0
- package/dist/implementations/database/schema.js.map +1 -1
- package/dist/pg-connection-parameters.d.ts +17 -0
- package/dist/pg-connection-parameters.js +8 -0
- package/dist/pg-connection-parameters.js.map +1 -0
- package/dist/probe-parameters.d.ts +5 -0
- package/dist/probe-parameters.js +44 -0
- package/dist/probe-parameters.js.map +1 -0
- package/dist/probe-url.d.ts +9 -0
- package/dist/probe-url.js +54 -0
- package/dist/probe-url.js.map +1 -0
- package/dist/probe.d.ts +2 -0
- package/dist/probe.js +188 -0
- package/dist/probe.js.map +1 -0
- package/dist/test/convergence.test.d.ts +1 -0
- package/dist/test/convergence.test.js +9 -0
- package/dist/test/convergence.test.js.map +1 -0
- package/dist/test/unit/probe-parameters.spec.d.ts +1 -0
- package/dist/test/unit/probe-parameters.spec.js +17 -0
- package/dist/test/unit/probe-parameters.spec.js.map +1 -0
- package/dist/test/unit/ssl-url.spec.d.ts +1 -0
- package/dist/test/unit/ssl-url.spec.js +147 -0
- package/dist/test/unit/ssl-url.spec.js.map +1 -0
- package/dist/test-external/catalog.test.js +1 -4
- package/dist/test-external/catalog.test.js.map +1 -1
- package/dist/test-external/native.test.js +8 -4
- package/dist/test-external/native.test.js.map +1 -1
- package/dist/test-external/probe-access.test.d.ts +1 -0
- package/dist/test-external/probe-access.test.js +90 -0
- package/dist/test-external/probe-access.test.js.map +1 -0
- package/dist/test-external/probe-closing.test.d.ts +1 -0
- package/dist/test-external/probe-closing.test.js +111 -0
- package/dist/test-external/probe-closing.test.js.map +1 -0
- package/dist/test-external/probe-fixture.d.ts +36 -0
- package/dist/test-external/probe-fixture.js +166 -0
- package/dist/test-external/probe-fixture.js.map +1 -0
- package/dist/test-external/probe-refusals.test.d.ts +1 -0
- package/dist/test-external/probe-refusals.test.js +110 -0
- package/dist/test-external/probe-refusals.test.js.map +1 -0
- package/dist/test-external/probe-url.test.d.ts +1 -0
- package/dist/test-external/probe-url.test.js +242 -0
- package/dist/test-external/probe-url.test.js.map +1 -0
- package/dist/test-external/reads.test.js +10 -5
- package/dist/test-external/reads.test.js.map +1 -1
- package/dist/test-external/refusals.test.js +2 -1
- package/dist/test-external/refusals.test.js.map +1 -1
- package/dist/test-external/registration.test.js +8 -0
- package/dist/test-external/registration.test.js.map +1 -1
- package/dist/test-external/relays.d.ts +27 -0
- package/dist/test-external/relays.js +176 -0
- package/dist/test-external/relays.js.map +1 -0
- package/dist/test-external/sales.d.ts +4 -1
- package/dist/test-external/sales.js +38 -1
- package/dist/test-external/sales.js.map +1 -1
- package/dist/test-external/writes.test.js +12 -6
- package/dist/test-external/writes.test.js.map +1 -1
- package/package.json +10 -8
|
@@ -33,7 +33,8 @@ async function Plan(query) {
|
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
35
|
describe("an external key that its column cannot hold", () => {
|
|
36
|
-
before(async ()
|
|
36
|
+
before(async function () {
|
|
37
|
+
this.timeout(sales_1.REGISTRATION_TIMEOUT_MS);
|
|
37
38
|
sales = await (0, sales_1.RegisterSales)();
|
|
38
39
|
});
|
|
39
40
|
for (const [table, key] of [
|
|
@@ -59,7 +60,8 @@ describe("an external key that its column cannot hold", () => {
|
|
|
59
60
|
});
|
|
60
61
|
});
|
|
61
62
|
describe("the indexes that serve reads of an external relation", () => {
|
|
62
|
-
before(async ()
|
|
63
|
+
before(async function () {
|
|
64
|
+
this.timeout(sales_1.REGISTRATION_TIMEOUT_MS);
|
|
63
65
|
sales = await (0, sales_1.RegisterSales)();
|
|
64
66
|
});
|
|
65
67
|
it("gets by a bigint _id through the primary key index", async () => {
|
|
@@ -83,7 +85,8 @@ describe("the indexes that serve reads of an external relation", () => {
|
|
|
83
85
|
});
|
|
84
86
|
});
|
|
85
87
|
describe("numbers read from an external relation's exact types", () => {
|
|
86
|
-
before(async ()
|
|
88
|
+
before(async function () {
|
|
89
|
+
this.timeout(sales_1.REGISTRATION_TIMEOUT_MS);
|
|
87
90
|
sales = await (0, sales_1.RegisterSales)();
|
|
88
91
|
});
|
|
89
92
|
it("sums a numeric column exactly", async () => {
|
|
@@ -112,7 +115,8 @@ describe("numbers read from an external relation's exact types", () => {
|
|
|
112
115
|
}
|
|
113
116
|
});
|
|
114
117
|
describe("inequality against an external column's own type", () => {
|
|
115
|
-
before(async ()
|
|
118
|
+
before(async function () {
|
|
119
|
+
this.timeout(sales_1.REGISTRATION_TIMEOUT_MS);
|
|
116
120
|
sales = await (0, sales_1.RegisterSales)();
|
|
117
121
|
});
|
|
118
122
|
const INEQUALITIES = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.test.js","sourceRoot":"","sources":["../../src/test-external/native.test.ts"],"names":[],"mappings":";;AAAA,+BAA8B;AAI9B,8CAA8C;AAC9C,+DAA4D;AAC5D,qEAAkE;AAClE,iEAAsE;AACtE,mEAAuE;AACvE,uEAA2E;AAC3E,mEAG8C;AAC9C,
|
|
1
|
+
{"version":3,"file":"native.test.js","sourceRoot":"","sources":["../../src/test-external/native.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_child_process_1 = require("node:child_process");
|
|
7
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
8
|
+
const node_util_1 = require("node:util");
|
|
9
|
+
const chai_1 = require("chai");
|
|
10
|
+
const config_1 = require("../config");
|
|
11
|
+
const connection_1 = require("../connection");
|
|
12
|
+
const catalog_1 = require("../implementations/catalog");
|
|
13
|
+
const probe_fixture_1 = require("./probe-fixture");
|
|
14
|
+
const run = (0, node_util_1.promisify)(node_child_process_1.execFile);
|
|
15
|
+
const EXTERNAL = "external";
|
|
16
|
+
const CASES = [
|
|
17
|
+
{ role: probe_fixture_1.LOGIN.reader, canRead: true, canWrite: false },
|
|
18
|
+
{ role: probe_fixture_1.LOGIN.writer, canRead: true, canWrite: true },
|
|
19
|
+
{ role: probe_fixture_1.LOGIN.updater, canRead: false, canWrite: true },
|
|
20
|
+
{ role: probe_fixture_1.LOGIN.deleter, canRead: false, canWrite: true },
|
|
21
|
+
{ role: probe_fixture_1.LOGIN.columns, canRead: false, canWrite: false },
|
|
22
|
+
{ role: probe_fixture_1.LOGIN.blind, canRead: false, canWrite: false },
|
|
23
|
+
{ role: probe_fixture_1.LOGIN.unseen, canRead: true, canWrite: false },
|
|
24
|
+
{ role: probe_fixture_1.LOGIN.grantee, canRead: true, canWrite: false },
|
|
25
|
+
];
|
|
26
|
+
async function CatalogAccess(url) {
|
|
27
|
+
await (0, connection_1.Connect)({ mode: EXTERNAL, url, catalog: { enabled: true } });
|
|
28
|
+
const relations = await (0, catalog_1.ListRelations)();
|
|
29
|
+
return {
|
|
30
|
+
canRead: relations.length === 0 ||
|
|
31
|
+
relations.some((relation) => relation.unmappable === undefined),
|
|
32
|
+
canWrite: relations.some(({ writes }) => writes.insert || writes.update || writes.delete),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
const PLAIN_NODE_SCRIPT = `
|
|
36
|
+
const Module = require("node:module");
|
|
37
|
+
const resolve = Module._resolveFilename;
|
|
38
|
+
Module._resolveFilename = function (request, ...rest) {
|
|
39
|
+
if (request.startsWith("@antelopejs/")) throw new Error("required " + request);
|
|
40
|
+
return resolve.call(this, request, ...rest);
|
|
41
|
+
};
|
|
42
|
+
const { probe } = require(process.argv[1]);
|
|
43
|
+
probe({ url: process.argv[2], timeoutMs: 5000, signal: new AbortController().signal })
|
|
44
|
+
.then((answer) => process.stdout.write(JSON.stringify(answer)));
|
|
45
|
+
`;
|
|
46
|
+
describe("the connection probe's access", function () {
|
|
47
|
+
this.timeout(60_000);
|
|
48
|
+
(0, probe_fixture_1.WithProbeLogins)();
|
|
49
|
+
describe("compared with the catalog", () => {
|
|
50
|
+
const { url, catalog } = (0, config_1.GetOptions)();
|
|
51
|
+
after(async () => {
|
|
52
|
+
await (0, connection_1.Connect)({ mode: EXTERNAL, url, catalog });
|
|
53
|
+
});
|
|
54
|
+
for (const { role, canRead, canWrite } of CASES) {
|
|
55
|
+
it(`answers ${role} with the access the catalog gives it`, async () => {
|
|
56
|
+
const login = (0, probe_fixture_1.LoginUrl)(role);
|
|
57
|
+
const answer = (0, probe_fixture_1.SignedIn)(await (0, probe_fixture_1.Probe)(login));
|
|
58
|
+
(0, chai_1.expect)(answer).to.include({ user: role, canRead, canWrite });
|
|
59
|
+
(0, chai_1.expect)(answer).to.not.have.property("unreadable");
|
|
60
|
+
(0, chai_1.expect)(answer.latencyMs).to.be.at.least(1);
|
|
61
|
+
(0, chai_1.expect)({ canRead, canWrite }).to.deep.equal(await CatalogAccess(login));
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
it("answers signed-in and cannot-list when the relation listing fails after the sign-in", async () => {
|
|
66
|
+
const answer = (0, probe_fixture_1.SignedIn)(await (0, probe_fixture_1.Probe)((0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.trapped)));
|
|
67
|
+
(0, chai_1.expect)(answer).to.include({
|
|
68
|
+
user: probe_fixture_1.LOGIN.trapped,
|
|
69
|
+
canRead: false,
|
|
70
|
+
canWrite: false,
|
|
71
|
+
unreadable: "cannot-list",
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
it("answers from a plain Node process that cannot load any @antelopejs package", async () => {
|
|
75
|
+
const built = node_path_1.default.join(__dirname, "..", "probe.js");
|
|
76
|
+
const { stdout } = await run(process.execPath, [
|
|
77
|
+
"-e",
|
|
78
|
+
PLAIN_NODE_SCRIPT,
|
|
79
|
+
built,
|
|
80
|
+
(0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.reader),
|
|
81
|
+
]);
|
|
82
|
+
(0, chai_1.expect)(JSON.parse(stdout)).to.include({
|
|
83
|
+
outcome: "signed-in",
|
|
84
|
+
user: probe_fixture_1.LOGIN.reader,
|
|
85
|
+
canRead: true,
|
|
86
|
+
canWrite: false,
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=probe-access.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe-access.test.js","sourceRoot":"","sources":["../../src/test-external/probe-access.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const node_events_1 = require("node:events");
|
|
4
|
+
const chai_1 = require("chai");
|
|
5
|
+
const probe_fixture_1 = require("./probe-fixture");
|
|
6
|
+
const relays_1 = require("./relays");
|
|
7
|
+
const CLOSE_SETTLE_MS = 1000;
|
|
8
|
+
const GRACE_SETTLE_MS = 500;
|
|
9
|
+
const ABORT_SETTLE_MS = 100;
|
|
10
|
+
const QUERY_MESSAGE = 0x51;
|
|
11
|
+
const TERMINATE_MESSAGE = 0x58;
|
|
12
|
+
function SaysGoodbye(chunk, fromClient) {
|
|
13
|
+
return fromClient && chunk[0] === TERMINATE_MESSAGE;
|
|
14
|
+
}
|
|
15
|
+
async function WithRelay(relay, check) {
|
|
16
|
+
const sockets = (0, relays_1.WatchClientSockets)(relay.port);
|
|
17
|
+
try {
|
|
18
|
+
await check(relay, sockets);
|
|
19
|
+
}
|
|
20
|
+
finally {
|
|
21
|
+
sockets.stop();
|
|
22
|
+
await relay.close();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function ReaderOn(relay) {
|
|
26
|
+
return (0, probe_fixture_1.OnPort)((0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.reader), relay.port);
|
|
27
|
+
}
|
|
28
|
+
describe("the connection probe's closing", function () {
|
|
29
|
+
this.timeout(60_000);
|
|
30
|
+
(0, probe_fixture_1.WithProbeLogins)();
|
|
31
|
+
it("closes its connection once it has answered", async () => {
|
|
32
|
+
await WithRelay(await (0, relays_1.StartRelayTo)((0, probe_fixture_1.ServerPort)()), async (relay) => {
|
|
33
|
+
(0, probe_fixture_1.SignedIn)(await (0, probe_fixture_1.Probe)(ReaderOn(relay)));
|
|
34
|
+
(0, chai_1.expect)(await relay.openAfter(CLOSE_SETTLE_MS)).to.equal(0);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
it("shuts its socket when the server ignores the goodbye", async () => {
|
|
38
|
+
const relay = await (0, relays_1.StartRelayIgnoringGoodbye)((0, probe_fixture_1.ServerPort)(), SaysGoodbye);
|
|
39
|
+
await WithRelay(relay, async (_, sockets) => {
|
|
40
|
+
const answer = (0, probe_fixture_1.SignedIn)(await (0, probe_fixture_1.Probe)(ReaderOn(relay)));
|
|
41
|
+
(0, chai_1.expect)(answer).to.include({ user: probe_fixture_1.LOGIN.reader, canRead: true });
|
|
42
|
+
(0, chai_1.expect)(await sockets.settle(GRACE_SETTLE_MS)).to.deep.equal({
|
|
43
|
+
opened: 1,
|
|
44
|
+
open: 0,
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
it("leaves no listener on the signal once it has closed", async () => {
|
|
49
|
+
await WithRelay(await (0, relays_1.StartRelayTo)((0, probe_fixture_1.ServerPort)()), async (relay) => {
|
|
50
|
+
const { signal } = new AbortController();
|
|
51
|
+
(0, probe_fixture_1.SignedIn)(await (0, probe_fixture_1.Probe)(ReaderOn(relay), signal));
|
|
52
|
+
(0, probe_fixture_1.SignedIn)(await (0, probe_fixture_1.Probe)(ReaderOn(relay), signal));
|
|
53
|
+
(0, chai_1.expect)(await relay.openAfter(CLOSE_SETTLE_MS)).to.equal(0);
|
|
54
|
+
(0, chai_1.expect)((0, node_events_1.getEventListeners)(signal, "abort")).to.have.length(0);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
it("shuts its socket at once when the signal aborts while it closes", async () => {
|
|
58
|
+
const relay = await (0, relays_1.StartRelayIgnoringGoodbye)((0, probe_fixture_1.ServerPort)(), SaysGoodbye);
|
|
59
|
+
await WithRelay(relay, async (_, sockets) => {
|
|
60
|
+
const controller = new AbortController();
|
|
61
|
+
(0, probe_fixture_1.SignedIn)(await (0, probe_fixture_1.Probe)(ReaderOn(relay), controller.signal));
|
|
62
|
+
controller.abort();
|
|
63
|
+
(0, chai_1.expect)(await sockets.settle(ABORT_SETTLE_MS)).to.deep.equal({
|
|
64
|
+
opened: 1,
|
|
65
|
+
open: 0,
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
it("answers unreachable and closes when the server stops answering after the sign-in", async () => {
|
|
70
|
+
const stall = (chunk, fromClient) => fromClient && chunk[0] === QUERY_MESSAGE;
|
|
71
|
+
await WithRelay(await (0, relays_1.StartRelayTo)((0, probe_fixture_1.ServerPort)(), stall), async (relay) => {
|
|
72
|
+
const answer = await (0, probe_fixture_1.Probe)(ReaderOn(relay));
|
|
73
|
+
(0, chai_1.expect)(answer.outcome).to.equal("unreachable");
|
|
74
|
+
(0, chai_1.expect)(await relay.openAfter(CLOSE_SETTLE_MS)).to.equal(0);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
it("answers aborted at once and shuts its socket when the signal aborts", async () => {
|
|
78
|
+
const controller = new AbortController();
|
|
79
|
+
let abortedAt = 0;
|
|
80
|
+
const stall = (chunk, fromClient) => {
|
|
81
|
+
const stalls = fromClient && chunk[0] === QUERY_MESSAGE;
|
|
82
|
+
if (stalls && abortedAt === 0) {
|
|
83
|
+
abortedAt = performance.now();
|
|
84
|
+
controller.abort();
|
|
85
|
+
}
|
|
86
|
+
return stalls;
|
|
87
|
+
};
|
|
88
|
+
const relay = await (0, relays_1.StartRelayTo)((0, probe_fixture_1.ServerPort)(), stall);
|
|
89
|
+
await WithRelay(relay, async (_, sockets) => {
|
|
90
|
+
const answer = await (0, probe_fixture_1.Probe)(ReaderOn(relay), controller.signal);
|
|
91
|
+
(0, chai_1.expect)(performance.now() - abortedAt).to.be.lessThan(ABORT_SETTLE_MS);
|
|
92
|
+
(0, chai_1.expect)(answer).to.deep.equal(probe_fixture_1.ABORTED_ANSWER);
|
|
93
|
+
(0, chai_1.expect)(await sockets.settle(ABORT_SETTLE_MS)).to.deep.equal({
|
|
94
|
+
opened: 1,
|
|
95
|
+
open: 0,
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
it("answers aborted and opens nothing when the signal has already aborted", async () => {
|
|
100
|
+
const relay = await (0, relays_1.StartRelayTo)((0, probe_fixture_1.ServerPort)());
|
|
101
|
+
await WithRelay(relay, async (_, sockets) => {
|
|
102
|
+
const answer = await (0, probe_fixture_1.Probe)(ReaderOn(relay), AbortSignal.abort());
|
|
103
|
+
(0, chai_1.expect)(answer).to.deep.equal(probe_fixture_1.ABORTED_ANSWER);
|
|
104
|
+
(0, chai_1.expect)(await sockets.settle(ABORT_SETTLE_MS)).to.deep.equal({
|
|
105
|
+
opened: 0,
|
|
106
|
+
open: 0,
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=probe-closing.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe-closing.test.js","sourceRoot":"","sources":["../../src/test-external/probe-closing.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ProbeAnswer } from "@antelopejs/interface-database-catalog";
|
|
2
|
+
export declare const TIMEOUT_MS = 2000;
|
|
3
|
+
export declare const ABORTED_ANSWER: {
|
|
4
|
+
outcome: string;
|
|
5
|
+
message: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const LOGIN: {
|
|
8
|
+
readonly reader: "probe_reader";
|
|
9
|
+
readonly writer: "probe_writer";
|
|
10
|
+
readonly updater: "probe_updater";
|
|
11
|
+
readonly deleter: "probe_deleter";
|
|
12
|
+
readonly columns: "probe_columns";
|
|
13
|
+
readonly blind: "probe_blind";
|
|
14
|
+
readonly unseen: "probe_unseen";
|
|
15
|
+
readonly grantee: "probe@grantee";
|
|
16
|
+
readonly trapped: "probe_trapped";
|
|
17
|
+
};
|
|
18
|
+
export declare const NO_LOGIN = "probe_nologin";
|
|
19
|
+
export declare const LOCKED_DATABASE = "probe_locked";
|
|
20
|
+
export declare const SCRIBBLE_SCHEMA = "probe_scribble";
|
|
21
|
+
export declare function CountAsOwner(relation: string): Promise<number>;
|
|
22
|
+
export declare function WithEnvironment(values: Readonly<Record<string, string>>, check: () => Promise<void>): Promise<void>;
|
|
23
|
+
export declare function WithProbeLogins(): void;
|
|
24
|
+
export declare function Altered(url: string, change: (target: URL) => void): string;
|
|
25
|
+
export declare function LoginUrl(role: string, password?: string): string;
|
|
26
|
+
export declare function OnPort(url: string, port: number, host?: string): string;
|
|
27
|
+
export declare function ServerPort(): number;
|
|
28
|
+
export declare function Probe(url: string, signal?: AbortSignal): Promise<ProbeAnswer>;
|
|
29
|
+
export declare function SignedIn(answer: ProbeAnswer): {
|
|
30
|
+
outcome: "signed-in";
|
|
31
|
+
latencyMs: number;
|
|
32
|
+
user?: string;
|
|
33
|
+
canRead: boolean;
|
|
34
|
+
canWrite: boolean;
|
|
35
|
+
unreadable?: import("@antelopejs/interface-database-catalog").ProbeUnreadable;
|
|
36
|
+
};
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SCRIBBLE_SCHEMA = exports.LOCKED_DATABASE = exports.NO_LOGIN = exports.LOGIN = exports.ABORTED_ANSWER = exports.TIMEOUT_MS = void 0;
|
|
4
|
+
exports.CountAsOwner = CountAsOwner;
|
|
5
|
+
exports.WithEnvironment = WithEnvironment;
|
|
6
|
+
exports.WithProbeLogins = WithProbeLogins;
|
|
7
|
+
exports.Altered = Altered;
|
|
8
|
+
exports.LoginUrl = LoginUrl;
|
|
9
|
+
exports.OnPort = OnPort;
|
|
10
|
+
exports.ServerPort = ServerPort;
|
|
11
|
+
exports.Probe = Probe;
|
|
12
|
+
exports.SignedIn = SignedIn;
|
|
13
|
+
const node_crypto_1 = require("node:crypto");
|
|
14
|
+
const chai_1 = require("chai");
|
|
15
|
+
const pg_1 = require("pg");
|
|
16
|
+
const probe_1 = require("../probe");
|
|
17
|
+
exports.TIMEOUT_MS = 2000;
|
|
18
|
+
const SECRET = (0, node_crypto_1.randomBytes)(6).toString("hex");
|
|
19
|
+
exports.ABORTED_ANSWER = {
|
|
20
|
+
outcome: "unreachable",
|
|
21
|
+
message: "The probe was aborted.",
|
|
22
|
+
};
|
|
23
|
+
exports.LOGIN = {
|
|
24
|
+
reader: "probe_reader",
|
|
25
|
+
writer: "probe_writer",
|
|
26
|
+
updater: "probe_updater",
|
|
27
|
+
deleter: "probe_deleter",
|
|
28
|
+
columns: "probe_columns",
|
|
29
|
+
blind: "probe_blind",
|
|
30
|
+
unseen: "probe_unseen",
|
|
31
|
+
grantee: "probe@grantee",
|
|
32
|
+
trapped: "probe_trapped",
|
|
33
|
+
};
|
|
34
|
+
exports.NO_LOGIN = "probe_nologin";
|
|
35
|
+
exports.LOCKED_DATABASE = "probe_locked";
|
|
36
|
+
const READERS_GROUP = "probe_readers";
|
|
37
|
+
const TEAM_GROUP = "probe_team";
|
|
38
|
+
const TRAP_SCHEMA = "probe_trap";
|
|
39
|
+
exports.SCRIBBLE_SCHEMA = "probe_scribble";
|
|
40
|
+
const GROUPS = [READERS_GROUP, TEAM_GROUP];
|
|
41
|
+
const ROLES = [...Object.values(exports.LOGIN), exports.NO_LOGIN, ...GROUPS];
|
|
42
|
+
function Quoted(role) {
|
|
43
|
+
return `"${role}"`;
|
|
44
|
+
}
|
|
45
|
+
const TEARDOWN = [
|
|
46
|
+
`DROP DATABASE IF EXISTS ${exports.LOCKED_DATABASE}`,
|
|
47
|
+
`DROP SCHEMA IF EXISTS ${TRAP_SCHEMA} CASCADE`,
|
|
48
|
+
`DROP SCHEMA IF EXISTS ${exports.SCRIBBLE_SCHEMA} CASCADE`,
|
|
49
|
+
`DO $$ DECLARE role text; BEGIN
|
|
50
|
+
FOREACH role IN ARRAY ARRAY[${ROLES.map((role) => `'${role}'`).join(", ")}] LOOP
|
|
51
|
+
IF EXISTS (SELECT 1 FROM pg_roles WHERE rolname = role) THEN
|
|
52
|
+
EXECUTE format('DROP OWNED BY %I', role);
|
|
53
|
+
EXECUTE format('DROP ROLE %I', role);
|
|
54
|
+
END IF;
|
|
55
|
+
END LOOP;
|
|
56
|
+
END $$`,
|
|
57
|
+
];
|
|
58
|
+
const SETUP = [
|
|
59
|
+
...TEARDOWN,
|
|
60
|
+
...Object.values(exports.LOGIN).map((role) => `CREATE ROLE ${Quoted(role)} LOGIN PASSWORD '${SECRET}'`),
|
|
61
|
+
`CREATE ROLE ${exports.NO_LOGIN} NOLOGIN PASSWORD '${SECRET}'`,
|
|
62
|
+
...GROUPS.map((role) => `CREATE ROLE ${role} NOLOGIN`),
|
|
63
|
+
`GRANT USAGE ON SCHEMA sales TO ${[exports.LOGIN.reader, exports.LOGIN.writer, exports.LOGIN.updater, exports.LOGIN.deleter, exports.LOGIN.columns, exports.LOGIN.blind, exports.LOGIN.trapped, READERS_GROUP].join(", ")}`,
|
|
64
|
+
`GRANT SELECT ON sales.countries TO ${exports.LOGIN.reader}, ${exports.LOGIN.trapped}, ${READERS_GROUP}`,
|
|
65
|
+
`GRANT SELECT, INSERT ON sales.countries TO ${exports.LOGIN.writer}`,
|
|
66
|
+
`GRANT UPDATE ON sales.countries TO ${exports.LOGIN.updater}`,
|
|
67
|
+
`GRANT DELETE ON sales.countries TO ${exports.LOGIN.deleter}`,
|
|
68
|
+
`GRANT SELECT (code) ON sales.countries TO ${exports.LOGIN.columns}`,
|
|
69
|
+
`GRANT ${READERS_GROUP} TO ${TEAM_GROUP}`,
|
|
70
|
+
`GRANT ${TEAM_GROUP} TO ${Quoted(exports.LOGIN.grantee)}`,
|
|
71
|
+
`CREATE SCHEMA ${TRAP_SCHEMA}`,
|
|
72
|
+
`CREATE FUNCTION ${TRAP_SCHEMA}.has_any_column_privilege(oid, text) RETURNS boolean
|
|
73
|
+
LANGUAGE plpgsql AS $$ BEGIN RAISE EXCEPTION 'the listing is refused'; END $$`,
|
|
74
|
+
`GRANT USAGE ON SCHEMA ${TRAP_SCHEMA} TO ${exports.LOGIN.trapped}`,
|
|
75
|
+
`ALTER ROLE ${exports.LOGIN.trapped} SET search_path = ${TRAP_SCHEMA}, pg_catalog`,
|
|
76
|
+
`CREATE SCHEMA ${exports.SCRIBBLE_SCHEMA}`,
|
|
77
|
+
`CREATE TABLE ${exports.SCRIBBLE_SCHEMA}.marks (n int)`,
|
|
78
|
+
`CREATE FUNCTION ${exports.SCRIBBLE_SCHEMA}.has_any_column_privilege(oid, text) RETURNS boolean
|
|
79
|
+
LANGUAGE plpgsql AS $$ BEGIN INSERT INTO ${exports.SCRIBBLE_SCHEMA}.marks VALUES (1); RETURN true; END $$`,
|
|
80
|
+
`GRANT USAGE ON SCHEMA ${exports.SCRIBBLE_SCHEMA} TO ${exports.LOGIN.writer}`,
|
|
81
|
+
`GRANT INSERT ON ${exports.SCRIBBLE_SCHEMA}.marks TO ${exports.LOGIN.writer}`,
|
|
82
|
+
`CREATE DATABASE ${exports.LOCKED_DATABASE}`,
|
|
83
|
+
`REVOKE CONNECT ON DATABASE ${exports.LOCKED_DATABASE} FROM PUBLIC`,
|
|
84
|
+
];
|
|
85
|
+
function OwnerUrl() {
|
|
86
|
+
const url = process.env.PG_TEST_CLIENT_OWNER_URL;
|
|
87
|
+
if (!url) {
|
|
88
|
+
throw new Error("PG_TEST_CLIENT_OWNER_URL is set by the test setup");
|
|
89
|
+
}
|
|
90
|
+
return url;
|
|
91
|
+
}
|
|
92
|
+
async function RunAsOwner(statements) {
|
|
93
|
+
const client = new pg_1.Client({ connectionString: OwnerUrl() });
|
|
94
|
+
await client.connect();
|
|
95
|
+
try {
|
|
96
|
+
for (const statement of statements) {
|
|
97
|
+
await client.query(statement);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
finally {
|
|
101
|
+
await client.end();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async function CountAsOwner(relation) {
|
|
105
|
+
const client = new pg_1.Client({ connectionString: OwnerUrl() });
|
|
106
|
+
await client.connect();
|
|
107
|
+
try {
|
|
108
|
+
const { rows } = await client.query(`SELECT count(*)::int AS n FROM ${relation}`);
|
|
109
|
+
return rows[0].n;
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
await client.end();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
async function WithEnvironment(values, check) {
|
|
116
|
+
const previous = new Map(Object.keys(values).map((name) => [name, process.env[name]]));
|
|
117
|
+
Object.assign(process.env, values);
|
|
118
|
+
try {
|
|
119
|
+
await check();
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
for (const [name, value] of previous) {
|
|
123
|
+
if (value === undefined) {
|
|
124
|
+
delete process.env[name];
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
process.env[name] = value;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function WithProbeLogins() {
|
|
133
|
+
before(() => RunAsOwner(SETUP));
|
|
134
|
+
after(() => RunAsOwner(TEARDOWN));
|
|
135
|
+
}
|
|
136
|
+
function Altered(url, change) {
|
|
137
|
+
const target = new URL(url);
|
|
138
|
+
change(target);
|
|
139
|
+
return target.toString();
|
|
140
|
+
}
|
|
141
|
+
function LoginUrl(role, password = SECRET) {
|
|
142
|
+
return Altered(OwnerUrl(), (target) => {
|
|
143
|
+
target.username = role;
|
|
144
|
+
target.password = password;
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
function OnPort(url, port, host = "127.0.0.1") {
|
|
148
|
+
return Altered(url, (target) => {
|
|
149
|
+
target.hostname = host;
|
|
150
|
+
target.port = String(port);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function ServerPort() {
|
|
154
|
+
return Number(new URL(OwnerUrl()).port);
|
|
155
|
+
}
|
|
156
|
+
function Probe(url, signal = new AbortController().signal) {
|
|
157
|
+
return (0, probe_1.probe)({ url, timeoutMs: exports.TIMEOUT_MS, signal });
|
|
158
|
+
}
|
|
159
|
+
function SignedIn(answer) {
|
|
160
|
+
(0, chai_1.expect)(answer.outcome).to.equal("signed-in");
|
|
161
|
+
if (answer.outcome !== "signed-in") {
|
|
162
|
+
throw new Error("unreachable after the expectation");
|
|
163
|
+
}
|
|
164
|
+
return answer;
|
|
165
|
+
}
|
|
166
|
+
//# sourceMappingURL=probe-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe-fixture.js","sourceRoot":"","sources":["../../src/test-external/probe-fixture.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_1 = require("chai");
|
|
4
|
+
const probe_fixture_1 = require("./probe-fixture");
|
|
5
|
+
const relays_1 = require("./relays");
|
|
6
|
+
function WithoutPassword(url) {
|
|
7
|
+
return (0, probe_fixture_1.Altered)(url, (target) => {
|
|
8
|
+
target.password = "";
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
const SSL_REQUEST = Buffer.from([0, 0, 0, 8, 0x04, 0xd2, 0x16, 0x2f]);
|
|
12
|
+
function OnDatabase(url, database) {
|
|
13
|
+
return (0, probe_fixture_1.Altered)(url, (target) => {
|
|
14
|
+
target.pathname = `/${database}`;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
describe("the connection probe's refusals", function () {
|
|
18
|
+
this.timeout(60_000);
|
|
19
|
+
(0, probe_fixture_1.WithProbeLogins)();
|
|
20
|
+
it("refuses a wrong password as credentials", async () => {
|
|
21
|
+
const answer = await (0, probe_fixture_1.Probe)((0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.reader, "not-the-password"));
|
|
22
|
+
(0, chai_1.expect)(answer).to.include({ outcome: "refused", refusal: "credentials" });
|
|
23
|
+
});
|
|
24
|
+
it("refuses a login the server does not let in as host", async () => {
|
|
25
|
+
(0, chai_1.expect)(await (0, probe_fixture_1.Probe)((0, probe_fixture_1.LoginUrl)(probe_fixture_1.NO_LOGIN))).to.include({
|
|
26
|
+
outcome: "refused",
|
|
27
|
+
refusal: "host",
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
it("refuses a database the server does not have as database", async () => {
|
|
31
|
+
const url = OnDatabase((0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.reader), "antelopejs_missing");
|
|
32
|
+
(0, chai_1.expect)(await (0, probe_fixture_1.Probe)(url)).to.include({
|
|
33
|
+
outcome: "refused",
|
|
34
|
+
refusal: "database",
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
it("refuses a database the login may not connect to as database-denied", async () => {
|
|
38
|
+
const url = OnDatabase((0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.reader), probe_fixture_1.LOCKED_DATABASE);
|
|
39
|
+
(0, chai_1.expect)(await (0, probe_fixture_1.Probe)(url)).to.include({
|
|
40
|
+
outcome: "refused",
|
|
41
|
+
refusal: "database-denied",
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
it("refuses a URL without the password the server asks for as sign-in-required", async () => {
|
|
45
|
+
(0, chai_1.expect)(await (0, probe_fixture_1.Probe)(WithoutPassword((0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.reader)))).to.include({
|
|
46
|
+
outcome: "refused",
|
|
47
|
+
refusal: "sign-in-required",
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
it("never fills a password the URL lacks from PGPASSWORD", async () => {
|
|
51
|
+
const reader = (0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.reader);
|
|
52
|
+
await (0, probe_fixture_1.WithEnvironment)({ PGPASSWORD: new URL(reader).password }, async () => {
|
|
53
|
+
(0, chai_1.expect)(await (0, probe_fixture_1.Probe)(WithoutPassword(reader))).to.include({
|
|
54
|
+
outcome: "refused",
|
|
55
|
+
refusal: "sign-in-required",
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
it("sends nothing to a server asking for a cleartext password the URL lacks", async () => {
|
|
60
|
+
const server = await (0, relays_1.StartRecordingServer)(relays_1.CLEARTEXT_PASSWORD_REQUEST);
|
|
61
|
+
try {
|
|
62
|
+
await (0, probe_fixture_1.WithEnvironment)({ PGPASSWORD: "the probing process's own secret" }, async () => {
|
|
63
|
+
const url = WithoutPassword((0, probe_fixture_1.OnPort)((0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.reader), server.port));
|
|
64
|
+
(0, chai_1.expect)(await (0, probe_fixture_1.Probe)(url)).to.include({
|
|
65
|
+
outcome: "refused",
|
|
66
|
+
refusal: "sign-in-required",
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
(0, chai_1.expect)(server.received()).to.equal(0);
|
|
70
|
+
}
|
|
71
|
+
finally {
|
|
72
|
+
await server.close();
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
it("asks for TLS before anything else when the URL says ssl=no-verify", async () => {
|
|
76
|
+
const server = await (0, relays_1.StartRecordingServer)(relays_1.CLEARTEXT_PASSWORD_REQUEST);
|
|
77
|
+
try {
|
|
78
|
+
const url = (0, probe_fixture_1.Altered)((0, probe_fixture_1.OnPort)((0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.reader), server.port), (target) => {
|
|
79
|
+
target.searchParams.set("ssl", "no-verify");
|
|
80
|
+
});
|
|
81
|
+
await (0, probe_fixture_1.Probe)(url);
|
|
82
|
+
(0, chai_1.expect)(server.first()).to.deep.equal(SSL_REQUEST);
|
|
83
|
+
(0, chai_1.expect)(server.received()).to.equal(0);
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
await server.close();
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
it("refuses any other server error during the sign-in as other, with its message", async () => {
|
|
90
|
+
const url = (0, probe_fixture_1.Altered)((0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.reader), (target) => {
|
|
91
|
+
target.searchParams.set("options", "-c probe_bogus=1");
|
|
92
|
+
});
|
|
93
|
+
const answer = await (0, probe_fixture_1.Probe)(url);
|
|
94
|
+
(0, chai_1.expect)(answer).to.include({ outcome: "refused", refusal: "other" });
|
|
95
|
+
(0, chai_1.expect)(answer).to.have.property("message").that.contains("probe_bogus");
|
|
96
|
+
});
|
|
97
|
+
it("answers a port nothing listens on as unreachable, within the timeout", async () => {
|
|
98
|
+
const started = performance.now();
|
|
99
|
+
const answer = await (0, probe_fixture_1.Probe)((0, probe_fixture_1.OnPort)((0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.reader), await (0, relays_1.ClosedPort)()));
|
|
100
|
+
(0, chai_1.expect)(performance.now() - started).to.be.lessThan(probe_fixture_1.TIMEOUT_MS);
|
|
101
|
+
(0, chai_1.expect)(answer.outcome).to.equal("unreachable");
|
|
102
|
+
});
|
|
103
|
+
it("says why when every address of a host name refuses", async () => {
|
|
104
|
+
const port = await (0, relays_1.ClosedPort)();
|
|
105
|
+
const answer = await (0, probe_fixture_1.Probe)((0, probe_fixture_1.OnPort)((0, probe_fixture_1.LoginUrl)(probe_fixture_1.LOGIN.reader), port, "localhost"));
|
|
106
|
+
(0, chai_1.expect)(answer.outcome).to.equal("unreachable");
|
|
107
|
+
(0, chai_1.expect)(answer).to.have.property("message").that.contains("ECONNREFUSED");
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
//# sourceMappingURL=probe-refusals.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"probe-refusals.test.js","sourceRoot":"","sources":["../../src/test-external/probe-refusals.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|