mindoodb 0.0.51 → 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 (185) 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 +57 -0
  15. package/dist/core/BaseMindooDB.d.ts +85 -10
  16. package/dist/core/BaseMindooDB.d.ts.map +1 -1
  17. package/dist/core/BaseMindooDB.js +687 -196
  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 +407 -86
  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 +286 -17
  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 +2 -1
  43. package/dist/core/accesscontrol/types.d.ts.map +1 -1
  44. package/dist/core/accesscontrol/types.js +3 -2
  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 +6 -1
  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 +7 -0
  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/index.d.ts +7 -3
  89. package/dist/core/index.d.ts.map +1 -1
  90. package/dist/core/index.js +30 -4
  91. package/dist/core/index.js.map +1 -1
  92. package/dist/core/join/deviceJoinBootstrap.d.ts +23 -0
  93. package/dist/core/join/deviceJoinBootstrap.d.ts.map +1 -0
  94. package/dist/core/join/deviceJoinBootstrap.js +37 -0
  95. package/dist/core/join/deviceJoinBootstrap.js.map +1 -0
  96. package/dist/core/keys/KeyBag.d.ts +20 -2
  97. package/dist/core/keys/KeyBag.d.ts.map +1 -1
  98. package/dist/core/keys/KeyBag.js +22 -10
  99. package/dist/core/keys/KeyBag.js.map +1 -1
  100. package/dist/core/logging/MindooLogger.d.ts.map +1 -1
  101. package/dist/core/logging/MindooLogger.js +65 -40
  102. package/dist/core/logging/MindooLogger.js.map +1 -1
  103. package/dist/core/tenantIdValidation.d.ts.map +1 -1
  104. package/dist/core/tenantIdValidation.js +1 -1
  105. package/dist/core/tenantIdValidation.js.map +1 -1
  106. package/dist/core/tenantSetup.d.ts +94 -9
  107. package/dist/core/tenantSetup.d.ts.map +1 -1
  108. package/dist/core/tenantSetup.js +208 -20
  109. package/dist/core/tenantSetup.js.map +1 -1
  110. package/dist/core/types.d.ts +295 -33
  111. package/dist/core/types.d.ts.map +1 -1
  112. package/dist/core/types.js +14 -1
  113. package/dist/core/types.js.map +1 -1
  114. package/dist/core/uri/joinRequestUri.d.ts.map +1 -1
  115. package/dist/core/uri/joinRequestUri.js +12 -3
  116. package/dist/core/uri/joinRequestUri.js.map +1 -1
  117. package/dist/core/userid/canonicalUsername.d.ts +66 -0
  118. package/dist/core/userid/canonicalUsername.d.ts.map +1 -0
  119. package/dist/core/userid/canonicalUsername.js +235 -0
  120. package/dist/core/userid/canonicalUsername.js.map +1 -0
  121. package/dist/core/userid/index.d.ts +9 -0
  122. package/dist/core/userid/index.d.ts.map +1 -1
  123. package/dist/core/userid/index.js +14 -0
  124. package/dist/core/userid/index.js.map +1 -1
  125. package/dist/core/userkeys/UserKeyDocument.d.ts +50 -0
  126. package/dist/core/userkeys/UserKeyDocument.d.ts.map +1 -0
  127. package/dist/core/userkeys/UserKeyDocument.js +145 -0
  128. package/dist/core/userkeys/UserKeyDocument.js.map +1 -0
  129. package/dist/core/userkeys/UserKeyManager.d.ts +170 -0
  130. package/dist/core/userkeys/UserKeyManager.d.ts.map +1 -0
  131. package/dist/core/userkeys/UserKeyManager.js +1277 -0
  132. package/dist/core/userkeys/UserKeyManager.js.map +1 -0
  133. package/dist/core/userkeys/fingerprint.d.ts +17 -0
  134. package/dist/core/userkeys/fingerprint.d.ts.map +1 -0
  135. package/dist/core/userkeys/fingerprint.js +59 -0
  136. package/dist/core/userkeys/fingerprint.js.map +1 -0
  137. package/dist/core/userkeys/index.d.ts +11 -0
  138. package/dist/core/userkeys/index.d.ts.map +1 -0
  139. package/dist/core/userkeys/index.js +49 -0
  140. package/dist/core/userkeys/index.js.map +1 -0
  141. package/dist/core/userkeys/recipients.d.ts +51 -0
  142. package/dist/core/userkeys/recipients.d.ts.map +1 -0
  143. package/dist/core/userkeys/recipients.js +292 -0
  144. package/dist/core/userkeys/recipients.js.map +1 -0
  145. package/dist/core/userkeys/resolveUserKeyDocument.d.ts +21 -0
  146. package/dist/core/userkeys/resolveUserKeyDocument.d.ts.map +1 -0
  147. package/dist/core/userkeys/resolveUserKeyDocument.js +98 -0
  148. package/dist/core/userkeys/resolveUserKeyDocument.js.map +1 -0
  149. package/dist/core/userkeys/sealedCrypto.d.ts +21 -0
  150. package/dist/core/userkeys/sealedCrypto.d.ts.map +1 -0
  151. package/dist/core/userkeys/sealedCrypto.js +79 -0
  152. package/dist/core/userkeys/sealedCrypto.js.map +1 -0
  153. package/dist/core/userkeys/sealedTypes.d.ts +72 -0
  154. package/dist/core/userkeys/sealedTypes.d.ts.map +1 -0
  155. package/dist/core/userkeys/sealedTypes.js +14 -0
  156. package/dist/core/userkeys/sealedTypes.js.map +1 -0
  157. package/dist/core/userkeys/types.d.ts +70 -0
  158. package/dist/core/userkeys/types.d.ts.map +1 -0
  159. package/dist/core/userkeys/types.js +48 -0
  160. package/dist/core/userkeys/types.js.map +1 -0
  161. package/dist/core/userkeys/validateUserKeyDocument.d.ts +19 -0
  162. package/dist/core/userkeys/validateUserKeyDocument.d.ts.map +1 -0
  163. package/dist/core/userkeys/validateUserKeyDocument.js +42 -0
  164. package/dist/core/userkeys/validateUserKeyDocument.js.map +1 -0
  165. package/dist/node/server/CapabilityMatcher.d.ts +5 -0
  166. package/dist/node/server/CapabilityMatcher.d.ts.map +1 -1
  167. package/dist/node/server/CapabilityMatcher.js +10 -1
  168. package/dist/node/server/CapabilityMatcher.js.map +1 -1
  169. package/dist/node/server/DeviceDiscoveryService.d.ts +36 -0
  170. package/dist/node/server/DeviceDiscoveryService.d.ts.map +1 -0
  171. package/dist/node/server/DeviceDiscoveryService.js +165 -0
  172. package/dist/node/server/DeviceDiscoveryService.js.map +1 -0
  173. package/dist/node/server/MindooDBServer.d.ts +13 -0
  174. package/dist/node/server/MindooDBServer.d.ts.map +1 -1
  175. package/dist/node/server/MindooDBServer.js +99 -61
  176. package/dist/node/server/MindooDBServer.js.map +1 -1
  177. package/dist/node/server/SystemAdminAuth.d.ts +7 -0
  178. package/dist/node/server/SystemAdminAuth.d.ts.map +1 -1
  179. package/dist/node/server/SystemAdminAuth.js +4 -1
  180. package/dist/node/server/SystemAdminAuth.js.map +1 -1
  181. package/dist/node/server/TenantManager.d.ts +29 -0
  182. package/dist/node/server/TenantManager.d.ts.map +1 -1
  183. package/dist/node/server/TenantManager.js +146 -7
  184. package/dist/node/server/TenantManager.js.map +1 -1
  185. package/package.json +5 -5
