Skip to content

Commit

Permalink
Improve minecraft-client.jar download to use a temporary file before …
Browse files Browse the repository at this point in the history
…verification
  • Loading branch information
TBlueF committed Dec 10, 2024
1 parent 7200e94 commit 51f1274
Showing 1 changed file with 25 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -134,32 +134,41 @@ public static MinecraftVersion load(@Nullable String id, Path dataRoot, boolean
}

private static void download(VersionManifest.Version version, Path file) throws IOException {
boolean downloadCompletedAndVerified = false;
VersionManifest.Download download = version.fetchDetail().getDownloads().getClient();
Logger.global.logInfo("Downloading '" + download.getUrl() + "' to '" + file + "'...");

FileHelper.createDirectories(file.toAbsolutePath().normalize().getParent());
Path unverifiedFile = file.getParent().resolve(file.getFileName().toString() + ".unverified");

try {
try (
DigestInputStream in = new DigestInputStream(
new URI(download.getUrl()).toURL().openStream(),
MessageDigest.getInstance("SHA-1")
);
OutputStream out = Files.newOutputStream(unverifiedFile)
) {

// download
in.transferTo(out);

// verify sha-1
if (!Arrays.equals(
in.getMessageDigest().digest(),
hexStringToByteArray(download.getSha1())
)) {
throw new IOException("SHA-1 of the downloaded file does not match!");
}

try (
DigestInputStream in = new DigestInputStream(new URI(download.getUrl()).toURL().openStream(), MessageDigest.getInstance("SHA-1"));
OutputStream out = Files.newOutputStream(file, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW, StandardOpenOption.TRUNCATE_EXISTING)
) {
in.transferTo(out);

// verify sha-1
if (!Arrays.equals(
in.getMessageDigest().digest(),
hexStringToByteArray(download.getSha1())
)) {
throw new IOException("SHA-1 of the downloaded file does not match!");
}

downloadCompletedAndVerified = true;
// rename once verified
FileHelper.atomicMove(unverifiedFile, file);

} catch (NoSuchAlgorithmException | IOException | URISyntaxException ex) {
Logger.global.logWarning("Failed to download '" + download.getUrl() + "': " + ex);
} finally {
if (!downloadCompletedAndVerified)
Files.deleteIfExists(file);
Files.deleteIfExists(unverifiedFile);
}

}
Expand Down

0 comments on commit 51f1274

Please sign in to comment.