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,235 @@
1
+ "use strict";
2
+ /**
3
+ * Notes/Domino-style username canonicalization. Keep in lockstep with Haven
4
+ * `src/shared/lib/names/canonicalNames.ts` so `_encryptFor` keys, recipient
5
+ * matching, and UI name fields use one algorithm.
6
+ *
7
+ * Comparison (`normalizeCanonicalNameForComparison` / {@link usernamesEqual})
8
+ * abbreviates typed segments then lowercases, so `cn=Alice/o=Acme`,
9
+ * `CN=alice/O=acme`, and `Alice/Acme` are the same person.
10
+ *
11
+ * Persist keys ({@link canonicalizeUsername}) expand abbreviated names the same
12
+ * way Haven does (`cn=` first, `ou=` middle, `o=` last), then uppercase types
13
+ * and lowercase NFKC-normalized values. The result must include `O=`; the
14
+ * tenant id is a random string and must not be substituted for the organization.
15
+ *
16
+ * Display / `_encryptFor.label` ({@link formatCanonicalUsernameLabel}) uses the
17
+ * same expand, but lowercase types and the original value case so UI chips can
18
+ * abbreviate to `Maya Chen/Acme` instead of the persist key `maya chen/acme`.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.abbreviateCanonicalName = abbreviateCanonicalName;
22
+ exports.expandAbbreviatedName = expandAbbreviatedName;
23
+ exports.sanitizeCanonicalNamePart = sanitizeCanonicalNamePart;
24
+ exports.buildCanonicalName = buildCanonicalName;
25
+ exports.parseCanonicalName = parseCanonicalName;
26
+ exports.isCanonicalName = isCanonicalName;
27
+ exports.formatCanonicalDisplayName = formatCanonicalDisplayName;
28
+ exports.normalizeCanonicalNameForComparison = normalizeCanonicalNameForComparison;
29
+ exports.getCanonicalNameVariants = getCanonicalNameVariants;
30
+ exports.canonicalizeUsername = canonicalizeUsername;
31
+ exports.formatCanonicalUsernameLabel = formatCanonicalUsernameLabel;
32
+ exports.usernamesEqual = usernamesEqual;
33
+ const CANONICAL_PART_PATTERN = /^\s*([^=]+)\s*=\s*(.*?)\s*$/;
34
+ function splitNameParts(value) {
35
+ return value
36
+ .split("/")
37
+ .map((part) => part.trim())
38
+ .filter(Boolean);
39
+ }
40
+ function abbreviateCanonicalName(value) {
41
+ const parts = splitNameParts(value);
42
+ if (!parts.length) {
43
+ return value.trim();
44
+ }
45
+ const abbreviatedParts = [];
46
+ for (const part of parts) {
47
+ const match = CANONICAL_PART_PATTERN.exec(part);
48
+ if (!match) {
49
+ return value.trim();
50
+ }
51
+ const partValue = match[2].trim();
52
+ if (!partValue) {
53
+ return value.trim();
54
+ }
55
+ abbreviatedParts.push(partValue);
56
+ }
57
+ return abbreviatedParts.join("/");
58
+ }
59
+ function expandAbbreviatedName(value) {
60
+ const normalized = value.trim();
61
+ if (isCanonicalName(normalized)) {
62
+ return normalized;
63
+ }
64
+ const parts = splitNameParts(normalized);
65
+ if (parts.length < 2) {
66
+ return normalized;
67
+ }
68
+ const lastIndex = parts.length - 1;
69
+ return parts
70
+ .map((part, index) => {
71
+ // Leave segments that already carry an explicit key (e.g. "o=myorg") untouched,
72
+ // so mixed input like "test/o=myorg" does not become "cn=test/o=o=myorg".
73
+ if (CANONICAL_PART_PATTERN.test(part)) {
74
+ return part;
75
+ }
76
+ if (index === 0) {
77
+ return `cn=${part}`;
78
+ }
79
+ if (index === lastIndex) {
80
+ return `o=${part}`;
81
+ }
82
+ return `ou=${part}`;
83
+ })
84
+ .join("/");
85
+ }
86
+ /**
87
+ * Strip characters that would break the canonical name structure: `/` separates
88
+ * the segments and `=` separates a segment's key from its value, so neither may
89
+ * appear inside a single field's value.
90
+ */
91
+ function sanitizeCanonicalNamePart(value) {
92
+ return (value ?? "").replace(/[/=]/g, "");
93
+ }
94
+ /**
95
+ * Build a canonical Notes-style name from separate fields, e.g.
96
+ * `{ cn: "Jane Doe", o: "Acme" }` becomes `cn=Jane Doe/o=Acme`.
97
+ *
98
+ * Empty parts are omitted and structure-breaking characters (`/`, `=`) are
99
+ * stripped, so the result is always a valid canonical name. When the common
100
+ * name is missing an empty string is returned, which lets callers treat
101
+ * "no name yet" as an empty preview.
102
+ */
103
+ function buildCanonicalName(parts) {
104
+ const cn = sanitizeCanonicalNamePart(parts.cn).trim();
105
+ const ou = sanitizeCanonicalNamePart(parts.ou).trim();
106
+ const o = sanitizeCanonicalNamePart(parts.o).trim();
107
+ if (!cn) {
108
+ return "";
109
+ }
110
+ const segments = [`cn=${cn}`];
111
+ if (ou) {
112
+ segments.push(`ou=${ou}`);
113
+ }
114
+ if (o) {
115
+ segments.push(`o=${o}`);
116
+ }
117
+ return segments.join("/");
118
+ }
119
+ /**
120
+ * Split a canonical (or abbreviated) name back into `cn`/`ou`/`o` fields so the
121
+ * structured identity inputs can be pre-filled from an existing username.
122
+ *
123
+ * Only the first `cn` and `o` are used; multiple `ou` segments are joined with
124
+ * `/` to avoid data loss even though the wizard currently edits a single level.
125
+ */
126
+ function parseCanonicalName(value) {
127
+ const result = { cn: "", ou: "", o: "" };
128
+ const canonical = isCanonicalName(value) ? value : expandAbbreviatedName(value?.trim() ?? "");
129
+ const organizationUnits = [];
130
+ for (const part of splitNameParts(canonical)) {
131
+ const match = CANONICAL_PART_PATTERN.exec(part);
132
+ if (!match) {
133
+ continue;
134
+ }
135
+ const key = match[1].trim().toLowerCase();
136
+ const partValue = match[2].trim();
137
+ if (!partValue) {
138
+ continue;
139
+ }
140
+ if (key === "cn" && !result.cn) {
141
+ result.cn = partValue;
142
+ }
143
+ else if (key === "o" && !result.o) {
144
+ result.o = partValue;
145
+ }
146
+ else if (key === "ou") {
147
+ organizationUnits.push(partValue);
148
+ }
149
+ }
150
+ result.ou = organizationUnits.join("/");
151
+ return result;
152
+ }
153
+ function isCanonicalName(value) {
154
+ const parts = splitNameParts(value?.trim() ?? "");
155
+ if (!parts.length) {
156
+ return false;
157
+ }
158
+ return parts.every((part) => {
159
+ const match = CANONICAL_PART_PATTERN.exec(part);
160
+ return Boolean(match?.[1]?.trim() && match[2]?.trim());
161
+ });
162
+ }
163
+ function formatCanonicalDisplayName(value, fallback = "") {
164
+ if (!value) {
165
+ return fallback;
166
+ }
167
+ const abbreviated = abbreviateCanonicalName(value);
168
+ return abbreviated || fallback;
169
+ }
170
+ function normalizeCanonicalNameForComparison(value) {
171
+ const normalized = value?.trim();
172
+ if (!normalized) {
173
+ return "";
174
+ }
175
+ return abbreviateCanonicalName(normalized).trim().toLowerCase();
176
+ }
177
+ function getCanonicalNameVariants(value) {
178
+ const normalized = value?.trim();
179
+ if (!normalized) {
180
+ return [];
181
+ }
182
+ const abbreviated = abbreviateCanonicalName(normalized);
183
+ const commonName = abbreviated.split("/")[0]?.trim() || abbreviated;
184
+ return Array.from(new Set([normalized, abbreviated, commonName].filter(Boolean)));
185
+ }
186
+ function parseExpandedRdns(username, typeCase, valueCase) {
187
+ const trimmed = username.trim().normalize("NFKC");
188
+ if (!trimmed) {
189
+ throw new Error("Username must not be empty");
190
+ }
191
+ const expanded = expandAbbreviatedName(trimmed);
192
+ const rdns = [];
193
+ for (const part of splitNameParts(expanded)) {
194
+ const match = CANONICAL_PART_PATTERN.exec(part);
195
+ if (!match?.[1]?.trim() || !match[2]?.trim()) {
196
+ throw new Error(`Username must include an organization (O=...): got "${username.trim()}"`);
197
+ }
198
+ const type = match[1].trim();
199
+ const value = match[2].trim();
200
+ rdns.push({
201
+ type: typeCase === "upper" ? type.toUpperCase() : type.toLowerCase(),
202
+ value: valueCase === "lower" ? value.toLowerCase() : value,
203
+ });
204
+ }
205
+ const orgType = typeCase === "upper" ? "O" : "o";
206
+ if (!rdns.some((rdn) => rdn.type === orgType && rdn.value)) {
207
+ throw new Error(`Username must include an organization (O=...): got "${username.trim()}"`);
208
+ }
209
+ return rdns;
210
+ }
211
+ /**
212
+ * Stable `_encryptFor` map key: Haven expand, then uppercase types and
213
+ * lowercase NFKC values. Throws if the name has no organization after expand.
214
+ */
215
+ function canonicalizeUsername(username) {
216
+ return parseExpandedRdns(username, "upper", "lower")
217
+ .map((rdn) => `${rdn.type}=${rdn.value}`)
218
+ .join("/");
219
+ }
220
+ /**
221
+ * Display spelling for `_encryptFor.label` and similar UI fields: Haven expand,
222
+ * lowercase attribute types, keep value case. Persist map keys stay on
223
+ * {@link canonicalizeUsername}.
224
+ */
225
+ function formatCanonicalUsernameLabel(username) {
226
+ return parseExpandedRdns(username, "lower", "preserve")
227
+ .map((rdn) => `${rdn.type}=${rdn.value}`)
228
+ .join("/");
229
+ }
230
+ function usernamesEqual(a, b) {
231
+ const left = normalizeCanonicalNameForComparison(a.normalize("NFKC"));
232
+ const right = normalizeCanonicalNameForComparison(b.normalize("NFKC"));
233
+ return left.length > 0 && left === right;
234
+ }
235
+ //# sourceMappingURL=canonicalUsername.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonicalUsername.js","sourceRoot":"","sources":["../../../src/core/userid/canonicalUsername.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,6 @@
1
1
  import { SigningKeyPair, EncryptionKeyPair } from "../types";
