From 2aeeb3e463e514aa3fb82d815f4c941a21adde42 Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Fri, 25 Aug 2023 23:16:12 +0800 Subject: [PATCH] fix: unable to use plugin development mode on Windows systems (#4480) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind bug /area core /milestone 2.9.x #### What this PR does / why we need it: 修复 Windows 系统上的插件路径问题 how to test it? 1. 在 windows 系统上使用插件生成模式初始化 halo 插件可以正常运行,测试上传插件 jar 升级可以正常运行 2. 测试 windows 系统上使用插件开发模式可以正确运行插件 #### Which issue(s) this PR fixes: Fixes #4466 #### Does this PR introduce a user-facing change? ```release-note 修复 Windows 系统上的插件路径问题 ``` --- .../core/extension/reconciler/PluginReconciler.java | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java b/application/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java index 1d079137a..9744c7930 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java +++ b/application/src/main/java/run/halo/app/core/extension/reconciler/PluginReconciler.java @@ -55,6 +55,7 @@ import run.halo.app.extension.controller.Reconciler; import run.halo.app.extension.controller.Reconciler.Request; import run.halo.app.infra.Condition; import run.halo.app.infra.ConditionStatus; +import run.halo.app.infra.utils.FileUtils; import run.halo.app.infra.utils.JsonUtils; import run.halo.app.infra.utils.PathUtils; import run.halo.app.infra.utils.YamlUnstructuredLoader; @@ -391,9 +392,11 @@ public class PluginReconciler implements Reconciler { return null; }); } catch (Exception e) { - haloPluginManager.stopPlugin(name); PluginWrapper pluginWrapper = haloPluginManager.getPlugin(name); - pluginWrapper.setPluginState(PluginState.FAILED); + if (pluginWrapper != null) { + haloPluginManager.stopPlugin(name); + pluginWrapper.setPluginState(PluginState.FAILED); + } throw e; } } @@ -614,7 +617,11 @@ public class PluginReconciler implements Reconciler { } return pluginPath.toString(); } - return PathUtils.combinePath(pluginsRoot.toString(), pluginPath.toString()); + var result = pluginsRoot.resolve(pluginPath); + if (!isDevelopmentMode(name)) { + FileUtils.checkDirectoryTraversal(pluginsRoot, result); + } + return result.toString(); } boolean shouldDeleteFile(String newPluginPath, URI oldPluginLocation) {