@relayfile/relay-helpers 0.4.5 → 0.4.7
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 +49 -2
- package/dist/generic.d.ts.map +1 -1
- package/dist/generic.js +16 -11
- package/dist/generic.js.map +1 -1
- package/dist/github.d.ts.map +1 -1
- package/dist/github.js +9 -13
- package/dist/github.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/linear.d.ts.map +1 -1
- package/dist/linear.js +4 -13
- package/dist/linear.js.map +1 -1
- package/dist/preview-transport.test.js +414 -1
- package/dist/preview-transport.test.js.map +1 -1
- package/dist/relay-helpers.test.js +99 -1
- package/dist/relay-helpers.test.js.map +1 -1
- package/dist/transport.d.ts +6 -4
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +1 -0
- package/dist/transport.js.map +1 -1
- package/dist/types.d.ts +15 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -1
- package/dist/types.js.map +1 -1
- package/dist/write-authorizer.d.ts +45 -0
- package/dist/write-authorizer.d.ts.map +1 -0
- package/dist/write-authorizer.js +136 -0
- package/dist/write-authorizer.js.map +1 -0
- package/package.json +4 -4
|
@@ -1,12 +1,26 @@
|
|
|
1
1
|
import assert from 'node:assert/strict';
|
|
2
2
|
import test from 'node:test';
|
|
3
|
-
import { PreviewTransport, bindPreviewTransport, clearPreviewTransport, getProcessRelayTransport, githubClient, linearClient, relayClient, slackClient, setPreviewTransport, telegramClient, } from './index.js';
|
|
3
|
+
import { PreviewTransport, RelayWriteAuthorizationError, bindRelayWriteAuthorizer, bindPreviewTransport, clearPreviewTransport, getProcessRelayTransport, githubClient, linearClient, relayClient, slackClient, setPreviewTransport, telegramClient, runWithRelayWriteAuthorizer, } from './index.js';
|
|
4
|
+
import { executeRelayWrite } from './write-authorizer.js';
|
|
4
5
|
function failOnNetwork(counter) {
|
|
5
6
|
return async () => {
|
|
6
7
|
counter.calls += 1;
|
|
7
8
|
throw new Error('preview transport attempted a network request');
|
|
8
9
|
};
|
|
9
10
|
}
|
|
11
|
+
function barrier(parties) {
|
|
12
|
+
let waiting = 0;
|
|
13
|
+
let release;
|
|
14
|
+
const ready = new Promise((resolve) => {
|
|
15
|
+
release = resolve;
|
|
16
|
+
});
|
|
17
|
+
return async () => {
|
|
18
|
+
waiting += 1;
|
|
19
|
+
if (waiting === parties)
|
|
20
|
+
release?.();
|
|
21
|
+
await ready;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
10
24
|
test('Slack preview records a post and threaded reply with stable simulated receipts', async () => {
|
|
11
25
|
const preview = new PreviewTransport();
|
|
12
26
|
const network = { calls: 0 };
|
|
@@ -40,6 +54,13 @@ test('Slack preview records a post and threaded reply with stable simulated rece
|
|
|
40
54
|
thread_ts: preview.actions[0]?.simulatedReceipt?.id,
|
|
41
55
|
});
|
|
42
56
|
});
|
|
57
|
+
test('TransportPreviewAction is the canonical recorded action type', async () => {
|
|
58
|
+
const preview = new PreviewTransport();
|
|
59
|
+
await slackClient({ transport: preview }).post('C123', 'Ownership check');
|
|
60
|
+
const canonical = preview.actions[0];
|
|
61
|
+
const compatibilityAlias = canonical;
|
|
62
|
+
assert.strictEqual(compatibilityAlias, canonical);
|
|
63
|
+
});
|
|
43
64
|
test('Slack explicit thread replies record thread_ts from the parent simulated receipt', async () => {
|
|
44
65
|
const preview = new PreviewTransport();
|
|
45
66
|
const slack = slackClient({ transport: preview });
|
|
@@ -145,6 +166,398 @@ test('process preview binding outranks production-like ambient credentials', asy
|
|
|
145
166
|
}
|
|
146
167
|
}
|
|
147
168
|
});
|
|
169
|
+
test('final-write denial cannot be bypassed by an explicit PreviewTransport', async () => {
|
|
170
|
+
const authoredPreview = new PreviewTransport();
|
|
171
|
+
const network = { calls: 0 };
|
|
172
|
+
const deniedActions = [];
|
|
173
|
+
let authorizationCalls = 0;
|
|
174
|
+
const restoreAuthorization = bindRelayWriteAuthorizer((request) => {
|
|
175
|
+
authorizationCalls += 1;
|
|
176
|
+
deniedActions.push({
|
|
177
|
+
kind: 'provider.write',
|
|
178
|
+
status: 'denied',
|
|
179
|
+
provider: request.provider,
|
|
180
|
+
resource: request.resource,
|
|
181
|
+
path: request.path,
|
|
182
|
+
body: '[REDACTED]',
|
|
183
|
+
});
|
|
184
|
+
return { allowed: false, reason: 'local write policy denies provider writes' };
|
|
185
|
+
});
|
|
186
|
+
try {
|
|
187
|
+
await assert.rejects(() => slackClient({
|
|
188
|
+
transport: authoredPreview,
|
|
189
|
+
relayfileApiToken: 'rf_live_do_not_leak',
|
|
190
|
+
fetchImpl: failOnNetwork(network),
|
|
191
|
+
}).post('C999', 'secret message body'), (error) => {
|
|
192
|
+
assert.ok(error instanceof RelayWriteAuthorizationError);
|
|
193
|
+
assert.equal(error.code, 'RELAY_WRITE_DENIED');
|
|
194
|
+
assert.equal(error.provider, 'slack');
|
|
195
|
+
assert.equal(error.resource, 'messages');
|
|
196
|
+
assert.doesNotMatch(error.message, /secret|rf_live/u);
|
|
197
|
+
return true;
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
restoreAuthorization();
|
|
202
|
+
}
|
|
203
|
+
assert.equal(authorizationCalls, 1);
|
|
204
|
+
assert.equal(deniedActions.length, 1);
|
|
205
|
+
assert.equal(deniedActions[0]?.body, '[REDACTED]');
|
|
206
|
+
assert.equal(authoredPreview.actions.length, 0);
|
|
207
|
+
assert.equal(network.calls, 0);
|
|
208
|
+
});
|
|
209
|
+
test('final-write authorization redirects an explicit transport to the canonical preview', async () => {
|
|
210
|
+
const authoredPreview = new PreviewTransport();
|
|
211
|
+
const canonicalPreview = new PreviewTransport();
|
|
212
|
+
const restoreAuthorization = bindRelayWriteAuthorizer(() => ({
|
|
213
|
+
allowed: true,
|
|
214
|
+
transport: canonicalPreview,
|
|
215
|
+
}));
|
|
216
|
+
try {
|
|
217
|
+
const result = await slackClient({ transport: authoredPreview }).post('C123', 'canonical only');
|
|
218
|
+
assert.equal(result.ts, 'preview-slack-messages-0001');
|
|
219
|
+
}
|
|
220
|
+
finally {
|
|
221
|
+
restoreAuthorization();
|
|
222
|
+
}
|
|
223
|
+
assert.equal(authoredPreview.actions.length, 0);
|
|
224
|
+
assert.equal(canonicalPreview.actions.length, 1);
|
|
225
|
+
assert.equal(canonicalPreview.actions[0]?.provider, 'slack');
|
|
226
|
+
assert.equal(canonicalPreview.actions[0]?.resource, 'messages');
|
|
227
|
+
});
|
|
228
|
+
test('outer denial cannot be relaxed or redirected by later public bindings across package copies', async () => {
|
|
229
|
+
const duplicate = await import(`./write-authorizer.js?copy=${Date.now()}`);
|
|
230
|
+
const authoredPreview = new PreviewTransport();
|
|
231
|
+
const maliciousPreview = new PreviewTransport();
|
|
232
|
+
let outerCalls = 0;
|
|
233
|
+
let maliciousCalls = 0;
|
|
234
|
+
const restoreOuter = bindRelayWriteAuthorizer(async () => {
|
|
235
|
+
outerCalls += 1;
|
|
236
|
+
await Promise.resolve();
|
|
237
|
+
return { allowed: false, reason: 'immutable outer denial' };
|
|
238
|
+
});
|
|
239
|
+
const restoreMalicious = bindRelayWriteAuthorizer(() => {
|
|
240
|
+
maliciousCalls += 1;
|
|
241
|
+
return { allowed: true, transport: maliciousPreview };
|
|
242
|
+
});
|
|
243
|
+
try {
|
|
244
|
+
await assert.rejects(() => duplicate.executeRelayWrite(authoredPreview, {
|
|
245
|
+
provider: 'slack',
|
|
246
|
+
resource: 'messages',
|
|
247
|
+
parameters: { channelId: 'C-malicious' },
|
|
248
|
+
path: '/slack/channels/C-malicious/messages',
|
|
249
|
+
body: { text: 'must not escape' },
|
|
250
|
+
}), (error) => {
|
|
251
|
+
assert.equal(error.code, 'RELAY_WRITE_DENIED');
|
|
252
|
+
return true;
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
finally {
|
|
256
|
+
restoreMalicious();
|
|
257
|
+
restoreOuter();
|
|
258
|
+
}
|
|
259
|
+
assert.equal(outerCalls, 1);
|
|
260
|
+
assert.equal(maliciousCalls, 0);
|
|
261
|
+
assert.equal(authoredPreview.actions.length, 0);
|
|
262
|
+
assert.equal(maliciousPreview.actions.length, 0);
|
|
263
|
+
});
|
|
264
|
+
test('outer canonical transport cannot be replaced by a later public transport binding', async () => {
|
|
265
|
+
const transportEntry = await import('./transport.js');
|
|
266
|
+
const authoredPreview = new PreviewTransport();
|
|
267
|
+
const canonicalPreview = new PreviewTransport();
|
|
268
|
+
const maliciousPreview = new PreviewTransport();
|
|
269
|
+
let outerCalls = 0;
|
|
270
|
+
let maliciousCalls = 0;
|
|
271
|
+
const restoreOuter = bindRelayWriteAuthorizer(async () => {
|
|
272
|
+
outerCalls += 1;
|
|
273
|
+
await Promise.resolve();
|
|
274
|
+
return { allowed: true, transport: canonicalPreview };
|
|
275
|
+
});
|
|
276
|
+
const restoreMalicious = transportEntry.bindRelayWriteAuthorizer(async () => {
|
|
277
|
+
maliciousCalls += 1;
|
|
278
|
+
await Promise.resolve();
|
|
279
|
+
return { allowed: true, transport: maliciousPreview };
|
|
280
|
+
});
|
|
281
|
+
try {
|
|
282
|
+
const result = await slackClient({ transport: authoredPreview }).post('C123', 'outer wins');
|
|
283
|
+
assert.equal(result.ts, 'preview-slack-messages-0001');
|
|
284
|
+
}
|
|
285
|
+
finally {
|
|
286
|
+
restoreMalicious();
|
|
287
|
+
restoreOuter();
|
|
288
|
+
}
|
|
289
|
+
assert.equal(outerCalls, 1);
|
|
290
|
+
assert.equal(maliciousCalls, 1);
|
|
291
|
+
assert.equal(authoredPreview.actions.length, 0);
|
|
292
|
+
assert.equal(maliciousPreview.actions.length, 0);
|
|
293
|
+
assert.equal(canonicalPreview.actions.length, 1);
|
|
294
|
+
});
|
|
295
|
+
test('later bindings may tighten an outer canonical preview decision', async () => {
|
|
296
|
+
const authoredPreview = new PreviewTransport();
|
|
297
|
+
const canonicalPreview = new PreviewTransport();
|
|
298
|
+
let outerCalls = 0;
|
|
299
|
+
let innerCalls = 0;
|
|
300
|
+
const restoreOuter = bindRelayWriteAuthorizer(() => {
|
|
301
|
+
outerCalls += 1;
|
|
302
|
+
return { allowed: true, transport: canonicalPreview };
|
|
303
|
+
});
|
|
304
|
+
const restoreInner = bindRelayWriteAuthorizer(async () => {
|
|
305
|
+
innerCalls += 1;
|
|
306
|
+
await Promise.resolve();
|
|
307
|
+
return { allowed: false, reason: 'nested policy is stricter' };
|
|
308
|
+
});
|
|
309
|
+
try {
|
|
310
|
+
await assert.rejects(() => slackClient({ transport: authoredPreview }).post('C123', 'tightened'), RelayWriteAuthorizationError);
|
|
311
|
+
}
|
|
312
|
+
finally {
|
|
313
|
+
restoreInner();
|
|
314
|
+
restoreOuter();
|
|
315
|
+
}
|
|
316
|
+
assert.equal(outerCalls, 1);
|
|
317
|
+
assert.equal(innerCalls, 1);
|
|
318
|
+
assert.equal(authoredPreview.actions.length, 0);
|
|
319
|
+
assert.equal(canonicalPreview.actions.length, 0);
|
|
320
|
+
});
|
|
321
|
+
test('known global authorization symbol cannot be overwritten or cleared', async () => {
|
|
322
|
+
const key = Symbol.for('agentworkforce.relay-write-authorizer');
|
|
323
|
+
const registry = globalThis;
|
|
324
|
+
const coordinator = registry[key];
|
|
325
|
+
const descriptor = Object.getOwnPropertyDescriptor(globalThis, key);
|
|
326
|
+
const canonicalPreview = new PreviewTransport();
|
|
327
|
+
const authoredPreview = new PreviewTransport();
|
|
328
|
+
const restore = bindRelayWriteAuthorizer(() => ({ allowed: true, transport: canonicalPreview }));
|
|
329
|
+
try {
|
|
330
|
+
assert.ok(coordinator);
|
|
331
|
+
assert.equal(Object.isFrozen(coordinator), true);
|
|
332
|
+
assert.equal(descriptor?.configurable, false);
|
|
333
|
+
assert.equal(descriptor?.writable, false);
|
|
334
|
+
assert.throws(() => {
|
|
335
|
+
registry[key] = () => ({ allowed: true });
|
|
336
|
+
}, TypeError);
|
|
337
|
+
assert.equal(Reflect.deleteProperty(globalThis, key), false);
|
|
338
|
+
assert.strictEqual(registry[key], coordinator);
|
|
339
|
+
await slackClient({ transport: authoredPreview }).post('C123', 'registry survived');
|
|
340
|
+
}
|
|
341
|
+
finally {
|
|
342
|
+
restore();
|
|
343
|
+
}
|
|
344
|
+
assert.equal(canonicalPreview.actions.length, 1);
|
|
345
|
+
assert.equal(authoredPreview.actions.length, 0);
|
|
346
|
+
});
|
|
347
|
+
test('overlapping authorization scopes isolate deny and canonical preview decisions', async () => {
|
|
348
|
+
const synchronize = barrier(2);
|
|
349
|
+
const deniedAuthored = new PreviewTransport();
|
|
350
|
+
const previewAuthored = new PreviewTransport();
|
|
351
|
+
const canonicalPreview = new PreviewTransport();
|
|
352
|
+
let denyCalls = 0;
|
|
353
|
+
let previewCalls = 0;
|
|
354
|
+
let denialCaught = false;
|
|
355
|
+
await Promise.all([
|
|
356
|
+
runWithRelayWriteAuthorizer(async () => {
|
|
357
|
+
denyCalls += 1;
|
|
358
|
+
await Promise.resolve();
|
|
359
|
+
return { allowed: false, reason: 'deny scope' };
|
|
360
|
+
}, async () => {
|
|
361
|
+
await synchronize();
|
|
362
|
+
try {
|
|
363
|
+
await slackClient({ transport: deniedAuthored }).post('C-deny', 'blocked');
|
|
364
|
+
}
|
|
365
|
+
catch (error) {
|
|
366
|
+
denialCaught = error instanceof RelayWriteAuthorizationError;
|
|
367
|
+
}
|
|
368
|
+
}),
|
|
369
|
+
runWithRelayWriteAuthorizer(async () => {
|
|
370
|
+
previewCalls += 1;
|
|
371
|
+
await Promise.resolve();
|
|
372
|
+
return { allowed: true, transport: canonicalPreview };
|
|
373
|
+
}, async () => {
|
|
374
|
+
await synchronize();
|
|
375
|
+
const result = await slackClient({ transport: previewAuthored }).post('C-preview', 'isolated');
|
|
376
|
+
assert.equal(result.ts, 'preview-slack-messages-0001');
|
|
377
|
+
}),
|
|
378
|
+
]);
|
|
379
|
+
assert.equal(denialCaught, true);
|
|
380
|
+
assert.equal(denyCalls, 1);
|
|
381
|
+
assert.equal(previewCalls, 1);
|
|
382
|
+
assert.equal(deniedAuthored.actions.length, 0);
|
|
383
|
+
assert.equal(previewAuthored.actions.length, 0);
|
|
384
|
+
assert.equal(canonicalPreview.actions.length, 1);
|
|
385
|
+
assert.equal(canonicalPreview.actions[0]?.parameters?.channelId, 'C-preview');
|
|
386
|
+
});
|
|
387
|
+
test('custom transports and unknown provider/resource requests are denied before mutation', async () => {
|
|
388
|
+
const customCalls = { reads: 0, lists: 0, writes: 0 };
|
|
389
|
+
const customTransport = {
|
|
390
|
+
async read() {
|
|
391
|
+
customCalls.reads += 1;
|
|
392
|
+
return undefined;
|
|
393
|
+
},
|
|
394
|
+
async list() {
|
|
395
|
+
customCalls.lists += 1;
|
|
396
|
+
return [];
|
|
397
|
+
},
|
|
398
|
+
async write(request) {
|
|
399
|
+
customCalls.writes += 1;
|
|
400
|
+
return { path: request.path, absolutePath: request.path, receipt: { id: 'unsafe-receipt' } };
|
|
401
|
+
},
|
|
402
|
+
};
|
|
403
|
+
const deniedActions = [];
|
|
404
|
+
const restoreAuthorization = bindRelayWriteAuthorizer((request) => {
|
|
405
|
+
deniedActions.push({
|
|
406
|
+
kind: 'provider.write',
|
|
407
|
+
status: 'denied',
|
|
408
|
+
provider: request.provider,
|
|
409
|
+
resource: request.resource,
|
|
410
|
+
body: '[REDACTED]',
|
|
411
|
+
});
|
|
412
|
+
return { allowed: false };
|
|
413
|
+
});
|
|
414
|
+
try {
|
|
415
|
+
await assert.rejects(() => executeRelayWrite(customTransport, {
|
|
416
|
+
provider: 'future-provider',
|
|
417
|
+
resource: 'future-resource',
|
|
418
|
+
parameters: { targetId: 'target-1' },
|
|
419
|
+
path: '/future-provider/future-resource',
|
|
420
|
+
body: { token: 'provider_secret_must_not_leak' },
|
|
421
|
+
}), (error) => {
|
|
422
|
+
assert.ok(error instanceof RelayWriteAuthorizationError);
|
|
423
|
+
assert.equal(error.provider, 'future-provider');
|
|
424
|
+
assert.equal(error.resource, 'future-resource');
|
|
425
|
+
assert.doesNotMatch(error.message, /provider_secret/u);
|
|
426
|
+
return true;
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
finally {
|
|
430
|
+
restoreAuthorization();
|
|
431
|
+
}
|
|
432
|
+
assert.equal(deniedActions.length, 1);
|
|
433
|
+
assert.equal(deniedActions[0]?.body, '[REDACTED]');
|
|
434
|
+
assert.deepEqual(customCalls, { reads: 0, lists: 0, writes: 0 });
|
|
435
|
+
});
|
|
436
|
+
test('custom transports and unknown provider/resource requests redirect to the canonical preview', async () => {
|
|
437
|
+
let customWrites = 0;
|
|
438
|
+
const customTransport = {
|
|
439
|
+
async read() {
|
|
440
|
+
return undefined;
|
|
441
|
+
},
|
|
442
|
+
async list() {
|
|
443
|
+
return [];
|
|
444
|
+
},
|
|
445
|
+
async write(request) {
|
|
446
|
+
customWrites += 1;
|
|
447
|
+
return { path: request.path, absolutePath: request.path, receipt: { id: 'unsafe-receipt' } };
|
|
448
|
+
},
|
|
449
|
+
};
|
|
450
|
+
const canonicalPreview = new PreviewTransport();
|
|
451
|
+
const restoreAuthorization = bindRelayWriteAuthorizer(() => ({
|
|
452
|
+
allowed: true,
|
|
453
|
+
transport: canonicalPreview,
|
|
454
|
+
}));
|
|
455
|
+
try {
|
|
456
|
+
const result = await executeRelayWrite(customTransport, {
|
|
457
|
+
provider: 'future-provider',
|
|
458
|
+
resource: 'future-resource',
|
|
459
|
+
parameters: { targetId: 'target-1' },
|
|
460
|
+
path: '/future-provider/future-resource',
|
|
461
|
+
body: { value: 'preview only' },
|
|
462
|
+
});
|
|
463
|
+
assert.equal(result.receipt?.id, 'preview-future-provider-future-resource-0001');
|
|
464
|
+
}
|
|
465
|
+
finally {
|
|
466
|
+
restoreAuthorization();
|
|
467
|
+
}
|
|
468
|
+
assert.equal(customWrites, 0);
|
|
469
|
+
assert.equal(canonicalPreview.actions.length, 1);
|
|
470
|
+
assert.equal(canonicalPreview.actions[0]?.provider, 'future-provider');
|
|
471
|
+
assert.equal(canonicalPreview.actions[0]?.resource, 'future-resource');
|
|
472
|
+
});
|
|
473
|
+
test('bespoke direct write paths also honor the canonical preview override', async () => {
|
|
474
|
+
const authoredPreview = new PreviewTransport();
|
|
475
|
+
const canonicalPreview = new PreviewTransport();
|
|
476
|
+
const restoreAuthorization = bindRelayWriteAuthorizer(() => ({
|
|
477
|
+
allowed: true,
|
|
478
|
+
transport: canonicalPreview,
|
|
479
|
+
}));
|
|
480
|
+
try {
|
|
481
|
+
await githubClient({ transport: authoredPreview }).updateRef({
|
|
482
|
+
owner: 'AgentWorkforce',
|
|
483
|
+
repo: 'cloud',
|
|
484
|
+
ref: 'main',
|
|
485
|
+
sha: 'abc123',
|
|
486
|
+
});
|
|
487
|
+
await linearClient({ transport: authoredPreview }).updateIssue('ISS-1', { title: 'Updated' });
|
|
488
|
+
await linearClient({ transport: authoredPreview }).updateLabel('LABEL-1', { name: 'priority' });
|
|
489
|
+
}
|
|
490
|
+
finally {
|
|
491
|
+
restoreAuthorization();
|
|
492
|
+
}
|
|
493
|
+
assert.equal(authoredPreview.actions.length, 0);
|
|
494
|
+
assert.deepEqual(canonicalPreview.actions.map(({ provider, resource }) => ({ provider, resource })), [
|
|
495
|
+
{ provider: 'github', resource: 'refs' },
|
|
496
|
+
{ provider: 'linear', resource: 'issues' },
|
|
497
|
+
{ provider: 'linear', resource: 'labels' },
|
|
498
|
+
]);
|
|
499
|
+
});
|
|
500
|
+
test('write authorizer bindings restore in LIFO order without affecting reads or lists', async () => {
|
|
501
|
+
const authoredPreview = new PreviewTransport({
|
|
502
|
+
fixtures: {
|
|
503
|
+
'/linear/issues': [{ id: 'ISS-1' }],
|
|
504
|
+
'/github/repos/o/r/pulls/7/merge.json': { merged: false },
|
|
505
|
+
},
|
|
506
|
+
});
|
|
507
|
+
const canonicalPreview = new PreviewTransport();
|
|
508
|
+
let outerCalls = 0;
|
|
509
|
+
let innerCalls = 0;
|
|
510
|
+
const restoreOuter = bindRelayWriteAuthorizer(() => {
|
|
511
|
+
outerCalls += 1;
|
|
512
|
+
return { allowed: true, transport: canonicalPreview };
|
|
513
|
+
});
|
|
514
|
+
const restoreInner = bindRelayWriteAuthorizer(() => {
|
|
515
|
+
innerCalls += 1;
|
|
516
|
+
return { allowed: true, transport: canonicalPreview };
|
|
517
|
+
});
|
|
518
|
+
try {
|
|
519
|
+
const issues = await linearClient({ transport: authoredPreview }).listIssues();
|
|
520
|
+
const merge = await relayClient('github', { transport: authoredPreview }).read('merge', { owner: 'o', repo: 'r', pullNumber: 7 });
|
|
521
|
+
assert.deepEqual(issues, [{ id: 'ISS-1' }]);
|
|
522
|
+
assert.deepEqual(merge, { merged: false });
|
|
523
|
+
assert.equal(innerCalls, 0);
|
|
524
|
+
assert.equal(outerCalls, 0);
|
|
525
|
+
await slackClient({ transport: authoredPreview }).post('C1', 'nested preview');
|
|
526
|
+
restoreInner();
|
|
527
|
+
await slackClient({ transport: authoredPreview }).post('C1', 'outer preview');
|
|
528
|
+
}
|
|
529
|
+
finally {
|
|
530
|
+
restoreInner();
|
|
531
|
+
restoreOuter();
|
|
532
|
+
}
|
|
533
|
+
await slackClient({ transport: authoredPreview }).post('C1', 'restored authored transport');
|
|
534
|
+
assert.equal(innerCalls, 1);
|
|
535
|
+
assert.equal(outerCalls, 2);
|
|
536
|
+
assert.equal(canonicalPreview.actions.length, 2);
|
|
537
|
+
assert.equal(authoredPreview.actions.filter((action) => action.kind === 'provider.write').length, 1);
|
|
538
|
+
});
|
|
539
|
+
test('out-of-order idempotent restores leave no stale authorizer', async () => {
|
|
540
|
+
const authoredPreview = new PreviewTransport();
|
|
541
|
+
let outerCalls = 0;
|
|
542
|
+
let innerCalls = 0;
|
|
543
|
+
const restoreOuter = bindRelayWriteAuthorizer(() => {
|
|
544
|
+
outerCalls += 1;
|
|
545
|
+
return { allowed: false };
|
|
546
|
+
});
|
|
547
|
+
const restoreInner = bindRelayWriteAuthorizer(() => {
|
|
548
|
+
innerCalls += 1;
|
|
549
|
+
return { allowed: true };
|
|
550
|
+
});
|
|
551
|
+
restoreOuter();
|
|
552
|
+
restoreOuter();
|
|
553
|
+
restoreInner();
|
|
554
|
+
restoreInner();
|
|
555
|
+
const result = await slackClient({ transport: authoredPreview }).post('C1', 'after cleanup');
|
|
556
|
+
assert.equal(result.ts, 'preview-slack-messages-0001');
|
|
557
|
+
assert.equal(outerCalls, 0);
|
|
558
|
+
assert.equal(innerCalls, 0);
|
|
559
|
+
assert.equal(authoredPreview.actions.length, 1);
|
|
560
|
+
});
|
|
148
561
|
test('clearPreviewTransport fully clears the shared symbol binding', () => {
|
|
149
562
|
const preview = new PreviewTransport();
|
|
150
563
|
setPreviewTransport(preview);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview-transport.test.js","sourceRoot":"","sources":["../src/preview-transport.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"preview-transport.test.js","sourceRoot":"","sources":["../src/preview-transport.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ import { RelayfileWritebackPendingError, RelayfileWritebackReceiptError } from '
|
|
|
8
8
|
import { WRITEBACK_PATH_CATALOG } from '@relayfile/adapter-core/writeback-paths';
|
|
9
9
|
import { linearByUuidAliasPath } from '@relayfile/adapter-linear/path-mapper';
|
|
10
10
|
import * as helpers from './index.js';
|
|
11
|
-
import { githubClient, linearClient, notionClient, providerClient, relayClient, slackClient, telegramClient, telegramReceiptTs, } from './index.js';
|
|
11
|
+
import { PreviewTransport, RelayWriteAuthorizationError, bindRelayWriteAuthorizer, githubClient, linearClient, notionClient, providerClient, relayClient, slackClient, telegramClient, telegramReceiptTs, } from './index.js';
|
|
12
12
|
const clientExportName = (provider) => `${provider.replace(/-([a-z])/g, (_m, c) => c.toUpperCase())}Client`;
|
|
13
13
|
/** Fire-and-forget client bound to a throwaway mount; no writeback worker runs. */
|
|
14
14
|
async function mount() {
|
|
@@ -28,6 +28,39 @@ test('relayClient.path resolves catalog paths and write drops a collection draft
|
|
|
28
28
|
const draft = await onlyJsonIn(path.join(root, 'linear/issues/ISS-1/comments'));
|
|
29
29
|
assert.deepEqual(draft.body, { body: 'hi' });
|
|
30
30
|
});
|
|
31
|
+
test('final-write authorization redirects the native VFS fallback before filesystem mutation', async () => {
|
|
32
|
+
const { root, opts } = await mount();
|
|
33
|
+
const canonicalPreview = new PreviewTransport();
|
|
34
|
+
const restoreAuthorization = bindRelayWriteAuthorizer(() => ({
|
|
35
|
+
allowed: true,
|
|
36
|
+
transport: canonicalPreview,
|
|
37
|
+
}));
|
|
38
|
+
try {
|
|
39
|
+
await relayClient('linear', opts).write('comments', { issueId: 'ISS-redirect' }, { body: 'preview' });
|
|
40
|
+
}
|
|
41
|
+
finally {
|
|
42
|
+
restoreAuthorization();
|
|
43
|
+
}
|
|
44
|
+
assert.deepEqual(await readdir(root), []);
|
|
45
|
+
assert.equal(canonicalPreview.actions.length, 1);
|
|
46
|
+
assert.equal(canonicalPreview.actions[0]?.path.startsWith('/linear/issues/ISS-redirect/comments/'), true);
|
|
47
|
+
});
|
|
48
|
+
test('final-write denial rejects the native VFS fallback before filesystem mutation', async () => {
|
|
49
|
+
const { root, opts } = await mount();
|
|
50
|
+
let deniedActions = 0;
|
|
51
|
+
const restoreAuthorization = bindRelayWriteAuthorizer(() => {
|
|
52
|
+
deniedActions += 1;
|
|
53
|
+
return { allowed: false };
|
|
54
|
+
});
|
|
55
|
+
try {
|
|
56
|
+
await assert.rejects(() => relayClient('linear', opts).write('comments', { issueId: 'ISS-denied' }, { body: 'never written' }), RelayWriteAuthorizationError);
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
restoreAuthorization();
|
|
60
|
+
}
|
|
61
|
+
assert.equal(deniedActions, 1);
|
|
62
|
+
assert.deepEqual(await readdir(root), []);
|
|
63
|
+
});
|
|
31
64
|
test('relayClient.write writes item (.json) resources to the exact path', async () => {
|
|
32
65
|
const { root, opts } = await mount();
|
|
33
66
|
const gh = relayClient('github', opts);
|
|
@@ -362,6 +395,71 @@ test('src/generated/clients.ts is in sync with the catalog', async () => {
|
|
|
362
395
|
const committed = await readFile(path.join(pkgRoot, 'src/generated/clients.ts'), 'utf8');
|
|
363
396
|
assert.equal(committed, renderClients(), 'generated clients are stale — run `npm run gen -w @relayfile/relay-helpers`');
|
|
364
397
|
});
|
|
398
|
+
test('all helper write sites converge on the final-write authorization boundary', async () => {
|
|
399
|
+
const pkgRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
400
|
+
const srcRoot = path.join(pkgRoot, 'src');
|
|
401
|
+
const { findWriteBoundaryViolations, formatWriteBoundaryViolations } = await import(pathToFileURL(path.join(pkgRoot, 'scripts/verify-write-boundary.mjs')).href);
|
|
402
|
+
const violations = await findWriteBoundaryViolations({ sourceRoot: srcRoot });
|
|
403
|
+
assert.deepEqual(violations, [], `helper write paths bypass the final-write authorizer:\n${formatWriteBoundaryViolations(violations)}`);
|
|
404
|
+
});
|
|
405
|
+
test('write-boundary guard rejects nested renamed, bracket, destructured, aliased, and VFS canaries', async () => {
|
|
406
|
+
const pkgRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
407
|
+
const { findWriteBoundaryViolations } = await import(pathToFileURL(path.join(pkgRoot, 'scripts/verify-write-boundary.mjs')).href);
|
|
408
|
+
const canaryRoot = await mkdtemp(path.join(tmpdir(), 'relay-write-boundary-canary-'));
|
|
409
|
+
const nestedRoot = path.join(canaryRoot, 'future/nested');
|
|
410
|
+
await mkdir(nestedRoot, { recursive: true });
|
|
411
|
+
await writeFile(path.join(nestedRoot, 'bypass.ts'), `
|
|
412
|
+
import { writeJsonFile as persist } from '@relayfile/adapter-core/vfs-client';
|
|
413
|
+
|
|
414
|
+
interface Request {
|
|
415
|
+
provider: string;
|
|
416
|
+
resource: string;
|
|
417
|
+
parameters: Record<string, string>;
|
|
418
|
+
path: string;
|
|
419
|
+
body: unknown;
|
|
420
|
+
}
|
|
421
|
+
interface FutureTransport {
|
|
422
|
+
write(request: Request): Promise<unknown>;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
export async function renamed(selectedTransport: FutureTransport, request: Request) {
|
|
426
|
+
await selectedTransport.write(request);
|
|
427
|
+
await selectedTransport['write'](request);
|
|
428
|
+
const { write: destructured } = selectedTransport;
|
|
429
|
+
await destructured(request);
|
|
430
|
+
const aliased = selectedTransport.write;
|
|
431
|
+
await aliased(request);
|
|
432
|
+
await persist(
|
|
433
|
+
{},
|
|
434
|
+
'future',
|
|
435
|
+
'write.future',
|
|
436
|
+
'/future/path.json',
|
|
437
|
+
request.body,
|
|
438
|
+
);
|
|
439
|
+
}
|
|
440
|
+
`);
|
|
441
|
+
const nestedAuthorizerPath = path.join(nestedRoot, 'write-authorizer.ts');
|
|
442
|
+
await writeFile(nestedAuthorizerPath, `
|
|
443
|
+
interface Request {
|
|
444
|
+
provider: string;
|
|
445
|
+
resource: string;
|
|
446
|
+
parameters: Record<string, string>;
|
|
447
|
+
path: string;
|
|
448
|
+
body: unknown;
|
|
449
|
+
}
|
|
450
|
+
interface FutureTransport {
|
|
451
|
+
write(request: Request): Promise<unknown>;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
export async function nestedAuthorizerBypass(transport: FutureTransport, request: Request) {
|
|
455
|
+
await transport.write(request);
|
|
456
|
+
}
|
|
457
|
+
`);
|
|
458
|
+
const violations = await findWriteBoundaryViolations({ sourceRoot: canaryRoot });
|
|
459
|
+
assert.ok(violations.filter((violation) => violation.kind === 'raw-transport-write').length >= 4, `expected every raw transport canary to fail: ${JSON.stringify(violations)}`);
|
|
460
|
+
assert.ok(violations.some((violation) => violation.kind.startsWith('native-vfs-write')), `expected multiline aliased VFS canary to fail: ${JSON.stringify(violations)}`);
|
|
461
|
+
assert.ok(violations.some((violation) => violation.kind === 'raw-transport-write' && violation.file === nestedAuthorizerPath), `expected nested write-authorizer.ts canary to fail: ${JSON.stringify(violations)}`);
|
|
462
|
+
});
|
|
365
463
|
test('a named resource-keyed client resolves and writes catalog paths', async () => {
|
|
366
464
|
const { root, opts } = await mount();
|
|
367
465
|
const notion = notionClient(opts);
|