@mnemonik/credentials 0.1.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/LICENSE +38 -0
- package/dist/contracts.d.ts +104 -0
- package/dist/contracts.d.ts.map +1 -0
- package/dist/contracts.js +42 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.d.ts +87 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +596 -0
- package/dist/index.js.map +1 -0
- package/dist/osSecretStore.d.ts +10 -0
- package/dist/osSecretStore.d.ts.map +1 -0
- package/dist/osSecretStore.js +211 -0
- package/dist/osSecretStore.js.map +1 -0
- package/dist/storage.d.ts +52 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +204 -0
- package/dist/storage.js.map +1 -0
- package/package.json +38 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,596 @@
|
|
|
1
|
+
import { createHmac, randomBytes } from 'node:crypto';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { windowsCurrentUserAcl, withLock } from '@mnemonik/local-setup';
|
|
4
|
+
import { SimulatedSecretStore, CredentialSessionUnavailableError, } from './contracts.js';
|
|
5
|
+
import { CredentialError, SecureFiles, credentialPaths, stateDirectory, } from './storage.js';
|
|
6
|
+
export * from './contracts.js';
|
|
7
|
+
import { osSecretStore } from './osSecretStore.js';
|
|
8
|
+
export { osSecretStore };
|
|
9
|
+
export { CredentialError, SimulatedSecretStore, credentialPaths, stateDirectory, windowsCurrentUserAcl, };
|
|
10
|
+
const json = (value) => Buffer.from(`${JSON.stringify(value, null, 2)}\n`);
|
|
11
|
+
const parse = (bytes, expectedKind) => {
|
|
12
|
+
let value;
|
|
13
|
+
try {
|
|
14
|
+
value = JSON.parse(bytes.toString());
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
throw new Error('credential_record_invalid');
|
|
18
|
+
}
|
|
19
|
+
if (!value ||
|
|
20
|
+
typeof value !== 'object' ||
|
|
21
|
+
value.schemaVersion !== 1 ||
|
|
22
|
+
value.kind !== expectedKind)
|
|
23
|
+
throw new Error('credential_record_invalid');
|
|
24
|
+
return value;
|
|
25
|
+
};
|
|
26
|
+
const wait = (milliseconds) => new Promise((resolvePromise) => setTimeout(resolvePromise, milliseconds));
|
|
27
|
+
const action = (familyId, reason) => ({
|
|
28
|
+
status: 'ACTION_REQUIRED',
|
|
29
|
+
reason,
|
|
30
|
+
familyId,
|
|
31
|
+
});
|
|
32
|
+
const retryLater = (familyId, reason) => ({
|
|
33
|
+
status: 'RETRY_LATER',
|
|
34
|
+
reason,
|
|
35
|
+
familyId,
|
|
36
|
+
});
|
|
37
|
+
const isFailure = (result) => 'status' in result &&
|
|
38
|
+
(result.status === 'ACTION_REQUIRED' ||
|
|
39
|
+
result.status === 'RETRY_LATER');
|
|
40
|
+
const diagnosedStores = new WeakSet();
|
|
41
|
+
export function createCredentialAdapter(options = {}) {
|
|
42
|
+
const files = new SecureFiles({ ...options, stateDir: options.stateDir ?? stateDirectory() });
|
|
43
|
+
const paths = credentialPaths(files.stateDir);
|
|
44
|
+
const now = options.now ?? Date.now;
|
|
45
|
+
const sleep = options.sleep ?? wait;
|
|
46
|
+
const retryLimit = options.retryLimit ?? 2;
|
|
47
|
+
const store = options.secretStore;
|
|
48
|
+
const rotations = new Map();
|
|
49
|
+
let osAvailable;
|
|
50
|
+
const disable = () => {
|
|
51
|
+
osAvailable = Promise.resolve(false);
|
|
52
|
+
if (store && !diagnosedStores.has(store)) {
|
|
53
|
+
diagnosedStores.add(store);
|
|
54
|
+
options.onDiagnostic?.('os_store_unavailable');
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
const available = () => (osAvailable ??= store
|
|
58
|
+
? store
|
|
59
|
+
.isAvailable()
|
|
60
|
+
.catch(() => false)
|
|
61
|
+
.then((ok) => {
|
|
62
|
+
if (!ok)
|
|
63
|
+
disable();
|
|
64
|
+
return ok;
|
|
65
|
+
})
|
|
66
|
+
: Promise.resolve(false));
|
|
67
|
+
const reference = (name) => `mnemonik.credentials.v1:${name}`;
|
|
68
|
+
const relativeSecret = (path) => path.slice(files.stateDir.length + 1);
|
|
69
|
+
const fileBackend = {
|
|
70
|
+
store: 'file',
|
|
71
|
+
isAvailable: async () => true,
|
|
72
|
+
read: async (_reference, file) => files.read(file),
|
|
73
|
+
write: async (_reference, file, secret) => files.write(file, secret, 'secret'),
|
|
74
|
+
delete: async (_reference, file) => files.remove(file),
|
|
75
|
+
};
|
|
76
|
+
const osBackend = {
|
|
77
|
+
store: 'os',
|
|
78
|
+
isAvailable: available,
|
|
79
|
+
read: async (reference) => {
|
|
80
|
+
if (!(await available()) || !store)
|
|
81
|
+
throw new Error('os_store_unavailable');
|
|
82
|
+
const value = await store.get(reference);
|
|
83
|
+
return value == null ? null : Buffer.from(value, 'base64');
|
|
84
|
+
},
|
|
85
|
+
write: async (reference, _file, secret) => {
|
|
86
|
+
if (!(await available()) || !store)
|
|
87
|
+
throw new Error('os_store_unavailable');
|
|
88
|
+
await store.set(reference, secret.toString('base64'));
|
|
89
|
+
},
|
|
90
|
+
delete: async (reference) => {
|
|
91
|
+
if (!(await available()) || !store)
|
|
92
|
+
throw new Error('os_store_unavailable');
|
|
93
|
+
await store.delete(reference);
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
async function locator(name, file, existing) {
|
|
97
|
+
if (existing?.store === 'os')
|
|
98
|
+
return existing;
|
|
99
|
+
return name === 'cli-oauth' && (await osBackend.isAvailable())
|
|
100
|
+
? { store: 'os', secretRef: reference(name) }
|
|
101
|
+
: { store: 'file', secretFile: relativeSecret(file) };
|
|
102
|
+
}
|
|
103
|
+
const useFile = (location, file) => {
|
|
104
|
+
Object.assign(location, { store: 'file', secretFile: relativeSecret(file) });
|
|
105
|
+
delete location.secretRef;
|
|
106
|
+
};
|
|
107
|
+
async function writeSecret(location, file, value) {
|
|
108
|
+
if (location.store === 'os') {
|
|
109
|
+
try {
|
|
110
|
+
await osBackend.write(referenceFor(location), file, value);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
disable();
|
|
115
|
+
}
|
|
116
|
+
useFile(location, file);
|
|
117
|
+
}
|
|
118
|
+
await fileBackend.write('', file, value);
|
|
119
|
+
}
|
|
120
|
+
async function readSecret(location, file) {
|
|
121
|
+
let sessionUnavailable = false;
|
|
122
|
+
if (location.store === 'os') {
|
|
123
|
+
try {
|
|
124
|
+
const value = await osBackend.read(referenceFor(location), file);
|
|
125
|
+
if (value)
|
|
126
|
+
return value;
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
disable();
|
|
130
|
+
sessionUnavailable = true;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const value = await fileBackend.read('', file);
|
|
134
|
+
if (!value && sessionUnavailable)
|
|
135
|
+
throw new CredentialSessionUnavailableError(store?.kind ?? 'os');
|
|
136
|
+
if (!value)
|
|
137
|
+
throw new Error('credential_secret_missing');
|
|
138
|
+
useFile(location, file);
|
|
139
|
+
return value;
|
|
140
|
+
}
|
|
141
|
+
async function deleteSecret(location, file) {
|
|
142
|
+
if (location.store === 'os') {
|
|
143
|
+
try {
|
|
144
|
+
await osBackend.delete(referenceFor(location), file);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
disable();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
await fileBackend.delete('', file);
|
|
151
|
+
}
|
|
152
|
+
const referenceFor = (location) => location.store === 'os' ? location.secretRef : '';
|
|
153
|
+
async function readRecord(path, kind) {
|
|
154
|
+
const bytes = await files.read(path);
|
|
155
|
+
return bytes ? parse(bytes, kind) : null;
|
|
156
|
+
}
|
|
157
|
+
async function putCliOAuth(metadata, tokens) {
|
|
158
|
+
const current = await readRecord(paths.cliRecord, 'cli-oauth');
|
|
159
|
+
const location = await locator('cli-oauth', paths.cliSecret, current ?? undefined);
|
|
160
|
+
const secret = typeof tokens === 'string'
|
|
161
|
+
? { accessToken: '', refreshToken: tokens, accessExpiresAt: new Date(0).toISOString() }
|
|
162
|
+
: tokens;
|
|
163
|
+
await writeSecret(location, paths.cliSecret, Buffer.from(JSON.stringify(secret)));
|
|
164
|
+
const record = { schemaVersion: 1, kind: 'cli-oauth', ...metadata, ...location };
|
|
165
|
+
await files.write(paths.cliRecord, json(record), 'record');
|
|
166
|
+
if (location.store === 'os')
|
|
167
|
+
await files.remove(paths.cliSecret);
|
|
168
|
+
return { store: location.store === 'os' ? (store?.kind ?? 'os') : 'file' };
|
|
169
|
+
}
|
|
170
|
+
async function readCliOAuth() {
|
|
171
|
+
const record = await readRecord(paths.cliRecord, 'cli-oauth');
|
|
172
|
+
if (!record)
|
|
173
|
+
return null;
|
|
174
|
+
const stored = (await readSecret(record, paths.cliSecret)).toString();
|
|
175
|
+
const tokens = stored.startsWith('{')
|
|
176
|
+
? JSON.parse(stored)
|
|
177
|
+
: { accessToken: '', refreshToken: stored, accessExpiresAt: new Date(0).toISOString() };
|
|
178
|
+
if (typeof tokens.accessToken !== 'string' ||
|
|
179
|
+
typeof tokens.refreshToken !== 'string' ||
|
|
180
|
+
typeof tokens.accessExpiresAt !== 'string')
|
|
181
|
+
throw new Error('credential_record_invalid');
|
|
182
|
+
const { schemaVersion: _schema, kind: _kind, ...metadata } = record;
|
|
183
|
+
void _schema;
|
|
184
|
+
void _kind;
|
|
185
|
+
const { secretRef: _ref, secretFile: _file, ...publicMetadata } = metadata;
|
|
186
|
+
void _ref;
|
|
187
|
+
void _file;
|
|
188
|
+
return {
|
|
189
|
+
...publicMetadata,
|
|
190
|
+
...tokens,
|
|
191
|
+
store: record.store === 'os' ? (store?.kind ?? 'os') : 'file',
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
async function persistFamily(componentKind, response, existing) {
|
|
195
|
+
if (existing && existing.familyId !== response.id)
|
|
196
|
+
throw new Error('family_id_changed');
|
|
197
|
+
const familyPaths = credentialPaths(files.stateDir, response.id);
|
|
198
|
+
const location = await locator(`component:${response.id}`, familyPaths.secret, existing);
|
|
199
|
+
const rotationTime = now();
|
|
200
|
+
const secret = {
|
|
201
|
+
accessToken: response.access_token,
|
|
202
|
+
refreshToken: response.refresh_token,
|
|
203
|
+
};
|
|
204
|
+
await writeSecret(location, familyPaths.secret, Buffer.from(JSON.stringify(secret)));
|
|
205
|
+
const record = {
|
|
206
|
+
schemaVersion: 1,
|
|
207
|
+
kind: 'component',
|
|
208
|
+
familyId: response.id,
|
|
209
|
+
componentKind,
|
|
210
|
+
scopes: response.scope.split(' ').filter(Boolean),
|
|
211
|
+
accessExpiresAt: new Date(rotationTime + response.expires_in * 1000).toISOString(),
|
|
212
|
+
refreshExpiresAt: new Date(rotationTime + response.refresh_expires_in * 1000).toISOString(),
|
|
213
|
+
lastRotationTime: new Date(rotationTime).toISOString(),
|
|
214
|
+
...location,
|
|
215
|
+
};
|
|
216
|
+
await files.write(familyPaths.record, json(record), 'record');
|
|
217
|
+
return {
|
|
218
|
+
store: location.store,
|
|
219
|
+
familyId: record.familyId,
|
|
220
|
+
componentKind: record.componentKind,
|
|
221
|
+
scopes: record.scopes,
|
|
222
|
+
accessExpiresAt: record.accessExpiresAt,
|
|
223
|
+
refreshExpiresAt: record.refreshExpiresAt,
|
|
224
|
+
lastRotationTime: record.lastRotationTime,
|
|
225
|
+
...secret,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
async function putFamily(componentKind, response) {
|
|
229
|
+
const familyPaths = credentialPaths(files.stateDir, response.id);
|
|
230
|
+
const current = await readRecord(familyPaths.record, 'component');
|
|
231
|
+
return persistFamily(componentKind, response, current ?? undefined);
|
|
232
|
+
}
|
|
233
|
+
async function readFamily(familyId) {
|
|
234
|
+
const familyPaths = credentialPaths(files.stateDir, familyId);
|
|
235
|
+
const record = await readRecord(familyPaths.record, 'component');
|
|
236
|
+
if (!record)
|
|
237
|
+
return null;
|
|
238
|
+
if (record.familyId !== familyId)
|
|
239
|
+
throw new Error('credential_record_invalid');
|
|
240
|
+
const secret = JSON.parse((await readSecret(record, familyPaths.secret)).toString());
|
|
241
|
+
if (typeof secret.accessToken !== 'string' || typeof secret.refreshToken !== 'string')
|
|
242
|
+
throw new Error('credential_record_invalid');
|
|
243
|
+
const { schemaVersion: _schema, kind: _kind, ...metadata } = record;
|
|
244
|
+
void _schema;
|
|
245
|
+
void _kind;
|
|
246
|
+
const { secretRef: _ref, secretFile: _file, ...publicMetadata } = metadata;
|
|
247
|
+
void _ref;
|
|
248
|
+
void _file;
|
|
249
|
+
return { ...publicMetadata, ...secret };
|
|
250
|
+
}
|
|
251
|
+
async function requestRotation(familyId, request) {
|
|
252
|
+
const started = now();
|
|
253
|
+
let lostResponseRetried = false;
|
|
254
|
+
let retryableAttempt = 0;
|
|
255
|
+
while (true) {
|
|
256
|
+
let response;
|
|
257
|
+
try {
|
|
258
|
+
response = await request();
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
if (lostResponseRetried)
|
|
262
|
+
return action(familyId, 'rotation_response_lost');
|
|
263
|
+
lostResponseRetried = true;
|
|
264
|
+
await sleep(250);
|
|
265
|
+
if (now() > started + 60_000)
|
|
266
|
+
return action(familyId, 'rotation_response_lost');
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
if (response.status === 400 && response.body.error === 'invalid_grant')
|
|
270
|
+
return action(familyId, 'invalid_grant');
|
|
271
|
+
if (response.status === 429 || response.status >= 500) {
|
|
272
|
+
if (lostResponseRetried)
|
|
273
|
+
return action(familyId, 'rotation_response_lost');
|
|
274
|
+
if (retryableAttempt >= retryLimit)
|
|
275
|
+
return retryLater(familyId, response.status === 429 ? 'rate_limited' : 'server_error');
|
|
276
|
+
const delay = response.retryAfterMs ?? 250 * 2 ** retryableAttempt;
|
|
277
|
+
retryableAttempt += 1;
|
|
278
|
+
await sleep(delay);
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
return response;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
async function rotateStored(lockPath, missingId, read, request, decode, persist) {
|
|
285
|
+
const predecessor = await read();
|
|
286
|
+
if (!predecessor)
|
|
287
|
+
return action(missingId, 'family_missing');
|
|
288
|
+
return withLock(lockPath, options.lockWaitMs ?? 60_000, async () => {
|
|
289
|
+
const current = await read();
|
|
290
|
+
if (!current)
|
|
291
|
+
return action(predecessor.familyId, 'family_missing');
|
|
292
|
+
if (current.refreshToken !== predecessor.refreshToken)
|
|
293
|
+
return current;
|
|
294
|
+
const response = await requestRotation(current.familyId, () => request(current));
|
|
295
|
+
if ('status' in response &&
|
|
296
|
+
(response.status === 'ACTION_REQUIRED' || response.status === 'RETRY_LATER'))
|
|
297
|
+
return response;
|
|
298
|
+
if (response.status !== 200)
|
|
299
|
+
return action(current.familyId, 'error' in response.body ? response.body.error : 'rotation_refused');
|
|
300
|
+
const body = decode(response.body);
|
|
301
|
+
if (!body)
|
|
302
|
+
return action(current.familyId, 'rotation_refused');
|
|
303
|
+
try {
|
|
304
|
+
return await persist(current, body);
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
return action(current.familyId, 'persistence_failed');
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
function rotateLocked(familyId, transport) {
|
|
312
|
+
const familyPaths = credentialPaths(files.stateDir, familyId);
|
|
313
|
+
return rotateStored(familyPaths.record, familyId, () => readFamily(familyId), (current) => transport.rotateFamily(familyId, current.refreshToken), (body) => ('access_token' in body ? body : null), (current, body) => persistFamily(current.componentKind, body, {
|
|
314
|
+
schemaVersion: 1,
|
|
315
|
+
kind: 'component',
|
|
316
|
+
familyId: current.familyId,
|
|
317
|
+
componentKind: current.componentKind,
|
|
318
|
+
scopes: current.scopes,
|
|
319
|
+
accessExpiresAt: current.accessExpiresAt,
|
|
320
|
+
refreshExpiresAt: current.refreshExpiresAt,
|
|
321
|
+
lastRotationTime: current.lastRotationTime,
|
|
322
|
+
...(current.store === 'os'
|
|
323
|
+
? { store: 'os', secretRef: reference(`component:${familyId}`) }
|
|
324
|
+
: { store: 'file', secretFile: relativeSecret(familyPaths.secret) }),
|
|
325
|
+
}));
|
|
326
|
+
}
|
|
327
|
+
function rotateFamily(familyId, transport) {
|
|
328
|
+
const active = rotations.get(familyId);
|
|
329
|
+
if (active)
|
|
330
|
+
return active;
|
|
331
|
+
const rotation = rotateLocked(familyId, transport);
|
|
332
|
+
rotations.set(familyId, rotation);
|
|
333
|
+
const clear = () => {
|
|
334
|
+
if (rotations.get(familyId) === rotation)
|
|
335
|
+
rotations.delete(familyId);
|
|
336
|
+
};
|
|
337
|
+
void rotation.then(clear, clear);
|
|
338
|
+
return rotation;
|
|
339
|
+
}
|
|
340
|
+
function rotateCliLocked(transport) {
|
|
341
|
+
return rotateStored(paths.cliRecord, 'cli', readCliOAuth, (current) => transport.rotateCli(current), (body) => 'access_token' in body &&
|
|
342
|
+
typeof body.access_token === 'string' &&
|
|
343
|
+
'refresh_token' in body &&
|
|
344
|
+
typeof body.refresh_token === 'string' &&
|
|
345
|
+
'expires_in' in body &&
|
|
346
|
+
typeof body.expires_in === 'number' &&
|
|
347
|
+
'scope' in body &&
|
|
348
|
+
typeof body.scope === 'string'
|
|
349
|
+
? body
|
|
350
|
+
: null, async (current, body) => {
|
|
351
|
+
const rotatedAt = now();
|
|
352
|
+
await putCliOAuth({
|
|
353
|
+
issuer: current.issuer,
|
|
354
|
+
clientId: current.clientId,
|
|
355
|
+
familyId: current.familyId,
|
|
356
|
+
scopes: body.scope.split(' ').filter(Boolean),
|
|
357
|
+
lastRotationTime: new Date(rotatedAt).toISOString(),
|
|
358
|
+
}, {
|
|
359
|
+
accessToken: body.access_token,
|
|
360
|
+
refreshToken: body.refresh_token,
|
|
361
|
+
accessExpiresAt: new Date(rotatedAt + body.expires_in * 1000).toISOString(),
|
|
362
|
+
});
|
|
363
|
+
const stored = await readCliOAuth();
|
|
364
|
+
if (!stored)
|
|
365
|
+
throw new Error('credential_persistence_failed');
|
|
366
|
+
return stored;
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
function rotateCli(transport) {
|
|
370
|
+
const key = 'cli';
|
|
371
|
+
const active = rotations.get(key);
|
|
372
|
+
if (active)
|
|
373
|
+
return active;
|
|
374
|
+
const rotation = rotateCliLocked(transport);
|
|
375
|
+
rotations.set(key, rotation);
|
|
376
|
+
const clear = () => {
|
|
377
|
+
if (rotations.get(key) === rotation)
|
|
378
|
+
rotations.delete(key);
|
|
379
|
+
};
|
|
380
|
+
void rotation.then(clear, clear);
|
|
381
|
+
return rotation;
|
|
382
|
+
}
|
|
383
|
+
async function withCliCredential(transport, work) {
|
|
384
|
+
let current = await readCliOAuth();
|
|
385
|
+
if (!current)
|
|
386
|
+
return action('cli', 'family_missing');
|
|
387
|
+
if (!current.accessToken || Date.parse(current.accessExpiresAt) <= now()) {
|
|
388
|
+
const rotated = await rotateCli(transport);
|
|
389
|
+
if (isFailure(rotated))
|
|
390
|
+
return rotated;
|
|
391
|
+
current = rotated;
|
|
392
|
+
}
|
|
393
|
+
const first = await work(current.accessToken);
|
|
394
|
+
if (first.status !== 401)
|
|
395
|
+
return first;
|
|
396
|
+
const rotated = await rotateCli(transport);
|
|
397
|
+
if (isFailure(rotated))
|
|
398
|
+
return rotated;
|
|
399
|
+
const second = await work(rotated.accessToken);
|
|
400
|
+
return second.status === 401 ? action(rotated.familyId, 'protected_unauthorized') : second;
|
|
401
|
+
}
|
|
402
|
+
async function removeCliOAuth() {
|
|
403
|
+
const record = await readRecord(paths.cliRecord, 'cli-oauth');
|
|
404
|
+
if (!record)
|
|
405
|
+
return;
|
|
406
|
+
await deleteSecret(record, paths.cliSecret);
|
|
407
|
+
await files.remove(paths.cliRecord);
|
|
408
|
+
}
|
|
409
|
+
async function withCredential(familyId, transport, work) {
|
|
410
|
+
let current = await readFamily(familyId);
|
|
411
|
+
if (!current)
|
|
412
|
+
return action(familyId, 'family_missing');
|
|
413
|
+
if (!current.accessToken || Date.parse(current.accessExpiresAt) <= now()) {
|
|
414
|
+
const rotated = await rotateFamily(familyId, transport);
|
|
415
|
+
if (isFailure(rotated))
|
|
416
|
+
return rotated;
|
|
417
|
+
current = rotated;
|
|
418
|
+
}
|
|
419
|
+
const first = await work(current.accessToken);
|
|
420
|
+
if (first.status !== 401)
|
|
421
|
+
return first;
|
|
422
|
+
const rotated = await rotateFamily(familyId, transport);
|
|
423
|
+
if (isFailure(rotated))
|
|
424
|
+
return rotated;
|
|
425
|
+
const second = await work(rotated.accessToken);
|
|
426
|
+
return second.status === 401 ? action(familyId, 'protected_unauthorized') : second;
|
|
427
|
+
}
|
|
428
|
+
async function removeFamily(familyId) {
|
|
429
|
+
const familyPaths = credentialPaths(files.stateDir, familyId);
|
|
430
|
+
const record = await readRecord(familyPaths.record, 'component');
|
|
431
|
+
if (!record)
|
|
432
|
+
return;
|
|
433
|
+
await deleteSecret(record, familyPaths.secret);
|
|
434
|
+
await files.remove(familyPaths.record);
|
|
435
|
+
}
|
|
436
|
+
async function revokeFamily(familyId, transport) {
|
|
437
|
+
const current = await readFamily(familyId);
|
|
438
|
+
if (!current)
|
|
439
|
+
return action(familyId, 'family_missing');
|
|
440
|
+
const response = await transport.revokeFamily(familyId, current.refreshToken);
|
|
441
|
+
if (response.status === 429)
|
|
442
|
+
return retryLater(familyId, 'rate_limited');
|
|
443
|
+
if (response.status >= 500)
|
|
444
|
+
return retryLater(familyId, 'server_error');
|
|
445
|
+
if (response.status !== 200)
|
|
446
|
+
return action(familyId, 'error' in response.body ? response.body.error : 'revoke_refused');
|
|
447
|
+
await removeFamily(familyId);
|
|
448
|
+
return { status: 'revoked', familyId };
|
|
449
|
+
}
|
|
450
|
+
async function rootKey() {
|
|
451
|
+
return withLock(paths.rootRecord, options.lockWaitMs ?? 60_000, async () => {
|
|
452
|
+
const record = await readRecord(paths.rootRecord, 'root-binding');
|
|
453
|
+
if (record) {
|
|
454
|
+
const key = await readSecret(record, paths.rootSecret);
|
|
455
|
+
if (!key || key.length !== 32)
|
|
456
|
+
throw new Error('root_binding_key_invalid');
|
|
457
|
+
return key;
|
|
458
|
+
}
|
|
459
|
+
const location = await locator('root-binding', paths.rootSecret);
|
|
460
|
+
const key = randomBytes(32);
|
|
461
|
+
await writeSecret(location, paths.rootSecret, key);
|
|
462
|
+
await files.write(paths.rootRecord, json({ schemaVersion: 1, kind: 'root-binding', ...location }), 'record');
|
|
463
|
+
return key;
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
async function hmacRootBinding(version, input) {
|
|
467
|
+
if (version !== 1)
|
|
468
|
+
throw new Error('unsupported_root_binding_version');
|
|
469
|
+
const key = await rootKey();
|
|
470
|
+
return { version, hmac: createHmac('sha256', key).update(input).digest('base64url') };
|
|
471
|
+
}
|
|
472
|
+
async function forget() {
|
|
473
|
+
const cli = await readRecord(paths.cliRecord, 'cli-oauth');
|
|
474
|
+
const componentFamilyIds = [];
|
|
475
|
+
for (const name of await files.list(paths.familyRecords)) {
|
|
476
|
+
const recordPath = join(paths.familyRecords, name);
|
|
477
|
+
const record = await readRecord(recordPath, 'component');
|
|
478
|
+
if (!record)
|
|
479
|
+
continue;
|
|
480
|
+
componentFamilyIds.push(record.familyId);
|
|
481
|
+
await removeFamily(record.familyId);
|
|
482
|
+
}
|
|
483
|
+
if (cli) {
|
|
484
|
+
await deleteSecret(cli, paths.cliSecret);
|
|
485
|
+
await files.remove(paths.cliRecord);
|
|
486
|
+
}
|
|
487
|
+
const root = await readRecord(paths.rootRecord, 'root-binding');
|
|
488
|
+
if (root) {
|
|
489
|
+
await deleteSecret(root, paths.rootSecret);
|
|
490
|
+
await files.remove(paths.rootRecord);
|
|
491
|
+
}
|
|
492
|
+
await files.removeEmptyDirectories([
|
|
493
|
+
paths.familySecrets,
|
|
494
|
+
paths.familyRecords,
|
|
495
|
+
paths.secrets,
|
|
496
|
+
paths.records,
|
|
497
|
+
paths.root,
|
|
498
|
+
]);
|
|
499
|
+
return {
|
|
500
|
+
status: 'forgotten',
|
|
501
|
+
retainedServerSide: {
|
|
502
|
+
...(cli ? { cliFamilyId: cli.familyId } : {}),
|
|
503
|
+
componentFamilyIds: componentFamilyIds.sort(),
|
|
504
|
+
},
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
return {
|
|
508
|
+
putCliOAuth,
|
|
509
|
+
readCliOAuth,
|
|
510
|
+
rotateCli,
|
|
511
|
+
withCliCredential,
|
|
512
|
+
removeCliOAuth,
|
|
513
|
+
putFamily,
|
|
514
|
+
readFamily,
|
|
515
|
+
rotateFamily,
|
|
516
|
+
withCredential,
|
|
517
|
+
revokeFamily,
|
|
518
|
+
forget,
|
|
519
|
+
hmacRootBinding,
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
/** Shared CLI/hook backend selection; component records keep their recorded backend. */
|
|
523
|
+
export function createLocalCredentialAdapter(options = {}) {
|
|
524
|
+
return createCredentialAdapter({
|
|
525
|
+
...options,
|
|
526
|
+
secretStore: options.secretStore ?? osSecretStore(),
|
|
527
|
+
});
|
|
528
|
+
}
|
|
529
|
+
const hookFamilies = new Map();
|
|
530
|
+
/** Family handles contain no tokens. Legacy keys are considered only without a family. */
|
|
531
|
+
export function resolveHookCredential(legacyKey, server, env = process.env, argv = process.argv.slice(2)) {
|
|
532
|
+
const index = argv.indexOf('--credential-family');
|
|
533
|
+
const familyId = (index >= 0 ? argv[index + 1]?.trim() : '') || env.MNEMONIK_HOOK_FAMILY?.trim();
|
|
534
|
+
if (!familyId)
|
|
535
|
+
return legacyKey;
|
|
536
|
+
const key = JSON.stringify([server, familyId]);
|
|
537
|
+
let family = hookFamilies.get(key);
|
|
538
|
+
if (!family) {
|
|
539
|
+
family = {
|
|
540
|
+
familyId,
|
|
541
|
+
server,
|
|
542
|
+
unavailable: false,
|
|
543
|
+
credentials: createLocalCredentialAdapter({ lockWaitMs: 2_000, retryLimit: 0 }),
|
|
544
|
+
};
|
|
545
|
+
hookFamilies.set(key, family);
|
|
546
|
+
}
|
|
547
|
+
return family;
|
|
548
|
+
}
|
|
549
|
+
/** Preserve each caller's wire body and budget; share rotation and failure state with bound context. */
|
|
550
|
+
export async function fetchWithHookCredential(credential, url, init) {
|
|
551
|
+
const send = (token) => fetch(url, {
|
|
552
|
+
...init,
|
|
553
|
+
headers: { ...init.headers, authorization: `Bearer ${token}` },
|
|
554
|
+
});
|
|
555
|
+
if (typeof credential === 'string')
|
|
556
|
+
return send(credential);
|
|
557
|
+
const unavailable = () => new Response('{"ok":false}', { status: 403 });
|
|
558
|
+
if (!credential || credential.unavailable)
|
|
559
|
+
return unavailable();
|
|
560
|
+
try {
|
|
561
|
+
const result = await credential.credentials.withCredential(credential.familyId, {
|
|
562
|
+
rotateFamily: async (id, token) => {
|
|
563
|
+
const response = await fetch(`${credential.server}/api/v1/component-credentials/${encodeURIComponent(id)}/rotate`, {
|
|
564
|
+
method: 'POST',
|
|
565
|
+
headers: { 'content-type': 'application/json', authorization: `Bearer ${token}` },
|
|
566
|
+
body: '{}',
|
|
567
|
+
signal: init.signal
|
|
568
|
+
? AbortSignal.any([init.signal, AbortSignal.timeout(2_000)])
|
|
569
|
+
: AbortSignal.timeout(2_000),
|
|
570
|
+
});
|
|
571
|
+
return {
|
|
572
|
+
status: response.status,
|
|
573
|
+
body: await response.json(),
|
|
574
|
+
};
|
|
575
|
+
},
|
|
576
|
+
revokeFamily: async () => {
|
|
577
|
+
throw new Error('unused');
|
|
578
|
+
},
|
|
579
|
+
}, async (token) => {
|
|
580
|
+
const response = await send(token);
|
|
581
|
+
return { status: response.status, body: response };
|
|
582
|
+
});
|
|
583
|
+
if (typeof result.status === 'number' && 'body' in result)
|
|
584
|
+
return result.body;
|
|
585
|
+
credential.unavailable ||= result.reason === 'invalid_grant';
|
|
586
|
+
}
|
|
587
|
+
catch (error) {
|
|
588
|
+
// Only explicit revocation/expiry disables the family; a rejected route is call-local.
|
|
589
|
+
credential.unavailable ||= error?.code === 'invalid_grant';
|
|
590
|
+
}
|
|
591
|
+
if (!credential.diagnosed)
|
|
592
|
+
process.stderr.write('mnemonik-hook: credentials unavailable - fail-open.\n');
|
|
593
|
+
credential.diagnosed = true;
|
|
594
|
+
return unavailable();
|
|
595
|
+
}
|
|
596
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { execFile as nodeExecFile } from 'node:child_process';
|
|
2
|
+
import type { SecretStore } from './contracts.js';
|
|
3
|
+
type Options = {
|
|
4
|
+
platform?: NodeJS.Platform;
|
|
5
|
+
execFile?: typeof nodeExecFile;
|
|
6
|
+
};
|
|
7
|
+
/** CLI wiring opts in. Production availability/failure is shared for this process. */
|
|
8
|
+
export declare function osSecretStore(options?: Options): SecretStore | undefined;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=osSecretStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"osSecretStore.d.ts","sourceRoot":"","sources":["../src/osSecretStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAGlD,KAAK,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,YAAY,CAAA;CAAE,CAAC;AAiN9E,sFAAsF;AACtF,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,WAAW,GAAG,SAAS,CAKxE"}
|