mindoodb 0.0.50 → 0.0.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/README-server.md +11 -2
  2. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +13 -1
  3. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
  4. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +45 -20
  5. package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
  6. package/dist/appendonlystores/network/HttpTransport.d.ts +2 -0
  7. package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
  8. package/dist/appendonlystores/network/HttpTransport.js +6 -62
  9. package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
  10. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +24 -0
  11. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
  12. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +75 -24
  13. package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
  14. package/dist/browser/index.mjs +72 -0
  15. package/dist/core/BaseMindooDB.d.ts +89 -14
  16. package/dist/core/BaseMindooDB.d.ts.map +1 -1
  17. package/dist/core/BaseMindooDB.js +692 -201
  18. package/dist/core/BaseMindooDB.js.map +1 -1
  19. package/dist/core/BaseMindooTenant.d.ts +59 -7
  20. package/dist/core/BaseMindooTenant.d.ts.map +1 -1
  21. package/dist/core/BaseMindooTenant.js +427 -90
  22. package/dist/core/BaseMindooTenant.js.map +1 -1
  23. package/dist/core/BaseMindooTenantDirectory.d.ts +61 -9
  24. package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
  25. package/dist/core/BaseMindooTenantDirectory.js +363 -35
  26. package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
  27. package/dist/core/BaseMindooTenantFactory.d.ts +17 -1
  28. package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
  29. package/dist/core/BaseMindooTenantFactory.js +292 -16
  30. package/dist/core/BaseMindooTenantFactory.js.map +1 -1
  31. package/dist/core/accesscontrol/DirectoryStateNode.d.ts +68 -1
  32. package/dist/core/accesscontrol/DirectoryStateNode.d.ts.map +1 -1
  33. package/dist/core/accesscontrol/DirectoryStateNode.js +157 -4
  34. package/dist/core/accesscontrol/DirectoryStateNode.js.map +1 -1
  35. package/dist/core/accesscontrol/directoryProjection.d.ts.map +1 -1
  36. package/dist/core/accesscontrol/directoryProjection.js +14 -5
  37. package/dist/core/accesscontrol/directoryProjection.js.map +1 -1
  38. package/dist/core/accesscontrol/grantKeys.d.ts +17 -14
  39. package/dist/core/accesscontrol/grantKeys.d.ts.map +1 -1
  40. package/dist/core/accesscontrol/grantKeys.js +51 -21
  41. package/dist/core/accesscontrol/grantKeys.js.map +1 -1
  42. package/dist/core/accesscontrol/types.d.ts +13 -7
  43. package/dist/core/accesscontrol/types.d.ts.map +1 -1
  44. package/dist/core/accesscontrol/types.js +16 -10
  45. package/dist/core/accesscontrol/types.js.map +1 -1
  46. package/dist/core/appendonlystores/network/AuthenticationService.d.ts +7 -0
  47. package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -1
  48. package/dist/core/appendonlystores/network/AuthenticationService.js +70 -14
  49. package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -1
  50. package/dist/core/appendonlystores/network/entryWireCodec.d.ts +51 -0
  51. package/dist/core/appendonlystores/network/entryWireCodec.d.ts.map +1 -0
  52. package/dist/core/appendonlystores/network/entryWireCodec.js +93 -0
  53. package/dist/core/appendonlystores/network/entryWireCodec.js.map +1 -0
  54. package/dist/core/builtinDbInvariants.d.ts +53 -0
  55. package/dist/core/builtinDbInvariants.d.ts.map +1 -0
  56. package/dist/core/builtinDbInvariants.js +147 -0
  57. package/dist/core/builtinDbInvariants.js.map +1 -0
  58. package/dist/core/copy/feasibility.d.ts.map +1 -1
  59. package/dist/core/copy/feasibility.js +3 -0
  60. package/dist/core/copy/feasibility.js.map +1 -1
  61. package/dist/core/copy/flatten.d.ts.map +1 -1
  62. package/dist/core/copy/flatten.js +7 -2
  63. package/dist/core/copy/flatten.js.map +1 -1
  64. package/dist/core/copy/host.d.ts +5 -0
  65. package/dist/core/copy/host.d.ts.map +1 -1
  66. package/dist/core/copy/preflight.d.ts.map +1 -1
  67. package/dist/core/copy/preflight.js +7 -1
  68. package/dist/core/copy/preflight.js.map +1 -1
  69. package/dist/core/copy/types.d.ts +8 -1
  70. package/dist/core/copy/types.d.ts.map +1 -1
  71. package/dist/core/crypto/EntrySignature.d.ts +8 -2
  72. package/dist/core/crypto/EntrySignature.d.ts.map +1 -1
  73. package/dist/core/crypto/EntrySignature.js +14 -5
  74. package/dist/core/crypto/EntrySignature.js.map +1 -1
  75. package/dist/core/crypto/MindooDocSigner.d.ts.map +1 -1
  76. package/dist/core/crypto/MindooDocSigner.js +11 -2
  77. package/dist/core/crypto/MindooDocSigner.js.map +1 -1
  78. package/dist/core/crypto/RSAEncryption.d.ts +19 -0
  79. package/dist/core/crypto/RSAEncryption.d.ts.map +1 -1
  80. package/dist/core/crypto/RSAEncryption.js +36 -3
  81. package/dist/core/crypto/RSAEncryption.js.map +1 -1
  82. package/dist/core/crypto/privateKeyEncryption.js +1 -1
  83. package/dist/core/crypto/privateKeyEncryption.js.map +1 -1
  84. package/dist/core/crypto/rsaOaep3072.d.ts +12 -0
  85. package/dist/core/crypto/rsaOaep3072.d.ts.map +1 -0
  86. package/dist/core/crypto/rsaOaep3072.js +30 -0
  87. package/dist/core/crypto/rsaOaep3072.js.map +1 -0
  88. package/dist/core/databaseIdValidation.d.ts +23 -0
  89. package/dist/core/databaseIdValidation.d.ts.map +1 -1
  90. package/dist/core/databaseIdValidation.js +59 -1
  91. package/dist/core/databaseIdValidation.js.map +1 -1
  92. package/dist/core/index.d.ts +9 -2
  93. package/dist/core/index.d.ts.map +1 -1
  94. package/dist/core/index.js +40 -4
  95. package/dist/core/index.js.map +1 -1
  96. package/dist/core/join/deviceJoinBootstrap.d.ts +23 -0
  97. package/dist/core/join/deviceJoinBootstrap.d.ts.map +1 -0
  98. package/dist/core/join/deviceJoinBootstrap.js +37 -0
  99. package/dist/core/join/deviceJoinBootstrap.js.map +1 -0
  100. package/dist/core/keys/KeyBag.d.ts +20 -2
  101. package/dist/core/keys/KeyBag.d.ts.map +1 -1
  102. package/dist/core/keys/KeyBag.js +22 -10
  103. package/dist/core/keys/KeyBag.js.map +1 -1
  104. package/dist/core/logging/MindooLogger.d.ts.map +1 -1
  105. package/dist/core/logging/MindooLogger.js +65 -40
  106. package/dist/core/logging/MindooLogger.js.map +1 -1
  107. package/dist/core/tenantIdValidation.d.ts.map +1 -1
  108. package/dist/core/tenantIdValidation.js +1 -1
  109. package/dist/core/tenantIdValidation.js.map +1 -1
  110. package/dist/core/tenantSetup.d.ts +109 -0
  111. package/dist/core/tenantSetup.d.ts.map +1 -0
  112. package/dist/core/tenantSetup.js +250 -0
  113. package/dist/core/tenantSetup.js.map +1 -0
  114. package/dist/core/types.d.ts +333 -43
  115. package/dist/core/types.d.ts.map +1 -1
  116. package/dist/core/types.js +27 -9
  117. package/dist/core/types.js.map +1 -1
  118. package/dist/core/uri/joinRequestUri.d.ts +37 -0
  119. package/dist/core/uri/joinRequestUri.d.ts.map +1 -0
  120. package/dist/core/uri/joinRequestUri.js +168 -0
  121. package/dist/core/uri/joinRequestUri.js.map +1 -0
  122. package/dist/core/userid/canonicalUsername.d.ts +66 -0
  123. package/dist/core/userid/canonicalUsername.d.ts.map +1 -0
  124. package/dist/core/userid/canonicalUsername.js +235 -0
  125. package/dist/core/userid/canonicalUsername.js.map +1 -0
  126. package/dist/core/userid/index.d.ts +9 -0
  127. package/dist/core/userid/index.d.ts.map +1 -1
  128. package/dist/core/userid/index.js +14 -0
  129. package/dist/core/userid/index.js.map +1 -1
  130. package/dist/core/userkeys/UserKeyDocument.d.ts +50 -0
  131. package/dist/core/userkeys/UserKeyDocument.d.ts.map +1 -0
  132. package/dist/core/userkeys/UserKeyDocument.js +145 -0
  133. package/dist/core/userkeys/UserKeyDocument.js.map +1 -0
  134. package/dist/core/userkeys/UserKeyManager.d.ts +170 -0
  135. package/dist/core/userkeys/UserKeyManager.d.ts.map +1 -0
  136. package/dist/core/userkeys/UserKeyManager.js +1277 -0
  137. package/dist/core/userkeys/UserKeyManager.js.map +1 -0
  138. package/dist/core/userkeys/fingerprint.d.ts +17 -0
  139. package/dist/core/userkeys/fingerprint.d.ts.map +1 -0
  140. package/dist/core/userkeys/fingerprint.js +59 -0
  141. package/dist/core/userkeys/fingerprint.js.map +1 -0
  142. package/dist/core/userkeys/index.d.ts +11 -0
  143. package/dist/core/userkeys/index.d.ts.map +1 -0
  144. package/dist/core/userkeys/index.js +49 -0
  145. package/dist/core/userkeys/index.js.map +1 -0
  146. package/dist/core/userkeys/recipients.d.ts +51 -0
  147. package/dist/core/userkeys/recipients.d.ts.map +1 -0
  148. package/dist/core/userkeys/recipients.js +292 -0
  149. package/dist/core/userkeys/recipients.js.map +1 -0
  150. package/dist/core/userkeys/resolveUserKeyDocument.d.ts +21 -0
  151. package/dist/core/userkeys/resolveUserKeyDocument.d.ts.map +1 -0
  152. package/dist/core/userkeys/resolveUserKeyDocument.js +98 -0
  153. package/dist/core/userkeys/resolveUserKeyDocument.js.map +1 -0
  154. package/dist/core/userkeys/sealedCrypto.d.ts +21 -0
  155. package/dist/core/userkeys/sealedCrypto.d.ts.map +1 -0
  156. package/dist/core/userkeys/sealedCrypto.js +79 -0
  157. package/dist/core/userkeys/sealedCrypto.js.map +1 -0
  158. package/dist/core/userkeys/sealedTypes.d.ts +72 -0
  159. package/dist/core/userkeys/sealedTypes.d.ts.map +1 -0
  160. package/dist/core/userkeys/sealedTypes.js +14 -0
  161. package/dist/core/userkeys/sealedTypes.js.map +1 -0
  162. package/dist/core/userkeys/types.d.ts +70 -0
  163. package/dist/core/userkeys/types.d.ts.map +1 -0
  164. package/dist/core/userkeys/types.js +48 -0
  165. package/dist/core/userkeys/types.js.map +1 -0
  166. package/dist/core/userkeys/validateUserKeyDocument.d.ts +19 -0
  167. package/dist/core/userkeys/validateUserKeyDocument.d.ts.map +1 -0
  168. package/dist/core/userkeys/validateUserKeyDocument.js +42 -0
  169. package/dist/core/userkeys/validateUserKeyDocument.js.map +1 -0
  170. package/dist/core/utils/idGeneration.d.ts +39 -20
  171. package/dist/core/utils/idGeneration.d.ts.map +1 -1
  172. package/dist/core/utils/idGeneration.js +82 -62
  173. package/dist/core/utils/idGeneration.js.map +1 -1
  174. package/dist/core/utils/index.d.ts +1 -1
  175. package/dist/core/utils/index.d.ts.map +1 -1
  176. package/dist/core/utils/index.js +4 -1
  177. package/dist/core/utils/index.js.map +1 -1
  178. package/dist/node/server/CapabilityMatcher.d.ts +5 -0
  179. package/dist/node/server/CapabilityMatcher.d.ts.map +1 -1
  180. package/dist/node/server/CapabilityMatcher.js +10 -1
  181. package/dist/node/server/CapabilityMatcher.js.map +1 -1
  182. package/dist/node/server/DeviceDiscoveryService.d.ts +36 -0
  183. package/dist/node/server/DeviceDiscoveryService.d.ts.map +1 -0
  184. package/dist/node/server/DeviceDiscoveryService.js +165 -0
  185. package/dist/node/server/DeviceDiscoveryService.js.map +1 -0
  186. package/dist/node/server/MindooDBServer.d.ts +13 -0
  187. package/dist/node/server/MindooDBServer.d.ts.map +1 -1
  188. package/dist/node/server/MindooDBServer.js +99 -61
  189. package/dist/node/server/MindooDBServer.js.map +1 -1
  190. package/dist/node/server/SystemAdminAuth.d.ts +7 -0
  191. package/dist/node/server/SystemAdminAuth.d.ts.map +1 -1
  192. package/dist/node/server/SystemAdminAuth.js +4 -1
  193. package/dist/node/server/SystemAdminAuth.js.map +1 -1
  194. package/dist/node/server/TenantManager.d.ts +29 -0
  195. package/dist/node/server/TenantManager.d.ts.map +1 -1
  196. package/dist/node/server/TenantManager.js +146 -7
  197. package/dist/node/server/TenantManager.js.map +1 -1
  198. package/package.json +5 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipients.js","sourceRoot":"","sources":["../../../src/core/userkeys/recipients.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { MindooDB, MindooDoc, MindooTenantDirectory } from "../types";
