mindoodb 0.0.84 → 0.0.86
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 +1 -0
- package/README.md +6 -4
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +15 -0
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +75 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.d.ts +9 -1
- package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.js +38 -10
- package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
- package/dist/cloudflare/DurableObjectSql.d.ts +56 -0
- package/dist/cloudflare/DurableObjectSql.d.ts.map +1 -0
- package/dist/cloudflare/DurableObjectSql.js +180 -0
- package/dist/cloudflare/DurableObjectSql.js.map +1 -0
- package/dist/cloudflare/MindooDatabaseObject.d.ts +86 -0
- package/dist/cloudflare/MindooDatabaseObject.d.ts.map +1 -0
- package/dist/cloudflare/MindooDatabaseObject.js +614 -0
- package/dist/cloudflare/MindooDatabaseObject.js.map +1 -0
- package/dist/cloudflare/MindooServerObject.d.ts +63 -0
- package/dist/cloudflare/MindooServerObject.d.ts.map +1 -0
- package/dist/cloudflare/MindooServerObject.js +521 -0
- package/dist/cloudflare/MindooServerObject.js.map +1 -0
- package/dist/cloudflare/WorkersCryptoAdapter.d.ts +7 -0
- package/dist/cloudflare/WorkersCryptoAdapter.d.ts.map +1 -0
- package/dist/cloudflare/WorkersCryptoAdapter.js +14 -0
- package/dist/cloudflare/WorkersCryptoAdapter.js.map +1 -0
- package/dist/cloudflare/host.d.ts +49 -0
- package/dist/cloudflare/host.d.ts.map +1 -0
- package/dist/cloudflare/host.js +104 -0
- package/dist/cloudflare/host.js.map +1 -0
- package/dist/cloudflare/http.d.ts +91 -0
- package/dist/cloudflare/http.d.ts.map +1 -0
- package/dist/cloudflare/http.js +266 -0
- package/dist/cloudflare/http.js.map +1 -0
- package/dist/cloudflare/index.d.ts +12 -0
- package/dist/cloudflare/index.d.ts.map +1 -0
- package/dist/cloudflare/index.js +20 -0
- package/dist/cloudflare/index.js.map +1 -0
- package/dist/cloudflare/storeRpc.d.ts +22 -0
- package/dist/cloudflare/storeRpc.d.ts.map +1 -0
- package/dist/cloudflare/storeRpc.js +85 -0
- package/dist/cloudflare/storeRpc.js.map +1 -0
- package/dist/cloudflare/types.d.ts +101 -0
- package/dist/cloudflare/types.d.ts.map +1 -0
- package/dist/cloudflare/types.js +10 -0
- package/dist/cloudflare/types.js.map +1 -0
- package/dist/cloudflare/worker.d.ts +25 -0
- package/dist/cloudflare/worker.d.ts.map +1 -0
- package/dist/cloudflare/worker.js +170 -0
- package/dist/cloudflare/worker.js.map +1 -0
- package/dist/core/BaseMindooDB.d.ts +43 -1
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +209 -87
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +14 -0
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +46 -0
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts +10 -0
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +79 -8
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/ChangeDocDraft.d.ts +133 -0
- package/dist/core/ChangeDocDraft.d.ts.map +1 -0
- package/dist/core/ChangeDocDraft.js +492 -0
- package/dist/core/ChangeDocDraft.js.map +1 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js +1 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts +8 -0
- package/dist/core/appendonlystores/network/AuthenticationService.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/AuthenticationService.js +19 -0
- package/dist/core/appendonlystores/network/AuthenticationService.js.map +1 -1
- package/dist/core/appendonlystores/network/IrohStreamIO.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/IrohStreamIO.js +3 -23
- package/dist/core/appendonlystores/network/IrohStreamIO.js.map +1 -1
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts +7 -1
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.d.ts +23 -0
- package/dist/core/appendonlystores/network/types.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.js.map +1 -1
- package/dist/core/appendonlystores/rpc/storeRpcCodec.d.ts.map +1 -1
- package/dist/core/appendonlystores/rpc/storeRpcCodec.js +3 -23
- package/dist/core/appendonlystores/rpc/storeRpcCodec.js.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js +21 -30
- package/dist/core/appendonlystores/sqlite/SqliteContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts +37 -1
- package/dist/core/appendonlystores/sqlite/SqliteDriver.d.ts.map +1 -1
- package/dist/core/appendonlystores/sqlite/SqliteDriver.js +99 -40
- package/dist/core/appendonlystores/sqlite/SqliteDriver.js.map +1 -1
- package/dist/core/appendonlystores/syncStores.d.ts.map +1 -1
- package/dist/core/appendonlystores/syncStores.js +253 -168
- package/dist/core/appendonlystores/syncStores.js.map +1 -1
- package/dist/core/appendonlystores/types.d.ts +8 -0
- package/dist/core/appendonlystores/types.d.ts.map +1 -1
- package/dist/core/appendonlystores/types.js.map +1 -1
- package/dist/core/expressions/evaluateExpression.d.ts +8 -0
- package/dist/core/expressions/evaluateExpression.d.ts.map +1 -1
- package/dist/core/expressions/evaluateExpression.js +29 -4
- package/dist/core/expressions/evaluateExpression.js.map +1 -1
- package/dist/core/expressions/metadata.js +4 -4
- package/dist/core/expressions/metadata.js.map +1 -1
- package/dist/core/types.d.ts +61 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/uri/MindooURI.d.ts.map +1 -1
- package/dist/core/uri/MindooURI.js +3 -24
- package/dist/core/uri/MindooURI.js.map +1 -1
- package/dist/core/utils/base64.d.ts +17 -0
- package/dist/core/utils/base64.d.ts.map +1 -0
- package/dist/core/utils/base64.js +54 -0
- package/dist/core/utils/base64.js.map +1 -0
- package/dist/core/utils/idGeneration.d.ts.map +1 -1
- package/dist/core/utils/idGeneration.js +14 -3
- package/dist/core/utils/idGeneration.js.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +1 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -1
- package/dist/node/server/FsServerDataStore.d.ts +23 -0
- package/dist/node/server/FsServerDataStore.d.ts.map +1 -0
- package/dist/node/server/FsServerDataStore.js +59 -0
- package/dist/node/server/FsServerDataStore.js.map +1 -0
- package/dist/node/server/IrohServerEndpoint.d.ts +1 -1
- package/dist/node/server/IrohServerEndpoint.d.ts.map +1 -1
- package/dist/node/server/IrohServerRpc.d.ts +5 -5
- package/dist/node/server/IrohServerRpc.d.ts.map +1 -1
- package/dist/node/server/IrohServerRpc.js +1 -1
- package/dist/node/server/IrohServerRpc.js.map +1 -1
- package/dist/node/server/MindooDBServer.d.ts +29 -150
- package/dist/node/server/MindooDBServer.d.ts.map +1 -1
- package/dist/node/server/MindooDBServer.js +160 -1568
- package/dist/node/server/MindooDBServer.js.map +1 -1
- package/dist/node/server/PurgedDocRegistry.d.ts +4 -27
- package/dist/node/server/PurgedDocRegistry.d.ts.map +1 -1
- package/dist/node/server/PurgedDocRegistry.js +6 -83
- package/dist/node/server/PurgedDocRegistry.js.map +1 -1
- package/dist/node/server/StoreFactory.d.ts +1 -1
- package/dist/node/server/StoreFactory.d.ts.map +1 -1
- package/dist/node/server/TenantManager.d.ts +16 -284
- package/dist/node/server/TenantManager.d.ts.map +1 -1
- package/dist/node/server/TenantManager.js +35 -1168
- package/dist/node/server/TenantManager.js.map +1 -1
- package/dist/node/server/add-to-network.js +1 -1
- package/dist/node/server/add-to-network.js.map +1 -1
- package/dist/node/server/compressionMiddleware.d.ts +14 -0
- package/dist/node/server/compressionMiddleware.d.ts.map +1 -1
- package/dist/node/server/compressionMiddleware.js +46 -3
- package/dist/node/server/compressionMiddleware.js.map +1 -1
- package/dist/node/server/config.d.ts +11 -15
- package/dist/node/server/config.d.ts.map +1 -1
- package/dist/node/server/config.js +30 -245
- package/dist/node/server/config.js.map +1 -1
- package/dist/node/server/expressAdapter.d.ts +23 -0
- package/dist/node/server/expressAdapter.d.ts.map +1 -0
- package/dist/node/server/expressAdapter.js +108 -0
- package/dist/node/server/expressAdapter.js.map +1 -0
- package/dist/node/server/nativeIrohStreamIO.d.ts +1 -1
- package/dist/node/server/nativeIrohStreamIO.d.ts.map +1 -1
- package/dist/node/server/peer/FileClusterAuditStorage.d.ts +16 -0
- package/dist/node/server/peer/FileClusterAuditStorage.d.ts.map +1 -0
- package/dist/node/server/peer/FileClusterAuditStorage.js +39 -0
- package/dist/node/server/peer/FileClusterAuditStorage.js.map +1 -0
- package/dist/node/server/peer/IrohPeerLink.d.ts +1 -1
- package/dist/node/server/peer/IrohPeerLink.d.ts.map +1 -1
- package/dist/node/server/peer/routes.d.ts +10 -44
- package/dist/node/server/peer/routes.d.ts.map +1 -1
- package/dist/node/server/peer/routes.js +33 -275
- package/dist/node/server/peer/routes.js.map +1 -1
- package/dist/node/server/resolveServerPassword.js +1 -1
- package/dist/node/server/resolveServerPassword.js.map +1 -1
- package/dist/node/server/server.js +1 -1
- package/dist/node/server/server.js.map +1 -1
- package/dist/node/server/serverinit.js +1 -1
- package/dist/node/server/serverinit.js.map +1 -1
- package/dist/server/CapabilityMatcher.d.ts +60 -0
- package/dist/server/CapabilityMatcher.d.ts.map +1 -0
- package/dist/server/CapabilityMatcher.js +138 -0
- package/dist/server/CapabilityMatcher.js.map +1 -0
- package/dist/server/DeviceDiscoveryService.d.ts +36 -0
- package/dist/server/DeviceDiscoveryService.d.ts.map +1 -0
- package/dist/server/DeviceDiscoveryService.js +165 -0
- package/dist/server/DeviceDiscoveryService.js.map +1 -0
- package/dist/server/PurgedDocRegistry.d.ts +35 -0
- package/dist/server/PurgedDocRegistry.d.ts.map +1 -0
- package/dist/server/PurgedDocRegistry.js +90 -0
- package/dist/server/PurgedDocRegistry.js.map +1 -0
- package/dist/server/ServerDataStore.d.ts +67 -0
- package/dist/server/ServerDataStore.d.ts.map +1 -0
- package/dist/server/ServerDataStore.js +88 -0
- package/dist/server/ServerDataStore.js.map +1 -0
- package/dist/server/SyncEventBus.d.ts +39 -0
- package/dist/server/SyncEventBus.d.ts.map +1 -0
- package/dist/server/SyncEventBus.js +41 -0
- package/dist/server/SyncEventBus.js.map +1 -0
- package/dist/server/SystemAdminAuth.d.ts +82 -0
- package/dist/server/SystemAdminAuth.d.ts.map +1 -0
- package/dist/server/SystemAdminAuth.js +228 -0
- package/dist/server/SystemAdminAuth.js.map +1 -0
- package/dist/server/TenantManager.d.ts +330 -0
- package/dist/server/TenantManager.d.ts.map +1 -0
- package/dist/server/TenantManager.js +1186 -0
- package/dist/server/TenantManager.js.map +1 -0
- package/dist/server/http/MindooDBServerCore.d.ts +313 -0
- package/dist/server/http/MindooDBServerCore.d.ts.map +1 -0
- package/dist/server/http/MindooDBServerCore.js +1403 -0
- package/dist/server/http/MindooDBServerCore.js.map +1 -0
- package/dist/server/http/types.d.ts +89 -0
- package/dist/server/http/types.d.ts.map +1 -0
- package/dist/server/http/types.js +29 -0
- package/dist/server/http/types.js.map +1 -0
- package/dist/server/index.d.ts +32 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +76 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/peer/ClusterAuditLog.d.ts +71 -0
- package/dist/server/peer/ClusterAuditLog.d.ts.map +1 -0
- package/dist/server/peer/ClusterAuditLog.js +81 -0
- package/dist/server/peer/ClusterAuditLog.js.map +1 -0
- package/dist/server/peer/ClusterJobRunner.d.ts +43 -0
- package/dist/server/peer/ClusterJobRunner.d.ts.map +1 -0
- package/dist/server/peer/ClusterJobRunner.js +119 -0
- package/dist/server/peer/ClusterJobRunner.js.map +1 -0
- package/dist/server/peer/ClusterManager.d.ts +149 -0
- package/dist/server/peer/ClusterManager.d.ts.map +1 -0
- package/dist/server/peer/ClusterManager.js +292 -0
- package/dist/server/peer/ClusterManager.js.map +1 -0
- package/dist/server/peer/PeerAuthService.d.ts +69 -0
- package/dist/server/peer/PeerAuthService.d.ts.map +1 -0
- package/dist/server/peer/PeerAuthService.js +208 -0
- package/dist/server/peer/PeerAuthService.js.map +1 -0
- package/dist/server/peer/PeerReplicator.d.ts +303 -0
- package/dist/server/peer/PeerReplicator.d.ts.map +1 -0
- package/dist/server/peer/PeerReplicator.js +1071 -0
- package/dist/server/peer/PeerReplicator.js.map +1 -0
- package/dist/server/peer/clusterHttp.d.ts +113 -0
- package/dist/server/peer/clusterHttp.d.ts.map +1 -0
- package/dist/server/peer/clusterHttp.js +290 -0
- package/dist/server/peer/clusterHttp.js.map +1 -0
- package/dist/server/peer/types.d.ts +244 -0
- package/dist/server/peer/types.d.ts.map +1 -0
- package/dist/server/peer/types.js +189 -0
- package/dist/server/peer/types.js.map +1 -0
- package/dist/server/rateLimits.d.ts +119 -0
- package/dist/server/rateLimits.d.ts.map +1 -0
- package/dist/server/rateLimits.js +159 -0
- package/dist/server/rateLimits.js.map +1 -0
- package/dist/server/serverConfig.d.ts +37 -0
- package/dist/server/serverConfig.d.ts.map +1 -0
- package/dist/server/serverConfig.js +251 -0
- package/dist/server/serverConfig.js.map +1 -0
- package/dist/server/timestampProxy.d.ts +129 -0
- package/dist/server/timestampProxy.d.ts.map +1 -0
- package/dist/server/timestampProxy.js +361 -0
- package/dist/server/timestampProxy.js.map +1 -0
- package/dist/server/types.d.ts +267 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +56 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server/validation.d.ts +43 -0
- package/dist/server/validation.d.ts.map +1 -0
- package/dist/server/validation.js +104 -0
- package/dist/server/validation.js.map +1 -0
- package/package.json +9 -1
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BaseMindooTenantDirectory = void 0;
|
|
4
4
|
const types_1 = require("./types");
|
|
5
|
+
const errors_1 = require("./errors");
|
|
5
6
|
const timeSource_1 = require("./utils/timeSource");
|
|
6
7
|
const singleFlight_1 = require("./utils/singleFlight");
|
|
7
8
|
const logging_1 = require("./logging");
|
|
@@ -20,6 +21,48 @@ const MAX_UNKNOWN_KEYS_TRACKED = 1000;
|
|
|
20
21
|
function unionStrings(existing, added) {
|
|
21
22
|
return Array.from(new Set([...existing, ...added]));
|
|
22
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Grant documents by `username_hash`, maintained by the unified cache pass.
|
|
26
|
+
* Keeps ids only, never documents, so its size is independent of the
|
|
27
|
+
* document cache.
|
|
28
|
+
*/
|
|
29
|
+
class GrantDocumentIndex {
|
|
30
|
+
constructor() {
|
|
31
|
+
this.idsByHash = new Map();
|
|
32
|
+
/** id -> hash and position in modification order (grows on every re-seen change). */
|
|
33
|
+
this.entries = new Map();
|
|
34
|
+
this.nextOrder = 0;
|
|
35
|
+
}
|
|
36
|
+
/** Latest state of a document: its `username_hash` if it is a grant, else undefined. */
|
|
37
|
+
record(docId, usernameHash) {
|
|
38
|
+
const previous = this.entries.get(docId);
|
|
39
|
+
if (previous) {
|
|
40
|
+
this.entries.delete(docId);
|
|
41
|
+
const ids = this.idsByHash.get(previous.hash);
|
|
42
|
+
ids?.delete(docId);
|
|
43
|
+
if (ids && ids.size === 0)
|
|
44
|
+
this.idsByHash.delete(previous.hash);
|
|
45
|
+
}
|
|
46
|
+
if (typeof usernameHash !== "string")
|
|
47
|
+
return;
|
|
48
|
+
this.entries.set(docId, { hash: usernameHash, order: this.nextOrder++ });
|
|
49
|
+
let ids = this.idsByHash.get(usernameHash);
|
|
50
|
+
if (!ids) {
|
|
51
|
+
ids = new Set();
|
|
52
|
+
this.idsByHash.set(usernameHash, ids);
|
|
53
|
+
}
|
|
54
|
+
ids.add(docId);
|
|
55
|
+
}
|
|
56
|
+
/** Ids of the grants carrying any of `hashes`, oldest change first. */
|
|
57
|
+
docIdsFor(hashes) {
|
|
58
|
+
const ids = [];
|
|
59
|
+
for (const hash of hashes) {
|
|
60
|
+
for (const id of this.idsByHash.get(hash) ?? [])
|
|
61
|
+
ids.push(id);
|
|
62
|
+
}
|
|
63
|
+
return ids.sort((a, b) => this.entries.get(a).order - this.entries.get(b).order);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
23
66
|
class BaseMindooTenantDirectory {
|
|
24
67
|
constructor(tenant, logger) {
|
|
25
68
|
this.directoryDB = null;
|
|
@@ -33,6 +76,13 @@ class BaseMindooTenantDirectory {
|
|
|
33
76
|
// (docs/accesscontrol.md §6.5), so the set of trusted keys is recomputed as
|
|
34
77
|
// the union of all grant documents' current key arrays after each cache pass.
|
|
35
78
|
this.grantDocIdToSigningKeys = new Map();
|
|
79
|
+
// Index of grant documents: `username_hash` -> ids of the (non-deleted,
|
|
80
|
+
// readable) grant documents carrying it, plus each id's position in
|
|
81
|
+
// modification order. findGrantAccessDocuments loads only the documents
|
|
82
|
+
// it returns instead of re-scanning the whole directory: the token check
|
|
83
|
+
// runs it on every sync request, and with more grants than the document
|
|
84
|
+
// cache holds the scan rebuilt every grant from its changes each time.
|
|
85
|
+
this.grantIndex = new GrantDocumentIndex();
|
|
36
86
|
// Best-effort reverse lookup cache for public signing key -> user details.
|
|
37
87
|
// Entries remain available even after revocation so historical UIs can still show identity labels.
|
|
38
88
|
this.userLookupCache = new Map();
|
|
@@ -141,7 +191,19 @@ class BaseMindooTenantDirectory {
|
|
|
141
191
|
}
|
|
142
192
|
return this.directoryDB;
|
|
143
193
|
}
|
|
194
|
+
async registerUsers(users, administrationPrivateKey, administrationPrivateKeyPassword) {
|
|
195
|
+
await this.tenant.withDecryptedKeyReuse(async () => {
|
|
196
|
+
for (const user of users) {
|
|
197
|
+
await this.registerUserWithKeyReuse(user.userId, administrationPrivateKey, administrationPrivateKeyPassword, user.userDetails, user.label, user.options);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
144
201
|
async registerUser(userId, administrationPrivateKey, administrationPrivateKeyPassword, userDetails, label, options) {
|
|
202
|
+
// One registration signs several directory changes and key distributions
|
|
203
|
+
// with the administration key; decrypt it once instead of for each.
|
|
204
|
+
await this.tenant.withDecryptedKeyReuse(() => this.registerUserWithKeyReuse(userId, administrationPrivateKey, administrationPrivateKeyPassword, userDetails, label, options));
|
|
205
|
+
}
|
|
206
|
+
async registerUserWithKeyReuse(userId, administrationPrivateKey, administrationPrivateKeyPassword, userDetails, label, options) {
|
|
145
207
|
this.logger.info(`Registering user: ${userId.username}`);
|
|
146
208
|
// Check if user with same username (case-insensitive) already has ACTIVE
|
|
147
209
|
// access. A grant whose keys were removed (revocation, §6.5) is ignored
|
|
@@ -350,22 +412,26 @@ class BaseMindooTenantDirectory {
|
|
|
350
412
|
// identity round-trips: a cleartext name never collides with a 64-char hex
|
|
351
413
|
// hash, so this is safe (docs/accesscontrol.md §6.5).
|
|
352
414
|
targetHashes.add(username);
|
|
353
|
-
const matchesTarget = (value) => typeof value === "string" && targetHashes.has(value);
|
|
354
415
|
const matchingDocs = [];
|
|
355
|
-
//
|
|
416
|
+
// The unified cache pass above indexed the grant documents by
|
|
417
|
+
// username_hash; only the matches are loaded, oldest first as the former
|
|
418
|
+
// full scan returned them.
|
|
356
419
|
// No signature verification needed - DB already enforces admin-only.
|
|
357
420
|
// Revocation no longer uses a separate document: it removes keys from the
|
|
358
421
|
// grant document in place (docs/accesscontrol.md §6.5). A fully-revoked user
|
|
359
422
|
// therefore still has a grant document here, but with empty key arrays.
|
|
360
423
|
// Callers that need "active access" should inspect the key arrays (see
|
|
361
424
|
// {@link isUserRevoked} / {@link getUserPublicKeys}).
|
|
362
|
-
for
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
data.type === "grantaccess" &&
|
|
366
|
-
matchesTarget(data.username_hash)) {
|
|
425
|
+
for (const docId of this.grantIndex.docIdsFor(targetHashes)) {
|
|
426
|
+
try {
|
|
427
|
+
matchingDocs.push(await directoryDB.getDocument(docId));
|
|
367
428
|
this.logger.debug(`Found grant access document for username: ${username}`);
|
|
368
|
-
|
|
429
|
+
}
|
|
430
|
+
catch (error) {
|
|
431
|
+
// Deleted since the cache pass: no longer a grant, as for the scan.
|
|
432
|
+
if (!(error instanceof errors_1.DocumentDeletedError) && !(error instanceof errors_1.DocumentNotFoundError)) {
|
|
433
|
+
throw error;
|
|
434
|
+
}
|
|
369
435
|
}
|
|
370
436
|
}
|
|
371
437
|
this.logger.debug(`Found ${matchingDocs.length} grant access document(s) for username: ${username}`);
|
|
@@ -594,6 +660,7 @@ class BaseMindooTenantDirectory {
|
|
|
594
660
|
// are idempotent) instead of leaving its documents half-applied.
|
|
595
661
|
const fullRebuild = startCursor === null;
|
|
596
662
|
const grantDocIdToSigningKeys = fullRebuild ? new Map() : this.grantDocIdToSigningKeys;
|
|
663
|
+
const grantIndex = fullRebuild ? new GrantDocumentIndex() : this.grantIndex;
|
|
597
664
|
const userLookupCache = fullRebuild ? new Map() : this.userLookupCache;
|
|
598
665
|
const wipeKeyToGrantDocId = fullRebuild ? new Map() : this.wipeKeyToGrantDocId;
|
|
599
666
|
let tenantSettingsCache = fullRebuild ? null : this.tenantSettingsCache;
|
|
@@ -616,6 +683,9 @@ class BaseMindooTenantDirectory {
|
|
|
616
683
|
// Process changes (documents are returned in order by lastModified, oldest to newest)
|
|
617
684
|
for await (const { doc, cursor } of directoryDB.iterateChangesSince(startCursor)) {
|
|
618
685
|
const data = doc.getData();
|
|
686
|
+
// Deleted and unreadable documents arrive as tombstones with empty
|
|
687
|
+
// data and drop out, as they never matched the former full scan.
|
|
688
|
+
grantIndex.record(doc.getId(), data.form === "useroperation" && data.type === "grantaccess" ? data.username_hash : undefined);
|
|
619
689
|
// Process user operation documents (grant/revoke access)
|
|
620
690
|
if (data.form === "useroperation") {
|
|
621
691
|
// Check if this is a grant access document. A grant may carry MULTIPLE
|
|
@@ -813,6 +883,7 @@ class BaseMindooTenantDirectory {
|
|
|
813
883
|
}
|
|
814
884
|
this.trustedKeysCache = trustedKeysCache;
|
|
815
885
|
this.grantDocIdToSigningKeys = grantDocIdToSigningKeys;
|
|
886
|
+
this.grantIndex = grantIndex;
|
|
816
887
|
this.userLookupCache = userLookupCache;
|
|
817
888
|
this.wipeKeyToGrantDocId = wipeKeyToGrantDocId;
|
|
818
889
|
this.tenantSettingsCache = tenantSettingsCache;
|