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.
- package/README-server.md +11 -2
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +13 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +45 -20
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.d.ts +2 -0
- package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.js +6 -62
- package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +24 -0
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +75 -24
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
- package/dist/browser/index.mjs +57 -0
- package/dist/core/BaseMindooDB.d.ts +85 -10
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +687 -196
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +59 -7
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +407 -86
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts +61 -9
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +363 -35
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/BaseMindooTenantFactory.d.ts +17 -1
- package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantFactory.js +286 -17
- package/dist/core/BaseMindooTenantFactory.js.map +1 -1
- package/dist/core/accesscontrol/DirectoryStateNode.d.ts +68 -1
- package/dist/core/accesscontrol/DirectoryStateNode.d.ts.map +1 -1
- package/dist/core/accesscontrol/DirectoryStateNode.js +157 -4
- package/dist/core/accesscontrol/DirectoryStateNode.js.map +1 -1
- package/dist/core/accesscontrol/directoryProjection.d.ts.map +1 -1
- package/dist/core/accesscontrol/directoryProjection.js +14 -5
- package/dist/core/accesscontrol/directoryProjection.js.map +1 -1
- package/dist/core/accesscontrol/grantKeys.d.ts +17 -14
- package/dist/core/accesscontrol/grantKeys.d.ts.map +1 -1
- package/dist/core/accesscontrol/grantKeys.js +51 -21
- package/dist/core/accesscontrol/grantKeys.js.map +1 -1
- package/dist/core/accesscontrol/types.d.ts +2 -1
- package/dist/core/accesscontrol/types.d.ts.map +1 -1
- package/dist/core/accesscontrol/types.js +3 -2
- package/dist/core/accesscontrol/types.js.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts +7 -0
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.js +70 -14
- package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -1
- package/dist/core/appendonlystores/network/entryWireCodec.d.ts +51 -0
- package/dist/core/appendonlystores/network/entryWireCodec.d.ts.map +1 -0
- package/dist/core/appendonlystores/network/entryWireCodec.js +93 -0
- package/dist/core/appendonlystores/network/entryWireCodec.js.map +1 -0
- package/dist/core/builtinDbInvariants.d.ts +53 -0
- package/dist/core/builtinDbInvariants.d.ts.map +1 -0
- package/dist/core/builtinDbInvariants.js +147 -0
- package/dist/core/builtinDbInvariants.js.map +1 -0
- package/dist/core/copy/feasibility.d.ts.map +1 -1
- package/dist/core/copy/feasibility.js +3 -0
- package/dist/core/copy/feasibility.js.map +1 -1
- package/dist/core/copy/flatten.d.ts.map +1 -1
- package/dist/core/copy/flatten.js +6 -1
- package/dist/core/copy/flatten.js.map +1 -1
- package/dist/core/copy/host.d.ts +5 -0
- package/dist/core/copy/host.d.ts.map +1 -1
- package/dist/core/copy/preflight.d.ts.map +1 -1
- package/dist/core/copy/preflight.js +7 -1
- package/dist/core/copy/preflight.js.map +1 -1
- package/dist/core/copy/types.d.ts +7 -0
- package/dist/core/copy/types.d.ts.map +1 -1
- package/dist/core/crypto/EntrySignature.d.ts +8 -2
- package/dist/core/crypto/EntrySignature.d.ts.map +1 -1
- package/dist/core/crypto/EntrySignature.js +14 -5
- package/dist/core/crypto/EntrySignature.js.map +1 -1
- package/dist/core/crypto/MindooDocSigner.d.ts.map +1 -1
- package/dist/core/crypto/MindooDocSigner.js +11 -2
- package/dist/core/crypto/MindooDocSigner.js.map +1 -1
- package/dist/core/crypto/RSAEncryption.d.ts +19 -0
- package/dist/core/crypto/RSAEncryption.d.ts.map +1 -1
- package/dist/core/crypto/RSAEncryption.js +36 -3
- package/dist/core/crypto/RSAEncryption.js.map +1 -1
- package/dist/core/crypto/privateKeyEncryption.js +1 -1
- package/dist/core/crypto/privateKeyEncryption.js.map +1 -1
- package/dist/core/crypto/rsaOaep3072.d.ts +12 -0
- package/dist/core/crypto/rsaOaep3072.d.ts.map +1 -0
- package/dist/core/crypto/rsaOaep3072.js +30 -0
- package/dist/core/crypto/rsaOaep3072.js.map +1 -0
- package/dist/core/index.d.ts +7 -3
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +30 -4
- package/dist/core/index.js.map +1 -1
- package/dist/core/join/deviceJoinBootstrap.d.ts +23 -0
- package/dist/core/join/deviceJoinBootstrap.d.ts.map +1 -0
- package/dist/core/join/deviceJoinBootstrap.js +37 -0
- package/dist/core/join/deviceJoinBootstrap.js.map +1 -0
- package/dist/core/keys/KeyBag.d.ts +20 -2
- package/dist/core/keys/KeyBag.d.ts.map +1 -1
- package/dist/core/keys/KeyBag.js +22 -10
- package/dist/core/keys/KeyBag.js.map +1 -1
- package/dist/core/logging/MindooLogger.d.ts.map +1 -1
- package/dist/core/logging/MindooLogger.js +65 -40
- package/dist/core/logging/MindooLogger.js.map +1 -1
- package/dist/core/tenantIdValidation.d.ts.map +1 -1
- package/dist/core/tenantIdValidation.js +1 -1
- package/dist/core/tenantIdValidation.js.map +1 -1
- package/dist/core/tenantSetup.d.ts +94 -9
- package/dist/core/tenantSetup.d.ts.map +1 -1
- package/dist/core/tenantSetup.js +208 -20
- package/dist/core/tenantSetup.js.map +1 -1
- package/dist/core/types.d.ts +295 -33
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +14 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/uri/joinRequestUri.d.ts.map +1 -1
- package/dist/core/uri/joinRequestUri.js +12 -3
- package/dist/core/uri/joinRequestUri.js.map +1 -1
- package/dist/core/userid/canonicalUsername.d.ts +66 -0
- package/dist/core/userid/canonicalUsername.d.ts.map +1 -0
- package/dist/core/userid/canonicalUsername.js +235 -0
- package/dist/core/userid/canonicalUsername.js.map +1 -0
- package/dist/core/userid/index.d.ts +9 -0
- package/dist/core/userid/index.d.ts.map +1 -1
- package/dist/core/userid/index.js +14 -0
- package/dist/core/userid/index.js.map +1 -1
- package/dist/core/userkeys/UserKeyDocument.d.ts +50 -0
- package/dist/core/userkeys/UserKeyDocument.d.ts.map +1 -0
- package/dist/core/userkeys/UserKeyDocument.js +145 -0
- package/dist/core/userkeys/UserKeyDocument.js.map +1 -0
- package/dist/core/userkeys/UserKeyManager.d.ts +170 -0
- package/dist/core/userkeys/UserKeyManager.d.ts.map +1 -0
- package/dist/core/userkeys/UserKeyManager.js +1277 -0
- package/dist/core/userkeys/UserKeyManager.js.map +1 -0
- package/dist/core/userkeys/fingerprint.d.ts +17 -0
- package/dist/core/userkeys/fingerprint.d.ts.map +1 -0
- package/dist/core/userkeys/fingerprint.js +59 -0
- package/dist/core/userkeys/fingerprint.js.map +1 -0
- package/dist/core/userkeys/index.d.ts +11 -0
- package/dist/core/userkeys/index.d.ts.map +1 -0
- package/dist/core/userkeys/index.js +49 -0
- package/dist/core/userkeys/index.js.map +1 -0
- package/dist/core/userkeys/recipients.d.ts +51 -0
- package/dist/core/userkeys/recipients.d.ts.map +1 -0
- package/dist/core/userkeys/recipients.js +292 -0
- package/dist/core/userkeys/recipients.js.map +1 -0
- package/dist/core/userkeys/resolveUserKeyDocument.d.ts +21 -0
- package/dist/core/userkeys/resolveUserKeyDocument.d.ts.map +1 -0
- package/dist/core/userkeys/resolveUserKeyDocument.js +98 -0
- package/dist/core/userkeys/resolveUserKeyDocument.js.map +1 -0
- package/dist/core/userkeys/sealedCrypto.d.ts +21 -0
- package/dist/core/userkeys/sealedCrypto.d.ts.map +1 -0
- package/dist/core/userkeys/sealedCrypto.js +79 -0
- package/dist/core/userkeys/sealedCrypto.js.map +1 -0
- package/dist/core/userkeys/sealedTypes.d.ts +72 -0
- package/dist/core/userkeys/sealedTypes.d.ts.map +1 -0
- package/dist/core/userkeys/sealedTypes.js +14 -0
- package/dist/core/userkeys/sealedTypes.js.map +1 -0
- package/dist/core/userkeys/types.d.ts +70 -0
- package/dist/core/userkeys/types.d.ts.map +1 -0
- package/dist/core/userkeys/types.js +48 -0
- package/dist/core/userkeys/types.js.map +1 -0
- package/dist/core/userkeys/validateUserKeyDocument.d.ts +19 -0
- package/dist/core/userkeys/validateUserKeyDocument.d.ts.map +1 -0
- package/dist/core/userkeys/validateUserKeyDocument.js +42 -0
- package/dist/core/userkeys/validateUserKeyDocument.js.map +1 -0
- package/dist/node/server/CapabilityMatcher.d.ts +5 -0
- package/dist/node/server/CapabilityMatcher.d.ts.map +1 -1
- package/dist/node/server/CapabilityMatcher.js +10 -1
- package/dist/node/server/CapabilityMatcher.js.map +1 -1
- package/dist/node/server/DeviceDiscoveryService.d.ts +36 -0
- package/dist/node/server/DeviceDiscoveryService.d.ts.map +1 -0
- package/dist/node/server/DeviceDiscoveryService.js +165 -0
- package/dist/node/server/DeviceDiscoveryService.js.map +1 -0
- package/dist/node/server/MindooDBServer.d.ts +13 -0
- package/dist/node/server/MindooDBServer.d.ts.map +1 -1
- package/dist/node/server/MindooDBServer.js +99 -61
- package/dist/node/server/MindooDBServer.js.map +1 -1
- package/dist/node/server/SystemAdminAuth.d.ts +7 -0
- package/dist/node/server/SystemAdminAuth.d.ts.map +1 -1
- package/dist/node/server/SystemAdminAuth.js +4 -1
- package/dist/node/server/SystemAdminAuth.js.map +1 -1
- package/dist/node/server/TenantManager.d.ts +29 -0
- package/dist/node/server/TenantManager.d.ts.map +1 -1
- package/dist/node/server/TenantManager.js +146 -7
- package/dist/node/server/TenantManager.js.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CapabilityMatcher.js","sourceRoot":"","sources":["../../../src/node/server/CapabilityMatcher.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;
|
|
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":"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"}
|
|
@@ -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":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,OAAoD,MAAM,SAAS,CAAC;
|
|
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
|
-
|
|
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.
|
|
2011
|
-
//
|
|
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");
|