@substrat-run/contract-tests 0.146.0 → 0.148.0

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 (70) hide show
  1. package/dist/bind-module.d.ts +4 -0
  2. package/dist/bind-module.d.ts.map +1 -1
  3. package/dist/capability-expiry-suite.d.ts.map +1 -1
  4. package/dist/capability-expiry-suite.js +6 -4
  5. package/dist/capability-expiry-suite.js.map +1 -1
  6. package/dist/counter-runner.d.ts +22 -0
  7. package/dist/counter-runner.d.ts.map +1 -0
  8. package/dist/counter-runner.js +96 -0
  9. package/dist/counter-runner.js.map +1 -0
  10. package/dist/derived-module.d.ts +4 -0
  11. package/dist/derived-module.d.ts.map +1 -1
  12. package/dist/entity-state-module.d.ts +8 -0
  13. package/dist/entity-state-module.d.ts.map +1 -1
  14. package/dist/entity-trash-module.d.ts +4 -0
  15. package/dist/entity-trash-module.d.ts.map +1 -1
  16. package/dist/erasure-module.d.ts +4 -0
  17. package/dist/erasure-module.d.ts.map +1 -1
  18. package/dist/index.d.ts +6 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +7 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/job-run-suite.d.ts.map +1 -1
  23. package/dist/job-run-suite.js +4 -0
  24. package/dist/job-run-suite.js.map +1 -1
  25. package/dist/modules.d.ts +124 -0
  26. package/dist/modules.d.ts.map +1 -1
  27. package/dist/modules.js +4 -0
  28. package/dist/modules.js.map +1 -1
  29. package/dist/permission-suite.d.ts.map +1 -1
  30. package/dist/permission-suite.js +19 -0
  31. package/dist/permission-suite.js.map +1 -1
  32. package/dist/schedule-suite.d.ts.map +1 -1
  33. package/dist/schedule-suite.js +1 -0
  34. package/dist/schedule-suite.js.map +1 -1
  35. package/dist/scope-host-suite.d.ts.map +1 -1
  36. package/dist/scope-host-suite.js +223 -0
  37. package/dist/scope-host-suite.js.map +1 -1
  38. package/dist/scope-store-runner-suite.d.ts +46 -0
  39. package/dist/scope-store-runner-suite.d.ts.map +1 -0
  40. package/dist/scope-store-runner-suite.js +187 -0
  41. package/dist/scope-store-runner-suite.js.map +1 -0
  42. package/dist/scope-store-suite.d.ts +13 -0
  43. package/dist/scope-store-suite.d.ts.map +1 -0
  44. package/dist/scope-store-suite.js +557 -0
  45. package/dist/scope-store-suite.js.map +1 -0
  46. package/dist/sql-limits-suite.d.ts.map +1 -1
  47. package/dist/sql-limits-suite.js +50 -1
  48. package/dist/sql-limits-suite.js.map +1 -1
  49. package/dist/stamps-module.d.ts +4 -0
  50. package/dist/stamps-module.d.ts.map +1 -1
  51. package/dist/store-kind-release-suite.d.ts +12 -0
  52. package/dist/store-kind-release-suite.d.ts.map +1 -0
  53. package/dist/store-kind-release-suite.js +353 -0
  54. package/dist/store-kind-release-suite.js.map +1 -0
  55. package/dist/subject-erasure-suite.d.ts.map +1 -1
  56. package/dist/subject-erasure-suite.js +15 -0
  57. package/dist/subject-erasure-suite.js.map +1 -1
  58. package/dist/system-switch-suite.js +1 -1
  59. package/dist/system-switch-suite.js.map +1 -1
  60. package/dist/upload-link-module.d.ts +168 -0
  61. package/dist/upload-link-module.d.ts.map +1 -0
  62. package/dist/upload-link-module.js +95 -0
  63. package/dist/upload-link-module.js.map +1 -0
  64. package/dist/upload-link-suite.d.ts +3 -0
  65. package/dist/upload-link-suite.d.ts.map +1 -0
  66. package/dist/upload-link-suite.js +328 -0
  67. package/dist/upload-link-suite.js.map +1 -0
  68. package/dist/vertical-events-suite.d.ts +8 -0
  69. package/dist/vertical-events-suite.d.ts.map +1 -1
  70. package/package.json +3 -3
