@inhuman.tools/policy 0.0.0-stage → 0.2.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/LICENSE.md +7 -0
- package/authorize.scm +4 -0
- package/dist/acknowledge.d.ts +70 -0
- package/dist/acknowledge.d.ts.map +1 -0
- package/dist/acknowledge.js +162 -0
- package/dist/acknowledge.js.map +1 -0
- package/dist/authorize.d.ts +8 -0
- package/dist/authorize.d.ts.map +1 -0
- package/dist/authorize.js +39 -0
- package/dist/authorize.js.map +1 -0
- package/dist/bind.d.ts +6 -0
- package/dist/bind.d.ts.map +1 -0
- package/dist/bind.js +45 -0
- package/dist/bind.js.map +1 -0
- package/dist/check.d.ts +30 -0
- package/dist/check.d.ts.map +1 -0
- package/dist/check.js +389 -0
- package/dist/check.js.map +1 -0
- package/dist/classes.d.ts +23 -0
- package/dist/classes.d.ts.map +1 -0
- package/dist/classes.js +139 -0
- package/dist/classes.js.map +1 -0
- package/dist/compile.d.ts +40 -0
- package/dist/compile.d.ts.map +1 -0
- package/dist/compile.js +311 -0
- package/dist/compile.js.map +1 -0
- package/dist/deadline.d.ts +5 -0
- package/dist/deadline.d.ts.map +1 -0
- package/dist/deadline.js +17 -0
- package/dist/deadline.js.map +1 -0
- package/dist/floor.d.ts +9 -0
- package/dist/floor.d.ts.map +1 -0
- package/dist/floor.js +9 -0
- package/dist/floor.js.map +1 -0
- package/dist/glob-expand.d.ts +10 -0
- package/dist/glob-expand.d.ts.map +1 -0
- package/dist/glob-expand.js +132 -0
- package/dist/glob-expand.js.map +1 -0
- package/dist/guards.d.ts +26 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +419 -0
- package/dist/guards.js.map +1 -0
- package/dist/identity.d.ts +11 -0
- package/dist/identity.d.ts.map +1 -0
- package/dist/identity.js +23 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/lift.d.ts +4 -0
- package/dist/lift.d.ts.map +1 -0
- package/dist/lift.js +14 -0
- package/dist/lift.js.map +1 -0
- package/dist/path-policy.d.ts +53 -0
- package/dist/path-policy.d.ts.map +1 -0
- package/dist/path-policy.js +248 -0
- package/dist/path-policy.js.map +1 -0
- package/dist/processor.d.ts +71 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +132 -0
- package/dist/processor.js.map +1 -0
- package/dist/reasonable-defaults.d.ts +1448 -0
- package/dist/reasonable-defaults.d.ts.map +1 -0
- package/dist/reasonable-defaults.js +6 -0
- package/dist/reasonable-defaults.js.map +1 -0
- package/dist/reasonable-defaults.json +1662 -0
- package/dist/run-authorization.d.ts +8 -0
- package/dist/run-authorization.d.ts.map +1 -0
- package/dist/run-authorization.js +16 -0
- package/dist/run-authorization.js.map +1 -0
- package/dist/tool-path.d.ts +8 -0
- package/dist/tool-path.d.ts.map +1 -0
- package/dist/tool-path.js +38 -0
- package/dist/tool-path.js.map +1 -0
- package/dist/types.d.ts +87 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/dist/verdict.d.ts +15 -0
- package/dist/verdict.d.ts.map +1 -0
- package/dist/verdict.js +55 -0
- package/dist/verdict.js.map +1 -0
- package/package.json +62 -3
- package/src/acknowledge.ts +206 -0
- package/src/authorize.ts +38 -0
- package/src/bind.ts +58 -0
- package/src/check.ts +552 -0
- package/src/classes.ts +156 -0
- package/src/compile.ts +370 -0
- package/src/deadline.ts +15 -0
- package/src/floor.ts +16 -0
- package/src/glob-expand.ts +137 -0
- package/src/guards.ts +428 -0
- package/src/identity.ts +26 -0
- package/src/index.ts +24 -0
- package/src/lift.ts +15 -0
- package/src/path-policy.ts +280 -0
- package/src/processor.ts +187 -0
- package/src/reasonable-defaults.json +1662 -0
- package/src/reasonable-defaults.ts +8 -0
- package/src/run-authorization.ts +23 -0
- package/src/tool-path.ts +43 -0
- package/src/types.ts +102 -0
- package/src/verdict.ts +63 -0
- package/README.md +0 -3
package/dist/guards.js
ADDED
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Argument guards: what an option table cannot say. A guard sees the command
|
|
3
|
+
* node's positionals and flag bag and returns extra votes that join the node's
|
|
4
|
+
* own vote on the strict lattice, so a guard can tighten a verdict, never lift it.
|
|
5
|
+
*
|
|
6
|
+
* `flag_paths` (option values typed as paths, glued short values included) is
|
|
7
|
+
* a guard that every node gets for free.
|
|
8
|
+
*/
|
|
9
|
+
import { posix } from "node:path";
|
|
10
|
+
import { explainPath, explainShellPath } from "./path-policy.js";
|
|
11
|
+
import { cast } from "./verdict.js";
|
|
12
|
+
export function guardVotes(node, toks, flags, paths) {
|
|
13
|
+
const positionals = toks.filter((tok) => tok !== "--");
|
|
14
|
+
return [
|
|
15
|
+
...flagPathVotes(node.flagPaths, flags, paths),
|
|
16
|
+
...node.guards.flatMap((name) => (GUARD_TABLE[name] ?? unknownGuard)(positionals, flags, paths)),
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
function unknownGuard() {
|
|
20
|
+
return [cast("ask", "unmodelled", "guard:unknown")];
|
|
21
|
+
}
|
|
22
|
+
export function pathVote(kind, path, paths) {
|
|
23
|
+
const cluster = kind === "read_path" ? paths.read : paths.write;
|
|
24
|
+
if (cluster === undefined)
|
|
25
|
+
return cast("ask", "unmodelled", `${kind === "read_path" ? "read" : "write"}:no-policy`);
|
|
26
|
+
return paths.expand === true
|
|
27
|
+
? explainShellPath(cluster, path, { dotglob: paths.dotglob })
|
|
28
|
+
: explainPath(cluster, path);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* `--output=F`, `--output F`, `-o F`, and glued `-oF`. An empty value (an
|
|
32
|
+
* option that lost its operand, or a letter cluster such as `-ofile`) is an
|
|
33
|
+
* unresolvable path and asks.
|
|
34
|
+
*/
|
|
35
|
+
function flagPathVotes(flagPaths, flags, paths) {
|
|
36
|
+
const votes = [];
|
|
37
|
+
for (const [name, kind] of Object.entries(flagPaths)) {
|
|
38
|
+
for (const value of flags[name] ?? [])
|
|
39
|
+
votes.push(pathVote(kind, value, paths));
|
|
40
|
+
if (name.startsWith("--") || name.length !== 2)
|
|
41
|
+
continue;
|
|
42
|
+
for (const key of Object.keys(flags)) {
|
|
43
|
+
if (key.startsWith(name) && key.length > 2 && !key.startsWith("--")) {
|
|
44
|
+
votes.push(pathVote(kind, key.slice(2), paths));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return votes;
|
|
49
|
+
}
|
|
50
|
+
/** True when `key` is `full` or an unambiguous long-option prefix of it (`--out` of `--output`). */
|
|
51
|
+
function isOption(key, full) {
|
|
52
|
+
return key === full || (key.startsWith("--") && key.length >= 3 && full.startsWith(key));
|
|
53
|
+
}
|
|
54
|
+
const GIT_CONFIG_DENY = [
|
|
55
|
+
/^alias\./,
|
|
56
|
+
/^include(if)?\./,
|
|
57
|
+
/^core\.(hookspath|fsmonitor|sshcommand|pager|editor|askpass|gitproxy|attributesfile|excludesfile)$/,
|
|
58
|
+
/^diff\..*(external|textconv|command)$/,
|
|
59
|
+
/^(pager|credential|filter|merge|mergetool|difftool|man|web|browser|sequence|gpg|url|protocol|uploadpack|receivepack|safe|http|remote|submodule)\./,
|
|
60
|
+
];
|
|
61
|
+
/** Keys whose value no git code path turns into a program, a file read, or a file write. */
|
|
62
|
+
const GIT_CONFIG_INERT = new Set([
|
|
63
|
+
"color.ui",
|
|
64
|
+
"color.diff",
|
|
65
|
+
"color.status",
|
|
66
|
+
"color.branch",
|
|
67
|
+
"color.log",
|
|
68
|
+
"core.quotepath",
|
|
69
|
+
"core.abbrev",
|
|
70
|
+
"core.precomposeunicode",
|
|
71
|
+
"core.filemode",
|
|
72
|
+
"core.whitespace",
|
|
73
|
+
"diff.renames",
|
|
74
|
+
"diff.context",
|
|
75
|
+
"diff.algorithm",
|
|
76
|
+
"log.date",
|
|
77
|
+
"log.abbrevcommit",
|
|
78
|
+
"status.showuntrackedfiles",
|
|
79
|
+
"status.branch",
|
|
80
|
+
"status.short",
|
|
81
|
+
"advice.statushints",
|
|
82
|
+
"user.name",
|
|
83
|
+
"user.email",
|
|
84
|
+
]);
|
|
85
|
+
/**
|
|
86
|
+
* `-c key=value` allowlist (case-insensitive: git folds the section and key).
|
|
87
|
+
* Exec/include keys deny, anything unknown asks. `--config-env` always asks.
|
|
88
|
+
*/
|
|
89
|
+
function gitConfig(_toks, flags) {
|
|
90
|
+
const votes = [];
|
|
91
|
+
for (const raw of flags["-c"] ?? []) {
|
|
92
|
+
const key = raw.split("=", 1)[0].trim().toLowerCase();
|
|
93
|
+
if (GIT_CONFIG_DENY.some((rule) => rule.test(key)))
|
|
94
|
+
votes.push(cast("deny", "exec-unknown", "guard:git-config"));
|
|
95
|
+
else if (!GIT_CONFIG_INERT.has(key))
|
|
96
|
+
votes.push(cast("ask", "unmodelled", "guard:git-config"));
|
|
97
|
+
}
|
|
98
|
+
if (Object.keys(flags).includes("--config-env"))
|
|
99
|
+
votes.push(cast("ask", "exec-unknown", "guard:git-config-env"));
|
|
100
|
+
return votes;
|
|
101
|
+
}
|
|
102
|
+
const REV_SYNTAX = /[~^@{}]/;
|
|
103
|
+
/**
|
|
104
|
+
* diff/log/show operands are revisions or paths. `--no-index` makes every
|
|
105
|
+
* operand a file git reads; otherwise a `rev:path` or bare operand that is
|
|
106
|
+
* not revision syntax is read as a path too (`git diff -- .env`, `git show HEAD:.env`).
|
|
107
|
+
*/
|
|
108
|
+
function gitReads(toks, flags, paths) {
|
|
109
|
+
const noIndex = Object.keys(flags).some((key) => isOption(key, "--no-index"));
|
|
110
|
+
if (noIndex)
|
|
111
|
+
return toks.map((tok) => pathVote("read_path", tok, paths));
|
|
112
|
+
const votes = [];
|
|
113
|
+
for (const tok of toks) {
|
|
114
|
+
for (const part of tok.split(/\.{2,3}/)) {
|
|
115
|
+
const target = part.includes(":") ? part.slice(part.indexOf(":") + 1) : part;
|
|
116
|
+
if (target === "" || REV_SYNTAX.test(target))
|
|
117
|
+
continue;
|
|
118
|
+
votes.push(pathVote("read_path", target, paths));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return votes;
|
|
122
|
+
}
|
|
123
|
+
const SED_SAFE_FLAGS = [
|
|
124
|
+
"--quiet",
|
|
125
|
+
"--silent",
|
|
126
|
+
"--regexp-extended",
|
|
127
|
+
"--separate",
|
|
128
|
+
"--unbuffered",
|
|
129
|
+
"--null-data",
|
|
130
|
+
"--posix",
|
|
131
|
+
"--sandbox",
|
|
132
|
+
"--debug",
|
|
133
|
+
"--follow-symlinks",
|
|
134
|
+
"--expression",
|
|
135
|
+
];
|
|
136
|
+
const SED_OTHER_LONG = ["--file", "--in-place", "--line-length", "--help", "--version", "--binary"];
|
|
137
|
+
const SED_SAFE_SHORT = new Set(["-n", "-E", "-r", "-s", "-u", "-z", "-e"]);
|
|
138
|
+
function sedFlagVote(key) {
|
|
139
|
+
if (isOption(key, "--in-place"))
|
|
140
|
+
return "deny";
|
|
141
|
+
if (key.startsWith("--")) {
|
|
142
|
+
const safe = SED_SAFE_FLAGS.some((full) => isOption(key, full));
|
|
143
|
+
const other = SED_OTHER_LONG.some((full) => isOption(key, full));
|
|
144
|
+
return safe && !other ? undefined : "ask";
|
|
145
|
+
}
|
|
146
|
+
if (key.startsWith("-i") || key.startsWith("-I"))
|
|
147
|
+
return "deny";
|
|
148
|
+
if (key.startsWith("-e") && key.length > 2)
|
|
149
|
+
return undefined; // glued script, validated below
|
|
150
|
+
return SED_SAFE_SHORT.has(key) ? undefined : "ask";
|
|
151
|
+
}
|
|
152
|
+
function sedIsBoolean(key) {
|
|
153
|
+
if (key.startsWith("--"))
|
|
154
|
+
return sedFlagVote(key) === undefined && !isOption(key, "--expression");
|
|
155
|
+
return SED_SAFE_SHORT.has(key) && key !== "-e";
|
|
156
|
+
}
|
|
157
|
+
function sedScripts(toks, flags) {
|
|
158
|
+
const scripts = [];
|
|
159
|
+
for (const [key, values] of Object.entries(flags)) {
|
|
160
|
+
if (key === "-e" || isOption(key, "--expression"))
|
|
161
|
+
scripts.push(...values.filter((value) => value !== ""));
|
|
162
|
+
else if (key.startsWith("-e") && !key.startsWith("--") && key.length > 2)
|
|
163
|
+
scripts.push(key.slice(2));
|
|
164
|
+
}
|
|
165
|
+
if (scripts.length > 0)
|
|
166
|
+
return { scripts, files: toks };
|
|
167
|
+
return { scripts: toks.slice(0, 1), files: toks.slice(1) };
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* sed: in-place edits deny; a script that is anything but plain addressed
|
|
171
|
+
* `s`/`y`/`p`/`d`/`q`/`n`-style commands with benign `s` flags asks. That drops the file
|
|
172
|
+
* writers (`w`, `W`, `s///w`) and the program runners (`e`, `s///e`), and `r`/`R` file reads.
|
|
173
|
+
* File operands are reads.
|
|
174
|
+
*/
|
|
175
|
+
function sed(toks, flags, paths) {
|
|
176
|
+
const votes = Object.keys(flags).flatMap((key) => {
|
|
177
|
+
const vote = sedFlagVote(key);
|
|
178
|
+
if (vote === undefined)
|
|
179
|
+
return [];
|
|
180
|
+
return [
|
|
181
|
+
vote === "deny"
|
|
182
|
+
? cast("deny", "workspace-write", "guard:sed-in-place")
|
|
183
|
+
: cast("ask", "exec-unknown", "guard:sed-flag"),
|
|
184
|
+
];
|
|
185
|
+
});
|
|
186
|
+
// `-n SCRIPT` also parses as `-n` taking SCRIPT as a value. The other reading (boolean flag, SCRIPT a
|
|
187
|
+
// positional) is enumerated and judged on its own, so this one has no script or files to inspect.
|
|
188
|
+
const swallowed = Object.entries(flags).some(([key, values]) => sedIsBoolean(key) && values.some((v) => v !== ""));
|
|
189
|
+
if (swallowed)
|
|
190
|
+
return votes;
|
|
191
|
+
const { scripts, files } = sedScripts(toks, flags);
|
|
192
|
+
if (scripts.length === 0 || !scripts.every((script) => sedScriptIsPlain(script))) {
|
|
193
|
+
votes.push(cast("ask", "exec-unknown", "guard:sed-script"));
|
|
194
|
+
}
|
|
195
|
+
for (const file of files)
|
|
196
|
+
votes.push(pathVote("read_path", file, paths));
|
|
197
|
+
return votes;
|
|
198
|
+
}
|
|
199
|
+
const SED_SIMPLE = new Set(["p", "P", "d", "D", "g", "G", "h", "H", "x", "n", "N", "=", "l", "q", "Q", "z"]);
|
|
200
|
+
/** Conservative sed parser: true only for scripts it fully understands and finds inert. */
|
|
201
|
+
export function sedScriptIsPlain(script) {
|
|
202
|
+
let i = 0;
|
|
203
|
+
let depth = 0;
|
|
204
|
+
const n = script.length;
|
|
205
|
+
const blank = (c) => c === " " || c === "\t";
|
|
206
|
+
const digit = (c) => c !== undefined && c >= "0" && c <= "9";
|
|
207
|
+
const space = () => {
|
|
208
|
+
while (i < n && blank(script[i]))
|
|
209
|
+
i += 1;
|
|
210
|
+
};
|
|
211
|
+
/** Consume up to the unescaped delimiter. Returns false when unterminated. */
|
|
212
|
+
const delimited = (delim) => {
|
|
213
|
+
while (i < n) {
|
|
214
|
+
const c = script[i];
|
|
215
|
+
i += 1;
|
|
216
|
+
if (c === "\\") {
|
|
217
|
+
i += 1;
|
|
218
|
+
continue;
|
|
219
|
+
}
|
|
220
|
+
if (c === delim)
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
return false;
|
|
224
|
+
};
|
|
225
|
+
const address = () => {
|
|
226
|
+
const c = script[i];
|
|
227
|
+
if (c === "$") {
|
|
228
|
+
i += 1;
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
if (digit(c)) {
|
|
232
|
+
while (digit(script[i]))
|
|
233
|
+
i += 1;
|
|
234
|
+
if (script[i] === "~") {
|
|
235
|
+
i += 1;
|
|
236
|
+
while (digit(script[i]))
|
|
237
|
+
i += 1;
|
|
238
|
+
}
|
|
239
|
+
return true;
|
|
240
|
+
}
|
|
241
|
+
if (c === "/" || c === "\\") {
|
|
242
|
+
let delim = "/";
|
|
243
|
+
if (c === "\\") {
|
|
244
|
+
i += 1;
|
|
245
|
+
delim = script[i] ?? "";
|
|
246
|
+
if (delim === "" || delim === "\\" || delim === "\n")
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
i += 1;
|
|
250
|
+
if (!delimited(delim))
|
|
251
|
+
return false;
|
|
252
|
+
while (script[i] === "I" || script[i] === "M")
|
|
253
|
+
i += 1;
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
return false;
|
|
257
|
+
};
|
|
258
|
+
const ending = () => {
|
|
259
|
+
space();
|
|
260
|
+
const c = script[i];
|
|
261
|
+
return c === undefined || c === ";" || c === "\n" || c === "}";
|
|
262
|
+
};
|
|
263
|
+
while (i < n) {
|
|
264
|
+
while (i < n && (blank(script[i]) || script[i] === ";" || script[i] === "\n"))
|
|
265
|
+
i += 1;
|
|
266
|
+
if (i >= n)
|
|
267
|
+
break;
|
|
268
|
+
if (script[i] === "}") {
|
|
269
|
+
depth -= 1;
|
|
270
|
+
if (depth < 0)
|
|
271
|
+
return false;
|
|
272
|
+
i += 1;
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
if (address()) {
|
|
276
|
+
space();
|
|
277
|
+
if (script[i] === ",") {
|
|
278
|
+
i += 1;
|
|
279
|
+
space();
|
|
280
|
+
if (script[i] === "+" || script[i] === "~")
|
|
281
|
+
i += 1;
|
|
282
|
+
if (!address())
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
space();
|
|
287
|
+
while (script[i] === "!") {
|
|
288
|
+
i += 1;
|
|
289
|
+
space();
|
|
290
|
+
}
|
|
291
|
+
const cmd = script[i];
|
|
292
|
+
if (cmd === undefined)
|
|
293
|
+
return false;
|
|
294
|
+
i += 1;
|
|
295
|
+
if (cmd === "{") {
|
|
296
|
+
depth += 1;
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
if (cmd === "s" || cmd === "y") {
|
|
300
|
+
const delim = script[i];
|
|
301
|
+
if (delim === undefined || delim === "\\" || delim === "\n" || blank(delim))
|
|
302
|
+
return false;
|
|
303
|
+
i += 1;
|
|
304
|
+
if (!delimited(delim) || !delimited(delim))
|
|
305
|
+
return false;
|
|
306
|
+
if (cmd === "s") {
|
|
307
|
+
while (i < n && "gpiImM0123456789".includes(script[i]))
|
|
308
|
+
i += 1;
|
|
309
|
+
}
|
|
310
|
+
if (!ending())
|
|
311
|
+
return false;
|
|
312
|
+
continue;
|
|
313
|
+
}
|
|
314
|
+
if (SED_SIMPLE.has(cmd)) {
|
|
315
|
+
if (cmd === "q" || cmd === "Q" || cmd === "l") {
|
|
316
|
+
space();
|
|
317
|
+
while (digit(script[i]))
|
|
318
|
+
i += 1;
|
|
319
|
+
}
|
|
320
|
+
if (!ending())
|
|
321
|
+
return false;
|
|
322
|
+
continue;
|
|
323
|
+
}
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
return depth === 0;
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Catastrophic shapes: the few commands whose one run cannot be undone, so no mode may
|
|
330
|
+
* lift them (`block`, not `deny`). A guard only tightens, so the node keeps its soft vote
|
|
331
|
+
* for every other form and these arms add the hard one.
|
|
332
|
+
*
|
|
333
|
+
* Operands are read from positionals and from flag values alike: `rm -r /` parses both as
|
|
334
|
+
* a boolean `-r` plus operand `/` and as `-r` taking `/`, and either reading must see it.
|
|
335
|
+
*/
|
|
336
|
+
const ROOT_LIKE = new Set([
|
|
337
|
+
"/",
|
|
338
|
+
"/*",
|
|
339
|
+
"/.",
|
|
340
|
+
"~",
|
|
341
|
+
"~/",
|
|
342
|
+
"~/*",
|
|
343
|
+
"~/.",
|
|
344
|
+
"$HOME",
|
|
345
|
+
"$HOME/",
|
|
346
|
+
"$HOME/*",
|
|
347
|
+
"$HOME/.",
|
|
348
|
+
"${HOME}",
|
|
349
|
+
"${HOME}/",
|
|
350
|
+
"${HOME}/*",
|
|
351
|
+
"${HOME}/.",
|
|
352
|
+
]);
|
|
353
|
+
/** `/`, `/*`, `~`, `~/`, `$HOME` and their `//`, `/.` spellings. Not `/tmp/x`, not `./`. */
|
|
354
|
+
function isRootLike(word) {
|
|
355
|
+
const squeezed = word.replaceAll(/\/{2,}/g, "/");
|
|
356
|
+
if (ROOT_LIKE.has(squeezed))
|
|
357
|
+
return true;
|
|
358
|
+
// `/.`, `/./`, `~/.`: no-op segments after the head.
|
|
359
|
+
const plain = squeezed.replaceAll(/(?<=.)\/\.(?=\/|$)/g, "");
|
|
360
|
+
return plain !== squeezed && ROOT_LIKE.has(plain);
|
|
361
|
+
}
|
|
362
|
+
function operands(toks, flags) {
|
|
363
|
+
return [...toks, ...Object.values(flags).flat()];
|
|
364
|
+
}
|
|
365
|
+
/** `-R`, `--recursive`, or a short cluster that carries `r`/`R` (`-rf`, `-fR`). */
|
|
366
|
+
function isRecursive(flags) {
|
|
367
|
+
return Object.keys(flags).some((key) => isOption(key, "--recursive") || (/^-[A-Z]+$/i.test(key) && /r/i.test(key)));
|
|
368
|
+
}
|
|
369
|
+
function hasOption(flags, full) {
|
|
370
|
+
return Object.keys(flags).some((key) => isOption(key, full));
|
|
371
|
+
}
|
|
372
|
+
/** rm/chmod/chown: `--no-preserve-root`, or recursion over the filesystem root or the home directory. */
|
|
373
|
+
function recursiveRoot(toks, flags) {
|
|
374
|
+
if (hasOption(flags, "--no-preserve-root"))
|
|
375
|
+
return [catastrophe("guard:no-preserve-root")];
|
|
376
|
+
return isRecursive(flags) && operands(toks, flags).some(isRootLike) ? [catastrophe("guard:recursive-root")] : [];
|
|
377
|
+
}
|
|
378
|
+
function catastrophe(ruleId) {
|
|
379
|
+
return cast("block", "destroy-catastrophic", ruleId);
|
|
380
|
+
}
|
|
381
|
+
/** Device nodes dd may write without harm. Everything else under /dev is a disk, a tty, or memory. */
|
|
382
|
+
const DD_HARMLESS_DEVICES = new Set(["/dev/null", "/dev/zero", "/dev/full", "/dev/stdout", "/dev/stderr", "/dev/tty"]);
|
|
383
|
+
/** dd: `of=` a device node. */
|
|
384
|
+
function ddDevice(toks, flags) {
|
|
385
|
+
const hit = operands(toks, flags).some((word) => {
|
|
386
|
+
if (!word.startsWith("of="))
|
|
387
|
+
return false;
|
|
388
|
+
const target = posix.normalize(word.slice(3));
|
|
389
|
+
if (!target.startsWith("/dev/"))
|
|
390
|
+
return false;
|
|
391
|
+
return !DD_HARMLESS_DEVICES.has(target) && !target.startsWith("/dev/fd/");
|
|
392
|
+
});
|
|
393
|
+
return hit ? [catastrophe("guard:dd-device")] : [];
|
|
394
|
+
}
|
|
395
|
+
const PARTED_READS = new Set(["print", "p", "free", "all", "list", "devices"]);
|
|
396
|
+
/**
|
|
397
|
+
* Partition editors. The listing forms read; every other invocation (including the
|
|
398
|
+
* interactive ones, whose commands arrive on stdin) can rewrite the table.
|
|
399
|
+
*/
|
|
400
|
+
function diskWrite(toks, flags) {
|
|
401
|
+
const readOnly = ["--list", "--show-size", "--version", "--help"].some((full) => hasOption(flags, full)) ||
|
|
402
|
+
["-l", "-s", "-V", "-h"].some((short) => Object.hasOwn(flags, short));
|
|
403
|
+
if (readOnly)
|
|
404
|
+
return [];
|
|
405
|
+
// parted names the device, then commands: only the printing ones are a read.
|
|
406
|
+
const commands = toks.filter((tok) => !tok.startsWith("/dev/"));
|
|
407
|
+
const printing = commands.length > 0 && commands.every((tok) => PARTED_READS.has(tok));
|
|
408
|
+
return printing ? [] : [catastrophe("guard:disk-write")];
|
|
409
|
+
}
|
|
410
|
+
const GUARD_TABLE = {
|
|
411
|
+
"git-config": gitConfig,
|
|
412
|
+
"git-reads": gitReads,
|
|
413
|
+
sed,
|
|
414
|
+
"recursive-root": recursiveRoot,
|
|
415
|
+
"dd-device": ddDevice,
|
|
416
|
+
"disk-write": diskWrite,
|
|
417
|
+
};
|
|
418
|
+
export const GUARDS = new Set(Object.keys(GUARD_TABLE));
|
|
419
|
+
//# sourceMappingURL=guards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards.js","sourceRoot":"","sources":["../src/guards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executable identity for the floor. Path-form argv0 is the named command
|
|
3
|
+
* iff `which` returns the same path; otherwise it stays a path.
|
|
4
|
+
* No process-lifetime cache — PATH/cwd are part of identity.
|
|
5
|
+
*/
|
|
6
|
+
import { type Which } from "@inhuman.tools/policy-bash-disassembler";
|
|
7
|
+
export declare function whichOnPath(name: string): string | undefined;
|
|
8
|
+
/** Path-form argv0 rewritten to the known name, or the original token. */
|
|
9
|
+
export declare function identityName(raw: string, known: ReadonlySet<string>, which: Which | undefined): string;
|
|
10
|
+
export { type Which } from "@inhuman.tools/policy-bash-disassembler";
|
|
11
|
+
//# sourceMappingURL=identity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAgB,KAAK,KAAK,EAAE,MAAM,yCAAyC,CAAC;AAEnF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ5D;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAEtG;AAED,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,yCAAyC,CAAC"}
|
package/dist/identity.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Executable identity for the floor. Path-form argv0 is the named command
|
|
3
|
+
* iff `which` returns the same path; otherwise it stays a path.
|
|
4
|
+
* No process-lifetime cache — PATH/cwd are part of identity.
|
|
5
|
+
*/
|
|
6
|
+
import { execFileSync } from "node:child_process";
|
|
7
|
+
import { resolveKnown } from "@inhuman.tools/policy-bash-disassembler";
|
|
8
|
+
export function whichOnPath(name) {
|
|
9
|
+
if (name === "" || name.includes("/") || name.includes("\0"))
|
|
10
|
+
return undefined;
|
|
11
|
+
try {
|
|
12
|
+
const out = execFileSync("which", [name], { encoding: "utf8", timeout: 1000 }).trim();
|
|
13
|
+
return out === "" ? undefined : out.split("\n")[0];
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Path-form argv0 rewritten to the known name, or the original token. */
|
|
20
|
+
export function identityName(raw, known, which) {
|
|
21
|
+
return resolveKnown(raw, known, which) ?? raw;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,YAAY,EAAc,MAAM,yCAAyC,CAAC;AAEnF,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAC/E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACtF,OAAO,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,KAA0B,EAAE,KAAwB;IAC5F,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,GAAG,CAAC;AAChD,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Plugin door: the dist floor and the authorization program. */
|
|
2
|
+
export { authorizationProgram } from "./authorize.js";
|
|
3
|
+
export { authorize } from "./run-authorization.js";
|
|
4
|
+
export { defaultPolicy } from "./bind.js";
|
|
5
|
+
export { JUDGE_DEADLINE_MS, withDeadline } from "./deadline.js";
|
|
6
|
+
export { checkToolPath, normalizeToolPath } from "./tool-path.js";
|
|
7
|
+
export { acknowledgeRequest, acknowledgeRequirement, blockReason, floorVerdictOf, labelOf, mcpOf, mergeAcknowledge, parseAcknowledge, parseAcknowledgeText, requestAcknowledgement, type AckFlag, type AckMatch, type AckRequest, type AckRequirement, type AckSubject, type Acknowledger, } from "./acknowledge.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,cAAc,EACd,OAAO,EACP,KAAK,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,OAAO,EACZ,KAAK,QAAQ,EACb,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/** Plugin door: the dist floor and the authorization program. */
|
|
2
|
+
export { authorizationProgram } from "./authorize.js";
|
|
3
|
+
export { authorize } from "./run-authorization.js";
|
|
4
|
+
export { defaultPolicy } from "./bind.js";
|
|
5
|
+
export { JUDGE_DEADLINE_MS, withDeadline } from "./deadline.js";
|
|
6
|
+
export { checkToolPath, normalizeToolPath } from "./tool-path.js";
|
|
7
|
+
export { acknowledgeRequest, acknowledgeRequirement, blockReason, floorVerdictOf, labelOf, mcpOf, mergeAcknowledge, parseAcknowledge, parseAcknowledgeText, requestAcknowledgement, } from "./acknowledge.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,WAAW,EACX,cAAc,EACd,OAAO,EACP,KAAK,EACL,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,GAOvB,MAAM,kBAAkB,CAAC"}
|
package/dist/lift.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lift.d.ts","sourceRoot":"","sources":["../src/lift.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,kFAAkF;AAClF,wBAAgB,OAAO,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,CAWjE"}
|
package/dist/lift.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** Match-all / pipeline lattice: any-block > any-deny > any-ask > all-approve. */
|
|
2
|
+
export function lattice(hits) {
|
|
3
|
+
switch (true) {
|
|
4
|
+
case hits.includes("block"):
|
|
5
|
+
return "block";
|
|
6
|
+
case hits.includes("deny"):
|
|
7
|
+
return "deny";
|
|
8
|
+
case hits.includes("ask"):
|
|
9
|
+
return "ask";
|
|
10
|
+
default:
|
|
11
|
+
return "policyApprove";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=lift.js.map
|
package/dist/lift.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lift.js","sourceRoot":"","sources":["../src/lift.ts"],"names":[],"mappings":"AAEA,kFAAkF;AAClF,MAAM,UAAU,OAAO,CAAC,IAA4B;IAClD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YACzB,OAAO,OAAO,CAAC;QACjB,KAAK,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACxB,OAAO,MAAM,CAAC;QAChB,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvB,OAAO,KAAK,CAAC;QACf;YACE,OAAO,eAAe,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File-access cluster: policy.json `read_file` / `write_file` enable lists
|
|
3
|
+
* and `read_block` / `write_block` hard-block lists.
|
|
4
|
+
* Enable `!` is deny (remainder carve-out). Block lists are unliftable.
|
|
5
|
+
* Suffix wildcard is implied — PAT matches itself and descendants.
|
|
6
|
+
* Miss is deny (closed). Unresolvable path is ask.
|
|
7
|
+
* Read enable is approve (silent in-tree). Write enable is ask: the list is
|
|
8
|
+
* what the agent may attempt, not a grant. Yolo rewrites that ask and deny.
|
|
9
|
+
* Realpath / cwd / ~ live on the host; this matcher sees the prepared string.
|
|
10
|
+
*
|
|
11
|
+
* Every rule carries a class (why it votes). Brace and glob words from the shell are expanded
|
|
12
|
+
* lexically against the block rules: if any expansion or match could hit one, the word is `block`.
|
|
13
|
+
*/
|
|
14
|
+
import type { ClassId } from "./classes.js";
|
|
15
|
+
import type { Disposition, FloorVerdict, WriteRemainderKind } from "./types.js";
|
|
16
|
+
type PathRule = {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly polarity: "policyApprove" | "ask" | "deny" | "block";
|
|
19
|
+
readonly stem: string;
|
|
20
|
+
readonly unanchored: boolean;
|
|
21
|
+
readonly class: ClassId;
|
|
22
|
+
};
|
|
23
|
+
export type PathTerm = {
|
|
24
|
+
readonly cluster: "read" | "write";
|
|
25
|
+
readonly rules: PathRule[];
|
|
26
|
+
/** Class of a miss (deny: outside the enable roots). */
|
|
27
|
+
readonly missClass: ClassId;
|
|
28
|
+
};
|
|
29
|
+
export declare function mergePathTerms(cluster: "read" | "write", missClass: ClassId, enable: readonly PathRule[] | undefined, block: readonly PathRule[] | undefined): PathTerm | undefined;
|
|
30
|
+
export declare function checkPath(term: PathTerm, path: string): Disposition;
|
|
31
|
+
/** The disposition of one path with the rules that decided it. */
|
|
32
|
+
export declare function explainPath(term: PathTerm, path: string): FloorVerdict;
|
|
33
|
+
/**
|
|
34
|
+
* Shell words may carry braces and globs. A word the shell would expand is judged as every
|
|
35
|
+
* word it could expand to; a glob is judged as everything it could match. The result is the
|
|
36
|
+
* strictest of those and the word itself, so this can only tighten. Only block rules can be
|
|
37
|
+
* hit by a pattern (an enable root never needs a glob to be understood: the word asks).
|
|
38
|
+
*/
|
|
39
|
+
export declare function explainShellPath(term: PathTerm, word: string, options?: {
|
|
40
|
+
readonly dotglob?: boolean;
|
|
41
|
+
}): FloorVerdict;
|
|
42
|
+
/**
|
|
43
|
+
* Write-deny remainder intern. Null when the floor is not deny.
|
|
44
|
+
* protected: enable `!` inside an enable root. outside: miss, left the
|
|
45
|
+
* enable set. risky: enable `!` and left the enable set. `write_block`
|
|
46
|
+
* never reaches this.
|
|
47
|
+
*/
|
|
48
|
+
export declare function writeRemainderKind(term: PathTerm, path: string): WriteRemainderKind | null;
|
|
49
|
+
/** Undefined = unresolvable (ask). No `..`, `~`, `$`, glob, NUL. */
|
|
50
|
+
export declare function normalizePath(raw: string): string | undefined;
|
|
51
|
+
export { lattice } from "./lift.js";
|
|
52
|
+
export { APPROVE } from "./verdict.js";
|
|
53
|
+
//# sourceMappingURL=path-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-policy.d.ts","sourceRoot":"","sources":["../src/path-policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGhF,KAAK,QAAQ,GAAG;IACd,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAC3B,wDAAwD;IACxD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,GAAG,OAAO,EACzB,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,EACvC,KAAK,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,GACrC,QAAQ,GAAG,SAAS,CAGtB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAEnE;AAED,kEAAkE;AAClE,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY,CAStE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;IAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAO,GAC3C,YAAY,CAsBd;AAwED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,IAAI,CAkB1F;AAkED,oEAAoE;AACpE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAiB7D;AAED,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
|