2
+ import { type UserKeyDocumentPayload } from "./types";
3
+ export interface ResolveUserKeyDocumentInput {
4
+ db: MindooDB;
5
+ directory: MindooTenantDirectory;
6
+ username: string;
7
+ usernameHashCandidates: string[];
8
+ grantDocIds: string[];
9
+ adminPublicKey?: string;
10
+ }
11
+ export interface ResolvedUserKeyDocument {
12
+ doc: MindooDoc;
13
+ payload: UserKeyDocumentPayload;
14
+ }
15
+ /**
16
+ * §5.1 lookup: canonical `userkey_<grantDocId>` first, then a scan over
17
+ * `username_hash`. Invalid squatters are ignored. Ties break by highest
18
+ * epoch, then lowest fingerprint (byte-deterministic).
19
+ */
20
+ export declare function resolveUserKeyDocument(input: ResolveUserKeyDocumentInput): Promise<ResolvedUserKeyDocument | null>;
21
+ //# sourceMappingURL=resolveUserKeyDocument.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveUserKeyDocument.d.ts","sourceRoot":"","sources":["../../../src/core/userkeys/resolveUserKeyDocument.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAC3E,OAAO,EAAqB,KAAK,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAGzE,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,QAAQ,CAAC;IACb,SAAS,EAAE,qBAAqB,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,SAAS,CAAC;IACf,OAAO,EAAE,sBAAsB,CAAC;CACjC;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAiCzC"}
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveUserKeyDocument = resolveUserKeyDocument;
4
+ const types_1 = require("./types");
5
+ const validateUserKeyDocument_1 = require("./validateUserKeyDocument");
6
+ /**
7
+ * §5.1 lookup: canonical `userkey_<grantDocId>` first, then a scan over
8
+ * `username_hash`. Invalid squatters are ignored. Ties break by highest
9
+ * epoch, then lowest fingerprint (byte-deterministic).
10
+ */
11
+ async function resolveUserKeyDocument(input) {
12
+ const valid = [];
13
+ for (const grantDocId of input.grantDocIds) {
14
+ const canonicalId = (0, types_1.userKeyDocumentId)(grantDocId);
15
+ try {
16
+ const doc = await input.db.getDocument(canonicalId);
17
+ if (doc.isDeleted())
18
+ continue;
19
+ const resolved = await validateLoaded(doc, input);
20
+ if (resolved)
21
+ valid.push(resolved);
22
+ }
23
+ catch {
24
+ // missing or unreadable
25
+ }
26
+ }
27
+ if (valid.length === 0) {
28
+ const ids = await input.db.getAllDocumentIds();
29
+ for (const id of ids) {
30
+ if (valid.some((v) => v.doc.getId() === id))
31
+ continue;
32
+ try {
33
+ const doc = await input.db.getDocument(id);
34
+ if (doc.isDeleted())
35
+ continue;
36
+ const resolved = await validateLoaded(doc, input);
37
+ if (resolved)
38
+ valid.push(resolved);
39
+ }
40
+ catch {
41
+ // skip
42
+ }
43
+ }
44
+ }
45
+ if (valid.length === 0)
46
+ return null;
47
+ valid.sort(compareResolved);
48
+ return valid[0];
49
+ }
50
+ async function validateLoaded(doc, input) {
51
+ const signerKey = await creatorSigningKey(input.db, doc.getId());
52
+ if (!signerKey)
53
+ return null;
54
+ const payload = await (0, validateUserKeyDocument_1.validateUserKeyDocument)({
55
+ payload: doc.getData(),
56
+ signerKey,
57
+ usernameHashCandidates: input.usernameHashCandidates,
58
+ directory: input.directory,
59
+ adminPublicKey: input.adminPublicKey,
60
+ });
61
+ if (!payload)
62
+ return null;
63
+ return { doc, payload };
64
+ }
65
+ async function creatorSigningKey(db, docId) {
66
+ const store = db.getStore();
67
+ const metas = await store.findNewEntriesForDoc([], docId);
68
+ const create = metas.find((m) => m.entryType === "doc_create");
69
+ return create?.createdByPublicKey ?? null;
70
+ }
71
+ function compareResolved(a, b) {
72
+ const epochA = maxEpoch(a.payload);
73
+ const epochB = maxEpoch(b.payload);
74
+ if (epochA !== epochB)
75
+ return epochB > epochA ? 1 : -1;
76
+ const fpA = currentFingerprint(a.payload);
77
+ const fpB = currentFingerprint(b.payload);
78
+ if (fpA !== fpB)
79
+ return fpA < fpB ? -1 : 1;
80
+ return a.doc.getId() < b.doc.getId() ? -1 : 1;
81
+ }
82
+ function maxEpoch(payload) {
83
+ const epochs = Object.keys(payload.userKeys ?? {}).filter((k) => /^\d+$/.test(k));
84
+ if (epochs.length === 0)
85
+ return 0n;
86
+ return epochs.reduce((acc, k) => {
87
+ const n = BigInt(k);
88
+ return n > acc ? n : acc;
89
+ }, 0n);
90
+ }
91
+ function currentFingerprint(payload) {
92
+ const epochs = Object.keys(payload.userKeys ?? {}).filter((k) => /^\d+$/.test(k));
93
+ if (epochs.length === 0)
94
+ return "";
95
+ const current = epochs.reduce((a, b) => (BigInt(a) > BigInt(b) ? a : b));
96
+ return payload.userKeys[current]?.fingerprint ?? "";
97
+ }
98
+ //# sourceMappingURL=resolveUserKeyDocument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveUserKeyDocument.js","sourceRoot":"","sources":["../../../src/core/userkeys/resolveUserKeyDocument.ts"],"names":[],"mappings":";;AAuBA,wDAmCC;AAzDD,mCAAyE;AACzE,uEAAoE;AAgBpE;;;;GAIG;AACI,KAAK,UAAU,sBAAsB,CAC1C,KAAkC;IAElC,MAAM,KAAK,GAA8B,EAAE,CAAC;IAE5C,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,IAAA,yBAAiB,EAAC,UAAU,CAAC,CAAC;QAClD,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YACpD,IAAI,GAAG,CAAC,SAAS,EAAE;gBAAE,SAAS;YAC9B,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAClD,IAAI,QAAQ;gBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAC/C,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;YACrB,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;gBAAE,SAAS;YACtD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;gBAC3C,IAAI,GAAG,CAAC,SAAS,EAAE;oBAAE,SAAS;gBAC9B,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAClD,IAAI,QAAQ;oBAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC5B,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,GAAc,EACd,KAAkC;IAElC,MAAM,SAAS,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAC5B,MAAM,OAAO,GAAG,MAAM,IAAA,iDAAuB,EAAC;QAC5C,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;QACtB,SAAS;QACT,sBAAsB,EAAE,KAAK,CAAC,sBAAsB;QACpD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,cAAc,EAAE,KAAK,CAAC,cAAc;KACrC,CAAC,CAAC;IACH,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,EAAY,EAAE,KAAa;IAC1D,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,YAAY,CAAC,CAAC;IAC/D,OAAO,MAAM,EAAE,kBAAkB,IAAI,IAAI,CAAC;AAC5C,CAAC;AAED,SAAS,eAAe,CAAC,CAA0B,EAAE,CAA0B;IAC7E,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,QAAQ,CAAC,OAA+B;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC3B,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC;AAED,SAAS,kBAAkB,CAAC,OAA+B;IACzD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,WAAW,IAAI,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { CryptoAdapter } from "../crypto/CryptoAdapter";
2
+ import type { EntryRecipients } from "./sealedTypes";
3
+ export declare function encryptAesGcm(crypto: CryptoAdapter, keyBytes: Uint8Array, plaintext: Uint8Array): Promise<Uint8Array>;
4
+ export declare function decryptAesGcm(crypto: CryptoAdapter, keyBytes: Uint8Array, packed: Uint8Array): Promise<Uint8Array>;
5
+ export declare function concatGenerations(generations: Uint8Array[]): Uint8Array;
6
+ export declare function splitGenerations(bytes: Uint8Array): Uint8Array[];
7
+ export declare function sealBundle(input: {
8
+ crypto: CryptoAdapter;
9
+ generations: Uint8Array[];
10
+ wrapsTo: Array<{
11
+ kind: "user" | "device";
12
+ fingerprint: string;
13
+ publicKeyPem: string;
14
+ }>;
15
+ }): Promise<EntryRecipients>;
16
+ export declare function openBundle(input: {
17
+ crypto: CryptoAdapter;
18
+ recipients: EntryRecipients;
19
+ privateKey: CryptoKey;
20
+ }): Promise<Uint8Array[]>;
21
+ //# sourceMappingURL=sealedCrypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sealedCrypto.d.ts","sourceRoot":"","sources":["../../../src/core/userkeys/sealedCrypto.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,UAAU,EACpB,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,UAAU,CAAC,CAerB;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,UAAU,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,UAAU,CAAC,CAarB;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,UAAU,CAIvE;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,EAAE,CAMhE;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxF,GAAG,OAAO,CAAC,eAAe,CAAC,CAkB3B;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,SAAS,CAAC;CACvB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAaxB"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.encryptAesGcm = encryptAesGcm;
4
+ exports.decryptAesGcm = decryptAesGcm;
5
+ exports.concatGenerations = concatGenerations;
6
+ exports.splitGenerations = splitGenerations;
7
+ exports.sealBundle = sealBundle;
8
+ exports.openBundle = openBundle;
9
+ const RSAEncryption_1 = require("../crypto/RSAEncryption");
10
+ const fingerprint_1 = require("./fingerprint");
11
+ async function encryptAesGcm(crypto, keyBytes, plaintext) {
12
+ const subtle = crypto.getSubtle();
13
+ const iv = crypto.getRandomValues(new Uint8Array(12));
14
+ const key = await subtle.importKey("raw", keyBytes.slice(), { name: "AES-GCM" }, false, [
15
+ "encrypt",
16
+ ]);
17
+ const ct = await subtle.encrypt({ name: "AES-GCM", iv: iv.slice(), tagLength: 128 }, key, plaintext.slice());
18
+ const out = new Uint8Array(12 + ct.byteLength);
19
+ out.set(iv, 0);
20
+ out.set(new Uint8Array(ct), 12);
21
+ return out;
22
+ }
23
+ async function decryptAesGcm(crypto, keyBytes, packed) {
24
+ const subtle = crypto.getSubtle();
25
+ const iv = packed.slice(0, 12);
26
+ const ct = packed.slice(12);
27
+ const key = await subtle.importKey("raw", keyBytes.slice(), { name: "AES-GCM" }, false, [
28
+ "decrypt",
29
+ ]);
30
+ const pt = await subtle.decrypt({ name: "AES-GCM", iv: iv, tagLength: 128 }, key, ct);
31
+ return new Uint8Array(pt);
32
+ }
33
+ function concatGenerations(generations) {
34
+ const out = new Uint8Array(generations.length * 32);
35
+ generations.forEach((g, i) => out.set(g, i * 32));
36
+ return out;
37
+ }
38
+ function splitGenerations(bytes) {
39
+ const gens = [];
40
+ for (let i = 0; i + 32 <= bytes.length; i += 32) {
41
+ gens.push(bytes.slice(i, i + 32));
42
+ }
43
+ return gens;
44
+ }
45
+ async function sealBundle(input) {
46
+ const bundleKey = input.crypto.getRandomValues(new Uint8Array(32));
47
+ const bundle = await encryptAesGcm(input.crypto, bundleKey, concatGenerations(input.generations));
48
+ const rsa = new RSAEncryption_1.RSAEncryption(input.crypto);
49
+ const wraps = [];
50
+ for (const target of input.wrapsTo) {
51
+ const wrapped = await rsa.encrypt(bundleKey, target.publicKeyPem);
52
+ wraps.push({
53
+ kind: target.kind,
54
+ keyFingerprint: target.fingerprint,
55
+ wrapped: (0, fingerprint_1.bytesToBase64)(wrapped),
56
+ });
57
+ }
58
+ return {
59
+ epoch: input.generations.length,
60
+ bundle: (0, fingerprint_1.bytesToBase64)(bundle),
61
+ wraps,
62
+ };
63
+ }
64
+ async function openBundle(input) {
65
+ const rsa = new RSAEncryption_1.RSAEncryption(input.crypto);
66
+ let lastError;
67
+ for (const wrap of input.recipients.wraps) {
68
+ try {
69
+ const bundleKey = await rsa.decrypt((0, fingerprint_1.base64ToBytes)(wrap.wrapped), input.privateKey);
70
+ const packed = await decryptAesGcm(input.crypto, bundleKey, (0, fingerprint_1.base64ToBytes)(input.recipients.bundle));
71
+ return splitGenerations(packed).reverse();
72
+ }
73
+ catch (error) {
74
+ lastError = error;
75
+ }
76
+ }
77
+ throw lastError ?? new Error("no recipient wrap opened");
78
+ }
79
+ //# sourceMappingURL=sealedCrypto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sealedCrypto.js","sourceRoot":"","sources":["../../../src/core/userkeys/sealedCrypto.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ export declare const SEALED_KEY_PREFIX = "$sealed:";
2
+ export declare const ENCRYPT_FOR_FIELD = "_encryptFor";
3
+ export declare function sealedKeyId(docId: string): string;
4
+ export declare function isSealedKeyId(keyId: string): boolean;
5
+ export type RecipientSpec = string | {
6
+ user: string;
7
+ } | {
8
+ device: string;
9
+ label?: string;
10
+ } | {
11
+ devicePem: string;
12
+ label: string;
13
+ };
14
+ export interface RecipientOptions {
15
+ includeSelf?: boolean;
16
+ strict?: boolean;
17
+ }
18
+ export interface EncryptForEntry {
19
+ kind: "user" | "device";
20
+ label?: string;
21
+ addedAt: number;
22
+ addedBy: string;
23
+ /** Fingerprint of the public key wrapped to; used for `sealed` on the handle. */
24
+ keyFingerprint?: string;
25
+ /**
26
+ * Legacy field from when recipients could be expanded from a directory group.
27
+ * No longer written. Still read so older documents keep their payload shape.
28
+ */
29
+ viaGroup?: string;
30
+ removedAt?: number;
31
+ removedBy?: string;
32
+ }
33
+ export interface RecipientChangeOptions {
34
+ signingKeyPair?: import("../types").SigningKeyPair;
35
+ signingKeyPassword?: string;
36
+ bypassAccessControlPrecheck?: boolean;
37
+ change?: (doc: import("../types").MindooDoc) => void | Promise<void>;
38
+ strict?: boolean;
39
+ /** When setting the list, also keep the caller (default true). */
40
+ includeSelf?: boolean;
41
+ }
42
+ export interface ResolvedRecipient {
43
+ kind: "user" | "device";
44
+ id: string;
45
+ keyFingerprint: string;
46
+ label?: string;
47
+ addedInEpoch: number;
48
+ sealed: boolean;
49
+ }
50
+ export interface EntryRecipientWrap {
51
+ kind: "user" | "device";
52
+ keyFingerprint: string;
53
+ wrapped: string;
54
+ }
55
+ export interface EntryRecipients {
56
+ epoch: number;
57
+ bundle: string;
58
+ wraps: EntryRecipientWrap[];
59
+ namesEncrypted?: string;
60
+ }
61
+ export interface RecipientChangeResult {
62
+ epoch: number;
63
+ rotated: boolean;
64
+ added: ResolvedRecipient[];
65
+ removed: ResolvedRecipient[];
66
+ skipped: Array<{
67
+ spec: RecipientSpec;
68
+ reason: string;
69
+ }>;
70
+ entryId: string;
71
+ }
72
+ //# sourceMappingURL=sealedTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sealedTypes.d.ts","sourceRoot":"","sources":["../../../src/core/userkeys/sealedTypes.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAC5C,eAAO,MAAM,iBAAiB,gBAAgB,CAAC;AAE/C,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED,MAAM,MAAM,aAAa,GACrB,MAAM,GACN;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzC,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,cAAc,CAAC,EAAE,OAAO,UAAU,EAAE,cAAc,CAAC;IACnD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,2BAA2B,CAAC,EAAE,OAAO,CAAC;IACtC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,UAAU,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,OAAO,EAAE,iBAAiB,EAAE,CAAC;IAC7B,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,aAAa,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACxD,OAAO,EAAE,MAAM,CAAC;CACjB"}
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ENCRYPT_FOR_FIELD = exports.SEALED_KEY_PREFIX = void 0;
4
+ exports.sealedKeyId = sealedKeyId;
5
+ exports.isSealedKeyId = isSealedKeyId;
6
+ exports.SEALED_KEY_PREFIX = "$sealed:";
7
+ exports.ENCRYPT_FOR_FIELD = "_encryptFor";
8
+ function sealedKeyId(docId) {
9
+ return `${exports.SEALED_KEY_PREFIX}${docId}`;
10
+ }
11
+ function isSealedKeyId(keyId) {
12
+ return keyId.startsWith(exports.SEALED_KEY_PREFIX);
13
+ }
14
+ //# sourceMappingURL=sealedTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sealedTypes.js","sourceRoot":"","sources":["../../../src/core/userkeys/sealedTypes.ts"],"names":[],"mappings":";;;AAGA,kCAEC;AAED,sCAEC;AATY,QAAA,iBAAiB,GAAG,UAAU,CAAC;AAC/B,QAAA,iBAAiB,GAAG,aAAa,CAAC;AAE/C,SAAgB,WAAW,CAAC,KAAa;IACvC,OAAO,GAAG,yBAAiB,GAAG,KAAK,EAAE,CAAC;AACxC,CAAC;AAED,SAAgB,aAAa,CAAC,KAAa;IACzC,OAAO,KAAK,CAAC,UAAU,CAAC,yBAAiB,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,70 @@
1
+ export declare const USERKEY_FORM = "userdirectory";
2
+ export declare const USERKEY_TYPE = "userkey";
3
+ export declare const USERKEY_SCHEMA_VERSION = 1;
4
+ export declare const USERKEY_DOC_ID_PREFIX = "userkey_";
5
+ export declare const USERKEY_PRIVATE_SALT = "userkey";
6
+ /** Matches `BaseMindooTenantDirectory.USERNAME_HASH_VERSION` (write version 3). */
7
+ export declare const USERKEY_USERNAME_HASH_VERSION = 3;
8
+ export type UserKeyWaitState = "approved" | "waiting" | "unknown";
9
+ export interface PendingUserKeyDevice {
10
+ fingerprint: string;
11
+ signingPublicKey: string;
12
+ encryptionPublicKey: string;
13
+ label?: string;
14
+ addedAt?: number;
15
+ }
16
+ export type UserKeyDeviceStatus = "approved" | "pending" | "declined";
17
+ export interface UserKeyDeviceRow {
18
+ fingerprint: string;
19
+ signingPublicKey?: string;
20
+ encryptionPublicKey?: string;
21
+ label?: string;
22
+ addedAt?: number;
23
+ status: UserKeyDeviceStatus;
24
+ }
25
+ export interface UserKeyEnrollmentStatus {
26
+ state: UserKeyWaitState;
27
+ /** True while the published document has no person-written wrap. */
28
+ pending: boolean;
29
+ missingKeys: string[];
30
+ }
31
+ export declare function userKeyDocumentId(grantDocId: string): string;
32
+ export interface UserKeyDeviceWrap {
33
+ wrappedKey: string;
34
+ label?: string;
35
+ approvedAt: number;
36
+ approvedBySigningPublicKey: string;
37
+ }
38
+ export interface UserKeyGeneration {
39
+ publicKey: string;
40
+ fingerprint: string;
41
+ createdAt: number;
42
+ retiredAt?: number;
43
+ deviceWraps: Record<string, UserKeyDeviceWrap>;
44
+ }
45
+ export interface RejectedUserKeyDevice {
46
+ signingPublicKey?: string;
47
+ rejectedAt: number;
48
+ rejectedBySigningPublicKey: string;
49
+ }
50
+ export interface UserKeyDocumentPayload {
51
+ form: typeof USERKEY_FORM;
52
+ type: typeof USERKEY_TYPE;
53
+ schemaVersion: number;
54
+ username_hash: string;
55
+ username_hash_v: number;
56
+ userKeys: Record<string, UserKeyGeneration>;
57
+ rejectedDevices?: Record<string, RejectedUserKeyDevice>;
58
+ }
59
+ export declare function currentUserKeyEpoch(payload: UserKeyDocumentPayload): string | null;
60
+ export declare function isPendingUserKeyDocument(payload: UserKeyDocumentPayload): boolean;
61
+ export declare class UserKeyMismatchError extends Error {
62
+ readonly name = "UserKeyMismatchError";
63
+ constructor(message?: string);
64
+ }
65
+ /** Identity already has a User-Key that this session cannot open. */
66
+ export declare class UserKeyDecryptError extends Error {
67
+ readonly name = "UserKeyDecryptError";
68
+ constructor(message?: string);
69
+ }
70
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/userkeys/types.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,YAAY,kBAAkB,CAAC;AAC5C,eAAO,MAAM,YAAY,YAAY,CAAC;AACtC,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,qBAAqB,aAAa,CAAC;AAChD,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAC9C,mFAAmF;AACnF,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,CAAC;AAElE,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,mBAAmB,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;AAEtE,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,mBAAmB,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,EAAE,gBAAgB,CAAC;IACxB,oEAAoE;IACpE,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAK5D;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,0BAA0B,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,OAAO,YAAY,CAAC;IAC1B,IAAI,EAAE,OAAO,YAAY,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAC5C,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CACzD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,sBAAsB,GAAG,MAAM,GAAG,IAAI,CAIlF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAIjF;AAED,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,IAAI,0BAA0B;gBAErC,OAAO,SAA2E;CAIrF;AAED,qEAAqE;AACrE,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,yBAAyB;gBAEpC,OAAO,SAAiK;CAI3K"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UserKeyDecryptError = exports.UserKeyMismatchError = exports.USERKEY_USERNAME_HASH_VERSION = exports.USERKEY_PRIVATE_SALT = exports.USERKEY_DOC_ID_PREFIX = exports.USERKEY_SCHEMA_VERSION = exports.USERKEY_TYPE = exports.USERKEY_FORM = void 0;
4
+ exports.userKeyDocumentId = userKeyDocumentId;
5
+ exports.currentUserKeyEpoch = currentUserKeyEpoch;
6
+ exports.isPendingUserKeyDocument = isPendingUserKeyDocument;
7
+ const types_1 = require("../accesscontrol/types");
8
+ exports.USERKEY_FORM = "userdirectory";
9
+ exports.USERKEY_TYPE = "userkey";
10
+ exports.USERKEY_SCHEMA_VERSION = 1;
11
+ exports.USERKEY_DOC_ID_PREFIX = "userkey_";
12
+ exports.USERKEY_PRIVATE_SALT = "userkey";
13
+ /** Matches `BaseMindooTenantDirectory.USERNAME_HASH_VERSION` (write version 3). */
14
+ exports.USERKEY_USERNAME_HASH_VERSION = 3;
15
+ function userKeyDocumentId(grantDocId) {
16
+ // Grant ids used to be mixed-case (e.g. `033p0Fh2PNGwn0yTqWp7UE`). Custom
17
+ // document ids may only be `^[a-z][a-z0-9_]*$`. Encode like ACL ids so
18
+ // MongoDB hex object ids pass through unchanged and legacy ids stay valid.
19
+ return `${exports.USERKEY_DOC_ID_PREFIX}${(0, types_1.encodeAclIdComponent)(grantDocId)}`;
20
+ }
21
+ function currentUserKeyEpoch(payload) {
22
+ const epochs = Object.keys(payload.userKeys ?? {}).filter((k) => /^\d+$/.test(k));
23
+ if (epochs.length === 0)
24
+ return null;
25
+ return epochs.reduce((a, b) => (BigInt(a) > BigInt(b) ? a : b));
26
+ }
27
+ function isPendingUserKeyDocument(payload) {
28
+ const epochs = Object.values(payload.userKeys ?? {});
29
+ if (epochs.length === 0)
30
+ return true;
31
+ return epochs.every((gen) => Object.keys(gen.deviceWraps ?? {}).length === 0);
32
+ }
33
+ class UserKeyMismatchError extends Error {
34
+ constructor(message = "Published user public key does not match the key this device generated") {
35
+ super(message);
36
+ this.name = "UserKeyMismatchError";
37
+ }
38
+ }
39
+ exports.UserKeyMismatchError = UserKeyMismatchError;
40
+ /** Identity already has a User-Key that this session cannot open. */
41
+ class UserKeyDecryptError extends Error {
42
+ constructor(message = "Local User-Key exists but cannot be decrypted with the current password. Refusing to generate a second pair (that would desync acl_keydistribution_default).") {
43
+ super(message);
44
+ this.name = "UserKeyDecryptError";
45
+ }
46
+ }
47
+ exports.UserKeyDecryptError = UserKeyDecryptError;
48
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/userkeys/types.ts"],"names":[],"mappings":";;;AAsCA,8CAKC;AAiCD,kDAIC;AAED,4DAIC;AAtFD,kDAA8D;AAEjD,QAAA,YAAY,GAAG,eAAe,CAAC;AAC/B,QAAA,YAAY,GAAG,SAAS,CAAC;AACzB,QAAA,sBAAsB,GAAG,CAAC,CAAC;AAC3B,QAAA,qBAAqB,GAAG,UAAU,CAAC;AACnC,QAAA,oBAAoB,GAAG,SAAS,CAAC;AAC9C,mFAAmF;AACtE,QAAA,6BAA6B,GAAG,CAAC,CAAC;AA8B/C,SAAgB,iBAAiB,CAAC,UAAkB;IAClD,0EAA0E;IAC1E,uEAAuE;IACvE,2EAA2E;IAC3E,OAAO,GAAG,6BAAqB,GAAG,IAAA,4BAAoB,EAAC,UAAU,CAAC,EAAE,CAAC;AACvE,CAAC;AAiCD,SAAgB,mBAAmB,CAAC,OAA+B;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAgB,wBAAwB,CAAC,OAA+B;IACtE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAa,oBAAqB,SAAQ,KAAK;IAE7C,YACE,OAAO,GAAG,wEAAwE;QAElF,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,SAAI,GAAG,sBAAsB,CAAC;IAKvC,CAAC;CACF;AAPD,oDAOC;AAED,qEAAqE;AACrE,MAAa,mBAAoB,SAAQ,KAAK;IAE5C,YACE,OAAO,GAAG,8JAA8J;QAExK,KAAK,CAAC,OAAO,CAAC,CAAC;QAJR,SAAI,GAAG,qBAAqB,CAAC;IAKtC,CAAC;CACF;AAPD,kDAOC"}
@@ -0,0 +1,19 @@
1
+ import type { MindooTenantDirectory } from "../types";
2
+ import { type UserKeyDocumentPayload } from "./types";
3
+ export interface ValidateUserKeyInput {
4
+ payload: unknown;
5
+ /** Signing public key of the `doc_create` entry (or of the change being judged). */
6
+ signerKey: string;
7
+ usernameHashCandidates: string[];
8
+ directory: MindooTenantDirectory;
9
+ /** Admin create of a pending document is valid even though the signer is not the person. */
10
+ adminPublicKey?: string;
11
+ trustedTime?: number;
12
+ }
13
+ /**
14
+ * §6.4 binding: the payload has the userkey shape, `username_hash` matches
15
+ * the person, and the create signer is either that person or the tenant admin.
16
+ */
17
+ export declare function validateUserKeyDocument(input: ValidateUserKeyInput): Promise<UserKeyDocumentPayload | null>;
18
+ export declare function asUserKeyPayload(payload: unknown): UserKeyDocumentPayload | null;
19
+ //# sourceMappingURL=validateUserKeyDocument.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateUserKeyDocument.d.ts","sourceRoot":"","sources":["../../../src/core/userkeys/validateUserKeyDocument.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAGL,KAAK,sBAAsB,EAC5B,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,oFAAoF;IACpF,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,SAAS,EAAE,qBAAqB,CAAC;IACjC,4FAA4F;IAC5F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAoBxC;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI,CAShF"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateUserKeyDocument = validateUserKeyDocument;
4
+ exports.asUserKeyPayload = asUserKeyPayload;
5
+ const types_1 = require("./types");
6
+ /**
7
+ * §6.4 binding: the payload has the userkey shape, `username_hash` matches
8
+ * the person, and the create signer is either that person or the tenant admin.
9
+ */
10
+ async function validateUserKeyDocument(input) {
11
+ const payload = asUserKeyPayload(input.payload);
12
+ if (!payload)
13
+ return null;
14
+ if (!input.usernameHashCandidates.includes(payload.username_hash)) {
15
+ return null;
16
+ }
17
+ if (input.adminPublicKey && input.signerKey === input.adminPublicKey) {
18
+ return payload;
19
+ }
20
+ if (typeof input.directory.resolveUsernameHashForSigningKey !== "function") {
21
+ return null;
22
+ }
23
+ const signerHash = await input.directory.resolveUsernameHashForSigningKey(input.signerKey, input.trustedTime ?? Number.MAX_SAFE_INTEGER);
24
+ if (!signerHash || signerHash !== payload.username_hash) {
25
+ return null;
26
+ }
27
+ return payload;
28
+ }
29
+ function asUserKeyPayload(payload) {
30
+ if (!payload || typeof payload !== "object")
31
+ return null;
32
+ const data = payload;
33
+ if (data.form !== types_1.USERKEY_FORM || data.type !== types_1.USERKEY_TYPE)
34
+ return null;
35
+ if (typeof data.username_hash !== "string" || data.username_hash.length === 0) {
36
+ return null;
37
+ }
38
+ if (!data.userKeys || typeof data.userKeys !== "object")
39
+ return null;
40
+ return data;
41
+ }
42
+ //# sourceMappingURL=validateUserKeyDocument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateUserKeyDocument.js","sourceRoot":"","sources":["../../../src/core/userkeys/validateUserKeyDocument.ts"],"names":[],"mappings":";;AAsBA,0DAsBC;AAED,4CASC;AAtDD,mCAIiB;AAajB;;;GAGG;AACI,KAAK,UAAU,uBAAuB,CAC3C,KAA2B;IAE3B,MAAM,OAAO,GAAG,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,cAAc,EAAE,CAAC;QACrE,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,SAAS,CAAC,gCAAgC,KAAK,UAAU,EAAE,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,gCAAgC,CACvE,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,WAAW,IAAI,MAAM,CAAC,gBAAgB,CAC7C,CAAC;IACF,IAAI,CAAC,UAAU,IAAI,UAAU,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,IAAI,GAAG,OAAkC,CAAC;IAChD,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAY,IAAI,IAAI,CAAC,IAAI,KAAK,oBAAY;QAAE,OAAO,IAAI,CAAC;IAC1E,IAAI,OAAO,IAAI,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9E,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACrE,OAAO,IAAyC,CAAC;AACnD,CAAC"}