@homeflare/alchemy 0.53.1 → 0.55.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.
Files changed (58) hide show
  1. package/dist/ceph/ceph-argv-config.d.ts +6 -3
  2. package/dist/ceph/ceph-argv-config.d.ts.map +1 -1
  3. package/dist/ceph/ceph-argv.d.ts +8 -0
  4. package/dist/ceph/ceph-argv.d.ts.map +1 -1
  5. package/dist/ceph/ceph-config-option-form.d.ts +48 -0
  6. package/dist/ceph/ceph-config-option-form.d.ts.map +1 -0
  7. package/dist/ceph/ceph-config-option-reconcile.d.ts +22 -0
  8. package/dist/ceph/ceph-config-option-reconcile.d.ts.map +1 -0
  9. package/dist/ceph/ceph-config-options.d.ts +15 -6
  10. package/dist/ceph/ceph-config-options.d.ts.map +1 -1
  11. package/dist/ceph/config-option.d.ts +10 -0
  12. package/dist/ceph/config-option.d.ts.map +1 -0
  13. package/dist/ceph/index.d.ts +7 -3
  14. package/dist/ceph/index.d.ts.map +1 -1
  15. package/dist/ceph/index.js +363 -8
  16. package/dist/ceph/index.js.map +17 -7
  17. package/dist/github/fork-pr-approval.d.ts +55 -0
  18. package/dist/github/fork-pr-approval.d.ts.map +1 -0
  19. package/dist/github/index.d.ts +1 -0
  20. package/dist/github/index.d.ts.map +1 -1
  21. package/dist/github/index.js +87 -4
  22. package/dist/github/index.js.map +6 -5
  23. package/dist/github/repo-baseline-data.d.ts +3 -2
  24. package/dist/github/repo-baseline-data.d.ts.map +1 -1
  25. package/dist/github/repository-ruleset-providers.d.ts +1 -1
  26. package/dist/github/repository-ruleset-providers.d.ts.map +1 -1
  27. package/dist/linux/index.js +33 -2
  28. package/dist/linux/index.js.map +3 -3
  29. package/dist/linux/sudo-runner.d.ts +12 -0
  30. package/dist/linux/sudo-runner.d.ts.map +1 -1
  31. package/dist/proxmox/index.d.ts +1 -0
  32. package/dist/proxmox/index.d.ts.map +1 -1
  33. package/dist/proxmox/index.js +101 -1
  34. package/dist/proxmox/index.js.map +5 -4
  35. package/dist/proxmox/scoped-api.d.ts +49 -0
  36. package/dist/proxmox/scoped-api.d.ts.map +1 -0
  37. package/docs/pve-scoped-api.md +23 -0
  38. package/package.json +1 -1
  39. package/src/ceph/ceph-argv-config.ts +27 -19
  40. package/src/ceph/ceph-argv.test.ts +37 -1
  41. package/src/ceph/ceph-argv.ts +25 -0
  42. package/src/ceph/ceph-config-option-form.ts +73 -0
  43. package/src/ceph/ceph-config-option-reconcile.ts +88 -0
  44. package/src/ceph/ceph-config-option.test.ts +213 -0
  45. package/src/ceph/ceph-config-options.test.ts +28 -11
  46. package/src/ceph/ceph-config-options.ts +29 -8
  47. package/src/ceph/config-option.ts +112 -0
  48. package/src/ceph/index.ts +7 -3
  49. package/src/github/fork-pr-approval.test.ts +74 -0
  50. package/src/github/fork-pr-approval.ts +174 -0
  51. package/src/github/index.ts +9 -0
  52. package/src/github/repo-baseline-data.ts +2 -2
  53. package/src/github/repository-ruleset-providers.ts +6 -1
  54. package/src/linux/sudo-runner-privileged-read.test.ts +92 -0
  55. package/src/linux/sudo-runner.ts +54 -1
  56. package/src/proxmox/index.ts +13 -0
  57. package/src/proxmox/scoped-api.test.ts +52 -0
  58. package/src/proxmox/scoped-api.ts +148 -0
@@ -3153,6 +3153,17 @@ var writeUnderPrefix = async (base, elevate, stage, path, bytes, options, mode)
3153
3153
  };
