setup-uv/src/download/checksum/checksum.ts

58 lines
1.9 KiB
TypeScript
Raw Normal View History

import * as fs from "node:fs";
import * as crypto from "node:crypto";
2024-08-23 23:58:26 +02:00
import * as core from "@actions/core";
import { KNOWN_CHECKSUMS } from "./known-checksums";
import type { Architecture, Platform } from "../../utils/platforms";
2024-08-23 23:58:26 +02:00
export async function validateChecksum(
checkSum: string | undefined,
downloadPath: string,
arch: Architecture,
platform: Platform,
version: string,
2024-08-23 23:58:26 +02:00
): Promise<void> {
let isValid: boolean | undefined = undefined;
if (checkSum !== undefined && checkSum !== "") {
isValid = await validateFileCheckSum(downloadPath, checkSum);
2024-08-23 23:58:26 +02:00
} else {
core.debug("Checksum not provided. Checking known checksums.");
const key = `${arch}-${platform}-${version}`;
2024-08-23 23:58:26 +02:00
if (key in KNOWN_CHECKSUMS) {
const knownChecksum = KNOWN_CHECKSUMS[`${arch}-${platform}-${version}`];
core.debug(`Checking checksum for ${arch}-${platform}-${version}.`);
isValid = await validateFileCheckSum(downloadPath, knownChecksum);
2024-08-23 23:58:26 +02:00
} else {
core.debug(`No known checksum found for ${key}.`);
2024-08-23 23:58:26 +02:00
}
}
if (isValid === false) {
throw new Error(`Checksum for ${downloadPath} did not match ${checkSum}.`);
2024-08-23 23:58:26 +02:00
}
if (isValid === true) {
core.debug(`Checksum for ${downloadPath} is valid.`);
}
2024-08-23 23:58:26 +02:00
}
async function validateFileCheckSum(
filePath: string,
expected: string,
2024-08-23 23:58:26 +02:00
): Promise<boolean> {
return new Promise((resolve, reject) => {
const hash = crypto.createHash("sha256");
const stream = fs.createReadStream(filePath);
stream.on("error", (err) => reject(err));
stream.on("data", (chunk) => hash.update(chunk));
stream.on("end", () => {
const actual = hash.digest("hex");
resolve(actual === expected);
});
});
2024-08-23 23:58:26 +02:00
}
export function isknownVersion(version: string): boolean {
const pattern = new RegExp(`^.*-.*-${version}$`);
return Object.keys(KNOWN_CHECKSUMS).some((key) => pattern.test(key));
2024-08-23 23:58:26 +02:00
}