@ai-ecoverse/slicc-kernel 1.175.0 → 1.176.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/README.md +5 -4
- package/dist/driver-worker.js +2 -1
- package/dist/driver-worker.js.map +2 -2
- package/dist/index.js +3 -1
- package/dist/index.js.map +2 -2
- package/dist/kernel-worker.js +55 -10
- package/dist/kernel-worker.js.map +2 -2
- package/dist/node-driver-worker.js +2 -1
- package/dist/node-driver-worker.js.map +2 -2
- package/dist/node-process-worker.cjs +1 -1
- package/dist/node-process-worker.js +1 -1
- package/dist/node.js +56 -11
- package/dist/node.js.map +2 -2
- package/dist/process-worker.js +1 -1
- package/dist/types/fs/dac.d.ts +1 -0
- package/dist/types/index.d.ts +3 -2
- package/dist/types/kernel/embedder.d.ts +3 -0
- package/dist/types/serve.d.ts +5 -0
- package/dist/types/users.d.ts +5 -1
- package/package.json +2 -2
package/dist/kernel-worker.js
CHANGED
|
@@ -2239,8 +2239,10 @@ var OpfsFs = class {
|
|
|
2239
2239
|
for (let at = from; at < parts2.length; at++) {
|
|
2240
2240
|
this.calls++;
|
|
2241
2241
|
dir = await dir.getDirectoryHandle(parts2[at]);
|
|
2242
|
-
|
|
2242
|
+
const path = `/${parts2.slice(0, at + 1).join("/")}`;
|
|
2243
|
+
this.dirs.set(path, dir);
|
|
2243
2244
|
this.checked.set(dir, performance.now());
|
|
2245
|
+
this.absent.delete(path);
|
|
2244
2246
|
}
|
|
2245
2247
|
return dir;
|
|
2246
2248
|
}
|
|
@@ -2322,6 +2324,7 @@ var OpfsFs = class {
|
|
|
2322
2324
|
if (looked) {
|
|
2323
2325
|
this.dirs.set(path, handle);
|
|
2324
2326
|
this.checked.set(handle, performance.now());
|
|
2327
|
+
this.absent.delete(path);
|
|
2325
2328
|
}
|
|
2326
2329
|
return handle;
|
|
2327
2330
|
}
|
|
@@ -2972,7 +2975,8 @@ var OpfsFs = class {
|
|
|
2972
2975
|
}
|
|
2973
2976
|
const [entry] = await this.meta.get([path]);
|
|
2974
2977
|
const wanted = entry?.link === void 0 ? path : resolvePath(parentOf4(path), entry.link);
|
|
2975
|
-
|
|
2978
|
+
const parent = await this.exactly(() => this.locate(parentOf4(wanted), true));
|
|
2979
|
+
return [resolvePath(parent.path, baseOf(wanted)), false];
|
|
2976
2980
|
}
|
|
2977
2981
|
async fileFor(path, create = true) {
|
|
2978
2982
|
const [target, existed] = await this.writeTarget(path);
|
|
@@ -3079,10 +3083,12 @@ var OpfsFs = class {
|
|
|
3079
3083
|
await this.mkdir(parentOf4(path), { recursive: true, ...above ? { owner: above } : {} });
|
|
3080
3084
|
const parent = await this.locate(parentOf4(path), true);
|
|
3081
3085
|
if (parent.handle?.kind !== "directory") throw fsError("ENOTDIR", path);
|
|
3082
|
-
|
|
3083
|
-
|
|
3086
|
+
const made2 = resolvePath(parent.path, baseOf(path));
|
|
3087
|
+
this.forget(made2);
|
|
3088
|
+
this.refuse(made2);
|
|
3089
|
+
const handle = await this.io(parent.handle.getDirectoryHandle(baseOf(path), { create: true }));
|
|
3090
|
+
this.remember(made2, handle, true);
|
|
3084
3091
|
const now = Date.now();
|
|
3085
|
-
const made2 = `${parent.path === "/" ? "" : parent.path}/${baseOf(path)}`;
|
|
3086
3092
|
await this.stampNew(made2, owner, true);
|
|
3087
3093
|
this.touch(now, parent.path, made2);
|
|
3088
3094
|
}
|
|
@@ -7738,11 +7744,12 @@ function serveTransport(peer, transport, {
|
|
|
7738
7744
|
var PASSWD = "/etc/passwd";
|
|
7739
7745
|
var GROUP = "/etc/group";
|
|
7740
7746
|
var DEFAULT_PASSWD = "root:x:0:0:root:/root:/bin/bash\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n";
|
|
7741
|
-
var DEFAULT_GROUP = "root:x:0:\nsudo:x:27:\nusers:x:100:\nnogroup:x:65534:\n";
|
|
7747
|
+
var DEFAULT_GROUP = "root:x:0:\ndialout:x:20:\nsudo:x:27:\nusers:x:100:\nnogroup:x:65534:\n";
|
|
7742
7748
|
var NAME = /^[a-z_][a-z0-9_.-]*$/;
|
|
7743
7749
|
var MAX_NAME = 255;
|
|
7744
7750
|
var FIRST_UID = 1e3;
|
|
7745
7751
|
var LAST_UID = 6e4;
|
|
7752
|
+
var MAX_GID = 4294967294;
|
|
7746
7753
|
var USERS_GROUP = "users";
|
|
7747
7754
|
var HOME_DIR = /^\/home\/[^/]+$/;
|
|
7748
7755
|
var SYSTEM_PNPM_HOME = "/usr/local/share/pnpm";
|
|
@@ -8038,6 +8045,26 @@ var UserDb = class {
|
|
|
8038
8045
|
const { group } = await this.tables();
|
|
8039
8046
|
return parsed(group).map(({ name: name2, gid, members }) => ({ name: name2, gid, members: [...members] }));
|
|
8040
8047
|
}
|
|
8048
|
+
addGroup(name2, gid) {
|
|
8049
|
+
return this.serial(async () => {
|
|
8050
|
+
if (typeof name2 !== "string" || name2.length > MAX_NAME || !NAME.test(name2)) {
|
|
8051
|
+
throw fsError("EINVAL", `not a group name: ${String(name2)}`);
|
|
8052
|
+
}
|
|
8053
|
+
if (typeof gid !== "number" || !Number.isInteger(gid) || gid < 0 || gid > MAX_GID) {
|
|
8054
|
+
throw fsError("EINVAL", `not a group id: ${String(gid)}`);
|
|
8055
|
+
}
|
|
8056
|
+
const { group } = await this.tables();
|
|
8057
|
+
const rows = parsed(group);
|
|
8058
|
+
const found = rows.find((g) => g.name === name2);
|
|
8059
|
+
if (found) return { name: found.name, gid: found.gid, members: [...found.members] };
|
|
8060
|
+
const taken = rows.find((g) => g.gid === gid);
|
|
8061
|
+
if (taken) throw fsError("EEXIST", `group id ${gid} is group ${taken.name}`);
|
|
8062
|
+
group.push({ name: name2, gid, members: [] });
|
|
8063
|
+
await this.fs.mkdir("/etc", { recursive: true });
|
|
8064
|
+
await this.fs.writeFile(GROUP, formatGroup(group));
|
|
8065
|
+
return { name: name2, gid, members: [] };
|
|
8066
|
+
});
|
|
8067
|
+
}
|
|
8041
8068
|
addMember(group, user) {
|
|
8042
8069
|
return this.member(group, user, true);
|
|
8043
8070
|
}
|
|
@@ -8740,7 +8767,7 @@ function satisfies(version, range2) {
|
|
|
8740
8767
|
}
|
|
8741
8768
|
|
|
8742
8769
|
// src/version.ts
|
|
8743
|
-
var KERNEL_VERSION = true ? "1.
|
|
8770
|
+
var KERNEL_VERSION = true ? "1.176.0" : "0.0.0-dev";
|
|
8744
8771
|
var OS_RELEASE = "6.0.0-slicc";
|
|
8745
8772
|
function procVersion() {
|
|
8746
8773
|
return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
|
|
@@ -13381,6 +13408,7 @@ var EmbedderBroker = class {
|
|
|
13381
13408
|
budget;
|
|
13382
13409
|
open = /* @__PURE__ */ new Map();
|
|
13383
13410
|
tagsOf;
|
|
13411
|
+
denied;
|
|
13384
13412
|
constructor(users, lookup2, tagsOf2 = () => void 0, budget = EMBEDDER_BUDGET) {
|
|
13385
13413
|
this.users = users;
|
|
13386
13414
|
this.tagsOf = tagsOf2;
|
|
@@ -13398,7 +13426,8 @@ var EmbedderBroker = class {
|
|
|
13398
13426
|
return this.hooks.get(client);
|
|
13399
13427
|
}
|
|
13400
13428
|
async allowed(policy, caller) {
|
|
13401
|
-
if (caller.euid === 0
|
|
13429
|
+
if (caller.euid === 0) return true;
|
|
13430
|
+
if (policy.session !== false && caller.euid === caller.sessionUid) return true;
|
|
13402
13431
|
if (policy.group !== void 0) {
|
|
13403
13432
|
const gid = await this.lookup.groupId(policy.group);
|
|
13404
13433
|
if (gid !== void 0 && (caller.egid === gid || caller.groups.includes(gid))) return true;
|
|
@@ -13414,9 +13443,22 @@ var EmbedderBroker = class {
|
|
|
13414
13443
|
if (!hook) throw new KernelError("ENOTSUP", "no page answers requests for this session");
|
|
13415
13444
|
const policy = Object.hasOwn(hook.kinds, kind) ? hook.kinds[kind] : void 0;
|
|
13416
13445
|
if (!policy) throw new KernelError("ENOTSUP", `this embedder does not answer ${kind}`);
|
|
13417
|
-
if (this.users !== "off" && !await this.allowed(policy, caller))
|
|
13418
|
-
throw new KernelError("EACCES", `${kind} is not allowed for this user`);
|
|
13419
13446
|
const tags = caller.tags;
|
|
13447
|
+
if (this.users !== "off" && !await this.allowed(policy, caller)) {
|
|
13448
|
+
try {
|
|
13449
|
+
this.denied?.({
|
|
13450
|
+
pid: caller.pid,
|
|
13451
|
+
uid: caller.euid,
|
|
13452
|
+
op: "embedder",
|
|
13453
|
+
path: EMBEDDER_PATH,
|
|
13454
|
+
errno: "EACCES",
|
|
13455
|
+
kind,
|
|
13456
|
+
...tags?.length ? { tag: tags[0] } : {}
|
|
13457
|
+
});
|
|
13458
|
+
} catch {
|
|
13459
|
+
}
|
|
13460
|
+
throw new KernelError("EACCES", `${kind} is not allowed for this user`);
|
|
13461
|
+
}
|
|
13420
13462
|
return {
|
|
13421
13463
|
pid: caller.shownPid,
|
|
13422
13464
|
uid: caller.euid,
|
|
@@ -33458,6 +33500,7 @@ var Launcher = class {
|
|
|
33458
33500
|
(pid) => this.tagsOf(pid)
|
|
33459
33501
|
);
|
|
33460
33502
|
this.embedder = this.embedderBroker(options.embedder);
|
|
33503
|
+
this.embedder.denied = options.onDenial;
|
|
33461
33504
|
this.sealed = new SealedBroker(
|
|
33462
33505
|
options.sealed,
|
|
33463
33506
|
this.usersMode,
|
|
@@ -36428,6 +36471,7 @@ var USERS_OPS = /* @__PURE__ */ new Set([
|
|
|
36428
36471
|
"users-remove",
|
|
36429
36472
|
"users-list",
|
|
36430
36473
|
"groups-list",
|
|
36474
|
+
"groups-add",
|
|
36431
36475
|
"groups-add-member",
|
|
36432
36476
|
"groups-remove-member"
|
|
36433
36477
|
]);
|
|
@@ -36479,6 +36523,7 @@ function usersOp(l, req) {
|
|
|
36479
36523
|
if (req.op === "users-add") return l.users.add(req.user);
|
|
36480
36524
|
if (req.op === "users-remove") return l.users.remove(req.name, req.options);
|
|
36481
36525
|
if (req.op === "groups-list") return l.users.groups();
|
|
36526
|
+
if (req.op === "groups-add") return l.users.addGroup(req.name, req.gid);
|
|
36482
36527
|
if (req.op === "groups-add-member") return l.users.addMember(req.group, req.user);
|
|
36483
36528
|
if (req.op === "groups-remove-member") return l.users.removeMember(req.group, req.user);
|
|
36484
36529
|
return l.users.list();
|