diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/LocalRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/LocalRepository.java index 6df548a27..03358beda 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/LocalRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/LocalRepository.java @@ -19,11 +19,10 @@ package org.jackhuang.hmcl.upgrade; import static org.jackhuang.hmcl.util.Logging.LOG; import java.io.IOException; -import java.io.UncheckedIOException; -import java.net.MalformedURLException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.util.Optional; import java.util.jar.Attributes; import java.util.jar.JarFile; @@ -63,12 +62,21 @@ final class LocalRepository { /** * Creates a task that downloads the given version to local repository. */ - public static FileDownloadTask downloadFromRemote(RemoteVersion version) { - try { - return new FileDownloadTask(new URL(version.getUrl()), localStorage.toFile(), version.getIntegrityCheck()); - } catch (MalformedURLException e) { - throw new UncheckedIOException(e); - } + public static FileDownloadTask downloadFromRemote(RemoteVersion version) throws IOException { + Path stage = Files.createTempFile("hmcl-update-", ".jar"); + return new FileDownloadTask(new URL(version.getUrl()), stage.toFile(), version.getIntegrityCheck()) { + @Override + public void execute() throws Exception { + try { + super.execute(); + IntegrityChecker.requireVerifiedJar(stage); + Files.createDirectories(localStorage.getParent()); + Files.copy(stage, localStorage, StandardCopyOption.REPLACE_EXISTING); + } finally { + Files.deleteIfExists(stage); + } + } + }; } /** diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java index 3b2a6e4cf..67f710adb 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateHandler.java @@ -162,7 +162,13 @@ public final class UpdateHandler { public static void updateFrom(RemoteVersion version) { checkFxUserThread(); - Task task = LocalRepository.downloadFromRemote(version); + Task task; + try { + task = LocalRepository.downloadFromRemote(version); + } catch (IOException e) { + LOG.log(Level.WARNING, "Failed to create upgrade download task", e); + return; + } TaskExecutor executor = task.executor(); Region dialog = Controllers.taskDialog(executor, i18n("message.downloading"), "", null); thread(() -> {