@memberjunction/global 6.2.0-edge.4 → 6.2.0-edge.6

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.
Files changed (75) hide show
  1. package/dist/ClassFactory.d.ts +16 -3
  2. package/dist/ClassFactory.d.ts.map +1 -1
  3. package/dist/ClassFactory.js +112 -48
  4. package/dist/ClassFactory.js.map +1 -1
  5. package/dist/DeepDiff.d.ts +2 -0
  6. package/dist/DeepDiff.d.ts.map +1 -1
  7. package/dist/DeepDiff.js +40 -38
  8. package/dist/DeepDiff.js.map +1 -1
  9. package/dist/KeyedSerialTaskQueue.d.ts +18 -1
  10. package/dist/KeyedSerialTaskQueue.d.ts.map +1 -1
  11. package/dist/KeyedSerialTaskQueue.js +24 -3
  12. package/dist/KeyedSerialTaskQueue.js.map +1 -1
  13. package/dist/ObjectCache.d.ts +1 -0
  14. package/dist/ObjectCache.d.ts.map +1 -1
  15. package/dist/ObjectCache.js +14 -22
  16. package/dist/ObjectCache.js.map +1 -1
  17. package/dist/SQLExpressionValidator.d.ts +70 -41
  18. package/dist/SQLExpressionValidator.d.ts.map +1 -1
  19. package/dist/SQLExpressionValidator.js +183 -134
  20. package/dist/SQLExpressionValidator.js.map +1 -1
  21. package/dist/SQLScreeningScanner.d.ts +117 -0
  22. package/dist/SQLScreeningScanner.d.ts.map +1 -0
  23. package/dist/SQLScreeningScanner.js +475 -0
  24. package/dist/SQLScreeningScanner.js.map +1 -0
  25. package/dist/__tests__/FieldSecurityEgressCompliance.test.d.ts +2 -0
  26. package/dist/__tests__/FieldSecurityEgressCompliance.test.d.ts.map +1 -0
  27. package/dist/__tests__/FieldSecurityEgressCompliance.test.js +228 -0
  28. package/dist/__tests__/FieldSecurityEgressCompliance.test.js.map +1 -0
  29. package/dist/__tests__/KeyedSerialTaskQueue.test.js +92 -0
  30. package/dist/__tests__/KeyedSerialTaskQueue.test.js.map +1 -1
  31. package/dist/__tests__/ProofOfPossession.test.d.ts +2 -0
  32. package/dist/__tests__/ProofOfPossession.test.d.ts.map +1 -0
  33. package/dist/__tests__/ProofOfPossession.test.js +123 -0
  34. package/dist/__tests__/ProofOfPossession.test.js.map +1 -0
  35. package/dist/__tests__/SQLExpressionValidator.dialect.test.d.ts +2 -0
  36. package/dist/__tests__/SQLExpressionValidator.dialect.test.d.ts.map +1 -0
  37. package/dist/__tests__/SQLExpressionValidator.dialect.test.js +183 -0
  38. package/dist/__tests__/SQLExpressionValidator.dialect.test.js.map +1 -0
  39. package/dist/__tests__/SQLExpressionValidator.security.test.js +176 -2
  40. package/dist/__tests__/SQLExpressionValidator.security.test.js.map +1 -1
  41. package/dist/__tests__/SQLScreeningScanner.test.d.ts +2 -0
  42. package/dist/__tests__/SQLScreeningScanner.test.d.ts.map +1 -0
  43. package/dist/__tests__/SQLScreeningScanner.test.js +172 -0
  44. package/dist/__tests__/SQLScreeningScanner.test.js.map +1 -0
  45. package/dist/__tests__/SQLScreeningScanner.tokens.test.d.ts +2 -0
  46. package/dist/__tests__/SQLScreeningScanner.tokens.test.d.ts.map +1 -0
  47. package/dist/__tests__/SQLScreeningScanner.tokens.test.js +82 -0
  48. package/dist/__tests__/SQLScreeningScanner.tokens.test.js.map +1 -0
  49. package/dist/__tests__/UUIDCompliance.test.js +4 -4
  50. package/dist/__tests__/UUIDCompliance.test.js.map +1 -1
  51. package/dist/__tests__/UserScopedCacheKey.test.d.ts +2 -0
  52. package/dist/__tests__/UserScopedCacheKey.test.d.ts.map +1 -0
  53. package/dist/__tests__/UserScopedCacheKey.test.js +25 -0
  54. package/dist/__tests__/UserScopedCacheKey.test.js.map +1 -0
  55. package/dist/__tests__/util.valuesEqual.test.d.ts +2 -0
  56. package/dist/__tests__/util.valuesEqual.test.d.ts.map +1 -0
  57. package/dist/__tests__/util.valuesEqual.test.js +37 -0
  58. package/dist/__tests__/util.valuesEqual.test.js.map +1 -0
  59. package/dist/index.d.ts +3 -0
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +3 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/util/ProofOfPossession.d.ts +68 -0
  64. package/dist/util/ProofOfPossession.d.ts.map +1 -0
  65. package/dist/util/ProofOfPossession.js +163 -0
  66. package/dist/util/ProofOfPossession.js.map +1 -0
  67. package/dist/util/UserScopedCacheKey.d.ts +42 -0
  68. package/dist/util/UserScopedCacheKey.d.ts.map +1 -0
  69. package/dist/util/UserScopedCacheKey.js +49 -0
  70. package/dist/util/UserScopedCacheKey.js.map +1 -0
  71. package/dist/util.d.ts +25 -0
  72. package/dist/util.d.ts.map +1 -1
  73. package/dist/util.js +38 -0
  74. package/dist/util.js.map +1 -1
  75. package/package.json +1 -1
