From f2ea6415c9228523eab1be4b1359eef43ba64372 Mon Sep 17 00:00:00 2001 From: Skylot <118523+skylot@users.noreply.github.com> Date: Sat, 20 Apr 2024 17:15:40 +0100 Subject: [PATCH] fix(cli): don't print stacktrace for incorrect options (#2140) --- .../src/main/java/jadx/cli/JadxCLIArgs.java | 21 +++++++++---------- .../main/java/jadx/cli/JadxCLICommands.java | 4 +++- .../main/java/jadx/cli/SingleClassMode.java | 7 ++++--- .../java/jadx/cli/RenameConverterTest.java | 3 ++- .../main/java/jadx/api/JadxArgsValidator.java | 6 ------ 5 files changed, 19 insertions(+), 22 deletions(-) diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java b/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java index 6c99e7feb5c..f5e5039b793 100644 --- a/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java +++ b/jadx-cli/src/main/java/jadx/cli/JadxCLIArgs.java @@ -29,7 +29,7 @@ import jadx.api.args.ResourceNameSource; import jadx.api.args.UserRenamesMappingsMode; import jadx.core.deobf.conditions.DeobfWhitelist; -import jadx.core.utils.exceptions.JadxException; +import jadx.core.utils.exceptions.JadxArgsValidateException; import jadx.core.utils.files.FileUtils; public class JadxCLIArgs { @@ -287,14 +287,13 @@ private boolean process(JCommanderWrapper jcw) { System.out.println(JadxDecompiler.getVersion()); return false; } - try { - if (threadsCount <= 0) { - throw new JadxException("Threads count must be positive, got: " + threadsCount); + if (threadsCount <= 0) { + throw new JadxArgsValidateException("Threads count must be positive, got: " + threadsCount); + } + for (String fileName : files) { + if (fileName.startsWith("-")) { + throw new JadxArgsValidateException("Unknown option: " + fileName); } - } catch (JadxException e) { - System.err.println("ERROR: " + e.getMessage()); - jcw.printUsage(); - return false; } return true; } @@ -559,8 +558,8 @@ public Set convert(String value) { for (String s : value.split(",")) { try { set.add(RenameEnum.valueOf(s.trim().toUpperCase(Locale.ROOT))); - } catch (IllegalArgumentException e) { - throw new IllegalArgumentException( + } catch (Exception e) { + throw new JadxArgsValidateException( '\'' + s + "' is unknown for parameter " + paramName + ", possible values are " + enumValuesString(RenameEnum.values())); } @@ -625,7 +624,7 @@ public E convert(String value) { try { return parse.apply(stringAsEnumName(value)); } catch (Exception e) { - throw new IllegalArgumentException( + throw new JadxArgsValidateException( '\'' + value + "' is unknown, possible values are: " + enumValuesString(values.get())); } } diff --git a/jadx-cli/src/main/java/jadx/cli/JadxCLICommands.java b/jadx-cli/src/main/java/jadx/cli/JadxCLICommands.java index 69a6a06e07e..edfc98ec8f4 100644 --- a/jadx-cli/src/main/java/jadx/cli/JadxCLICommands.java +++ b/jadx-cli/src/main/java/jadx/cli/JadxCLICommands.java @@ -7,6 +7,7 @@ import jadx.cli.commands.CommandPlugins; import jadx.cli.commands.ICommand; +import jadx.core.utils.exceptions.JadxArgsValidateException; public class JadxCLICommands { private static final Map COMMANDS_MAP = new TreeMap<>(); @@ -26,7 +27,8 @@ public static void append(JCommander.Builder builder) { public static boolean process(JCommanderWrapper jcw, JCommander jc, String parsedCommand) { ICommand command = COMMANDS_MAP.get(parsedCommand); if (command == null) { - throw new IllegalArgumentException("Unknown command: " + parsedCommand); + throw new JadxArgsValidateException("Unknown command: " + parsedCommand + + ". Expected one of: " + COMMANDS_MAP.keySet()); } JCommander subCommander = jc.getCommands().get(parsedCommand); command.process(jcw, subCommander); diff --git a/jadx-cli/src/main/java/jadx/cli/SingleClassMode.java b/jadx-cli/src/main/java/jadx/cli/SingleClassMode.java index f0078a3bb7d..a485d41b85e 100644 --- a/jadx-cli/src/main/java/jadx/cli/SingleClassMode.java +++ b/jadx-cli/src/main/java/jadx/cli/SingleClassMode.java @@ -12,6 +12,7 @@ import jadx.core.dex.attributes.AFlag; import jadx.core.dex.nodes.ClassNode; import jadx.core.dex.visitors.SaveCode; +import jadx.core.utils.exceptions.JadxArgsValidateException; import jadx.core.utils.exceptions.JadxRuntimeException; import jadx.core.utils.files.FileUtils; @@ -33,10 +34,10 @@ public static boolean process(JadxDecompiler jadx, JadxCLIArgs cliArgs) { .findFirst().orElse(null); } if (clsForProcess == null) { - throw new JadxRuntimeException("Input class not found: " + singleClass); + throw new JadxArgsValidateException("Input class not found: " + singleClass); } if (clsForProcess.contains(AFlag.DONT_GENERATE)) { - throw new JadxRuntimeException("Input class can't be saved by current jadx settings (marked as DONT_GENERATE)"); + throw new JadxArgsValidateException("Input class can't be saved by current jadx settings (marked as DONT_GENERATE)"); } if (clsForProcess.isInner()) { clsForProcess = clsForProcess.getTopParentClass(); @@ -52,7 +53,7 @@ public static boolean process(JadxDecompiler jadx, JadxCLIArgs cliArgs) { if (size == 1) { clsForProcess = classes.get(0); } else { - throw new JadxRuntimeException("Found " + size + " classes, single class output can't be used"); + throw new JadxArgsValidateException("Found " + size + " classes, single class output can't be used"); } } ICodeInfo codeInfo; diff --git a/jadx-cli/src/test/java/jadx/cli/RenameConverterTest.java b/jadx-cli/src/test/java/jadx/cli/RenameConverterTest.java index e863d9d48e1..3b0940fcee1 100644 --- a/jadx-cli/src/test/java/jadx/cli/RenameConverterTest.java +++ b/jadx-cli/src/test/java/jadx/cli/RenameConverterTest.java @@ -7,6 +7,7 @@ import jadx.api.JadxArgs.RenameEnum; import jadx.cli.JadxCLIArgs.RenameConverter; +import jadx.core.utils.exceptions.JadxArgsValidateException; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -38,7 +39,7 @@ public void none() { @Test public void wrong() { - IllegalArgumentException thrown = assertThrows(IllegalArgumentException.class, + JadxArgsValidateException thrown = assertThrows(JadxArgsValidateException.class, () -> converter.convert("wrong"), "Expected convert() to throw, but it didn't"); diff --git a/jadx-core/src/main/java/jadx/api/JadxArgsValidator.java b/jadx-core/src/main/java/jadx/api/JadxArgsValidator.java index 71aa2980cec..9346e1123a9 100644 --- a/jadx-core/src/main/java/jadx/api/JadxArgsValidator.java +++ b/jadx-core/src/main/java/jadx/api/JadxArgsValidator.java @@ -28,12 +28,6 @@ private static void checkInputFiles(JadxDecompiler jadx, JadxArgs args) { if (inputFiles.isEmpty() && jadx.getCustomCodeLoaders().isEmpty()) { throw new JadxArgsValidateException("Please specify input file"); } - for (File inputFile : inputFiles) { - String fileName = inputFile.getName(); - if (fileName.startsWith("--")) { - throw new JadxArgsValidateException("Unknown argument: " + fileName); - } - } for (File file : inputFiles) { checkFile(file); }