ftown 0.19.54 → 0.19.55
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/index.js +79 -5
- package/dist/index.js.map +1 -1
- package/dist/pairing-client.d.ts +15 -0
- package/dist/pairing-client.js +349 -6
- package/dist/pairing-client.js.map +1 -1
- package/dist/security/bridge/pending-approval.d.ts +21 -0
- package/dist/security/bridge/pending-approval.js +79 -0
- package/dist/security/bridge/pending-approval.js.map +1 -0
- package/dist/security/bridge/pending-enrollment.d.ts +22 -1
- package/dist/security/bridge/pending-enrollment.js +73 -9
- package/dist/security/bridge/pending-enrollment.js.map +1 -1
- package/dist/security/pending-approval-crypto.d.ts +29 -0
- package/dist/security/pending-approval-crypto.js +716 -0
- package/dist/security/pending-approval-crypto.js.map +1 -0
- package/dist/security/pending-approval-protocol.d.ts +329 -0
- package/dist/security/pending-approval-protocol.js +2 -0
- package/dist/security/pending-approval-protocol.js.map +1 -0
- package/dist/security-cli.js +8 -0
- package/dist/security-cli.js.map +1 -1
- package/package.json +2 -2
package/dist/pairing-client.js
CHANGED
|
@@ -12,14 +12,15 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { encodeAccountEnrollmentLink, parseAccountEnrollmentLink } from './security/account-crypto.js';
|
|
14
14
|
import { accountReadUrl } from './security/bridge/account-client.js';
|
|
15
|
+
import { readAccountHistory } from './security/bridge/account-client.js';
|
|
16
|
+
import { AccountTrustError } from './security/account-crypto.js';
|
|
17
|
+
import { createPendingConfirmation, createPendingHello, normalizePendingAccountHint, openPendingResult, parsePendingOffer, parsePendingState, pendingComparisonCode, pendingHelloHash, pendingOfferHash, PENDING_APPROVAL_LIMITS } from './security/pending-approval-crypto.js';
|
|
18
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
19
|
+
import { matchesPendingBridgeDecision } from './security/bridge/pending-approval.js';
|
|
15
20
|
const realSleep = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
16
|
-
/**
|
|
17
|
-
* Drive the pairing flow to completion.
|
|
18
|
-
*
|
|
19
|
-
* Resolves with the token bundle on approval; rejects (with a clear, secret-free
|
|
20
|
-
* message) on denial, expiry/consumption/unknown, or overall timeout.
|
|
21
|
-
*/
|
|
22
21
|
export async function runPairing(opts) {
|
|
22
|
+
if (opts.pending)
|
|
23
|
+
return runPendingPairing(opts, opts.pending);
|
|
23
24
|
const { apiUrl, bridgeId, hostname, platform, localPort, localNonce, fetchImpl = fetch, sleepImpl = realSleep, log = (msg) => console.log(msg), } = opts;
|
|
24
25
|
const enrollment = opts.enrollment ? await parseAccountEnrollmentLink(opts.enrollment) : undefined;
|
|
25
26
|
if (enrollment && (enrollment.request.kind !== 'bridge' || enrollment.request.bridgeId !== bridgeId))
|
|
@@ -103,6 +104,348 @@ export async function runPairing(opts) {
|
|
|
103
104
|
}
|
|
104
105
|
}
|
|
105
106
|
}
|
|
107
|
+
class PendingNetworkError extends Error {
|
|
108
|
+
constructor() { super('Computer approval service is temporarily unavailable.'); }
|
|
109
|
+
}
|
|
110
|
+
function record(value) {
|
|
111
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
112
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
113
|
+
return value;
|
|
114
|
+
}
|
|
115
|
+
function text(value, limit = 16384) {
|
|
116
|
+
if (typeof value !== 'string' || value.length < 1 || value.length > limit)
|
|
117
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
118
|
+
return value;
|
|
119
|
+
}
|
|
120
|
+
async function abortable(promise, signal) {
|
|
121
|
+
signal.throwIfAborted();
|
|
122
|
+
let listener;
|
|
123
|
+
try {
|
|
124
|
+
return await Promise.race([promise, new Promise((_resolve, reject) => {
|
|
125
|
+
listener = () => reject(signal.reason);
|
|
126
|
+
signal.addEventListener('abort', listener, { once: true });
|
|
127
|
+
if (signal.aborted)
|
|
128
|
+
listener();
|
|
129
|
+
})]);
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
if (listener)
|
|
133
|
+
signal.removeEventListener('abort', listener);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/** Bound the entire fetch AND body read, and never send a credential through a redirect. */
|
|
137
|
+
async function pendingJson(opts, path, body, lifetime) {
|
|
138
|
+
const base = accountReadUrl(opts.apiUrl);
|
|
139
|
+
const url = new URL(path, base.origin);
|
|
140
|
+
if (url.origin !== base.origin || !path.startsWith('/api/'))
|
|
141
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
142
|
+
const encoded = JSON.stringify(body);
|
|
143
|
+
if (Buffer.byteLength(encoded) > PENDING_APPROVAL_LIMITS.maxWireBytes)
|
|
144
|
+
throw new AccountTrustError('account_capacity_exceeded');
|
|
145
|
+
const timeout = new AbortController();
|
|
146
|
+
const timer = setTimeout(() => timeout.abort(new PendingNetworkError()), PENDING_APPROVAL_LIMITS.requestTimeoutMs);
|
|
147
|
+
const signal = AbortSignal.any([lifetime, timeout.signal]);
|
|
148
|
+
try {
|
|
149
|
+
const result = await abortable((async () => {
|
|
150
|
+
let response;
|
|
151
|
+
try {
|
|
152
|
+
response = await (opts.fetchImpl ?? fetch)(url, { method: 'POST', headers: { 'Content-Type': 'application/json' },
|
|
153
|
+
body: encoded, redirect: 'manual', cache: 'no-store', signal });
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
if (lifetime.aborted)
|
|
157
|
+
lifetime.throwIfAborted();
|
|
158
|
+
throw new PendingNetworkError();
|
|
159
|
+
}
|
|
160
|
+
if (response.status >= 300 && response.status < 400)
|
|
161
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
162
|
+
if (response.status === 429 || response.status >= 500)
|
|
163
|
+
throw new PendingNetworkError();
|
|
164
|
+
if (!response.ok)
|
|
165
|
+
throw new AccountTrustError(response.status === 409 ? 'account_trust_conflict'
|
|
166
|
+
: response.status === 410 ? 'account_enrollment_expired' : 'account_enrollment_invalid');
|
|
167
|
+
const declared = response.headers.get('content-length');
|
|
168
|
+
if (declared !== null && (!/^\d+$/.test(declared) || Number(declared) > PENDING_APPROVAL_LIMITS.maxWireBytes))
|
|
169
|
+
throw new AccountTrustError('account_capacity_exceeded');
|
|
170
|
+
const reader = response.body?.getReader();
|
|
171
|
+
if (!reader)
|
|
172
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
173
|
+
const cancel = () => { void reader.cancel().catch(() => undefined); };
|
|
174
|
+
signal.addEventListener('abort', cancel, { once: true });
|
|
175
|
+
if (signal.aborted)
|
|
176
|
+
cancel();
|
|
177
|
+
const chunks = [];
|
|
178
|
+
let size = 0;
|
|
179
|
+
try {
|
|
180
|
+
for (;;) {
|
|
181
|
+
let next;
|
|
182
|
+
try {
|
|
183
|
+
next = await reader.read();
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
signal.throwIfAborted();
|
|
187
|
+
throw new PendingNetworkError();
|
|
188
|
+
}
|
|
189
|
+
const { done, value } = next;
|
|
190
|
+
if (done)
|
|
191
|
+
break;
|
|
192
|
+
size += value.byteLength;
|
|
193
|
+
if (size > PENDING_APPROVAL_LIMITS.maxWireBytes)
|
|
194
|
+
throw new AccountTrustError('account_capacity_exceeded');
|
|
195
|
+
chunks.push(value);
|
|
196
|
+
}
|
|
197
|
+
const bytes = Buffer.concat(chunks);
|
|
198
|
+
try {
|
|
199
|
+
return JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes));
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
finally {
|
|
206
|
+
signal.removeEventListener('abort', cancel);
|
|
207
|
+
if (signal.aborted || size > PENDING_APPROVAL_LIMITS.maxWireBytes)
|
|
208
|
+
cancel();
|
|
209
|
+
reader.releaseLock();
|
|
210
|
+
}
|
|
211
|
+
})(), signal);
|
|
212
|
+
lifetime.throwIfAborted();
|
|
213
|
+
return result;
|
|
214
|
+
}
|
|
215
|
+
finally {
|
|
216
|
+
clearTimeout(timer);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
async function runPendingPairing(opts, ctx) {
|
|
220
|
+
if (opts.enrollment || ctx.request.kind !== 'bridge' || ctx.request.bridgeId !== opts.bridgeId
|
|
221
|
+
|| !isDeepStrictEqual(ctx.request.candidate, ctx.identity.endpoint) || !/^[A-Za-z0-9_-]{43}$/.test(ctx.candidateToken))
|
|
222
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
223
|
+
const hint = normalizePendingAccountHint(opts.accountHint);
|
|
224
|
+
const expires = Date.parse(ctx.request.expiresAt);
|
|
225
|
+
const expiry = new AbortController();
|
|
226
|
+
const timer = setTimeout(() => expiry.abort(new AccountTrustError('account_enrollment_expired')), Math.max(0, expires - Date.now()));
|
|
227
|
+
const signal = AbortSignal.any([ctx.signal, expiry.signal]);
|
|
228
|
+
const processNonce = Buffer.from(crypto.getRandomValues(new Uint8Array(32))).toString('base64url');
|
|
229
|
+
let offer;
|
|
230
|
+
let packet;
|
|
231
|
+
let confirmedOfferHash;
|
|
232
|
+
let credentials;
|
|
233
|
+
let localStatus = { version: 1, requestId: ctx.request.requestId, processNonce,
|
|
234
|
+
expiresAt: ctx.request.expiresAt, phase: 'waiting', offerHash: null, comparisonCode: null };
|
|
235
|
+
let decision;
|
|
236
|
+
let decisionController = new AbortController();
|
|
237
|
+
let statusKey = '';
|
|
238
|
+
const assertLive = () => { signal.throwIfAborted(); if (Date.now() >= expires)
|
|
239
|
+
throw new AccountTrustError('account_enrollment_expired'); };
|
|
240
|
+
const updateStatus = async (next) => {
|
|
241
|
+
const key = JSON.stringify(next);
|
|
242
|
+
if (key === statusKey)
|
|
243
|
+
return;
|
|
244
|
+
assertLive();
|
|
245
|
+
await ctx.onLocalStatus(next);
|
|
246
|
+
assertLive();
|
|
247
|
+
statusKey = key;
|
|
248
|
+
localStatus = next;
|
|
249
|
+
decision = undefined;
|
|
250
|
+
decisionController.abort();
|
|
251
|
+
decisionController = new AbortController();
|
|
252
|
+
if (next.phase === 'waiting' || next.phase === 'comparing' || next.phase === 'confirming') {
|
|
253
|
+
const current = decisionController;
|
|
254
|
+
void ctx.waitForLocalDecision(next, AbortSignal.any([signal, current.signal])).then(value => {
|
|
255
|
+
if (!current.signal.aborted && !signal.aborted && matchesPendingBridgeDecision(next, value))
|
|
256
|
+
decision = value;
|
|
257
|
+
}).catch(error => { if (!current.signal.aborted && !signal.aborted)
|
|
258
|
+
expiry.abort(error); });
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
const wait = () => abortable((opts.sleepImpl ?? realSleep)(PENDING_APPROVAL_LIMITS.pollIntervalMs), signal);
|
|
262
|
+
const rpc = (action) => pendingJson(opts, `/api/security/approvals/${ctx.request.requestId}/candidate`, { candidateToken: ctx.candidateToken, action }, signal);
|
|
263
|
+
let deviceCode;
|
|
264
|
+
let latest;
|
|
265
|
+
const checkRejection = async () => {
|
|
266
|
+
if (decision?.decision !== 'reject' || !matchesPendingBridgeDecision(localStatus, decision))
|
|
267
|
+
return;
|
|
268
|
+
await updateStatus({ ...localStatus, phase: 'cancelled', comparisonCode: null });
|
|
269
|
+
await rpc({ type: 'cancel', expectedRevision: latest?.revision ?? 0 }).catch(() => undefined);
|
|
270
|
+
throw new Error('Computer approval cancelled locally.');
|
|
271
|
+
};
|
|
272
|
+
try {
|
|
273
|
+
await updateStatus(localStatus);
|
|
274
|
+
(opts.log ?? console.log)('Waiting for approval in your trusted browser. Run ftown security pair-status to compare, then pair-confirm CODE or pair-reject.');
|
|
275
|
+
// Retry EXACT create payload: token and request were durable before this first HTTP call.
|
|
276
|
+
const startBody = { bridgeId: opts.bridgeId, hostname: opts.hostname, platform: opts.platform,
|
|
277
|
+
approvalMethod: 'pending-v1', accountHint: hint, candidateToken: ctx.candidateToken, enrollment: ctx.request };
|
|
278
|
+
for (;;) {
|
|
279
|
+
assertLive();
|
|
280
|
+
await checkRejection();
|
|
281
|
+
try {
|
|
282
|
+
const start = record(await pendingJson(opts, '/api/auth/bridge/pair/start', startBody, signal));
|
|
283
|
+
deviceCode = text(start.deviceCode, 200);
|
|
284
|
+
text(start.userCode, 100);
|
|
285
|
+
text(start.verificationUri, 4096);
|
|
286
|
+
if (!Number.isInteger(start.intervalMs) || Number(start.intervalMs) < 100 || Number(start.intervalMs) > 60000
|
|
287
|
+
|| !Number.isInteger(start.expiresInMs) || Number(start.expiresInMs) < 1 || Number(start.expiresInMs) > PENDING_APPROVAL_LIMITS.lifetimeMs)
|
|
288
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
289
|
+
break;
|
|
290
|
+
}
|
|
291
|
+
catch (error) {
|
|
292
|
+
if (!(error instanceof PendingNetworkError))
|
|
293
|
+
throw error;
|
|
294
|
+
await wait();
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
for (;;) {
|
|
298
|
+
assertLive();
|
|
299
|
+
await checkRejection();
|
|
300
|
+
try {
|
|
301
|
+
const state = await parsePendingState(await rpc({ type: 'read' }));
|
|
302
|
+
if (!isDeepStrictEqual(state.request, ctx.request))
|
|
303
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
304
|
+
if (latest && state.revision < latest.revision)
|
|
305
|
+
throw new AccountTrustError('account_trust_conflict');
|
|
306
|
+
if (latest && state.revision === latest.revision && !isDeepStrictEqual(state, latest))
|
|
307
|
+
throw new AccountTrustError('account_trust_conflict');
|
|
308
|
+
latest = state;
|
|
309
|
+
if (['rejected', 'cancelled', 'expired', 'conflict'].includes(state.status)) {
|
|
310
|
+
await updateStatus({ ...localStatus, phase: state.status, comparisonCode: null });
|
|
311
|
+
throw new Error(`Computer approval ${state.status}. Start a new explicit request.`);
|
|
312
|
+
}
|
|
313
|
+
const selectedDecision = decision;
|
|
314
|
+
if (selectedDecision?.decision === 'reject')
|
|
315
|
+
await checkRejection();
|
|
316
|
+
if (state.status === 'pending') {
|
|
317
|
+
await wait();
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
if (!('offer' in state))
|
|
321
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
322
|
+
const receivedOffer = await parsePendingOffer(state.offer, ctx.request);
|
|
323
|
+
if (!offer) {
|
|
324
|
+
await ctx.pinOffer(receivedOffer);
|
|
325
|
+
assertLive();
|
|
326
|
+
offer = receivedOffer;
|
|
327
|
+
await updateStatus({ ...localStatus, phase: 'waiting', offerHash: await pendingOfferHash(offer), comparisonCode: null });
|
|
328
|
+
packet = await createPendingHello(ctx.identity, offer);
|
|
329
|
+
assertLive();
|
|
330
|
+
await ctx.pinHello(packet.hello);
|
|
331
|
+
assertLive();
|
|
332
|
+
}
|
|
333
|
+
else if (await pendingOfferHash(receivedOffer) !== await pendingOfferHash(offer))
|
|
334
|
+
throw new AccountTrustError('account_trust_conflict');
|
|
335
|
+
if (!packet)
|
|
336
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
337
|
+
if (state.status === 'offered') {
|
|
338
|
+
await rpc({ type: 'hello', expectedRevision: state.revision, hello: packet.hello });
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
341
|
+
if (!('hello' in state) || await pendingHelloHash(state.hello) !== await pendingHelloHash(packet.hello))
|
|
342
|
+
throw new AccountTrustError('account_trust_conflict');
|
|
343
|
+
if (state.status === 'submitted') {
|
|
344
|
+
await wait();
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
if (!('reveal' in state))
|
|
348
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
349
|
+
const comparisonCode = await pendingComparisonCode(offer, packet.secret, state.reveal);
|
|
350
|
+
const offerHash = await pendingOfferHash(offer);
|
|
351
|
+
if (!confirmedOfferHash) {
|
|
352
|
+
if (selectedDecision?.decision !== 'confirm' || !matchesPendingBridgeDecision(localStatus, selectedDecision)) {
|
|
353
|
+
await updateStatus({ ...localStatus, phase: 'comparing', offerHash, comparisonCode });
|
|
354
|
+
await wait();
|
|
355
|
+
continue;
|
|
356
|
+
}
|
|
357
|
+
await updateStatus({ ...localStatus, phase: 'confirming', offerHash, comparisonCode });
|
|
358
|
+
confirmedOfferHash = offerHash;
|
|
359
|
+
}
|
|
360
|
+
const proof = await createPendingConfirmation(offer, packet.secret, state.reveal, confirmedOfferHash);
|
|
361
|
+
assertLive();
|
|
362
|
+
await checkRejection();
|
|
363
|
+
if (state.status === 'comparing') {
|
|
364
|
+
await rpc({ type: 'confirm', expectedRevision: state.revision, confirmation: proof });
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
if (!('confirmation' in state) || !isDeepStrictEqual(state.confirmation, proof))
|
|
368
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
369
|
+
if (state.status === 'confirmed') {
|
|
370
|
+
await wait();
|
|
371
|
+
continue;
|
|
372
|
+
}
|
|
373
|
+
if (state.status !== 'approved')
|
|
374
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
375
|
+
if (!credentials) {
|
|
376
|
+
const polled = record(await pendingJson(opts, '/api/auth/bridge/pair/poll', { deviceCode, localPort: opts.localPort }, signal));
|
|
377
|
+
if (polled.status === 'pending' || polled.status === 'slow_down') {
|
|
378
|
+
await wait();
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
if (polled.status !== 'approved' || !polled.pendingApproval)
|
|
382
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
383
|
+
credentials = { status: 'approved', ownerId: text(polled.ownerId, 100), token: text(polled.token), refreshToken: text(polled.refreshToken),
|
|
384
|
+
centrifugoUrl: text(polled.centrifugoUrl, 4096), userId: text(polled.userId, 254), pendingApproval: state.result };
|
|
385
|
+
}
|
|
386
|
+
// The candidate RPC result may be renewed after credentials/pair bundle were consumed.
|
|
387
|
+
const readTimeout = new AbortController();
|
|
388
|
+
const readTimer = setTimeout(() => readTimeout.abort(new PendingNetworkError()), PENDING_APPROVAL_LIMITS.requestTimeoutMs);
|
|
389
|
+
let history;
|
|
390
|
+
try {
|
|
391
|
+
const readSignal = AbortSignal.any([signal, readTimeout.signal]);
|
|
392
|
+
history = await abortable(readAccountHistory(opts.apiUrl, credentials.token, readSignal, opts.fetchImpl ?? fetch), readSignal);
|
|
393
|
+
}
|
|
394
|
+
finally {
|
|
395
|
+
clearTimeout(readTimer);
|
|
396
|
+
}
|
|
397
|
+
if (!history)
|
|
398
|
+
throw new AccountTrustError('account_approval_required');
|
|
399
|
+
const readAt = Date.now();
|
|
400
|
+
assertLive();
|
|
401
|
+
await checkRejection();
|
|
402
|
+
const opened = await openPendingResult(ctx.identity, offer, packet.secret, state.reveal, confirmedOfferHash, state.result, history);
|
|
403
|
+
assertLive();
|
|
404
|
+
await checkRejection();
|
|
405
|
+
if (opened.status === 'awaiting-delivery-renewal') {
|
|
406
|
+
await wait();
|
|
407
|
+
continue;
|
|
408
|
+
}
|
|
409
|
+
if (opened.trust.checkpoint.ownerId !== credentials.ownerId)
|
|
410
|
+
throw new AccountTrustError('account_enrollment_invalid');
|
|
411
|
+
await updateStatus({ ...localStatus, phase: 'approved', offerHash, comparisonCode: null });
|
|
412
|
+
return { ...credentials, pendingApproval: state.result, approvalMethod: 'pending-v1', verifiedAccountTrust: opened.trust, lastServerReadAt: readAt };
|
|
413
|
+
}
|
|
414
|
+
catch (error) {
|
|
415
|
+
// Availability only: malformed proof/history or conflicts never turn into retries.
|
|
416
|
+
if (!(error instanceof PendingNetworkError) && !(error instanceof Error && error.name === 'AccountReadUnavailable'))
|
|
417
|
+
throw error;
|
|
418
|
+
await wait();
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
if (!['approved', 'rejected', 'cancelled', 'expired', 'conflict'].includes(localStatus.phase)) {
|
|
424
|
+
const phase = error instanceof AccountTrustError && error.code === 'account_enrollment_expired' ? 'expired'
|
|
425
|
+
: error instanceof AccountTrustError && error.code === 'account_trust_conflict' ? 'conflict' : 'cancelled';
|
|
426
|
+
await ctx.onLocalStatus({ ...localStatus, phase, comparisonCode: null }).catch(() => undefined);
|
|
427
|
+
}
|
|
428
|
+
throw error;
|
|
429
|
+
}
|
|
430
|
+
finally {
|
|
431
|
+
clearTimeout(timer);
|
|
432
|
+
decisionController.abort();
|
|
433
|
+
expiry.abort();
|
|
434
|
+
packet = undefined;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
/** Best effort only; the new process always uses a different request and keeps its own key. */
|
|
438
|
+
export async function cancelPreviousPendingPairing(apiUrl, previous, signal) {
|
|
439
|
+
const options = { apiUrl };
|
|
440
|
+
try {
|
|
441
|
+
const path = `/api/security/approvals/${previous.requestId}/candidate`;
|
|
442
|
+
const state = await parsePendingState(await pendingJson(options, path, { candidateToken: previous.candidateToken, action: { type: 'read' } }, signal));
|
|
443
|
+
if (['approved', 'rejected', 'cancelled', 'expired', 'conflict'].includes(state.status))
|
|
444
|
+
return;
|
|
445
|
+
await pendingJson(options, path, { candidateToken: previous.candidateToken, action: { type: 'cancel', expectedRevision: state.revision } }, signal);
|
|
446
|
+
}
|
|
447
|
+
catch { /* Cancellation cannot grant trust and never causes an automatic fallback. */ }
|
|
448
|
+
}
|
|
106
449
|
async function postJson(fetchImpl, url, body) {
|
|
107
450
|
const res = await fetchImpl(url, {
|
|
108
451
|
method: 'POST',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pairing-client.js","sourceRoot":"","sources":["../src/pairing-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pairing-client.js","sourceRoot":"","sources":["../src/pairing-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PendingBridgeDecision, PendingBridgeStatus } from '../pending-approval-protocol.js';
|
|
2
|
+
/** The bridge is the only writer. CLI reads never modify this snapshot. */
|
|
3
|
+
export declare function writePendingBridgeStatus(dataDir: string, status: PendingBridgeStatus): Promise<void>;
|
|
4
|
+
export declare function readPendingBridgeStatus(dataDir: string): Promise<PendingBridgeStatus>;
|
|
5
|
+
/** Called only by explicit OS-local CLI action, never by server status. */
|
|
6
|
+
export declare function submitPendingBridgeDecision(dataDir: string, decision: 'confirm' | 'reject', comparisonCode?: string, now?: number): Promise<void>;
|
|
7
|
+
export declare function matchesPendingBridgeDecision(status: PendingBridgeStatus, decision: PendingBridgeDecision, now?: number): boolean;
|
|
8
|
+
/** Reads a separate CLI-owned message file; never edits or deletes it. */
|
|
9
|
+
export declare function waitForPendingBridgeDecision(dataDir: string, status: PendingBridgeStatus, signal: AbortSignal): Promise<PendingBridgeDecision>;
|
|
10
|
+
export type BridgePairingMode = {
|
|
11
|
+
method: 'pending-v1';
|
|
12
|
+
accountHint: string;
|
|
13
|
+
} | {
|
|
14
|
+
method: 'bootstrap';
|
|
15
|
+
};
|
|
16
|
+
export declare function selectBridgePairingMode(options: {
|
|
17
|
+
account?: string;
|
|
18
|
+
bootstrap?: boolean;
|
|
19
|
+
interactive: boolean;
|
|
20
|
+
previousPending?: boolean;
|
|
21
|
+
}, prompt: () => Promise<string>): Promise<BridgePairingMode>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { normalizePendingAccountHint } from '../pending-approval-crypto.js';
|
|
5
|
+
import { AtomicSnapshot } from './snapshot.js';
|
|
6
|
+
import { BridgeSecurityError } from './errors.js';
|
|
7
|
+
const hash = z.string().regex(/^[A-Za-z0-9_-]{43}$/);
|
|
8
|
+
const code = z.string().regex(/^[A-F0-9]{4}-[A-F0-9]{4}-[A-F0-9]{4}$/);
|
|
9
|
+
const common = { version: z.literal(1), requestId: hash, processNonce: hash, expiresAt: z.string().datetime() };
|
|
10
|
+
const statusSchema = z.union([
|
|
11
|
+
z.object({ ...common, phase: z.literal('waiting'), offerHash: hash.nullable(), comparisonCode: z.null() }).strict(),
|
|
12
|
+
z.object({ ...common, phase: z.enum(['comparing', 'confirming']), offerHash: hash, comparisonCode: code }).strict(),
|
|
13
|
+
z.object({ ...common, phase: z.enum(['approved', 'rejected', 'cancelled', 'expired', 'conflict']), offerHash: hash.nullable(), comparisonCode: z.null() }).strict(),
|
|
14
|
+
]);
|
|
15
|
+
const decisionSchema = z.union([
|
|
16
|
+
z.object({ ...common, decision: z.literal('confirm'), offerHash: hash, comparisonCode: code }).strict(),
|
|
17
|
+
z.object({ ...common, decision: z.literal('reject'), offerHash: hash.nullable() }).strict(),
|
|
18
|
+
]);
|
|
19
|
+
const terminal = (state) => ['approved', 'rejected', 'cancelled', 'expired', 'conflict'].includes(state.phase);
|
|
20
|
+
/** The bridge is the only writer. CLI reads never modify this snapshot. */
|
|
21
|
+
export async function writePendingBridgeStatus(dataDir, status) {
|
|
22
|
+
const store = new AtomicSnapshot(join(dataDir, 'security', 'pending-approval-status.json'), z.object({ status: statusSchema }).strict(), () => ({ status }));
|
|
23
|
+
await store.transact(state => { state.status = status; });
|
|
24
|
+
}
|
|
25
|
+
export async function readPendingBridgeStatus(dataDir) {
|
|
26
|
+
const store = new AtomicSnapshot(join(dataDir, 'security', 'pending-approval-status.json'), z.object({ status: statusSchema }).strict().nullable(), () => null);
|
|
27
|
+
const saved = await store.read(state => state?.status ?? null);
|
|
28
|
+
if (!saved)
|
|
29
|
+
throw new BridgeSecurityError('account_approval_required');
|
|
30
|
+
return saved;
|
|
31
|
+
}
|
|
32
|
+
/** Called only by explicit OS-local CLI action, never by server status. */
|
|
33
|
+
export async function submitPendingBridgeDecision(dataDir, decision, comparisonCode, now = Date.now()) {
|
|
34
|
+
const status = await readPendingBridgeStatus(dataDir);
|
|
35
|
+
if (terminal(status) || Date.parse(status.expiresAt) <= now)
|
|
36
|
+
throw new BridgeSecurityError('account_enrollment_expired');
|
|
37
|
+
const base = { version: 1, requestId: status.requestId, processNonce: status.processNonce, expiresAt: status.expiresAt };
|
|
38
|
+
let value;
|
|
39
|
+
if (decision === 'confirm') {
|
|
40
|
+
if (status.phase !== 'comparing' || comparisonCode !== status.comparisonCode)
|
|
41
|
+
throw new BridgeSecurityError('account_enrollment_invalid');
|
|
42
|
+
value = { ...base, decision, offerHash: status.offerHash, comparisonCode };
|
|
43
|
+
}
|
|
44
|
+
else
|
|
45
|
+
value = { ...base, decision, offerHash: status.offerHash };
|
|
46
|
+
const store = new AtomicSnapshot(join(dataDir, 'security', 'pending-approval-confirmation.json'), z.object({ decision: decisionSchema }).strict(), () => ({ decision: value }));
|
|
47
|
+
await store.transact(state => { state.decision = value; });
|
|
48
|
+
}
|
|
49
|
+
export function matchesPendingBridgeDecision(status, decision, now = Date.now()) {
|
|
50
|
+
return !terminal(status) && Date.parse(status.expiresAt) > now && decision.requestId === status.requestId
|
|
51
|
+
&& decision.processNonce === status.processNonce && decision.offerHash === status.offerHash && decision.expiresAt === status.expiresAt
|
|
52
|
+
&& (decision.decision === 'reject' || (status.phase === 'comparing' && decision.comparisonCode === status.comparisonCode));
|
|
53
|
+
}
|
|
54
|
+
/** Reads a separate CLI-owned message file; never edits or deletes it. */
|
|
55
|
+
export async function waitForPendingBridgeDecision(dataDir, status, signal) {
|
|
56
|
+
const store = new AtomicSnapshot(join(dataDir, 'security', 'pending-approval-confirmation.json'), z.object({ decision: decisionSchema }).strict().nullable(), () => null);
|
|
57
|
+
for (;;) {
|
|
58
|
+
signal.throwIfAborted();
|
|
59
|
+
if (Date.parse(status.expiresAt) <= Date.now())
|
|
60
|
+
throw new BridgeSecurityError('account_enrollment_expired');
|
|
61
|
+
const decision = await store.read(state => state?.decision ?? null);
|
|
62
|
+
if (decision && matchesPendingBridgeDecision(status, decision))
|
|
63
|
+
return decision;
|
|
64
|
+
await delay(100, undefined, { signal });
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export async function selectBridgePairingMode(options, prompt) {
|
|
68
|
+
if (options.account !== undefined && options.bootstrap)
|
|
69
|
+
throw new Error('--account and --bootstrap cannot be combined');
|
|
70
|
+
if (options.account !== undefined)
|
|
71
|
+
return { method: 'pending-v1', accountHint: normalizePendingAccountHint(options.account) };
|
|
72
|
+
if (options.previousPending && !options.bootstrap && !options.interactive)
|
|
73
|
+
throw new Error('Previous inbox approval was interrupted. Restart with --account <email>, or select --bootstrap explicitly.');
|
|
74
|
+
if (options.bootstrap || !options.interactive)
|
|
75
|
+
return { method: 'bootstrap' };
|
|
76
|
+
const entered = await prompt();
|
|
77
|
+
return entered.trim() === '' ? { method: 'bootstrap' } : { method: 'pending-v1', accountHint: normalizePendingAccountHint(entered) };
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=pending-approval.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pending-approval.js","sourceRoot":"","sources":["../../../src/security/bridge/pending-approval.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,31 @@
|
|
|
1
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';
|
|
2
4
|
import type { EndpointIdentity } from '../protocol.js';
|
|
3
5
|
export interface PendingBridgeEnrollment {
|
|
4
6
|
identity: EndpointIdentity;
|
|
5
7
|
link: AccountEnrollmentLink;
|
|
6
8
|
}
|
|
7
|
-
export declare function
|
|
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>;
|
|
8
29
|
/** URL is constructed from operator configuration, never a service-provided redirect. */
|
|
9
30
|
export declare function savePairingVerificationUrl(dataDir: string, apiUrl: string, userCode: string): Promise<string>;
|
|
10
31
|
export declare function pendingPairingLink(dataDir: string, now?: number): Promise<string>;
|