@@ -0,0 +1,228 @@
1
+ /**
2
+ * Field-Security Egress Compliance (source guard)
3
+ *
4
+ * Scans the code that hands entity values to someone outside the server process (GraphQL
5
+ * resolvers and the rest of the API server, REST handlers, realtime and agent sessions, the MCP
6
+ * and A2A servers, agents, communications, templates, search, messaging adapters and actions)
7
+ * for the calls that turn an entity object or a view result into plain values:
8
+ * - `.GetAll(`, `.GetDataObject(`, `.GetDataObjectJSON(`, `.To(`
9
+ * - `<entity>.Fields.map(f => f.Value)`
10
+ * - `JSON.stringify(<entity>)` and `JSON.stringify(<rows>)` (heuristic, below)
11
+ * - `res.json(…Results…)` / `res.send(…Results…)`: a view's rows written straight to an HTTP response
12
+ *
13
+ * An entity object built for a restricted user never holds a value that user is denied, so most
14
+ * of these calls are safe. They are flagged anyway because the object's width depends on WHO it
15
+ * was built for: an object loaded as the system user, taken from an engine cache, or created
16
+ * with no user carries every column, and serializing it to a caller leaks what field-level
17
+ * security denies them. Each flagged line must therefore say why it is safe, or route its values
18
+ * through `ProjectEntityValuesForUser` / `ProjectEntityValueRowsForUser` from `@memberjunction/core`.
19
+ *
20
+ * See guides/FIELD_LEVEL_SECURITY_GUIDE.md, "Building on field-level security".
21
+ *
22
+ * ## Allow comments
23
+ *
24
+ * A flagged line passes when the `//` comment directly above it carries `// fls-guard: <reason>`
25
+ * on a line of its own (the comment may run over several `//` lines). A marker trailing code does
26
+ * not count. Keep the reason short and specific, for example:
27
+ * - `// fls-guard: projected by ProjectEntityValuesForUser below`
28
+ * - `// fls-guard: loaded as the caller; width follows its user`
29
+ * - `// fls-guard: system-user-only resolver`
30
+ * A marker with no reason does not count.
31
+ *
32
+ * ## The JSON.stringify heuristic
33
+ *
34
+ * Types are not available to a text scan, so `JSON.stringify(x)` is flagged only when its first
35
+ * argument is a plain identifier or member path (no call, index or literal) whose LAST segment is
36
+ * named like an entity object: `entity`, `record`, `entityObject`, `fooEntity`, `fooRecord`,
37
+ * `fooEntityObject` (any case), or like a set of rows: `rows`, `results`, `records` (so
38
+ * `result.Results` counts). `JSON.stringify(result.EntityUpdateDates)` is not flagged. This misses
39
+ * values held under other names; it is a reminder that runs on every PR, not a proof.
40
+ *
41
+ * ## Scope
42
+ *
43
+ * In `MJServer/src`: `resolvers`, `rest`, `generic`, `agentSessions`, `realtimeProxy`,
44
+ * `realtimeSessions`, `realtimeWidget`, `services`, `index.ts` and `realtimeConfigUnits.ts`. Also
45
+ * `AI/MCPServer/src`, `AI/A2AServer/src`, `AI/Agents/src`, and every `src/` folder under `Actions/`,
46
+ * `Communication/`, `Templates/`, `SearchEngine/` and `MessagingAdapters/`. Tests, generated code,
47
+ * `dist/` and `.d.ts` files are skipped, as are pure comment lines and imports.
48
+ */
49
+ import { describe, it, expect } from 'vitest';
50
+ import * as fs from 'fs';
51
+ import * as path from 'path';
52
+ const PACKAGES_ROOT = path.resolve(__dirname, '..', '..', '..'); // packages/
53
+ /** Folders and files scanned, relative to packages/. A {@link SRC_ONLY_ROOTS} folder is walked for every nested `src/`. */
54
+ const SCAN_DIRS = [
55
+ 'MJServer/src/resolvers',
56
+ 'MJServer/src/rest',
57
+ 'MJServer/src/generic',
58
+ 'MJServer/src/agentSessions',
59
+ 'MJServer/src/realtimeProxy',
60
+ 'MJServer/src/realtimeSessions',
61
+ 'MJServer/src/realtimeWidget',
62
+ 'MJServer/src/services',
63
+ 'MJServer/src/index.ts',
64
+ 'MJServer/src/realtimeConfigUnits.ts',
65
+ 'AI/MCPServer/src',
66
+ 'AI/A2AServer/src',
67
+ 'AI/Agents/src',
68
+ 'Actions',
69
+ 'Communication',
70
+ 'Templates',
71
+ 'SearchEngine',
72
+ 'MessagingAdapters',
73
+ ];
74
+ /** Roots holding several packages: only files under a package's `src/` count. */
75
+ const SRC_ONLY_ROOTS = ['Actions', 'Communication', 'Templates', 'SearchEngine', 'MessagingAdapters'];
76
+ /** Calls that produce an entity's field values as plain data. */
77
+ const ACCESSOR_PATTERN = /\.(GetAll|GetDataObject|GetDataObjectJSON|To)\s*[<(]/;
78
+ /** `JSON.stringify(<path>)` where the last path segment is named like an entity object or a set of rows. */
79
+ const STRINGIFY_ENTITY_PATTERN = /JSON\.stringify\(\s*(?:[A-Za-z_$][\w$]*\??\.)*(?:entity|record|entityObject|rows|results|records|[A-Za-z_$][\w$]*(?:Entity|Record|EntityObject))\s*(?:\?\?\s*[\w$.]+\s*)?[,)]/i;
80
+ /** An entity's field values read in bulk: `.Fields.map(f => f.Value)`. */
81
+ const FIELD_VALUES_PATTERN = /\.Fields\.map\(\s*\(?\s*([A-Za-z_$][\w$]*)(?:\s*:\s*[\w.]+)?\s*\)?\s*=>\s*\1\.Value\b/;
82
+ /** A view's rows written straight to an HTTP response. */
83
+ const RESULTS_RESPONSE_PATTERN = /\b(?:res|response|reply)(?:\.status\([^)]*\))?\.(?:json|send)\([^;]*\bResults\b/;
84
+ /** The allow marker, with a non-empty reason after it. */
85
+ const ALLOW_COMMENT = /\/\/\s*fls-guard:\s*\S/;
86
+ const EXCLUDE_PATH_PATTERNS = [
87
+ /node_modules/,
88
+ /\/dist\//,
89
+ /\/generated\//,
90
+ /\.test\.ts$/,
91
+ /\.spec\.ts$/,
92
+ /__tests__/,
93
+ /\.d\.ts$/,
94
+ ];
95
+ function shouldScanFile(filePath) {
96
+ if (!filePath.endsWith('.ts'))
97
+ return false;
98
+ if (EXCLUDE_PATH_PATTERNS.some(p => p.test(filePath)))
99
+ return false;
100
+ // Under a multi-package root, only package source counts: skip scripts, fixtures and the like.
101
+ const relative = path.relative(PACKAGES_ROOT, filePath).split(path.sep).join('/');
102
+ const root = SRC_ONLY_ROOTS.find(r => relative.startsWith(`${r}/`));
103
+ return !root || relative.includes('/src/');
104
+ }
105
+ function findTsFiles(dir) {
106
+ const results = [];
107
+ if (!fs.existsSync(dir))
108
+ return results;
109
+ if (fs.statSync(dir).isFile())
110
+ return shouldScanFile(dir) ? [dir] : [];
111
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
112
+ const fullPath = path.join(dir, entry.name);
113
+ if (entry.isDirectory()) {
114
+ if (['node_modules', 'dist', '.git', 'generated', '__tests__'].includes(entry.name))
115
+ continue;
116
+ results.push(...findTsFiles(fullPath));
117
+ }
118
+ else if (shouldScanFile(fullPath)) {
119
+ results.push(fullPath);
120
+ }
121
+ }
122
+ return results;
123
+ }
124
+ /** True when `line` serializes an entity in a way this guard flags. Exported shape for the self-test. */
125
+ function lineSerializesEntity(line) {
126
+ const trimmed = line.trim();
127
+ if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*'))
128
+ return false;
129
+ if (trimmed.startsWith('import '))
130
+ return false;
131
+ return [ACCESSOR_PATTERN, STRINGIFY_ENTITY_PATTERN, FIELD_VALUES_PATTERN, RESULTS_RESPONSE_PATTERN].some(p => p.test(line));
132
+ }
133
+ /** True when `line` is a `//` comment and nothing else. */
134
+ function isCommentOnlyLine(line) {
135
+ return line.trim().startsWith('//');
136
+ }
137
+ /**
138
+ * True when the `//` comment lines directly above line `index` of `lines` carry the allow marker.
139
+ * A marker that trails code does not count, on the flagged line or above it: it would otherwise
140
+ * also shield the line after it.
141
+ */
142
+ function isAllowed(lines, index) {
143
+ for (let i = index - 1; i >= 0 && isCommentOnlyLine(lines[i]); i--) {
144
+ if (ALLOW_COMMENT.test(lines[i])) {
145
+ return true;
146
+ }
147
+ }
148
+ return false;
149
+ }
150
+ function scanLines(lines, file) {
151
+ const violations = [];
152
+ for (let i = 0; i < lines.length; i++) {
153
+ if (lineSerializesEntity(lines[i]) && !isAllowed(lines, i)) {
154
+ violations.push({ file, line: i + 1, content: lines[i].trim().substring(0, 160) });
155
+ }
156
+ }
157
+ return violations;
158
+ }
159
+ function scanFile(filePath) {
160
+ const lines = fs.readFileSync(filePath, 'utf-8').split('\n');
161
+ return scanLines(lines, path.relative(PACKAGES_ROOT, filePath));
162
+ }
163
+ describe('Field-Security Egress Compliance', () => {
164
+ describe('the heuristic', () => {
165
+ it('flags the entity accessors', () => {
166
+ expect(lineSerializesEntity('return entity.GetAll();')).toBe(true);
167
+ expect(lineSerializesEntity('const v = await record.GetDataObject({')).toBe(true);
168
+ expect(lineSerializesEntity('res.json(await e.GetDataObjectJSON())')).toBe(true);
169
+ });
170
+ it('flags JSON.stringify of something named like an entity', () => {
171
+ expect(lineSerializesEntity('JSON.stringify(entity)')).toBe(true);
172
+ expect(lineSerializesEntity('JSON.stringify(this.entityObject, null, 2)')).toBe(true);
173
+ expect(lineSerializesEntity('JSON.stringify(userRecord)')).toBe(true);
174
+ expect(lineSerializesEntity('JSON.stringify(params.fileEntity)')).toBe(true);
175
+ });
176
+ it('flags rows serialized or sent as a response, entity.To(), and Fields.map(f => f.Value)', () => {
177
+ expect(lineSerializesEntity('JSON.stringify(rows)')).toBe(true);
178
+ expect(lineSerializesEntity('JSON.stringify(result.Results, null, 2)')).toBe(true);
179
+ expect(lineSerializesEntity('Results: JSON.stringify(result.Results ?? null),')).toBe(true);
180
+ expect(lineSerializesEntity('res.json(result.Results);')).toBe(true);
181
+ expect(lineSerializesEntity('res.status(200).json({ rows: result.Results })')).toBe(true);
182
+ expect(lineSerializesEntity('return entity.To(schema);')).toBe(true);
183
+ expect(lineSerializesEntity('const v = record.To<typeof S>(S);')).toBe(true);
184
+ expect(lineSerializesEntity('const values = entity.Fields.map(f => f.Value);')).toBe(true);
185
+ expect(lineSerializesEntity('const values = entity.Fields.map((field) => field.Value);')).toBe(true);
186
+ });
187
+ it('does not flag plain data, comments or imports', () => {
188
+ expect(lineSerializesEntity('JSON.stringify(result.EntityUpdateDates)')).toBe(false);
189
+ expect(lineSerializesEntity('JSON.stringify(entities[i])')).toBe(false);
190
+ expect(lineSerializesEntity('x.ToString()')).toBe(false);
191
+ expect(lineSerializesEntity('entity.Fields.map(f => f.Name)')).toBe(false);
192
+ expect(lineSerializesEntity('res.json({ Success: true })')).toBe(false);
193
+ expect(lineSerializesEntity(' * Uses entity.GetAll() for scalar fields')).toBe(false);
194
+ expect(lineSerializesEntity('// entity.GetAll() is projected below')).toBe(false);
195
+ });
196
+ it('accepts an allow comment with a reason on a comment line directly above', () => {
197
+ expect(scanLines(['// fls-guard: projected below', 'x = e.GetAll();'], 'f')).toHaveLength(0);
198
+ expect(scanLines([' // fls-guard: indented', ' x = e.GetAll();'], 'f')).toHaveLength(0);
199
+ expect(scanLines(['// fls-guard: a reason that', '// runs over two lines', 'x = e.GetAll();'], 'f')).toHaveLength(0);
200
+ expect(scanLines(['// fls-guard:', 'x = e.GetAll();'], 'f')).toHaveLength(1);
201
+ expect(scanLines(['// fls-guard: two lines up', '', 'x = e.GetAll();'], 'f')).toHaveLength(1);
202
+ });
203
+ it('REGRESSION: does not accept a marker that trails code, on the line or the line above', () => {
204
+ expect(scanLines(['x = e.GetAll(); // fls-guard: system user only'], 'f')).toHaveLength(1);
205
+ expect(scanLines(['a = b.GetAll(); // fls-guard: system user only', 'x = e.GetAll();'], 'f')).toHaveLength(2);
206
+ expect(scanLines(['a = 1; // fls-guard: not a comment line', 'x = e.GetAll();'], 'f')).toHaveLength(1);
207
+ });
208
+ });
209
+ it('every entity serialization in a transport or action is projected or explains why it is safe', () => {
210
+ const files = SCAN_DIRS.flatMap(dir => findTsFiles(path.join(PACKAGES_ROOT, dir)));
211
+ expect(files.length).toBeGreaterThan(0);
212
+ const violations = files.flatMap(scanFile);
213
+ if (violations.length === 0)
214
+ return;
215
+ const report = violations.map(v => ` ${v.file}:${v.line}: ${v.content}`).join('\n');
216
+ expect.fail(`Found ${violations.length} entity serialization(s) with no field-security note:\n${report}\n\n` +
217
+ `An entity object loaded as the system user, taken from an engine cache, or created with no\n` +
218
+ `user holds every column, and serializing it to a caller leaks the fields they are denied.\n\n` +
219
+ `How to fix:\n` +
220
+ ` 1. Route the values through ProjectEntityValuesForUser / ProjectEntityValueRowsForUser\n` +
221
+ ` (@memberjunction/core) for the principal who receives them, then mark the line.\n` +
222
+ ` 2. If the object was built for that same principal (its width follows its user), or the path\n` +
223
+ ` is system-user-only, say so: \`// fls-guard: <reason>\` on a comment-only line in the\n` +
224
+ ` comment block directly above the flagged line. A marker trailing code does not count.\n\n` +
225
+ `See guides/FIELD_LEVEL_SECURITY_GUIDE.md, "Building on field-level security".`);
226
+ });
227
+ });
228
+ //# sourceMappingURL=FieldSecurityEgressCompliance.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldSecurityEgressCompliance.test.js","sourceRoot":"","sources":["../../src/__tests__/FieldSecurityEgressCompliance.test.ts"],"names":[],"mappings":"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"}
@@ -153,5 +153,97 @@ describe('KeyedSerialTaskQueue', () => {
153
153
  await q.flush();
154
154
  expect(order).toEqual(['child']);
155
155
  });
156
+ describe('Settled (#6014)', () => {
157
+ it('resolves only after the key\'s latest task settles', async () => {
158
+ const q = new KeyedSerialTaskQueue();
159
+ const key = {};
160
+ const order = [];
161
+ q.Enqueue(key, async () => { await delay(10); order.push('first'); });
162
+ q.Enqueue(key, async () => { await delay(10); order.push('second'); });
163
+ await q.Settled(key);
164
+ order.push('settled');
165
+ expect(order).toEqual(['first', 'second', 'settled']);
166
+ });
167
+ it('resolves at once for a key with no task', async () => {
168
+ const q = new KeyedSerialTaskQueue();
169
+ const other = {};
170
+ q.Enqueue(other, () => delay(50));
171
+ let settled = false;
172
+ void q.Settled({}).then(() => { settled = true; });
173
+ await Promise.resolve();
174
+ expect(settled).toBe(true);
175
+ await q.Flush();
176
+ });
177
+ it('resolves (does not reject) when the key\'s task failed', async () => {
178
+ const q = new KeyedSerialTaskQueue();
179
+ const key = {};
180
+ q.Enqueue(key, async () => { await delay(5); throw new Error('boom'); });
181
+ await expect(q.Settled(key)).resolves.toBeUndefined();
182
+ expect((await q.Flush()).rejections).toBe(1);
183
+ });
184
+ it('is a pure read — it neither enqueues nor delays later tasks', async () => {
185
+ const q = new KeyedSerialTaskQueue();
186
+ const key = {};
187
+ await q.Settled(key);
188
+ expect(await q.Flush()).toEqual({ failures: 0, rejections: 0 });
189
+ });
190
+ });
191
+ describe('Enqueue ready option (#6045)', () => {
192
+ it('does not run the task before `ready` resolves', async () => {
193
+ const q = new KeyedSerialTaskQueue();
194
+ const order = [];
195
+ let release;
196
+ const ready = new Promise((r) => { release = r; });
197
+ void q.Enqueue({}, async () => { order.push('task'); }, { ready });
198
+ await delay(10);
199
+ expect(order).toEqual([]);
200
+ release();
201
+ await q.Flush();
202
+ expect(order).toEqual(['task']);
203
+ });
204
+ it('makes Flush wait for a task still gated on `ready`', async () => {
205
+ const q = new KeyedSerialTaskQueue();
206
+ let release;
207
+ const ready = new Promise((r) => { release = r; });
208
+ void q.Enqueue({}, async () => undefined, { ready });
209
+ let flushed = false;
210
+ const flush = q.Flush().then(() => { flushed = true; });
211
+ await delay(10);
212
+ expect(flushed).toBe(false);
213
+ release();
214
+ await flush;
215
+ expect(flushed).toBe(true);
216
+ });
217
+ it('still runs the task when `ready` rejects', async () => {
218
+ const q = new KeyedSerialTaskQueue();
219
+ const order = [];
220
+ const ready = Promise.reject(new Error('log write failed'));
221
+ void q.Enqueue({}, async () => { order.push('task'); }, { ready });
222
+ await q.Flush();
223
+ expect(order).toEqual(['task']);
224
+ });
225
+ it('keeps per-key order when `ready` rejects before the prior task finishes', async () => {
226
+ const q = new KeyedSerialTaskQueue();
227
+ const key = {};
228
+ const order = [];
229
+ void q.Enqueue(key, async () => { await delay(20); order.push('prior'); });
230
+ void q.Enqueue(key, async () => { order.push('next'); }, { ready: Promise.reject(new Error('log write failed')) });
231
+ await q.Flush();
232
+ expect(order).toEqual(['prior', 'next']);
233
+ });
234
+ it('holds back only its own key, not other keys', async () => {
235
+ const q = new KeyedSerialTaskQueue();
236
+ const order = [];
237
+ let release;
238
+ const ready = new Promise((r) => { release = r; });
239
+ void q.Enqueue({}, async () => { order.push('gated'); }, { ready });
240
+ void q.Enqueue({}, async () => { order.push('free'); });
241
+ await delay(10);
242
+ expect(order).toEqual(['free']);
243
+ release();
244
+ await q.Flush();
245
+ expect(order).toEqual(['free', 'gated']);
246
+ });
247
+ });
156
248
  });
