@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.
@@ -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
- this.dirs.set(`/${parts2.slice(0, at + 1).join("/")}`, dir);
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
- return [resolvePath((await this.locate(parentOf4(wanted), true)).path, baseOf(wanted)), false];
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
- this.refuse(resolvePath(parent.path, baseOf(path)));
3083
- await this.io(parent.handle.getDirectoryHandle(baseOf(path), { create: true }));
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.175.0" : "0.0.0-dev";
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 || caller.euid === caller.sessionUid) return true;
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();