@ai-ecoverse/slicc-kernel 1.175.1 → 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 +44 -5
- 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 +45 -6
- 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 +1 -1
package/dist/kernel-worker.js
CHANGED
|
@@ -7744,11 +7744,12 @@ function serveTransport(peer, transport, {
|
|
|
7744
7744
|
var PASSWD = "/etc/passwd";
|
|
7745
7745
|
var GROUP = "/etc/group";
|
|
7746
7746
|
var DEFAULT_PASSWD = "root:x:0:0:root:/root:/bin/bash\nnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin\n";
|
|
7747
|
-
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";
|
|
7748
7748
|
var NAME = /^[a-z_][a-z0-9_.-]*$/;
|
|
7749
7749
|
var MAX_NAME = 255;
|
|
7750
7750
|
var FIRST_UID = 1e3;
|
|
7751
7751
|
var LAST_UID = 6e4;
|
|
7752
|
+
var MAX_GID = 4294967294;
|
|
7752
7753
|
var USERS_GROUP = "users";
|
|
7753
7754
|
var HOME_DIR = /^\/home\/[^/]+$/;
|
|
7754
7755
|
var SYSTEM_PNPM_HOME = "/usr/local/share/pnpm";
|
|
@@ -8044,6 +8045,26 @@ var UserDb = class {
|
|
|
8044
8045
|
const { group } = await this.tables();
|
|
8045
8046
|
return parsed(group).map(({ name: name2, gid, members }) => ({ name: name2, gid, members: [...members] }));
|
|
8046
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
|
+
}
|
|
8047
8068
|
addMember(group, user) {
|
|
8048
8069
|
return this.member(group, user, true);
|
|
8049
8070
|
}
|
|
@@ -8746,7 +8767,7 @@ function satisfies(version, range2) {
|
|
|
8746
8767
|
}
|
|
8747
8768
|
|
|
8748
8769
|
// src/version.ts
|
|
8749
|
-
var KERNEL_VERSION = true ? "1.
|
|
8770
|
+
var KERNEL_VERSION = true ? "1.176.0" : "0.0.0-dev";
|
|
8750
8771
|
var OS_RELEASE = "6.0.0-slicc";
|
|
8751
8772
|
function procVersion() {
|
|
8752
8773
|
return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
|
|
@@ -13387,6 +13408,7 @@ var EmbedderBroker = class {
|
|
|
13387
13408
|
budget;
|
|
13388
13409
|
open = /* @__PURE__ */ new Map();
|
|
13389
13410
|
tagsOf;
|
|
13411
|
+
denied;
|
|
13390
13412
|
constructor(users, lookup2, tagsOf2 = () => void 0, budget = EMBEDDER_BUDGET) {
|
|
13391
13413
|
this.users = users;
|
|
13392
13414
|
this.tagsOf = tagsOf2;
|
|
@@ -13404,7 +13426,8 @@ var EmbedderBroker = class {
|
|
|
13404
13426
|
return this.hooks.get(client);
|
|
13405
13427
|
}
|
|
13406
13428
|
async allowed(policy, caller) {
|
|
13407
|
-
if (caller.euid === 0
|
|
13429
|
+
if (caller.euid === 0) return true;
|
|
13430
|
+
if (policy.session !== false && caller.euid === caller.sessionUid) return true;
|
|
13408
13431
|
if (policy.group !== void 0) {
|
|
13409
13432
|
const gid = await this.lookup.groupId(policy.group);
|
|
13410
13433
|
if (gid !== void 0 && (caller.egid === gid || caller.groups.includes(gid))) return true;
|
|
@@ -13420,9 +13443,22 @@ var EmbedderBroker = class {
|
|
|
13420
13443
|
if (!hook) throw new KernelError("ENOTSUP", "no page answers requests for this session");
|
|
13421
13444
|
const policy = Object.hasOwn(hook.kinds, kind) ? hook.kinds[kind] : void 0;
|
|
13422
13445
|
if (!policy) throw new KernelError("ENOTSUP", `this embedder does not answer ${kind}`);
|
|
13423
|
-
if (this.users !== "off" && !await this.allowed(policy, caller))
|
|
13424
|
-
throw new KernelError("EACCES", `${kind} is not allowed for this user`);
|
|
13425
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
|
+
}
|
|
13426
13462
|
return {
|
|
13427
13463
|
pid: caller.shownPid,
|
|
13428
13464
|
uid: caller.euid,
|
|
@@ -33464,6 +33500,7 @@ var Launcher = class {
|
|
|
33464
33500
|
(pid) => this.tagsOf(pid)
|
|
33465
33501
|
);
|
|
33466
33502
|
this.embedder = this.embedderBroker(options.embedder);
|
|
33503
|
+
this.embedder.denied = options.onDenial;
|
|
33467
33504
|
this.sealed = new SealedBroker(
|
|
33468
33505
|
options.sealed,
|
|
33469
33506
|
this.usersMode,
|
|
@@ -36434,6 +36471,7 @@ var USERS_OPS = /* @__PURE__ */ new Set([
|
|
|
36434
36471
|
"users-remove",
|
|
36435
36472
|
"users-list",
|
|
36436
36473
|
"groups-list",
|
|
36474
|
+
"groups-add",
|
|
36437
36475
|
"groups-add-member",
|
|
36438
36476
|
"groups-remove-member"
|
|
36439
36477
|
]);
|
|
@@ -36485,6 +36523,7 @@ function usersOp(l, req) {
|
|
|
36485
36523
|
if (req.op === "users-add") return l.users.add(req.user);
|
|
36486
36524
|
if (req.op === "users-remove") return l.users.remove(req.name, req.options);
|
|
36487
36525
|
if (req.op === "groups-list") return l.users.groups();
|
|
36526
|
+
if (req.op === "groups-add") return l.users.addGroup(req.name, req.gid);
|
|
36488
36527
|
if (req.op === "groups-add-member") return l.users.addMember(req.group, req.user);
|
|
36489
36528
|
if (req.op === "groups-remove-member") return l.users.removeMember(req.group, req.user);
|
|
36490
36529
|
return l.users.list();
|