From 4cf5b79b1596546ed241fcfc06f47f3bf16641be Mon Sep 17 00:00:00 2001 From: Risto Lahtela <24460436+AuroraLS3@users.noreply.github.com> Date: Sat, 24 Apr 2021 09:58:43 +0300 Subject: [PATCH] Check against symlinks every time when creating directories Affects issues: - Fixed #1866 --- .../djrapitops/plan/delivery/export/FileExporter.java | 9 ++++++--- .../com/djrapitops/plan/delivery/web/ResourceSvc.java | 3 ++- .../plan/delivery/webserver/cache/JSONFileStorage.java | 2 +- .../java/com/djrapitops/plan/settings/config/Config.java | 4 ++-- .../djrapitops/plan/settings/config/ConfigWriter.java | 6 ++---- .../plan/settings/network/NetworkSettingManager.java | 4 +++- .../java/com/djrapitops/plan/storage/file/PlanFiles.java | 6 ++++-- .../plan/utilities/logging/PluginErrorLogger.java | 3 ++- Plan/common/src/test/java/utilities/TestResources.java | 3 ++- 9 files changed, 24 insertions(+), 16 deletions(-) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/FileExporter.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/FileExporter.java index 816dfe29a..905146236 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/FileExporter.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/export/FileExporter.java @@ -51,7 +51,8 @@ abstract class FileExporter { } void export(Path to, List content) throws IOException { - Files.createDirectories(to.getParent()); + Path dir = to.getParent(); + if (!Files.isSymbolicLink(dir)) Files.createDirectories(dir); Files.write(to, content, StandardCharsets.UTF_8, OPEN_OPTIONS); } @@ -60,7 +61,8 @@ abstract class FileExporter { } void export(Path to, WebResource resource) throws IOException { - Files.createDirectories(to.getParent()); + Path dir = to.getParent(); + if (!Files.isSymbolicLink(dir)) Files.createDirectories(dir); try ( InputStream in = resource.asStream(); @@ -71,7 +73,8 @@ abstract class FileExporter { } void export(Path to, byte[] resource) throws IOException { - Files.createDirectories(to.getParent()); + Path dir = to.getParent(); + if (!Files.isSymbolicLink(dir)) Files.createDirectories(dir); try ( InputStream in = new ByteArrayInputStream(resource); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/web/ResourceSvc.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/web/ResourceSvc.java index 000addf28..2af14d94c 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/web/ResourceSvc.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/web/ResourceSvc.java @@ -175,7 +175,8 @@ public class ResourceSvc implements ResourceService { byte[] bytes = original.asBytes(); OpenOption[] overwrite = {StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE}; Path to = files.getCustomizationDirectory().resolve(fileName); - Files.createDirectories(to.getParent()); + Path dir = to.getParent(); + if (!Files.isSymbolicLink(dir)) Files.createDirectories(dir); Files.write(to, bytes, overwrite); return original; } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONFileStorage.java b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONFileStorage.java index 93339ce5a..a0170a85d 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONFileStorage.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/delivery/webserver/cache/JSONFileStorage.java @@ -91,7 +91,7 @@ public class JSONFileStorage implements JSONStorage { Path writingTo = jsonDirectory.resolve(identifier + '-' + timestamp + JSON_FILE_EXTENSION); String jsonToWrite = addMissingTimestamp(json, timestamp); try { - Files.createDirectories(jsonDirectory); + if (!Files.isSymbolicLink(jsonDirectory)) Files.createDirectories(jsonDirectory); Files.write(writingTo, jsonToWrite.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.WRITE); } catch (IOException e) { logger.warn("Could not write a file to " + writingTo.toFile().getAbsolutePath() + ": " + e.getMessage()); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/settings/config/Config.java b/Plan/common/src/main/java/com/djrapitops/plan/settings/config/Config.java index 2821cc3ee..4a5ee2148 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/settings/config/Config.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/settings/config/Config.java @@ -43,11 +43,11 @@ public class Config extends ConfigNode { public Config(File configFile) { super("", null, null); - File folder = configFile.getParentFile(); this.configFilePath = configFile.toPath(); + Path dir = configFilePath.getParent(); try { - Files.createDirectories(folder.toPath()); + if (!Files.isSymbolicLink(dir)) Files.createDirectories(dir); if (!Files.exists(configFilePath)) Files.createFile(configFilePath); read(); save(); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/settings/config/ConfigWriter.java b/Plan/common/src/main/java/com/djrapitops/plan/settings/config/ConfigWriter.java index f055e57ea..2e269dc79 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/settings/config/ConfigWriter.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/settings/config/ConfigWriter.java @@ -68,10 +68,8 @@ public class ConfigWriter { ConfigNode storedParent = writing.parent; writing.updateParent(null); - Path directory = outputPath.getParent(); - if (!directory.toRealPath().toFile().isDirectory()) { - Files.createDirectories(directory); - } + Path dir = outputPath.getParent(); + if (!Files.isSymbolicLink(dir)) Files.createDirectories(dir); Files.write(outputPath, createLines(writing), StandardCharsets.UTF_8, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE); writing.updateParent(storedParent); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/settings/network/NetworkSettingManager.java b/Plan/common/src/main/java/com/djrapitops/plan/settings/network/NetworkSettingManager.java index 265d6ee70..6ef151967 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/settings/network/NetworkSettingManager.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/settings/network/NetworkSettingManager.java @@ -42,6 +42,7 @@ import java.io.File; import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Files; +import java.nio.file.Path; import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -150,7 +151,8 @@ public class NetworkSettingManager implements SubSystem { private File createServerSettingsFolder() { try { File serverConfigFolder = files.getFileFromPluginFolder("serverConfiguration"); - Files.createDirectories(serverConfigFolder.toPath()); + Path dir = serverConfigFolder.toPath(); + if (!Files.isSymbolicLink(dir)) Files.createDirectories(dir); return serverConfigFolder; } catch (IOException e) { throw new EnableException("Could not initialize NetworkSettingManager: " + e.getMessage(), e); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/storage/file/PlanFiles.java b/Plan/common/src/main/java/com/djrapitops/plan/storage/file/PlanFiles.java index 675a93f0b..40bb1d0ef 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/storage/file/PlanFiles.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/storage/file/PlanFiles.java @@ -67,7 +67,8 @@ public class PlanFiles implements SubSystem { public File getLogsFolder() { try { File folder = getFileFromPluginFolder("logs"); - Files.createDirectories(folder.toPath()); + Path dir = folder.toPath(); + Files.createDirectories(dir); return folder; } catch (IOException e) { throw new UncheckedIOException(e); @@ -95,7 +96,8 @@ public class PlanFiles implements SubSystem { ResourceCache.invalidateAll(); ResourceCache.cleanUp(); try { - Files.createDirectories(dataFolder.toPath()); + Path dir = getDataDirectory(); + if (!Files.isSymbolicLink(dir)) Files.createDirectories(dir); if (!configFile.exists()) Files.createFile(configFile.toPath()); } catch (IOException e) { throw new EnableException("Failed to create config.yml, " + e.getMessage(), e); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/utilities/logging/PluginErrorLogger.java b/Plan/common/src/main/java/com/djrapitops/plan/utilities/logging/PluginErrorLogger.java index 6462eb706..2f59b70b4 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/utilities/logging/PluginErrorLogger.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/utilities/logging/PluginErrorLogger.java @@ -223,7 +223,8 @@ public class PluginErrorLogger implements ErrorLogger { private void writeNew(Path errorLog, Throwable throwable, List lines) { try { - Files.createDirectories(errorLog.getParent()); + Path dir = errorLog.getParent(); + if (!Files.isSymbolicLink(dir)) Files.createDirectories(dir); Files.write(errorLog, lines, StandardOpenOption.CREATE_NEW, StandardOpenOption.APPEND); } catch (IOException e) { throwable.addSuppressed(e); diff --git a/Plan/common/src/test/java/utilities/TestResources.java b/Plan/common/src/test/java/utilities/TestResources.java index 838caaf63..d4b8e3b20 100644 --- a/Plan/common/src/test/java/utilities/TestResources.java +++ b/Plan/common/src/test/java/utilities/TestResources.java @@ -83,7 +83,8 @@ public class TestResources { private static void createEmptyFile(File toFile) { try { - Files.createDirectories(toFile.toPath().getParent()); + Path dir = toFile.toPath().getParent(); + if (!Files.isSymbolicLink(dir)) Files.createDirectories(dir); if (!toFile.exists()) { Files.createFile(toFile.toPath()); }