3154
3154
 
3155
3155
  // src/linux/sudo-runner.ts
3156
+ var BASE64 = "/usr/bin/base64";
3157
+ var checkPrivilegedReads = (paths = []) => {
3158
+ for (const path of paths) {
3159
+ const segments = path.split("/").slice(1);
3160
+ if (!path.startsWith("/") || path.endsWith("/") || segments.some((segment) => segment === "" || segment === "." || segment === "..") || /[\0\n]/.test(path))
3161
+ throw new SudoRefusedError(`sshSudoRunner: privilegedReads entry ${JSON.stringify(path)} is not a normalized absolute file path`);
3162
+ }
3163
+ return new Set(paths);
3164
+ };
3165
+ var decodeBase642 = (text) => new Uint8Array(Buffer.from(text.replaceAll(`
3166
+ `, ""), "base64"));
3156
3167
  var outsidePrefixHint = (path, prefixes) => (cause) => {
3157
3168
  const message = cause instanceof Error ? cause.message : String(cause);
3158
3169
  if (!/permission denied|operation not permitted/i.test(message))
@@ -3162,6 +3173,7 @@ var outsidePrefixHint = (path, prefixes) => (cause) => {
3162
3173
  var makeSshSudoRunner = (prefixList, deps) => {
3163
3174
  const prefixes = checkPrefixes(prefixList);
3164
3175
  const { base } = deps;
3176
+ const readable = checkPrivilegedReads(deps.privilegedReads);
3165
3177
  const elevate = async (argv, context, before) => {
3166
3178
  const shown = JSON.stringify(argv);
3167
3179
  const problem = privilegedProblem2(argv, { prefixes, ...context });
@@ -3192,7 +3204,25 @@ var makeSshSudoRunner = (prefixList, deps) => {
3192
3204
  lookupUser: (nameOrId) => base.lookupUser(nameOrId),
3193
3205
  platform: base.platform,
3194
3206
  privileged: true,
3195
- readFile: (path) => base.readFile(path),
3207
+ readFile: async (path) => {
3208
+ if (!readable.has(path))
3209
+ return base.readFile(path);
3210
+ const stat = await base.stat(path);
3211
+ if (stat === undefined)
3212
+ return;
3213
+ if (stat.kind !== "file" || stat.uid !== 0)
3214
+ throw new SudoRefusedError(`sshSudoRunner refused a privileged read of ${path}: it is a ${stat.kind} owned by uid ` + `${String(stat.uid)}, and only a root-owned regular file is read as root`);
3215
+ const argv = [BASE64, "--", path];
3216
+ const shown = JSON.stringify(argv);
3217
+ deps.log(`homeflare/linux sudo -n ${shown}`);
3218
+ const result = await base.exec([SUDO, "-n", "--", ...argv]);
3219
+ const refused = sudoRefusal(shown, result);
3220
+ if (refused !== undefined)
3221
+ throw refused;
3222
+ if (result.exitCode !== 0)
3223
+ throw new Error(`sudo -n ${shown} -> ${String(result.exitCode)}: ${result.stderr.trim().slice(0, 300)}`);
3224
+ return decodeBase642(result.stdout);
3225
+ },
3196
3226
  removeFile: async (path) => {
3197
3227
  const prefix = prefixOf(path, prefixes);
3198
3228
  if (prefix === undefined)
@@ -3230,6 +3260,7 @@ var sshSudoRunner = async (options) => {
3230
3260
  await checkProgramsExist(base, options.host);
3231
3261
  return makeSshSudoRunner(options.prefixes, {
3232
3262
  base,
3263
+ ...options.privilegedReads === undefined ? {} : { privilegedReads: options.privilegedReads },
3233
3264
  log: options.log ?? ((line) => {
3234
3265
  process.stderr.write(`${line}
3235
3266
  `);
@@ -3262,5 +3293,5 @@ export {
3262
3293
  sshSudoRunner
3263
3294
  };
3264
3295
 
3265
- //# debugId=DE197B18F4F6D7B664756E2164756E21
3296
+ //# debugId=2A7002C2A0EA54DD64756E2164756E21
3266
3297
  //# sourceMappingURL=index.js.map