@@ -0,0 +1,328 @@
1
+ /**
2
+ * Contract suite for upload links — `ctx.attachments.mintUploadUrl` and the host's
3
+ * `inspectUploadLink` / `redeemUploadLink` that spend one.
4
+ *
5
+ * What it pins, in one sentence: **a link admits exactly ONE file to exactly ONE entity,
6
+ * once, within its time box and its policy, written by the same attachment write any upload
7
+ * takes — authored by the principal who minted it, checked against the target's write key as
8
+ * them at redemption — and every failure leaves the link unspent and nothing stored.**
9
+ *
10
+ * Every refusal is paired with the allow beside it, so a surface that refused everything
11
+ * cannot pass:
12
+ *
13
+ * 1. **The mint.** A caller with the write key mints; one without is refused and no row exists.
14
+ * A target that declares no `uploadLinks`, an undeclared type, a size above the target's,
15
+ * and a TTL past the hour are refused. An operation's own lock, decided before the mint,
16
+ * stops it. Defaults: ten minutes.
17
+ * 2. **The redemption.** The file lands as an ordinary attachment — bytes intact, `createdBy`
18
+ * the minter, listed and opened by the minter, `attachment.added` on the spine — and the
19
+ * link records the attachment it produced.
20
+ * 3. **Single use.** The second redemption is `upload_link_gone` and adds nothing.
21
+ * 4. **Expiry and revocation.** A link past its time, and a revoked one, are `upload_link_gone`.
22
+ * 5. **One target.** A redemption naming another entity — or another type — than the link was
23
+ * minted for is refused WITHOUT spending the link.
24
+ * 6. **The policy.** Oversize and a disallowed type are refused without spending the link, and
25
+ * the same link then takes a conforming file. A fixed file name overrides the uploader's.
26
+ * 7. **The minter, now.** Taking the minter's write key away after the mint refuses the
27
+ * redemption and leaves the link unspent; giving it back allows it.
28
+ * 8. **The audit trail and the secret.** Minted, added and redeemed are on the spine in that
29
+ * order, as the minter; the secret is stored nowhere (its hash is) and a module that tries
30
+ * to persist it is refused.
31
+ * 9. **A probe learns nothing.** An unknown or malformed secret is `not_found`, always.
32
+ * 10. **A copy has no links.** A fork made from a dump never honours the source's link, which
33
+ * keeps working at the source; a restore into the scope the backup came from keeps it.
34
+ *
35
+ * The expiry TRANSITION runs on a real second here, since a Durable Object takes no injected
36
+ * clock (#956); the shortest TTL is one second.
37
+ */
38
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
39
+ import { errorCodeOf, platformActorId, principalId, scopeId, tenantId, } from '@substrat-run/contracts';
40
+ import { UPLOAD_LINK_GONE, UPLOAD_LINK_TOO_LARGE, UPLOAD_LINK_TYPE_REFUSED, UPLOAD_LINK_WRONG_TARGET, capabilityTokenHash, ulid, } from '@substrat-run/kernel';
41
+ import { UPL_MAX_BYTES, UPL_READ, UPL_WRITE, uploadLinkMod } from './upload-link-module.js';
42
+ const bytes = (s) => new TextEncoder().encode(s);
43
+ const text = (b) => new TextDecoder().decode(b);
44
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
45
+ const refusal = (p) => p.then(() => undefined, (e) => e);
46
+ const reasonOf = (e) => {
47
+ const r = e?.extensions?.reason;
48
+ return typeof r === 'string' ? r : undefined;
49
+ };
50
+ export function uploadLinkContractSuite(adapterName, makeFixture) {
51
+ describe(`upload links: ${adapterName}`, () => {
52
+ let fixture;
53
+ let host;
54
+ const t1 = tenantId.parse(ulid());
55
+ const s1 = scopeId.parse(ulid());
56
+ const alice = principalId.parse(ulid()); // owner: read + write, tenant-wide
57
+ const bob = principalId.parse(ulid()); // reader: read only
58
+ const staff = platformActorId.parse(ulid());
59
+ let n = 0;
60
+ const udoc = () => ({ entityType: 'udoc', entityId: `doc-${++n}` });
61
+ const as = (who) => host.getScope(who, t1, s1);
62
+ const mint = async (who, input, op = 'upl/mint') => (await as(who)).invoke(op, input);
63
+ const links = async (entity) => (await as(alice)).invoke('upl/list', entity ? { entity } : {});
64
+ const linkOf = async (id) => {
65
+ const found = (await links()).find((l) => l.id === id);
66
+ if (!found)
67
+ throw new Error(`no upload link ${id}`);
68
+ return found;
69
+ };
70
+ const redeem = (m, entity, over = {}) => {
71
+ if (!host.redeemUploadLink)
72
+ throw new Error('host has no redeemUploadLink');
73
+ return host.redeemUploadLink(t1, s1, m.secret, {
74
+ entity,
75
+ filename: 'a.txt',
76
+ contentType: 'text/plain',
77
+ body: bytes('hello'),
78
+ ...over,
79
+ });
80
+ };
81
+ const filesOf = async (entity) => (await host.attachments(alice, t1, s1)).list(entity);
82
+ const events = async () => (await as(alice)).invoke('upl/events');
83
+ beforeAll(async () => {
84
+ fixture = await makeFixture();
85
+ host = fixture.host;
86
+ host.registerModule(uploadLinkMod);
87
+ await host.admin.createTenant(staff, { id: t1, slug: `upl-${t1.toLowerCase()}`, name: 'Upload links' });
88
+ await host.admin.grantEntitlement(staff, t1, 'upl');
89
+ await host.provisionScope(staff, { tenantId: t1, scopeId: s1, vertical: 'upl-vertical' });
90
+ await host.admin.activateScope(staff, t1, s1);
91
+ await host.provisionBlobStore(staff, { tenantId: t1, vertical: 'upl-vertical', binding: 'ATTACHMENTS' });
92
+ await host.admin.defineRole(staff, t1, { key: 'owner', permissions: [UPL_READ, UPL_WRITE], source: 'vertical' });
93
+ await host.admin.defineRole(staff, t1, { key: 'reader', permissions: [UPL_READ], source: 'vertical' });
94
+ await host.admin.assignRole(staff, { principalId: alice, roleKey: 'owner', node: { tenantId: t1, scopeId: null } });
95
+ await host.admin.assignRole(staff, { principalId: bob, roleKey: 'reader', node: { tenantId: t1, scopeId: null } });
96
+ });
97
+ afterAll(async () => {
98
+ await fixture.cleanup();
99
+ });
100
+ describe('the mint', () => {
101
+ it('a caller holding the write key mints; one holding only the read key is refused and no link exists', async () => {
102
+ const target = udoc();
103
+ const minted = await mint(alice, { entity: target });
104
+ expect(minted.secret.startsWith('sbup_')).toBe(true);
105
+ expect(minted.path).toBe(`/api/attachment-uploads/udoc/${target.entityId}/${minted.secret}`);
106
+ expect(minted.maxBytes).toBe(UPL_MAX_BYTES);
107
+ const other = udoc();
108
+ expect(errorCodeOf(await refusal(mint(bob, { entity: other })))).toBe('permission_denied');
109
+ expect(await links(other)).toEqual([]);
110
+ });
111
+ it('lives ten minutes by default, and a TTL past the hour is refused', async () => {
112
+ const target = udoc();
113
+ const minted = await mint(alice, { entity: target });
114
+ const rec = await linkOf(minted.id);
115
+ expect(Date.parse(rec.expiresAt) - Date.parse(rec.mintedAt)).toBe(600_000);
116
+ expect(rec.state).toBe('pending');
117
+ const hour = await mint(alice, { entity: target, ttlSeconds: 3600 });
118
+ const hourRec = await linkOf(hour.id);
119
+ expect(Date.parse(hourRec.expiresAt) - Date.parse(hourRec.mintedAt)).toBe(3_600_000);
120
+ expect(errorCodeOf(await refusal(mint(alice, { entity: target, ttlSeconds: 3601 })))).toBe('validation_failed');
121
+ });
122
+ it('refuses a target that declares no uploadLinks, an undeclared type, and a size above the target’s', async () => {
123
+ const note = await refusal(mint(alice, { entity: { entityType: 'unote', entityId: 'n1' } }));
124
+ expect(errorCodeOf(note)).toBe('forbidden');
125
+ expect(reasonOf(note)).toBe('upload_links_not_declared');
126
+ expect(errorCodeOf(await refusal(mint(alice, { entity: { entityType: 'ghost', entityId: 'g1' } })))).toBe('validation_failed');
127
+ expect(errorCodeOf(await refusal(mint(alice, { entity: udoc(), maxBytes: UPL_MAX_BYTES + 1 })))).toBe('validation_failed');
128
+ // The twin: a narrower size is accepted and is what the link carries.
129
+ expect((await mint(alice, { entity: udoc(), maxBytes: 8 })).maxBytes).toBe(8);
130
+ });
131
+ it('an operation’s own entity lock, decided before the mint, stops it; the unlocked twin mints', async () => {
132
+ const locked = udoc();
133
+ const free = udoc();
134
+ await (await as(alice)).invoke('upl/lock', { id: locked.entityId });
135
+ expect(errorCodeOf(await refusal(mint(alice, { entity: locked }, 'upl/mint-locked')))).toBe('conflict');
136
+ expect(await links(locked)).toEqual([]);
137
+ expect((await mint(alice, { entity: free }, 'upl/mint-locked')).id).toBeTruthy();
138
+ });
139
+ });
140
+ describe('the redemption', () => {
141
+ it('lands as an ordinary attachment: bytes intact, authored by the minter, listed, opened and on the spine', async () => {
142
+ const target = udoc();
143
+ const minted = await mint(alice, { entity: target });
144
+ const view = await host.inspectUploadLink(t1, s1, minted.secret);
145
+ expect(view).toMatchObject({ entity: target, maxBytes: UPL_MAX_BYTES, visibility: 'internal', filename: null });
146
+ const record = await redeem(minted, target, { filename: 'note.txt', body: bytes('the contract') });
147
+ expect(record).toMatchObject({ entity: target, filename: 'note.txt', contentType: 'text/plain', size: 12 });
148
+ expect(record.createdBy).toBe(alice);
149
+ expect((await filesOf(target)).map((r) => r.id)).toEqual([record.id]);
150
+ const opened = await (await host.attachments(alice, t1, s1)).open(record.id);
151
+ expect(text(opened.body)).toBe('the contract');
152
+ // What a follow-up operation reads to find the file: the link records its attachment.
153
+ const rec = await linkOf(minted.id);
154
+ expect(rec).toMatchObject({ state: 'redeemed', attachmentId: record.id });
155
+ expect(rec.redeemedAt).not.toBeNull();
156
+ });
157
+ it('is single-use: the second redemption is gone, and adds nothing', async () => {
158
+ const target = udoc();
159
+ const minted = await mint(alice, { entity: target });
160
+ await redeem(minted, target);
161
+ const again = await refusal(redeem(minted, target, { body: bytes('second') }));
162
+ expect(errorCodeOf(again)).toBe('conflict');
163
+ expect(reasonOf(again)).toBe(UPLOAD_LINK_GONE);
164
+ expect(errorCodeOf(await refusal(host.inspectUploadLink(t1, s1, minted.secret)))).toBe('conflict');
165
+ expect(await filesOf(target)).toHaveLength(1);
166
+ });
167
+ it('is single-use under a race: two concurrent redemptions store one file, and the other is gone', async () => {
168
+ const target = udoc();
169
+ const minted = await mint(alice, { entity: target });
170
+ const settled = await Promise.allSettled([
171
+ redeem(minted, target, { body: bytes('first') }),
172
+ redeem(minted, target, { body: bytes('second') }),
173
+ ]);
174
+ const won = settled.filter((r) => r.status === 'fulfilled');
175
+ const lost = settled.filter((r) => r.status === 'rejected');
176
+ expect(won).toHaveLength(1);
177
+ expect(lost).toHaveLength(1);
178
+ expect(errorCodeOf(lost[0].reason)).toBe('conflict');
179
+ expect(reasonOf(lost[0].reason)).toBe(UPLOAD_LINK_GONE);
180
+ expect((await filesOf(target)).map((r) => r.id)).toEqual([won[0].value.id]);
181
+ expect((await linkOf(minted.id)).attachmentId).toBe(won[0].value.id);
182
+ });
183
+ it('a link past its time is gone, and a link minted with a longer one beside it still works', async () => {
184
+ const target = udoc();
185
+ const short = await mint(alice, { entity: target, ttlSeconds: 1 });
186
+ const long = await mint(alice, { entity: target });
187
+ await sleep(1300);
188
+ const late = await refusal(redeem(short, target));
189
+ expect(reasonOf(late)).toBe(UPLOAD_LINK_GONE);
190
+ expect((await linkOf(short.id)).state).toBe('expired');
191
+ expect((await redeem(long, target)).entity).toEqual(target);
192
+ expect(await filesOf(target)).toHaveLength(1);
193
+ });
194
+ it('a revoked link is gone; revoking is the minter’s, not a reader’s; a redeemed link cannot be revoked back', async () => {
195
+ const target = udoc();
196
+ const minted = await mint(alice, { entity: target });
197
+ expect(errorCodeOf(await refusal((await as(bob)).invoke('upl/revoke', { id: minted.id })))).toBe('permission_denied');
198
+ await (await as(alice)).invoke('upl/revoke', { id: minted.id });
199
+ expect(reasonOf(await refusal(redeem(minted, target)))).toBe(UPLOAD_LINK_GONE);
200
+ expect((await linkOf(minted.id)).state).toBe('revoked');
201
+ expect(await filesOf(target)).toEqual([]);
202
+ const used = await mint(alice, { entity: target });
203
+ await redeem(used, target);
204
+ await (await as(alice)).invoke('upl/revoke', { id: used.id });
205
+ expect((await linkOf(used.id)).state).toBe('redeemed');
206
+ });
207
+ it('a secret that names nothing, or is not one of ours, is not_found — always the same answer', async () => {
208
+ const target = udoc();
209
+ for (const secret of ['sbup_' + 'A'.repeat(43), 'sbup_', 'nonsense', 'sbcap_' + 'A'.repeat(43), 'x'.repeat(500)]) {
210
+ expect(errorCodeOf(await refusal(redeem({ secret }, target)))).toBe('not_found');
211
+ expect(errorCodeOf(await refusal(host.inspectUploadLink(t1, s1, secret)))).toBe('not_found');
212
+ }
213
+ });
214
+ });
215
+ describe('one target', () => {
216
+ it('a redemption naming another entity, or another type, is refused and spends nothing', async () => {
217
+ const target = udoc();
218
+ const minted = await mint(alice, { entity: target });
219
+ const elsewhere = await refusal(redeem(minted, udoc()));
220
+ expect(errorCodeOf(elsewhere)).toBe('not_found');
221
+ expect(reasonOf(elsewhere)).toBe(UPLOAD_LINK_WRONG_TARGET);
222
+ expect(errorCodeOf(await refusal(redeem(minted, { entityType: 'unote', entityId: target.entityId })))).toBe('not_found');
223
+ expect((await linkOf(minted.id)).state).toBe('pending');
224
+ // The twin: the link's own target takes it.
225
+ expect((await redeem(minted, target)).entity).toEqual(target);
226
+ });
227
+ });
228
+ describe('the policy', () => {
229
+ it('oversize is refused without spending the link, and the same link then takes a conforming file', async () => {
230
+ const target = udoc();
231
+ const minted = await mint(alice, { entity: target });
232
+ const big = await refusal(redeem(minted, target, { body: new Uint8Array(UPL_MAX_BYTES + 1) }));
233
+ expect(errorCodeOf(big)).toBe('validation_failed');
234
+ expect(reasonOf(big)).toBe(UPLOAD_LINK_TOO_LARGE);
235
+ expect(await filesOf(target)).toEqual([]);
236
+ expect((await linkOf(minted.id)).state).toBe('pending');
237
+ expect((await redeem(minted, target, { body: new Uint8Array(UPL_MAX_BYTES) })).size).toBe(UPL_MAX_BYTES);
238
+ // A mint-time narrowing is the ceiling the link enforces.
239
+ const small = await mint(alice, { entity: target, maxBytes: 4 });
240
+ expect(reasonOf(await refusal(redeem(small, target, { body: bytes('12345') })))).toBe(UPLOAD_LINK_TOO_LARGE);
241
+ expect((await redeem(small, target, { body: bytes('1234') })).size).toBe(4);
242
+ });
243
+ it('a disallowed type is refused without spending the link; the allowed family and the exact type go through', async () => {
244
+ const target = udoc();
245
+ const minted = await mint(alice, { entity: target });
246
+ const exe = await refusal(redeem(minted, target, { contentType: 'application/x-msdownload', filename: 'a.exe' }));
247
+ expect(errorCodeOf(exe)).toBe('validation_failed');
248
+ expect(reasonOf(exe)).toBe(UPLOAD_LINK_TYPE_REFUSED);
249
+ expect(await filesOf(target)).toEqual([]);
250
+ expect((await redeem(minted, target, { contentType: 'image/png', filename: 'a.png' })).contentType).toBe('image/png');
251
+ const pdf = await mint(alice, { entity: target });
252
+ expect((await redeem(pdf, target, { contentType: 'application/pdf', filename: 'a.pdf' })).contentType).toBe('application/pdf');
253
+ });
254
+ it('a fixed file name overrides the uploader’s; without one the uploader’s is kept', async () => {
255
+ const target = udoc();
256
+ const fixed = await mint(alice, { entity: target, filename: 'signed.pdf' });
257
+ expect((await host.inspectUploadLink(t1, s1, fixed.secret)).filename).toBe('signed.pdf');
258
+ expect((await redeem(fixed, target, { filename: 'whatever.txt' })).filename).toBe('signed.pdf');
259
+ const free = await mint(alice, { entity: target });
260
+ expect((await redeem(free, target, { filename: 'mine.txt' })).filename).toBe('mine.txt');
261
+ });
262
+ it('visibility is the link’s: a customer-visible link writes a customer-visible file', async () => {
263
+ const target = udoc();
264
+ const minted = await mint(alice, { entity: target, visibility: 'customer' });
265
+ expect((await redeem(minted, target)).visibility).toBe('customer');
266
+ });
267
+ });
268
+ describe('the minter, now', () => {
269
+ it('taking the minter’s write key away refuses the redemption and spends nothing; giving it back allows it', async () => {
270
+ const carol = principalId.parse(ulid());
271
+ const role = { principalId: carol, roleKey: 'owner', node: { tenantId: t1, scopeId: s1 } };
272
+ await host.admin.assignRole(staff, role);
273
+ const target = udoc();
274
+ const minted = await mint(carol, { entity: target });
275
+ await host.admin.unassignRole(staff, role);
276
+ expect(errorCodeOf(await refusal(redeem(minted, target)))).toBe('permission_denied');
277
+ expect(await filesOf(target)).toEqual([]);
278
+ expect((await linkOf(minted.id)).state).toBe('pending');
279
+ await host.admin.assignRole(staff, role);
280
+ const record = await redeem(minted, target);
281
+ expect(record.createdBy).toBe(carol);
282
+ });
283
+ });
284
+ describe('copies', () => {
285
+ it('a fork never honours the source’s link, which still works at the source; a same-scope restore keeps it', async () => {
286
+ const target = udoc();
287
+ const minted = await mint(alice, { entity: target });
288
+ const fork = scopeId.parse(ulid());
289
+ await host.importScope(staff, { tenantId: t1, scopeId: fork, vertical: 'upl-vertical' }, await host.admin.exportScope(staff, t1, s1));
290
+ expect(errorCodeOf(await refusal(host.inspectUploadLink(t1, fork, minted.secret)))).toBe('not_found');
291
+ expect((await host.inspectUploadLink(t1, s1, minted.secret)).entity).toEqual(target);
292
+ await host.restoreScope(staff, t1, s1, await host.admin.exportScope(staff, t1, s1));
293
+ expect((await host.inspectUploadLink(t1, s1, minted.secret)).entity).toEqual(target);
294
+ expect((await redeem(minted, target)).entity).toEqual(target);
295
+ });
296
+ });
297
+ describe('the audit trail and the secret', () => {
298
+ it('minted, added and redeemed are on the spine in that order, as the minter; the redeemed event names the attachment', async () => {
299
+ const target = udoc();
300
+ const minted = await mint(alice, { entity: target, filename: 'trail.txt' });
301
+ const record = await redeem(minted, target);
302
+ const mine = (await events()).filter((e) => e.entity_id === target.entityId);
303
+ expect(mine.map((e) => e.type)).toEqual([
304
+ 'attachment.upload-link-minted',
305
+ 'attachment.added',
306
+ 'attachment.upload-link-redeemed',
307
+ ]);
308
+ for (const e of mine)
309
+ expect(JSON.parse(e.actor)).toBe(alice);
310
+ const redeemed = JSON.parse(mine[2].payload);
311
+ expect(redeemed).toMatchObject({ linkId: minted.id, attachmentId: record.id, size: record.size, sha256: record.sha256 });
312
+ // The mint's event carries what the link is, never the secret.
313
+ expect(JSON.stringify(mine)).not.toContain(minted.secret);
314
+ });
315
+ it('the secret is stored nowhere — its hash is — and a module that persists it is refused, the mint rolling back', async () => {
316
+ const target = udoc();
317
+ const minted = await mint(alice, { entity: target });
318
+ const dump = ((await (await as(alice)).invoke('upl/dump')) ?? []).join('\n');
319
+ expect(dump).not.toContain(minted.secret);
320
+ expect(dump).toContain(await capabilityTokenHash(minted.secret));
321
+ const leaky = udoc();
322
+ expect(await refusal(mint(alice, { entity: leaky }, 'upl/mint-and-leak'))).toBeDefined();
323
+ expect(await links(leaky)).toEqual([]);
324
+ });
325
+ });
326
+ });
327
+ }
328
+ //# sourceMappingURL=upload-link-suite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload-link-suite.js","sourceRoot":"","sources":["../src/upload-link-suite.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,10 @@ export declare const crmExportModManifest: {
35
35
  entityType: string;
