From 7f4c0f080b7bd1dc0d691aad7662b2296fdd9334 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Fri, 3 Jul 2026 02:37:44 -0400 Subject: [PATCH 1/5] disallow periods in profile names --- .../meteorclient/systems/profiles/Profile.java | 2 +- src/main/java/meteordevelopment/meteorclient/utils/Utils.java | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java index 2b43e0e81b..4df09435d4 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java @@ -31,7 +31,7 @@ public class Profile implements ISerializable { public Setting name = sgGeneral.add(new StringSetting.Builder() .name("name") .description("The name of the profile.") - .filter(Utils::nameFilter) + .filter(Utils::fileNameFilter) .build() ); diff --git a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java index 7a8e91bcd3..57f7020825 100644 --- a/src/main/java/meteordevelopment/meteorclient/utils/Utils.java +++ b/src/main/java/meteordevelopment/meteorclient/utils/Utils.java @@ -672,6 +672,10 @@ public static boolean nameFilter(String text, char character) { return (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') || (character >= '0' && character <= '9') || character == '_' || character == '-' || character == '.' || character == ' '; } + public static boolean fileNameFilter(String text, char character) { + return (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') || (character >= '0' && character <= '9') || character == '_' || character == '-' || character == ' '; + } + public static boolean ipFilter(String text, char character) { if (text.contains(":") && character == ':') return false; return (character >= 'a' && character <= 'z') || (character >= 'A' && character <= 'Z') || (character >= '0' && character <= '9') || character == '.' || character == '-' || character == ':'; From 7f1828c09e558d96c5a15834f4f15fef5f0bd95a Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Fri, 3 Jul 2026 03:22:11 -0400 Subject: [PATCH 2/5] fix error reporting --- .../meteorclient/gui/tabs/builtin/ProfilesTab.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java index 80b1c6365e..b8fab90232 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java @@ -103,7 +103,7 @@ public void initWidgets() { OkPrompt.create() .title("Failure importing profile") .message("There was an error importing the profile.") - .message("Error: %d", e.getMessage()) + .message("Error: %s", e.getMessage()) .dontShowAgainCheckboxVisible(false) .show(); } From 671519ff37376525fbe2faea9058104be9395f19 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Fri, 3 Jul 2026 03:22:29 -0400 Subject: [PATCH 3/5] prefer throwing exceptions --- .../gui/tabs/builtin/ProfilesTab.java | 21 +++++++++++++---- .../systems/profiles/Profile.java | 23 +++---------------- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java index b8fab90232..987f389eeb 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java @@ -28,6 +28,7 @@ import net.minecraft.client.gui.screens.Screen; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; +import org.apache.commons.io.FilenameUtils; import org.lwjgl.BufferUtils; import org.lwjgl.PointerBuffer; import org.lwjgl.system.MemoryUtil; @@ -41,6 +42,7 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import static meteordevelopment.meteorclient.MeteorClient.mc; @@ -98,7 +100,7 @@ public void initWidgets() { if (imported != null) MeteorClient.LOG.info("Successfully imported profile '{}'.", imported.name.get()); reload(); - } catch (IOException e) { + } catch (Exception e) { MeteorClient.LOG.error("Error importing profile", e); OkPrompt.create() .title("Failure importing profile") @@ -146,11 +148,20 @@ private Profile importProfile() throws IOException { File profileFile = new File(file); CompoundTag nbt = NbtIo.read(profileFile.toPath()); + if (nbt == null) return null; Profile p = new Profile(); - if (!p.name.set(nbt.getStringOr("name", profileFile.getName()))) return null; - File profileFolder = p.getSafeFile(); - if (profileFolder == null) return null; + Optional parsedName = nbt.getString("name").filter(n -> !n.isEmpty()); + + if (parsedName.filter(p.name::set).isEmpty() && !p.name.set(FilenameUtils.removeExtension(profileFile.getName()))) { + throw new IllegalStateException("Imported profile does not have a valid name."); + } + + File profileFolder = p.getFile().getCanonicalFile(); + if (!profileFolder.getParent().equals(Profiles.FOLDER.getCanonicalPath())) { + throw new IllegalStateException("Imported profile does not have a valid location."); + } + //noinspection ResultOfMethodCallIgnored profileFolder.mkdirs(); @@ -215,7 +226,7 @@ public void initWidgets() { WButton save = add(theme.button(isNew ? "Create" : "Save")).expandX().widget(); save.action = () -> { - if (profile.getSafeFile() == null) return; + if (profile.name.get().isEmpty()) return; if (isNew) { for (Profile p : Profiles.get()) { diff --git a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java index 4df09435d4..1468e4772c 100644 --- a/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java +++ b/src/main/java/meteordevelopment/meteorclient/systems/profiles/Profile.java @@ -78,8 +78,7 @@ public Profile(Tag tag) { } public void load() { - File folder = getSafeFile(); - if (folder == null) return; + File folder = getFile(); if (hud.get()) Hud.get().load(folder); if (macros.get()) Macros.get().load(folder); @@ -88,8 +87,7 @@ public void load() { } public void save() { - File folder = getSafeFile(); - if (folder == null) return; + File folder = getFile(); if (hud.get()) Hud.get().save(folder); if (macros.get()) Macros.get().save(folder); @@ -99,8 +97,7 @@ public void save() { public void delete() { try { - File folder = getSafeFile(); - if (folder != null) FileUtils.deleteDirectory(folder); + FileUtils.deleteDirectory(getFile()); } catch (IOException e) { MeteorClient.LOG.error("Error deleting profile {}", name.get(), e); } @@ -110,20 +107,6 @@ public File getFile() { return new File(Profiles.FOLDER, name.get()); } - public File getSafeFile() { - try { - File folder = getFile().getCanonicalFile(); - File profilesFolder = Profiles.FOLDER.getCanonicalFile(); - - if (name.get().isEmpty() || !profilesFolder.equals(folder.getParentFile())) return null; - - return folder; - } catch (IOException e) { - MeteorClient.LOG.error("Error resolving profile {}", name.get(), e); - return null; - } - } - @Override public CompoundTag toTag() { CompoundTag tag = new CompoundTag(); From 273ff01cc7fb26a8908c251ee8a6ac73cca50530 Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Fri, 3 Jul 2026 03:35:46 -0400 Subject: [PATCH 4/5] sanity check if file is actually a profile --- .../meteorclient/gui/tabs/builtin/ProfilesTab.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java index 987f389eeb..87ce790700 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java @@ -164,8 +164,9 @@ private Profile importProfile() throws IOException { //noinspection ResultOfMethodCallIgnored profileFolder.mkdirs(); - nbt.remove("name"); + + boolean valid = false; for (var entry : nbt.entrySet()) { String filename = entry.getKey(); if (!filename.endsWith(".nbt")) continue; @@ -183,9 +184,14 @@ private Profile importProfile() throws IOException { File f = new File(profileFolder, filename).getCanonicalFile(); if (!f.toPath().startsWith(profileFolder.toPath())) continue; + valid = true; NbtIo.writeUnnamedTagWithFallback(entry.getValue(), new DataOutputStream(new FileOutputStream(f))); } + if (!valid) { + throw new IllegalStateException("Imported file is not a profile."); + } + Profiles.get().getAll().add(p); Profiles.get().save(); From 904a0b99bcd62de110b24aadc8fb40454f4d394e Mon Sep 17 00:00:00 2001 From: Crosby <32882447+crosby-moe@users.noreply.github.com> Date: Fri, 3 Jul 2026 03:38:08 -0400 Subject: [PATCH 5/5] typo! --- .../meteorclient/gui/tabs/builtin/ProfilesTab.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java index 87ce790700..20eb6eb2cf 100644 --- a/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java +++ b/src/main/java/meteordevelopment/meteorclient/gui/tabs/builtin/ProfilesTab.java @@ -158,7 +158,7 @@ private Profile importProfile() throws IOException { } File profileFolder = p.getFile().getCanonicalFile(); - if (!profileFolder.getParent().equals(Profiles.FOLDER.getCanonicalPath())) { + if (!profileFolder.getParentFile().equals(Profiles.FOLDER.getCanonicalFile())) { throw new IllegalStateException("Imported profile does not have a valid location."); }