/*
* KeyPress server for relaying keys from the web client to the desktop client, ad keeping track of multiple pairs with a very simple protocol.
* Written by suBDavis (bdavis@redspin.net)
* WebSocket Library by github.com/tootallnate
*/
package server;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.Collection;
import java.util.HashMap;
import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;
import utilities.Message;
public class Server extends WebSocketServer{
//Stores new desktop connections in a hash map with their UUID as the key.
//When web clients send messages, they are prefaced by the same UUID for lookup by the server.
private HashMap<String, WebSocket> clientMaster = new HashMap<String, WebSocket>();
private HashMap<WebSocket, WebSocket> webClientMaster = new HashMap<WebSocket, WebSocket>();
private HashMap<WebSocket, User> webUserMaster = new HashMap<WebSocket, User>();
private HashMap<String, User> userMaster = new HashMap<String, User>();
private User tempuser;
public Server( int port ) throws UnknownHostException {
super( new InetSocketAddress( port ) );
}
public Server( InetSocketAddress address ) {
super( address );
}
@Override
public void onOpen(org.java_websocket.WebSocket conn, ClientHandshake handshake) {
System.out.println( conn.getRemoteSocketAddress().getAddress().getHostAddress() + " started a connection");
}
@Override
public void onClose(org.java_websocket.WebSocket conn, int code, String reason, boolean remote) {
System.out.println("Con " + conn + "Closed");
}
@Override
public void onMessage(WebSocket conn, String message) {
Message full = new Message(message);
if (full.getPurpose().equals("auth")){ //Do this if a new connection comes from the desktop
System.out.println("New Client Connection. ID = " + full.getID());
//new way with password storage and User creation
tempuser = new User(full.getID(), full.getPassword(), conn);
userMaster.put(full.getID(), tempuser);
//old way with shit
// clientMaster.put(full.getID(), conn);
} else if (full.getPurpose().equals("webauth")) { //Do this if a new connection comes from Web
System.out.println("New Web Connection. ID = " + full.getID());
//new way with password checking
if (userMaster.containsKey(full.getID())){
String passTest = userMaster.get(full.getID()).getPass();
if (full.getPassword().equals(passTest)){
webUserMaster.put(conn, userMaster.get(full.getID()));
} else conn.send("Wrong Password");
}
// Old way without password checking
// if (clientMaster.containsKey(full.getID())){
// webClientMaster.put(conn, clientMaster.get(full.getID()));
// }
} else if (webUserMaster.containsKey(conn)) { //If neither of those, it must be a previously authed message to be sent
WebSocket c = webUserMaster.get(conn).getDest();
c.send(message);
} else {
System.out.println("User not in the map tried to connect");
}
}
@Override
public void onError(org.java_websocket.WebSocket conn, Exception ex) {
ex.printStackTrace();
}
public void sendAll(String text){
Collection<org.java_websocket.WebSocket> con = connections();
synchronized (con){
for( org.java_websocket.WebSocket c : con ) {
c.send( text );
}
}
}
public static void main( String[] args ) throws InterruptedException , IOException {
int port = 9898;
try {
port = Integer.parseInt( args[ 0 ] );
} catch ( Exception ex ) {
}
Server s = new Server( port );
s.start();
System.out.println( "Keypad.io Server started on port: " + s.getPort() );
BufferedReader sysin = new BufferedReader( new InputStreamReader( System.in ) );
while ( true ) {
String in = sysin.readLine();
//s.send( in );
if( in.equals( "exit" ) ) {
s.stop();
break;
} else if( in.equals( "restart" ) ) {
s.stop();
s.start();
break;
}
}
}
}