ftown 0.20.9 → 0.21.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 (118) hide show
  1. package/dist/centrifugo-client.d.ts +15 -11
  2. package/dist/centrifugo-client.js +63 -70
  3. package/dist/centrifugo-client.js.map +1 -1
  4. package/dist/cli-client.d.ts +11 -1
  5. package/dist/cli-client.js +23 -3
  6. package/dist/cli-client.js.map +1 -1
  7. package/dist/command-rpc.js +4 -8
  8. package/dist/command-rpc.js.map +1 -1
  9. package/dist/identity-reset.d.ts +1 -0
  10. package/dist/identity-reset.js +31 -5
  11. package/dist/identity-reset.js.map +1 -1
  12. package/dist/index.js +184 -288
  13. package/dist/index.js.map +1 -1
  14. package/dist/ledger-pairing-client.d.ts +28 -0
  15. package/dist/ledger-pairing-client.js +152 -0
  16. package/dist/ledger-pairing-client.js.map +1 -0
  17. package/dist/ledger-relay.d.ts +124 -0
  18. package/dist/ledger-relay.js +453 -0
  19. package/dist/ledger-relay.js.map +1 -0
  20. package/dist/ledger-startup.d.ts +151 -0
  21. package/dist/ledger-startup.js +203 -0
  22. package/dist/ledger-startup.js.map +1 -0
  23. package/dist/relay-token.d.ts +39 -0
  24. package/dist/relay-token.js +130 -0
  25. package/dist/relay-token.js.map +1 -0
  26. package/dist/revocation-gating.d.ts +0 -13
  27. package/dist/revocation-gating.js +0 -16
  28. package/dist/revocation-gating.js.map +1 -1
  29. package/dist/security/bridge/identity.d.ts +2 -47
  30. package/dist/security/bridge/identity.js +3 -3
  31. package/dist/security/bridge/identity.js.map +1 -1
  32. package/dist/security/bridge/ledger-identity.d.ts +48 -0
  33. package/dist/security/bridge/ledger-identity.js +342 -0
  34. package/dist/security/bridge/ledger-identity.js.map +1 -0
  35. package/dist/security/bridge/ledger-store.d.ts +84 -0
  36. package/dist/security/bridge/ledger-store.js +485 -0
  37. package/dist/security/bridge/ledger-store.js.map +1 -0
  38. package/dist/security/bridge/metadata.d.ts +2 -2
  39. package/dist/security/bridge/permissions.js +2 -2
  40. package/dist/security/bridge/permissions.js.map +1 -1
  41. package/dist/security/bridge/policy.d.ts +42 -23
  42. package/dist/security/bridge/policy.js +214 -146
  43. package/dist/security/bridge/policy.js.map +1 -1
  44. package/dist/security/bridge/security.d.ts +84 -33
  45. package/dist/security/bridge/security.js +240 -166
  46. package/dist/security/bridge/security.js.map +1 -1
  47. package/dist/security/crypto.js +1 -1
  48. package/dist/security/crypto.js.map +1 -1
  49. package/dist/security/ledger/channels.d.ts +5 -0
  50. package/dist/security/ledger/channels.js +21 -0
  51. package/dist/security/ledger/channels.js.map +1 -0
  52. package/dist/security/ledger/ledger.d.ts +61 -0
  53. package/dist/security/ledger/ledger.js +597 -0
  54. package/dist/security/ledger/ledger.js.map +1 -0
  55. package/dist/security/ledger/pairing.d.ts +81 -0
  56. package/dist/security/ledger/pairing.js +414 -0
  57. package/dist/security/ledger/pairing.js.map +1 -0
  58. package/dist/security/ledger/proof.d.ts +24 -0
  59. package/dist/security/ledger/proof.js +161 -0
  60. package/dist/security/ledger/proof.js.map +1 -0
  61. package/dist/security/ledger/protocol.d.ts +100 -0
  62. package/dist/security/ledger/protocol.js +16 -0
  63. package/dist/security/ledger/protocol.js.map +1 -0
  64. package/dist/security/ledger/testing.d.ts +27 -0
  65. package/dist/security/ledger/testing.js +70 -0
  66. package/dist/security/ledger/testing.js.map +1 -0
  67. package/dist/security/ledger/webauthn.d.ts +12 -0
  68. package/dist/security/ledger/webauthn.js +147 -0
  69. package/dist/security/ledger/webauthn.js.map +1 -0
  70. package/dist/security/protocol.d.ts +5 -10
  71. package/dist/security-cli.d.ts +5 -0
  72. package/dist/security-cli.js +28 -16
  73. package/dist/security-cli.js.map +1 -1
  74. package/dist/token-provider.d.ts +39 -0
  75. package/dist/token-provider.js +101 -0
  76. package/dist/token-provider.js.map +1 -0
  77. package/dist/types.d.ts +1 -1
  78. package/package.json +2 -2
  79. package/skills/ftown/references/sessions.md +3 -2
  80. package/dist/bridge-auth.d.ts +0 -31
  81. package/dist/bridge-auth.js +0 -70
  82. package/dist/bridge-auth.js.map +0 -1
  83. package/dist/pairing-client.d.ts +0 -62
  84. package/dist/pairing-client.js +0 -469
  85. package/dist/pairing-client.js.map +0 -1
  86. package/dist/rotating-token-refresher.d.ts +0 -42
  87. package/dist/rotating-token-refresher.js +0 -91
  88. package/dist/rotating-token-refresher.js.map +0 -1
  89. package/dist/security/account-crypto.d.ts +0 -33
  90. package/dist/security/account-crypto.js +0 -649
  91. package/dist/security/account-crypto.js.map +0 -1
  92. package/dist/security/account-protocol.d.ts +0 -228
  93. package/dist/security/account-protocol.js +0 -2
  94. package/dist/security/account-protocol.js.map +0 -1
  95. package/dist/security/bridge/account-client.d.ts +0 -7
  96. package/dist/security/bridge/account-client.js +0 -101
  97. package/dist/security/bridge/account-client.js.map +0 -1
  98. package/dist/security/bridge/account-state.d.ts +0 -105
  99. package/dist/security/bridge/account-state.js +0 -79
  100. package/dist/security/bridge/account-state.js.map +0 -1
  101. package/dist/security/bridge/pending-approval.d.ts +0 -21
  102. package/dist/security/bridge/pending-approval.js +0 -80
  103. package/dist/security/bridge/pending-approval.js.map +0 -1
  104. package/dist/security/bridge/pending-enrollment.d.ts +0 -33
  105. package/dist/security/bridge/pending-enrollment.js +0 -177
  106. package/dist/security/bridge/pending-enrollment.js.map +0 -1
  107. package/dist/security/bridge/revocation.d.ts +0 -14
  108. package/dist/security/bridge/revocation.js +0 -40
  109. package/dist/security/bridge/revocation.js.map +0 -1
  110. package/dist/security/pending-approval-crypto.d.ts +0 -29
  111. package/dist/security/pending-approval-crypto.js +0 -716
  112. package/dist/security/pending-approval-crypto.js.map +0 -1
  113. package/dist/security/pending-approval-protocol.d.ts +0 -329
  114. package/dist/security/pending-approval-protocol.js +0 -2
  115. package/dist/security/pending-approval-protocol.js.map +0 -1
  116. package/dist/security/security-nudge.d.ts +0 -31
  117. package/dist/security/security-nudge.js +0 -98
  118. package/dist/security/security-nudge.js.map +0 -1
@@ -1,80 +0,0 @@
1
- import { legacyDateTimeSchema } from '../../zod-compat.js';
2
- import { join } from 'node:path';
3
- import { setTimeout as delay } from 'node:timers/promises';
4
- import { z } from 'zod';
5
- import { normalizePendingAccountHint } from '../pending-approval-crypto.js';
6
- import { AtomicSnapshot } from './snapshot.js';
7
- import { BridgeSecurityError } from './errors.js';
8
- const hash = z.string().regex(/^[A-Za-z0-9_-]{43}$/);
9
- const code = z.string().regex(/^[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}$/);
10
- const common = { version: z.literal(1), requestId: hash, processNonce: hash, expiresAt: legacyDateTimeSchema };
11
- const statusSchema = z.union([
12
- z.object({ ...common, phase: z.literal('waiting'), offerHash: hash.nullable(), comparisonCode: z.null() }).strict(),
13
- z.object({ ...common, phase: z.enum(['comparing', 'confirming']), offerHash: hash, comparisonCode: code }).strict(),
14
- z.object({ ...common, phase: z.enum(['approved', 'rejected', 'cancelled', 'expired', 'conflict']), offerHash: hash.nullable(), comparisonCode: z.null() }).strict(),
15
- ]);
16
- const decisionSchema = z.union([
17
- z.object({ ...common, decision: z.literal('confirm'), offerHash: hash, comparisonCode: code }).strict(),
18
- z.object({ ...common, decision: z.literal('reject'), offerHash: hash.nullable() }).strict(),
19
- ]);
20
- const terminal = (state) => ['approved', 'rejected', 'cancelled', 'expired', 'conflict'].includes(state.phase);
21
- /** The bridge is the only writer. CLI reads never modify this snapshot. */
22
- export async function writePendingBridgeStatus(dataDir, status) {
23
- const store = new AtomicSnapshot(join(dataDir, 'security', 'pending-approval-status.json'), z.object({ status: statusSchema }).strict(), () => ({ status }));
24
- await store.transact(state => { state.status = status; });
25
- }
26
- export async function readPendingBridgeStatus(dataDir) {
27
- const store = new AtomicSnapshot(join(dataDir, 'security', 'pending-approval-status.json'), z.object({ status: statusSchema }).strict().nullable(), () => null);
28
- const saved = await store.read(state => state?.status ?? null);
29
- if (!saved)
30
- throw new BridgeSecurityError('account_approval_required');
31
- return saved;
32
- }
33
- /** Called only by explicit OS-local CLI action, never by server status. */
34
- export async function submitPendingBridgeDecision(dataDir, decision, comparisonCode, now = Date.now()) {
35
- const status = await readPendingBridgeStatus(dataDir);
36
- if (terminal(status) || Date.parse(status.expiresAt) <= now)
37
- throw new BridgeSecurityError('account_enrollment_expired');
38
- const base = { version: 1, requestId: status.requestId, processNonce: status.processNonce, expiresAt: status.expiresAt };
39
- let value;
40
- if (decision === 'confirm') {
41
- if (status.phase !== 'comparing' || comparisonCode !== status.comparisonCode)
42
- throw new BridgeSecurityError('account_enrollment_invalid');
43
- value = { ...base, decision, offerHash: status.offerHash, comparisonCode };
44
- }
45
- else
46
- value = { ...base, decision, offerHash: status.offerHash };
47
- const store = new AtomicSnapshot(join(dataDir, 'security', 'pending-approval-confirmation.json'), z.object({ decision: decisionSchema }).strict(), () => ({ decision: value }));
48
- await store.transact(state => { state.decision = value; });
49
- }
50
- export function matchesPendingBridgeDecision(status, decision, now = Date.now()) {
51
- return !terminal(status) && Date.parse(status.expiresAt) > now && decision.requestId === status.requestId
52
- && decision.processNonce === status.processNonce && decision.offerHash === status.offerHash && decision.expiresAt === status.expiresAt
53
- && (decision.decision === 'reject' || (status.phase === 'comparing' && decision.comparisonCode === status.comparisonCode));
54
- }
55
- /** Reads a separate CLI-owned message file; never edits or deletes it. */
56
- export async function waitForPendingBridgeDecision(dataDir, status, signal) {
57
- const store = new AtomicSnapshot(join(dataDir, 'security', 'pending-approval-confirmation.json'), z.object({ decision: decisionSchema }).strict().nullable(), () => null);
58
- for (;;) {
59
- signal.throwIfAborted();
60
- if (Date.parse(status.expiresAt) <= Date.now())
61
- throw new BridgeSecurityError('account_enrollment_expired');
62
- const decision = await store.read(state => state?.decision ?? null);
63
- if (decision && matchesPendingBridgeDecision(status, decision))
64
- return decision;
65
- await delay(100, undefined, { signal });
66
- }
67
- }
68
- export async function selectBridgePairingMode(options, prompt) {
69
- if (options.account !== undefined && options.bootstrap)
70
- throw new Error('--account and --bootstrap cannot be combined');
71
- if (options.account !== undefined)
72
- return { method: 'pending-v1', accountHint: normalizePendingAccountHint(options.account) };
73
- if (options.previousPending && !options.bootstrap && !options.interactive)
74
- throw new Error('Previous inbox approval was interrupted. Restart with --account <email>, or select --bootstrap explicitly.');
75
- if (options.bootstrap || !options.interactive)
76
- return { method: 'bootstrap' };
77
- const entered = await prompt();
78
- return entered.trim() === '' ? { method: 'bootstrap' } : { method: 'pending-v1', accountHint: normalizePendingAccountHint(entered) };
79
- }
80
- //# sourceMappingURL=pending-approval.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pending-approval.js","sourceRoot":"","sources":["../../../src/security/bridge/pending-approval.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- import type { AccountEnrollmentLink, VerifiedAccountTrust } from '../account-protocol.js';
2
- import type { AccountEnrollmentRequest } from '../account-protocol.js';
3
- import type { PendingHello, PendingOffer } from '../pending-approval-protocol.js';
4
- import type { EndpointIdentity } from '../protocol.js';
5
- export interface PendingBridgeEnrollment {
6
- identity: EndpointIdentity;
7
- link: AccountEnrollmentLink;
8
- }
9
- export declare function previousPendingBridgeAttempt(dataDir: string): Promise<{
10
- requestId: string;
11
- candidateToken: string;
12
- } | null>;
13
- export declare function prepareBridgeEnrollment(dataDir: string, bridgeId: string, label: string, now?: number, fresh?: boolean): Promise<PendingBridgeEnrollment>;
14
- export interface PendingAutomaticEnrollment {
15
- identity: EndpointIdentity;
16
- request: Extract<AccountEnrollmentRequest, {
17
- kind: 'bridge';
18
- }>;
19
- candidateToken: string;
20
- previous: {
21
- requestId: string;
22
- candidateToken: string;
23
- } | null;
24
- pinOffer(offer: PendingOffer): Promise<void>;
25
- pinHello(hello: PendingHello): Promise<void>;
26
- }
27
- /** One fresh process attempt, retaining the long-term point even after cancellation/restart. */
28
- export declare function preparePendingBridgeEnrollment(dataDir: string, bridgeId: string, label: string, now?: number): Promise<PendingAutomaticEnrollment>;
29
- /** URL is constructed from operator configuration, never a service-provided redirect. */
30
- export declare function savePairingVerificationUrl(dataDir: string, apiUrl: string, userCode: string): Promise<string>;
31
- export declare function pendingPairingLink(dataDir: string, now?: number): Promise<string>;
32
- /** Save the normalized SAME private/public key and trusted bootstrap in one durable identity record. */
33
- export declare function bindPendingBridgeIdentity(dataDir: string, trust: VerifiedAccountTrust): Promise<EndpointIdentity>;
@@ -1,177 +0,0 @@
1
- import { readFile } from 'node:fs/promises';
2
- import { join } from 'node:path';
3
- import { z } from 'zod';
4
- import { createAccountEnrollment, encodeAccountEnrollmentLink, generateAccountBridgeCandidate, importAccountBridgeCandidate, parseAccountEnrollmentLink, verifyAccountHistory } from '../account-crypto.js';
5
- import { parsePendingOffer, pendingHelloHash, pendingOfferHash } from '../pending-approval-crypto.js';
6
- import { AtomicSnapshot } from './snapshot.js';
7
- import { endpointSchema } from './metadata.js';
8
- import { identityRecordSchema } from './identity.js';
9
- import { importEndpoint } from '../crypto.js';
10
- import { BridgeSecurityError } from './errors.js';
11
- import { accountReadUrl } from './account-client.js';
12
- const legacySchema = z.object({ version: z.literal(1), bridgeId: z.string().regex(/^[A-Za-z0-9_-]{1,200}$/),
13
- endpoint: endpointSchema, privateKey: identityRecordSchema.shape.privateKey,
14
- link: z.custom(), verificationUrl: z.string().max(4096).nullable() }).strict();
15
- const automaticSchema = z.object({ version: z.literal(2), bridgeId: z.string().regex(/^[A-Za-z0-9_-]{1,200}$/),
16
- endpoint: endpointSchema, privateKey: identityRecordSchema.shape.privateKey,
17
- request: z.custom(), candidateToken: z.string().regex(/^[A-Za-z0-9_-]{43}$/),
18
- offer: z.custom().nullable(), hello: z.custom().nullable() }).strict();
19
- const pendingSchema = z.discriminatedUnion('version', [legacySchema, automaticSchema]);
20
- const pendingPath = (dataDir) => join(dataDir, 'security', 'account-enrollment.json');
21
- async function readPending(dataDir) {
22
- let raw;
23
- try {
24
- raw = await readFile(pendingPath(dataDir), 'utf8');
25
- }
26
- catch (error) {
27
- if (error.code === 'ENOENT')
28
- return null;
29
- throw new BridgeSecurityError('account_storage_unavailable');
30
- }
31
- try {
32
- const saved = pendingSchema.parse(JSON.parse(raw));
33
- if (saved.version === 1)
34
- encodeAccountEnrollmentLink(saved.link);
35
- else {
36
- const parsed = await parseAccountEnrollmentLink({ request: saved.request, secret: saved.candidateToken }, Date.parse(saved.request.expiresAt) - 1);
37
- if (parsed.request.kind !== 'bridge' || parsed.request.bridgeId !== saved.bridgeId)
38
- throw new Error('Wrong pending context');
39
- }
40
- return saved;
41
- }
42
- catch {
43
- throw new BridgeSecurityError('account_storage_unavailable');
44
- }
45
- }
46
- export async function previousPendingBridgeAttempt(dataDir) {
47
- const existing = await readPending(dataDir);
48
- return existing?.version === 2 ? { requestId: existing.request.requestId, candidateToken: existing.candidateToken } : null;
49
- }
50
- export async function prepareBridgeEnrollment(dataDir, bridgeId, label, now = Date.now(), fresh = false) {
51
- const existing = await readPending(dataDir);
52
- if (existing && existing.bridgeId !== bridgeId)
53
- throw new BridgeSecurityError('wrong_context');
54
- const unexpired = !fresh && existing?.version === 1 && Date.parse(existing.link.request.expiresAt) > now;
55
- let initial = existing;
56
- if (!unexpired) {
57
- // Expiring a request rotates its challenge/secret, never the pending bridge point.
58
- // Approval may already exist remotely even when its response was lost.
59
- const identity = existing ? await importAccountBridgeCandidate(existing.endpoint, existing.privateKey, false)
60
- : await generateAccountBridgeCandidate(bridgeId, true);
61
- initial = legacySchema.parse({ version: 1, bridgeId, endpoint: identity.endpoint,
62
- privateKey: existing?.privateKey ?? await crypto.subtle.exportKey('jwk', identity.keyPair.privateKey),
63
- link: await createAccountEnrollment(identity, label.slice(0, 200), null, bridgeId, now), verificationUrl: null });
64
- }
65
- const store = new AtomicSnapshot(pendingPath(dataDir), pendingSchema, () => initial);
66
- const saved = await store.transact(state => {
67
- if (!unexpired && existing) {
68
- for (const key of Object.keys(state))
69
- delete state[key];
70
- Object.assign(state, initial);
71
- }
72
- return state;
73
- });
74
- if (saved.version !== 1)
75
- throw new BridgeSecurityError('account_enrollment_invalid');
76
- const link = await parseAccountEnrollmentLink(saved.link, now);
77
- if (link.request.kind !== 'bridge' || link.request.bridgeId !== bridgeId || link.request.candidate.id !== saved.endpoint.id
78
- || link.request.candidate.publicKey !== saved.endpoint.publicKey || link.request.candidate.ownerId !== saved.endpoint.ownerId)
79
- throw new BridgeSecurityError('account_enrollment_invalid');
80
- return { identity: await importAccountBridgeCandidate(saved.endpoint, saved.privateKey, false), link };
81
- }
82
- /** One fresh process attempt, retaining the long-term point even after cancellation/restart. */
83
- export async function preparePendingBridgeEnrollment(dataDir, bridgeId, label, now = Date.now()) {
84
- const existing = await readPending(dataDir);
85
- if (existing && existing.bridgeId !== bridgeId)
86
- throw new BridgeSecurityError('wrong_context');
87
- const identity = existing ? await importAccountBridgeCandidate(existing.endpoint, existing.privateKey, false)
88
- : await generateAccountBridgeCandidate(bridgeId, true);
89
- const generated = await createAccountEnrollment(identity, label.slice(0, 200), null, bridgeId, now);
90
- const record = automaticSchema.parse({ version: 2, bridgeId, endpoint: identity.endpoint,
91
- privateKey: existing?.privateKey ?? await crypto.subtle.exportKey('jwk', identity.keyPair.privateKey),
92
- request: generated.request, candidateToken: Buffer.from(crypto.getRandomValues(new Uint8Array(32))).toString('base64url'), offer: null, hello: null });
93
- // transact replaces fields in place; its initial state must not alias the source record.
94
- const store = new AtomicSnapshot(pendingPath(dataDir), pendingSchema, () => structuredClone(record));
95
- await store.transact(state => {
96
- for (const key of Object.keys(state))
97
- delete state[key];
98
- Object.assign(state, record);
99
- });
100
- const current = async (update) => store.transact(async (state) => {
101
- if (state.version !== 2 || state.request.requestId !== record.request.requestId || state.candidateToken !== record.candidateToken)
102
- throw new BridgeSecurityError('account_trust_conflict');
103
- await update(state);
104
- });
105
- return {
106
- identity: await importAccountBridgeCandidate(record.endpoint, record.privateKey, false),
107
- request: record.request, candidateToken: record.candidateToken,
108
- previous: existing?.version === 2 ? { requestId: existing.request.requestId, candidateToken: existing.candidateToken } : null,
109
- pinOffer: offer => current(async (state) => {
110
- await parsePendingOffer(offer, state.request);
111
- if (state.offer && await pendingOfferHash(state.offer) !== await pendingOfferHash(offer))
112
- throw new BridgeSecurityError('account_trust_conflict');
113
- state.offer ??= offer;
114
- }),
115
- pinHello: hello => current(async (state) => {
116
- if (!state.offer || hello.requestId !== state.request.requestId || hello.offerHash !== await pendingOfferHash(state.offer))
117
- throw new BridgeSecurityError('wrong_context');
118
- if (state.hello && await pendingHelloHash(state.hello) !== await pendingHelloHash(hello))
119
- throw new BridgeSecurityError('account_trust_conflict');
120
- state.hello ??= hello;
121
- }),
122
- };
123
- }
124
- /** URL is constructed from operator configuration, never a service-provided redirect. */
125
- export async function savePairingVerificationUrl(dataDir, apiUrl, userCode) {
126
- accountReadUrl(apiUrl);
127
- if (!/^[A-Za-z0-9-]{1,100}$/.test(userCode))
128
- throw new BridgeSecurityError('account_enrollment_invalid');
129
- const url = new URL('/pair', apiUrl);
130
- url.searchParams.set('code', userCode);
131
- const existing = await readPending(dataDir);
132
- if (!existing || existing.version !== 1)
133
- throw new BridgeSecurityError('account_enrollment_invalid');
134
- const store = new AtomicSnapshot(pendingPath(dataDir), pendingSchema, () => existing);
135
- await store.transact(state => { if (state.version !== 1)
136
- throw new BridgeSecurityError('account_trust_conflict'); state.verificationUrl = url.href; });
137
- return url.href;
138
- }
139
- export async function pendingPairingLink(dataDir, now = Date.now()) {
140
- const saved = await readPending(dataDir);
141
- if (!saved || saved.version !== 1 || !saved.verificationUrl)
142
- throw new BridgeSecurityError('account_enrollment_invalid');
143
- const link = await parseAccountEnrollmentLink(saved.link, now);
144
- const url = new URL(saved.verificationUrl);
145
- accountReadUrl(url.origin);
146
- if (url.pathname !== '/pair' || url.hash || url.username || url.password || [...url.searchParams.keys()].some(key => key !== 'code')) {
147
- throw new BridgeSecurityError('account_enrollment_invalid');
148
- }
149
- url.hash = `account=${encodeAccountEnrollmentLink(link)}`;
150
- return url.href;
151
- }
152
- /** Save the normalized SAME private/public key and trusted bootstrap in one durable identity record. */
153
- export async function bindPendingBridgeIdentity(dataDir, trust) {
154
- const pending = await readPending(dataDir);
155
- if (!pending)
156
- throw new BridgeSecurityError('account_enrollment_invalid');
157
- const checkpoint = await verifyAccountHistory(trust.history, trust.checkpoint);
158
- const own = checkpoint.bridges.find(item => item.bridgeId === pending.bridgeId);
159
- if (!own || own.endpoint.id !== pending.endpoint.id || own.endpoint.publicKey !== pending.endpoint.publicKey)
160
- throw new BridgeSecurityError('wrong_context');
161
- await importAccountBridgeCandidate(pending.endpoint, pending.privateKey, false);
162
- const record = identityRecordSchema.parse({ version: 1, endpoint: own.endpoint, privateKey: pending.privateKey,
163
- accountBootstrap: { checkpoint, history: trust.history } });
164
- const store = new AtomicSnapshot(join(dataDir, 'security', 'bridge-identity.json'), identityRecordSchema, () => record);
165
- const saved = await store.transact(state => {
166
- if (state.endpoint.id !== record.endpoint.id || state.endpoint.ownerId !== record.endpoint.ownerId
167
- || state.endpoint.publicKey !== record.endpoint.publicKey)
168
- throw new BridgeSecurityError('wrong_context');
169
- // A pre-existing bound identity is never repinned by repeating bootstrap.
170
- if (state.accountBootstrap && state.accountBootstrap.checkpoint.rootId !== checkpoint.rootId)
171
- throw new BridgeSecurityError('account_trust_rollback');
172
- state.accountBootstrap ??= record.accountBootstrap;
173
- return state;
174
- });
175
- return importEndpoint(saved.endpoint, saved.privateKey, false);
176
- }
177
- //# sourceMappingURL=pending-enrollment.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pending-enrollment.js","sourceRoot":"","sources":["../../../src/security/bridge/pending-enrollment.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- import type { AccountCheckpoint, AccountHistory } from '../account-protocol.js';
2
- export declare function parseBridgeRevokedBody(body: string): AccountHistory | null;
3
- export declare function isOwnBridgeRevoked(checkpoint: AccountCheckpoint | null, bridgeId: string): boolean;
4
- export declare function confirmOwnRevocation(input: {
5
- evidence: AccountHistory;
6
- pinned: AccountCheckpoint | null;
7
- bridgeId: string;
8
- now?: number;
9
- }): Promise<boolean>;
10
- /** Thrown when the account service answers a signed 'bridge_revoked' refusal; the evidence is still unverified. */
11
- export declare class AccountBridgeRevoked extends Error {
12
- readonly evidence: AccountHistory;
13
- constructor(evidence: AccountHistory);
14
- }
@@ -1,40 +0,0 @@
1
- import { parseAccountHistory, verifyAccountHistory } from '../account-crypto.js';
2
- export function parseBridgeRevokedBody(body) {
3
- try {
4
- const value = JSON.parse(body);
5
- if (value === null || typeof value !== 'object' || Array.isArray(value))
6
- return null;
7
- const record = value;
8
- if (record.error !== 'bridge_revoked' || record.history === undefined)
9
- return null;
10
- return parseAccountHistory(record.history);
11
- }
12
- catch {
13
- return null;
14
- }
15
- }
16
- export function isOwnBridgeRevoked(checkpoint, bridgeId) {
17
- return checkpoint !== null && checkpoint.revokedBridgeIds.indexOf(bridgeId) !== -1;
18
- }
19
- export async function confirmOwnRevocation(input) {
20
- try {
21
- if (input.pinned === null)
22
- return false;
23
- // The pin is mandatory: verifying without it would accept a forked history that merely revokes this bridge.
24
- const checkpoint = await verifyAccountHistory(input.evidence, input.pinned, input.now);
25
- return isOwnBridgeRevoked(checkpoint, input.bridgeId);
26
- }
27
- catch {
28
- return false;
29
- }
30
- }
31
- /** Thrown when the account service answers a signed 'bridge_revoked' refusal; the evidence is still unverified. */
32
- export class AccountBridgeRevoked extends Error {
33
- evidence;
34
- constructor(evidence) {
35
- super('Account bridge revoked');
36
- this.name = 'AccountBridgeRevoked';
37
- this.evidence = evidence;
38
- }
39
- }
40
- //# sourceMappingURL=revocation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"revocation.js","sourceRoot":"","sources":["../../../src/security/bridge/revocation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEjF,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,IAAI,CAAC;QACH,MAAM,KAAK,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACrF,MAAM,MAAM,GAAG,KAAgC,CAAC;QAChD,IAAI,MAAM,CAAC,KAAK,KAAK,gBAAgB,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QACnF,OAAO,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,UAAoC,EAAE,QAAgB;IACvF,OAAO,UAAU,KAAK,IAAI,IAAI,UAAU,CAAC,gBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,KAAqG;IAC9I,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,KAAK,CAAC;QACxC,4GAA4G;QAC5G,MAAM,UAAU,GAAG,MAAM,oBAAoB,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QACvF,OAAO,kBAAkB,CAAC,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,mHAAmH;AACnH,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,QAAQ,CAAiB;IAClC,YAAY,QAAwB;QAClC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;CACF"}
@@ -1,29 +0,0 @@
1
- import type { AccountEnrollmentLink, AccountEnrollmentRequest, AccountHistory, AccountSigningIdentity } from './account-protocol.js';
2
- import type { EndpointIdentity } from './protocol.js';
3
- import type { PendingApprovalState, PendingCandidateConfirmation, PendingHello, PendingHelloLocal, PendingOffer, PendingOfferLocal, PendingOpenResult, PendingResult, PendingReveal, PendingReviewerCommand, PendingReviewerPayload, PendingSecret } from './pending-approval-protocol.js';
4
- export declare const PENDING_APPROVAL_LIMITS: Readonly<{
5
- lifetimeMs: 300000;
6
- pollIntervalMs: 2000;
7
- requestTimeoutMs: 15000;
8
- maxPendingPerTarget: 128;
9
- maxPendingGlobal: 4096;
10
- maxWireBytes: 65536;
11
- maxInboxBytes: 524288;
12
- maxFutureSkewMs: 30000;
13
- }>;
14
- export declare function normalizePendingAccountHint(value: unknown): string;
15
- export declare function createPendingOffer(req: AccountEnrollmentRequest, approver: EndpointIdentity, signing: AccountSigningIdentity, history: AccountHistory, now?: number): Promise<PendingOfferLocal>;
16
- export declare function parsePendingOffer(value: unknown, req: AccountEnrollmentRequest, now?: number): Promise<PendingOffer>;
17
- export declare function pendingOfferHash(value: PendingOffer): Promise<string>;
18
- export declare function pendingHelloHash(value: PendingHello): Promise<string>;
19
- export declare function createPendingHello(candidate: EndpointIdentity, value: PendingOffer, now?: number): Promise<PendingHelloLocal>;
20
- export declare function openPendingHello(approver: EndpointIdentity, value: PendingOfferLocal, packet: PendingHello, now?: number): Promise<PendingSecret>;
21
- export declare function pendingComparisonCode(value: PendingOffer, key: PendingSecret, disclosure: PendingReveal): Promise<string>;
22
- export declare function createPendingConfirmation(value: PendingOffer, key: PendingSecret, disclosure: PendingReveal, confirmedOfferHash: string): Promise<PendingCandidateConfirmation>;
23
- export declare function verifyPendingConfirmation(value: PendingOffer, key: PendingSecret, disclosure: PendingReveal, proof: PendingCandidateConfirmation): Promise<void>;
24
- export declare function pendingBootstrapLink(value: PendingOffer, key: PendingSecret, disclosure: PendingReveal): Promise<AccountEnrollmentLink>;
25
- export declare function createPendingResult(approver: EndpointIdentity, value: PendingOfferLocal, key: PendingSecret, proof: PendingCandidateConfirmation, confirmedOfferHash: string, history: AccountHistory, now?: number): Promise<PendingResult>;
26
- export declare function openPendingResult(candidate: EndpointIdentity, value: PendingOffer, key: PendingSecret, disclosure: PendingReveal, confirmedOfferHash: string, received: PendingResult, history: AccountHistory, now?: number): Promise<PendingOpenResult>;
27
- export declare function signPendingAction(payload: PendingReviewerPayload, signing: AccountSigningIdentity): Promise<PendingReviewerCommand>;
28
- export declare function verifyPendingAction(value: unknown, req: AccountEnrollmentRequest, history: AccountHistory, now?: number): Promise<PendingReviewerCommand>;
29
- export declare function parsePendingState(value: unknown, now?: number): Promise<PendingApprovalState>;