Skip to content

Instantly share code, notes, and snippets.

@Justin42
Created August 23, 2012 21:07
Show Gist options
  • Select an option

  • Save Justin42/3441755 to your computer and use it in GitHub Desktop.

Select an option

Save Justin42/3441755 to your computer and use it in GitHub Desktop.
public void login(final String username, final String password,final LoginListener loginListener) {
// Logins performed synchronously in its own thread.
Runnable login = new Runnable() {
public void run() {
if(networkHandler.connectTCP()) {
IoSession session = networkHandler.getSession();
ClientData clientData = networkHandler.getClientData();
// Block this thread while waiting for reply
session.getConfig().setUseReadOperation(true);
// Ask for public key from server
loginListener.loginStatus("Requesting public encryption key...");
Message request = new Message(Packets.PUBLIC_KEY_REQUEST);
session.write(request);
// Get the response message
loginListener.loginStatus("Waiting for encryption key...");
Message response = (Message) session.read()
.awaitUninterruptibly()
.getMessage();
loginListener.loginStatus("Received encryption key");
PublicKey serverKey = Encryption.parseKey(response.getArg(0));
// Encrypt symetric key + login data with servers public key
loginListener.loginStatus("Generating client key...");
clientData.setKey(Encryption.generateKey());
request = new Message(Packets.LOGIN);
request.setEncrypted(clientData.getID(), serverKey);
request.add(clientData.getKey().getEncoded());
request.add(username.getBytes());
request.add(password.getBytes());
session.write(request);
// Wait for response
loginListener.loginStatus("Waiting for login response...");
response = (Message) session.read()
.awaitUninterruptibly()
.getMessage();
// Check login response
if(response.getCommand() == Packets.LOGIN_ACCEPTED) {
clientData.setID(response.getArg(0)); // First argument should be our uID
loginListener.loginSuccess();
}
if(response.getCommand() == Packets.LOGIN_DENIED) {
loginListener.loginFailure(new String(response.getArg(0))); // First arg should be reason
}
// Unblock
session.getConfig().setUseReadOperation(false);
}
else loginListener.loginFailure("Could not connect to server");
}
};
threadPool.execute(login);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment