Repository: ignite Updated Branches: refs/heads/master 5397d67af -> a8713f6d5
IGNITE-9990 Control.sh utility should request a password if necessary - Fixes #5079. Signed-off-by: Alexey Goncharuk <alexey.goncha...@gmail.com> Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/a8713f6d Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a8713f6d Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a8713f6d Branch: refs/heads/master Commit: a8713f6d57ad3bf5eb9e568ffdcc6f6b88f8ebc9 Parents: 5397d67 Author: a-polyakov <polyakov.alexandr.alexandrov...@gmail.com> Authored: Tue Oct 30 18:07:53 2018 +0300 Committer: Alexey Goncharuk <alexey.goncha...@gmail.com> Committed: Tue Oct 30 18:42:14 2018 +0300 ---------------------------------------------------------------------- .../ignite/internal/commandline/Arguments.java | 26 ++++- .../internal/commandline/CommandHandler.java | 114 +++++++++++++------ .../commandline/CommandHandlerParsingTest.java | 22 +--- 3 files changed, 102 insertions(+), 60 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/a8713f6d/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java index 5b8a0dc..6367eef 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/Arguments.java @@ -71,10 +71,10 @@ public class Arguments { */ private String walArgs; - /** Ping timeout for grid client. See {@link GridClientConfiguration#pingTimeout}.*/ + /** Ping timeout for grid client. See {@link GridClientConfiguration#pingTimeout}. */ private long pingTimeout; - /** Ping interval for grid client. See {@link GridClientConfiguration#pingInterval}.*/ + /** Ping interval for grid client. See {@link GridClientConfiguration#pingInterval}. */ private long pingInterval; /** @@ -94,8 +94,8 @@ public class Arguments { * @param autoConfirmation Auto confirmation flag. */ public Arguments(Command cmd, String host, String port, String user, String pwd, String baselineAct, - String baselineArgs, VisorTxTaskArg txArg, CacheArguments cacheArgs, String walAct, String walArgs, - Long pingTimeout, Long pingInterval, boolean autoConfirmation) { + String baselineArgs, VisorTxTaskArg txArg, CacheArguments cacheArgs, String walAct, String walArgs, + Long pingTimeout, Long pingInterval, boolean autoConfirmation) { this.cmd = cmd; this.host = host; this.port = port; @@ -136,18 +136,32 @@ public class Arguments { /** * @return user name */ - public String user() { + public String getUserName() { return user; } /** + * @param user New user name. + */ + public void setUserName(String user) { + this.user = user; + } + + /** * @return password */ - public String password() { + public String getPassword() { return pwd; } /** + * @param pwd New password. + */ + public void setPassword(String pwd) { + this.pwd = pwd; + } + + /** * @return baseline action */ public String baselineAction() { http://git-wip-us.apache.org/repos/asf/ignite/blob/a8713f6d/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java index c1853f8..167a806 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/CommandHandler.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.commandline; +import java.io.Console; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -117,6 +118,7 @@ import org.apache.ignite.internal.visor.verify.VisorViewCacheTaskResult; import org.apache.ignite.lang.IgniteProductVersion; import org.apache.ignite.plugin.security.SecurityCredentials; import org.apache.ignite.plugin.security.SecurityCredentialsBasicProvider; +import org.apache.ignite.plugin.security.SecurityCredentialsProvider; import static org.apache.ignite.IgniteSystemProperties.IGNITE_ENABLE_EXPERIMENTAL_COMMAND; import static org.apache.ignite.internal.IgniteVersionUtils.ACK_VER_STR; @@ -1855,12 +1857,6 @@ public class CommandHandler { Command cmd = commands.get(0); - boolean hasUsr = F.isEmpty(user); - boolean hasPwd = F.isEmpty(pwd); - - if (hasUsr != hasPwd) - throw new IllegalArgumentException("Both user and password should be specified"); - return new Arguments(cmd, host, port, user, pwd, baselineAct, baselineArgs, txArgs, cacheArgs, walAct, walArgs, pingTimeout, pingInterval, autoConfirmation); } @@ -2421,50 +2417,100 @@ public class CommandHandler { clientCfg.setServers(Collections.singletonList(args.host() + ":" + args.port())); - if (!F.isEmpty(args.user())) { - clientCfg.setSecurityCredentialsProvider( - new SecurityCredentialsBasicProvider(new SecurityCredentials(args.user(), args.password()))); - } + boolean tryConnectAgain = true; - try (GridClient client = GridClientFactory.start(clientCfg)) { - switch (args.command()) { - case ACTIVATE: - activate(client); + int tryConnectMaxCount=3; - break; + while (tryConnectAgain) { + tryConnectAgain = false; - case DEACTIVATE: - deactivate(client); + if (!F.isEmpty(args.getUserName())) { + SecurityCredentialsProvider securityCredential = clientCfg.getSecurityCredentialsProvider(); - break; + if (securityCredential == null) { + securityCredential = new SecurityCredentialsBasicProvider( + new SecurityCredentials(args.getUserName(), args.getPassword()) + ); - case STATE: - state(client); + clientCfg.setSecurityCredentialsProvider(securityCredential); + } + final SecurityCredentials credential = securityCredential.credentials(); + credential.setLogin(args.getUserName()); + credential.setPassword(args.getPassword()); + } - break; + try (GridClient client = GridClientFactory.start(clientCfg)) { + switch (args.command()) { + case ACTIVATE: + activate(client); - case BASELINE: - baseline(client, args.baselineAction(), args.baselineArguments()); + break; - break; + case DEACTIVATE: + deactivate(client); - case TX: - transactions(client, args.transactionArguments()); + break; - break; + case STATE: + state(client); - case CACHE: - cache(client, args.cacheArgs()); + break; - break; + case BASELINE: + baseline(client, args.baselineAction(), args.baselineArguments()); - case WAL: - wal(client, args.walAction(), args.walArguments()); + break; - break; + case TX: + transactions(client, args.transactionArguments()); + + break; + + case CACHE: + cache(client, args.cacheArgs()); + + break; + + case WAL: + wal(client, args.walAction(), args.walArguments()); + + break; + } } - } + catch (Throwable e) { + if (tryConnectMaxCount > 0 && isAuthError(e)) { + System.out.println("Authentication error, try connection again."); + + final Console console = System.console(); + + if (console != null) { + if (F.isEmpty(args.getUserName())) + args.setUserName(console.readLine("user: ")); + + args.setPassword(new String(console.readPassword("password: "))); + } + else { + Scanner scanner = new Scanner(System.in); + + if (F.isEmpty(args.getUserName())){ + System.out.println("user: "); + + args.setUserName(scanner.next()); + } + + System.out.println("password: "); + + args.setPassword(scanner.next()); + } + + tryConnectAgain = true; + tryConnectMaxCount--; + } + else + throw e; + } + } return EXIT_CODE_OK; } catch (IllegalArgumentException e) { http://git-wip-us.apache.org/repos/asf/ignite/blob/a8713f6d/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java index 0ac5d1a..988b1d7 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/commandline/CommandHandlerParsingTest.java @@ -194,28 +194,10 @@ public class CommandHandlerParsingTest extends TestCase { e.printStackTrace(); } - try { - hnd.parseAndValidate(asList("--user", "testUser", cmd.text())); - - fail("expected exception: Both user and password should be specified"); - } - catch (IllegalArgumentException e) { - e.printStackTrace(); - } - - try { - hnd.parseAndValidate(asList("--password", "testPass", cmd.text())); - - fail("expected exception: Both user and password should be specified"); - } - catch (IllegalArgumentException e) { - e.printStackTrace(); - } - Arguments args = hnd.parseAndValidate(asList("--user", "testUser", "--password", "testPass", cmd.text())); - assertEquals("testUser", args.user()); - assertEquals("testPass", args.password()); + assertEquals("testUser", args.getUserName()); + assertEquals("testPass", args.getPassword()); assertEquals(cmd, args.command()); } }