You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by jd...@apache.org on 2008/09/27 10:03:06 UTC

svn commit: r699599 - /geronimo/gshell/trunk/gshell-commands/gshell-remote/src/main/java/org/apache/geronimo/gshell/commands/remote/RshAction.java

Author: jdillon
Date: Sat Sep 27 01:03:06 2008
New Revision: 699599

URL: http://svn.apache.org/viewvc?rev=699599&view=rev
Log:
Validate that prompted username & password are not null and not empty strings using new PromptReader.Validator muck
Moved prompting up before any remote client is created, incase validation of prompted data fails

Modified:
    geronimo/gshell/trunk/gshell-commands/gshell-remote/src/main/java/org/apache/geronimo/gshell/commands/remote/RshAction.java

Modified: geronimo/gshell/trunk/gshell-commands/gshell-remote/src/main/java/org/apache/geronimo/gshell/commands/remote/RshAction.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-commands/gshell-remote/src/main/java/org/apache/geronimo/gshell/commands/remote/RshAction.java?rev=699599&r1=699598&r2=699599&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-commands/gshell-remote/src/main/java/org/apache/geronimo/gshell/commands/remote/RshAction.java (original)
+++ geronimo/gshell/trunk/gshell-commands/gshell-remote/src/main/java/org/apache/geronimo/gshell/commands/remote/RshAction.java Sat Sep 27 01:03:06 2008
@@ -70,37 +70,74 @@
         this.container = container;
     }
 
-    public Object execute(final CommandContext context) throws Exception {
-        assert context != null;
-        IO io = context.getIo();
-        MessageSource messages = context.getCommand().getMessages();
+    /**
+     * Helper to validate that prompted username or password is not null or empty.
+     */
+    private class UsernamePasswordValidator
+        implements PromptReader.Validator
+    {
+        private String type;
 
-        io.info(messages.format("info.connecting", remote));
+        private int count = 0;
 
-        RshClient client = container.getBean(RshClient.class);
+        private int max = 3;
 
-        log.debug("Created client: {}", client);
-        
-        client.connect(remote, local);
+        public UsernamePasswordValidator(final String type) {
+            assert type != null;
 
-        io.info(messages.getMessage("info.connected"));
+            this.type = type;
+        }
+
+        public boolean isValid(final String value) {
+            count++;
+
+            if (value != null && value.trim().length() > 0) {
+                return true;
+            }
+
+            if (count >= max) {
+                throw new RuntimeException("Too many attempts; failed to prompt user for " + type + " after " + max + " tries");
+            }
+
+            return false;
+        }
+    }
+
+    public Object execute(final CommandContext context) throws Exception {
+        assert context != null;
+        IO io = context.getIo();
+        MessageSource messages = context.getCommand().getMessages();
 
         // If the username/password was not configured via cli, then prompt the user for the values
         if (username == null || password == null) {
             PromptReader prompter = new PromptReader(io);
+            String text;
 
             if (username == null) {
-                username = prompter.readLine(messages.getMessage("prompt.username") + ": ");
+                text = messages.getMessage("prompt.username");
+                username = prompter.readLine(text + ": ", new UsernamePasswordValidator(text));
             }
+            assert username != null;
+            assert username.length() != 0;
 
             if (password == null) {
-                password = prompter.readPassword(messages.getMessage("prompt.password") + ": ");
+                text = messages.getMessage("prompt.password");
+                password = prompter.readLine(text + ": ", new UsernamePasswordValidator(text));
             }
-
-            //
-            // TODO: Handle null inputs... Maybe add this support to PromptReader, then after n tries throw an exception?
-            //
+            assert password != null;
+            assert password.length() != 0;
         }
+        
+        io.info(messages.format("info.connecting", remote));
+
+        // Create the client from prototype
+        RshClient client = container.getBean(RshClient.class);
+
+        log.debug("Created client: {}", client);
+        
+        client.connect(remote, local);
+
+        io.info(messages.getMessage("info.connected"));
 
         client.login(username, password);