wire-mesh-core 4.1.0 → 4.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/domain/tokens.cjs
CHANGED
|
@@ -374,6 +374,14 @@ async function canGrantVia(heldGrantCapability, deviceId, candidate, now) {
|
|
|
374
374
|
* When `parent` is given, every one of `tokens.cddl`'s own narrowing obligations is enforced here, at issuance, rather than left for the far end to discover minutes or hours later as a bare `delegation_exceeds_parent` from `verifyCapabilityToken` -- the same "fail loudly, fail early" reasoning that governs every other boundary in this codebase. An issuer minting an invalid delegation is a bug in the caller; this function refuses rather than producing a token indistinguishable from a valid one until someone else verifies it.
|
|
375
375
|
*/
|
|
376
376
|
async function mintCapabilityToken(options) {
|
|
377
|
+
for (const verb of [
|
|
378
|
+
options.capability,
|
|
379
|
+
options.grantsCapability,
|
|
380
|
+
options.requestsCapability
|
|
381
|
+
]) if (verb !== void 0 && !require_generated_protocol.capabilityVerbSchema.safeParse(verb).success) return {
|
|
382
|
+
ok: false,
|
|
383
|
+
reason: "invalid_capability"
|
|
384
|
+
};
|
|
377
385
|
if (options.expires <= options.clock.now()) return {
|
|
378
386
|
ok: false,
|
|
379
387
|
reason: "already_expired"
|
package/dist/domain/tokens.d.cts
CHANGED
|
@@ -67,7 +67,9 @@ export interface VerifyRevocationEntryOptions {
|
|
|
67
67
|
* Verifies one gossiped revocation-entry (management.cddl): a well-formed COSE_Sign1 whose signature verifies against its own embedded issuer-key, where that issuer-key is self-certifying (sha256(issuer-key.public-key) equals the claimed issuer device-id). A verifier that ingests a revocation-announce frame runs each entry through this before recording it in its revocation view; entries failing here are dropped, not stored. The issuer-match against a specific token's own issuer (only a token's own issuer may revoke it) is deliberately NOT checked here -- it happens at lookup time in RevocationCheck, against whichever token is being verified.
|
|
68
68
|
*/
|
|
69
69
|
export declare function verifyRevocationEntry(entry: RevocationEntry, options: VerifyRevocationEntryOptions): Promise<RevocationEntryVerdict>;
|
|
70
|
-
export type MintRefusalReason = "already_expired" |
|
|
70
|
+
export type MintRefusalReason = "already_expired" |
|
|
71
|
+
/** The capability, grants-capability or requests-capability is not a capability verb of the spec's grammar. */
|
|
72
|
+
"invalid_capability" | "parent_malformed" | "parent_bearer_mismatch" | "expires_exceeds_parent" | "scope_does_not_narrow" | "capability_mismatch" | "delegation_exceeds_parent" |
|
|
71
73
|
/** parent and authorised-by are mutually exclusive link kinds; a manage:grant capability must be minted through authorised-by only. */
|
|
72
74
|
"links_exclusive" |
|
|
73
75
|
/** The cited grant-capability did not decode, or its own conditions bytes did not. */
|
package/dist/domain/tokens.d.mts
CHANGED
|
@@ -67,7 +67,9 @@ export interface VerifyRevocationEntryOptions {
|
|
|
67
67
|
* Verifies one gossiped revocation-entry (management.cddl): a well-formed COSE_Sign1 whose signature verifies against its own embedded issuer-key, where that issuer-key is self-certifying (sha256(issuer-key.public-key) equals the claimed issuer device-id). A verifier that ingests a revocation-announce frame runs each entry through this before recording it in its revocation view; entries failing here are dropped, not stored. The issuer-match against a specific token's own issuer (only a token's own issuer may revoke it) is deliberately NOT checked here -- it happens at lookup time in RevocationCheck, against whichever token is being verified.
|
|
68
68
|
*/
|
|
69
69
|
export declare function verifyRevocationEntry(entry: RevocationEntry, options: VerifyRevocationEntryOptions): Promise<RevocationEntryVerdict>;
|
|
70
|
-
export type MintRefusalReason = "already_expired" |
|
|
70
|
+
export type MintRefusalReason = "already_expired" |
|
|
71
|
+
/** The capability, grants-capability or requests-capability is not a capability verb of the spec's grammar. */
|
|
72
|
+
"invalid_capability" | "parent_malformed" | "parent_bearer_mismatch" | "expires_exceeds_parent" | "scope_does_not_narrow" | "capability_mismatch" | "delegation_exceeds_parent" |
|
|
71
73
|
/** parent and authorised-by are mutually exclusive link kinds; a manage:grant capability must be minted through authorised-by only. */
|
|
72
74
|
"links_exclusive" |
|
|
73
75
|
/** The cited grant-capability did not decode, or its own conditions bytes did not. */
|
package/dist/domain/tokens.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { capabilityTokenSchema, revocationClaimsSchema, tokenClaimsSchema } from "../generated/protocol.mjs";
|
|
1
|
+
import { capabilityTokenSchema, capabilityVerbSchema, revocationClaimsSchema, tokenClaimsSchema } from "../generated/protocol.mjs";
|
|
2
2
|
import { bytesToHex } from "./device-id.mjs";
|
|
3
3
|
import { n as firstAsync } from "../sequential-D_W3THly.mjs";
|
|
4
4
|
import { bytesEqual, scopeNarrows } from "./token-scope.mjs";
|
|
@@ -373,6 +373,14 @@ async function canGrantVia(heldGrantCapability, deviceId, candidate, now) {
|
|
|
373
373
|
* When `parent` is given, every one of `tokens.cddl`'s own narrowing obligations is enforced here, at issuance, rather than left for the far end to discover minutes or hours later as a bare `delegation_exceeds_parent` from `verifyCapabilityToken` -- the same "fail loudly, fail early" reasoning that governs every other boundary in this codebase. An issuer minting an invalid delegation is a bug in the caller; this function refuses rather than producing a token indistinguishable from a valid one until someone else verifies it.
|
|
374
374
|
*/
|
|
375
375
|
async function mintCapabilityToken(options) {
|
|
376
|
+
for (const verb of [
|
|
377
|
+
options.capability,
|
|
378
|
+
options.grantsCapability,
|
|
379
|
+
options.requestsCapability
|
|
380
|
+
]) if (verb !== void 0 && !capabilityVerbSchema.safeParse(verb).success) return {
|
|
381
|
+
ok: false,
|
|
382
|
+
reason: "invalid_capability"
|
|
383
|
+
};
|
|
376
384
|
if (options.expires <= options.clock.now()) return {
|
|
377
385
|
ok: false,
|
|
378
386
|
reason: "already_expired"
|
|
@@ -201,8 +201,8 @@ const coreDomainNameSchema = zod.z.lazy(() => zod.z.union([
|
|
|
201
201
|
zod.z.literal("core/bulk"),
|
|
202
202
|
zod.z.literal("core/version")
|
|
203
203
|
]));
|
|
204
|
-
const namespacedDomainIdSchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+/[A-Za-z0-9_.-]+")));
|
|
205
|
-
const privateUseDomainIdSchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("x-[A-Za-z0-9_.-]+")));
|
|
204
|
+
const namespacedDomainIdSchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("^(?:[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+/[A-Za-z0-9_.-]+)$")));
|
|
205
|
+
const privateUseDomainIdSchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("^(?:x-[A-Za-z0-9_.-]+)$")));
|
|
206
206
|
const handshakeFrameSchema = zod.z.lazy(() => zod.z.object({
|
|
207
207
|
"type": zod.z.literal("handshake"),
|
|
208
208
|
"version": zod.z.lazy(() => protocolVersionSchema),
|
|
@@ -281,9 +281,9 @@ const topologyPeersSchema = zod.z.lazy(() => zod.z.object({
|
|
|
281
281
|
}));
|
|
282
282
|
const topologyGetSchema = zod.z.lazy(() => zod.z.object({ "verb": zod.z.literal("topology.get") }));
|
|
283
283
|
const roomPathSchema = zod.z.lazy(() => zod.z.union([zod.z.lazy(() => ownerNamedRoomPathSchema), zod.z.lazy(() => dmRoomPathSchema)]));
|
|
284
|
-
const deviceIdHexSchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("[0-9a-f]{64}")));
|
|
285
|
-
const ownerNamedRoomPathSchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("[0-9a-f]{64}/[A-Za-z0-9_-]+")));
|
|
286
|
-
const dmRoomPathSchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("[0-9a-f]{64}\\+[0-9a-f]{64}")));
|
|
284
|
+
const deviceIdHexSchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("^(?:[0-9a-f]{64})$")));
|
|
285
|
+
const ownerNamedRoomPathSchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("^(?:[0-9a-f]{64}/[A-Za-z0-9_-]+)$")));
|
|
286
|
+
const dmRoomPathSchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("^(?:[0-9a-f]{64}\\+[0-9a-f]{64})$")));
|
|
287
287
|
const roomSendSchema = zod.z.lazy(() => zod.z.object({
|
|
288
288
|
"verb": zod.z.literal("room.send"),
|
|
289
289
|
"message-id": zod.z.instanceof(Uint8Array),
|
|
@@ -438,9 +438,9 @@ const capabilityVerbSchema = zod.z.lazy(() => zod.z.union([
|
|
|
438
438
|
zod.z.lazy(() => namespacedCapabilitySchema),
|
|
439
439
|
zod.z.lazy(() => privateUseCapabilitySchema)
|
|
440
440
|
]));
|
|
441
|
-
const coreCapabilitySchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("[a-z][a-z0-9-]*:[a-z][a-z0-9-]*")));
|
|
442
|
-
const namespacedCapabilitySchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("[a-z0-9.-]+/[A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+")));
|
|
443
|
-
const privateUseCapabilitySchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("x-[A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+")));
|
|
441
|
+
const coreCapabilitySchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("^(?:[a-z][a-z0-9-]*:[a-z][a-z0-9-]*)$")));
|
|
442
|
+
const namespacedCapabilitySchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("^(?:[a-z0-9.-]+/[A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+)$")));
|
|
443
|
+
const privateUseCapabilitySchema = zod.z.lazy(() => zod.z.string().regex(/* @__PURE__ */ new RegExp("^(?:x-[A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+)$")));
|
|
444
444
|
const capabilityScopeSchema = zod.z.lazy(() => zod.z.object({
|
|
445
445
|
"kind": zod.z.string(),
|
|
446
446
|
"path": zod.z.string().optional()
|
|
@@ -200,8 +200,8 @@ const coreDomainNameSchema = z.lazy(() => z.union([
|
|
|
200
200
|
z.literal("core/bulk"),
|
|
201
201
|
z.literal("core/version")
|
|
202
202
|
]));
|
|
203
|
-
const namespacedDomainIdSchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+/[A-Za-z0-9_.-]+")));
|
|
204
|
-
const privateUseDomainIdSchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("x-[A-Za-z0-9_.-]+")));
|
|
203
|
+
const namespacedDomainIdSchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("^(?:[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+/[A-Za-z0-9_.-]+)$")));
|
|
204
|
+
const privateUseDomainIdSchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("^(?:x-[A-Za-z0-9_.-]+)$")));
|
|
205
205
|
const handshakeFrameSchema = z.lazy(() => z.object({
|
|
206
206
|
"type": z.literal("handshake"),
|
|
207
207
|
"version": z.lazy(() => protocolVersionSchema),
|
|
@@ -280,9 +280,9 @@ const topologyPeersSchema = z.lazy(() => z.object({
|
|
|
280
280
|
}));
|
|
281
281
|
const topologyGetSchema = z.lazy(() => z.object({ "verb": z.literal("topology.get") }));
|
|
282
282
|
const roomPathSchema = z.lazy(() => z.union([z.lazy(() => ownerNamedRoomPathSchema), z.lazy(() => dmRoomPathSchema)]));
|
|
283
|
-
const deviceIdHexSchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("[0-9a-f]{64}")));
|
|
284
|
-
const ownerNamedRoomPathSchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("[0-9a-f]{64}/[A-Za-z0-9_-]+")));
|
|
285
|
-
const dmRoomPathSchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("[0-9a-f]{64}\\+[0-9a-f]{64}")));
|
|
283
|
+
const deviceIdHexSchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("^(?:[0-9a-f]{64})$")));
|
|
284
|
+
const ownerNamedRoomPathSchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("^(?:[0-9a-f]{64}/[A-Za-z0-9_-]+)$")));
|
|
285
|
+
const dmRoomPathSchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("^(?:[0-9a-f]{64}\\+[0-9a-f]{64})$")));
|
|
286
286
|
const roomSendSchema = z.lazy(() => z.object({
|
|
287
287
|
"verb": z.literal("room.send"),
|
|
288
288
|
"message-id": z.instanceof(Uint8Array),
|
|
@@ -437,9 +437,9 @@ const capabilityVerbSchema = z.lazy(() => z.union([
|
|
|
437
437
|
z.lazy(() => namespacedCapabilitySchema),
|
|
438
438
|
z.lazy(() => privateUseCapabilitySchema)
|
|
439
439
|
]));
|
|
440
|
-
const coreCapabilitySchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("[a-z][a-z0-9-]*:[a-z][a-z0-9-]*")));
|
|
441
|
-
const namespacedCapabilitySchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("[a-z0-9.-]+/[A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+")));
|
|
442
|
-
const privateUseCapabilitySchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("x-[A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+")));
|
|
440
|
+
const coreCapabilitySchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("^(?:[a-z][a-z0-9-]*:[a-z][a-z0-9-]*)$")));
|
|
441
|
+
const namespacedCapabilitySchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("^(?:[a-z0-9.-]+/[A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+)$")));
|
|
442
|
+
const privateUseCapabilitySchema = z.lazy(() => z.string().regex(/* @__PURE__ */ new RegExp("^(?:x-[A-Za-z0-9_.-]+:[A-Za-z0-9_.-]+)$")));
|
|
443
443
|
const capabilityScopeSchema = z.lazy(() => z.object({
|
|
444
444
|
"kind": z.string(),
|
|
445
445
|
"path": z.string().optional()
|