diff --git a/client/index.html b/client/index.html index 9ca786a..360dabb 100644 --- a/client/index.html +++ b/client/index.html @@ -111,9 +111,19 @@
- +
+
+

+ Logged as + + () +

+ +
+
+
diff --git a/client/scripts/WebConsole.js b/client/scripts/WebConsole.js index 7afb03e..389f8c3 100644 --- a/client/scripts/WebConsole.js +++ b/client/scripts/WebConsole.js @@ -55,8 +55,20 @@ function onWebSocketsMessage(message){ writeToWebConsole(message.message, message.time); break; case 200: - //Processed + //LoggedIn writeToWebConsole(message.message); + + //Show user and permissions + $("#loggedUsernameLabel").text(message.username); + $("#loggedUserTypeLabel").text(message.as); + + //Disable command bar if user is viewer + if(message.as.toLowerCase() == "viewer"){ + $("#commandInput").prop("disabled", true); + $("#sendCommandButton").prop("disabled", true); + } + + //Read log file if enabled if(connectionManager.activeConnection.isLogged === false){ connectionManager.activeConnection.isLogged = true; if(persistenceManager.getSetting("retrieveLogFile") === true) diff --git a/src/es/mesacarlos/webconsole/auth/LoginManager.java b/src/es/mesacarlos/webconsole/auth/LoginManager.java index f7865dd..8a39c3e 100644 --- a/src/es/mesacarlos/webconsole/auth/LoginManager.java +++ b/src/es/mesacarlos/webconsole/auth/LoginManager.java @@ -2,11 +2,6 @@ package es.mesacarlos.webconsole.auth; import java.net.InetSocketAddress; import java.util.ArrayList; -import java.util.Map; - -import org.bukkit.Bukkit; - -import es.mesacarlos.webconsole.WebConsole; public class LoginManager { private ArrayList loggedInUsers = new ArrayList(); @@ -38,6 +33,11 @@ public class LoginManager { loggedInUsers.remove(user); } + /** + * Get user object by socket + * @param address socket of the user + * @return User object, null if no user logged in from that address + */ public User getUser(InetSocketAddress address) { for(User user : loggedInUsers) if(user.getSocketAddress().equals(address)) @@ -65,52 +65,4 @@ public class LoginManager { return loggedInUsers; } - /** - * Check if the provided password corresponds to any admin - * @param password Provided password - * @return Name of the user if password corresponds to a valid admin, null if is a viewer or an invalid password - */ - public String isValidAdminPassword(String password) { - WebConsole plugin = (WebConsole)Bukkit.getPluginManager().getPlugin("WebConsole"); - Map passwords = plugin.getConfig().getConfigurationSection("passwords").getConfigurationSection("admin").getValues(false); - - for(Map.Entry entry : passwords.entrySet()) { - String pwd = (String)entry.getValue(); - if(pwd.equals(password)) - return entry.getKey(); - } - return null; - } - - /** - * Check if the provided password corresponds to any viewer - * @param password Provided password - * @return Name of the user if password corresponds to a valid viewer, null if is a admin or invalid password - */ - public String isValidViewerPassword(String password) { - WebConsole plugin = (WebConsole)Bukkit.getPluginManager().getPlugin("WebConsole"); - Map passwords = plugin.getConfig().getConfigurationSection("passwords").getConfigurationSection("viewer").getValues(false); - - for(Map.Entry entry : passwords.entrySet()) { - String pwd = (String)entry.getValue(); - if(pwd.equals(password)) - return entry.getKey(); - } - return null; - } - - public UserType isValidUser(String password) { - //Check if is an admin - String username = isValidAdminPassword(password); - if(username != null) - return UserType.ADMIN; - - //Check if is a viewer - username = isValidViewerPassword(password); - if(username != null) - return UserType.VIEWER; - - //He is nothing - return UserType.UNKNOWN; - } } \ No newline at end of file diff --git a/src/es/mesacarlos/webconsole/auth/PasswordManager.java b/src/es/mesacarlos/webconsole/auth/PasswordManager.java new file mode 100644 index 0000000..bbbc4c9 --- /dev/null +++ b/src/es/mesacarlos/webconsole/auth/PasswordManager.java @@ -0,0 +1,65 @@ +package es.mesacarlos.webconsole.auth; + +import java.util.Map; + +import org.bukkit.Bukkit; + +import es.mesacarlos.webconsole.WebConsole; + +public class PasswordManager { + + /** + * Get the user type of a given password + * @param password Password to check + * @return ADMIN if password correspond to a admin user, VIEWER if viewer or UNKNOWN if invalid password + */ + public static UserType isValidUser(String password) { + //Check if is an admin + String username = isValidAdminPassword(password); + if(username != null) + return UserType.ADMIN; + + //Check if is a viewer + username = isValidViewerPassword(password); + if(username != null) + return UserType.VIEWER; + + //He is nothing + return UserType.UNKNOWN; + } + + /** + * Check if the provided password corresponds to any admin + * @param password Provided password + * @return Name of the user if password corresponds to a valid admin, null if is a viewer or an invalid password + */ + public static String isValidAdminPassword(String password) { + WebConsole plugin = (WebConsole)Bukkit.getPluginManager().getPlugin("WebConsole"); + Map passwords = plugin.getConfig().getConfigurationSection("passwords").getConfigurationSection("admin").getValues(false); + + for(Map.Entry entry : passwords.entrySet()) { + String pwd = (String)entry.getValue(); + if(pwd.equals(password)) + return entry.getKey(); + } + return null; + } + + /** + * Check if the provided password corresponds to any viewer + * @param password Provided password + * @return Name of the user if password corresponds to a valid viewer, null if is a admin or invalid password + */ + public static String isValidViewerPassword(String password) { + WebConsole plugin = (WebConsole)Bukkit.getPluginManager().getPlugin("WebConsole"); + Map passwords = plugin.getConfig().getConfigurationSection("passwords").getConfigurationSection("viewer").getValues(false); + + for(Map.Entry entry : passwords.entrySet()) { + String pwd = (String)entry.getValue(); + if(pwd.equals(password)) + return entry.getKey(); + } + return null; + } + +} \ No newline at end of file diff --git a/src/es/mesacarlos/webconsole/websocket/WSServer.java b/src/es/mesacarlos/webconsole/websocket/WSServer.java index 38daf5b..b73eabb 100644 --- a/src/es/mesacarlos/webconsole/websocket/WSServer.java +++ b/src/es/mesacarlos/webconsole/websocket/WSServer.java @@ -19,7 +19,7 @@ import es.mesacarlos.webconsole.websocket.command.WSCommand; import es.mesacarlos.webconsole.websocket.response.ConsoleOutput; import es.mesacarlos.webconsole.websocket.response.JSONOutput; import es.mesacarlos.webconsole.websocket.response.LoginRequired; -import es.mesacarlos.webconsole.websocket.response.Processed; +import es.mesacarlos.webconsole.websocket.response.LoggedIn; import es.mesacarlos.webconsole.websocket.response.UnknownCommand; public class WSServer extends WebSocketServer { @@ -34,7 +34,7 @@ public class WSServer extends WebSocketServer { @Override public void onOpen(WebSocket conn, ClientHandshake handshake) { if (LoginManager.getInstance().isLoggedIn(conn.getRemoteSocketAddress())) { - sendToClient(conn, new Processed(Internationalization.getPhrase("connection-resumed-message"))); + sendToClient(conn, new LoggedIn(Internationalization.getPhrase("connection-resumed-message"))); Bukkit.getLogger().info(Internationalization.getPhrase("connection-resumed-console", conn.getRemoteSocketAddress())); } else { sendToClient(conn, new LoginRequired(Internationalization.getPhrase("connection-login-message"))); diff --git a/src/es/mesacarlos/webconsole/websocket/command/LogInCommand.java b/src/es/mesacarlos/webconsole/websocket/command/LogInCommand.java index a98f755..da82690 100644 --- a/src/es/mesacarlos/webconsole/websocket/command/LogInCommand.java +++ b/src/es/mesacarlos/webconsole/websocket/command/LogInCommand.java @@ -4,12 +4,13 @@ import org.bukkit.Bukkit; import org.java_websocket.WebSocket; import es.mesacarlos.webconsole.auth.LoginManager; +import es.mesacarlos.webconsole.auth.PasswordManager; import es.mesacarlos.webconsole.auth.User; import es.mesacarlos.webconsole.auth.UserType; import es.mesacarlos.webconsole.util.Internationalization; import es.mesacarlos.webconsole.websocket.WSServer; import es.mesacarlos.webconsole.websocket.response.LoginRequired; -import es.mesacarlos.webconsole.websocket.response.Processed; +import es.mesacarlos.webconsole.websocket.response.LoggedIn; public class LogInCommand implements WSCommand { @@ -20,12 +21,12 @@ public class LogInCommand implements WSCommand { return; //Check user type and login is password is valid - switch(LoginManager.getInstance().isValidUser(password)) { + switch(PasswordManager.isValidUser(password)) { case ADMIN: - login(wsServer, conn, LoginManager.getInstance().isValidAdminPassword(password), UserType.ADMIN); + login(wsServer, conn, PasswordManager.isValidAdminPassword(password), UserType.ADMIN); break; case VIEWER: - login(wsServer, conn, LoginManager.getInstance().isValidViewerPassword(password), UserType.VIEWER); + login(wsServer, conn, PasswordManager.isValidViewerPassword(password), UserType.VIEWER); break; case UNKNOWN: wsServer.sendToClient(conn, new LoginRequired(Internationalization.getPhrase("login-failed-message"))); @@ -43,7 +44,7 @@ public class LogInCommand implements WSCommand { User user = new User(conn.getRemoteSocketAddress(), username, as); LoginManager.getInstance().logIn(user); - wsServer.sendToClient(conn, new Processed(Internationalization.getPhrase("login-sucessful-message"), "LOGIN ********")); + wsServer.sendToClient(conn, new LoggedIn(Internationalization.getPhrase("login-sucessful-message"), "LOGIN ********", user.getUsername(), user.getUserType())); Bukkit.getLogger().info(Internationalization.getPhrase("login-sucessful-console", user.toString())); } diff --git a/src/es/mesacarlos/webconsole/websocket/response/Processed.java b/src/es/mesacarlos/webconsole/websocket/response/LoggedIn.java similarity index 51% rename from src/es/mesacarlos/webconsole/websocket/response/Processed.java rename to src/es/mesacarlos/webconsole/websocket/response/LoggedIn.java index ab76084..b630484 100644 --- a/src/es/mesacarlos/webconsole/websocket/response/Processed.java +++ b/src/es/mesacarlos/webconsole/websocket/response/LoggedIn.java @@ -2,17 +2,23 @@ package es.mesacarlos.webconsole.websocket.response; import com.google.gson.JsonObject; -public class Processed implements JSONOutput{ +import es.mesacarlos.webconsole.auth.UserType; + +public class LoggedIn implements JSONOutput{ private String message; private String respondsTo; + private String username; + private UserType as; - public Processed(String message) { + public LoggedIn(String message) { this.message = message; } - public Processed(String message, String respondsTo) { + public LoggedIn(String message, String respondsTo, String username, UserType as) { this.message = message; this.respondsTo = respondsTo; + this.username = username; + this.as = as; } @Override @@ -33,12 +39,28 @@ public class Processed implements JSONOutput{ return respondsTo; } + + public String getUsername() { + return username; + } + + public String getAs() { + switch(as) { + case ADMIN: + return "ADMIN"; + default: + return "VIEWER"; //This is not a security hole bc its just informative... + } + } + @Override public String toJSON() { JsonObject object = new JsonObject(); object.addProperty("status", getStatusCode()); - object.addProperty("statusDescription", "Processed"); + object.addProperty("statusDescription", "LoggedIn"); object.addProperty("respondsTo", getRespondsTo()); + object.addProperty("username", getUsername()); + object.addProperty("as", getAs()); object.addProperty("message", getMessage()); return object.toString(); }