2
+ export { abbreviateCanonicalName, buildCanonicalName, canonicalizeUsername, expandAbbreviatedName, formatCanonicalDisplayName, formatCanonicalUsernameLabel, getCanonicalNameVariants, isCanonicalName, normalizeCanonicalNameForComparison, parseCanonicalName, sanitizeCanonicalNamePart, usernamesEqual, } from "./canonicalUsername";
3
+ export type { CanonicalNameParts } from "./canonicalUsername";
2
4
  /**
3
5
  * Public info for a user of the platform
4
6
  */
@@ -39,5 +41,12 @@ export interface PrivateUserId {
39
41
  * Used ONLY for encrypting/decrypting the named symmetric keys map stored on disk, not for signing.
40
42
  */
41
43
  userEncryptionKeyPair: EncryptionKeyPair;
44
+ /**
45
+ * Person-bound RSA-OAEP User-Key (docs/userkeys.md). Password-encrypted with
46
+ * salt `"userkey"`, same wrapping as the device encryption key. Optional on
47
+ * identities created before User-Keys existed; generated before a join
48
+ * request and included in paper backups of this object.
49
+ */
50
+ userKeyPair?: EncryptionKeyPair;
42
51
  }
43
52
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/userid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,kBAAkB,EAAE,cAAc,CAAC;IAEnC;;;;OAIG;IACH,qBAAqB,EAAE,iBAAiB,CAAC;CAC1C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/userid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7D,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,oBAAoB,EACpB,qBAAqB,EACrB,0BAA0B,EAC1B,4BAA4B,EAC5B,wBAAwB,EACxB,eAAe,EACf,mCAAmC,EACnC,kBAAkB,EAClB,yBAAyB,EACzB,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,kBAAkB,EAAE,cAAc,CAAC;IAEnC;;;;OAIG;IACH,qBAAqB,EAAE,iBAAiB,CAAC;IAEzC;;;;;OAKG;IACH,WAAW,CAAC,EAAE,iBAAiB,CAAC;CACjC"}
@@ -1,3 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.usernamesEqual = exports.sanitizeCanonicalNamePart = exports.parseCanonicalName = exports.normalizeCanonicalNameForComparison = exports.isCanonicalName = exports.getCanonicalNameVariants = exports.formatCanonicalUsernameLabel = exports.formatCanonicalDisplayName = exports.expandAbbreviatedName = exports.canonicalizeUsername = exports.buildCanonicalName = exports.abbreviateCanonicalName = void 0;
4
+ var canonicalUsername_1 = require("./canonicalUsername");
5
+ Object.defineProperty(exports, "abbreviateCanonicalName", { enumerable: true, get: function () { return canonicalUsername_1.abbreviateCanonicalName; } });
6
+ Object.defineProperty(exports, "buildCanonicalName", { enumerable: true, get: function () { return canonicalUsername_1.buildCanonicalName; } });
7
+ Object.defineProperty(exports, "canonicalizeUsername", { enumerable: true, get: function () { return canonicalUsername_1.canonicalizeUsername; } });
8
+ Object.defineProperty(exports, "expandAbbreviatedName", { enumerable: true, get: function () { return canonicalUsername_1.expandAbbreviatedName; } });
9
+ Object.defineProperty(exports, "formatCanonicalDisplayName", { enumerable: true, get: function () { return canonicalUsername_1.formatCanonicalDisplayName; } });
10
+ Object.defineProperty(exports, "formatCanonicalUsernameLabel", { enumerable: true, get: function () { return canonicalUsername_1.formatCanonicalUsernameLabel; } });
11
+ Object.defineProperty(exports, "getCanonicalNameVariants", { enumerable: true, get: function () { return canonicalUsername_1.getCanonicalNameVariants; } });
12
+ Object.defineProperty(exports, "isCanonicalName", { enumerable: true, get: function () { return canonicalUsername_1.isCanonicalName; } });
13
+ Object.defineProperty(exports, "normalizeCanonicalNameForComparison", { enumerable: true, get: function () { return canonicalUsername_1.normalizeCanonicalNameForComparison; } });
14
+ Object.defineProperty(exports, "parseCanonicalName", { enumerable: true, get: function () { return canonicalUsername_1.parseCanonicalName; } });
15
+ Object.defineProperty(exports, "sanitizeCanonicalNamePart", { enumerable: true, get: function () { return canonicalUsername_1.sanitizeCanonicalNamePart; } });
16
+ Object.defineProperty(exports, "usernamesEqual", { enumerable: true, get: function () { return canonicalUsername_1.usernamesEqual; } });
3
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/userid/index.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/userid/index.ts"],"names":[],"mappings":";;;AAEA,yDAa6B;AAZ3B,4HAAA,uBAAuB,OAAA;AACvB,uHAAA,kBAAkB,OAAA;AAClB,yHAAA,oBAAoB,OAAA;AACpB,0HAAA,qBAAqB,OAAA;AACrB,+HAAA,0BAA0B,OAAA;AAC1B,iIAAA,4BAA4B,OAAA;AAC5B,6HAAA,wBAAwB,OAAA;AACxB,oHAAA,eAAe,OAAA;AACf,wIAAA,mCAAmC,OAAA;AACnC,uHAAA,kBAAkB,OAAA;AAClB,8HAAA,yBAAyB,OAAA;AACzB,mHAAA,cAAc,OAAA"}
@@ -0,0 +1,50 @@
1
+ import type { EncryptedPrivateKey, MindooDB, MindooDoc, SigningKeyPair } from "../types";
2
+ import type { CryptoAdapter } from "../crypto/CryptoAdapter";
3
+ import { currentUserKeyEpoch, isPendingUserKeyDocument, userKeyDocumentId, type UserKeyDeviceWrap, type UserKeyDocumentPayload, type UserKeyGeneration } from "./types";
4
+ export { isPendingUserKeyDocument, currentUserKeyEpoch, userKeyDocumentId };
5
+ /** Copy `username_hash` / `username_hash_v` from a grantaccess document (docs/userkeys.md §6.1). */
6
+ export declare function usernameHashBindingFromGrant(data: Record<string, unknown>): {
7
+ usernameHash: string;
8
+ usernameHashVersion: number;
9
+ } | null;
10
+ export declare function buildPendingUserKeyPayload(input: {
11
+ usernameHash: string;
12
+ usernameHashVersion: number;
13
+ publicKey: string;
14
+ fingerprint: string;
15
+ createdAt: number;
16
+ }): UserKeyDocumentPayload;
17
+ export declare function createPendingUserKeyDocument(input: {
18
+ db: MindooDB;
19
+ grantDocId: string;
20
+ usernameHash: string;
21
+ usernameHashVersion: number;
22
+ publicKey: string;
23
+ fingerprint: string;
24
+ signingKeyPair?: SigningKeyPair;
25
+ signingKeyPassword?: string;
26
+ assumeUniqueId?: boolean;
27
+ }): Promise<MindooDoc>;
28
+ export declare function wrapPrivateKeyForDevice(input: {
29
+ cryptoAdapter: CryptoAdapter;
30
+ privateKeyBytes: Uint8Array;
31
+ deviceEncryptionPublicKey: string;
32
+ }): Promise<string>;
33
+ export declare function writeDeviceWrap(input: {
34
+ db: MindooDB;
35
+ doc: MindooDoc;
36
+ epoch: string;
37
+ deviceFingerprint: string;
38
+ wrap: UserKeyDeviceWrap;
39
+ }): Promise<void>;
40
+ export declare function replaceUserKeys(db: MindooDB, doc: MindooDoc, userKeys: UserKeyDocumentPayload["userKeys"]): Promise<void>;
41
+ export declare function replaceRejectedDevices(db: MindooDB, doc: MindooDoc, rejectedDevices: UserKeyDocumentPayload["rejectedDevices"]): Promise<void>;
42
+ export declare function fingerprintUserPublicKey(publicKeyPem: string, cryptoAdapter: CryptoAdapter): Promise<string>;
43
+ export declare function unwrapPrivateKeyFromDevice(input: {
44
+ cryptoAdapter: CryptoAdapter;
45
+ wrappedKeyB64: string;
46
+ deviceEncryptionPrivateKey: CryptoKey;
47
+ }): Promise<Uint8Array>;
48
+ export declare function generationAt(payload: UserKeyDocumentPayload, epoch: string): UserKeyGeneration | undefined;
49
+ export type { EncryptedPrivateKey };
50
+ //# sourceMappingURL=UserKeyDocument.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserKeyDocument.d.ts","sourceRoot":"","sources":["../../../src/core/userkeys/UserKeyDocument.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAGzF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAIL,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,EACjB,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,CAAC;AAE5E,oGAAoG;AACpG,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,GAAG,IAAI,CAQP;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,sBAAsB,CAgBzB;AAwBD,wBAAsB,4BAA4B,CAAC,KAAK,EAAE;IACxD,EAAE,EAAE,QAAQ,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,SAAS,CAAC,CA6BrB;AAED,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,UAAU,CAAC;IAC5B,yBAAyB,EAAE,MAAM,CAAC;CACnC,GAAG,OAAO,CAAC,MAAM,CAAC,CAIlB;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAC3C,EAAE,EAAE,QAAQ,CAAC;IACb,GAAG,EAAE,SAAS,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,iBAAiB,CAAC;CACzB,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BhB;AAED,wBAAsB,eAAe,CACnC,EAAE,EAAE,QAAQ,EACZ,GAAG,EAAE,SAAS,EACd,QAAQ,EAAE,sBAAsB,CAAC,UAAU,CAAC,GAC3C,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,QAAQ,EACZ,GAAG,EAAE,SAAS,EACd,eAAe,EAAE,sBAAsB,CAAC,iBAAiB,CAAC,GACzD,OAAO,CAAC,IAAI,CAAC,CAEf;AAED,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,wBAAsB,0BAA0B,CAAC,KAAK,EAAE;IACtD,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,0BAA0B,EAAE,SAAS,CAAC;CACvC,GAAG,OAAO,CAAC,UAAU,CAAC,CAGtB;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,sBAAsB,EAC/B,KAAK,EAAE,MAAM,GACZ,iBAAiB,GAAG,SAAS,CAE/B;AAED,YAAY,EAAE,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.userKeyDocumentId = exports.currentUserKeyEpoch = exports.isPendingUserKeyDocument = void 0;
4
+ exports.usernameHashBindingFromGrant = usernameHashBindingFromGrant;
5
+ exports.buildPendingUserKeyPayload = buildPendingUserKeyPayload;
6
+ exports.createPendingUserKeyDocument = createPendingUserKeyDocument;
7
+ exports.wrapPrivateKeyForDevice = wrapPrivateKeyForDevice;
8
+ exports.writeDeviceWrap = writeDeviceWrap;
9
+ exports.replaceUserKeys = replaceUserKeys;
10
+ exports.replaceRejectedDevices = replaceRejectedDevices;
11
+ exports.fingerprintUserPublicKey = fingerprintUserPublicKey;
12
+ exports.unwrapPrivateKeyFromDevice = unwrapPrivateKeyFromDevice;
13
+ exports.generationAt = generationAt;
14
+ const types_1 = require("../types");
15
+ const RSAEncryption_1 = require("../crypto/RSAEncryption");
16
+ const types_2 = require("./types");
17
+ Object.defineProperty(exports, "currentUserKeyEpoch", { enumerable: true, get: function () { return types_2.currentUserKeyEpoch; } });
18
+ Object.defineProperty(exports, "isPendingUserKeyDocument", { enumerable: true, get: function () { return types_2.isPendingUserKeyDocument; } });
19
+ Object.defineProperty(exports, "userKeyDocumentId", { enumerable: true, get: function () { return types_2.userKeyDocumentId; } });
20
+ const fingerprint_1 = require("./fingerprint");
21
+ /** Copy `username_hash` / `username_hash_v` from a grantaccess document (docs/userkeys.md §6.1). */
22
+ function usernameHashBindingFromGrant(data) {
23
+ const usernameHash = typeof data.username_hash === "string" ? data.username_hash : "";
24
+ if (!usernameHash)
25
+ return null;
26
+ const version = data.username_hash_v;
27
+ return {
28
+ usernameHash,
29
+ usernameHashVersion: typeof version === "number" && Number.isInteger(version) ? version : 1,
30
+ };
31
+ }
32
+ function buildPendingUserKeyPayload(input) {
33
+ return {
34
+ form: types_2.USERKEY_FORM,
35
+ type: types_2.USERKEY_TYPE,
36
+ schemaVersion: types_2.USERKEY_SCHEMA_VERSION,
37
+ username_hash: input.usernameHash,
38
+ username_hash_v: input.usernameHashVersion,
39
+ userKeys: {
40
+ "1": {
41
+ publicKey: input.publicKey,
42
+ fingerprint: input.fingerprint,
43
+ createdAt: input.createdAt,
44
+ deviceWraps: {},
45
+ },
46
+ },
47
+ };
48
+ }
49
+ /** Drop `undefined` so Automerge does not throw `RangeError: invalid value`. */
50
+ function plainJson(value) {
51
+ return JSON.parse(JSON.stringify(value));
52
+ }
53
+ /**
54
+ * Nested `applyJsonPatch` hydrates objects through Automerge's
55
+ * `putObjectFromHydrate`, which throws `RangeError: invalid value` on this
56
+ * document shape. `changeDoc` assigns a top-level field inside `Automerge.change`,
57
+ * which is the same path `createDocument` already uses successfully.
58
+ */
59
+ async function replaceTopLevelField(db, doc, field, value) {
60
+ await db.changeDoc(doc, (editable) => {
61
+ editable.getData()[field] = plainJson(value);
62
+ });
63
+ }
64
+ async function createPendingUserKeyDocument(input) {
65
+ const payload = buildPendingUserKeyPayload({
66
+ usernameHash: input.usernameHash,
67
+ usernameHashVersion: input.usernameHashVersion,
68
+ publicKey: input.publicKey,
69
+ fingerprint: input.fingerprint,
70
+ createdAt: Date.now(),
71
+ });
72
+ const id = (0, types_2.userKeyDocumentId)(input.grantDocId);
73
+ const create = {
74
+ decryptionKeyId: types_1.PUBLIC_INFOS_KEY_ID,
75
+ signingKeyPair: input.signingKeyPair,
76
+ signingKeyPassword: input.signingKeyPassword,
77
+ initialValues: payload,
78
+ };
79
+ try {
80
+ return await input.db.createDocument({
81
+ ...create,
82
+ id,
83
+ assumeUniqueId: input.assumeUniqueId ?? true,
84
+ });
85
+ }
86
+ catch (error) {
87
+ const message = error instanceof Error ? error.message : String(error);
88
+ if (!message.includes("invalid document id"))
89
+ throw error;
90
+ return input.db.createDocument({
91
+ ...create,
92
+ idPrefix: "userkey",
93
+ });
94
+ }
95
+ }
96
+ async function wrapPrivateKeyForDevice(input) {
97
+ const rsa = new RSAEncryption_1.RSAEncryption(input.cryptoAdapter);
98
+ const wrapped = await rsa.encrypt(input.privateKeyBytes, input.deviceEncryptionPublicKey);
99
+ return (0, fingerprint_1.bytesToBase64)(wrapped);
100
+ }
101
+ async function writeDeviceWrap(input) {
102
+ const payload = input.doc.getData();
103
+ const userKeys = plainJson(payload.userKeys ?? {});
104
+ const gen = userKeys[input.epoch] ?? {
105
+ publicKey: "",
106
+ fingerprint: "",
107
+ createdAt: Date.now(),
108
+ deviceWraps: {},
109
+ };
110
+ gen.deviceWraps = { ...(gen.deviceWraps ?? {}) };
111
+ const existing = gen.deviceWraps[input.deviceFingerprint];
112
+ if (existing?.wrappedKey) {
113
+ if (!existing.label && input.wrap.label) {
114
+ gen.deviceWraps[input.deviceFingerprint] = { ...existing, label: input.wrap.label };
115
+ userKeys[input.epoch] = gen;
116
+ await replaceTopLevelField(input.db, input.doc, "userKeys", userKeys);
117
+ }
118
+ return;
119
+ }
120
+ gen.deviceWraps[input.deviceFingerprint] = {
121
+ wrappedKey: input.wrap.wrappedKey,
122
+ approvedAt: input.wrap.approvedAt,
123
+ approvedBySigningPublicKey: input.wrap.approvedBySigningPublicKey,
124
+ ...(input.wrap.label ? { label: input.wrap.label } : {}),
125
+ };
126
+ userKeys[input.epoch] = gen;
127
+ await replaceTopLevelField(input.db, input.doc, "userKeys", userKeys);
128
+ }
129
+ async function replaceUserKeys(db, doc, userKeys) {
130
+ await replaceTopLevelField(db, doc, "userKeys", userKeys);
131
+ }
132
+ async function replaceRejectedDevices(db, doc, rejectedDevices) {
133
+ await replaceTopLevelField(db, doc, "rejectedDevices", rejectedDevices ?? {});
134
+ }
135
+ async function fingerprintUserPublicKey(publicKeyPem, cryptoAdapter) {
136
+ return (0, fingerprint_1.fingerprintEncryptionPublicKey)(publicKeyPem, cryptoAdapter.getSubtle());
137
+ }
138
+ async function unwrapPrivateKeyFromDevice(input) {
139
+ const rsa = new RSAEncryption_1.RSAEncryption(input.cryptoAdapter);
140
+ return rsa.decrypt((0, fingerprint_1.base64ToBytes)(input.wrappedKeyB64), input.deviceEncryptionPrivateKey);
141
+ }
142
+ function generationAt(payload, epoch) {
143
+ return payload.userKeys?.[epoch];
144
+ }
145
+ //# sourceMappingURL=UserKeyDocument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserKeyDocument.js","sourceRoot":"","sources":["../../../src/core/userkeys/UserKeyDocument.ts"],"names":[],"mappings":"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"}