funifier-mcp 0.3.10 → 0.3.12
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/.cursor/rules/funifier.mdc +1 -0
- package/.github/copilot-instructions.md +1 -0
- package/AGENTS.md +46 -1
- package/README.md +13 -2
- package/datasource-funifier-docs/.coverage.json +1 -1
- package/dist/cli/config-writers.d.ts +3 -3
- package/dist/cli/config-writers.d.ts.map +1 -1
- package/dist/cli/config-writers.js +22 -24
- package/dist/cli/config-writers.js.map +1 -1
- package/dist/cli/config-writers.test.js +7 -2
- package/dist/cli/config-writers.test.js.map +1 -1
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +19 -11
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/init.test.js +46 -0
- package/dist/cli/init.test.js.map +1 -1
- package/dist/core/api-client.d.ts +4 -0
- package/dist/core/api-client.d.ts.map +1 -1
- package/dist/core/api-client.js +23 -0
- package/dist/core/api-client.js.map +1 -1
- package/dist/mcp/bundle.js +110 -107
- package/dist/mcp/tools/_backup.d.ts +89 -0
- package/dist/mcp/tools/_backup.d.ts.map +1 -0
- package/dist/mcp/tools/_backup.js +325 -0
- package/dist/mcp/tools/_backup.js.map +1 -0
- package/dist/mcp/tools/_backup.test.d.ts +2 -0
- package/dist/mcp/tools/_backup.test.d.ts.map +1 -0
- package/dist/mcp/tools/_backup.test.js +342 -0
- package/dist/mcp/tools/_backup.test.js.map +1 -0
- package/dist/mcp/tools/database.d.ts.map +1 -1
- package/dist/mcp/tools/database.js +14 -0
- package/dist/mcp/tools/database.js.map +1 -1
- package/dist/mcp/tools/database.test.js +40 -0
- package/dist/mcp/tools/database.test.js.map +1 -1
- package/dist/mcp/tools/list-tools.d.ts.map +1 -1
- package/dist/mcp/tools/list-tools.js +3 -2
- package/dist/mcp/tools/list-tools.js.map +1 -1
- package/dist/mcp/tools/permissions.d.ts.map +1 -1
- package/dist/mcp/tools/permissions.js +231 -4
- package/dist/mcp/tools/permissions.js.map +1 -1
- package/dist/mcp/tools/permissions.test.js +562 -12
- package/dist/mcp/tools/permissions.test.js.map +1 -1
- package/package.json +1 -1
- package/skills/funifier/references/configure-security.md +18 -0
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const vitest_1 = require("vitest");
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const os_1 = __importDefault(require("os"));
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const _backup_1 = require("./_backup");
|
|
11
|
+
let root;
|
|
12
|
+
(0, vitest_1.beforeEach)(() => {
|
|
13
|
+
root = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), "funifier-backup-test-"));
|
|
14
|
+
});
|
|
15
|
+
(0, vitest_1.afterEach)(() => {
|
|
16
|
+
fs_1.default.rmSync(root, { recursive: true, force: true });
|
|
17
|
+
});
|
|
18
|
+
function snapshot(overrides = {}) {
|
|
19
|
+
return {
|
|
20
|
+
version: 1,
|
|
21
|
+
action: "delete_studio_role",
|
|
22
|
+
category: "studio-role",
|
|
23
|
+
resourceId: "r1",
|
|
24
|
+
existedBefore: true,
|
|
25
|
+
capturedAt: "2026-05-28T14:31:02.123Z",
|
|
26
|
+
serverUrl: null,
|
|
27
|
+
preImage: { _id: "r1", name: "Admin", type: "system", item: "system", permissions: [] },
|
|
28
|
+
...overrides,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
(0, vitest_1.describe)("captureBackup", () => {
|
|
32
|
+
(0, vitest_1.it)("writes the serialized snapshot to <root>/<category>/<safeId>-<timestamp>.json", () => {
|
|
33
|
+
const snap = snapshot();
|
|
34
|
+
const filePath = (0, _backup_1.captureBackup)(snap, root);
|
|
35
|
+
(0, vitest_1.expect)(path_1.default.isAbsolute(filePath)).toBe(true);
|
|
36
|
+
(0, vitest_1.expect)(filePath).toBe(path_1.default.join(root, "studio-role", "r1-20260528T143102123.json"));
|
|
37
|
+
(0, vitest_1.expect)(fs_1.default.existsSync(filePath)).toBe(true);
|
|
38
|
+
(0, vitest_1.expect)(JSON.parse(fs_1.default.readFileSync(filePath, "utf8"))).toEqual(snap);
|
|
39
|
+
});
|
|
40
|
+
(0, vitest_1.it)("sanitizes filesystem-unsafe characters in the resourceId", () => {
|
|
41
|
+
const filePath = (0, _backup_1.captureBackup)(snapshot({ category: "studio-assignment", resourceId: "user:u/1:r1" }), root);
|
|
42
|
+
(0, vitest_1.expect)(path_1.default.basename(filePath)).toBe("user_u_1_r1-20260528T143102123.json");
|
|
43
|
+
});
|
|
44
|
+
(0, vitest_1.it)("throws when the snapshot cannot be serialized (abort signal for the mutation)", () => {
|
|
45
|
+
const circular = {};
|
|
46
|
+
circular.self = circular;
|
|
47
|
+
(0, vitest_1.expect)(() => (0, _backup_1.captureBackup)(snapshot({ preImage: circular }), root)).toThrow();
|
|
48
|
+
});
|
|
49
|
+
(0, vitest_1.it)("throws when the root cannot be written (a file blocks the category directory)", () => {
|
|
50
|
+
const blocker = path_1.default.join(root, "security");
|
|
51
|
+
fs_1.default.writeFileSync(blocker, "not-a-directory");
|
|
52
|
+
(0, vitest_1.expect)(() => (0, _backup_1.captureBackup)(snapshot({ category: "security" }), root)).toThrow();
|
|
53
|
+
});
|
|
54
|
+
(0, vitest_1.it)("appends a millisecond suffix when the filename collides", () => {
|
|
55
|
+
const snap = snapshot();
|
|
56
|
+
const first = (0, _backup_1.captureBackup)(snap, root);
|
|
57
|
+
const second = (0, _backup_1.captureBackup)(snap, root);
|
|
58
|
+
(0, vitest_1.expect)(first).not.toBe(second);
|
|
59
|
+
(0, vitest_1.expect)(fs_1.default.existsSync(first)).toBe(true);
|
|
60
|
+
(0, vitest_1.expect)(fs_1.default.existsSync(second)).toBe(true);
|
|
61
|
+
});
|
|
62
|
+
(0, vitest_1.it)("creates a self-contained .gitignore with * in the backup root (idempotent)", () => {
|
|
63
|
+
const ignorePath = path_1.default.join(root, ".gitignore");
|
|
64
|
+
(0, vitest_1.expect)(fs_1.default.existsSync(ignorePath)).toBe(false);
|
|
65
|
+
(0, _backup_1.captureBackup)(snapshot(), root);
|
|
66
|
+
(0, vitest_1.expect)(fs_1.default.readFileSync(ignorePath, "utf8")).toBe("*\n");
|
|
67
|
+
const mtime = fs_1.default.statSync(ignorePath).mtimeMs;
|
|
68
|
+
(0, _backup_1.captureBackup)(snapshot({ resourceId: "second" }), root);
|
|
69
|
+
(0, vitest_1.expect)(fs_1.default.statSync(ignorePath).mtimeMs).toBe(mtime);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
(0, vitest_1.describe)("ensureSelfIgnore", () => {
|
|
73
|
+
(0, vitest_1.it)("writes * to <dir>/.gitignore only when missing", () => {
|
|
74
|
+
const dir = path_1.default.join(root, "nested");
|
|
75
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
76
|
+
(0, _backup_1.ensureSelfIgnore)(dir);
|
|
77
|
+
(0, _backup_1.ensureSelfIgnore)(dir);
|
|
78
|
+
(0, vitest_1.expect)(fs_1.default.readFileSync(path_1.default.join(dir, ".gitignore"), "utf8")).toBe("*\n");
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
(0, vitest_1.describe)("resolveBackupPath", () => {
|
|
82
|
+
(0, vitest_1.it)("accepts paths inside the backup root", () => {
|
|
83
|
+
const filePath = (0, _backup_1.captureBackup)(snapshot(), root);
|
|
84
|
+
(0, vitest_1.expect)((0, _backup_1.resolveBackupPath)(filePath, root)).toBe(path_1.default.resolve(filePath));
|
|
85
|
+
});
|
|
86
|
+
(0, vitest_1.it)("rejects path traversal outside the backup root", () => {
|
|
87
|
+
const outside = path_1.default.join(root, "..", "outside.json");
|
|
88
|
+
(0, vitest_1.expect)(() => (0, _backup_1.resolveBackupPath)(outside, root)).toThrow(/must be within/i);
|
|
89
|
+
});
|
|
90
|
+
(0, vitest_1.it)("rejects absolute paths outside the backup root", () => {
|
|
91
|
+
(0, vitest_1.expect)(() => (0, _backup_1.resolveBackupPath)("/etc/passwd", root)).toThrow(/must be within/i);
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
(0, vitest_1.describe)("readSnapshot", () => {
|
|
95
|
+
(0, vitest_1.it)("round-trips a captured snapshot", () => {
|
|
96
|
+
const snap = snapshot();
|
|
97
|
+
const filePath = (0, _backup_1.captureBackup)(snap, root);
|
|
98
|
+
(0, vitest_1.expect)((0, _backup_1.readSnapshot)(filePath)).toEqual(snap);
|
|
99
|
+
});
|
|
100
|
+
(0, vitest_1.it)("throws on a non-existent path", () => {
|
|
101
|
+
(0, vitest_1.expect)(() => (0, _backup_1.readSnapshot)(path_1.default.join(root, "missing.json"))).toThrow();
|
|
102
|
+
});
|
|
103
|
+
(0, vitest_1.it)("throws on a JSON file that fails the schema", () => {
|
|
104
|
+
const filePath = path_1.default.join(root, "bad.json");
|
|
105
|
+
fs_1.default.writeFileSync(filePath, JSON.stringify({ version: 99, hello: "world" }));
|
|
106
|
+
(0, vitest_1.expect)(() => (0, _backup_1.readSnapshot)(filePath)).toThrow();
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
(0, vitest_1.describe)("listSnapshots", () => {
|
|
110
|
+
(0, vitest_1.it)("returns an empty list when the root does not exist", () => {
|
|
111
|
+
(0, vitest_1.expect)((0, _backup_1.listSnapshots)(path_1.default.join(root, "nope"))).toEqual([]);
|
|
112
|
+
});
|
|
113
|
+
(0, vitest_1.it)("returns items newest-first by capturedAt", () => {
|
|
114
|
+
(0, _backup_1.captureBackup)(snapshot({ resourceId: "older", capturedAt: "2026-05-28T10:00:00.000Z" }), root);
|
|
115
|
+
(0, _backup_1.captureBackup)(snapshot({ resourceId: "newer", capturedAt: "2026-05-28T12:00:00.000Z" }), root);
|
|
116
|
+
const items = (0, _backup_1.listSnapshots)(root);
|
|
117
|
+
(0, vitest_1.expect)(items.map((i) => i.resourceId)).toEqual(["newer", "older"]);
|
|
118
|
+
(0, vitest_1.expect)(items[0].category).toBe("studio-role");
|
|
119
|
+
});
|
|
120
|
+
(0, vitest_1.it)("skips corrupt and non-JSON files with a warning", () => {
|
|
121
|
+
const warn = vitest_1.vi.spyOn(console, "warn").mockImplementation(() => { });
|
|
122
|
+
(0, _backup_1.captureBackup)(snapshot(), root);
|
|
123
|
+
fs_1.default.writeFileSync(path_1.default.join(root, "studio-role", "not-json.txt"), "hello");
|
|
124
|
+
fs_1.default.writeFileSync(path_1.default.join(root, "studio-role", "corrupt.json"), "{ invalid");
|
|
125
|
+
const items = (0, _backup_1.listSnapshots)(root);
|
|
126
|
+
(0, vitest_1.expect)(items).toHaveLength(1);
|
|
127
|
+
(0, vitest_1.expect)(warn).toHaveBeenCalledWith(vitest_1.expect.stringContaining("corrupt.json"));
|
|
128
|
+
warn.mockRestore();
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
(0, vitest_1.describe)("applySnapshot", () => {
|
|
132
|
+
(0, vitest_1.it)("security: updates the document when the live _id matches", async () => {
|
|
133
|
+
const preImage = { _id: "game1", apps: [], roles: [] };
|
|
134
|
+
const api = {
|
|
135
|
+
queryCollection: vitest_1.vi.fn().mockResolvedValue([{ _id: "game1" }]),
|
|
136
|
+
updateDocument: vitest_1.vi.fn().mockResolvedValue({ ok: 1 }),
|
|
137
|
+
};
|
|
138
|
+
await (0, _backup_1.applySnapshot)(api, snapshot({ category: "security", resourceId: "game1", preImage }));
|
|
139
|
+
(0, vitest_1.expect)(api.updateDocument).toHaveBeenCalledWith("security", preImage);
|
|
140
|
+
});
|
|
141
|
+
(0, vitest_1.it)("security: throws on _id mismatch instead of writing a divergent document", async () => {
|
|
142
|
+
const api = {
|
|
143
|
+
queryCollection: vitest_1.vi.fn().mockResolvedValue([{ _id: "other" }]),
|
|
144
|
+
updateDocument: vitest_1.vi.fn(),
|
|
145
|
+
};
|
|
146
|
+
await (0, vitest_1.expect)((0, _backup_1.applySnapshot)(api, snapshot({ category: "security", resourceId: "game1", preImage: { _id: "game1", apps: [], roles: [] } }))).rejects.toThrow(/mismatch/i);
|
|
147
|
+
(0, vitest_1.expect)(api.updateDocument).not.toHaveBeenCalled();
|
|
148
|
+
});
|
|
149
|
+
(0, vitest_1.it)("studio-role existedBefore: reapplies the captured role via saveRole", async () => {
|
|
150
|
+
const preImage = { _id: "r1", name: "Admin", type: "system", item: "system", permissions: [] };
|
|
151
|
+
const api = { saveRole: vitest_1.vi.fn().mockResolvedValue(preImage) };
|
|
152
|
+
await (0, _backup_1.applySnapshot)(api, snapshot({ category: "studio-role", preImage, existedBefore: true }));
|
|
153
|
+
(0, vitest_1.expect)(api.saveRole).toHaveBeenCalledWith(preImage);
|
|
154
|
+
});
|
|
155
|
+
(0, vitest_1.it)("studio-role absent: resolves _id via listRoles natural-key match, then deleteRole", async () => {
|
|
156
|
+
const api = {
|
|
157
|
+
listRoles: vitest_1.vi.fn().mockResolvedValue([
|
|
158
|
+
{ _id: "wrong", name: "Admin", type: "gamification", item: "game1", permissions: [] },
|
|
159
|
+
{ _id: "right", name: "Admin", type: "system", item: "system", permissions: [] },
|
|
160
|
+
]),
|
|
161
|
+
deleteRole: vitest_1.vi.fn().mockResolvedValue({ ok: 1 }),
|
|
162
|
+
};
|
|
163
|
+
await (0, _backup_1.applySnapshot)(api, snapshot({
|
|
164
|
+
category: "studio-role",
|
|
165
|
+
existedBefore: false,
|
|
166
|
+
preImage: null,
|
|
167
|
+
naturalKey: { name: "Admin", type: "system", item: "system" },
|
|
168
|
+
}));
|
|
169
|
+
(0, vitest_1.expect)(api.deleteRole).toHaveBeenCalledWith("right");
|
|
170
|
+
});
|
|
171
|
+
(0, vitest_1.it)("studio-role absent: throws when natural key matches multiple roles", async () => {
|
|
172
|
+
const api = {
|
|
173
|
+
listRoles: vitest_1.vi.fn().mockResolvedValue([
|
|
174
|
+
{ _id: "dup-a", name: "Admin", type: "system", item: "system", permissions: [] },
|
|
175
|
+
{ _id: "dup-b", name: "Admin", type: "system", item: "system", permissions: [] },
|
|
176
|
+
]),
|
|
177
|
+
deleteRole: vitest_1.vi.fn(),
|
|
178
|
+
};
|
|
179
|
+
await (0, vitest_1.expect)((0, _backup_1.applySnapshot)(api, snapshot({
|
|
180
|
+
category: "studio-role",
|
|
181
|
+
existedBefore: false,
|
|
182
|
+
preImage: null,
|
|
183
|
+
naturalKey: { name: "Admin", type: "system", item: "system" },
|
|
184
|
+
}))).rejects.toThrow(/Ambiguous studio role natural key/i);
|
|
185
|
+
(0, vitest_1.expect)(api.deleteRole).not.toHaveBeenCalled();
|
|
186
|
+
});
|
|
187
|
+
(0, vitest_1.it)("studio-assignment existedBefore: reapplies via assignRole", async () => {
|
|
188
|
+
const preImage = { type: "user", item: "u1", role: "r1" };
|
|
189
|
+
const api = { assignRole: vitest_1.vi.fn().mockResolvedValue(preImage) };
|
|
190
|
+
await (0, _backup_1.applySnapshot)(api, snapshot({ category: "studio-assignment", preImage, existedBefore: true }));
|
|
191
|
+
(0, vitest_1.expect)(api.assignRole).toHaveBeenCalledWith(preImage);
|
|
192
|
+
});
|
|
193
|
+
(0, vitest_1.it)("studio-assignment absent: removes via unassignRole(naturalKey)", async () => {
|
|
194
|
+
const naturalKey = { type: "user", item: "u1", role: "r1" };
|
|
195
|
+
const api = { unassignRole: vitest_1.vi.fn().mockResolvedValue({ ok: 1 }) };
|
|
196
|
+
await (0, _backup_1.applySnapshot)(api, snapshot({ category: "studio-assignment", existedBefore: false, preImage: null, naturalKey }));
|
|
197
|
+
(0, vitest_1.expect)(api.unassignRole).toHaveBeenCalledWith(naturalKey);
|
|
198
|
+
});
|
|
199
|
+
(0, vitest_1.it)("throws on an unknown backup category", async () => {
|
|
200
|
+
const api = {};
|
|
201
|
+
await (0, vitest_1.expect)((0, _backup_1.applySnapshot)(api, { ...snapshot(), category: "unknown" })).rejects.toThrow(/Unknown backup category/i);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
// ─── T1: normalizeSecurityId ─────────────────────────────────────────────────
|
|
205
|
+
(0, vitest_1.describe)("normalizeSecurityId", () => {
|
|
206
|
+
(0, vitest_1.it)("returns a string value as-is", () => {
|
|
207
|
+
(0, vitest_1.expect)((0, _backup_1.normalizeSecurityId)("abc123")).toBe("abc123");
|
|
208
|
+
(0, vitest_1.expect)((0, _backup_1.normalizeSecurityId)("")).toBe("");
|
|
209
|
+
});
|
|
210
|
+
(0, vitest_1.it)("extracts $oid from a {$oid} wrapper", () => {
|
|
211
|
+
(0, vitest_1.expect)((0, _backup_1.normalizeSecurityId)({ $oid: "6a18abc123def456789012ab" })).toBe("6a18abc123def456789012ab");
|
|
212
|
+
});
|
|
213
|
+
(0, vitest_1.it)("returns a stable JSON.stringify-derived token for expanded BSON objects", () => {
|
|
214
|
+
const objId = { timestamp: 1, machineIdentifier: 2, processIdentifier: 3, counter: 4 };
|
|
215
|
+
const token = (0, _backup_1.normalizeSecurityId)(objId);
|
|
216
|
+
(0, vitest_1.expect)(typeof token).toBe("string");
|
|
217
|
+
(0, vitest_1.expect)(token.length).toBeGreaterThan(0);
|
|
218
|
+
// Stable: same input → same output
|
|
219
|
+
(0, vitest_1.expect)((0, _backup_1.normalizeSecurityId)(objId)).toBe(token);
|
|
220
|
+
// Different structure → different token
|
|
221
|
+
(0, vitest_1.expect)((0, _backup_1.normalizeSecurityId)({ timestamp: 99 })).not.toBe(token);
|
|
222
|
+
});
|
|
223
|
+
(0, vitest_1.it)("throws on null", () => {
|
|
224
|
+
(0, vitest_1.expect)(() => (0, _backup_1.normalizeSecurityId)(null)).toThrow();
|
|
225
|
+
});
|
|
226
|
+
(0, vitest_1.it)("throws on undefined", () => {
|
|
227
|
+
(0, vitest_1.expect)(() => (0, _backup_1.normalizeSecurityId)(undefined)).toThrow();
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
// ─── T2: captureBackupVerified ───────────────────────────────────────────────
|
|
231
|
+
(0, vitest_1.describe)("captureBackupVerified", () => {
|
|
232
|
+
(0, vitest_1.it)("returns the file path on a successful security snapshot (with apps and roles)", () => {
|
|
233
|
+
const snap = snapshot({
|
|
234
|
+
category: "security",
|
|
235
|
+
preImage: { _id: "game1", apps: [{ name: "A", app_secret: "s", scope: "x" }], roles: [] },
|
|
236
|
+
});
|
|
237
|
+
const filePath = (0, _backup_1.captureBackupVerified)(snap, root);
|
|
238
|
+
(0, vitest_1.expect)(fs_1.default.existsSync(filePath)).toBe(true);
|
|
239
|
+
(0, vitest_1.expect)((0, _backup_1.readSnapshot)(filePath).preImage).toEqual(snap.preImage);
|
|
240
|
+
});
|
|
241
|
+
(0, vitest_1.it)("returns the file path for non-security categories without checking apps/roles", () => {
|
|
242
|
+
const snap = snapshot({ category: "studio-role" }); // no apps/roles in preImage
|
|
243
|
+
const filePath = (0, _backup_1.captureBackupVerified)(snap, root);
|
|
244
|
+
(0, vitest_1.expect)(fs_1.default.existsSync(filePath)).toBe(true);
|
|
245
|
+
});
|
|
246
|
+
(0, vitest_1.it)("throws with 'integrity check failed' when security preImage is missing apps array", () => {
|
|
247
|
+
const snap = snapshot({ category: "security", preImage: { _id: "game1", roles: [] } });
|
|
248
|
+
(0, vitest_1.expect)(() => (0, _backup_1.captureBackupVerified)(snap, root)).toThrow(/integrity check failed/i);
|
|
249
|
+
});
|
|
250
|
+
(0, vitest_1.it)("throws with 'integrity check failed' when security preImage is missing roles array", () => {
|
|
251
|
+
const snap = snapshot({ category: "security", preImage: { _id: "game1", apps: [] } });
|
|
252
|
+
(0, vitest_1.expect)(() => (0, _backup_1.captureBackupVerified)(snap, root)).toThrow(/integrity check failed/i);
|
|
253
|
+
});
|
|
254
|
+
(0, vitest_1.it)("throws with 'integrity check failed' when security preImage is null", () => {
|
|
255
|
+
const snap = snapshot({ category: "security", preImage: null, existedBefore: false });
|
|
256
|
+
(0, vitest_1.expect)(() => (0, _backup_1.captureBackupVerified)(snap, root)).toThrow(/integrity check failed/i);
|
|
257
|
+
});
|
|
258
|
+
(0, vitest_1.it)("accepts a truncated security preImage (no apps/roles) when skipContentCheck is true", () => {
|
|
259
|
+
// Critical #1: restore's pre-backup of a broken live doc must not block recovery.
|
|
260
|
+
const snap = snapshot({ category: "security", preImage: { _id: "game1" } });
|
|
261
|
+
const filePath = (0, _backup_1.captureBackupVerified)(snap, root, { skipContentCheck: true });
|
|
262
|
+
(0, vitest_1.expect)(fs_1.default.existsSync(filePath)).toBe(true);
|
|
263
|
+
(0, vitest_1.expect)((0, _backup_1.readSnapshot)(filePath).preImage).toEqual({ _id: "game1" });
|
|
264
|
+
});
|
|
265
|
+
});
|
|
266
|
+
// ─── T6: applySecuritySnapshot — relaxed _id compare ────────────────────────
|
|
267
|
+
(0, vitest_1.describe)("applySnapshot T6 — _id comparison handles object/string mixed types", () => {
|
|
268
|
+
(0, vitest_1.it)("aborts with explicit error when live _id is an unresolvable object (not string, not $oid)", async () => {
|
|
269
|
+
// Previously this produced a synthetic token and wrote it — now it must refuse.
|
|
270
|
+
const objId = { timestamp: 1, machineIdentifier: 2, processIdentifier: 3, counter: 4 };
|
|
271
|
+
const preImage = { _id: objId, apps: [], roles: [] };
|
|
272
|
+
const api = {
|
|
273
|
+
queryCollection: vitest_1.vi.fn().mockResolvedValue([{ _id: objId }]),
|
|
274
|
+
updateDocument: vitest_1.vi.fn(),
|
|
275
|
+
};
|
|
276
|
+
await (0, vitest_1.expect)((0, _backup_1.applySnapshot)(api, snapshot({ category: "security", resourceId: "any", preImage }))).rejects.toThrow(/not a string.*Refusing to write a synthetic/i);
|
|
277
|
+
(0, vitest_1.expect)(api.updateDocument).not.toHaveBeenCalled();
|
|
278
|
+
});
|
|
279
|
+
(0, vitest_1.it)("restores when live _id is a BSON $oid object and aggregate is unavailable", async () => {
|
|
280
|
+
// $oid objects are a known BSON shape — extract the hex string and use it as _id.
|
|
281
|
+
const objId = { $oid: "507f1f77bcf86cd799439011" };
|
|
282
|
+
const preImage = { _id: objId, apps: [], roles: [] };
|
|
283
|
+
const api = {
|
|
284
|
+
queryCollection: vitest_1.vi.fn().mockResolvedValue([{ _id: objId }]),
|
|
285
|
+
updateDocument: vitest_1.vi.fn().mockResolvedValue({ ok: 1 }),
|
|
286
|
+
};
|
|
287
|
+
await (0, _backup_1.applySnapshot)(api, snapshot({ category: "security", resourceId: "any", preImage }));
|
|
288
|
+
(0, vitest_1.expect)(api.updateDocument).toHaveBeenCalled();
|
|
289
|
+
const callArg = api.updateDocument.mock.calls[0][1];
|
|
290
|
+
(0, vitest_1.expect)(callArg._id).toBe("507f1f77bcf86cd799439011"); // real hex string, not synthetic token
|
|
291
|
+
});
|
|
292
|
+
(0, vitest_1.it)("aborts when live has string _id and snapshot has a non-$oid object _id (unresolvable mixed types)", async () => {
|
|
293
|
+
// preImage._id is a BSON-like object but NOT a $oid shape — cannot canonicalize, must refuse.
|
|
294
|
+
// High #1: explicit type guard now catches this before securityIdsMatch, giving a clearer error.
|
|
295
|
+
const objId = { timestamp: 1, machineIdentifier: 2 };
|
|
296
|
+
const preImage = { _id: objId, apps: [], roles: [] };
|
|
297
|
+
const api = {
|
|
298
|
+
aggregateCollection: vitest_1.vi.fn().mockResolvedValue([{ _id: "hex-string-id" }]), // $toString result
|
|
299
|
+
queryCollection: vitest_1.vi.fn().mockResolvedValue([{ _id: "hex-string-id" }]),
|
|
300
|
+
updateDocument: vitest_1.vi.fn(),
|
|
301
|
+
};
|
|
302
|
+
await (0, vitest_1.expect)((0, _backup_1.applySnapshot)(api, snapshot({ category: "security", resourceId: "any", preImage }))).rejects.toThrow(/unresolvable type/i);
|
|
303
|
+
(0, vitest_1.expect)(api.updateDocument).not.toHaveBeenCalled();
|
|
304
|
+
});
|
|
305
|
+
(0, vitest_1.it)("throws on genuinely different string _id values", async () => {
|
|
306
|
+
const api = {
|
|
307
|
+
queryCollection: vitest_1.vi.fn().mockResolvedValue([{ _id: "other-game" }]),
|
|
308
|
+
updateDocument: vitest_1.vi.fn(),
|
|
309
|
+
};
|
|
310
|
+
await (0, vitest_1.expect)((0, _backup_1.applySnapshot)(api, snapshot({ category: "security", preImage: { _id: "game1", apps: [], roles: [] } }))).rejects.toThrow(/mismatch/i);
|
|
311
|
+
(0, vitest_1.expect)(api.updateDocument).not.toHaveBeenCalled();
|
|
312
|
+
});
|
|
313
|
+
(0, vitest_1.it)("falls back to queryCollection when aggregateCollection is not available", async () => {
|
|
314
|
+
const preImage = { _id: "game1", apps: [], roles: [] };
|
|
315
|
+
const api = {
|
|
316
|
+
queryCollection: vitest_1.vi.fn().mockResolvedValue([{ _id: "game1" }]),
|
|
317
|
+
updateDocument: vitest_1.vi.fn().mockResolvedValue({ ok: 1 }),
|
|
318
|
+
};
|
|
319
|
+
await (0, _backup_1.applySnapshot)(api, snapshot({ category: "security", resourceId: "game1", preImage }));
|
|
320
|
+
(0, vitest_1.expect)(api.updateDocument).toHaveBeenCalledWith("security", vitest_1.expect.objectContaining({ _id: "game1" }));
|
|
321
|
+
});
|
|
322
|
+
(0, vitest_1.it)("security: rejects preImage missing apps array before any API call", async () => {
|
|
323
|
+
// Critical #2: a snapshot without apps[] would truncate the document on write.
|
|
324
|
+
const api = {
|
|
325
|
+
queryCollection: vitest_1.vi.fn().mockResolvedValue([{ _id: "game1" }]),
|
|
326
|
+
updateDocument: vitest_1.vi.fn(),
|
|
327
|
+
};
|
|
328
|
+
await (0, vitest_1.expect)((0, _backup_1.applySnapshot)(api, snapshot({ category: "security", preImage: { _id: "game1", roles: [] } }))).rejects.toThrow(/missing 'apps' or 'roles'/i);
|
|
329
|
+
(0, vitest_1.expect)(api.queryCollection).not.toHaveBeenCalled();
|
|
330
|
+
(0, vitest_1.expect)(api.updateDocument).not.toHaveBeenCalled();
|
|
331
|
+
});
|
|
332
|
+
(0, vitest_1.it)("security: rejects preImage missing roles array before any API call", async () => {
|
|
333
|
+
const api = {
|
|
334
|
+
queryCollection: vitest_1.vi.fn().mockResolvedValue([{ _id: "game1" }]),
|
|
335
|
+
updateDocument: vitest_1.vi.fn(),
|
|
336
|
+
};
|
|
337
|
+
await (0, vitest_1.expect)((0, _backup_1.applySnapshot)(api, snapshot({ category: "security", preImage: { _id: "game1", apps: [] } }))).rejects.toThrow(/missing 'apps' or 'roles'/i);
|
|
338
|
+
(0, vitest_1.expect)(api.queryCollection).not.toHaveBeenCalled();
|
|
339
|
+
(0, vitest_1.expect)(api.updateDocument).not.toHaveBeenCalled();
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
//# sourceMappingURL=_backup.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_backup.test.js","sourceRoot":"","sources":["../../../src/mcp/tools/_backup.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAuB1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/database.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAuB1C,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QAqP3E"}
|
|
@@ -106,6 +106,20 @@ function registerDatabaseTool(server, apiHolder) {
|
|
|
106
106
|
if (pathGuardError) {
|
|
107
107
|
return { content: [{ type: "text", text: pathGuardError }], isError: true };
|
|
108
108
|
}
|
|
109
|
+
if (collection === "security" && ["insert", "update", "delete", "bulk"].includes(action)) {
|
|
110
|
+
return {
|
|
111
|
+
content: [
|
|
112
|
+
{
|
|
113
|
+
type: "text",
|
|
114
|
+
text: "Refusing to write the 'security' collection via funifier_database. " +
|
|
115
|
+
"PUT /v3/database/security is a full-collection REPLACE (the server drops the whole collection and re-saves the body), " +
|
|
116
|
+
"so a partial document silently deletes apps/roles. " +
|
|
117
|
+
"Use funifier_permissions (save_api_app / save_security_role / …) which backs up, sends the complete document, and verifies the write.",
|
|
118
|
+
},
|
|
119
|
+
],
|
|
120
|
+
isError: true,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
109
123
|
if (action === "query") {
|
|
110
124
|
const queryFilter = query ? JSON.parse(query) : {};
|
|
111
125
|
const sortObj = sort ? JSON.parse(sort) : undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/mcp/tools/database.ts"],"names":[],"mappings":";;AAyBA,
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/mcp/tools/database.ts"],"names":[],"mappings":"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"}
|
|
@@ -155,4 +155,44 @@ function makeHarness(fakeApi) {
|
|
|
155
155
|
(0, vitest_1.expect)(result.content[0].text).toContain("action=aggregate");
|
|
156
156
|
});
|
|
157
157
|
});
|
|
158
|
+
(0, vitest_1.describe)("funifier_database security collection guardrail (T7)", () => {
|
|
159
|
+
vitest_1.it.each(["insert", "update", "delete", "bulk"])("refuses %s action on 'security' and never calls the API write method", async (action) => {
|
|
160
|
+
let writeCalled = false;
|
|
161
|
+
const fakeApi = {
|
|
162
|
+
insertDocument: async () => { writeCalled = true; return {}; },
|
|
163
|
+
updateDocument: async () => { writeCalled = true; return {}; },
|
|
164
|
+
deleteDocument: async () => { writeCalled = true; return {}; },
|
|
165
|
+
bulkInsert: async () => { writeCalled = true; return {}; },
|
|
166
|
+
};
|
|
167
|
+
const invoke = makeHarness(fakeApi);
|
|
168
|
+
const result = await invoke({
|
|
169
|
+
action,
|
|
170
|
+
collection: "security",
|
|
171
|
+
data: '{"_id":"game1","apps":[]}',
|
|
172
|
+
query: '{}',
|
|
173
|
+
});
|
|
174
|
+
(0, vitest_1.expect)(result.isError).toBe(true);
|
|
175
|
+
(0, vitest_1.expect)(writeCalled).toBe(false);
|
|
176
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("funifier_permissions");
|
|
177
|
+
(0, vitest_1.expect)(result.content[0].text).toContain("REPLACE");
|
|
178
|
+
});
|
|
179
|
+
(0, vitest_1.it)("allows query action on 'security'", async () => {
|
|
180
|
+
const fakeApi = { queryCollection: async () => [{ _id: "game1" }] };
|
|
181
|
+
const invoke = makeHarness(fakeApi);
|
|
182
|
+
const result = await invoke({ action: "query", collection: "security" });
|
|
183
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
184
|
+
});
|
|
185
|
+
(0, vitest_1.it)("allows aggregate action on 'security'", async () => {
|
|
186
|
+
const fakeApi = { aggregateCollection: async () => [{ _id: "game1" }] };
|
|
187
|
+
const invoke = makeHarness(fakeApi);
|
|
188
|
+
const result = await invoke({ action: "aggregate", collection: "security", pipeline: "[]" });
|
|
189
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
190
|
+
});
|
|
191
|
+
(0, vitest_1.it)("does not block write actions on other collections", async () => {
|
|
192
|
+
const fakeApi = { updateDocument: async (_c, doc) => doc };
|
|
193
|
+
const invoke = makeHarness(fakeApi);
|
|
194
|
+
const result = await invoke({ action: "update", collection: "player", data: '{"_id":"p1","name":"X"}' });
|
|
195
|
+
(0, vitest_1.expect)(result.isError).toBeUndefined();
|
|
196
|
+
});
|
|
197
|
+
});
|
|
158
198
|
//# sourceMappingURL=database.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database.test.js","sourceRoot":"","sources":["../../../src/mcp/tools/database.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"database.test.js","sourceRoot":"","sources":["../../../src/mcp/tools/database.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/list-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"list-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/list-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyIpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QAqBtD"}
|
|
@@ -67,8 +67,9 @@ const TOOL_CATALOG = {
|
|
|
67
67
|
{
|
|
68
68
|
name: "funifier_permissions",
|
|
69
69
|
requiresApi: true,
|
|
70
|
-
description: "Manage API scopes/security roles and Studio roles/assignments without mixing the two permission models."
|
|
71
|
-
|
|
70
|
+
description: "Manage API scopes/security roles and Studio roles/assignments without mixing the two permission models. " +
|
|
71
|
+
"Every mutating action auto-backups prior state; use list_backups/restore_backup to roll back.",
|
|
72
|
+
keyParams: "action, data?, app_secret?, name?, role_id?, item?, backup_path?",
|
|
72
73
|
},
|
|
73
74
|
{
|
|
74
75
|
name: "funifier_folder",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/list-tools.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"list-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/list-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AA8V1C,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,QAsP9E"}
|