157
249
  //# sourceMappingURL=KeyedSerialTaskQueue.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"KeyedSerialTaskQueue.test.js","sourceRoot":"","sources":["../../src/__tests__/KeyedSerialTaskQueue.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"KeyedSerialTaskQueue.test.js","sourceRoot":"","sources":["../../src/__tests__/KeyedSerialTaskQueue.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ProofOfPossession.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProofOfPossession.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ProofOfPossession.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,123 @@
1
+ import { describe, it, expect, vi, afterEach } from 'vitest';
2
+ import { createHash } from 'node:crypto';
3
+ import { CreateProofOfPossessionKey, ComputeJwkThumbprint, CreateProofOfPossessionJwt, VerifyProofOfPossessionJwt, } from '../util/ProofOfPossession.js';
4
+ const URL_PATH = '/widget/session/refresh';
5
+ const URL = `https://api.example.com/base${URL_PATH}`;
6
+ const TOKEN = 'header.payload.signature';
7
+ const NOW = 1_792_713_600;
8
+ function b64url(bytes) {
9
+ return bytes.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
10
+ }
11
+ function decodePart(part) {
12
+ return JSON.parse(Buffer.from(part, 'base64url').toString('utf8'));
13
+ }
14
+ function encodePart(value) {
15
+ return Buffer.from(JSON.stringify(value)).toString('base64url');
16
+ }
17
+ async function proof(key, overrides = {}) {
18
+ return CreateProofOfPossessionJwt(key, {
19
+ Method: overrides.Method ?? 'POST',
20
+ Url: overrides.Url ?? URL,
21
+ AccessToken: overrides.AccessToken ?? TOKEN,
22
+ NowSeconds: overrides.NowSeconds ?? NOW,
23
+ });
24
+ }
25
+ /** Signs an arbitrary header and payload with the key, so a test can change one part and still pass the signature check. */
26
+ async function signed(key, header, payload) {
27
+ const input = `${encodePart(header)}.${encodePart(payload)}`;
28
+ const signature = await crypto.subtle.sign({ name: 'ECDSA', hash: 'SHA-256' }, key.PrivateKey, new TextEncoder().encode(input));
29
+ return `${input}.${Buffer.from(signature).toString('base64url')}`;
30
+ }
31
+ function verify(jwt, overrides = {}) {
32
+ return VerifyProofOfPossessionJwt(jwt, {
33
+ Method: 'POST',
34
+ PathSuffix: URL_PATH,
35
+ AccessToken: overrides.AccessToken ?? TOKEN,
36
+ NowSeconds: overrides.NowSeconds ?? NOW,
37
+ MaxSkewSeconds: 60,
38
+ });
39
+ }
40
+ describe('CreateProofOfPossessionKey', () => {
41
+ it('makes a P-256 key whose private half cannot be exported', async () => {
42
+ const key = await CreateProofOfPossessionKey();
43
+ expect(key.PrivateKey.extractable).toBe(false);
44
+ await expect(crypto.subtle.exportKey('jwk', key.PrivateKey)).rejects.toThrow();
45
+ expect(key.PublicJwk).toEqual({ kty: 'EC', crv: 'P-256', x: expect.any(String), y: expect.any(String) });
46
+ });
47
+ });
48
+ describe('without Web Crypto (a page outside a secure context)', () => {
49
+ afterEach(() => {
50
+ vi.unstubAllGlobals();
51
+ });
52
+ it('fails with a message a page author can act on: serve the page over HTTPS', async () => {
53
+ vi.stubGlobal('crypto', {});
54
+ await expect(CreateProofOfPossessionKey()).rejects.toThrow(/HTTPS/);
55
+ await expect(CreateProofOfPossessionKey()).rejects.not.toThrow(/Node\.js/);
56
+ });
57
+ });
58
+ describe('ComputeJwkThumbprint', () => {
59
+ it('is the RFC 7638 SHA-256 thumbprint: required members only, in lexicographic order', async () => {
60
+ const jwk = { kty: 'EC', crv: 'P-256', x: 'xValue', y: 'yValue' };
61
+ const expected = b64url(createHash('sha256').update('{"crv":"P-256","kty":"EC","x":"xValue","y":"yValue"}').digest());
62
+ await expect(ComputeJwkThumbprint(jwk)).resolves.toBe(expected);
63
+ });
64
+ });
65
+ describe('VerifyProofOfPossessionJwt', () => {
66
+ it('accepts a proof made by the key for this request and token, and returns the key thumbprint', async () => {
67
+ const key = await CreateProofOfPossessionKey();
68
+ const result = await verify(await proof(key));
69
+ expect(result).toEqual({ Valid: true, Thumbprint: await ComputeJwkThumbprint(key.PublicJwk) });
70
+ });
71
+ it('carries the standard DPoP header and claims', async () => {
72
+ const key = await CreateProofOfPossessionKey();
73
+ const [header, payload] = (await proof(key)).split('.');
74
+ expect(decodePart(header)).toEqual({ typ: 'dpop+jwt', alg: 'ES256', jwk: key.PublicJwk });
75
+ expect(decodePart(payload)).toMatchObject({ htm: 'POST', htu: URL, iat: NOW, jti: expect.any(String) });
76
+ });
77
+ it('refuses a proof whose signature does not match its key', async () => {
78
+ const key = await CreateProofOfPossessionKey();
79
+ const other = await CreateProofOfPossessionKey();
80
+ const [, payload, signature] = (await proof(key)).split('.');
81
+ const swapped = `${encodePart({ typ: 'dpop+jwt', alg: 'ES256', jwk: other.PublicJwk })}.${payload}.${signature}`;
82
+ expect((await verify(swapped)).Valid).toBe(false);
83
+ });
84
+ it('refuses a proof made for another token', async () => {
85
+ const key = await CreateProofOfPossessionKey();
86
+ expect(await verify(await proof(key, { AccessToken: 'another.token.value' }))).toEqual({ Valid: false, Reason: 'token_mismatch' });
87
+ });
88
+ it('refuses a proof made for another method or another endpoint', async () => {
89
+ const key = await CreateProofOfPossessionKey();
90
+ expect(await verify(await proof(key, { Method: 'GET' }))).toEqual({ Valid: false, Reason: 'request_mismatch' });
91
+ expect(await verify(await proof(key, { Url: 'https://api.example.com/widget/session' }))).toEqual({ Valid: false, Reason: 'request_mismatch' });
92
+ });
93
+ it('refuses a proof older or newer than the allowed skew', async () => {
94
+ const key = await CreateProofOfPossessionKey();
95
+ expect(await verify(await proof(key, { NowSeconds: NOW - 61 }))).toEqual({ Valid: false, Reason: 'stale' });
96
+ expect(await verify(await proof(key, { NowSeconds: NOW + 61 }))).toEqual({ Valid: false, Reason: 'stale' });
97
+ });
98
+ it('refuses a header that names another algorithm or type, or carries a private key, even when validly signed', async () => {
99
+ const key = await CreateProofOfPossessionKey();
100
+ const payload = decodePart((await proof(key)).split('.')[1]);
101
+ expect(await verify(await signed(key, { typ: 'dpop+jwt', alg: 'none', jwk: key.PublicJwk }, payload))).toEqual({ Valid: false, Reason: 'malformed' });
102
+ expect(await verify(await signed(key, { typ: 'JWT', alg: 'ES256', jwk: key.PublicJwk }, payload))).toEqual({ Valid: false, Reason: 'malformed' });
103
+ expect(await verify(await signed(key, { typ: 'dpop+jwt', alg: 'ES256', jwk: { ...key.PublicJwk, d: 'secret' } }, payload))).toEqual({ Valid: false, Reason: 'malformed' });
104
+ });
105
+ it('accepts a proof re-signed by its own key (control for the header and claim tests)', async () => {
106
+ const key = await CreateProofOfPossessionKey();
107
+ const [header, payload] = (await proof(key)).split('.');
108
+ expect((await verify(await signed(key, decodePart(header), decodePart(payload)))).Valid).toBe(true);
109
+ });
110
+ it('refuses a validly signed proof with no iat, or a non-numeric one', async () => {
111
+ const key = await CreateProofOfPossessionKey();
112
+ const header = decodePart((await proof(key)).split('.')[0]);
113
+ const { iat: _iat, ...withoutIat } = decodePart((await proof(key)).split('.')[1]);
114
+ expect(await verify(await signed(key, header, withoutIat))).toEqual({ Valid: false, Reason: 'stale' });
115
+ expect(await verify(await signed(key, header, { ...withoutIat, iat: String(NOW) }))).toEqual({ Valid: false, Reason: 'stale' });
116
+ });
117
+ it('refuses malformed input without throwing', async () => {
118
+ expect(await verify('')).toEqual({ Valid: false, Reason: 'malformed' });
119
+ expect(await verify('not-a-jwt')).toEqual({ Valid: false, Reason: 'malformed' });
120
+ expect(await verify('a.b.c')).toEqual({ Valid: false, Reason: 'malformed' });
121
+ });
122
+ });
123
+ //# sourceMappingURL=ProofOfPossession.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProofOfPossession.test.js","sourceRoot":"","sources":["../../src/__tests__/ProofOfPossession.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SQLExpressionValidator.dialect.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLExpressionValidator.dialect.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/SQLExpressionValidator.dialect.test.ts"],"names":[],"mappings":""}