@procedures/fs 0.7.0 → 0.8.0
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/CHANGELOG.md +19 -0
- package/README.md +18 -6
- package/dist/.tsbuildinfo +1 -1
- package/dist/confine.d.ts +64 -0
- package/dist/confine.d.ts.map +1 -0
- package/dist/confine.js +213 -0
- package/dist/confine.js.map +1 -0
- package/dist/module.d.ts +22 -1
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +50 -11
- package/dist/module.js.map +1 -1
- package/dist/root.d.ts +12 -6
- package/dist/root.d.ts.map +1 -1
- package/dist/root.js +14 -8
- package/dist/root.js.map +1 -1
- package/package.json +6 -2
- package/src/confine.ts +246 -0
- package/src/module.ts +51 -11
- package/src/root.ts +14 -8
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The root of the files for all the procedures of a registry (roadmap R33).
|
|
3
|
+
*
|
|
4
|
+
* `confineFsProcedures()` gives the `fs.*` procedures the handlers of the root. The other
|
|
5
|
+
* procedures reach files too: they read with `node:fs`, or they start a program. This file
|
|
6
|
+
* applies the rules that each procedure declares in `metadata.fsRoot` (`FsRootRules` of the core):
|
|
7
|
+
*
|
|
8
|
+
* - **confined**: the procedure names its path inputs. The host examines each of them before the
|
|
9
|
+
* handler starts. A working folder that the call does not give is the root. A path of `paths`
|
|
10
|
+
* starts at the root, and the handler gets it absolute. A path of `names` starts at the working
|
|
11
|
+
* folder, and the handler gets it as the caller gave it (a program resolves it the same way).
|
|
12
|
+
* - **program**: the procedure starts the program of its input (`shell.run`). The host refuses a
|
|
13
|
+
* call of a client. It accepts the nested call of a confined procedure that names the program
|
|
14
|
+
* procedure in `metadata.calls`: that caller chose the program and its arguments.
|
|
15
|
+
* - **refused**: the rules give the reason that the root cannot confine the procedure.
|
|
16
|
+
*
|
|
17
|
+
* A procedure without rules gets a decision from its effects. The decision fails closed: the host
|
|
18
|
+
* refuses the procedure when its effects are not known, when it reads or writes `fs`, or when it
|
|
19
|
+
* writes `process`. A data-driven procedure stays as it is: it reaches files only through its
|
|
20
|
+
* nested calls, and each nested call gets the rules of its own procedure.
|
|
21
|
+
*
|
|
22
|
+
* Each refusal is the error of a path outside the root: `FORBIDDEN` with the reason `outside-root`.
|
|
23
|
+
*/
|
|
24
|
+
import { type AnyProcedure, type FsRootRules, type ProcedureRegistry } from "@procedures/client";
|
|
25
|
+
/** What a root does to a procedure. */
|
|
26
|
+
export type RootKind = "fs" | "confined" | "program" | "refused" | "unchanged";
|
|
27
|
+
/** The decision of a root for one procedure. */
|
|
28
|
+
export interface RootDecision {
|
|
29
|
+
readonly kind: RootKind;
|
|
30
|
+
/** For the kind `refused`: the reason. */
|
|
31
|
+
readonly reason?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* This function gives the rules of a procedure, or undefined when it has none. It throws for
|
|
35
|
+
* rules that are not correct, because the root cannot apply them.
|
|
36
|
+
*/
|
|
37
|
+
export declare function rootRulesOf(procedure: Pick<AnyProcedure, "path" | "metadata">): FsRootRules | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* This function tells what a root does to a procedure, without a root. It throws for rules that
|
|
40
|
+
* are not correct. `confineToRoot()` uses the same decision.
|
|
41
|
+
*/
|
|
42
|
+
export declare function rootDecisionOf(procedure: Pick<AnyProcedure, "path" | "metadata" | "handler">): RootDecision;
|
|
43
|
+
/** What `confineToRoot()` did. Each list holds the keys of the procedures. */
|
|
44
|
+
export interface ConfinedRegistry {
|
|
45
|
+
/** The absolute path of the root. */
|
|
46
|
+
root: string;
|
|
47
|
+
/** The `fs.*` procedures: they have the handlers of `createFsModule({ root })`. */
|
|
48
|
+
fs: string[];
|
|
49
|
+
/** The procedures whose path inputs the root examines. */
|
|
50
|
+
confined: string[];
|
|
51
|
+
/** The procedures that start the program of their input: only as a nested call of a confined procedure. */
|
|
52
|
+
programs: string[];
|
|
53
|
+
/** The procedures that the root refuses. */
|
|
54
|
+
refused: string[];
|
|
55
|
+
/** The procedures that reach no file: the root does not change them. */
|
|
56
|
+
unchanged: string[];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* This function applies the decision of each procedure of the registry, except `fs.*`, to a root
|
|
60
|
+
* that exists. It replaces the handler of each confined, program and refused procedure, and it
|
|
61
|
+
* adds no procedure. `confineToRoot()` of the module starts it after the `fs.*` procedures.
|
|
62
|
+
*/
|
|
63
|
+
export declare function confineOtherProcedures(registry: ProcedureRegistry, folder: string): Omit<ConfinedRegistry, "root" | "fs">;
|
|
64
|
+
//# sourceMappingURL=confine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confine.d.ts","sourceRoot":"","sources":["../src/confine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAQL,KAAK,YAAY,EACjB,KAAK,WAAW,EAGhB,KAAK,iBAAiB,EACvB,MAAM,oBAAoB,CAAC;AAG5B,uCAAuC;AACvC,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;AAE/E,gDAAgD;AAChD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,0CAA0C;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAkBD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,CAAC,GAAG,WAAW,GAAG,SAAS,CAwBvG;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC,GAAG,YAAY,CAoB3G;AAED,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,2GAA2G;IAC3G,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,4CAA4C;IAC5C,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,wEAAwE;IACxE,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAwDD;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC,CAgDzH"}
|
package/dist/confine.js
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The root of the files for all the procedures of a registry (roadmap R33).
|
|
3
|
+
*
|
|
4
|
+
* `confineFsProcedures()` gives the `fs.*` procedures the handlers of the root. The other
|
|
5
|
+
* procedures reach files too: they read with `node:fs`, or they start a program. This file
|
|
6
|
+
* applies the rules that each procedure declares in `metadata.fsRoot` (`FsRootRules` of the core):
|
|
7
|
+
*
|
|
8
|
+
* - **confined**: the procedure names its path inputs. The host examines each of them before the
|
|
9
|
+
* handler starts. A working folder that the call does not give is the root. A path of `paths`
|
|
10
|
+
* starts at the root, and the handler gets it absolute. A path of `names` starts at the working
|
|
11
|
+
* folder, and the handler gets it as the caller gave it (a program resolves it the same way).
|
|
12
|
+
* - **program**: the procedure starts the program of its input (`shell.run`). The host refuses a
|
|
13
|
+
* call of a client. It accepts the nested call of a confined procedure that names the program
|
|
14
|
+
* procedure in `metadata.calls`: that caller chose the program and its arguments.
|
|
15
|
+
* - **refused**: the rules give the reason that the root cannot confine the procedure.
|
|
16
|
+
*
|
|
17
|
+
* A procedure without rules gets a decision from its effects. The decision fails closed: the host
|
|
18
|
+
* refuses the procedure when its effects are not known, when it reads or writes `fs`, or when it
|
|
19
|
+
* writes `process`. A data-driven procedure stays as it is: it reaches files only through its
|
|
20
|
+
* nested calls, and each nested call gets the rules of its own procedure.
|
|
21
|
+
*
|
|
22
|
+
* Each refusal is the error of a path outside the root: `FORBIDDEN` with the reason `outside-root`.
|
|
23
|
+
*/
|
|
24
|
+
import { callMatches, declaredCalls, effectsOf, isDataDriven, pathToKey, scopeOf, withScope, } from "@procedures/client";
|
|
25
|
+
import { inRoot, outsideRoot, resolveRoot } from "./root.js";
|
|
26
|
+
/** The resource name of the files of the host (CAPABILITIES-2026-10). */
|
|
27
|
+
const FILES = "fs";
|
|
28
|
+
/** The resource name of a procedure that starts any program. */
|
|
29
|
+
const PROGRAMS = "process";
|
|
30
|
+
/** The keys of the rules that `FsRootRules` has. */
|
|
31
|
+
const RULE_KEYS = new Set(["cwd", "paths", "names", "required", "values", "refuse", "program"]);
|
|
32
|
+
/** The procedure key of a path, for the messages. */
|
|
33
|
+
const keyOf = (procedure) => pathToKey(procedure.path);
|
|
34
|
+
/** True for a list of names that are not empty. */
|
|
35
|
+
function isNameList(value) {
|
|
36
|
+
return Array.isArray(value) && value.every((name) => typeof name === "string" && name.length > 0);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* This function gives the rules of a procedure, or undefined when it has none. It throws for
|
|
40
|
+
* rules that are not correct, because the root cannot apply them.
|
|
41
|
+
*/
|
|
42
|
+
export function rootRulesOf(procedure) {
|
|
43
|
+
const rules = procedure.metadata?.fsRoot;
|
|
44
|
+
if (rules === undefined)
|
|
45
|
+
return undefined;
|
|
46
|
+
const invalid = (problem) => new Error(`The metadata.fsRoot of ${keyOf(procedure)} is not correct: ${problem}`);
|
|
47
|
+
if (rules === null || typeof rules !== "object" || Array.isArray(rules))
|
|
48
|
+
throw invalid("it must be an object");
|
|
49
|
+
const record = rules;
|
|
50
|
+
for (const key of Object.keys(record)) {
|
|
51
|
+
if (!RULE_KEYS.has(key))
|
|
52
|
+
throw invalid(`it has the unknown key ${key}`);
|
|
53
|
+
}
|
|
54
|
+
if (record["cwd"] !== undefined && (typeof record["cwd"] !== "string" || record["cwd"] === ""))
|
|
55
|
+
throw invalid("cwd must be the name of an input");
|
|
56
|
+
for (const key of ["paths", "names", "required", "values"]) {
|
|
57
|
+
if (record[key] !== undefined && !isNameList(record[key]))
|
|
58
|
+
throw invalid(`${key} must be a list of texts`);
|
|
59
|
+
}
|
|
60
|
+
if (record["refuse"] !== undefined && (typeof record["refuse"] !== "string" || record["refuse"] === ""))
|
|
61
|
+
throw invalid("refuse must be the reason, as text");
|
|
62
|
+
if (record["program"] !== undefined && typeof record["program"] !== "boolean")
|
|
63
|
+
throw invalid("program must be true or false");
|
|
64
|
+
const typed = rules;
|
|
65
|
+
if (typed.refuse !== undefined && Object.keys(record).length > 1)
|
|
66
|
+
throw invalid("refuse cannot go with other rules");
|
|
67
|
+
const paths = new Set(typed.paths ?? []);
|
|
68
|
+
for (const name of typed.required ?? []) {
|
|
69
|
+
if (!paths.has(name))
|
|
70
|
+
throw invalid(`the required input ${name} is not in paths`);
|
|
71
|
+
}
|
|
72
|
+
const inputs = [...(typed.cwd !== undefined ? [typed.cwd] : []), ...(typed.paths ?? []), ...(typed.names ?? [])];
|
|
73
|
+
if (new Set(inputs).size !== inputs.length)
|
|
74
|
+
throw invalid("an input is in more than one of cwd, paths and names");
|
|
75
|
+
return typed;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* This function tells what a root does to a procedure, without a root. It throws for rules that
|
|
79
|
+
* are not correct. `confineToRoot()` uses the same decision.
|
|
80
|
+
*/
|
|
81
|
+
export function rootDecisionOf(procedure) {
|
|
82
|
+
if (procedure.path[0] === FILES)
|
|
83
|
+
return { kind: "fs" };
|
|
84
|
+
const rules = rootRulesOf(procedure);
|
|
85
|
+
if (rules !== undefined) {
|
|
86
|
+
if (rules.refuse !== undefined)
|
|
87
|
+
return { kind: "refused", reason: rules.refuse };
|
|
88
|
+
return { kind: rules.program === true ? "program" : "confined" };
|
|
89
|
+
}
|
|
90
|
+
// A data-driven procedure runs the refs of its caller: each nested call gets its own decision
|
|
91
|
+
if (isDataDriven(procedure))
|
|
92
|
+
return { kind: "unchanged" };
|
|
93
|
+
const effects = effectsOf(procedure);
|
|
94
|
+
if (effects?.reads === undefined || effects.writes === undefined) {
|
|
95
|
+
return { kind: "refused", reason: "it declares no effects and no metadata.fsRoot, so its files are not known" };
|
|
96
|
+
}
|
|
97
|
+
if (effects.reads.includes(FILES) || effects.writes.includes(FILES)) {
|
|
98
|
+
return { kind: "refused", reason: "it reads or writes files, and it declares no metadata.fsRoot" };
|
|
99
|
+
}
|
|
100
|
+
if (effects.writes.includes(PROGRAMS)) {
|
|
101
|
+
return { kind: "refused", reason: "it starts a program, and it declares no metadata.fsRoot" };
|
|
102
|
+
}
|
|
103
|
+
return { kind: "unchanged" };
|
|
104
|
+
}
|
|
105
|
+
/** The values of a path input: a text, or a list of texts. Another value cannot be examined. */
|
|
106
|
+
function pathValues(value, name, at) {
|
|
107
|
+
if (typeof value === "string")
|
|
108
|
+
return [value];
|
|
109
|
+
if (Array.isArray(value) && value.every((item) => typeof item === "string"))
|
|
110
|
+
return value;
|
|
111
|
+
throw outsideRoot(at, `the input ${name} is not a path or a list of paths, so the root cannot examine it`);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* This function gives the input with each path in the root. The working folder that the call does
|
|
115
|
+
* not give is the root. Each path of `paths` starts at the root and becomes absolute. A path of
|
|
116
|
+
* `names` starts at the working folder, and it stays as it is.
|
|
117
|
+
*/
|
|
118
|
+
async function confinedInput(input, rules, root, at) {
|
|
119
|
+
const examines = rules.cwd !== undefined || (rules.paths?.length ?? 0) > 0 || (rules.names?.length ?? 0) > 0;
|
|
120
|
+
if (!examines)
|
|
121
|
+
return input;
|
|
122
|
+
if (input === null || typeof input !== "object" || Array.isArray(input)) {
|
|
123
|
+
throw outsideRoot(at, "the input is not an object, so the root cannot examine its paths");
|
|
124
|
+
}
|
|
125
|
+
const given = input;
|
|
126
|
+
const next = { ...given };
|
|
127
|
+
const kept = new Set(rules.values ?? []);
|
|
128
|
+
let base = root.folder;
|
|
129
|
+
if (rules.cwd !== undefined) {
|
|
130
|
+
const value = given[rules.cwd];
|
|
131
|
+
if (value !== undefined && value !== null && typeof value !== "string") {
|
|
132
|
+
throw outsideRoot(at, `the input ${rules.cwd} is not a folder, so the root cannot examine it`);
|
|
133
|
+
}
|
|
134
|
+
base = await inRoot(root, typeof value === "string" ? value : ".", at);
|
|
135
|
+
next[rules.cwd] = base;
|
|
136
|
+
}
|
|
137
|
+
for (const name of rules.paths ?? []) {
|
|
138
|
+
const value = given[name];
|
|
139
|
+
if (value === undefined || value === null) {
|
|
140
|
+
if (rules.required?.includes(name)) {
|
|
141
|
+
throw outsideRoot(at, `the input ${name} has no value, and its default is outside the root ${root.folder}: give a path in the root`);
|
|
142
|
+
}
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const absolute = [];
|
|
146
|
+
for (const path of pathValues(value, name, at))
|
|
147
|
+
absolute.push(kept.has(path) ? path : await inRoot(root, path, at));
|
|
148
|
+
next[name] = typeof value === "string" ? absolute[0] : absolute;
|
|
149
|
+
}
|
|
150
|
+
for (const name of rules.names ?? []) {
|
|
151
|
+
const value = given[name];
|
|
152
|
+
if (value === undefined || value === null)
|
|
153
|
+
continue;
|
|
154
|
+
for (const path of pathValues(value, name, at))
|
|
155
|
+
if (!kept.has(path))
|
|
156
|
+
await inRoot(root, path, at, base);
|
|
157
|
+
}
|
|
158
|
+
// A runner reads the scope of its raw input: the copy keeps it (DOC-10)
|
|
159
|
+
return withScope(next, scopeOf(input));
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* This function applies the decision of each procedure of the registry, except `fs.*`, to a root
|
|
163
|
+
* that exists. It replaces the handler of each confined, program and refused procedure, and it
|
|
164
|
+
* adds no procedure. `confineToRoot()` of the module starts it after the `fs.*` procedures.
|
|
165
|
+
*/
|
|
166
|
+
export function confineOtherProcedures(registry, folder) {
|
|
167
|
+
const result = { confined: [], programs: [], refused: [], unchanged: [] };
|
|
168
|
+
// All decisions first: a rule that is not correct throws before the registry changes
|
|
169
|
+
const decisions = registry
|
|
170
|
+
.getAll()
|
|
171
|
+
.filter((procedure) => procedure.path[0] !== FILES)
|
|
172
|
+
.map((procedure) => ({ procedure, decision: rootDecisionOf(procedure) }));
|
|
173
|
+
const confinedProcedures = new WeakSet();
|
|
174
|
+
const root = () => resolveRoot(folder);
|
|
175
|
+
for (const { procedure, decision } of decisions) {
|
|
176
|
+
const key = keyOf(procedure);
|
|
177
|
+
const original = procedure.handler;
|
|
178
|
+
if (decision.kind === "unchanged" || original === undefined) {
|
|
179
|
+
result.unchanged.push(key);
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const rules = rootRulesOf(procedure) ?? {};
|
|
183
|
+
let handler;
|
|
184
|
+
if (decision.kind === "refused") {
|
|
185
|
+
const message = `the root ${folder} cannot confine this procedure: ${decision.reason ?? "no reason"}`;
|
|
186
|
+
handler = (async () => {
|
|
187
|
+
throw outsideRoot(procedure.path, message);
|
|
188
|
+
});
|
|
189
|
+
result.refused.push(key);
|
|
190
|
+
}
|
|
191
|
+
else if (decision.kind === "program") {
|
|
192
|
+
handler = (async (input, ctx) => {
|
|
193
|
+
const caller = ctx?.caller;
|
|
194
|
+
const named = caller !== undefined && (declaredCalls(caller) ?? []).some((entry) => callMatches(entry, key));
|
|
195
|
+
if (caller === undefined || !confinedProcedures.has(caller) || !named) {
|
|
196
|
+
const from = caller === undefined ? "a client" : keyOf(caller);
|
|
197
|
+
throw outsideRoot(procedure.path, `this procedure starts the program of its input. Under the root ${folder}, it runs only as the nested call of a confined procedure that names it in metadata.calls, not for ${from}`);
|
|
198
|
+
}
|
|
199
|
+
return original(await confinedInput(input, rules, await root(), procedure.path), ctx);
|
|
200
|
+
});
|
|
201
|
+
result.programs.push(key);
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
handler = (async (input, ctx) => original(await confinedInput(input, rules, await root(), procedure.path), ctx));
|
|
205
|
+
result.confined.push(key);
|
|
206
|
+
}
|
|
207
|
+
registry.register({ ...procedure, handler }, { override: true });
|
|
208
|
+
if (decision.kind === "confined")
|
|
209
|
+
confinedProcedures.add(registry.get(procedure.path));
|
|
210
|
+
}
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=confine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"confine.js","sourceRoot":"","sources":["../src/confine.ts"],"names":[],"mappings":"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"}
|
package/dist/module.d.ts
CHANGED
|
@@ -7,9 +7,12 @@
|
|
|
7
7
|
* This file is referenced by package.json's client.procedures field.
|
|
8
8
|
*
|
|
9
9
|
* `fsModule` operates on each path. `createFsModule({ root })` gives the same procedures, and
|
|
10
|
-
* each path of their input must be in the root (roadmap R33, `root.ts`).
|
|
10
|
+
* each path of their input must be in the root (roadmap R33, `root.ts`). `confineToRoot()` gives
|
|
11
|
+
* a root to all the procedures of a registry (`confine.ts`).
|
|
11
12
|
*/
|
|
12
13
|
import { type ProcedureModule, type ProcedureRegistry } from "@procedures/client";
|
|
14
|
+
import { type ConfinedRegistry } from "./confine.js";
|
|
15
|
+
export { rootDecisionOf, rootRulesOf, type ConfinedRegistry, type RootDecision, type RootKind } from "./confine.js";
|
|
13
16
|
/**
|
|
14
17
|
* The module of this package, for `createRegistry()`: its procedures as data. Importing this
|
|
15
18
|
* file registers nothing. (`register.ts` registers the same procedures in the global registry.)
|
|
@@ -48,8 +51,26 @@ export interface ConfinedFs {
|
|
|
48
51
|
* A nested call of another procedure (`lib.scan` calls `fs.readdir`) finds the procedure in the
|
|
49
52
|
* registry, so the root confines that call too. The root must be a folder that exists. An `fs.*`
|
|
50
53
|
* procedure that this package does not have is an error, because the root cannot confine it.
|
|
54
|
+
*
|
|
55
|
+
* This function changes only the `fs.*` procedures. A host uses `confineToRoot()`: it also keeps
|
|
56
|
+
* the paths of the other procedures in the root, or it refuses them.
|
|
51
57
|
*/
|
|
52
58
|
export declare function confineFsProcedures(registry: ProcedureRegistry, root: string): ConfinedFs;
|
|
59
|
+
/**
|
|
60
|
+
* This function confines each procedure of a registry to a root (roadmap R33). A host starts it
|
|
61
|
+
* after the last registration: `mark --fs-root`, `procedure-server --fs-root` and `MCP_FS_ROOT`.
|
|
62
|
+
*
|
|
63
|
+
* - Each `fs.*` procedure gets the handler of `createFsModule({ root })`, as with
|
|
64
|
+
* `confineFsProcedures()`.
|
|
65
|
+
* - Each other procedure gets the decision of `rootDecisionOf()`: the host examines its path
|
|
66
|
+
* inputs (`metadata.fsRoot`), or it refuses the procedure. A procedure that reaches no file
|
|
67
|
+
* stays as it is.
|
|
68
|
+
*
|
|
69
|
+
* The function adds no procedure, and the names of the tools do not change. It changes nothing
|
|
70
|
+
* when it throws: for a root that does not exist, an unknown `fs.*` procedure, or rules that are
|
|
71
|
+
* not correct.
|
|
72
|
+
*/
|
|
73
|
+
export declare function confineToRoot(registry: ProcedureRegistry, root: string): ConfinedRegistry;
|
|
53
74
|
/**
|
|
54
75
|
* This function registers the procedures of @procedures/fs, and of the modules that it requires, in
|
|
55
76
|
* a registry. The default is the global registry. Importing this file registers nothing: the
|
package/dist/module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAA8E,KAAK,eAAe,EAAuC,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAInM,OAAO,EAA0C,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAyT7F,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,KAAK,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AAEpH;;;GAGG;AACH,eAAO,MAAM,QAAQ,EAAE,eAgBnB,CAAC;eAEU,QAAQ;AAEvB,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,eAAoB,GAAG,eAAe,CAW7E;AAED,4CAA4C;AAC5C,MAAM,WAAW,UAAU;IACzB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,0FAA0F;IAC1F,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAKzF;AA2BD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAQzF;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,GAAE,iBAAsC,EAAE,OAAO,GAAE,eAAoB,GAAG,IAAI,CAE1H"}
|
package/dist/module.js
CHANGED
|
@@ -7,12 +7,14 @@
|
|
|
7
7
|
* This file is referenced by package.json's client.procedures field.
|
|
8
8
|
*
|
|
9
9
|
* `fsModule` operates on each path. `createFsModule({ root })` gives the same procedures, and
|
|
10
|
-
* each path of their input must be in the root (roadmap R33, `root.ts`).
|
|
10
|
+
* each path of their input must be in the root (roadmap R33, `root.ts`). `confineToRoot()` gives
|
|
11
|
+
* a root to all the procedures of a registry (`confine.ts`).
|
|
11
12
|
*/
|
|
12
13
|
import { createProcedure, zodAdapter, defineModule, PROCEDURE_REGISTRY, registerModules } from "@procedures/client";
|
|
13
14
|
import { statSync } from "node:fs";
|
|
14
15
|
import { resolve } from "node:path";
|
|
15
16
|
import { HANDLER_NAMES, rootedHandlers } from "./handlers.js";
|
|
17
|
+
import { confineOtherProcedures, rootDecisionOf } from "./confine.js";
|
|
16
18
|
import { read } from "./procedures/fs/read.js";
|
|
17
19
|
import { write } from "./procedures/fs/write.js";
|
|
18
20
|
import { exists } from "./procedures/fs/exists.js";
|
|
@@ -242,6 +244,8 @@ const fsWatchProcedure = createProcedure()
|
|
|
242
244
|
// =============================================================================
|
|
243
245
|
// Registration
|
|
244
246
|
// =============================================================================
|
|
247
|
+
// The root for all the procedures of a registry (roadmap R33)
|
|
248
|
+
export { rootDecisionOf, rootRulesOf } from "./confine.js";
|
|
245
249
|
/**
|
|
246
250
|
* The module of this package, for `createRegistry()`: its procedures as data. Importing this
|
|
247
251
|
* file registers nothing. (`register.ts` registers the same procedures in the global registry.)
|
|
@@ -292,8 +296,19 @@ export function createFsModule(options = {}) {
|
|
|
292
296
|
* A nested call of another procedure (`lib.scan` calls `fs.readdir`) finds the procedure in the
|
|
293
297
|
* registry, so the root confines that call too. The root must be a folder that exists. An `fs.*`
|
|
294
298
|
* procedure that this package does not have is an error, because the root cannot confine it.
|
|
299
|
+
*
|
|
300
|
+
* This function changes only the `fs.*` procedures. A host uses `confineToRoot()`: it also keeps
|
|
301
|
+
* the paths of the other procedures in the root, or it refuses them.
|
|
295
302
|
*/
|
|
296
303
|
export function confineFsProcedures(registry, root) {
|
|
304
|
+
const folder = rootFolder(root);
|
|
305
|
+
const rooted = rootedFsProcedures(registry, folder);
|
|
306
|
+
for (const procedure of rooted)
|
|
307
|
+
registry.register(procedure, { override: true });
|
|
308
|
+
return { root: folder, procedures: rooted.map((procedure) => procedure.path.join(".")) };
|
|
309
|
+
}
|
|
310
|
+
/** The absolute path of a root. It throws when the root does not exist or is not a folder. */
|
|
311
|
+
function rootFolder(root) {
|
|
297
312
|
const folder = resolve(root);
|
|
298
313
|
let isFolder;
|
|
299
314
|
try {
|
|
@@ -304,20 +319,44 @@ export function confineFsProcedures(registry, root) {
|
|
|
304
319
|
}
|
|
305
320
|
if (!isFolder)
|
|
306
321
|
throw new Error(`The root of the file procedures is not a folder: ${folder}`);
|
|
322
|
+
return folder;
|
|
323
|
+
}
|
|
324
|
+
/** The procedures with a root for the `fs.*` procedures of a registry. An unknown `fs.*` procedure is an error. */
|
|
325
|
+
function rootedFsProcedures(registry, folder) {
|
|
307
326
|
const rooted = new Map(createFsModule({ root: folder }).procedures.map((procedure) => [procedure.path.join("."), procedure]));
|
|
308
327
|
const present = registry.getAll().filter((procedure) => procedure.path[0] === "fs");
|
|
309
|
-
|
|
328
|
+
return present.map((procedure) => {
|
|
310
329
|
const key = procedure.path.join(".");
|
|
311
|
-
|
|
330
|
+
const replacement = rooted.get(key);
|
|
331
|
+
if (!replacement)
|
|
312
332
|
throw new Error(`The root of the file procedures cannot confine ${key}: @procedures/fs has no such procedure`);
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
333
|
+
return replacement;
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* This function confines each procedure of a registry to a root (roadmap R33). A host starts it
|
|
338
|
+
* after the last registration: `mark --fs-root`, `procedure-server --fs-root` and `MCP_FS_ROOT`.
|
|
339
|
+
*
|
|
340
|
+
* - Each `fs.*` procedure gets the handler of `createFsModule({ root })`, as with
|
|
341
|
+
* `confineFsProcedures()`.
|
|
342
|
+
* - Each other procedure gets the decision of `rootDecisionOf()`: the host examines its path
|
|
343
|
+
* inputs (`metadata.fsRoot`), or it refuses the procedure. A procedure that reaches no file
|
|
344
|
+
* stays as it is.
|
|
345
|
+
*
|
|
346
|
+
* The function adds no procedure, and the names of the tools do not change. It changes nothing
|
|
347
|
+
* when it throws: for a root that does not exist, an unknown `fs.*` procedure, or rules that are
|
|
348
|
+
* not correct.
|
|
349
|
+
*/
|
|
350
|
+
export function confineToRoot(registry, root) {
|
|
351
|
+
const folder = rootFolder(root);
|
|
352
|
+
const rooted = rootedFsProcedures(registry, folder);
|
|
353
|
+
// Each decision before a change: rules that are not correct throw here
|
|
354
|
+
for (const procedure of registry.getAll())
|
|
355
|
+
rootDecisionOf(procedure);
|
|
356
|
+
for (const procedure of rooted)
|
|
357
|
+
registry.register(procedure, { override: true });
|
|
358
|
+
const others = confineOtherProcedures(registry, folder);
|
|
359
|
+
return { root: folder, fs: rooted.map((procedure) => procedure.path.join(".")), ...others };
|
|
321
360
|
}
|
|
322
361
|
/**
|
|
323
362
|
* This function registers the procedures of @procedures/fs, and of the modules that it requires, in
|
package/dist/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"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"}
|
package/dist/root.d.ts
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The root of the file procedures: one folder that confines each path (roadmap R33).
|
|
3
3
|
*
|
|
4
|
+
* This file is the `./root` entry of the package: the rules without the procedures. Another
|
|
5
|
+
* package that confines its own paths imports them, for example `@procedures/archive`.
|
|
6
|
+
*
|
|
4
7
|
* `createFsModule({ root })` sends each path of an input through `inRoot()`:
|
|
5
8
|
* - A relative path starts at the root, not at the working folder of the process.
|
|
6
9
|
* - A path outside the root gives `FORBIDDEN` with the reason `outside-root`. This includes a
|
|
@@ -32,8 +35,11 @@ export interface ResolvedRoot {
|
|
|
32
35
|
folder: string;
|
|
33
36
|
real: string;
|
|
34
37
|
}
|
|
35
|
-
/**
|
|
36
|
-
|
|
38
|
+
/**
|
|
39
|
+
* This function gives the absolute path and the real path of a root. The root must exist. The
|
|
40
|
+
* error of a missing root names `owner`, for example "the archive procedures".
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveRoot(root: string, owner?: string): Promise<ResolvedRoot>;
|
|
37
43
|
/** The `FORBIDDEN` error for a path outside the root. */
|
|
38
44
|
export declare function outsideRoot(procedure: ProcedurePath, message: string): InvocationError;
|
|
39
45
|
/** True for the `FORBIDDEN` error of a path outside the root. */
|
|
@@ -44,9 +50,9 @@ export declare function isOutsideRoot(error: unknown): boolean;
|
|
|
44
50
|
*/
|
|
45
51
|
export declare function realPathIsInside(root: ResolvedRoot, absolute: string): Promise<boolean>;
|
|
46
52
|
/**
|
|
47
|
-
* This function gives the absolute path of `path` in the root. A relative path starts at
|
|
48
|
-
* root. The real path decides: a path whose real path is outside the
|
|
49
|
-
* `FORBIDDEN` with the reason `outside-root`.
|
|
53
|
+
* This function gives the absolute path of `path` in the root. A relative path starts at `base`,
|
|
54
|
+
* and the default `base` is the root. The real path decides: a path whose real path is outside the
|
|
55
|
+
* real path of the root gives `FORBIDDEN` with the reason `outside-root`.
|
|
50
56
|
*/
|
|
51
|
-
export declare function inRoot(root: ResolvedRoot, path: string, procedure: ProcedurePath): Promise<string>;
|
|
57
|
+
export declare function inRoot(root: ResolvedRoot, path: string, procedure: ProcedurePath, base?: string): Promise<string>;
|
|
52
58
|
//# sourceMappingURL=root.d.ts.map
|
package/dist/root.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEzE,uEAAuE;AACvE,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAK3C;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAG9D;AAoBD;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBzE;AAED,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,SAAwB,GAAG,OAAO,CAAC,YAAY,CAAC,CAUpG;AAED,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAEtF;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAErD;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAE7F;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,IAAI,GAAE,MAAoB,GAAG,OAAO,CAAC,MAAM,CAAC,CAYpI"}
|
package/dist/root.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* The root of the file procedures: one folder that confines each path (roadmap R33).
|
|
3
3
|
*
|
|
4
|
+
* This file is the `./root` entry of the package: the rules without the procedures. Another
|
|
5
|
+
* package that confines its own paths imports them, for example `@procedures/archive`.
|
|
6
|
+
*
|
|
4
7
|
* `createFsModule({ root })` sends each path of an input through `inRoot()`:
|
|
5
8
|
* - A relative path starts at the root, not at the working folder of the process.
|
|
6
9
|
* - A path outside the root gives `FORBIDDEN` with the reason `outside-root`. This includes a
|
|
@@ -79,8 +82,11 @@ export async function realPathOf(path, links = 0) {
|
|
|
79
82
|
current = parent;
|
|
80
83
|
}
|
|
81
84
|
}
|
|
82
|
-
/**
|
|
83
|
-
|
|
85
|
+
/**
|
|
86
|
+
* This function gives the absolute path and the real path of a root. The root must exist. The
|
|
87
|
+
* error of a missing root names `owner`, for example "the archive procedures".
|
|
88
|
+
*/
|
|
89
|
+
export async function resolveRoot(root, owner = "the file procedures") {
|
|
84
90
|
const folder = resolve(root);
|
|
85
91
|
try {
|
|
86
92
|
return { folder, real: await realpath(folder) };
|
|
@@ -88,7 +94,7 @@ export async function resolveRoot(root) {
|
|
|
88
94
|
catch (error) {
|
|
89
95
|
if (!isMissing(error))
|
|
90
96
|
throw error;
|
|
91
|
-
const missing = new Error(`The root of
|
|
97
|
+
const missing = new Error(`The root of ${owner} does not exist: ${folder}`);
|
|
92
98
|
missing.code = "ENOENT";
|
|
93
99
|
throw missing;
|
|
94
100
|
}
|
|
@@ -109,12 +115,12 @@ export async function realPathIsInside(root, absolute) {
|
|
|
109
115
|
return isInside(root.real, await realPathOf(absolute));
|
|
110
116
|
}
|
|
111
117
|
/**
|
|
112
|
-
* This function gives the absolute path of `path` in the root. A relative path starts at
|
|
113
|
-
* root. The real path decides: a path whose real path is outside the
|
|
114
|
-
* `FORBIDDEN` with the reason `outside-root`.
|
|
118
|
+
* This function gives the absolute path of `path` in the root. A relative path starts at `base`,
|
|
119
|
+
* and the default `base` is the root. The real path decides: a path whose real path is outside the
|
|
120
|
+
* real path of the root gives `FORBIDDEN` with the reason `outside-root`.
|
|
115
121
|
*/
|
|
116
|
-
export async function inRoot(root, path, procedure) {
|
|
117
|
-
const absolute = resolve(
|
|
122
|
+
export async function inRoot(root, path, procedure, base = root.folder) {
|
|
123
|
+
const absolute = resolve(base, path);
|
|
118
124
|
const real = await realPathOf(absolute);
|
|
119
125
|
// A path counts as inside by its given form or by its real form. On Windows, the two forms of a
|
|
120
126
|
// folder can differ by more than the links: a short 8.3 name (RUNNER~1) has a long real name.
|
package/dist/root.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"root.js","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"root.js","sourceRoot":"","sources":["../src/root.ts"],"names":[],"mappings":"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"}
|