From 2ca7e7c830a9be0363dd0b583c1882f74f8a796b Mon Sep 17 00:00:00 2001 From: Zkitefly <2573874409@qq.com> Date: Sun, 10 Nov 2024 21:27:36 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20#3200:=20=E5=90=AF=E5=8A=A8=E6=97=B6?= =?UTF-8?q?=E4=B8=8D=E5=BA=94=E8=A1=A5=E5=85=A8=20Modrinth=20=E6=95=B4?= =?UTF-8?q?=E5=90=88=E5=8C=85=E4=B8=AD=E5=B7=B2=E7=A6=81=E7=94=A8=E7=9A=84?= =?UTF-8?q?=20mod=20(#3308)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update ModrinthCompletionTask.java * Update ModrinthCompletionTask.java * Update ModrinthCompletionTask.java * Update ModrinthCompletionTask.java * Update ModrinthCompletionTask.java * update * update * update * update * update * update * update --------- Co-authored-by: Glavo --- .../mod/modrinth/ModrinthCompletionTask.java | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthCompletionTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthCompletionTask.java index 3150a3457..c0fa257f6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthCompletionTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/modrinth/ModrinthCompletionTask.java @@ -19,6 +19,7 @@ package org.jackhuang.hmcl.mod.modrinth; import org.jackhuang.hmcl.download.DefaultDependencyManager; import org.jackhuang.hmcl.game.DefaultGameRepository; +import org.jackhuang.hmcl.mod.ModManager; import org.jackhuang.hmcl.mod.ModpackCompletionException; import org.jackhuang.hmcl.task.FileDownloadTask; import org.jackhuang.hmcl.task.Task; @@ -27,6 +28,7 @@ import org.jackhuang.hmcl.util.io.FileUtils; import java.io.File; import java.io.FileNotFoundException; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -41,6 +43,7 @@ public class ModrinthCompletionTask extends Task { private final DefaultDependencyManager dependency; private final DefaultGameRepository repository; + private final ModManager modManager; private final String version; private ModrinthManifest manifest; private final List> dependencies = new ArrayList<>(); @@ -69,6 +72,7 @@ public class ModrinthCompletionTask extends Task { public ModrinthCompletionTask(DefaultDependencyManager dependencyManager, String version, ModrinthManifest manifest) { this.dependency = dependencyManager; this.repository = dependencyManager.getGameRepository(); + this.modManager = repository.getModManager(version); this.version = version; this.manifest = manifest; @@ -99,18 +103,28 @@ public class ModrinthCompletionTask extends Task { if (manifest == null) return; - Path runDirectory = repository.getRunDirectory(version).toPath(); + Path runDirectory = repository.getRunDirectory(version).toPath().toAbsolutePath().normalize(); + Path modsDirectory = runDirectory.resolve("mods"); for (ModrinthManifest.File file : manifest.getFiles()) { if (file.getEnv() != null && file.getEnv().getOrDefault("client", "required").equals("unsupported")) continue; - Path filePath = runDirectory.resolve(file.getPath()); - if (!Files.exists(filePath) && !file.getDownloads().isEmpty()) { - FileDownloadTask task = new FileDownloadTask(file.getDownloads().get(0), filePath.toFile()); - task.setCacheRepository(dependency.getCacheRepository()); - task.setCaching(true); - dependencies.add(task.withCounter("hmcl.modpack.download")); - } + if (file.getDownloads().isEmpty()) + continue; + + Path filePath = runDirectory.resolve(file.getPath()).toAbsolutePath().normalize(); + if (!filePath.startsWith(runDirectory)) + throw new IOException("Unsecure path: " + file.getPath()); + + if (Files.exists(filePath)) + continue; + if (modsDirectory.equals(filePath.getParent()) && this.modManager.hasSimpleMod(FileUtils.getName(filePath))) + continue; + + FileDownloadTask task = new FileDownloadTask(file.getDownloads(), filePath.toFile()); + task.setCacheRepository(dependency.getCacheRepository()); + task.setCaching(true); + dependencies.add(task.withCounter("hmcl.modpack.download")); } if (!dependencies.isEmpty()) {