@inkbox/sdk 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -47
- package/dist/agent_identity.d.ts +54 -68
- package/dist/agent_identity.d.ts.map +1 -1
- package/dist/agent_identity.js +77 -109
- package/dist/agent_identity.js.map +1 -1
- package/dist/credentials.d.ts +11 -0
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +17 -0
- package/dist/credentials.js.map +1 -1
- package/dist/identities/resources/identities.d.ts +0 -15
- package/dist/identities/resources/identities.d.ts.map +1 -1
- package/dist/identities/resources/identities.js +0 -18
- package/dist/identities/resources/identities.js.map +1 -1
- package/dist/identities/types.d.ts +0 -21
- package/dist/identities/types.d.ts.map +1 -1
- package/dist/identities/types.js +0 -11
- package/dist/identities/types.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/inkbox.d.ts +17 -6
- package/dist/inkbox.d.ts.map +1 -1
- package/dist/inkbox.js +25 -9
- package/dist/inkbox.js.map +1 -1
- package/dist/vault/crypto.d.ts +6 -4
- package/dist/vault/crypto.d.ts.map +1 -1
- package/dist/vault/crypto.js +22 -14
- package/dist/vault/crypto.js.map +1 -1
- package/dist/vault/resources/vault.d.ts +35 -1
- package/dist/vault/resources/vault.d.ts.map +1 -1
- package/dist/vault/resources/vault.js +113 -8
- package/dist/vault/resources/vault.js.map +1 -1
- package/dist/vault/totp.d.ts +73 -0
- package/dist/vault/totp.d.ts.map +1 -0
- package/dist/vault/totp.js +230 -0
- package/dist/vault/totp.js.map +1 -0
- package/dist/vault/types.d.ts +3 -0
- package/dist/vault/types.d.ts.map +1 -1
- package/dist/vault/types.js +4 -0
- package/dist/vault/types.js.map +1 -1
- package/package.json +2 -1
- package/dist/authenticator/resources/accounts.d.ts +0 -70
- package/dist/authenticator/resources/accounts.d.ts.map +0 -1
- package/dist/authenticator/resources/accounts.js +0 -91
- package/dist/authenticator/resources/accounts.js.map +0 -1
- package/dist/authenticator/resources/apps.d.ts +0 -38
- package/dist/authenticator/resources/apps.d.ts.map +0 -1
- package/dist/authenticator/resources/apps.js +0 -52
- package/dist/authenticator/resources/apps.js.map +0 -1
- package/dist/authenticator/types.d.ts +0 -83
- package/dist/authenticator/types.d.ts.map +0 -1
- package/dist/authenticator/types.js +0 -43
- package/dist/authenticator/types.js.map +0 -1
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
* VaultResource — org-level vault operations.
|
|
5
5
|
* UnlockedVault — crypto-enabled wrapper for secret CRUD after unlock.
|
|
6
6
|
*/
|
|
7
|
+
import { generateTotp, parseTotpUri } from "../totp.js";
|
|
7
8
|
import { computeAuthHash, decryptPayload, deriveMasterKey, deriveSalt, encryptPayload, unwrapOrgKey, } from "../crypto.js";
|
|
8
|
-
import { inferSecretType, parseAccessRule, parsePayload, parseVaultInfo, parseVaultKey, parseVaultSecret, parseVaultSecretDetail, serializePayload, } from "../types.js";
|
|
9
|
+
import { VaultSecretType, inferSecretType, parseAccessRule, parsePayload, parseVaultInfo, parseVaultKey, parseVaultSecret, parseVaultSecretDetail, serializePayload, } from "../types.js";
|
|
9
10
|
/**
|
|
10
11
|
* Org-level vault operations.
|
|
11
12
|
*
|
|
@@ -138,13 +139,31 @@ export class VaultResource {
|
|
|
138
139
|
throw new Error("No vault key matched. " +
|
|
139
140
|
"Check that the vault key is correct and has not been deleted.");
|
|
140
141
|
}
|
|
141
|
-
// Step 4: unwrap the org encryption key
|
|
142
|
-
|
|
142
|
+
// Step 4: unwrap the org encryption key.
|
|
143
|
+
// The wrapped key was encrypted with the vault key UUID as AAD.
|
|
144
|
+
// Fetch all key IDs and try each as AAD until one works.
|
|
145
|
+
const keysData = await this.http.get("/keys");
|
|
146
|
+
const allKeyIds = keysData
|
|
147
|
+
.filter((k) => k.status === "active")
|
|
148
|
+
.map((k) => k.id);
|
|
149
|
+
let orgKey = null;
|
|
150
|
+
for (const keyId of allKeyIds) {
|
|
151
|
+
try {
|
|
152
|
+
orgKey = unwrapOrgKey(masterKey, wrapped, keyId);
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
if (!orgKey) {
|
|
160
|
+
throw new Error("Failed to unwrap org encryption key. Check that the vault key is correct.");
|
|
161
|
+
}
|
|
143
162
|
// Step 5: decrypt all secrets from the unlock bundle
|
|
144
163
|
const decrypted = [];
|
|
145
164
|
for (const raw of data.encrypted_secrets ?? []) {
|
|
146
165
|
const detail = parseVaultSecretDetail(raw);
|
|
147
|
-
const payloadDict = decryptPayload(orgKey, detail.encryptedPayload);
|
|
166
|
+
const payloadDict = decryptPayload(orgKey, detail.encryptedPayload, detail.id);
|
|
148
167
|
const payload = parsePayload(detail.secretType, payloadDict);
|
|
149
168
|
decrypted.push({
|
|
150
169
|
id: detail.id,
|
|
@@ -195,6 +214,20 @@ export class UnlockedVault {
|
|
|
195
214
|
get secrets() {
|
|
196
215
|
return [...this.secretsCache];
|
|
197
216
|
}
|
|
217
|
+
/**
|
|
218
|
+
* Re-fetch, decrypt, and update a single secret in the cache.
|
|
219
|
+
*
|
|
220
|
+
* Best-effort — if the re-fetch fails the cache is left unchanged.
|
|
221
|
+
*/
|
|
222
|
+
async refreshCachedSecret(secretId) {
|
|
223
|
+
try {
|
|
224
|
+
const updated = await this.getSecret(secretId);
|
|
225
|
+
this.secretsCache = this.secretsCache.map((s) => s.id === secretId ? updated : s);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
// Cache refresh is best-effort.
|
|
229
|
+
}
|
|
230
|
+
}
|
|
198
231
|
// ------------------------------------------------------------------
|
|
199
232
|
// Encrypted CRUD
|
|
200
233
|
// ------------------------------------------------------------------
|
|
@@ -206,7 +239,7 @@ export class UnlockedVault {
|
|
|
206
239
|
async getSecret(secretId) {
|
|
207
240
|
const data = await this.http.get(`/secrets/${secretId}`);
|
|
208
241
|
const detail = parseVaultSecretDetail(data);
|
|
209
|
-
const payloadDict = decryptPayload(this.orgKey, detail.encryptedPayload);
|
|
242
|
+
const payloadDict = decryptPayload(this.orgKey, detail.encryptedPayload, detail.id);
|
|
210
243
|
const payload = parsePayload(detail.secretType, payloadDict);
|
|
211
244
|
return {
|
|
212
245
|
id: detail.id,
|
|
@@ -232,8 +265,12 @@ export class UnlockedVault {
|
|
|
232
265
|
async createSecret(options) {
|
|
233
266
|
const secretType = inferSecretType(options.payload);
|
|
234
267
|
const serialized = serializePayload(secretType, options.payload);
|
|
235
|
-
|
|
268
|
+
// Generate the UUID client-side so we can use it as AAD for
|
|
269
|
+
// encryption in the same request.
|
|
270
|
+
const secretId = crypto.randomUUID();
|
|
271
|
+
const encrypted = encryptPayload(this.orgKey, serialized, secretId);
|
|
236
272
|
const body = {
|
|
273
|
+
id: secretId,
|
|
237
274
|
name: options.name,
|
|
238
275
|
secret_type: secretType,
|
|
239
276
|
encrypted_payload: encrypted,
|
|
@@ -241,7 +278,16 @@ export class UnlockedVault {
|
|
|
241
278
|
if (options.description !== undefined)
|
|
242
279
|
body["description"] = options.description;
|
|
243
280
|
const data = await this.http.post("/secrets", body);
|
|
244
|
-
|
|
281
|
+
const result = parseVaultSecret(data);
|
|
282
|
+
// Append the new secret to the cache so it's immediately visible.
|
|
283
|
+
try {
|
|
284
|
+
const decrypted = await this.getSecret(result.id);
|
|
285
|
+
this.secretsCache.push(decrypted);
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
// best-effort
|
|
289
|
+
}
|
|
290
|
+
return result;
|
|
245
291
|
}
|
|
246
292
|
/**
|
|
247
293
|
* Update a vault secret's name, description, and/or encrypted payload.
|
|
@@ -274,9 +320,11 @@ export class UnlockedVault {
|
|
|
274
320
|
throw new TypeError(`Cannot update a '${current.secretType}' secret with a '${newType}' payload. Delete and recreate instead.`);
|
|
275
321
|
}
|
|
276
322
|
const serialized = serializePayload(newType, options.payload);
|
|
277
|
-
body["encrypted_payload"] = encryptPayload(this.orgKey, serialized);
|
|
323
|
+
body["encrypted_payload"] = encryptPayload(this.orgKey, serialized, secretId);
|
|
278
324
|
}
|
|
279
325
|
const data = await this.http.patch(`/secrets/${secretId}`, body);
|
|
326
|
+
// Refresh the cache so subsequent reads are consistent.
|
|
327
|
+
await this.refreshCachedSecret(secretId);
|
|
280
328
|
return parseVaultSecret(data);
|
|
281
329
|
}
|
|
282
330
|
/**
|
|
@@ -286,6 +334,63 @@ export class UnlockedVault {
|
|
|
286
334
|
*/
|
|
287
335
|
async deleteSecret(secretId) {
|
|
288
336
|
await this.http.delete(`/secrets/${secretId}`);
|
|
337
|
+
this.secretsCache = this.secretsCache.filter((s) => s.id !== secretId);
|
|
338
|
+
}
|
|
339
|
+
// ------------------------------------------------------------------
|
|
340
|
+
// TOTP helpers
|
|
341
|
+
// ------------------------------------------------------------------
|
|
342
|
+
/**
|
|
343
|
+
* Add or replace the TOTP configuration on a login secret.
|
|
344
|
+
*
|
|
345
|
+
* @param secretId - UUID of the login secret.
|
|
346
|
+
* @param totp - A {@link TOTPConfig} object or an `otpauth://totp/...` URI string.
|
|
347
|
+
* @returns Updated {@link VaultSecret} metadata.
|
|
348
|
+
* @throws TypeError if the secret is not a login type.
|
|
349
|
+
* @throws Error if a URI string is invalid or not TOTP.
|
|
350
|
+
*/
|
|
351
|
+
async setTotp(secretId, totp) {
|
|
352
|
+
const config = typeof totp === "string" ? parseTotpUri(totp) : totp;
|
|
353
|
+
const secret = await this.getSecret(secretId);
|
|
354
|
+
if (secret.secretType !== VaultSecretType.LOGIN) {
|
|
355
|
+
throw new TypeError(`Cannot set TOTP on a '${secret.secretType}' secret — only login secrets support TOTP`);
|
|
356
|
+
}
|
|
357
|
+
const payload = { ...secret.payload, totp: config };
|
|
358
|
+
return this.updateSecret(secretId, { payload });
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Remove TOTP configuration from a login secret.
|
|
362
|
+
*
|
|
363
|
+
* @param secretId - UUID of the login secret.
|
|
364
|
+
* @returns Updated {@link VaultSecret} metadata.
|
|
365
|
+
* @throws TypeError if the secret is not a login type.
|
|
366
|
+
*/
|
|
367
|
+
async removeTotp(secretId) {
|
|
368
|
+
const secret = await this.getSecret(secretId);
|
|
369
|
+
if (secret.secretType !== VaultSecretType.LOGIN) {
|
|
370
|
+
throw new TypeError(`Cannot remove TOTP from a '${secret.secretType}' secret — only login secrets support TOTP`);
|
|
371
|
+
}
|
|
372
|
+
const loginPayload = secret.payload;
|
|
373
|
+
const { totp: _, ...rest } = loginPayload;
|
|
374
|
+
return this.updateSecret(secretId, { payload: rest });
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Generate the current TOTP code for a login secret.
|
|
378
|
+
*
|
|
379
|
+
* @param secretId - UUID of the login secret.
|
|
380
|
+
* @returns A {@link TOTPCode}.
|
|
381
|
+
* @throws TypeError if the secret is not a login type.
|
|
382
|
+
* @throws Error if the login has no TOTP configured.
|
|
383
|
+
*/
|
|
384
|
+
async getTotpCode(secretId) {
|
|
385
|
+
const secret = await this.getSecret(secretId);
|
|
386
|
+
if (secret.secretType !== VaultSecretType.LOGIN) {
|
|
387
|
+
throw new TypeError(`Cannot generate TOTP for a '${secret.secretType}' secret — only login secrets support TOTP`);
|
|
388
|
+
}
|
|
389
|
+
const loginPayload = secret.payload;
|
|
390
|
+
if (!loginPayload.totp) {
|
|
391
|
+
throw new Error(`Login secret '${secretId}' has no TOTP configured`);
|
|
392
|
+
}
|
|
393
|
+
return generateTotp(loginPayload.totp);
|
|
289
394
|
}
|
|
290
395
|
}
|
|
291
396
|
//# sourceMappingURL=vault.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../../src/vault/resources/vault.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../../src/vault/resources/vault.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inkbox-vault/totp.ts
|
|
3
|
+
*
|
|
4
|
+
* Client-side TOTP (RFC 6238) implementation.
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Hash algorithm for TOTP code generation.
|
|
8
|
+
*
|
|
9
|
+
* Values are lowercase to match `otpauth://` URI convention.
|
|
10
|
+
*/
|
|
11
|
+
export declare const TOTPAlgorithm: {
|
|
12
|
+
readonly SHA1: "sha1";
|
|
13
|
+
readonly SHA256: "sha256";
|
|
14
|
+
readonly SHA512: "sha512";
|
|
15
|
+
};
|
|
16
|
+
export type TOTPAlgorithm = (typeof TOTPAlgorithm)[keyof typeof TOTPAlgorithm];
|
|
17
|
+
/** A generated TOTP code with timing metadata. */
|
|
18
|
+
export interface TOTPCode {
|
|
19
|
+
/** The OTP code string (e.g. `"482901"`). */
|
|
20
|
+
code: string;
|
|
21
|
+
/** Unix timestamp when this code became valid. */
|
|
22
|
+
periodStart: number;
|
|
23
|
+
/** Unix timestamp when this code expires. */
|
|
24
|
+
periodEnd: number;
|
|
25
|
+
/** Seconds left until expiry. */
|
|
26
|
+
secondsRemaining: number;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* TOTP configuration stored inside a {@link LoginPayload}.
|
|
30
|
+
*/
|
|
31
|
+
export interface TOTPConfig {
|
|
32
|
+
/** Base32-encoded shared secret. */
|
|
33
|
+
secret: string;
|
|
34
|
+
/** Hash algorithm (default `"sha1"`). */
|
|
35
|
+
algorithm?: TOTPAlgorithm;
|
|
36
|
+
/** Number of digits in the OTP code (6 or 8, default 6). */
|
|
37
|
+
digits?: number;
|
|
38
|
+
/** Time step in seconds (30 or 60, default 30). */
|
|
39
|
+
period?: number;
|
|
40
|
+
/** Optional issuer name (e.g. `"GitHub"`). */
|
|
41
|
+
issuer?: string;
|
|
42
|
+
/** Optional account identifier (e.g. `"user@example.com"`). */
|
|
43
|
+
accountName?: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Validate a TOTPConfig's fields.
|
|
47
|
+
*
|
|
48
|
+
* @throws Error if any field is invalid.
|
|
49
|
+
*/
|
|
50
|
+
export declare function validateTotpConfig(config: TOTPConfig): void;
|
|
51
|
+
/**
|
|
52
|
+
* Generate the current TOTP code per RFC 6238.
|
|
53
|
+
*
|
|
54
|
+
* @param config - TOTP configuration with the shared secret and parameters.
|
|
55
|
+
* @returns A {@link TOTPCode} with the code and timing metadata.
|
|
56
|
+
*/
|
|
57
|
+
export declare function generateTotp(config: TOTPConfig): TOTPCode;
|
|
58
|
+
/**
|
|
59
|
+
* Parse an `otpauth://totp/...` URI into a {@link TOTPConfig}.
|
|
60
|
+
*
|
|
61
|
+
* Supports the Google Authenticator Key URI format.
|
|
62
|
+
* Rejects HOTP URIs with an error.
|
|
63
|
+
*
|
|
64
|
+
* @param uri - The full `otpauth://` URI string.
|
|
65
|
+
* @returns A validated {@link TOTPConfig}.
|
|
66
|
+
* @throws Error on invalid scheme, HOTP type, missing secret, or invalid parameters.
|
|
67
|
+
*/
|
|
68
|
+
export declare function parseTotpUri(uri: string): TOTPConfig;
|
|
69
|
+
/** Serialize a TOTPConfig to the snake_case wire format. @internal */
|
|
70
|
+
export declare function serializeTotpConfig(config: TOTPConfig): Record<string, unknown>;
|
|
71
|
+
/** Parse a TOTPConfig from the snake_case wire format. @internal */
|
|
72
|
+
export declare function parseTotpConfig(raw: Record<string, unknown>): TOTPConfig;
|
|
73
|
+
//# sourceMappingURL=totp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"totp.d.ts","sourceRoot":"","sources":["../../src/vault/totp.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;;;GAIG;AACH,eAAO,MAAM,aAAa;;;;CAIhB,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAI/E,kDAAkD;AAClD,MAAM,WAAW,QAAQ;IACvB,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,iCAAiC;IACjC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAQD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAiB3D;AA+DD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAgBzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAsFpD;AAID,sEAAsE;AACtE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,UAAU,GACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,oEAAoE;AACpE,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,UAAU,CAWZ"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* inkbox-vault/totp.ts
|
|
3
|
+
*
|
|
4
|
+
* Client-side TOTP (RFC 6238) implementation.
|
|
5
|
+
*/
|
|
6
|
+
import { createHmac } from "node:crypto";
|
|
7
|
+
// ---- Enums ----
|
|
8
|
+
/**
|
|
9
|
+
* Hash algorithm for TOTP code generation.
|
|
10
|
+
*
|
|
11
|
+
* Values are lowercase to match `otpauth://` URI convention.
|
|
12
|
+
*/
|
|
13
|
+
export const TOTPAlgorithm = {
|
|
14
|
+
SHA1: "sha1",
|
|
15
|
+
SHA256: "sha256",
|
|
16
|
+
SHA512: "sha512",
|
|
17
|
+
};
|
|
18
|
+
// ---- Validation ----
|
|
19
|
+
const VALID_ALGORITHMS = ["sha1", "sha256", "sha512"];
|
|
20
|
+
const VALID_DIGITS = new Set([6, 8]);
|
|
21
|
+
const VALID_PERIODS = new Set([30, 60]);
|
|
22
|
+
/**
|
|
23
|
+
* Validate a TOTPConfig's fields.
|
|
24
|
+
*
|
|
25
|
+
* @throws Error if any field is invalid.
|
|
26
|
+
*/
|
|
27
|
+
export function validateTotpConfig(config) {
|
|
28
|
+
if (!config.secret || !config.secret.trim()) {
|
|
29
|
+
throw new Error("secret must be a non-empty base32 string");
|
|
30
|
+
}
|
|
31
|
+
b32decode(config.secret); // validate base32
|
|
32
|
+
const digits = config.digits ?? 6;
|
|
33
|
+
if (!VALID_DIGITS.has(digits)) {
|
|
34
|
+
throw new Error(`digits must be 6 or 8, got ${digits}`);
|
|
35
|
+
}
|
|
36
|
+
const period = config.period ?? 30;
|
|
37
|
+
if (!VALID_PERIODS.has(period)) {
|
|
38
|
+
throw new Error(`period must be 30 or 60, got ${period}`);
|
|
39
|
+
}
|
|
40
|
+
const alg = config.algorithm ?? "sha1";
|
|
41
|
+
if (!VALID_ALGORITHMS.includes(alg)) {
|
|
42
|
+
throw new Error(`algorithm must be sha1, sha256, or sha512, got ${alg}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
// ---- Internal helpers ----
|
|
46
|
+
/**
|
|
47
|
+
* Decode a base32 secret, adding padding if needed.
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
function b32decode(secret) {
|
|
51
|
+
const upper = secret.toUpperCase().replace(/=+$/, "");
|
|
52
|
+
if (upper.length === 0) {
|
|
53
|
+
throw new Error(`Invalid base32 secret: '${secret}'`);
|
|
54
|
+
}
|
|
55
|
+
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
|
56
|
+
const bits = [];
|
|
57
|
+
for (const ch of upper) {
|
|
58
|
+
const idx = alphabet.indexOf(ch);
|
|
59
|
+
if (idx === -1)
|
|
60
|
+
throw new Error(`Invalid base32 secret: '${secret}'`);
|
|
61
|
+
for (let i = 4; i >= 0; i--) {
|
|
62
|
+
bits.push((idx >> i) & 1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const bytes = [];
|
|
66
|
+
for (let i = 0; i + 8 <= bits.length; i += 8) {
|
|
67
|
+
let byte = 0;
|
|
68
|
+
for (let j = 0; j < 8; j++)
|
|
69
|
+
byte = (byte << 1) | bits[i + j];
|
|
70
|
+
bytes.push(byte);
|
|
71
|
+
}
|
|
72
|
+
if (bytes.length === 0) {
|
|
73
|
+
throw new Error(`Invalid base32 secret: '${secret}'`);
|
|
74
|
+
}
|
|
75
|
+
return Buffer.from(bytes);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Generate an HOTP code per RFC 4226 (internal helper).
|
|
79
|
+
* @internal
|
|
80
|
+
*/
|
|
81
|
+
function generateHotp(secret, counter, algorithm = "sha1", digits = 6) {
|
|
82
|
+
const key = b32decode(secret);
|
|
83
|
+
const msg = Buffer.alloc(8);
|
|
84
|
+
// Write counter as big-endian u64
|
|
85
|
+
msg.writeUInt32BE(Math.floor(counter / 0x100000000), 0);
|
|
86
|
+
msg.writeUInt32BE(counter >>> 0, 4);
|
|
87
|
+
const h = createHmac(algorithm, key).update(msg).digest();
|
|
88
|
+
const offset = h[h.length - 1] & 0x0f;
|
|
89
|
+
const code = ((h[offset] & 0x7f) << 24) |
|
|
90
|
+
((h[offset + 1] & 0xff) << 16) |
|
|
91
|
+
((h[offset + 2] & 0xff) << 8) |
|
|
92
|
+
(h[offset + 3] & 0xff);
|
|
93
|
+
return String(code % 10 ** digits).padStart(digits, "0");
|
|
94
|
+
}
|
|
95
|
+
// ---- Public API ----
|
|
96
|
+
/**
|
|
97
|
+
* Generate the current TOTP code per RFC 6238.
|
|
98
|
+
*
|
|
99
|
+
* @param config - TOTP configuration with the shared secret and parameters.
|
|
100
|
+
* @returns A {@link TOTPCode} with the code and timing metadata.
|
|
101
|
+
*/
|
|
102
|
+
export function generateTotp(config) {
|
|
103
|
+
validateTotpConfig(config);
|
|
104
|
+
const algorithm = config.algorithm ?? "sha1";
|
|
105
|
+
const digits = config.digits ?? 6;
|
|
106
|
+
const period = config.period ?? 30;
|
|
107
|
+
const now = Math.floor(Date.now() / 1000);
|
|
108
|
+
const counter = Math.floor(now / period);
|
|
109
|
+
const periodStart = counter * period;
|
|
110
|
+
const periodEnd = periodStart + period;
|
|
111
|
+
const secondsRemaining = periodEnd - now;
|
|
112
|
+
const code = generateHotp(config.secret, counter, algorithm, digits);
|
|
113
|
+
return { code, periodStart, periodEnd, secondsRemaining };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Parse an `otpauth://totp/...` URI into a {@link TOTPConfig}.
|
|
117
|
+
*
|
|
118
|
+
* Supports the Google Authenticator Key URI format.
|
|
119
|
+
* Rejects HOTP URIs with an error.
|
|
120
|
+
*
|
|
121
|
+
* @param uri - The full `otpauth://` URI string.
|
|
122
|
+
* @returns A validated {@link TOTPConfig}.
|
|
123
|
+
* @throws Error on invalid scheme, HOTP type, missing secret, or invalid parameters.
|
|
124
|
+
*/
|
|
125
|
+
export function parseTotpUri(uri) {
|
|
126
|
+
let parsed;
|
|
127
|
+
try {
|
|
128
|
+
parsed = new URL(uri);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
throw new Error(`Invalid URI: ${uri}`);
|
|
132
|
+
}
|
|
133
|
+
if (parsed.protocol !== "otpauth:") {
|
|
134
|
+
throw new Error(`Invalid scheme: expected 'otpauth', got '${parsed.protocol.replace(":", "")}'`);
|
|
135
|
+
}
|
|
136
|
+
const otpType = parsed.hostname;
|
|
137
|
+
if (otpType === "hotp") {
|
|
138
|
+
throw new Error("HOTP is not supported — only TOTP URIs are accepted");
|
|
139
|
+
}
|
|
140
|
+
if (otpType !== "totp") {
|
|
141
|
+
throw new Error(`Invalid OTP type: expected 'totp', got '${otpType}'`);
|
|
142
|
+
}
|
|
143
|
+
// Parse label — path is /<label>, label is [Issuer:]AccountName
|
|
144
|
+
const label = decodeURIComponent(parsed.pathname.replace(/^\//, ""));
|
|
145
|
+
let labelIssuer;
|
|
146
|
+
let accountName;
|
|
147
|
+
if (label.includes(":")) {
|
|
148
|
+
const [issuerPart, ...rest] = label.split(":");
|
|
149
|
+
labelIssuer = issuerPart.trim();
|
|
150
|
+
accountName = rest.join(":").trim();
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
accountName = label.trim() || undefined;
|
|
154
|
+
}
|
|
155
|
+
// Secret (required)
|
|
156
|
+
const secret = parsed.searchParams.get("secret");
|
|
157
|
+
if (!secret) {
|
|
158
|
+
throw new Error("Missing required 'secret' parameter");
|
|
159
|
+
}
|
|
160
|
+
const secretUpper = secret.toUpperCase();
|
|
161
|
+
b32decode(secretUpper); // validate
|
|
162
|
+
// Issuer — query param takes precedence over label prefix
|
|
163
|
+
const issuer = parsed.searchParams.get("issuer") || labelIssuer || undefined;
|
|
164
|
+
// Algorithm
|
|
165
|
+
const algorithmStr = (parsed.searchParams.get("algorithm") || "sha1").toLowerCase();
|
|
166
|
+
if (!VALID_ALGORITHMS.includes(algorithmStr)) {
|
|
167
|
+
throw new Error(`Invalid algorithm: '${algorithmStr}'. Must be one of: sha1, sha256, sha512`);
|
|
168
|
+
}
|
|
169
|
+
const algorithm = algorithmStr;
|
|
170
|
+
// Digits
|
|
171
|
+
const digitsStr = parsed.searchParams.get("digits") || "6";
|
|
172
|
+
if (!/^\d+$/.test(digitsStr)) {
|
|
173
|
+
throw new Error(`Invalid digits: '${digitsStr}'. Must be 6 or 8`);
|
|
174
|
+
}
|
|
175
|
+
const digits = Number(digitsStr);
|
|
176
|
+
if (!VALID_DIGITS.has(digits)) {
|
|
177
|
+
throw new Error(`Invalid digits: '${digitsStr}'. Must be 6 or 8`);
|
|
178
|
+
}
|
|
179
|
+
// Period
|
|
180
|
+
const periodStr = parsed.searchParams.get("period") || "30";
|
|
181
|
+
if (!/^\d+$/.test(periodStr)) {
|
|
182
|
+
throw new Error(`Invalid period: '${periodStr}'. Must be 30 or 60`);
|
|
183
|
+
}
|
|
184
|
+
const period = Number(periodStr);
|
|
185
|
+
if (!VALID_PERIODS.has(period)) {
|
|
186
|
+
throw new Error(`Invalid period: '${periodStr}'. Must be 30 or 60`);
|
|
187
|
+
}
|
|
188
|
+
const config = {
|
|
189
|
+
secret: secretUpper,
|
|
190
|
+
algorithm,
|
|
191
|
+
digits,
|
|
192
|
+
period,
|
|
193
|
+
issuer,
|
|
194
|
+
accountName: accountName || undefined,
|
|
195
|
+
};
|
|
196
|
+
validateTotpConfig(config);
|
|
197
|
+
return config;
|
|
198
|
+
}
|
|
199
|
+
// ---- Serialization helpers for wire format (camelCase ↔ snake_case) ----
|
|
200
|
+
/** Serialize a TOTPConfig to the snake_case wire format. @internal */
|
|
201
|
+
export function serializeTotpConfig(config) {
|
|
202
|
+
const d = {
|
|
203
|
+
secret: config.secret,
|
|
204
|
+
};
|
|
205
|
+
if (config.algorithm !== undefined)
|
|
206
|
+
d.algorithm = config.algorithm;
|
|
207
|
+
if (config.digits !== undefined)
|
|
208
|
+
d.digits = config.digits;
|
|
209
|
+
if (config.period !== undefined)
|
|
210
|
+
d.period = config.period;
|
|
211
|
+
if (config.issuer !== undefined)
|
|
212
|
+
d.issuer = config.issuer;
|
|
213
|
+
if (config.accountName !== undefined)
|
|
214
|
+
d.account_name = config.accountName;
|
|
215
|
+
return d;
|
|
216
|
+
}
|
|
217
|
+
/** Parse a TOTPConfig from the snake_case wire format. @internal */
|
|
218
|
+
export function parseTotpConfig(raw) {
|
|
219
|
+
const config = {
|
|
220
|
+
secret: raw.secret,
|
|
221
|
+
algorithm: raw.algorithm ?? "sha1",
|
|
222
|
+
digits: raw.digits ?? 6,
|
|
223
|
+
period: raw.period ?? 30,
|
|
224
|
+
issuer: raw.issuer,
|
|
225
|
+
accountName: raw.account_name ?? undefined,
|
|
226
|
+
};
|
|
227
|
+
validateTotpConfig(config);
|
|
228
|
+
return config;
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=totp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"totp.js","sourceRoot":"","sources":["../../src/vault/totp.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,kBAAkB;AAElB;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;CACR,CAAC;AAmCX,uBAAuB;AAEvB,MAAM,gBAAgB,GAAsB,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACzE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACrC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAExC;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAkB;IACnD,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,8BAA8B,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;IACvC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,kDAAkD,GAAG,EAAE,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,6BAA6B;AAE7B;;;GAGG;AACH,SAAS,SAAS,CAAC,MAAc;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACtD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,MAAM,QAAQ,GAAG,kCAAkC,CAAC;IACpD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACjC,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,GAAG,CAAC,CAAC;QACtE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7C,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAAE,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,SAAS,YAAY,CACnB,MAAc,EACd,OAAe,EACf,YAA2B,MAAM,EACjC,SAAiB,CAAC;IAElB,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,kCAAkC;IAClC,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC;IACxD,GAAG,CAAC,aAAa,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAEpC,MAAM,CAAC,GAAG,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;IAC1D,MAAM,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;IACtC,MAAM,IAAI,GACR,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAEzB,OAAO,MAAM,CAAC,IAAI,GAAG,EAAE,IAAI,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC3D,CAAC;AAED,uBAAuB;AAEvB;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,MAAkB;IAC7C,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE3B,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;IAEnC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,OAAO,GAAG,MAAM,CAAC;IACrC,MAAM,SAAS,GAAG,WAAW,GAAG,MAAM,CAAC;IACvC,MAAM,gBAAgB,GAAG,SAAS,GAAG,GAAG,CAAC;IAEzC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IAErE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;AAC5D,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,4CAA4C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAChF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC;IAChC,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,2CAA2C,OAAO,GAAG,CAAC,CAAC;IACzE,CAAC;IAED,gEAAgE;IAChE,MAAM,KAAK,GAAG,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACrE,IAAI,WAA+B,CAAC;IACpC,IAAI,WAA+B,CAAC;IACpC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/C,WAAW,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC;QAChC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;IAC1C,CAAC;IAED,oBAAoB;IACpB,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IACzC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW;IAEnC,0DAA0D;IAC1D,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,WAAW,IAAI,SAAS,CAAC;IAE7E,YAAY;IACZ,MAAM,YAAY,GAAG,CACnB,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,MAAM,CAC/C,CAAC,WAAW,EAAE,CAAC;IAChB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CACb,uBAAuB,YAAY,yCAAyC,CAC7E,CAAC;IACJ,CAAC;IACD,MAAM,SAAS,GAAG,YAA6B,CAAC;IAEhD,SAAS;IACT,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,mBAAmB,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,mBAAmB,CAAC,CAAC;IACpE,CAAC;IAED,SAAS;IACT,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;IAC5D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,qBAAqB,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IACjC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,oBAAoB,SAAS,qBAAqB,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,MAAM,GAAe;QACzB,MAAM,EAAE,WAAW;QACnB,SAAS;QACT,MAAM;QACN,MAAM;QACN,MAAM;QACN,WAAW,EAAE,WAAW,IAAI,SAAS;KACtC,CAAC;IACF,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2EAA2E;AAE3E,sEAAsE;AACtE,MAAM,UAAU,mBAAmB,CACjC,MAAkB;IAElB,MAAM,CAAC,GAA4B;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IACF,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;QAAE,CAAC,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnE,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS;QAAE,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1D,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;QAAE,CAAC,CAAC,YAAY,GAAG,MAAM,CAAC,WAAW,CAAC;IAC1E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,eAAe,CAC7B,GAA4B;IAE5B,MAAM,MAAM,GAAe;QACzB,MAAM,EAAE,GAAG,CAAC,MAAgB;QAC5B,SAAS,EAAG,GAAG,CAAC,SAA2B,IAAI,MAAM;QACrD,MAAM,EAAG,GAAG,CAAC,MAAiB,IAAI,CAAC;QACnC,MAAM,EAAG,GAAG,CAAC,MAAiB,IAAI,EAAE;QACpC,MAAM,EAAE,GAAG,CAAC,MAA4B;QACxC,WAAW,EAAG,GAAG,CAAC,YAAuB,IAAI,SAAS;KACvD,CAAC;IACF,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/dist/vault/types.d.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Includes API response types, raw JSON shapes, parsers,
|
|
5
5
|
* and client-side structured secret payloads.
|
|
6
6
|
*/
|
|
7
|
+
import type { TOTPConfig } from "./totp.js";
|
|
7
8
|
/**
|
|
8
9
|
* Category of credential stored in a vault secret.
|
|
9
10
|
*
|
|
@@ -97,6 +98,8 @@ export interface LoginPayload {
|
|
|
97
98
|
/** URL of the service. */
|
|
98
99
|
url?: string;
|
|
99
100
|
notes?: string;
|
|
101
|
+
/** Optional TOTP configuration for two-factor authentication. */
|
|
102
|
+
totp?: TOTPConfig;
|
|
100
103
|
}
|
|
101
104
|
/** Payload for `other` (freeform catch-all) secrets. */
|
|
102
105
|
export interface OtherPayload {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/vault/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/vault/types.ts"],"names":[],"mappings":"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"}
|
package/dist/vault/types.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* Includes API response types, raw JSON shapes, parsers,
|
|
5
5
|
* and client-side structured secret payloads.
|
|
6
6
|
*/
|
|
7
|
+
import { serializeTotpConfig, parseTotpConfig } from "./totp.js";
|
|
7
8
|
// ---- Enums ----
|
|
8
9
|
/**
|
|
9
10
|
* Category of credential stored in a vault secret.
|
|
@@ -107,6 +108,8 @@ export function serializePayload(secretType, payload) {
|
|
|
107
108
|
d.url = p.url;
|
|
108
109
|
if (p.notes !== undefined)
|
|
109
110
|
d.notes = p.notes;
|
|
111
|
+
if (p.totp !== undefined)
|
|
112
|
+
d.totp = serializeTotpConfig(p.totp);
|
|
110
113
|
return d;
|
|
111
114
|
}
|
|
112
115
|
case "other": {
|
|
@@ -174,6 +177,7 @@ export function parsePayload(secretType, raw) {
|
|
|
174
177
|
email: raw.email,
|
|
175
178
|
url: raw.url,
|
|
176
179
|
notes: raw.notes,
|
|
180
|
+
totp: raw.totp ? parseTotpConfig(raw.totp) : undefined,
|
|
177
181
|
};
|
|
178
182
|
case "other":
|
|
179
183
|
return { data: raw.data, notes: raw.notes };
|
package/dist/vault/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/vault/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/vault/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inkbox/sdk",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "TypeScript SDK for the Inkbox API",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/node": "^25.5.0",
|
|
30
30
|
"@vitest/coverage-v8": "^2.0.0",
|
|
31
|
+
"tsx": "^4.21.0",
|
|
31
32
|
"typescript": "^5.4.0",
|
|
32
33
|
"vitest": "^2.0.0"
|
|
33
34
|
},
|