@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.
- package/dist/ceph/ceph-argv-config.d.ts +6 -3
- package/dist/ceph/ceph-argv-config.d.ts.map +1 -1
- package/dist/ceph/ceph-argv.d.ts +8 -0
- package/dist/ceph/ceph-argv.d.ts.map +1 -1
- package/dist/ceph/ceph-config-option-form.d.ts +48 -0
- package/dist/ceph/ceph-config-option-form.d.ts.map +1 -0
- package/dist/ceph/ceph-config-option-reconcile.d.ts +22 -0
- package/dist/ceph/ceph-config-option-reconcile.d.ts.map +1 -0
- package/dist/ceph/ceph-config-options.d.ts +15 -6
- package/dist/ceph/ceph-config-options.d.ts.map +1 -1
- package/dist/ceph/config-option.d.ts +10 -0
- package/dist/ceph/config-option.d.ts.map +1 -0
- package/dist/ceph/index.d.ts +7 -3
- package/dist/ceph/index.d.ts.map +1 -1
- package/dist/ceph/index.js +363 -8
- package/dist/ceph/index.js.map +17 -7
- package/dist/github/fork-pr-approval.d.ts +55 -0
- package/dist/github/fork-pr-approval.d.ts.map +1 -0
- package/dist/github/index.d.ts +1 -0
- package/dist/github/index.d.ts.map +1 -1
- package/dist/github/index.js +87 -4
- package/dist/github/index.js.map +6 -5
- package/dist/github/repo-baseline-data.d.ts +3 -2
- package/dist/github/repo-baseline-data.d.ts.map +1 -1
- package/dist/github/repository-ruleset-providers.d.ts +1 -1
- package/dist/github/repository-ruleset-providers.d.ts.map +1 -1
- package/dist/linux/index.js +33 -2
- package/dist/linux/index.js.map +3 -3
- package/dist/linux/sudo-runner.d.ts +12 -0
- package/dist/linux/sudo-runner.d.ts.map +1 -1
- package/dist/proxmox/index.d.ts +1 -0
- package/dist/proxmox/index.d.ts.map +1 -1
- package/dist/proxmox/index.js +101 -1
- package/dist/proxmox/index.js.map +5 -4
- package/dist/proxmox/scoped-api.d.ts +49 -0
- package/dist/proxmox/scoped-api.d.ts.map +1 -0
- package/docs/pve-scoped-api.md +23 -0
- package/package.json +1 -1
- package/src/ceph/ceph-argv-config.ts +27 -19
- package/src/ceph/ceph-argv.test.ts +37 -1
- package/src/ceph/ceph-argv.ts +25 -0
- package/src/ceph/ceph-config-option-form.ts +73 -0
- package/src/ceph/ceph-config-option-reconcile.ts +88 -0
- package/src/ceph/ceph-config-option.test.ts +213 -0
- package/src/ceph/ceph-config-options.test.ts +28 -11
- package/src/ceph/ceph-config-options.ts +29 -8
- package/src/ceph/config-option.ts +112 -0
- package/src/ceph/index.ts +7 -3
- package/src/github/fork-pr-approval.test.ts +74 -0
- package/src/github/fork-pr-approval.ts +174 -0
- package/src/github/index.ts +9 -0
- package/src/github/repo-baseline-data.ts +2 -2
- package/src/github/repository-ruleset-providers.ts +6 -1
- package/src/linux/sudo-runner-privileged-read.test.ts +92 -0
- package/src/linux/sudo-runner.ts +54 -1
- package/src/proxmox/index.ts +13 -0
- package/src/proxmox/scoped-api.test.ts +52 -0
- package/src/proxmox/scoped-api.ts +148 -0
package/dist/linux/index.js
CHANGED
|
@@ -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) =>
|
|
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=
|
|
3296
|
+
//# debugId=2A7002C2A0EA54DD64756E2164756E21
|
|
3266
3297
|
//# sourceMappingURL=index.js.map
|