mindoodb 0.0.3 → 0.0.4
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 +1001 -0
- package/README.md +14 -26
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts +19 -0
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js +58 -5
- package/dist/appendonlystores/network/ClientNetworkContentAddressedStore.js.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.d.ts +4 -0
- package/dist/appendonlystores/network/HttpTransport.d.ts.map +1 -1
- package/dist/appendonlystores/network/HttpTransport.js +43 -0
- package/dist/appendonlystores/network/HttpTransport.js.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts +3 -0
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.d.ts.map +1 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js +15 -1
- package/dist/appendonlystores/network/ServerNetworkContentAddressedStore.js.map +1 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts +5 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.d.ts.map +1 -1
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js +59 -3
- package/dist/browser/appendonlystores/IndexedDBContentAddressedStore.js.map +1 -1
- package/dist/browser/cache/IndexedDBLocalCacheStore.d.ts +21 -0
- package/dist/browser/cache/IndexedDBLocalCacheStore.d.ts.map +1 -0
- package/dist/browser/cache/IndexedDBLocalCacheStore.js +106 -0
- package/dist/browser/cache/IndexedDBLocalCacheStore.js.map +1 -0
- package/dist/browser/index.d.ts +3 -0
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +9 -1
- package/dist/browser/index.js.map +1 -1
- package/dist/core/BaseMindooDB.d.ts +103 -13
- package/dist/core/BaseMindooDB.d.ts.map +1 -1
- package/dist/core/BaseMindooDB.js +1066 -205
- package/dist/core/BaseMindooDB.js.map +1 -1
- package/dist/core/BaseMindooTenant.d.ts +30 -1
- package/dist/core/BaseMindooTenant.d.ts.map +1 -1
- package/dist/core/BaseMindooTenant.js +143 -108
- package/dist/core/BaseMindooTenant.js.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.d.ts +13 -10
- package/dist/core/BaseMindooTenantDirectory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantDirectory.js +134 -27
- package/dist/core/BaseMindooTenantDirectory.js.map +1 -1
- package/dist/core/BaseMindooTenantFactory.d.ts +5 -1
- package/dist/core/BaseMindooTenantFactory.d.ts.map +1 -1
- package/dist/core/BaseMindooTenantFactory.js +46 -69
- package/dist/core/BaseMindooTenantFactory.js.map +1 -1
- package/dist/core/MindooDBServerAdmin.d.ts +238 -0
- package/dist/core/MindooDBServerAdmin.d.ts.map +1 -0
- package/dist/core/MindooDBServerAdmin.js +345 -0
- package/dist/core/MindooDBServerAdmin.js.map +1 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts +3 -1
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.d.ts.map +1 -1
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js +22 -0
- package/dist/core/appendonlystores/InMemoryContentAddressedStore.js.map +1 -1
- package/dist/core/appendonlystores/MaterializationPlanner.d.ts +49 -0
- package/dist/core/appendonlystores/MaterializationPlanner.d.ts.map +1 -0
- package/dist/core/appendonlystores/MaterializationPlanner.js +325 -0
- package/dist/core/appendonlystores/MaterializationPlanner.js.map +1 -0
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts +15 -0
- package/dist/core/appendonlystores/network/NetworkTransport.d.ts.map +1 -1
- package/dist/core/appendonlystores/network/types.d.ts +2 -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/types.d.ts +83 -0
- package/dist/core/appendonlystores/types.d.ts.map +1 -1
- package/dist/core/cache/CacheManager.d.ts +75 -0
- package/dist/core/cache/CacheManager.d.ts.map +1 -0
- package/dist/core/cache/CacheManager.js +101 -0
- package/dist/core/cache/CacheManager.js.map +1 -0
- package/dist/core/cache/EncryptedLocalCacheStore.d.ts +41 -0
- package/dist/core/cache/EncryptedLocalCacheStore.d.ts.map +1 -0
- package/dist/core/cache/EncryptedLocalCacheStore.js +120 -0
- package/dist/core/cache/EncryptedLocalCacheStore.js.map +1 -0
- package/dist/core/cache/LocalCacheStore.d.ts +50 -0
- package/dist/core/cache/LocalCacheStore.d.ts.map +1 -0
- package/dist/core/cache/LocalCacheStore.js +39 -0
- package/dist/core/cache/LocalCacheStore.js.map +1 -0
- package/dist/core/crypto/privateKeyEncryption.d.ts +5 -0
- package/dist/core/crypto/privateKeyEncryption.d.ts.map +1 -0
- package/dist/core/crypto/privateKeyEncryption.js +87 -0
- package/dist/core/crypto/privateKeyEncryption.js.map +1 -0
- package/dist/core/index.d.ts +13 -6
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +13 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts +4 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js +39 -11
- package/dist/core/indexing/virtualviews/MindooDBVirtualViewDataProvider.js.map +1 -1
- package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.d.ts +1 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.js +3 -0
- package/dist/core/indexing/virtualviews/ViewEntrySortKeyComparator.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualView.d.ts +43 -0
- package/dist/core/indexing/virtualviews/VirtualView.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualView.js +173 -0
- package/dist/core/indexing/virtualviews/VirtualView.js.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts +7 -0
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.d.ts.map +1 -1
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js +28 -0
- package/dist/core/indexing/virtualviews/VirtualViewEntryData.js.map +1 -1
- package/dist/core/keys/KeyBag.d.ts +38 -14
- package/dist/core/keys/KeyBag.d.ts.map +1 -1
- package/dist/core/keys/KeyBag.js +102 -76
- package/dist/core/keys/KeyBag.js.map +1 -1
- package/dist/core/keys/KeyContext.d.ts +3 -3
- package/dist/core/keys/KeyContext.d.ts.map +1 -1
- package/dist/core/keys/KeyContext.js +10 -4
- package/dist/core/keys/KeyContext.js.map +1 -1
- package/dist/core/types.d.ts +305 -21
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +7 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/utils/idGeneration.d.ts.map +1 -1
- package/dist/core/utils/idGeneration.js +37 -3
- package/dist/core/utils/idGeneration.js.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts +4 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.d.ts.map +1 -1
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js +24 -0
- package/dist/node/appendonlystores/BasicOnDiskContentAddressedStore.js.map +1 -1
- package/dist/node/attachments/writeAttachmentToFile.d.ts +15 -0
- package/dist/node/attachments/writeAttachmentToFile.d.ts.map +1 -0
- package/dist/node/attachments/writeAttachmentToFile.js +73 -0
- package/dist/node/attachments/writeAttachmentToFile.js.map +1 -0
- package/dist/node/cache/FileSystemLocalCacheStore.d.ts +17 -0
- package/dist/node/cache/FileSystemLocalCacheStore.d.ts.map +1 -0
- package/dist/node/cache/FileSystemLocalCacheStore.js +128 -0
- package/dist/node/cache/FileSystemLocalCacheStore.js.map +1 -0
- package/dist/node/cli/change-identity-password.d.ts +7 -0
- package/dist/node/cli/change-identity-password.d.ts.map +1 -0
- package/dist/node/cli/change-identity-password.js +67 -0
- package/dist/node/cli/change-identity-password.js.map +1 -0
- package/dist/node/cli/cli-utils.d.ts +16 -0
- package/dist/node/cli/cli-utils.d.ts.map +1 -0
- package/dist/node/cli/cli-utils.js +113 -0
- package/dist/node/cli/cli-utils.js.map +1 -0
- package/dist/node/cli/identity-export-public.d.ts +4 -0
- package/dist/node/cli/identity-export-public.d.ts.map +1 -0
- package/dist/node/cli/identity-export-public.js +55 -0
- package/dist/node/cli/identity-export-public.js.map +1 -0
- package/dist/node/cli/identity-info.d.ts +4 -0
- package/dist/node/cli/identity-info.d.ts.map +1 -0
- package/dist/node/cli/identity-info.js +57 -0
- package/dist/node/cli/identity-info.js.map +1 -0
- package/dist/node/index.d.ts +1 -0
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +4 -1
- package/dist/node/index.js.map +1 -1
- package/dist/node/server/CapabilityMatcher.d.ts +45 -0
- package/dist/node/server/CapabilityMatcher.d.ts.map +1 -0
- package/dist/node/server/CapabilityMatcher.js +117 -0
- package/dist/node/server/CapabilityMatcher.js.map +1 -0
- package/dist/node/server/MindooDBServer.d.ts +87 -0
- package/dist/node/server/MindooDBServer.d.ts.map +1 -0
- package/dist/node/server/MindooDBServer.js +1040 -0
- package/dist/node/server/MindooDBServer.js.map +1 -0
- package/dist/node/server/ServerSync.d.ts +41 -0
- package/dist/node/server/ServerSync.d.ts.map +1 -0
- package/dist/node/server/ServerSync.js +187 -0
- package/dist/node/server/ServerSync.js.map +1 -0
- package/dist/node/server/StoreFactory.d.ts +45 -0
- package/dist/node/server/StoreFactory.d.ts.map +1 -0
- package/dist/node/server/StoreFactory.js +89 -0
- package/dist/node/server/StoreFactory.js.map +1 -0
- package/dist/node/server/SystemAdminAuth.d.ts +65 -0
- package/dist/node/server/SystemAdminAuth.d.ts.map +1 -0
- package/dist/node/server/SystemAdminAuth.js +200 -0
- package/dist/node/server/SystemAdminAuth.js.map +1 -0
- package/dist/node/server/SystemIpAllowlist.d.ts +21 -0
- package/dist/node/server/SystemIpAllowlist.d.ts.map +1 -0
- package/dist/node/server/SystemIpAllowlist.js +210 -0
- package/dist/node/server/SystemIpAllowlist.js.map +1 -0
- package/dist/node/server/TenantManager.d.ts +85 -0
- package/dist/node/server/TenantManager.d.ts.map +1 -0
- package/dist/node/server/TenantManager.js +493 -0
- package/dist/node/server/TenantManager.js.map +1 -0
- package/dist/node/server/add-to-network.d.ts +20 -0
- package/dist/node/server/add-to-network.d.ts.map +1 -0
- package/dist/node/server/add-to-network.js +275 -0
- package/dist/node/server/add-to-network.js.map +1 -0
- package/dist/node/server/config.d.ts +51 -0
- package/dist/node/server/config.d.ts.map +1 -0
- package/dist/node/server/config.js +218 -0
- package/dist/node/server/config.js.map +1 -0
- package/dist/node/server/resolveServerPassword.d.ts +7 -0
- package/dist/node/server/resolveServerPassword.d.ts.map +1 -0
- package/dist/node/server/resolveServerPassword.js +25 -0
- package/dist/node/server/resolveServerPassword.js.map +1 -0
- package/dist/node/server/server.d.ts +22 -0
- package/dist/node/server/server.d.ts.map +1 -0
- package/dist/node/server/server.js +225 -0
- package/dist/node/server/server.js.map +1 -0
- package/dist/node/server/serverinit.d.ts +21 -0
- package/dist/node/server/serverinit.d.ts.map +1 -0
- package/dist/node/server/serverinit.js +317 -0
- package/dist/node/server/serverinit.js.map +1 -0
- package/dist/node/server/types.d.ts +162 -0
- package/dist/node/server/types.d.ts.map +1 -0
- package/dist/node/server/types.js +24 -0
- package/dist/node/server/types.js.map +1 -0
- package/dist/node/server/validation.d.ts +47 -0
- package/dist/node/server/validation.d.ts.map +1 -0
- package/dist/node/server/validation.js +114 -0
- package/dist/node/server/validation.js.map +1 -0
- package/dist/reactnative/cache/MMKVLocalCacheStore.d.ts +48 -0
- package/dist/reactnative/cache/MMKVLocalCacheStore.d.ts.map +1 -0
- package/dist/reactnative/cache/MMKVLocalCacheStore.js +113 -0
- package/dist/reactnative/cache/MMKVLocalCacheStore.js.map +1 -0
- package/dist/reactnative/index.d.ts +1 -0
- package/dist/reactnative/index.d.ts.map +1 -1
- package/dist/reactnative/index.js +4 -1
- package/dist/reactnative/index.js.map +1 -1
- package/package.json +14 -3
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* MindooDB Add-to-Network CLI
|
|
5
|
+
*
|
|
6
|
+
* Exchanges trusted-server public keys between a new server and existing servers
|
|
7
|
+
* using `/system/trusted-servers` with JWT auth (same system admin identity on each server).
|
|
8
|
+
*
|
|
9
|
+
* Password: MINDOODB_SYSTEM_ADMIN_PASSWORD, --password-file, or TTY prompt (hidden).
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.parseArgs = parseArgs;
|
|
13
|
+
const fs_1 = require("fs");
|
|
14
|
+
const MindooDBServerAdmin_1 = require("../../core/MindooDBServerAdmin");
|
|
15
|
+
const NodeCryptoAdapter_1 = require("../crypto/NodeCryptoAdapter");
|
|
16
|
+
const ENV_PASSWORD = "MINDOODB_SYSTEM_ADMIN_PASSWORD";
|
|
17
|
+
/** Exported for tests. */
|
|
18
|
+
function parseArgs(args) {
|
|
19
|
+
const options = {
|
|
20
|
+
newServer: "",
|
|
21
|
+
servers: [],
|
|
22
|
+
identityPath: "",
|
|
23
|
+
passwordFile: "",
|
|
24
|
+
help: false,
|
|
25
|
+
};
|
|
26
|
+
for (let i = 0; i < args.length; i++) {
|
|
27
|
+
const arg = args[i];
|
|
28
|
+
const nextArg = args[i + 1];
|
|
29
|
+
switch (arg) {
|
|
30
|
+
case "--new-server":
|
|
31
|
+
if (nextArg) {
|
|
32
|
+
options.newServer = nextArg.replace(/\/+$/, "");
|
|
33
|
+
i++;
|
|
34
|
+
}
|
|
35
|
+
break;
|
|
36
|
+
case "--servers":
|
|
37
|
+
if (nextArg) {
|
|
38
|
+
options.servers = nextArg.split(",").map((s) => s.trim().replace(/\/+$/, ""));
|
|
39
|
+
i++;
|
|
40
|
+
}
|
|
41
|
+
break;
|
|
42
|
+
case "--identity":
|
|
43
|
+
if (nextArg) {
|
|
44
|
+
options.identityPath = nextArg;
|
|
45
|
+
i++;
|
|
46
|
+
}
|
|
47
|
+
break;
|
|
48
|
+
case "--password-file":
|
|
49
|
+
if (nextArg) {
|
|
50
|
+
options.passwordFile = nextArg;
|
|
51
|
+
i++;
|
|
52
|
+
}
|
|
53
|
+
break;
|
|
54
|
+
case "-h":
|
|
55
|
+
case "--help":
|
|
56
|
+
options.help = true;
|
|
57
|
+
break;
|
|
58
|
+
default:
|
|
59
|
+
if (arg.startsWith("-")) {
|
|
60
|
+
console.error(`Unknown option: ${arg}`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return options;
|
|
66
|
+
}
|
|
67
|
+
function showHelp() {
|
|
68
|
+
console.log(`
|
|
69
|
+
MindooDB Add-to-Network
|
|
70
|
+
|
|
71
|
+
Adds a new server to an existing network by exchanging trust between all servers.
|
|
72
|
+
Uses /system/trusted-servers with JWT (same system admin identity must be authorized on every server).
|
|
73
|
+
|
|
74
|
+
Usage:
|
|
75
|
+
npm run server:add-to-network -- [options]
|
|
76
|
+
|
|
77
|
+
Options:
|
|
78
|
+
--new-server <url> URL of the server being added (required)
|
|
79
|
+
--servers <url,url,...> Comma-separated URLs of existing servers (required)
|
|
80
|
+
--identity <path> System admin *.identity.json (PrivateUserId) (required)
|
|
81
|
+
--password-file <path> Read password from file (optional if env or TTY)
|
|
82
|
+
-h, --help Show this help message
|
|
83
|
+
|
|
84
|
+
Password (first match wins):
|
|
85
|
+
${ENV_PASSWORD} environment variable
|
|
86
|
+
--password-file file containing one line (trimmed)
|
|
87
|
+
TTY hidden prompt on interactive terminal
|
|
88
|
+
|
|
89
|
+
Example:
|
|
90
|
+
npm run server:add-to-network -- \\
|
|
91
|
+
--new-server https://server4.example.com \\
|
|
92
|
+
--servers https://s1.example.com,https://s2.example.com \\
|
|
93
|
+
--identity ./system-admin.identity.json
|
|
94
|
+
`);
|
|
95
|
+
}
|
|
96
|
+
function loadIdentity(path) {
|
|
97
|
+
const raw = (0, fs_1.readFileSync)(path, "utf8");
|
|
98
|
+
const parsed = JSON.parse(raw);
|
|
99
|
+
if (!parsed?.username || !parsed?.userSigningKeyPair?.publicKey) {
|
|
100
|
+
throw new Error(`Invalid identity file: ${path}`);
|
|
101
|
+
}
|
|
102
|
+
return parsed;
|
|
103
|
+
}
|
|
104
|
+
async function resolvePassword(passwordFile) {
|
|
105
|
+
const fromEnv = process.env[ENV_PASSWORD];
|
|
106
|
+
if (fromEnv !== undefined && fromEnv.length > 0) {
|
|
107
|
+
return fromEnv;
|
|
108
|
+
}
|
|
109
|
+
if (passwordFile) {
|
|
110
|
+
return (0, fs_1.readFileSync)(passwordFile, "utf8").replace(/\r?\n$/, "");
|
|
111
|
+
}
|
|
112
|
+
if (process.stdin.isTTY) {
|
|
113
|
+
return readPasswordHidden("System admin password: ");
|
|
114
|
+
}
|
|
115
|
+
console.error(`Error: Set ${ENV_PASSWORD}, use --password-file, or run from an interactive terminal.`);
|
|
116
|
+
process.exit(1);
|
|
117
|
+
}
|
|
118
|
+
/** Hidden password on TTY (no echo). */
|
|
119
|
+
function readPasswordHidden(prompt) {
|
|
120
|
+
return new Promise((resolve, reject) => {
|
|
121
|
+
const stdin = process.stdin;
|
|
122
|
+
const stdout = process.stdout;
|
|
123
|
+
if (!stdin.isTTY) {
|
|
124
|
+
reject(new Error("Internal: readPasswordHidden without TTY"));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
stdout.write(prompt);
|
|
128
|
+
stdin.setRawMode(true);
|
|
129
|
+
stdin.resume();
|
|
130
|
+
stdin.setEncoding("utf8");
|
|
131
|
+
let pass = "";
|
|
132
|
+
const onData = (key) => {
|
|
133
|
+
if (key === "\n" || key === "\r" || key === "\u0004") {
|
|
134
|
+
stdin.setRawMode(false);
|
|
135
|
+
stdin.removeListener("data", onData);
|
|
136
|
+
stdin.pause();
|
|
137
|
+
stdout.write("\n");
|
|
138
|
+
resolve(pass);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
if (key === "\u0003") {
|
|
142
|
+
stdin.setRawMode(false);
|
|
143
|
+
process.exit(130);
|
|
144
|
+
}
|
|
145
|
+
if (key === "\u007f" || key === "\b") {
|
|
146
|
+
pass = pass.slice(0, -1);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (key.length === 1)
|
|
150
|
+
pass += key;
|
|
151
|
+
};
|
|
152
|
+
stdin.on("data", onData);
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
async function fetchServerInfo(serverUrl) {
|
|
156
|
+
const url = `${serverUrl}/.well-known/mindoodb-server-info`;
|
|
157
|
+
console.log(` Fetching server info from ${url}`);
|
|
158
|
+
const response = await fetch(url);
|
|
159
|
+
const body = await response.json().catch(() => ({}));
|
|
160
|
+
if (!response.ok) {
|
|
161
|
+
throw new Error(`Failed to fetch server info from ${serverUrl}: HTTP ${response.status} — ${JSON.stringify(body)}`);
|
|
162
|
+
}
|
|
163
|
+
const info = body;
|
|
164
|
+
if (!info.name || !info.signingPublicKey || !info.encryptionPublicKey) {
|
|
165
|
+
throw new Error(`Invalid server info response from ${serverUrl}`);
|
|
166
|
+
}
|
|
167
|
+
return info;
|
|
168
|
+
}
|
|
169
|
+
function createAdmin(baseUrl, identity, password) {
|
|
170
|
+
return new MindooDBServerAdmin_1.MindooDBServerAdmin({
|
|
171
|
+
serverUrl: baseUrl,
|
|
172
|
+
systemAdminUser: identity,
|
|
173
|
+
systemAdminPassword: password,
|
|
174
|
+
cryptoAdapter: new NodeCryptoAdapter_1.NodeCryptoAdapter(),
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
async function addTrustedServer(targetUrl, serverInfo, identity, password) {
|
|
178
|
+
const admin = createAdmin(targetUrl, identity, password);
|
|
179
|
+
try {
|
|
180
|
+
await admin.addTrustedServer({
|
|
181
|
+
name: serverInfo.name,
|
|
182
|
+
signingPublicKey: serverInfo.signingPublicKey,
|
|
183
|
+
encryptionPublicKey: serverInfo.encryptionPublicKey,
|
|
184
|
+
});
|
|
185
|
+
console.log(` Added "${serverInfo.name}" to ${targetUrl}`);
|
|
186
|
+
}
|
|
187
|
+
catch (e) {
|
|
188
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
189
|
+
if (msg.includes("409") || /already exists/i.test(msg)) {
|
|
190
|
+
console.log(` "${serverInfo.name}" already trusted on ${targetUrl} (skipped)`);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
throw e;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
async function main() {
|
|
197
|
+
const args = process.argv.slice(2);
|
|
198
|
+
const options = parseArgs(args);
|
|
199
|
+
if (options.help) {
|
|
200
|
+
showHelp();
|
|
201
|
+
process.exit(0);
|
|
202
|
+
}
|
|
203
|
+
if (!options.newServer) {
|
|
204
|
+
console.error("Error: --new-server is required. Use --help for usage.");
|
|
205
|
+
process.exit(1);
|
|
206
|
+
}
|
|
207
|
+
if (options.servers.length === 0) {
|
|
208
|
+
console.error("Error: --servers is required. Use --help for usage.");
|
|
209
|
+
process.exit(1);
|
|
210
|
+
}
|
|
211
|
+
if (!options.identityPath) {
|
|
212
|
+
console.error("Error: --identity is required. Use --help for usage.");
|
|
213
|
+
process.exit(1);
|
|
214
|
+
}
|
|
215
|
+
const identity = loadIdentity(options.identityPath);
|
|
216
|
+
const password = await resolvePassword(options.passwordFile);
|
|
217
|
+
if (!password) {
|
|
218
|
+
console.error("Error: system admin password is empty.");
|
|
219
|
+
process.exit(1);
|
|
220
|
+
}
|
|
221
|
+
console.log("=".repeat(60));
|
|
222
|
+
console.log("MindooDB Add-to-Network");
|
|
223
|
+
console.log("=".repeat(60));
|
|
224
|
+
console.log(`New server: ${options.newServer}`);
|
|
225
|
+
console.log(`Existing servers: ${options.servers.join(", ")}`);
|
|
226
|
+
console.log(`Identity: ${options.identityPath}`);
|
|
227
|
+
console.log("=".repeat(60));
|
|
228
|
+
console.log("\n[1/3] Fetching new server identity...");
|
|
229
|
+
const newServerInfo = await fetchServerInfo(options.newServer);
|
|
230
|
+
console.log(` Server name: ${newServerInfo.name}\n`);
|
|
231
|
+
console.log("[2/3] Exchanging trust with existing servers...");
|
|
232
|
+
let successCount = 0;
|
|
233
|
+
const errors = [];
|
|
234
|
+
for (const existingUrl of options.servers) {
|
|
235
|
+
try {
|
|
236
|
+
console.log(`\n --- ${existingUrl} ---`);
|
|
237
|
+
const existingInfo = await fetchServerInfo(existingUrl);
|
|
238
|
+
console.log(` Server name: ${existingInfo.name}`);
|
|
239
|
+
await addTrustedServer(existingUrl, newServerInfo, identity, password);
|
|
240
|
+
await addTrustedServer(options.newServer, existingInfo, identity, password);
|
|
241
|
+
successCount++;
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
245
|
+
console.error(` ERROR: ${msg}`);
|
|
246
|
+
errors.push(`${existingUrl}: ${msg}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
console.log("\n" + "=".repeat(60));
|
|
250
|
+
console.log("[3/3] Summary");
|
|
251
|
+
console.log("=".repeat(60));
|
|
252
|
+
console.log(`Trust established with ${successCount}/${options.servers.length} servers.`);
|
|
253
|
+
if (errors.length > 0) {
|
|
254
|
+
console.log(`\nErrors (${errors.length}):`);
|
|
255
|
+
for (const err of errors) {
|
|
256
|
+
console.log(` - ${err}`);
|
|
257
|
+
}
|
|
258
|
+
process.exit(1);
|
|
259
|
+
}
|
|
260
|
+
console.log(`\n${newServerInfo.name} is now part of the network.`);
|
|
261
|
+
console.log("Next step: configure per-tenant sync via POST /system/tenants/:tenantId/sync-servers (see README-server.md).");
|
|
262
|
+
}
|
|
263
|
+
function isDirectExecution() {
|
|
264
|
+
const entry = process.argv[1];
|
|
265
|
+
if (!entry)
|
|
266
|
+
return false;
|
|
267
|
+
return /[/\\]add-to-network\.(ts|js|mjs|cjs)$/.test(entry);
|
|
268
|
+
}
|
|
269
|
+
if (isDirectExecution()) {
|
|
270
|
+
main().catch((error) => {
|
|
271
|
+
console.error("Fatal error:", error);
|
|
272
|
+
process.exit(1);
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=add-to-network.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-to-network.js","sourceRoot":"","sources":["../../../src/node/server/add-to-network.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server config loader and validator.
|
|
3
|
+
*
|
|
4
|
+
* Loads `config.json` at server startup. The file defines capabilities-based
|
|
5
|
+
* authorization for system admin endpoints.
|
|
6
|
+
*/
|
|
7
|
+
import type { ServerConfig, SystemAdminPrincipal } from "./types";
|
|
8
|
+
export interface ConfigBackupInfo {
|
|
9
|
+
file: string;
|
|
10
|
+
createdAt: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function isTenantCreationCapabilityRule(ruleKey: string): boolean;
|
|
13
|
+
export declare function isWildcardSystemAdminPrincipal(principal: SystemAdminPrincipal): boolean;
|
|
14
|
+
export declare function hasTenantCreationWildcardPrincipal(config: ServerConfig): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Resolve the config file path from CLI argument or data directory fallback.
|
|
17
|
+
*/
|
|
18
|
+
export declare function resolveConfigPath(dataDir: string, explicitConfigPath?: string): string;
|
|
19
|
+
/**
|
|
20
|
+
* Load and validate the server config.
|
|
21
|
+
*
|
|
22
|
+
* Resolution order:
|
|
23
|
+
* 1. Explicit `--config <path>` CLI argument.
|
|
24
|
+
* 2. `<dataDir>/config.json` (default fallback).
|
|
25
|
+
*
|
|
26
|
+
* If neither file exists, an empty config with no capabilities is returned
|
|
27
|
+
* (all `/system/*` requests will be denied).
|
|
28
|
+
*/
|
|
29
|
+
export declare function loadServerConfig(dataDir: string, explicitConfigPath?: string): ServerConfig;
|
|
30
|
+
export declare function validateServerConfig(raw: unknown, filePath: string): ServerConfig;
|
|
31
|
+
/**
|
|
32
|
+
* Create a timestamped backup of the current config.json.
|
|
33
|
+
* Returns the backup filename (not full path).
|
|
34
|
+
*
|
|
35
|
+
* Backup naming: `config.<ISO-timestamp>.json` with colons replaced by
|
|
36
|
+
* hyphens for filesystem compatibility.
|
|
37
|
+
*/
|
|
38
|
+
export declare function backupConfig(configPath: string): string;
|
|
39
|
+
/**
|
|
40
|
+
* Persist a ServerConfig to disk as formatted JSON.
|
|
41
|
+
*/
|
|
42
|
+
export declare function writeConfig(configPath: string, config: ServerConfig): void;
|
|
43
|
+
export declare function isConfigBackupFilename(fileName: string): boolean;
|
|
44
|
+
export declare function listConfigBackups(configPath: string): ConfigBackupInfo[];
|
|
45
|
+
export declare function loadConfigBackup(configPath: string, backupFile: string): ServerConfig;
|
|
46
|
+
/**
|
|
47
|
+
* Extract all unique system admin principals from the capabilities config.
|
|
48
|
+
* Each principal is identified by (username, publicsignkey).
|
|
49
|
+
*/
|
|
50
|
+
export declare function extractAllPrincipals(config: ServerConfig): SystemAdminPrincipal[];
|
|
51
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/node/server/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,KAAK,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAKD,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAUvE;AAED,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,oBAAoB,GAC9B,OAAO,CAET;AAED,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAKhF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,kBAAkB,CAAC,EAAE,MAAM,GAC1B,MAAM,CAER;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,kBAAkB,CAAC,EAAE,MAAM,GAC1B,YAAY,CAmBd;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,YAAY,CA0CjF;AA6ED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CASvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAG1E;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEhE;AAcD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAaxE;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY,CAmBrF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,GACnB,oBAAoB,EAAE,CAexB"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Server config loader and validator.
|
|
4
|
+
*
|
|
5
|
+
* Loads `config.json` at server startup. The file defines capabilities-based
|
|
6
|
+
* authorization for system admin endpoints.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.isTenantCreationCapabilityRule = isTenantCreationCapabilityRule;
|
|
10
|
+
exports.isWildcardSystemAdminPrincipal = isWildcardSystemAdminPrincipal;
|
|
11
|
+
exports.hasTenantCreationWildcardPrincipal = hasTenantCreationWildcardPrincipal;
|
|
12
|
+
exports.resolveConfigPath = resolveConfigPath;
|
|
13
|
+
exports.loadServerConfig = loadServerConfig;
|
|
14
|
+
exports.validateServerConfig = validateServerConfig;
|
|
15
|
+
exports.backupConfig = backupConfig;
|
|
16
|
+
exports.writeConfig = writeConfig;
|
|
17
|
+
exports.isConfigBackupFilename = isConfigBackupFilename;
|
|
18
|
+
exports.listConfigBackups = listConfigBackups;
|
|
19
|
+
exports.loadConfigBackup = loadConfigBackup;
|
|
20
|
+
exports.extractAllPrincipals = extractAllPrincipals;
|
|
21
|
+
const fs_1 = require("fs");
|
|
22
|
+
const path_1 = require("path");
|
|
23
|
+
const CONFIG_BACKUP_FILENAME_RE = /^config\.(\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(?:\.\d{3})?Z)\.json$/;
|
|
24
|
+
function isTenantCreationCapabilityRule(ruleKey) {
|
|
25
|
+
const colonIdx = ruleKey.indexOf(":");
|
|
26
|
+
if (colonIdx === -1) {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
const method = ruleKey.substring(0, colonIdx).toUpperCase();
|
|
30
|
+
const pathPattern = ruleKey.substring(colonIdx + 1);
|
|
31
|
+
return method === "POST" && pathPattern.startsWith("/system/tenants/");
|
|
32
|
+
}
|
|
33
|
+
function isWildcardSystemAdminPrincipal(principal) {
|
|
34
|
+
return principal.username === "*" && principal.publicsignkey === "*";
|
|
35
|
+
}
|
|
36
|
+
function hasTenantCreationWildcardPrincipal(config) {
|
|
37
|
+
return Object.entries(config.capabilities).some(([ruleKey, principals]) => isTenantCreationCapabilityRule(ruleKey) &&
|
|
38
|
+
principals.some((principal) => isWildcardSystemAdminPrincipal(principal)));
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Resolve the config file path from CLI argument or data directory fallback.
|
|
42
|
+
*/
|
|
43
|
+
function resolveConfigPath(dataDir, explicitConfigPath) {
|
|
44
|
+
return explicitConfigPath ?? (0, path_1.join)(dataDir, "config.json");
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Load and validate the server config.
|
|
48
|
+
*
|
|
49
|
+
* Resolution order:
|
|
50
|
+
* 1. Explicit `--config <path>` CLI argument.
|
|
51
|
+
* 2. `<dataDir>/config.json` (default fallback).
|
|
52
|
+
*
|
|
53
|
+
* If neither file exists, an empty config with no capabilities is returned
|
|
54
|
+
* (all `/system/*` requests will be denied).
|
|
55
|
+
*/
|
|
56
|
+
function loadServerConfig(dataDir, explicitConfigPath) {
|
|
57
|
+
const configPath = resolveConfigPath(dataDir, explicitConfigPath);
|
|
58
|
+
if (!(0, fs_1.existsSync)(configPath)) {
|
|
59
|
+
console.log(`[Config] No config.json found at ${configPath} — all /system/* endpoints are locked down`);
|
|
60
|
+
return { capabilities: {} };
|
|
61
|
+
}
|
|
62
|
+
const raw = (0, fs_1.readFileSync)(configPath, "utf-8");
|
|
63
|
+
let parsed;
|
|
64
|
+
try {
|
|
65
|
+
parsed = JSON.parse(raw);
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
throw new Error(`Failed to parse config.json at ${configPath}: ${err}`);
|
|
69
|
+
}
|
|
70
|
+
return validateServerConfig(parsed, configPath);
|
|
71
|
+
}
|
|
72
|
+
function validateServerConfig(raw, filePath) {
|
|
73
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
74
|
+
throw new Error(`config.json at ${filePath} must be a JSON object`);
|
|
75
|
+
}
|
|
76
|
+
const obj = raw;
|
|
77
|
+
if (!obj.capabilities || typeof obj.capabilities !== "object" || Array.isArray(obj.capabilities)) {
|
|
78
|
+
throw new Error(`config.json at ${filePath} must have a "capabilities" object`);
|
|
79
|
+
}
|
|
80
|
+
const capabilities = {};
|
|
81
|
+
for (const [ruleKey, principals] of Object.entries(obj.capabilities)) {
|
|
82
|
+
validateCapabilityRule(ruleKey, filePath);
|
|
83
|
+
if (!Array.isArray(principals)) {
|
|
84
|
+
throw new Error(`config.json: capability rule "${ruleKey}" must map to an array of principals`);
|
|
85
|
+
}
|
|
86
|
+
capabilities[ruleKey] = principals.map((p, i) => validatePrincipal(p, ruleKey, i, filePath));
|
|
87
|
+
}
|
|
88
|
+
const config = { capabilities };
|
|
89
|
+
const principalCount = Object.values(capabilities).reduce((sum, arr) => sum + arr.length, 0);
|
|
90
|
+
console.log(`[Config] Loaded config.json from ${filePath}: ${Object.keys(capabilities).length} capability rule(s), ${principalCount} principal entry/entries`);
|
|
91
|
+
return config;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Validate a capability rule key has the format `METHOD:PATH`.
|
|
95
|
+
*/
|
|
96
|
+
function validateCapabilityRule(rule, filePath) {
|
|
97
|
+
const colonIdx = rule.indexOf(":");
|
|
98
|
+
if (colonIdx === -1) {
|
|
99
|
+
throw new Error(`config.json at ${filePath}: invalid capability rule "${rule}" — expected "METHOD:PATH" format`);
|
|
100
|
+
}
|
|
101
|
+
const method = rule.substring(0, colonIdx).toUpperCase();
|
|
102
|
+
const pathPattern = rule.substring(colonIdx + 1);
|
|
103
|
+
const validMethods = ["ALL", "GET", "POST", "PUT", "DELETE", "PATCH"];
|
|
104
|
+
if (!validMethods.includes(method)) {
|
|
105
|
+
throw new Error(`config.json at ${filePath}: invalid method "${method}" in rule "${rule}" — expected one of ${validMethods.join(", ")}`);
|
|
106
|
+
}
|
|
107
|
+
if (!pathPattern.startsWith("/")) {
|
|
108
|
+
throw new Error(`config.json at ${filePath}: path pattern in rule "${rule}" must start with "/"`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function validatePrincipal(raw, ruleKey, index, filePath) {
|
|
112
|
+
if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
|
|
113
|
+
throw new Error(`config.json at ${filePath}: principal #${index} in rule "${ruleKey}" must be an object`);
|
|
114
|
+
}
|
|
115
|
+
const obj = raw;
|
|
116
|
+
if (typeof obj.username !== "string" || obj.username.length === 0) {
|
|
117
|
+
throw new Error(`config.json at ${filePath}: principal #${index} in rule "${ruleKey}" must have a non-empty "username" string`);
|
|
118
|
+
}
|
|
119
|
+
if (typeof obj.publicsignkey !== "string" || obj.publicsignkey.length === 0) {
|
|
120
|
+
throw new Error(`config.json at ${filePath}: principal #${index} in rule "${ruleKey}" must have a non-empty "publicsignkey" string`);
|
|
121
|
+
}
|
|
122
|
+
const hasWildcardField = obj.username === "*" || obj.publicsignkey === "*";
|
|
123
|
+
if (hasWildcardField) {
|
|
124
|
+
if (obj.username !== "*" || obj.publicsignkey !== "*") {
|
|
125
|
+
throw new Error(`config.json at ${filePath}: principal #${index} in rule "${ruleKey}" must use "*" for both "username" and "publicsignkey"`);
|
|
126
|
+
}
|
|
127
|
+
if (!isTenantCreationCapabilityRule(ruleKey)) {
|
|
128
|
+
throw new Error(`config.json at ${filePath}: wildcard principal "*" is only allowed for POST:/system/tenants/... rules`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
username: obj.username,
|
|
133
|
+
publicsignkey: obj.publicsignkey,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Create a timestamped backup of the current config.json.
|
|
138
|
+
* Returns the backup filename (not full path).
|
|
139
|
+
*
|
|
140
|
+
* Backup naming: `config.<ISO-timestamp>.json` with colons replaced by
|
|
141
|
+
* hyphens for filesystem compatibility.
|
|
142
|
+
*/
|
|
143
|
+
function backupConfig(configPath) {
|
|
144
|
+
const timestamp = new Date().toISOString().replace(/:/g, "-");
|
|
145
|
+
const dir = (0, path_1.dirname)(configPath);
|
|
146
|
+
const backupName = `config.${timestamp}.json`;
|
|
147
|
+
const backupPath = (0, path_1.join)(dir, backupName);
|
|
148
|
+
(0, fs_1.copyFileSync)(configPath, backupPath);
|
|
149
|
+
console.log(`[Config] Backup created: ${backupName}`);
|
|
150
|
+
return backupName;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Persist a ServerConfig to disk as formatted JSON.
|
|
154
|
+
*/
|
|
155
|
+
function writeConfig(configPath, config) {
|
|
156
|
+
(0, fs_1.writeFileSync)(configPath, JSON.stringify(config, null, 2), "utf-8");
|
|
157
|
+
console.log(`[Config] Config written to ${configPath}`);
|
|
158
|
+
}
|
|
159
|
+
function isConfigBackupFilename(fileName) {
|
|
160
|
+
return CONFIG_BACKUP_FILENAME_RE.test(fileName);
|
|
161
|
+
}
|
|
162
|
+
function parseBackupTimestamp(fileName) {
|
|
163
|
+
const match = CONFIG_BACKUP_FILENAME_RE.exec(fileName);
|
|
164
|
+
if (!match) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
return match[1].replace(/^(\d{4}-\d{2}-\d{2}T\d{2})-(\d{2})-(\d{2}(?:\.\d{3})?Z)$/, "$1:$2:$3");
|
|
168
|
+
}
|
|
169
|
+
function listConfigBackups(configPath) {
|
|
170
|
+
const dir = (0, path_1.dirname)(configPath);
|
|
171
|
+
return (0, fs_1.readdirSync)(dir)
|
|
172
|
+
.filter((file) => isConfigBackupFilename(file))
|
|
173
|
+
.map((file) => {
|
|
174
|
+
const createdAt = parseBackupTimestamp(file);
|
|
175
|
+
if (!createdAt) {
|
|
176
|
+
throw new Error(`Invalid config backup filename: ${file}`);
|
|
177
|
+
}
|
|
178
|
+
return { file, createdAt };
|
|
179
|
+
})
|
|
180
|
+
.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
181
|
+
}
|
|
182
|
+
function loadConfigBackup(configPath, backupFile) {
|
|
183
|
+
if (!isConfigBackupFilename(backupFile)) {
|
|
184
|
+
throw new Error(`Invalid config backup filename: ${backupFile}`);
|
|
185
|
+
}
|
|
186
|
+
const backupPath = (0, path_1.join)((0, path_1.dirname)(configPath), backupFile);
|
|
187
|
+
if (!(0, fs_1.existsSync)(backupPath)) {
|
|
188
|
+
throw new Error(`Config backup not found: ${backupFile}`);
|
|
189
|
+
}
|
|
190
|
+
const raw = (0, fs_1.readFileSync)(backupPath, "utf-8");
|
|
191
|
+
let parsed;
|
|
192
|
+
try {
|
|
193
|
+
parsed = JSON.parse(raw);
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
throw new Error(`Failed to parse config backup ${backupFile}: ${err}`);
|
|
197
|
+
}
|
|
198
|
+
return validateServerConfig(parsed, backupPath);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Extract all unique system admin principals from the capabilities config.
|
|
202
|
+
* Each principal is identified by (username, publicsignkey).
|
|
203
|
+
*/
|
|
204
|
+
function extractAllPrincipals(config) {
|
|
205
|
+
const seen = new Set();
|
|
206
|
+
const result = [];
|
|
207
|
+
for (const principals of Object.values(config.capabilities)) {
|
|
208
|
+
for (const p of principals) {
|
|
209
|
+
const key = `${p.username.toLowerCase()}\0${p.publicsignkey}`;
|
|
210
|
+
if (!seen.has(key)) {
|
|
211
|
+
seen.add(key);
|
|
212
|
+
result.push(p);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/node/server/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server identity password: optional file (preferred for Docker: avoids putting
|
|
3
|
+
* the secret in the container environment block), else MINDOODB_SERVER_PASSWORD.
|
|
4
|
+
* File content is trimmed (single line).
|
|
5
|
+
*/
|
|
6
|
+
export declare function resolveServerPassword(): string | undefined;
|
|
7
|
+
//# sourceMappingURL=resolveServerPassword.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveServerPassword.d.ts","sourceRoot":"","sources":["../../../src/node/server/resolveServerPassword.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAgB1D"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveServerPassword = resolveServerPassword;
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const types_1 = require("./types");
|
|
6
|
+
/**
|
|
7
|
+
* Server identity password: optional file (preferred for Docker: avoids putting
|
|
8
|
+
* the secret in the container environment block), else MINDOODB_SERVER_PASSWORD.
|
|
9
|
+
* File content is trimmed (single line).
|
|
10
|
+
*/
|
|
11
|
+
function resolveServerPassword() {
|
|
12
|
+
const filePath = process.env[types_1.ENV_VARS.SERVER_PASSWORD_FILE]?.trim();
|
|
13
|
+
if (filePath) {
|
|
14
|
+
try {
|
|
15
|
+
const s = (0, fs_1.readFileSync)(filePath, "utf8").trim();
|
|
16
|
+
return s.length > 0 ? s : undefined;
|
|
17
|
+
}
|
|
18
|
+
catch (e) {
|
|
19
|
+
throw new Error(`Cannot read ${types_1.ENV_VARS.SERVER_PASSWORD_FILE} (${filePath}): ${e instanceof Error ? e.message : String(e)}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const direct = process.env[types_1.ENV_VARS.SERVER_PASSWORD];
|
|
23
|
+
return direct !== undefined && direct.length > 0 ? direct : undefined;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=resolveServerPassword.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveServerPassword.js","sourceRoot":"","sources":["../../../src/node/server/resolveServerPassword.ts"],"names":[],"mappings":";;AAQA,sDAgBC;AAxBD,2BAAkC;AAClC,mCAAmC;AAEnC;;;;GAIG;AACH,SAAgB,qBAAqB;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAQ,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC;IACpE,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAChD,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,eAAe,gBAAQ,CAAC,oBAAoB,KAAK,QAAQ,MACvD,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAC3C,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAQ,CAAC,eAAe,CAAC,CAAC;IACrD,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* MindooDB Example Server - Entry Point
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* npm run server:dev -- [options] (from repo root)
|
|
7
|
+
* node dist/node/server/server.js [options]
|
|
8
|
+
*
|
|
9
|
+
* Options:
|
|
10
|
+
* -d, --data-dir <path> Data directory path (default: ./data)
|
|
11
|
+
* -p, --port <port> Server port (default: 1661)
|
|
12
|
+
* -s, --auto-sync Enable automatic sync with remote servers
|
|
13
|
+
* -w, --static-dir <path> Serve static files from this directory at /statics/
|
|
14
|
+
* --tls-cert <path> Path to TLS certificate file (PEM)
|
|
15
|
+
* --tls-key <path> Path to TLS private key file (PEM)
|
|
16
|
+
* -h, --help Show this help message
|
|
17
|
+
*
|
|
18
|
+
* Environment variables:
|
|
19
|
+
* MINDOODB_SERVER_PASSWORD / MINDOODB_SERVER_PASSWORD_FILE — server identity password
|
|
20
|
+
*/
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/node/server/server.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG"}
|