@@ -223,10 +223,25 @@ jobs:
|
223 | 223 | set -euo pipefail |
224 | 224 | PACK_OUTPUT="$RUNNER_TEMP/npm-pack-output.txt" |
225 | 225 | npm pack --json 2>&1 | tee "$PACK_OUTPUT" |
226 | | - PACK_PATH="$(node - "$PACK_OUTPUT" <<'NODE' |
| 226 | + PACK_NAME="$(node - "$PACK_OUTPUT" <<'NODE' |
227 | 227 | const fs = require("node:fs"); |
| 228 | + const path = require("node:path"); |
228 | 229 | const input = fs.readFileSync(process.argv[2], "utf8"); |
229 | 230 | |
| 231 | + function resolveTarballFileName(value) { |
| 232 | + const fileName = typeof value === "string" ? value.trim() : ""; |
| 233 | + if ( |
| 234 | + !fileName.endsWith(".tgz") || |
| 235 | + fileName.includes("\0") || |
| 236 | + fileName !== path.basename(fileName) || |
| 237 | + fileName !== path.win32.basename(fileName) |
| 238 | + ) { |
| 239 | + console.error(`npm pack reported unsafe tarball filename ${JSON.stringify(fileName)}.`); |
| 240 | + process.exit(1); |
| 241 | + } |
| 242 | + return fileName; |
| 243 | + } |
| 244 | + |
230 | 245 | function arrayEndFrom(start) { |
231 | 246 | let depth = 0; |
232 | 247 | let inString = false; |
@@ -266,8 +281,8 @@ jobs:
|
266 | 281 | try { |
267 | 282 | const parsed = JSON.parse(input.slice(start, end)); |
268 | 283 | const first = Array.isArray(parsed) ? parsed[0] : null; |
269 | | - if (first && typeof first.filename === "string" && first.filename) { |
270 | | - process.stdout.write(first.filename); |
| 284 | + if (first && Object.prototype.hasOwnProperty.call(first, "filename")) { |
| 285 | + process.stdout.write(resolveTarballFileName(first.filename)); |
271 | 286 | process.exit(0); |
272 | 287 | } |
273 | 288 | } catch { |
@@ -279,6 +294,7 @@ jobs:
|
279 | 294 | process.exit(1); |
280 | 295 | NODE |
281 | 296 | )" |
| 297 | + PACK_PATH="$PWD/$PACK_NAME" |
282 | 298 | if [[ -z "$PACK_PATH" || ! -f "$PACK_PATH" ]]; then |
283 | 299 | echo "npm pack did not produce a tarball file." >&2 |
284 | 300 | exit 1 |
@@ -290,7 +306,7 @@ jobs:
|
290 | 306 | else |
291 | 307 | RELEASE_TAG="${RELEASE_REF}" |
292 | 308 | fi |
293 | | - TARBALL_NAME="$(basename "$PACK_PATH")" |
| 309 | + TARBALL_NAME="$PACK_NAME" |
294 | 310 | TARBALL_SHA256="$(sha256sum "$PACK_PATH" | awk '{print $1}')" |
295 | 311 | ARTIFACT_DIR="$RUNNER_TEMP/openclaw-npm-preflight" |
296 | 312 | rm -rf "$ARTIFACT_DIR" |
|