@@ -1 +1 @@
1
- {"version":3,"file":"CapabilityMatcher.js","sourceRoot":"","sources":["../../../src/node/server/CapabilityMatcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CapabilityMatcher.js","sourceRoot":"","sources":["../../../src/node/server/CapabilityMatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Server-wide device discovery: prove possession of a device signing key,
3
+ * then scan all tenants for an active grant and deliver RSA-wrapped
4
+ * `$publicinfos` plus admin public keys and the per-device join bootstrap —
5
+ * no join-response URI required.
6
+ */
7
+ import type { CryptoAdapter } from "../../core/crypto/CryptoAdapter";
8
+ import type { DeviceTenantDelivery } from "../../core/types";
9
+ import type { TenantManager } from "./TenantManager";
10
+ export type { DeviceTenantDelivery };
11
+ export interface DeviceDiscoverResult {
12
+ tenants: DeviceTenantDelivery[];
13
+ }
14
+ export declare class DeviceDiscoveryAuthError extends Error {
15
+ constructor(message: string);
16
+ }
17
+ export declare class DeviceDiscoveryService {
18
+ private readonly tenantManager;
19
+ private readonly cryptoAdapter;
20
+ private challenges;
21
+ constructor(tenantManager: TenantManager, cryptoAdapter: CryptoAdapter);
22
+ /**
23
+ * Issue a short-lived, single-use challenge bound to `signingPublicKey`.
24
+ * Does not require the key to be on any tenant yet (discovery finds that).
25
+ */
26
+ createChallenge(signingPublicKey: string): string;
27
+ /**
28
+ * Verify the Ed25519 signature over the challenge, then scan every local
29
+ * tenant for an active grant containing this signing key. Matching tenants
30
+ * receive a delivery with RSA-wrapped `$publicinfos` (parallelized).
31
+ */
32
+ discover(challenge: string, signature: Uint8Array): Promise<DeviceDiscoverResult>;
33
+ private verifySignature;
34
+ private cleanup;
35
+ }
36
+ //# sourceMappingURL=DeviceDiscoveryService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceDiscoveryService.d.ts","sourceRoot":"","sources":["../../../src/node/server/DeviceDiscoveryService.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAErE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAarD,YAAY,EAAE,oBAAoB,EAAE,CAAC;AAErC,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,oBAAoB,EAAE,CAAC;CACjC;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,sBAAsB;IAI/B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAJhC,OAAO,CAAC,UAAU,CAAsC;gBAGrC,aAAa,EAAE,aAAa,EAC5B,aAAa,EAAE,aAAa;IAG/C;;;OAGG;IACH,eAAe,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM;IAkBjD;;;;OAIG;IACG,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO,CAAC,oBAAoB,CAAC;YA0GzE,eAAe;IAkC7B,OAAO,CAAC,OAAO;CAahB"}
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ /**
3
+ * Server-wide device discovery: prove possession of a device signing key,
4
+ * then scan all tenants for an active grant and deliver RSA-wrapped
5
+ * `$publicinfos` plus admin public keys and the per-device join bootstrap —
6
+ * no join-response URI required.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.DeviceDiscoveryService = exports.DeviceDiscoveryAuthError = void 0;
10
+ const uuid_1 = require("uuid");
11
+ const RSAEncryption_1 = require("../../core/crypto/RSAEncryption");
12
+ const CHALLENGE_TTL_MS = 5 * 60 * 1000;
13
+ const MAX_CHALLENGES = 10000;
14
+ class DeviceDiscoveryAuthError extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = "DeviceDiscoveryAuthError";
18
+ }
19
+ }
20
+ exports.DeviceDiscoveryAuthError = DeviceDiscoveryAuthError;
21
+ class DeviceDiscoveryService {
22
+ constructor(tenantManager, cryptoAdapter) {
23
+ this.tenantManager = tenantManager;
24
+ this.cryptoAdapter = cryptoAdapter;
25
+ this.challenges = new Map();
26
+ }
27
+ /**
28
+ * Issue a short-lived, single-use challenge bound to `signingPublicKey`.
29
+ * Does not require the key to be on any tenant yet (discovery finds that).
30
+ */
31
+ createChallenge(signingPublicKey) {
32
+ const trimmed = signingPublicKey.trim();
33
+ if (!trimmed) {
34
+ throw new Error("signingPublicKey is required");
35
+ }
36
+ const challenge = (0, uuid_1.v7)();
37
+ const now = Date.now();
38
+ this.challenges.set(challenge, {
39
+ challenge,
40
+ signingPublicKey: trimmed,
41
+ createdAt: now,
42
+ expiresAt: now + CHALLENGE_TTL_MS,
43
+ used: false,
44
+ });
45
+ this.cleanup();
46
+ return challenge;
47
+ }
48
+ /**
49
+ * Verify the Ed25519 signature over the challenge, then scan every local
50
+ * tenant for an active grant containing this signing key. Matching tenants
51
+ * receive a delivery with RSA-wrapped `$publicinfos` (parallelized).
52
+ */
53
+ async discover(challenge, signature) {
54
+ const authChallenge = this.challenges.get(challenge);
55
+ if (!authChallenge) {
56
+ throw new DeviceDiscoveryAuthError("Challenge not found or expired");
57
+ }
58
+ if (Date.now() > authChallenge.expiresAt) {
59
+ this.challenges.delete(challenge);
60
+ throw new DeviceDiscoveryAuthError("Challenge expired");
61
+ }
62
+ if (authChallenge.used) {
63
+ throw new DeviceDiscoveryAuthError("Challenge already used");
64
+ }
65
+ authChallenge.used = true;
66
+ const ok = await this.verifySignature(challenge, signature, authChallenge.signingPublicKey);
67
+ if (!ok) {
68
+ throw new DeviceDiscoveryAuthError("Invalid signature");
69
+ }
70
+ const signingPublicKey = authChallenge.signingPublicKey;
71
+ const tenantIds = this.tenantManager.listTenants();
72
+ const matches = [];
73
+ for (const tenantId of tenantIds) {
74
+ try {
75
+ const loaded = await this.tenantManager.getTenant(tenantId);
76
+ const lookup = await loaded.directory.getUserBySigningPublicKey(signingPublicKey);
77
+ if (!lookup?.encryptionPublicKey)
78
+ continue;
79
+ matches.push({
80
+ tenantId,
81
+ adminSigningPublicKey: loaded.context.config.adminSigningPublicKey,
82
+ adminEncryptionPublicKey: loaded.context.config.adminEncryptionPublicKey,
83
+ encryptionPublicKey: lookup.encryptionPublicKey,
84
+ username_hash: typeof lookup.username === "string" && /^[a-f0-9]{64}$/i.test(lookup.username)
85
+ ? lookup.username
86
+ : undefined,
87
+ identity_hashes: lookup.identityHashes,
88
+ joinResponseWrapped: typeof lookup.joinResponseWrapped === "string" && lookup.joinResponseWrapped.trim()
89
+ ? lookup.joinResponseWrapped.trim()
90
+ : undefined,
91
+ });
92
+ }
93
+ catch {
94
+ // Tenant missing directory / not loadable — skip.
95
+ }
96
+ }
97
+ if (matches.length === 0) {
98
+ return { tenants: [] };
99
+ }
100
+ const rsa = new RSAEncryption_1.RSAEncryption(this.cryptoAdapter);
101
+ const deliveries = await Promise.all(matches.map(async (match) => {
102
+ try {
103
+ const keys = await this.tenantManager.getPublicInfosKeysForTenant(match.tenantId);
104
+ if (!keys.length)
105
+ return null;
106
+ const wrappedPublicInfosKeys = await Promise.all(keys.map((rawKey) => rsa.wrapKeyToBase64(rawKey, match.encryptionPublicKey)));
107
+ // getAllKeys is newest-first; keep wrappedPublicInfosKey as the current generation.
108
+ const wrappedPublicInfosKey = wrappedPublicInfosKeys[0];
109
+ console.log(`[DeviceDiscovery] Wrapped ${wrappedPublicInfosKeys.length} $publicinfos version(s) for tenant ${match.tenantId}`);
110
+ return {
111
+ tenantId: match.tenantId,
112
+ adminSigningPublicKey: match.adminSigningPublicKey,
113
+ adminEncryptionPublicKey: match.adminEncryptionPublicKey,
114
+ wrappedPublicInfosKey,
115
+ ...(wrappedPublicInfosKeys.length > 1
116
+ ? { wrappedPublicInfosKeys }
117
+ : {}),
118
+ ...(match.joinResponseWrapped
119
+ ? { wrappedJoinResponse: match.joinResponseWrapped }
120
+ : {}),
121
+ ...(match.username_hash ? { username_hash: match.username_hash } : {}),
122
+ ...(match.identity_hashes?.length
123
+ ? { identity_hashes: match.identity_hashes }
124
+ : {}),
125
+ };
126
+ }
127
+ catch {
128
+ return null;
129
+ }
130
+ }));
131
+ return { tenants: deliveries.filter((d) => d !== null) };
132
+ }
133
+ async verifySignature(challenge, signature, publicKeyPem) {
134
+ try {
135
+ const subtle = this.cryptoAdapter.getSubtle();
136
+ const pemContents = publicKeyPem
137
+ .replace(/-----BEGIN PUBLIC KEY-----/g, "")
138
+ .replace(/-----END PUBLIC KEY-----/g, "")
139
+ .replace(/\s/g, "");
140
+ const binaryDer = Uint8Array.from(atob(pemContents), (c) => c.charCodeAt(0));
141
+ const key = await subtle.importKey("spki", binaryDer.buffer, { name: "Ed25519" }, false, ["verify"]);
142
+ const data = new TextEncoder().encode(challenge);
143
+ return await subtle.verify("Ed25519", key, signature.buffer.slice(signature.byteOffset, signature.byteOffset + signature.byteLength), data.buffer);
144
+ }
145
+ catch {
146
+ return false;
147
+ }
148
+ }
149
+ cleanup() {
150
+ const now = Date.now();
151
+ for (const [id, entry] of this.challenges) {
152
+ if (entry.used || entry.expiresAt <= now) {
153
+ this.challenges.delete(id);
154
+ }
155
+ }
156
+ while (this.challenges.size > MAX_CHALLENGES) {
157
+ const oldest = this.challenges.keys().next().value;
158
+ if (oldest === undefined)
159
+ break;
160
+ this.challenges.delete(oldest);
161
+ }
162
+ }
163
+ }
164
+ exports.DeviceDiscoveryService = DeviceDiscoveryService;
165
+ //# sourceMappingURL=DeviceDiscoveryService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceDiscoveryService.js","sourceRoot":"","sources":["../../../src/node/server/DeviceDiscoveryService.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,+BAAoC;AAEpC,mEAAgE;AAIhE,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACvC,MAAM,cAAc,GAAG,KAAM,CAAC;AAgB9B,MAAa,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACzC,CAAC;CACF;AALD,4DAKC;AAED,MAAa,sBAAsB;IAGjC,YACmB,aAA4B,EAC5B,aAA4B;QAD5B,kBAAa,GAAb,aAAa,CAAe;QAC5B,kBAAa,GAAb,aAAa,CAAe;QAJvC,eAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;IAKrD,CAAC;IAEJ;;;OAGG;IACH,eAAe,CAAC,gBAAwB;QACtC,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,MAAM,SAAS,GAAG,IAAA,SAAM,GAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,EAAE;YAC7B,SAAS;YACT,gBAAgB,EAAE,OAAO;YACzB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG,GAAG,gBAAgB;YACjC,IAAI,EAAE,KAAK;SACZ,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,SAAiB,EAAE,SAAqB;QACrD,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACrD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,wBAAwB,CAAC,gCAAgC,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,IAAI,wBAAwB,CAAC,mBAAmB,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;YACvB,MAAM,IAAI,wBAAwB,CAAC,wBAAwB,CAAC,CAAC;QAC/D,CAAC;QACD,aAAa,CAAC,IAAI,GAAG,IAAI,CAAC;QAE1B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CACnC,SAAS,EACT,SAAS,EACT,aAAa,CAAC,gBAAgB,CAC/B,CAAC;QACF,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,MAAM,IAAI,wBAAwB,CAAC,mBAAmB,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,gBAAgB,GAAG,aAAa,CAAC,gBAAgB,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAWnD,MAAM,OAAO,GAAY,EAAE,CAAC;QAE5B,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC5D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,yBAAyB,CAAC,gBAAgB,CAAC,CAAC;gBAClF,IAAI,CAAC,MAAM,EAAE,mBAAmB;oBAAE,SAAS;gBAE3C,OAAO,CAAC,IAAI,CAAC;oBACX,QAAQ;oBACR,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB;oBAClE,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,wBAAwB;oBACxE,mBAAmB,EAAE,MAAM,CAAC,mBAAmB;oBAC/C,aAAa,EACX,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;wBAC5E,CAAC,CAAC,MAAM,CAAC,QAAQ;wBACjB,CAAC,CAAC,SAAS;oBACf,eAAe,EAAE,MAAM,CAAC,cAAc;oBACtC,mBAAmB,EACjB,OAAO,MAAM,CAAC,mBAAmB,KAAK,QAAQ,IAAI,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE;wBACjF,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE;wBACnC,CAAC,CAAC,SAAS;iBAChB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,kDAAkD;YACpD,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,6BAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAClD,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,GAAG,CAClC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAwC,EAAE;YAChE,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,2BAA2B,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAClF,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,OAAO,IAAI,CAAC;gBAC9B,MAAM,sBAAsB,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9C,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAC7E,CAAC;gBACF,oFAAoF;gBACpF,MAAM,qBAAqB,GAAG,sBAAsB,CAAC,CAAC,CAAE,CAAC;gBACzD,OAAO,CAAC,GAAG,CACT,6BAA6B,sBAAsB,CAAC,MAAM,uCAAuC,KAAK,CAAC,QAAQ,EAAE,CAClH,CAAC;gBACF,OAAO;oBACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,qBAAqB,EAAE,KAAK,CAAC,qBAAqB;oBAClD,wBAAwB,EAAE,KAAK,CAAC,wBAAwB;oBACxD,qBAAqB;oBACrB,GAAG,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC;wBACnC,CAAC,CAAC,EAAE,sBAAsB,EAAE;wBAC5B,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,KAAK,CAAC,mBAAmB;wBAC3B,CAAC,CAAC,EAAE,mBAAmB,EAAE,KAAK,CAAC,mBAAmB,EAAE;wBACpD,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtE,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,MAAM;wBAC/B,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE;wBAC5C,CAAC,CAAC,EAAE,CAAC;iBACR,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CACH,CAAC;QAEF,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAA6B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;IACtF,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,SAAiB,EACjB,SAAqB,EACrB,YAAoB;QAEpB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YAC9C,MAAM,WAAW,GAAG,YAAY;iBAC7B,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC;iBAC1C,OAAO,CAAC,2BAA2B,EAAE,EAAE,CAAC;iBACxC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACtB,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,SAAS,CAChC,MAAM,EACN,SAAS,CAAC,MAAqB,EAC/B,EAAE,IAAI,EAAE,SAAS,EAAE,EACnB,KAAK,EACL,CAAC,QAAQ,CAAC,CACX,CAAC;YACF,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjD,OAAO,MAAM,MAAM,CAAC,MAAM,CACxB,SAAS,EACT,GAAG,EACH,SAAS,CAAC,MAAM,CAAC,KAAK,CACpB,SAAS,CAAC,UAAU,EACpB,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAC7B,EAChB,IAAI,CAAC,MAAqB,CAC3B,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,OAAO;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;gBACzC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,GAAG,cAAc,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;YACnD,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM;YAChC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;CACF;AA5LD,wDA4LC"}
@@ -44,6 +44,7 @@ export declare class MindooDBServer {
44
44
  private tenantManager;
45
45
  private capabilityMatcher;
46
46
  private systemAdminAuth;
47
+ private deviceDiscovery;
47
48
  private readonly staticDir;
48
49
  private serverConfig;
49
50
  private configPath;
@@ -124,8 +125,18 @@ export declare class MindooDBServer {
124
125
  * JWT-based middleware for /system/* routes (excluding /system/auth/*).
125
126
  * Extracts and validates the bearer token, then checks capabilities
126
127
  * for the current (method, path, username, publicsignkey).
128
+ *
129
+ * `DELETE /system/tenants/:tenantId` is also allowed when the JWT signing
130
+ * key is that tenant's registered `adminSigningPublicKey` (own-tenant
131
+ * delete). Sub-resources and other tenants stay capability-gated.
127
132
  */
128
133
  private systemAdminMiddleware;
134
+ /**
135
+ * Owner bypass for deleting the caller's own tenant. Matches only
136
+ * `DELETE /system/tenants/:tenantId` (no sub-resource) and requires the
137
+ * JWT public key to equal that tenant's stored admin signing key.
138
+ */
139
+ private isOwnTenantDeleteAuthorized;
129
140
  private tenantMiddleware;
130
141
  /**
131
142
  * Wire up all /system/* routes. Auth endpoints sit outside the JWT
@@ -237,6 +248,8 @@ export declare class MindooDBServer {
237
248
  private getClientIpForRateLimit;
238
249
  private validateDbId;
239
250
  private formatTenantNotFoundOnServerError;
251
+ private handleDeviceChallenge;
252
+ private handleDeviceDiscover;
240
253
  private handleChallenge;
241
254
  private handleAuthenticate;
242
255
  private handleFindNewEntries;
@@ -1 +1 @@
1
- {"version":3,"file":"MindooDBServer.d.ts","sourceRoot":"","sources":["../../../src/node/server/MindooDBServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MindooDBServer.d.ts","sourceRoot":"","sources":["../../../src/node/server/MindooDBServer.ts"],"names":[],"mappings":"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"}
@@ -59,12 +59,14 @@ const cors_1 = __importDefault(require("cors"));
59
59
  const express_rate_limit_1 = __importStar(require("express-rate-limit"));
60
60
  const compressionMiddleware_1 = require("./compressionMiddleware");
61
61
  const binaryEntryFraming_1 = require("../../core/appendonlystores/network/binaryEntryFraming");
62
+ const entryWireCodec_1 = require("../../core/appendonlystores/network/entryWireCodec");
62
63
  const SyncEventBus_1 = require("./SyncEventBus");
63
64
  const types_1 = require("../../core/appendonlystores/types");
64
65
  const types_2 = require("../../core/appendonlystores/network/types");
65
66
  const TenantManager_1 = require("./TenantManager");
66
67
  const CapabilityMatcher_1 = require("./CapabilityMatcher");
67
68
  const SystemAdminAuth_1 = require("./SystemAdminAuth");
69
+ const DeviceDiscoveryService_1 = require("./DeviceDiscoveryService");
68
70
  const config_1 = require("./config");
69
71
  const SystemIpAllowlist_1 = require("./SystemIpAllowlist");
70
72
  const validation_1 = require("./validation");
@@ -72,6 +74,13 @@ const urlSafety_1 = require("../../core/utils/urlSafety");
72
74
  const types_3 = require("./types");
73
75
  const timestampProxy_1 = require("./timestampProxy");
74
76
  const rateLimits_1 = require("./rateLimits");
77
+ /**
78
+ * Wire-format types for the sync HTTP API live in
79
+ * {@link ../../core/appendonlystores/network/entryWireCodec}: binary fields
80
+ * (signature, encryptedData, rsaEncryptedPayload) are base64 strings in
81
+ * transit. Client and server share that codec so signed trailing blocks
82
+ * cannot drift off the wire.
83
+ */
75
84
  /**
76
85
  * Rate-limit defaults. Auth and sync have separate tiers because a single
77
86
  * challenge/authenticate handshake is two requests; with multiple tenants,
@@ -187,7 +196,10 @@ class MindooDBServer {
187
196
  // SystemAdminAuthService generates a random HMAC-SHA256 secret for JWTs
188
197
  // on each server start — existing tokens become invalid after restart.
189
198
  const cryptoAdapter = this.tenantManager.getCryptoAdapter();
190
- this.systemAdminAuth = new SystemAdminAuth_1.SystemAdminAuthService(cryptoAdapter, this.serverConfig);
199
+ this.systemAdminAuth = new SystemAdminAuth_1.SystemAdminAuthService(cryptoAdapter, this.serverConfig, {
200
+ isTenantAdminSigningKey: (publicsignkey) => this.tenantManager.isRegisteredTenantAdminSigningKey(publicsignkey),
201
+ });
202
+ this.deviceDiscovery = new DeviceDiscoveryService_1.DeviceDiscoveryService(this.tenantManager, cryptoAdapter);
191
203
  const principalCount = Object.values(this.serverConfig.capabilities).reduce((sum, arr) => sum + arr.length, 0);
192
204
  if (principalCount === 0) {
193
205
  console.log(`[MindooDBServer] WARNING: No system admin principals configured. All /system/* endpoints are locked down.`);
@@ -362,6 +374,17 @@ class MindooDBServer {
362
374
  this.app.get("/health", (req, res) => {
363
375
  res.json({ status: "ok", timestamp: Date.now() });
364
376
  });
377
+ // Server-wide device discovery (before /:tenantId so "device" is not a tenant id).
378
+ // Aggressive rate limit: challenge+discover scans every local tenant.
379
+ const deviceDiscoveryRateLimit = (0, express_rate_limit_1.default)({
380
+ windowMs: 60000,
381
+ max: 10,
382
+ standardHeaders: true,
383
+ legacyHeaders: false,
384
+ message: { error: "Too many device discovery requests, please try again later" },
385
+ });
386
+ this.app.post("/device/challenge", deviceDiscoveryRateLimit, this.handleDeviceChallenge.bind(this));
387
+ this.app.post("/device/discover", deviceDiscoveryRateLimit, this.handleDeviceDiscover.bind(this));
365
388
  // .well-known endpoints are unauthenticated so clients can discover
366
389
  // server identity and tenant availability before attempting to authenticate.
367
390
  this.app.get("/.well-known/mindoodb-server-info", (req, res) => {
@@ -451,6 +474,10 @@ class MindooDBServer {
451
474
  * JWT-based middleware for /system/* routes (excluding /system/auth/*).
452
475
  * Extracts and validates the bearer token, then checks capabilities
453
476
  * for the current (method, path, username, publicsignkey).
477
+ *
478
+ * `DELETE /system/tenants/:tenantId` is also allowed when the JWT signing
479
+ * key is that tenant's registered `adminSigningPublicKey` (own-tenant
480
+ * delete). Sub-resources and other tenants stay capability-gated.
454
481
  */
455
482
  async systemAdminMiddleware(req, res, next) {
456
483
  const auth = req.headers.authorization;
@@ -468,7 +495,10 @@ class MindooDBServer {
468
495
  // but we need the full path for capability matching.
469
496
  const fullPath = `/system${req.path}`;
470
497
  const method = req.method.toUpperCase();
471
- if (!this.capabilityMatcher.isAuthorized(method, fullPath, payload.sub, payload.publicsignkey)) {
498
+ const capabilityAuthorized = this.capabilityMatcher.isAuthorized(method, fullPath, payload.sub, payload.publicsignkey);
499
+ const ownerDeleteAuthorized = !capabilityAuthorized &&
500
+ this.isOwnTenantDeleteAuthorized(method, fullPath, payload.publicsignkey);
501
+ if (!capabilityAuthorized && !ownerDeleteAuthorized) {
472
502
  res.status(403).json({ error: "Forbidden: insufficient capabilities" });
473
503
  return;
474
504
  }
@@ -478,6 +508,27 @@ class MindooDBServer {
478
508
  };
479
509
  next();
480
510
  }
511
+ /**
512
+ * Owner bypass for deleting the caller's own tenant. Matches only
513
+ * `DELETE /system/tenants/:tenantId` (no sub-resource) and requires the
514
+ * JWT public key to equal that tenant's stored admin signing key.
515
+ */
516
+ isOwnTenantDeleteAuthorized(method, fullPath, publicsignkey) {
517
+ if (method !== "DELETE") {
518
+ return false;
519
+ }
520
+ const tenantId = (0, CapabilityMatcher_1.parseSystemTenantItemPath)(fullPath);
521
+ if (!tenantId) {
522
+ return false;
523
+ }
524
+ try {
525
+ (0, validation_1.validateTenantIdFormat)(tenantId);
526
+ }
527
+ catch {
528
+ return false;
529
+ }
530
+ return this.tenantManager.isTenantAdminSigningKeyFor(tenantId, publicsignkey);
531
+ }
481
532
  // ==================== Tenant Middleware ====================
482
533
  tenantMiddleware(req, res, next) {
483
534
  const rawTenantId = req.params.tenantId?.toLowerCase();
@@ -1298,6 +1349,47 @@ class MindooDBServer {
1298
1349
  const serverName = this.tenantManager.getServerPublicInfo()?.name ?? "unknown";
1299
1350
  return `Tenant ${tenantId} not found on server ${serverName}`;
1300
1351
  }
1352
+ // ==================== Device Discovery (server-wide) ====================
1353
+ async handleDeviceChallenge(req, res) {
1354
+ try {
1355
+ const { signingPublicKey } = req.body ?? {};
1356
+ if (typeof signingPublicKey !== "string" || !signingPublicKey.trim()) {
1357
+ res.status(400).json({ error: "signingPublicKey is required" });
1358
+ return;
1359
+ }
1360
+ (0, validation_1.validateStringLength)(signingPublicKey, validation_1.MAX_PEM_KEY_LENGTH, "signingPublicKey");
1361
+ const challenge = this.deviceDiscovery.createChallenge(signingPublicKey);
1362
+ res.json({ challenge });
1363
+ }
1364
+ catch (error) {
1365
+ this.handleRequestError(error, res);
1366
+ }
1367
+ }
1368
+ async handleDeviceDiscover(req, res) {
1369
+ try {
1370
+ const { challenge, signature } = req.body ?? {};
1371
+ if (typeof challenge !== "string" || !challenge.trim()) {
1372
+ res.status(400).json({ error: "challenge is required" });
1373
+ return;
1374
+ }
1375
+ if (typeof signature !== "string" || !signature.trim()) {
1376
+ res.status(400).json({ error: "signature is required" });
1377
+ return;
1378
+ }
1379
+ (0, validation_1.validateStringLength)(challenge, validation_1.MAX_CHALLENGE_LENGTH, "challenge");
1380
+ (0, validation_1.validateStringLength)(signature, validation_1.MAX_SIGNATURE_LENGTH, "signature");
1381
+ const signatureBytes = this.base64ToUint8Array(signature);
1382
+ const result = await this.deviceDiscovery.discover(challenge, signatureBytes);
1383
+ res.json(result);
1384
+ }
1385
+ catch (error) {
1386
+ if (error instanceof DeviceDiscoveryService_1.DeviceDiscoveryAuthError) {
1387
+ res.status(401).json({ error: error.message });
1388
+ return;
1389
+ }
1390
+ this.handleRequestError(error, res);
1391
+ }
1392
+ }
1301
1393
  // ==================== Tenant Auth Handlers ====================
1302
1394
  // Two-step challenge-response flow:
1303
1395
  // 1. POST /auth/challenge → client sends username, server returns a random nonce
@@ -2007,70 +2099,16 @@ class MindooDBServer {
2007
2099
  }
2008
2100
  // ==================== Serialization ====================
2009
2101
  // Entries are stored with binary fields (Uint8Array) internally but
2010
- // transmitted as base64 strings over JSON. These methods handle the
2011
- // conversion in both directions.
2102
+ // transmitted as base64 strings over JSON. Shared with the client
2103
+ // (entryWireCodec) so signed trailing blocks cannot drift off the wire.
2012
2104
  serializeEntryMetadata(metadata) {
2013
- return {
2014
- entryType: metadata.entryType,
2015
- id: metadata.id,
2016
- contentHash: metadata.contentHash,
2017
- docId: metadata.docId,
2018
- dependencyIds: metadata.dependencyIds,
2019
- createdAt: metadata.createdAt,
2020
- receiptOrder: metadata.receiptOrder,
2021
- createdByPublicKey: metadata.createdByPublicKey,
2022
- decryptionKeyId: metadata.decryptionKeyId,
2023
- signature: this.uint8ArrayToBase64(metadata.signature),
2024
- metadataSignature: metadata.metadataSignature
2025
- ? this.uint8ArrayToBase64(metadata.metadataSignature)
2026
- : undefined,
2027
- originalSize: metadata.originalSize,
2028
- encryptedSize: metadata.encryptedSize,
2029
- receivedAt: metadata.receivedAt,
2030
- receivedByPublicKey: metadata.receivedByPublicKey,
2031
- receivedDateSignature: metadata.receivedDateSignature
2032
- ? this.uint8ArrayToBase64(metadata.receivedDateSignature)
2033
- : undefined,
2034
- attachmentRefs: metadata.attachmentRefs,
2035
- // Bound into metadataSignature, so it must survive the round-trip.
2036
- provenance: metadata.provenance,
2037
- entryVersion: metadata.entryVersion,
2038
- };
2105
+ return (0, entryWireCodec_1.serializeEntryMetadata)(metadata);
2039
2106
  }
2040
2107
  deserializeEntryMetadata(serialized) {
2041
- return {
2042
- entryType: serialized.entryType,
2043
- id: serialized.id,
2044
- contentHash: serialized.contentHash,
2045
- docId: serialized.docId,
2046
- dependencyIds: serialized.dependencyIds,
2047
- createdAt: serialized.createdAt,
2048
- receiptOrder: serialized.receiptOrder,
2049
- createdByPublicKey: serialized.createdByPublicKey,
2050
- decryptionKeyId: serialized.decryptionKeyId,
2051
- signature: this.base64ToUint8Array(serialized.signature),
2052
- metadataSignature: serialized.metadataSignature
2053
- ? this.base64ToUint8Array(serialized.metadataSignature)
2054
- : undefined,
2055
- originalSize: serialized.originalSize,
2056
- encryptedSize: serialized.encryptedSize,
2057
- // Preserve any pre-existing witness receipt (e.g. on re-sync or
2058
- // server-to-server forwarding); a fresh local push has none.
2059
- receivedAt: serialized.receivedAt,
2060
- receivedByPublicKey: serialized.receivedByPublicKey,
2061
- receivedDateSignature: serialized.receivedDateSignature
2062
- ? this.base64ToUint8Array(serialized.receivedDateSignature)
2063
- : undefined,
2064
- attachmentRefs: serialized.attachmentRefs,
2065
- provenance: serialized.provenance,
2066
- entryVersion: serialized.entryVersion,
2067
- };
2108
+ return (0, entryWireCodec_1.deserializeEntryMetadata)(serialized);
2068
2109
  }
2069
2110
  deserializeEntry(serialized) {
2070
- return {
2071
- ...this.deserializeEntryMetadata(serialized),
2072
- encryptedData: this.base64ToUint8Array(serialized.encryptedData),
2073
- };
2111
+ return (0, entryWireCodec_1.deserializeStoreEntry)(serialized);
2074
2112
  }
2075
2113
  uint8ArrayToBase64(bytes) {
2076
2114
  return Buffer.from(bytes).toString("base64");