36
36
  readPermission: string & z.$brand<"PermissionKey">;
37
37
  writePermission?: (string & z.$brand<"PermissionKey">) | undefined;
38
+ uploadLinks?: {
39
+ maxBytes: number;
40
+ contentTypes?: string[] | undefined;
41
+ } | undefined;
38
42
  }[];
39
43
  liveTargets?: {
40
44
  entityType: string;
@@ -192,6 +196,10 @@ export declare const boardImportModManifest: {
192
196
  entityType: string;
193
197
  readPermission: string & z.$brand<"PermissionKey">;
194
198
  writePermission?: (string & z.$brand<"PermissionKey">) | undefined;
199
+ uploadLinks?: {
200
+ maxBytes: number;
201
+ contentTypes?: string[] | undefined;
202
+ } | undefined;
195
203
  }[];
196
204
  liveTargets?: {
197
205
  entityType: string;
@@ -1 +1 @@
1
- {"version":3,"file":"vertical-events-suite.d.ts","sourceRoot":"","sources":["../src/vertical-events-suite.ts"],"names":[],"mappings":"AACA,OAAO,EASL,CAAC,EAED,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAGtB,KAAK,OAAO,EACZ,KAAK,QAAQ,EACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAOL,KAAK,kBAAkB,EAEvB,KAAK,kBAAkB,EAGvB,KAAK,SAAS,EAEf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAA4D,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAevH,eAAO,MAAM,YAAY,aAAa,CAAC;AACvC,eAAO,MAAM,cAAc,eAAe,CAAC;AAI3C,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiC/B,CAAC;AAiFH,eAAO,MAAM,YAAY,EAAE,kBAuC1B,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCjC,CAAC;AAgDH,eAAO,MAAM,cAAc,EAAE,kBAmE5B,CAAC;AAIF;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IACnD;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzF;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACrG;;;OAGG;IACH,IAAI,CAAC,EAAE,CACL,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,SAAS;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KAAE,EAAE,CAAC,CAAC;IACtG;;;;OAIG;IACH,eAAe,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;CACpD;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,GAChD,IAAI,CA65CN"}
1
+ {"version":3,"file":"vertical-events-suite.d.ts","sourceRoot":"","sources":["../src/vertical-events-suite.ts"],"names":[],"mappings":"AACA,OAAO,EASL,CAAC,EAED,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EAGtB,KAAK,OAAO,EACZ,KAAK,QAAQ,EACd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAOL,KAAK,kBAAkB,EAEvB,KAAK,kBAAkB,EAGvB,KAAK,SAAS,EAEf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAA4D,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAevH,eAAO,MAAM,YAAY,aAAa,CAAC;AACvC,eAAO,MAAM,cAAc,eAAe,CAAC;AAI3C,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiC/B,CAAC;AAiFH,eAAO,MAAM,YAAY,EAAE,kBAuC1B,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCjC,CAAC;AAgDH,eAAO,MAAM,cAAc,EAAE,kBAmE5B,CAAC;AAIF;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,IAAI,CAAC,kBAAkB,EAAE,YAAY,CAAC,CAAC;IACnD;;;;OAIG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzF;;;;OAIG;IACH,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACrG;;;OAGG;IACH,IAAI,CAAC,EAAE,CACL,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,KACb,OAAO,CAAC,SAAS;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,GAAG,IAAI,CAAA;KAAE,EAAE,CAAC,CAAC;IACtG;;;;OAIG;IACH,eAAe,CAAC,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC;CACpD;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,2BAA2B,CACzC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,OAAO,CAAC,qBAAqB,CAAC,GAChD,IAAI,CA65CN"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@substrat-run/contract-tests",
3
- "version": "0.146.0",
3
+ "version": "0.148.0",
4
4
  "description": "The suite every scope-host adapter must pass, forever (D-14)",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
@@ -30,8 +30,8 @@
30
30
  "dist"
31
31
  ],
32
32
  "dependencies": {
33
- "@substrat-run/contracts": "^0.146.0",
34
- "@substrat-run/kernel": "^0.146.0"
33
+ "@substrat-run/kernel": "^0.148.0",
34
+ "@substrat-run/contracts": "^0.148.0"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/node": "^22.20.5",