@vibes.diy/identity 14.1.38 → 14.1.40
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/device-id/keybag-fixture.d.ts +16 -0
- package/device-id/keybag-fixture.js +43 -0
- package/device-id/keybag-fixture.js.map +1 -0
- package/device-id-env-value.test.d.ts +1 -0
- package/device-id-env-value.test.js +82 -0
- package/device-id-env-value.test.js.map +1 -0
- package/keybag/key-bag.js +2 -14
- package/keybag/key-bag.js.map +1 -1
- package/node.d.ts +12 -0
- package/node.js +62 -2
- package/node.js.map +1 -1
- package/package.json +2 -2
- package/testing.d.ts +2 -0
- package/testing.js +1 -0
- package/testing.js.map +1 -1
- package/types/keybag-item-schema.d.ts +4 -0
- package/types/keybag-item-schema.js +16 -0
- package/types/keybag-item-schema.js.map +1 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { SuperThis } from "../types/sthis.js";
|
|
2
|
+
import type { DeviceIdKeyBagItem } from "../types/keybag-item.js";
|
|
3
|
+
import type { JWKPrivate } from "../types/wire.js";
|
|
4
|
+
export interface TestDeviceIdKeybagFile {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly clazz: "DeviceIdKeyBagItem";
|
|
7
|
+
readonly item: {
|
|
8
|
+
readonly deviceId: JWKPrivate;
|
|
9
|
+
readonly cert: NonNullable<DeviceIdKeyBagItem["cert"]>;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
export declare function createTestDeviceIdKeybagFile(opts: {
|
|
13
|
+
readonly sthis: SuperThis;
|
|
14
|
+
readonly clerkUserId?: string;
|
|
15
|
+
readonly commonName?: string;
|
|
16
|
+
}): Promise<TestDeviceIdKeybagFile>;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { DeviceIdKey } from "./key.js";
|
|
2
|
+
import { DeviceIdCSR } from "./csr.js";
|
|
3
|
+
import { createTestDeviceCA } from "./test-helpers.js";
|
|
4
|
+
export async function createTestDeviceIdKeybagFile(opts) {
|
|
5
|
+
const deviceCA = await createTestDeviceCA(opts.sthis);
|
|
6
|
+
const devid = await DeviceIdKey.create();
|
|
7
|
+
const privateJWK = await devid.exportPrivateJWK();
|
|
8
|
+
const devkey = (await DeviceIdKey.createFromJWK(privateJWK)).Ok();
|
|
9
|
+
const rCsr = await new DeviceIdCSR(opts.sthis, devkey).createCSR({ commonName: opts.commonName ?? "test-device" });
|
|
10
|
+
const now = Math.floor(Date.now() / 1000);
|
|
11
|
+
const rCert = await deviceCA.processCSR(rCsr.Ok(), {
|
|
12
|
+
azp: "test-app",
|
|
13
|
+
exp: now + 3600,
|
|
14
|
+
iat: now,
|
|
15
|
+
iss: "test-issuer",
|
|
16
|
+
jti: opts.sthis.nextId().str,
|
|
17
|
+
nbf: now,
|
|
18
|
+
params: {
|
|
19
|
+
nick: "fixture-nick",
|
|
20
|
+
email: "fixture@example.com",
|
|
21
|
+
email_verified: true,
|
|
22
|
+
first: "Fixture",
|
|
23
|
+
image_url: "http://example.com/fixture.png",
|
|
24
|
+
last: "Device",
|
|
25
|
+
name: "Fixture Device",
|
|
26
|
+
public_meta: '{ "role": "fixture" }',
|
|
27
|
+
},
|
|
28
|
+
role: "device-id",
|
|
29
|
+
sub: `device-id-subject-${opts.sthis.nextId().str}`,
|
|
30
|
+
userId: opts.clerkUserId ?? "user_fixture",
|
|
31
|
+
aud: ["http://test-audience.localhost/"],
|
|
32
|
+
});
|
|
33
|
+
const issued = rCert.Ok();
|
|
34
|
+
return {
|
|
35
|
+
id: "z3QkefAC57rcrs",
|
|
36
|
+
clazz: "DeviceIdKeyBagItem",
|
|
37
|
+
item: {
|
|
38
|
+
deviceId: privateJWK,
|
|
39
|
+
cert: { certificateJWT: issued.certificateJWT, certificatePayload: issued.certificatePayload },
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=keybag-fixture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keybag-fixture.js","sourceRoot":"","sources":["../../jsr/device-id/keybag-fixture.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAkBvD,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,IAIlD;IACC,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC;IACzC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAC;IAClD,MAAM,MAAM,GAAG,CAAC,MAAM,WAAW,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAClE,MAAM,IAAI,GAAG,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,aAAa,EAAE,CAAC,CAAC;IACnH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE;QACjD,GAAG,EAAE,UAAU;QACf,GAAG,EAAE,GAAG,GAAG,IAAI;QACf,GAAG,EAAE,GAAG;QACR,GAAG,EAAE,aAAa;QAClB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG;QAC5B,GAAG,EAAE,GAAG;QACR,MAAM,EAAE;YACN,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,qBAAqB;YAC5B,cAAc,EAAE,IAAI;YACpB,KAAK,EAAE,SAAS;YAChB,SAAS,EAAE,gCAAgC;YAC3C,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,uBAAuB;SACrC;QACD,IAAI,EAAE,WAAW;QACjB,GAAG,EAAE,qBAAqB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE;QACnD,MAAM,EAAE,IAAI,CAAC,WAAW,IAAI,cAAc;QAC1C,GAAG,EAAE,CAAC,iCAAiC,CAAC;KAChC,CAAC,CAAC;IACZ,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,EAAE,CAAC;IAC1B,OAAO;QACL,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,oBAAoB;QAC3B,IAAI,EAAE;YACJ,QAAQ,EAAE,UAAwB;YAClC,IAAI,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,EAAE;SAC/F;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import { Buffer } from "node:buffer";
|
|
3
|
+
import { ensureSuperThis } from "./index.js";
|
|
4
|
+
import { parseDeviceIdEnvValue } from "./node.js";
|
|
5
|
+
import { createTestDeviceIdKeybagFile } from "./testing.js";
|
|
6
|
+
const ENV = "VIBES_DEVICE_ID_TEST";
|
|
7
|
+
function keybagFile() {
|
|
8
|
+
return createTestDeviceIdKeybagFile({ sthis: ensureSuperThis(), clerkUserId: "user_fixture" });
|
|
9
|
+
}
|
|
10
|
+
describe("parseDeviceIdEnvValue", () => {
|
|
11
|
+
it("accepts a full, CA-issued keybag file — raw and base64", async () => {
|
|
12
|
+
const file = await keybagFile();
|
|
13
|
+
const raw = JSON.stringify(file);
|
|
14
|
+
const rRaw = parseDeviceIdEnvValue(raw, { envVarName: ENV });
|
|
15
|
+
expect(rRaw.isOk()).toBe(true);
|
|
16
|
+
expect(rRaw.Ok().cert.certificateJWT).toBe(file.item.cert.certificateJWT);
|
|
17
|
+
expect(rRaw.Ok().cert.certificatePayload.certificate.subject.commonName).toBe("test-device");
|
|
18
|
+
expect(parseDeviceIdEnvValue(Buffer.from(raw, "utf8").toString("base64"), { envVarName: ENV }).isOk()).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
it("accepts the bare item shape too", async () => {
|
|
21
|
+
const file = await keybagFile();
|
|
22
|
+
expect(parseDeviceIdEnvValue(JSON.stringify(file.item), { envVarName: ENV }).isOk()).toBe(true);
|
|
23
|
+
});
|
|
24
|
+
it("REFUSES an empty certificate payload — the shape a truncated copy leaves behind", async () => {
|
|
25
|
+
const file = await keybagFile();
|
|
26
|
+
const broken = {
|
|
27
|
+
...file,
|
|
28
|
+
item: { ...file.item, cert: { certificateJWT: "header.payload.sig", certificatePayload: {} } },
|
|
29
|
+
};
|
|
30
|
+
const r = parseDeviceIdEnvValue(JSON.stringify(broken), { envVarName: ENV });
|
|
31
|
+
expect(r.isErr()).toBe(true);
|
|
32
|
+
expect(r.Err().message).toContain(ENV);
|
|
33
|
+
expect(r.Err().message).toMatch(/malformed signed certificate/);
|
|
34
|
+
});
|
|
35
|
+
it("REFUSES a truncated certificate payload that keeps some fields", async () => {
|
|
36
|
+
const file = await keybagFile();
|
|
37
|
+
const payload = file.item.cert.certificatePayload;
|
|
38
|
+
const truncated = { sub: payload.sub, certificate: { commonName: payload.sub } };
|
|
39
|
+
const broken = { ...file, item: { ...file.item, cert: { certificateJWT: "a.b.c", certificatePayload: truncated } } };
|
|
40
|
+
const r = parseDeviceIdEnvValue(JSON.stringify(broken), { envVarName: ENV });
|
|
41
|
+
expect(r.isErr()).toBe(true);
|
|
42
|
+
expect(r.Err().message).toMatch(/malformed signed certificate/);
|
|
43
|
+
});
|
|
44
|
+
it("keeps the missing-certificate sentence distinct from the malformed one", async () => {
|
|
45
|
+
const file = await keybagFile();
|
|
46
|
+
const r = parseDeviceIdEnvValue(JSON.stringify({ ...file, item: { deviceId: file.item.deviceId } }), {
|
|
47
|
+
envVarName: ENV,
|
|
48
|
+
});
|
|
49
|
+
expect(r.isErr()).toBe(true);
|
|
50
|
+
expect(r.Err().message).toMatch(/missing the signed certificate/);
|
|
51
|
+
});
|
|
52
|
+
it("keeps the invalid-private-key sentence", async () => {
|
|
53
|
+
const file = await keybagFile();
|
|
54
|
+
const deviceId = { ...file.item.deviceId };
|
|
55
|
+
delete deviceId.d;
|
|
56
|
+
const r = parseDeviceIdEnvValue(JSON.stringify({ ...file, item: { ...file.item, deviceId } }), { envVarName: ENV });
|
|
57
|
+
expect(r.isErr()).toBe(true);
|
|
58
|
+
expect(r.Err().message).toMatch(/invalid device private key/);
|
|
59
|
+
});
|
|
60
|
+
it("keeps the not-JSON sentence", () => {
|
|
61
|
+
const r = parseDeviceIdEnvValue("%%% not json or base64 %%%", { envVarName: ENV });
|
|
62
|
+
expect(r.isErr()).toBe(true);
|
|
63
|
+
expect(r.Err().message).toMatch(/not valid JSON or base64-encoded JSON/);
|
|
64
|
+
});
|
|
65
|
+
it("never carries the VALUE into a refusal — the variable holds a signing key", async () => {
|
|
66
|
+
const file = await keybagFile();
|
|
67
|
+
const secretD = file.item.deviceId.d;
|
|
68
|
+
const secretJwt = file.item.cert.certificateJWT;
|
|
69
|
+
const broken = { ...file, item: { ...file.item, cert: { certificateJWT: secretJwt, certificatePayload: {} } } };
|
|
70
|
+
const raw = JSON.stringify(broken);
|
|
71
|
+
const message = parseDeviceIdEnvValue(raw, { envVarName: ENV }).Err().message;
|
|
72
|
+
expect(message).not.toContain(secretD);
|
|
73
|
+
expect(message).not.toContain(secretJwt);
|
|
74
|
+
expect(message).not.toContain(raw);
|
|
75
|
+
const deviceId = { ...file.item.deviceId };
|
|
76
|
+
deviceId.crv = secretD;
|
|
77
|
+
const keyRaw = JSON.stringify({ ...file, item: { ...file.item, deviceId } });
|
|
78
|
+
const keyMessage = parseDeviceIdEnvValue(keyRaw, { envVarName: ENV }).Err().message;
|
|
79
|
+
expect(keyMessage).not.toContain(secretD);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
//# sourceMappingURL=device-id-env-value.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"device-id-env-value.test.js","sourceRoot":"","sources":["../jsr/device-id-env-value.test.ts"],"names":[],"mappings":"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"}
|
package/keybag/key-bag.js
CHANGED
|
@@ -1,24 +1,12 @@
|
|
|
1
1
|
import { KeyedResolvOnce, Lazy, Option } from "@adviser/cement";
|
|
2
2
|
import { hashStringAsync, hashStringSync } from "../runtime/hashing.js";
|
|
3
3
|
import { z } from "zod";
|
|
4
|
-
import {
|
|
5
|
-
import { CertificatePayloadSchema } from "../types/cert-payload.js";
|
|
4
|
+
import { DeviceIdKeyBagItemSchema } from "../types/keybag-item-schema.js";
|
|
6
5
|
const KeyedDeviceIdKeyBagItemSchema = z
|
|
7
6
|
.object({
|
|
8
7
|
id: z.string(),
|
|
9
8
|
clazz: z.literal("DeviceIdKeyBagItem"),
|
|
10
|
-
item:
|
|
11
|
-
.object({
|
|
12
|
-
deviceId: JWKPrivateSchema,
|
|
13
|
-
cert: z
|
|
14
|
-
.object({
|
|
15
|
-
certificateJWT: z.string(),
|
|
16
|
-
certificatePayload: CertificatePayloadSchema,
|
|
17
|
-
})
|
|
18
|
-
.readonly()
|
|
19
|
-
.optional(),
|
|
20
|
-
})
|
|
21
|
-
.readonly(),
|
|
9
|
+
item: DeviceIdKeyBagItemSchema,
|
|
22
10
|
})
|
|
23
11
|
.readonly();
|
|
24
12
|
export class DeviceIdKeybagUnreadableError extends Error {
|
package/keybag/key-bag.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-bag.js","sourceRoot":"","sources":["../../jsr/keybag/key-bag.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"key-bag.js","sourceRoot":"","sources":["../../jsr/keybag/key-bag.ts"],"names":[],"mappings":"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"}
|
package/node.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Result } from "@adviser/cement";
|
|
2
2
|
import type { SuperThis } from "./types/sthis.js";
|
|
3
|
+
import type { JWKPrivate } from "./types/wire.js";
|
|
4
|
+
import type { DeviceIdKeyBagItem } from "./types/keybag-item.js";
|
|
3
5
|
import type { CertificatePayload } from "./types/cert-payload.js";
|
|
4
6
|
import type { DashAuthType } from "./dash-api/protocols-dashboard/index.js";
|
|
5
7
|
export { getKeyBag } from "./keybag/keybag.js";
|
|
@@ -22,3 +24,13 @@ export declare function createDeviceIdGetToken(sthis: SuperThis, opts: {
|
|
|
22
24
|
readonly missingCertMessage?: string;
|
|
23
25
|
readonly corruptKeybagMessage?: string;
|
|
24
26
|
}): Promise<() => Promise<Result<DashAuthType>>>;
|
|
27
|
+
export interface DeviceIdCredentialItem {
|
|
28
|
+
readonly deviceId: JWKPrivate;
|
|
29
|
+
readonly cert: NonNullable<DeviceIdKeyBagItem["cert"]>;
|
|
30
|
+
}
|
|
31
|
+
export declare function createDeviceIdGetTokenFromItem(sthis: SuperThis, item: DeviceIdCredentialItem, opts: {
|
|
32
|
+
readonly iss: string;
|
|
33
|
+
}): Promise<() => Promise<Result<DashAuthType>>>;
|
|
34
|
+
export declare function parseDeviceIdEnvValue(raw: string, opts: {
|
|
35
|
+
readonly envVarName: string;
|
|
36
|
+
}): Result<DeviceIdCredentialItem>;
|
package/node.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
1
2
|
import { exception2Result, Lazy, Result } from "@adviser/cement";
|
|
3
|
+
import { DeviceIdKeyBagItemSchema } from "./types/keybag-item-schema.js";
|
|
2
4
|
import { getKeyBag } from "./keybag/keybag.js";
|
|
3
5
|
import { isUnreadableDeviceIdKeybagError } from "./keybag/key-bag.js";
|
|
4
6
|
import { DeviceIdKey } from "./device-id/key.js";
|
|
@@ -42,11 +44,15 @@ export async function createDeviceIdGetToken(sthis, opts) {
|
|
|
42
44
|
if (devid.cert.IsNone()) {
|
|
43
45
|
throw new Error(opts.missingCertMessage ?? "Run 'npx vibes-diy login' to authenticate this device");
|
|
44
46
|
}
|
|
45
|
-
const
|
|
47
|
+
const certResult = devid.cert.Unwrap();
|
|
48
|
+
return createDeviceIdGetTokenFromItem(sthis, { deviceId: devid.deviceId.Unwrap(), cert: certResult }, { iss: opts.iss });
|
|
49
|
+
}
|
|
50
|
+
export async function createDeviceIdGetTokenFromItem(sthis, item, opts) {
|
|
51
|
+
const rDevkey = await DeviceIdKey.createFromJWK(item.deviceId);
|
|
46
52
|
if (rDevkey.isErr()) {
|
|
47
53
|
throw rDevkey.Err();
|
|
48
54
|
}
|
|
49
|
-
const certResult =
|
|
55
|
+
const certResult = item.cert;
|
|
50
56
|
const signer = new DeviceIdSignMsg(sthis.txt.base64, rDevkey.Ok(), certResult.certificatePayload, certResult.certificateJWT);
|
|
51
57
|
let seq = 0;
|
|
52
58
|
return Lazy(async () => {
|
|
@@ -64,4 +70,58 @@ export async function createDeviceIdGetToken(sthis, opts) {
|
|
|
64
70
|
return Result.Ok({ type: "device-id", token });
|
|
65
71
|
}, { resetAfter: 60, skipUnref: true });
|
|
66
72
|
}
|
|
73
|
+
function parseDeviceIdEnvJson(raw, envVarName) {
|
|
74
|
+
const trimmed = raw.trim();
|
|
75
|
+
const notJson = () => new Error(`${envVarName} is not valid JSON or base64-encoded JSON`);
|
|
76
|
+
try {
|
|
77
|
+
return Result.Ok(JSON.parse(trimmed));
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
}
|
|
81
|
+
let decoded;
|
|
82
|
+
try {
|
|
83
|
+
decoded = Buffer.from(trimmed, "base64").toString("utf8");
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
return Result.Err(notJson());
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
return Result.Ok(JSON.parse(decoded));
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
return Result.Err(notJson());
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
function asDeviceIdRecord(v) {
|
|
96
|
+
return v && typeof v === "object" ? v : undefined;
|
|
97
|
+
}
|
|
98
|
+
export function parseDeviceIdEnvValue(raw, opts) {
|
|
99
|
+
const envVarName = opts.envVarName;
|
|
100
|
+
const rParsed = parseDeviceIdEnvJson(raw, envVarName);
|
|
101
|
+
if (rParsed.isErr())
|
|
102
|
+
return Result.Err(rParsed.Err());
|
|
103
|
+
const top = asDeviceIdRecord(rParsed.Ok());
|
|
104
|
+
const item = asDeviceIdRecord(top?.item) ?? top;
|
|
105
|
+
if (!item || !("deviceId" in item)) {
|
|
106
|
+
return Result.Err(new Error(`${envVarName} must contain a device-id keybag item with "deviceId" and "cert"`));
|
|
107
|
+
}
|
|
108
|
+
if (item.cert === undefined || item.cert === null) {
|
|
109
|
+
return Result.Err(new Error(`${envVarName} is missing the signed certificate — copy the full ~/.fireproof/keybag/<id>.json written by 'vibes-diy login'`));
|
|
110
|
+
}
|
|
111
|
+
const rItem = DeviceIdKeyBagItemSchema.safeParse(item);
|
|
112
|
+
if (!rItem.success) {
|
|
113
|
+
const paths = rItem.error.issues.map((i) => i.path.join("."));
|
|
114
|
+
const keyIssue = paths.some((path) => path === "deviceId" || path.startsWith("deviceId."));
|
|
115
|
+
if (keyIssue) {
|
|
116
|
+
return Result.Err(new Error(`${envVarName} has an invalid device private key (fields: ${paths.join(", ")})`));
|
|
117
|
+
}
|
|
118
|
+
return Result.Err(new Error(`${envVarName} has a malformed signed certificate (fields: ${paths.join(", ")}) — copy the full ` +
|
|
119
|
+
`~/.fireproof/keybag/<id>.json written by 'vibes-diy login' rather than a truncated or hand-edited copy`));
|
|
120
|
+
}
|
|
121
|
+
const cert = rItem.data.cert;
|
|
122
|
+
if (cert === undefined) {
|
|
123
|
+
return Result.Err(new Error(`${envVarName} is missing the signed certificate — copy the full ~/.fireproof/keybag/<id>.json written by 'vibes-diy login'`));
|
|
124
|
+
}
|
|
125
|
+
return Result.Ok({ deviceId: rItem.data.deviceId, cert });
|
|
126
|
+
}
|
|
67
127
|
//# sourceMappingURL=node.js.map
|
package/node.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.js","sourceRoot":"","sources":["../jsr/node.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../jsr/node.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibes.diy/identity",
|
|
3
|
-
"version": "14.1.
|
|
3
|
+
"version": "14.1.40",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.js",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"@adviser/ts-xxhash": "~1.0.2",
|
|
20
20
|
"@clerk/shared": "~4.31.1",
|
|
21
21
|
"@hono/node-server": "~2.1.1",
|
|
22
|
-
"@vibes.diy/cmd-tools": "14.1.
|
|
22
|
+
"@vibes.diy/cmd-tools": "14.1.40",
|
|
23
23
|
"arktype": "~2.2.3",
|
|
24
24
|
"hono": "~4.13.7",
|
|
25
25
|
"jose": "~6.2.12",
|
package/testing.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export { createTestDeviceCA, createTestUser } from "./device-id/test-helpers.js";
|
|
2
|
+
export { createTestDeviceIdKeybagFile } from "./device-id/keybag-fixture.js";
|
|
3
|
+
export type { TestDeviceIdKeybagFile } from "./device-id/keybag-fixture.js";
|
|
2
4
|
export type { CreateTestUserParams, TestUser } from "./device-id/test-helpers.js";
|
|
3
5
|
export { DeviceIdKey } from "./device-id/key.js";
|
|
4
6
|
export { DeviceIdSignMsg } from "./device-id/sign.js";
|
package/testing.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { createTestDeviceCA, createTestUser } from "./device-id/test-helpers.js";
|
|
2
|
+
export { createTestDeviceIdKeybagFile } from "./device-id/keybag-fixture.js";
|
|
2
3
|
export { DeviceIdKey } from "./device-id/key.js";
|
|
3
4
|
export { DeviceIdSignMsg } from "./device-id/sign.js";
|
|
4
5
|
export { DeviceIdCSR } from "./device-id/csr.js";
|
package/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../jsr/testing.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAEjF,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../jsr/testing.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAEjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAG7E,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { JWKPrivateSchema } from "./wire.js";
|
|
3
|
+
import { CertificatePayloadSchema } from "./cert-payload.js";
|
|
4
|
+
export const DeviceIdCertSchema = z
|
|
5
|
+
.object({
|
|
6
|
+
certificateJWT: z.string(),
|
|
7
|
+
certificatePayload: CertificatePayloadSchema,
|
|
8
|
+
})
|
|
9
|
+
.readonly();
|
|
10
|
+
export const DeviceIdKeyBagItemSchema = z
|
|
11
|
+
.object({
|
|
12
|
+
deviceId: JWKPrivateSchema,
|
|
13
|
+
cert: DeviceIdCertSchema.optional(),
|
|
14
|
+
})
|
|
15
|
+
.readonly();
|
|
16
|
+
//# sourceMappingURL=keybag-item-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keybag-item-schema.js","sourceRoot":"","sources":["../../jsr/types/keybag-item-schema.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAI7D,MAAM,CAAC,MAAM,kBAAkB,GAAuD,CAAC;KACpF,MAAM,CAAC;IACN,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;IAC1B,kBAAkB,EAAE,wBAAwB;CAC7C,CAAC;KACD,QAAQ,EAAwD,CAAC;AAMpE,MAAM,CAAC,MAAM,wBAAwB,GAAkC,CAAC;KACrE,MAAM,CAAC;IACN,QAAQ,EAAE,gBAAgB;IAC1B,IAAI,EAAE,kBAAkB,CAAC,QAAQ,EAAE;CACpC,CAAC;KACD,QAAQ,EAAmC,CAAC"}
|