Fixes showing sensitive values like passwords and irritating error msg when key used is unknown
Only first unknown option is shown for now. May be iterated in the future. Closes #10050 Closes #10051
This commit is contained in:
parent
0941a4709e
commit
a5c3d035b9
4 changed files with 45 additions and 4 deletions
|
@ -4,7 +4,6 @@ import picocli.CommandLine;
|
||||||
import picocli.CommandLine.IParameterExceptionHandler;
|
import picocli.CommandLine.IParameterExceptionHandler;
|
||||||
import picocli.CommandLine.ParameterException;
|
import picocli.CommandLine.ParameterException;
|
||||||
import picocli.CommandLine.UnmatchedArgumentException;
|
import picocli.CommandLine.UnmatchedArgumentException;
|
||||||
import picocli.CommandLine.Help;
|
|
||||||
import picocli.CommandLine.Model.CommandSpec;
|
import picocli.CommandLine.Model.CommandSpec;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
@ -14,8 +13,22 @@ public class ShortErrorMessageHandler implements IParameterExceptionHandler {
|
||||||
public int handleParseException(ParameterException ex, String[] args) {
|
public int handleParseException(ParameterException ex, String[] args) {
|
||||||
CommandLine cmd = ex.getCommandLine();
|
CommandLine cmd = ex.getCommandLine();
|
||||||
PrintWriter writer = cmd.getErr();
|
PrintWriter writer = cmd.getErr();
|
||||||
|
String errorMessage = ex.getMessage();
|
||||||
|
|
||||||
writer.println(cmd.getColorScheme().errorText(ex.getMessage()));
|
if (ex instanceof UnmatchedArgumentException) {
|
||||||
|
UnmatchedArgumentException uae = (UnmatchedArgumentException) ex;
|
||||||
|
|
||||||
|
String[] unmatched = getUnmatchedPartsByOptionSeparator(uae,"=");
|
||||||
|
String original = uae.getUnmatched().get(0);
|
||||||
|
|
||||||
|
if (unmatched[0].equals(original)) {
|
||||||
|
unmatched = getUnmatchedPartsByOptionSeparator(uae," ");
|
||||||
|
}
|
||||||
|
|
||||||
|
errorMessage = "Unknown option: '" + unmatched[0] + "'";
|
||||||
|
}
|
||||||
|
|
||||||
|
writer.println(cmd.getColorScheme().errorText(errorMessage));
|
||||||
UnmatchedArgumentException.printSuggestions(ex, writer);
|
UnmatchedArgumentException.printSuggestions(ex, writer);
|
||||||
|
|
||||||
CommandSpec spec = cmd.getCommandSpec();
|
CommandSpec spec = cmd.getCommandSpec();
|
||||||
|
@ -25,4 +38,8 @@ public class ShortErrorMessageHandler implements IParameterExceptionHandler {
|
||||||
? cmd.getExitCodeExceptionMapper().getExitCode(ex)
|
? cmd.getExitCodeExceptionMapper().getExitCode(ex)
|
||||||
: spec.exitCodeOnInvalidInput();
|
: spec.exitCodeOnInvalidInput();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String[] getUnmatchedPartsByOptionSeparator(UnmatchedArgumentException uae, String separator) {
|
||||||
|
return uae.getUnmatched().get(0).split(separator);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,4 +47,28 @@ public class OptionValidationTest {
|
||||||
assertEquals("Unknown option: '--nosuch'\n" +
|
assertEquals("Unknown option: '--nosuch'\n" +
|
||||||
"Try 'kc.sh build --help' for more information on the available options.", result.getErrorOutput());
|
"Try 'kc.sh build --help' for more information on the available options.", result.getErrorOutput());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Launch({"start", "--db-pasword mytestpw"})
|
||||||
|
public void failUnknownOptionWhitespaceSeparatorNotShowingValue(LaunchResult result) {
|
||||||
|
assertEquals("Unknown option: '--db-pasword'\n" +
|
||||||
|
"Possible solutions: --db-username, --db-url-host, --db-pool-min-size, --db-password, --db-url-properties, --db-url-database, --db-schema, --db-pool-max-size, --db-pool-initial-size, --db-url\n" +
|
||||||
|
"Try 'kc.sh start --help' for more information on the available options.", result.getErrorOutput());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Launch({"start", "--db-pasword=mytestpw"})
|
||||||
|
public void failUnknownOptionEqualsSeparatorNotShowingValue(LaunchResult result) {
|
||||||
|
assertEquals("Unknown option: '--db-pasword'\n" +
|
||||||
|
"Possible solutions: --db-username, --db-url-host, --db-pool-min-size, --db-password, --db-url-properties, --db-url-database, --db-schema, --db-pool-max-size, --db-pool-initial-size, --db-url\n" +
|
||||||
|
"Try 'kc.sh start --help' for more information on the available options.", result.getErrorOutput());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Launch({"start", "--db-username=foobar","--db-pasword=mytestpw", "--foobar=barfoo"})
|
||||||
|
public void failWithFirstOptionOnMultipleUnknownOptions(LaunchResult result) {
|
||||||
|
assertEquals("Unknown option: '--db-pasword'\n" +
|
||||||
|
"Possible solutions: --db-username, --db-url-host, --db-pool-min-size, --db-password, --db-url-properties, --db-url-database, --db-schema, --db-pool-max-size, --db-pool-initial-size, --db-url\n" +
|
||||||
|
"Try 'kc.sh start --help' for more information on the available options.", result.getErrorOutput());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,6 +54,6 @@ public class StartCommandTest {
|
||||||
@Launch({ "-v", "start", "--db=dev-mem" })
|
@Launch({ "-v", "start", "--db=dev-mem" })
|
||||||
void failBuildPropertyNotAvailable(LaunchResult result) {
|
void failBuildPropertyNotAvailable(LaunchResult result) {
|
||||||
CLIResult cliResult = (CLIResult) result;
|
CLIResult cliResult = (CLIResult) result;
|
||||||
cliResult.assertError("Unknown option: '--db=dev-mem'");
|
cliResult.assertError("Unknown option: '--db'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,6 +59,6 @@ class BuildCommandDistTest {
|
||||||
@Launch({ "build", "--db=postgres", "--db-username=myuser", "--db-password=mypassword", "--http-enabled=true" })
|
@Launch({ "build", "--db=postgres", "--db-username=myuser", "--db-password=mypassword", "--http-enabled=true" })
|
||||||
void testFailRuntimeOptions(LaunchResult result) {
|
void testFailRuntimeOptions(LaunchResult result) {
|
||||||
CLIResult cliResult = (CLIResult) result;
|
CLIResult cliResult = (CLIResult) result;
|
||||||
cliResult.assertError("Unknown options: '--db-username=myuser', '--db-password=mypassword', '--http-enabled=true'");
|
cliResult.assertError("Unknown option: '--db-username'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue