@substrat-run/contract-tests 0.147.0 → 0.149.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.
- package/dist/bind-module.d.ts +4 -0
- package/dist/bind-module.d.ts.map +1 -1
- package/dist/capability-expiry-suite.d.ts.map +1 -1
- package/dist/capability-expiry-suite.js +6 -4
- package/dist/capability-expiry-suite.js.map +1 -1
- package/dist/counter-runner.d.ts +22 -0
- package/dist/counter-runner.d.ts.map +1 -0
- package/dist/counter-runner.js +96 -0
- package/dist/counter-runner.js.map +1 -0
- package/dist/derived-module.d.ts +4 -0
- package/dist/derived-module.d.ts.map +1 -1
- package/dist/directory-restore-suite.d.ts.map +1 -1
- package/dist/directory-restore-suite.js +66 -2
- package/dist/directory-restore-suite.js.map +1 -1
- package/dist/directory-shapes.d.ts +6 -0
- package/dist/directory-shapes.d.ts.map +1 -1
- package/dist/directory-shapes.js +42 -0
- package/dist/directory-shapes.js.map +1 -1
- package/dist/entity-state-module.d.ts +8 -0
- package/dist/entity-state-module.d.ts.map +1 -1
- package/dist/entity-state-module.js +3 -0
- package/dist/entity-state-module.js.map +1 -1
- package/dist/entity-trash-module.d.ts +4 -0
- package/dist/entity-trash-module.d.ts.map +1 -1
- package/dist/entity-trash-suite.d.ts.map +1 -1
- package/dist/entity-trash-suite.js +20 -0
- package/dist/entity-trash-suite.js.map +1 -1
- package/dist/erasure-module.d.ts +4 -0
- package/dist/erasure-module.d.ts.map +1 -1
- package/dist/held-migrations.d.ts +27 -0
- package/dist/held-migrations.d.ts.map +1 -0
- package/dist/held-migrations.js +39 -0
- package/dist/held-migrations.js.map +1 -0
- package/dist/index.d.ts +12 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +13 -1
- package/dist/index.js.map +1 -1
- package/dist/migration-fence-suite.d.ts +3 -0
- package/dist/migration-fence-suite.d.ts.map +1 -0
- package/dist/migration-fence-suite.js +173 -0
- package/dist/migration-fence-suite.js.map +1 -0
- package/dist/migration-fence.d.ts +42 -0
- package/dist/migration-fence.d.ts.map +1 -0
- package/dist/migration-fence.js +66 -0
- package/dist/migration-fence.js.map +1 -0
- package/dist/modules.d.ts +126 -0
- package/dist/modules.d.ts.map +1 -1
- package/dist/modules.js +23 -0
- package/dist/modules.js.map +1 -1
- package/dist/orphan-sweep-suite.d.ts +23 -0
- package/dist/orphan-sweep-suite.d.ts.map +1 -0
- package/dist/orphan-sweep-suite.js +411 -0
- package/dist/orphan-sweep-suite.js.map +1 -0
- package/dist/permission-suite.d.ts.map +1 -1
- package/dist/permission-suite.js +19 -0
- package/dist/permission-suite.js.map +1 -1
- package/dist/scope-host-suite.d.ts.map +1 -1
- package/dist/scope-host-suite.js +465 -10
- package/dist/scope-host-suite.js.map +1 -1
- package/dist/scope-store-runner-suite.d.ts +46 -0
- package/dist/scope-store-runner-suite.d.ts.map +1 -0
- package/dist/scope-store-runner-suite.js +187 -0
- package/dist/scope-store-runner-suite.js.map +1 -0
- package/dist/scope-store-suite.d.ts.map +1 -1
- package/dist/scope-store-suite.js +55 -103
- package/dist/scope-store-suite.js.map +1 -1
- package/dist/stamps-module.d.ts +4 -0
- package/dist/stamps-module.d.ts.map +1 -1
- package/dist/store-driver-release-suite.d.ts +12 -0
- package/dist/store-driver-release-suite.d.ts.map +1 -0
- package/dist/store-driver-release-suite.js +561 -0
- package/dist/store-driver-release-suite.js.map +1 -0
- package/dist/upload-link-module.d.ts +172 -0
- package/dist/upload-link-module.d.ts.map +1 -0
- package/dist/upload-link-module.js +157 -0
- package/dist/upload-link-module.js.map +1 -0
- package/dist/upload-link-replay-suite.d.ts +3 -0
- package/dist/upload-link-replay-suite.d.ts.map +1 -0
- package/dist/upload-link-replay-suite.js +291 -0
- package/dist/upload-link-replay-suite.js.map +1 -0
- package/dist/upload-link-suite.d.ts +3 -0
- package/dist/upload-link-suite.d.ts.map +1 -0
- package/dist/upload-link-suite.js +485 -0
- package/dist/upload-link-suite.js.map +1 -0
- package/dist/vertical-events-suite.d.ts +8 -0
- package/dist/vertical-events-suite.d.ts.map +1 -1
- package/dist/vertical-events-suite.js +46 -4
- package/dist/vertical-events-suite.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,485 @@
|
|
|
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. Only a principal mints or revokes: a consumer, which runs
|
|
17
|
+
* as the system actor, is refused both and writes nothing.
|
|
18
|
+
* 2. **The redemption.** The file lands as an ordinary attachment — bytes intact, `createdBy`
|
|
19
|
+
* the minter, listed and opened by the minter, `attachment.added` on the spine — and the
|
|
20
|
+
* link records the attachment it produced.
|
|
21
|
+
* 3. **Single use.** The second redemption is `upload_link_gone` and adds nothing.
|
|
22
|
+
* 4. **Expiry and revocation.** A link past its time, and a revoked one, are `upload_link_gone`.
|
|
23
|
+
* 5. **One target, one scope.** A redemption naming another entity — or another type — than
|
|
24
|
+
* the link was minted for is refused WITHOUT spending the link, with the same answer whether
|
|
25
|
+
* the link is pending or spent. A redemption at another scope of the tenant, or at a scope of
|
|
26
|
+
* another tenant, finds no link at all, stores nothing there, and leaves it usable at home.
|
|
27
|
+
* 6. **The policy.** Oversize and a disallowed type are refused without spending the link, and
|
|
28
|
+
* the same link then takes a conforming file. A family (`image/*`) admits no active type
|
|
29
|
+
* (SVG); an exact entry does. A fixed file name overrides the uploader's.
|
|
30
|
+
* 7. **The minter, now.** Taking the minter's write key away after the mint refuses the
|
|
31
|
+
* redemption and leaves the link unspent; giving it back allows it.
|
|
32
|
+
* 8. **The audit trail and the secret.** Minted, added and redeemed are on the spine in that
|
|
33
|
+
* order, as the minter; the secret is stored nowhere (its hash is) and a module that tries
|
|
34
|
+
* to persist it is refused.
|
|
35
|
+
* 9. **A probe learns nothing.** An unknown or malformed secret is `not_found`, always.
|
|
36
|
+
* 10. **A copy has no links.** A fork made from a dump never honours the source's link, which
|
|
37
|
+
* keeps working at the source; a restore into the scope the backup came from keeps it.
|
|
38
|
+
*
|
|
39
|
+
* The expiry TRANSITION runs on a real second here, since a Durable Object takes no injected
|
|
40
|
+
* clock (#956); the shortest TTL is one second.
|
|
41
|
+
*/
|
|
42
|
+
import { describe, it, expect, beforeAll, afterAll } from 'vitest';
|
|
43
|
+
import { errorCodeOf, platformActorId, principalId, scopeId, tenantId, } from '@substrat-run/contracts';
|
|
44
|
+
import { UPLOAD_LINK_GONE, UPLOAD_LINK_TOO_LARGE, UPLOAD_LINK_TYPE_REFUSED, UPLOAD_LINK_WRONG_TARGET, capabilityTokenHash, ulid, } from '@substrat-run/kernel';
|
|
45
|
+
import { UPL_MAX_BYTES, UPL_READ, UPL_WRITE, uploadLinkMod } from './upload-link-module.js';
|
|
46
|
+
const SVG = '<svg xmlns="http://www.w3.org/2000/svg" onload="alert(1)"/>';
|
|
47
|
+
const bytes = (s) => new TextEncoder().encode(s);
|
|
48
|
+
const text = (b) => new TextDecoder().decode(b);
|
|
49
|
+
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
50
|
+
const refusal = (p) => p.then(() => undefined, (e) => e);
|
|
51
|
+
const reasonOf = (e) => {
|
|
52
|
+
const r = e?.extensions?.reason;
|
|
53
|
+
return typeof r === 'string' ? r : undefined;
|
|
54
|
+
};
|
|
55
|
+
export function uploadLinkContractSuite(adapterName, makeFixture) {
|
|
56
|
+
describe(`upload links: ${adapterName}`, () => {
|
|
57
|
+
let fixture;
|
|
58
|
+
let host;
|
|
59
|
+
const t1 = tenantId.parse(ulid());
|
|
60
|
+
const s1 = scopeId.parse(ulid());
|
|
61
|
+
// Isolation: a second scope of the same tenant, and a scope of another tenant.
|
|
62
|
+
const s2 = scopeId.parse(ulid());
|
|
63
|
+
const t2 = tenantId.parse(ulid());
|
|
64
|
+
const s3 = scopeId.parse(ulid());
|
|
65
|
+
const alice = principalId.parse(ulid()); // owner: read + write, tenant-wide
|
|
66
|
+
const bob = principalId.parse(ulid()); // reader: read only
|
|
67
|
+
const staff = platformActorId.parse(ulid());
|
|
68
|
+
let n = 0;
|
|
69
|
+
const udoc = () => ({ entityType: 'udoc', entityId: `doc-${++n}` });
|
|
70
|
+
const as = (who) => host.getScope(who, t1, s1);
|
|
71
|
+
const mint = async (who, input, op = 'upl/mint') => (await as(who)).invoke(op, input);
|
|
72
|
+
const links = async (entity) => (await as(alice)).invoke('upl/list', entity ? { entity } : {});
|
|
73
|
+
const linkOf = async (id) => {
|
|
74
|
+
const found = (await links()).find((l) => l.id === id);
|
|
75
|
+
if (!found)
|
|
76
|
+
throw new Error(`no upload link ${id}`);
|
|
77
|
+
return found;
|
|
78
|
+
};
|
|
79
|
+
const redeem = (m, entity, over = {}) => {
|
|
80
|
+
if (!host.redeemUploadLink)
|
|
81
|
+
throw new Error('host has no redeemUploadLink');
|
|
82
|
+
return host.redeemUploadLink(t1, s1, m.secret, {
|
|
83
|
+
entity,
|
|
84
|
+
filename: 'a.txt',
|
|
85
|
+
contentType: 'text/plain',
|
|
86
|
+
body: bytes('hello'),
|
|
87
|
+
...over,
|
|
88
|
+
});
|
|
89
|
+
};
|
|
90
|
+
const filesOf = async (entity) => (await host.attachments(alice, t1, s1)).list(entity);
|
|
91
|
+
const events = async () => (await as(alice)).invoke('upl/events');
|
|
92
|
+
beforeAll(async () => {
|
|
93
|
+
fixture = await makeFixture();
|
|
94
|
+
host = fixture.host;
|
|
95
|
+
host.registerModule(uploadLinkMod);
|
|
96
|
+
await host.admin.createTenant(staff, { id: t1, slug: `upl-${t1.toLowerCase()}`, name: 'Upload links' });
|
|
97
|
+
await host.admin.grantEntitlement(staff, t1, 'upl');
|
|
98
|
+
await host.provisionScope(staff, { tenantId: t1, scopeId: s1, vertical: 'upl-vertical' });
|
|
99
|
+
await host.admin.activateScope(staff, t1, s1);
|
|
100
|
+
await host.provisionBlobStore(staff, { tenantId: t1, vertical: 'upl-vertical', binding: 'ATTACHMENTS' });
|
|
101
|
+
await host.admin.defineRole(staff, t1, { key: 'owner', permissions: [UPL_READ, UPL_WRITE], source: 'vertical' });
|
|
102
|
+
await host.admin.defineRole(staff, t1, { key: 'reader', permissions: [UPL_READ], source: 'vertical' });
|
|
103
|
+
await host.admin.assignRole(staff, { principalId: alice, roleKey: 'owner', node: { tenantId: t1, scopeId: null } });
|
|
104
|
+
await host.admin.assignRole(staff, { principalId: bob, roleKey: 'reader', node: { tenantId: t1, scopeId: null } });
|
|
105
|
+
await host.provisionScope(staff, { tenantId: t1, scopeId: s2, vertical: 'upl-vertical' });
|
|
106
|
+
await host.admin.activateScope(staff, t1, s2);
|
|
107
|
+
await host.admin.createTenant(staff, { id: t2, slug: `upl-${t2.toLowerCase()}`, name: 'Upload links, elsewhere' });
|
|
108
|
+
await host.admin.grantEntitlement(staff, t2, 'upl');
|
|
109
|
+
await host.provisionScope(staff, { tenantId: t2, scopeId: s3, vertical: 'upl-vertical' });
|
|
110
|
+
await host.admin.activateScope(staff, t2, s3);
|
|
111
|
+
await host.provisionBlobStore(staff, { tenantId: t2, vertical: 'upl-vertical', binding: 'ATTACHMENTS' });
|
|
112
|
+
await host.admin.defineRole(staff, t2, { key: 'owner', permissions: [UPL_READ, UPL_WRITE], source: 'vertical' });
|
|
113
|
+
// The same principal holds the write key in both tenants, so a refusal there is the link's, not a permission's.
|
|
114
|
+
await host.admin.assignRole(staff, { principalId: alice, roleKey: 'owner', node: { tenantId: t2, scopeId: null } });
|
|
115
|
+
});
|
|
116
|
+
afterAll(async () => {
|
|
117
|
+
await fixture.cleanup();
|
|
118
|
+
});
|
|
119
|
+
describe('the mint', () => {
|
|
120
|
+
it('a caller holding the write key mints; one holding only the read key is refused and no link exists', async () => {
|
|
121
|
+
const target = udoc();
|
|
122
|
+
const minted = await mint(alice, { entity: target });
|
|
123
|
+
expect(minted.secret.startsWith('sbup_')).toBe(true);
|
|
124
|
+
expect(minted.path).toBe(`/api/attachment-uploads/udoc/${target.entityId}/${minted.secret}`);
|
|
125
|
+
expect(minted.maxBytes).toBe(UPL_MAX_BYTES);
|
|
126
|
+
const other = udoc();
|
|
127
|
+
expect(errorCodeOf(await refusal(mint(bob, { entity: other })))).toBe('permission_denied');
|
|
128
|
+
expect(await links(other)).toEqual([]);
|
|
129
|
+
});
|
|
130
|
+
it('lives ten minutes by default, and a TTL past the hour is refused', async () => {
|
|
131
|
+
const target = udoc();
|
|
132
|
+
const minted = await mint(alice, { entity: target });
|
|
133
|
+
const rec = await linkOf(minted.id);
|
|
134
|
+
expect(Date.parse(rec.expiresAt) - Date.parse(rec.mintedAt)).toBe(600_000);
|
|
135
|
+
expect(rec.state).toBe('pending');
|
|
136
|
+
const hour = await mint(alice, { entity: target, ttlSeconds: 3600 });
|
|
137
|
+
const hourRec = await linkOf(hour.id);
|
|
138
|
+
expect(Date.parse(hourRec.expiresAt) - Date.parse(hourRec.mintedAt)).toBe(3_600_000);
|
|
139
|
+
expect(errorCodeOf(await refusal(mint(alice, { entity: target, ttlSeconds: 3601 })))).toBe('validation_failed');
|
|
140
|
+
});
|
|
141
|
+
it('refuses a target that declares no uploadLinks, an undeclared type, and a size above the target’s', async () => {
|
|
142
|
+
const note = await refusal(mint(alice, { entity: { entityType: 'unote', entityId: 'n1' } }));
|
|
143
|
+
expect(errorCodeOf(note)).toBe('forbidden');
|
|
144
|
+
expect(reasonOf(note)).toBe('upload_links_not_declared');
|
|
145
|
+
expect(errorCodeOf(await refusal(mint(alice, { entity: { entityType: 'ghost', entityId: 'g1' } })))).toBe('validation_failed');
|
|
146
|
+
expect(errorCodeOf(await refusal(mint(alice, { entity: udoc(), maxBytes: UPL_MAX_BYTES + 1 })))).toBe('validation_failed');
|
|
147
|
+
// The twin: a narrower size is accepted and is what the link carries.
|
|
148
|
+
expect((await mint(alice, { entity: udoc(), maxBytes: 8 })).maxBytes).toBe(8);
|
|
149
|
+
});
|
|
150
|
+
it('an operation’s own entity lock, decided before the mint, stops it; the unlocked twin mints', async () => {
|
|
151
|
+
const locked = udoc();
|
|
152
|
+
const free = udoc();
|
|
153
|
+
await (await as(alice)).invoke('upl/lock', { id: locked.entityId });
|
|
154
|
+
expect(errorCodeOf(await refusal(mint(alice, { entity: locked }, 'upl/mint-locked')))).toBe('conflict');
|
|
155
|
+
expect(await links(locked)).toEqual([]);
|
|
156
|
+
expect((await mint(alice, { entity: free }, 'upl/mint-locked')).id).toBeTruthy();
|
|
157
|
+
});
|
|
158
|
+
it('only a principal mints or revokes: a consumer — the system actor — is refused both, and writes no link', async () => {
|
|
159
|
+
const target = udoc();
|
|
160
|
+
const existing = await mint(alice, { entity: target });
|
|
161
|
+
const poked = udoc();
|
|
162
|
+
await (await as(alice)).invoke('upl/poke', { entity: poked, linkId: existing.id });
|
|
163
|
+
const attempts = await (await as(alice)).invoke('upl/consumer-attempts');
|
|
164
|
+
expect(attempts).toEqual([
|
|
165
|
+
{ verb: 'mint', outcome: 'forbidden:upload_link_delegation' },
|
|
166
|
+
{ verb: 'revoke', outcome: 'forbidden:upload_link_delegation' },
|
|
167
|
+
]);
|
|
168
|
+
expect(await links(poked)).toEqual([]);
|
|
169
|
+
expect((await linkOf(existing.id)).state).toBe('pending');
|
|
170
|
+
// The twin: the same mint and revoke, made by a principal, go through.
|
|
171
|
+
expect((await mint(alice, { entity: poked })).id).toBeTruthy();
|
|
172
|
+
await (await as(alice)).invoke('upl/revoke', { id: existing.id });
|
|
173
|
+
expect((await linkOf(existing.id)).state).toBe('revoked');
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe('the redemption', () => {
|
|
177
|
+
it('lands as an ordinary attachment: bytes intact, authored by the minter, listed, opened and on the spine', async () => {
|
|
178
|
+
const target = udoc();
|
|
179
|
+
const minted = await mint(alice, { entity: target });
|
|
180
|
+
const view = await host.inspectUploadLink(t1, s1, minted.secret);
|
|
181
|
+
expect(view).toMatchObject({ entity: target, maxBytes: UPL_MAX_BYTES, visibility: 'internal', filename: null });
|
|
182
|
+
const record = await redeem(minted, target, { filename: 'note.txt', body: bytes('the contract') });
|
|
183
|
+
expect(record).toMatchObject({ entity: target, filename: 'note.txt', contentType: 'text/plain', size: 12 });
|
|
184
|
+
expect(record.createdBy).toBe(alice);
|
|
185
|
+
expect((await filesOf(target)).map((r) => r.id)).toEqual([record.id]);
|
|
186
|
+
const opened = await (await host.attachments(alice, t1, s1)).open(record.id);
|
|
187
|
+
expect(text(opened.body)).toBe('the contract');
|
|
188
|
+
// What a follow-up operation reads to find the file: the link records its attachment.
|
|
189
|
+
const rec = await linkOf(minted.id);
|
|
190
|
+
expect(rec).toMatchObject({ state: 'redeemed', attachmentId: record.id });
|
|
191
|
+
expect(rec.redeemedAt).not.toBeNull();
|
|
192
|
+
});
|
|
193
|
+
it('is single-use: the second redemption is gone, and adds nothing', async () => {
|
|
194
|
+
const target = udoc();
|
|
195
|
+
const minted = await mint(alice, { entity: target });
|
|
196
|
+
await redeem(minted, target);
|
|
197
|
+
const again = await refusal(redeem(minted, target, { body: bytes('second') }));
|
|
198
|
+
expect(errorCodeOf(again)).toBe('conflict');
|
|
199
|
+
expect(reasonOf(again)).toBe(UPLOAD_LINK_GONE);
|
|
200
|
+
expect(errorCodeOf(await refusal(host.inspectUploadLink(t1, s1, minted.secret)))).toBe('conflict');
|
|
201
|
+
expect(await filesOf(target)).toHaveLength(1);
|
|
202
|
+
});
|
|
203
|
+
it('is single-use under a race: two concurrent redemptions store one file, and the other is gone', async () => {
|
|
204
|
+
const target = udoc();
|
|
205
|
+
const minted = await mint(alice, { entity: target });
|
|
206
|
+
const settled = await Promise.allSettled([
|
|
207
|
+
redeem(minted, target, { body: bytes('first') }),
|
|
208
|
+
redeem(minted, target, { body: bytes('second') }),
|
|
209
|
+
]);
|
|
210
|
+
const won = settled.filter((r) => r.status === 'fulfilled');
|
|
211
|
+
const lost = settled.filter((r) => r.status === 'rejected');
|
|
212
|
+
expect(won).toHaveLength(1);
|
|
213
|
+
expect(lost).toHaveLength(1);
|
|
214
|
+
expect(errorCodeOf(lost[0].reason)).toBe('conflict');
|
|
215
|
+
expect(reasonOf(lost[0].reason)).toBe(UPLOAD_LINK_GONE);
|
|
216
|
+
expect((await filesOf(target)).map((r) => r.id)).toEqual([won[0].value.id]);
|
|
217
|
+
expect((await linkOf(minted.id)).attachmentId).toBe(won[0].value.id);
|
|
218
|
+
});
|
|
219
|
+
it('a link past its time is gone, and a link minted with a longer one beside it still works', async () => {
|
|
220
|
+
const target = udoc();
|
|
221
|
+
const short = await mint(alice, { entity: target, ttlSeconds: 1 });
|
|
222
|
+
const long = await mint(alice, { entity: target });
|
|
223
|
+
await sleep(1300);
|
|
224
|
+
const late = await refusal(redeem(short, target));
|
|
225
|
+
expect(reasonOf(late)).toBe(UPLOAD_LINK_GONE);
|
|
226
|
+
expect((await linkOf(short.id)).state).toBe('expired');
|
|
227
|
+
expect((await redeem(long, target)).entity).toEqual(target);
|
|
228
|
+
expect(await filesOf(target)).toHaveLength(1);
|
|
229
|
+
});
|
|
230
|
+
it('a revoked link is gone; revoking is the minter’s, not a reader’s; a redeemed link cannot be revoked back', async () => {
|
|
231
|
+
const target = udoc();
|
|
232
|
+
const minted = await mint(alice, { entity: target });
|
|
233
|
+
expect(errorCodeOf(await refusal((await as(bob)).invoke('upl/revoke', { id: minted.id })))).toBe('permission_denied');
|
|
234
|
+
await (await as(alice)).invoke('upl/revoke', { id: minted.id });
|
|
235
|
+
expect(reasonOf(await refusal(redeem(minted, target)))).toBe(UPLOAD_LINK_GONE);
|
|
236
|
+
expect((await linkOf(minted.id)).state).toBe('revoked');
|
|
237
|
+
expect(await filesOf(target)).toEqual([]);
|
|
238
|
+
const used = await mint(alice, { entity: target });
|
|
239
|
+
await redeem(used, target);
|
|
240
|
+
await (await as(alice)).invoke('upl/revoke', { id: used.id });
|
|
241
|
+
expect((await linkOf(used.id)).state).toBe('redeemed');
|
|
242
|
+
});
|
|
243
|
+
it('a secret that names nothing, or is not one of ours, is not_found — always the same answer', async () => {
|
|
244
|
+
const target = udoc();
|
|
245
|
+
for (const secret of ['sbup_' + 'A'.repeat(43), 'sbup_', 'nonsense', 'sbcap_' + 'A'.repeat(43), 'x'.repeat(500)]) {
|
|
246
|
+
expect(errorCodeOf(await refusal(redeem({ secret }, target)))).toBe('not_found');
|
|
247
|
+
expect(errorCodeOf(await refusal(host.inspectUploadLink(t1, s1, secret)))).toBe('not_found');
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
describe('one target', () => {
|
|
252
|
+
it('a redemption naming another entity, or another type, is refused and spends nothing', async () => {
|
|
253
|
+
const target = udoc();
|
|
254
|
+
const minted = await mint(alice, { entity: target });
|
|
255
|
+
const elsewhere = await refusal(redeem(minted, udoc()));
|
|
256
|
+
expect(errorCodeOf(elsewhere)).toBe('not_found');
|
|
257
|
+
expect(reasonOf(elsewhere)).toBe(UPLOAD_LINK_WRONG_TARGET);
|
|
258
|
+
expect(errorCodeOf(await refusal(redeem(minted, { entityType: 'unote', entityId: target.entityId })))).toBe('not_found');
|
|
259
|
+
expect((await linkOf(minted.id)).state).toBe('pending');
|
|
260
|
+
// The twin: the link's own target takes it.
|
|
261
|
+
expect((await redeem(minted, target)).entity).toEqual(target);
|
|
262
|
+
});
|
|
263
|
+
it('the target is judged before the state: a wrong path is the same not_found for a spent link as for a pending one', async () => {
|
|
264
|
+
const target = udoc();
|
|
265
|
+
const other = udoc();
|
|
266
|
+
const used = await mint(alice, { entity: target });
|
|
267
|
+
await redeem(used, target);
|
|
268
|
+
const revoked = await mint(alice, { entity: target });
|
|
269
|
+
await (await as(alice)).invoke('upl/revoke', { id: revoked.id });
|
|
270
|
+
for (const m of [used, revoked]) {
|
|
271
|
+
const viaRedeem = await refusal(redeem(m, other));
|
|
272
|
+
expect(errorCodeOf(viaRedeem)).toBe('not_found');
|
|
273
|
+
expect(reasonOf(viaRedeem)).toBe(UPLOAD_LINK_WRONG_TARGET);
|
|
274
|
+
const viaInspect = await refusal(host.inspectUploadLink(t1, s1, m.secret, other));
|
|
275
|
+
expect(errorCodeOf(viaInspect)).toBe('not_found');
|
|
276
|
+
expect(reasonOf(viaInspect)).toBe(UPLOAD_LINK_WRONG_TARGET);
|
|
277
|
+
// The twin: at its own target the spent link is gone.
|
|
278
|
+
expect(reasonOf(await refusal(redeem(m, target)))).toBe(UPLOAD_LINK_GONE);
|
|
279
|
+
expect(reasonOf(await refusal(host.inspectUploadLink(t1, s1, m.secret, target)))).toBe(UPLOAD_LINK_GONE);
|
|
280
|
+
}
|
|
281
|
+
expect(await filesOf(other)).toEqual([]);
|
|
282
|
+
});
|
|
283
|
+
it('a link is its scope’s alone: another scope of the tenant and a scope of another tenant find nothing, store nothing, and leave it usable at home', async () => {
|
|
284
|
+
const target = udoc();
|
|
285
|
+
const minted = await mint(alice, { entity: target });
|
|
286
|
+
const elsewhere = [
|
|
287
|
+
[t1, s2],
|
|
288
|
+
[t2, s3],
|
|
289
|
+
[t2, s1],
|
|
290
|
+
[t1, s3],
|
|
291
|
+
];
|
|
292
|
+
for (const [t, s] of elsewhere) {
|
|
293
|
+
const where = `(${t === t1 ? 't1' : 't2'}, ${s === s1 ? 's1' : s === s2 ? 's2' : 's3'})`;
|
|
294
|
+
expect(errorCodeOf(await refusal(host.inspectUploadLink(t, s, minted.secret, target))), where).toBe('not_found');
|
|
295
|
+
const redeemed = await refusal(host.redeemUploadLink(t, s, minted.secret, {
|
|
296
|
+
entity: target,
|
|
297
|
+
filename: 'a.txt',
|
|
298
|
+
contentType: 'text/plain',
|
|
299
|
+
body: bytes('elsewhere'),
|
|
300
|
+
}));
|
|
301
|
+
expect(errorCodeOf(redeemed), where).toBe('not_found');
|
|
302
|
+
}
|
|
303
|
+
// Nothing landed in either real scope away from home.
|
|
304
|
+
expect(await (await host.attachments(alice, t1, s2)).list(target)).toEqual([]);
|
|
305
|
+
expect(await (await host.attachments(alice, t2, s3)).list(target)).toEqual([]);
|
|
306
|
+
// At home it is untouched and still takes its one file.
|
|
307
|
+
expect((await linkOf(minted.id)).state).toBe('pending');
|
|
308
|
+
expect((await redeem(minted, target)).entity).toEqual(target);
|
|
309
|
+
expect(await filesOf(target)).toHaveLength(1);
|
|
310
|
+
});
|
|
311
|
+
});
|
|
312
|
+
describe('the policy', () => {
|
|
313
|
+
it('oversize is refused without spending the link, and the same link then takes a conforming file', async () => {
|
|
314
|
+
const target = udoc();
|
|
315
|
+
const minted = await mint(alice, { entity: target });
|
|
316
|
+
const big = await refusal(redeem(minted, target, { body: new Uint8Array(UPL_MAX_BYTES + 1) }));
|
|
317
|
+
expect(errorCodeOf(big)).toBe('validation_failed');
|
|
318
|
+
expect(reasonOf(big)).toBe(UPLOAD_LINK_TOO_LARGE);
|
|
319
|
+
expect(await filesOf(target)).toEqual([]);
|
|
320
|
+
expect((await linkOf(minted.id)).state).toBe('pending');
|
|
321
|
+
expect((await redeem(minted, target, { body: new Uint8Array(UPL_MAX_BYTES) })).size).toBe(UPL_MAX_BYTES);
|
|
322
|
+
// A mint-time narrowing is the ceiling the link enforces.
|
|
323
|
+
const small = await mint(alice, { entity: target, maxBytes: 4 });
|
|
324
|
+
expect(reasonOf(await refusal(redeem(small, target, { body: bytes('12345') })))).toBe(UPLOAD_LINK_TOO_LARGE);
|
|
325
|
+
expect((await redeem(small, target, { body: bytes('1234') })).size).toBe(4);
|
|
326
|
+
});
|
|
327
|
+
it('a disallowed type is refused without spending the link; the allowed family and the exact type go through', async () => {
|
|
328
|
+
const target = udoc();
|
|
329
|
+
const minted = await mint(alice, { entity: target });
|
|
330
|
+
const exe = await refusal(redeem(minted, target, { contentType: 'application/x-msdownload', filename: 'a.exe' }));
|
|
331
|
+
expect(errorCodeOf(exe)).toBe('validation_failed');
|
|
332
|
+
expect(reasonOf(exe)).toBe(UPLOAD_LINK_TYPE_REFUSED);
|
|
333
|
+
expect(await filesOf(target)).toEqual([]);
|
|
334
|
+
expect((await redeem(minted, target, { contentType: 'image/png', filename: 'a.png' })).contentType).toBe('image/png');
|
|
335
|
+
const pdf = await mint(alice, { entity: target });
|
|
336
|
+
expect((await redeem(pdf, target, { contentType: 'application/pdf', filename: 'a.pdf' })).contentType).toBe('application/pdf');
|
|
337
|
+
});
|
|
338
|
+
it('a family admits no active type — SVG under `image/*` is refused, spending nothing — and an exact entry admits it', async () => {
|
|
339
|
+
const target = udoc();
|
|
340
|
+
const minted = await mint(alice, { entity: target });
|
|
341
|
+
const svg = await refusal(redeem(minted, target, { contentType: 'image/svg+xml', filename: 'a.svg', body: bytes(SVG) }));
|
|
342
|
+
expect(errorCodeOf(svg)).toBe('validation_failed');
|
|
343
|
+
expect(reasonOf(svg)).toBe(UPLOAD_LINK_TYPE_REFUSED);
|
|
344
|
+
// By rule, not by list: any `+xml` subtype is XML, and a parameter or a stray space in a
|
|
345
|
+
// host caller's type is not a way past it — the kernel judges the normalized essence.
|
|
346
|
+
for (const contentType of ['image/x+xml', 'image/svg+xml; charset=utf-8', 'Image/SVG+XML ']) {
|
|
347
|
+
const refused = await refusal(redeem(minted, target, { contentType, filename: 'a.svg', body: bytes(SVG) }));
|
|
348
|
+
expect(reasonOf(refused), contentType).toBe(UPLOAD_LINK_TYPE_REFUSED);
|
|
349
|
+
}
|
|
350
|
+
expect(await filesOf(target)).toEqual([]);
|
|
351
|
+
expect((await linkOf(minted.id)).state).toBe('pending');
|
|
352
|
+
// Not one essence — a list a browser would read as its LAST type, a control character, a
|
|
353
|
+
// missing or extra part — is refused, so nothing is stored that a page could serve as XHTML.
|
|
354
|
+
for (const contentType of [
|
|
355
|
+
'a/b,c/d',
|
|
356
|
+
'image/png,application/xhtml+xml,*/*',
|
|
357
|
+
'image/png, text/html',
|
|
358
|
+
// One slash, then a comma or whitespace: a browser reads each as the type before it.
|
|
359
|
+
'image/png,x',
|
|
360
|
+
'image/png x',
|
|
361
|
+
'image/png\tx',
|
|
362
|
+
// A wildcard is an allowlist's word, never a file's type.
|
|
363
|
+
'image/*',
|
|
364
|
+
'*/*',
|
|
365
|
+
'image/png\0',
|
|
366
|
+
'image/png\rx',
|
|
367
|
+
'image/png\nx',
|
|
368
|
+
'image/',
|
|
369
|
+
'/png',
|
|
370
|
+
'image/png/extra',
|
|
371
|
+
]) {
|
|
372
|
+
const refused = await refusal(redeem(minted, target, { contentType, filename: 'a.png' }));
|
|
373
|
+
expect(reasonOf(refused), JSON.stringify(contentType)).toBe(UPLOAD_LINK_TYPE_REFUSED);
|
|
374
|
+
}
|
|
375
|
+
expect(await filesOf(target)).toEqual([]);
|
|
376
|
+
expect((await linkOf(minted.id)).state).toBe('pending');
|
|
377
|
+
// image/jpg is judged, and recorded, as image/jpeg.
|
|
378
|
+
const jpg = await mint(alice, { entity: target });
|
|
379
|
+
expect((await redeem(jpg, target, { contentType: 'image/jpg', filename: 'a.jpg' })).contentType).toBe('image/jpeg');
|
|
380
|
+
// An ordinary image spelled loosely is admitted, and recorded as its essence.
|
|
381
|
+
expect((await redeem(minted, target, { contentType: ' Image/PNG; q=1', filename: 'a.png' })).contentType).toBe('image/png');
|
|
382
|
+
// Each family leaves out the types a browser sniffs or parses as HTML; its ordinary members pass.
|
|
383
|
+
const file = { entityType: 'ufile', entityId: target.entityId };
|
|
384
|
+
const fileLink = await mint(alice, { entity: file });
|
|
385
|
+
for (const contentType of [
|
|
386
|
+
'text/xsl',
|
|
387
|
+
'application/unknown',
|
|
388
|
+
'unknown/unknown',
|
|
389
|
+
'multipart/x-mixed-replace',
|
|
390
|
+
'text/html',
|
|
391
|
+
'text/html,x',
|
|
392
|
+
'text/html x',
|
|
393
|
+
'text/html\tx',
|
|
394
|
+
'*/*',
|
|
395
|
+
'text/*',
|
|
396
|
+
]) {
|
|
397
|
+
const refused = await refusal(redeem(fileLink, file, { contentType, filename: 'a.bin', body: bytes('<p>x</p>') }));
|
|
398
|
+
expect(reasonOf(refused), JSON.stringify(contentType)).toBe(UPLOAD_LINK_TYPE_REFUSED);
|
|
399
|
+
}
|
|
400
|
+
expect((await linkOf(fileLink.id)).state).toBe('pending');
|
|
401
|
+
expect((await redeem(fileLink, file, { contentType: 'text/csv', filename: 'a.csv' })).contentType).toBe('text/csv');
|
|
402
|
+
// The multipart family's ordinary member still passes.
|
|
403
|
+
const mixed = await mint(alice, { entity: file });
|
|
404
|
+
expect((await redeem(mixed, file, { contentType: 'multipart/mixed', filename: 'a.eml' })).contentType).toBe('multipart/mixed');
|
|
405
|
+
// The twin: `upic` names `image/svg+xml` exactly, and takes it.
|
|
406
|
+
const pic = { entityType: 'upic', entityId: target.entityId };
|
|
407
|
+
const named = await mint(alice, { entity: pic });
|
|
408
|
+
const stored = await redeem(named, pic, { contentType: 'image/svg+xml', filename: 'a.svg', body: bytes(SVG) });
|
|
409
|
+
expect(stored.contentType).toBe('image/svg+xml');
|
|
410
|
+
});
|
|
411
|
+
it('a fixed file name overrides the uploader’s; without one the uploader’s is kept', async () => {
|
|
412
|
+
const target = udoc();
|
|
413
|
+
const fixed = await mint(alice, { entity: target, filename: 'signed.pdf' });
|
|
414
|
+
expect((await host.inspectUploadLink(t1, s1, fixed.secret)).filename).toBe('signed.pdf');
|
|
415
|
+
expect((await redeem(fixed, target, { filename: 'whatever.txt' })).filename).toBe('signed.pdf');
|
|
416
|
+
const free = await mint(alice, { entity: target });
|
|
417
|
+
expect((await redeem(free, target, { filename: 'mine.txt' })).filename).toBe('mine.txt');
|
|
418
|
+
});
|
|
419
|
+
it('visibility is the link’s: a customer-visible link writes a customer-visible file', async () => {
|
|
420
|
+
const target = udoc();
|
|
421
|
+
const minted = await mint(alice, { entity: target, visibility: 'customer' });
|
|
422
|
+
expect((await redeem(minted, target)).visibility).toBe('customer');
|
|
423
|
+
});
|
|
424
|
+
});
|
|
425
|
+
describe('the minter, now', () => {
|
|
426
|
+
it('taking the minter’s write key away refuses the redemption and spends nothing; giving it back allows it', async () => {
|
|
427
|
+
const carol = principalId.parse(ulid());
|
|
428
|
+
const role = { principalId: carol, roleKey: 'owner', node: { tenantId: t1, scopeId: s1 } };
|
|
429
|
+
await host.admin.assignRole(staff, role);
|
|
430
|
+
const target = udoc();
|
|
431
|
+
const minted = await mint(carol, { entity: target });
|
|
432
|
+
await host.admin.unassignRole(staff, role);
|
|
433
|
+
expect(errorCodeOf(await refusal(redeem(minted, target)))).toBe('permission_denied');
|
|
434
|
+
expect(await filesOf(target)).toEqual([]);
|
|
435
|
+
expect((await linkOf(minted.id)).state).toBe('pending');
|
|
436
|
+
await host.admin.assignRole(staff, role);
|
|
437
|
+
const record = await redeem(minted, target);
|
|
438
|
+
expect(record.createdBy).toBe(carol);
|
|
439
|
+
});
|
|
440
|
+
});
|
|
441
|
+
describe('copies', () => {
|
|
442
|
+
it('a fork never honours the source’s link, which still works at the source; a same-scope restore keeps it', async () => {
|
|
443
|
+
const target = udoc();
|
|
444
|
+
const minted = await mint(alice, { entity: target });
|
|
445
|
+
const fork = scopeId.parse(ulid());
|
|
446
|
+
await host.importScope(staff, { tenantId: t1, scopeId: fork, vertical: 'upl-vertical' }, await host.admin.exportScope(staff, t1, s1));
|
|
447
|
+
expect(errorCodeOf(await refusal(host.inspectUploadLink(t1, fork, minted.secret)))).toBe('not_found');
|
|
448
|
+
expect((await host.inspectUploadLink(t1, s1, minted.secret)).entity).toEqual(target);
|
|
449
|
+
await host.restoreScope(staff, t1, s1, await host.admin.exportScope(staff, t1, s1));
|
|
450
|
+
expect((await host.inspectUploadLink(t1, s1, minted.secret)).entity).toEqual(target);
|
|
451
|
+
expect((await redeem(minted, target)).entity).toEqual(target);
|
|
452
|
+
});
|
|
453
|
+
});
|
|
454
|
+
describe('the audit trail and the secret', () => {
|
|
455
|
+
it('minted, added and redeemed are on the spine in that order, as the minter; the redeemed event names the attachment', async () => {
|
|
456
|
+
const target = udoc();
|
|
457
|
+
const minted = await mint(alice, { entity: target, filename: 'trail.txt' });
|
|
458
|
+
const record = await redeem(minted, target);
|
|
459
|
+
const mine = (await events()).filter((e) => e.entity_id === target.entityId);
|
|
460
|
+
expect(mine.map((e) => e.type)).toEqual([
|
|
461
|
+
'attachment.upload-link-minted',
|
|
462
|
+
'attachment.added',
|
|
463
|
+
'attachment.upload-link-redeemed',
|
|
464
|
+
]);
|
|
465
|
+
for (const e of mine)
|
|
466
|
+
expect(JSON.parse(e.actor)).toBe(alice);
|
|
467
|
+
const redeemed = JSON.parse(mine[2].payload);
|
|
468
|
+
expect(redeemed).toMatchObject({ linkId: minted.id, attachmentId: record.id, size: record.size, sha256: record.sha256 });
|
|
469
|
+
// The mint's event carries what the link is, never the secret.
|
|
470
|
+
expect(JSON.stringify(mine)).not.toContain(minted.secret);
|
|
471
|
+
});
|
|
472
|
+
it('the secret is stored nowhere — its hash is — and a module that persists it is refused, the mint rolling back', async () => {
|
|
473
|
+
const target = udoc();
|
|
474
|
+
const minted = await mint(alice, { entity: target });
|
|
475
|
+
const dump = ((await (await as(alice)).invoke('upl/dump')) ?? []).join('\n');
|
|
476
|
+
expect(dump).not.toContain(minted.secret);
|
|
477
|
+
expect(dump).toContain(await capabilityTokenHash(minted.secret));
|
|
478
|
+
const leaky = udoc();
|
|
479
|
+
expect(await refusal(mint(alice, { entity: leaky }, 'upl/mint-and-leak'))).toBeDefined();
|
|
480
|
+
expect(await links(leaky)).toEqual([]);
|
|
481
|
+
});
|
|
482
|
+
});
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
//# 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;
|
|
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;AAgBvH,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,CAy8CN"}
|