diff --git a/src/com/coder/client/CoderClient.java b/src/com/coder/client/CoderClient.java index 26b0b96..fffe39e 100644 --- a/src/com/coder/client/CoderClient.java +++ b/src/com/coder/client/CoderClient.java @@ -12,6 +12,7 @@ import com.coder.server.CoderServer; import com.coder.server.message.CoderMessage; import com.coder.server.message.ProjectListData; +import zutil.log.CompactLogFormatter; import zutil.log.LogUtil; public class CoderClient extends Thread{ @@ -21,6 +22,8 @@ public class CoderClient extends Thread{ private int port; private Session session; private ProjectEditorWindow projectEditorWindow; + private String username = null; + private char[] password = null; public CoderClient(String url, int port) { this.url = url; @@ -28,12 +31,10 @@ public class CoderClient extends Thread{ this.projectEditorWindow = new ProjectEditorWindow("CoderClient"); - super.start(); + LogUtil.setGlobalFormatter(new CompactLogFormatter()); } public void run(){ - //save the previously typed user name - String username = ""; //keep track of the number of connection retries to the server int connectionRetries = 0; while(true){ @@ -44,6 +45,7 @@ public class CoderClient extends Thread{ if(connectionRetries > 0){ logger.info("This is reconnection try number: " + connectionRetries); } + logger.info("Setting up a connected session"); this.session = Session.setupConnection(url, port); if(session == null){ logger.info("Could not setup a connection to " + url + ":" + port); @@ -64,18 +66,26 @@ public class CoderClient extends Thread{ } } - //ask for username and password in a dialog window - LoginDialog loginDialog = new LoginDialog(username, null); - loginDialog.setVisible(true); //blocking - loginDialog.dispose(); - if(loginDialog.getAction() == LoginDialogAction.CANCEL){ - logger.info("Login dialog closed or canceled by the user. terminating."); - break; + //get user credentials + if(username != null && !username.isEmpty() && password != null && password.length > 0){ + //do nothing, already have all credentials we need + logger.info("All login credentials have already been given. No need for a login dialog."); + }else{ + //ask for username and password in a dialog window + logger.info("All or some login credentials have not been given. Using a ogin dialog for input."); + LoginDialog loginDialog = new LoginDialog(username, null); + loginDialog.setVisible(true); //blocking + loginDialog.dispose(); + if(loginDialog.getAction() == LoginDialogAction.CANCEL){ + logger.info("Login dialog closed or canceled by the user. terminating."); + break; + } + username = loginDialog.getUsername(); + password = loginDialog.getPassword(); } + logger.info("The username: \"" + username + "\" will be used as the credential holder"); //authenticate the user - username = loginDialog.getUsername(); - String password = new String(loginDialog.getPassword()); boolean authenticated = session.authenticate(username, password); if(!authenticated){ JOptionPane.showMessageDialog(null, "Wrong username or password", "Authentication Failed", JOptionPane.INFORMATION_MESSAGE); @@ -132,10 +142,41 @@ public class CoderClient extends Thread{ session = null; } } + + private void setPassword(char[] password) { + this.password = password; + } + + private void setUsername(String username) { + this.username = username; + } public static void main(String[] args){ int port = CoderServer.SERVER_PORT; - new CoderClient("127.0.0.1", port); + CoderClient client = new CoderClient("127.0.0.1", port); + + for(int i = 0; i < args.length; ++i){ + String arg = args[i]; + if(arg.equals("-u") || arg.equals("--username")){ + i++; + if(i < args.length){ + client.setUsername(args[i]); + }else{ + System.err.println("missing username argument"); + System.exit(1); + } + }else if(arg.equals("-p") || arg.equals("--password")){ + i++; + if(i < args.length){ + client.setPassword(args[i].toCharArray()); + }else{ + System.err.println("missing password argument"); + System.exit(1); + } + } + } + + client.start(); } } diff --git a/src/com/coder/client/ProjectEditorWindow.java b/src/com/coder/client/ProjectEditorWindow.java index 011486f..f0c0185 100644 --- a/src/com/coder/client/ProjectEditorWindow.java +++ b/src/com/coder/client/ProjectEditorWindow.java @@ -29,7 +29,7 @@ public class ProjectEditorWindow extends JFrame implements TreeSelectionListener private JTextArea codingArea; private JButton compileButton; private JButton runButton; - private HashSet GUIMessageSentListeners; + private HashSet GUIMessageSentListeners = new HashSet(); public ProjectEditorWindow(String title){ super(title); diff --git a/src/com/coder/client/Session.java b/src/com/coder/client/Session.java index d25cef8..58d65d5 100644 --- a/src/com/coder/client/Session.java +++ b/src/com/coder/client/Session.java @@ -119,7 +119,7 @@ public class Session extends Thread { return new String[]{}; } - public boolean authenticate(String username, String clearTextPassword) { + public boolean authenticate(String username, char[] clearTextPassword) { logger.info("Authenticating session"); if(socket == null){ @@ -163,7 +163,7 @@ public class Session extends Thread { // Setting up encryption /* logger.info("Setting up encryption"); - String hashedPassword = Hasher.PBKDF2(clearTextPassword, username, AUTH_HASH_ITERATIONS); + String hashedPassword = Hasher.PBKDF2(new String(clearTextPassword), username, AUTH_HASH_ITERATIONS); String key = Hasher.PBKDF2(hashedPassword, msg.AuthenticationChallenge.salt, AUTH_HASH_ITERATIONS); Encrypter crypto; try {