From 4619758613dadb808a7a65938004d76bdee5cd70 Mon Sep 17 00:00:00 2001 From: Craig Raw Date: Wed, 16 Sep 2026 12:12:11 +0200 Subject: [PATCH] reject unknown command line options and values given to flags with an error and exit code instead of starting on the default network, and accept the --option=value form --- .../java/com/sparrowwallet/sparrow/Args.java | 2 ++ .../sparrowwallet/sparrow/SparrowWallet.java | 25 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sparrowwallet/sparrow/Args.java b/src/main/java/com/sparrowwallet/sparrow/Args.java index 3c885358..dd843bd6 100644 --- a/src/main/java/com/sparrowwallet/sparrow/Args.java +++ b/src/main/java/com/sparrowwallet/sparrow/Args.java @@ -1,12 +1,14 @@ package com.sparrowwallet.sparrow; import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; import com.sparrowwallet.drongo.Network; import org.slf4j.event.Level; import java.util.ArrayList; import java.util.List; +@Parameters(separators = "=") public class Args { @Parameter(names = { "--dir", "-d" }, description = "Path to Sparrow home folder") public String dir; diff --git a/src/main/java/com/sparrowwallet/sparrow/SparrowWallet.java b/src/main/java/com/sparrowwallet/sparrow/SparrowWallet.java index c73b5054..f3c89bc7 100644 --- a/src/main/java/com/sparrowwallet/sparrow/SparrowWallet.java +++ b/src/main/java/com/sparrowwallet/sparrow/SparrowWallet.java @@ -1,6 +1,8 @@ package com.sparrowwallet.sparrow; import com.beust.jcommander.JCommander; +import com.beust.jcommander.ParameterDescription; +import com.beust.jcommander.ParameterException; import com.sparrowwallet.drongo.ApplicationDir; import com.sparrowwallet.drongo.Drongo; import com.sparrowwallet.drongo.Network; @@ -39,7 +41,28 @@ public class SparrowWallet { Args args = new Args(); JCommander jCommander = JCommander.newBuilder().addObject(args).programName(APP_NAME.toLowerCase(Locale.ROOT)).acceptUnknownOptions(true).build(); - jCommander.parse(argv); + try { + jCommander.parse(argv); + Optional unknownOption = jCommander.getUnknownOptions().stream().filter(arg -> arg.startsWith("-")).findFirst(); + if(unknownOption.isPresent()) { + throw new ParameterException("Unknown option: " + unknownOption.get()); + } + //Flags take no value, and the = separator would otherwise set the flag and pass the value on as a file or URI + for(ParameterDescription description : jCommander.getParameters()) { + if(description.getParameterized().getType() == boolean.class) { + for(String name : description.getParameter().names()) { + if(Arrays.stream(argv).anyMatch(arg -> arg.startsWith(name + "="))) { + throw new ParameterException("Option " + name + " does not take a value"); + } + } + } + } + } catch(ParameterException e) { + System.err.println(e.getMessage()); + jCommander.usage(); + System.exit(1); + } + if(args.help) { jCommander.usage(); System.exit(0);