diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/PlayerDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/PlayerDAO.java index d2ede5593..7b2487779 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/PlayerDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/PlayerDAO.java @@ -2,6 +2,7 @@ package com.gempukku.lotro.db; import com.gempukku.lotro.db.vo.Player; +import java.security.MessageDigest; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -10,6 +11,8 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class PlayerDAO { + private final String validLoginChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_"; + private DbAccess _dbAccess; private Map _players = new ConcurrentHashMap(); @@ -34,6 +37,111 @@ public class PlayerDAO { } } + public Player loginUser(String login, String password) throws SQLException { + Connection conn = _dbAccess.getDataSource().getConnection(); + try { + PreparedStatement statement = conn.prepareStatement("select id, name from player where name=? and password=?"); + try { + statement.setString(1, login); + statement.setString(2, encodePassword(password)); + ResultSet rs = statement.executeQuery(); + try { + if (rs.next()) { + int id = rs.getInt(1); + String name = rs.getString(2); + + return new Player(id, name); + } else + return null; + } finally { + rs.close(); + } + } finally { + statement.close(); + } + } finally { + conn.close(); + } + } + + public synchronized boolean registerUser(String login, String password) throws SQLException { + boolean result = validateLogin(login); + if (!result) + return false; + + Connection conn = _dbAccess.getDataSource().getConnection(); + try { + PreparedStatement statement = conn.prepareStatement("insert into player (name, password, type) values (?, ?, ?)"); + try { + statement.setString(1, login); + statement.setString(2, encodePassword(password)); + statement.setString(3, "u"); + statement.execute(); + return true; + } finally { + statement.close(); + } + } finally { + conn.close(); + } + } + + private boolean validateLogin(String login) throws SQLException { + if (login.length() < 2 || login.length() > 10) + return false; + for (int i = 0; i < login.length(); i++) { + char c = login.charAt(i); + if (!validLoginChars.contains("" + c)) + return false; + } + + String lowerCase = login.toLowerCase(); + if (lowerCase.startsWith("admin") || lowerCase.startsWith("guest")) + return false; + + Connection conn = _dbAccess.getDataSource().getConnection(); + try { + PreparedStatement statement = conn.prepareStatement("select id, name from player where LOWER(name)=?"); + try { + statement.setString(1, lowerCase); + ResultSet rs = statement.executeQuery(); + try { + if (rs.next()) { + return false; + } else + return true; + } finally { + rs.close(); + } + } finally { + statement.close(); + } + } finally { + conn.close(); + } + } + + private String encodePassword(String password) { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + digest.reset(); + return convertToHexString(digest.digest(password.getBytes("UTF-8"))); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private String convertToHexString(byte[] bytes) { + StringBuilder hexString = new StringBuilder(); + for (int i = 0; i < bytes.length; i++) { + String hex = Integer.toHexString(0xFF & bytes[i]); + if (hex.length() == 1) + hexString.append('0'); + hexString.append(hex); + } + return hexString.toString(); + } + private Player getPlayerFromDB(String playerName) throws SQLException { Connection conn = _dbAccess.getDataSource().getConnection(); try { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java index f77bd858a..e3e5a2f19 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java @@ -38,6 +38,10 @@ public class HallServer extends AbstractServer { _supportedFormats.put("Modified FotR block", new ModifiedFotRBlockFormat(_lotroServer.getLotroCardBlueprintLibrary())); } + public int getTablesCount() { + return _awaitingTables.size() + _runningTables.size(); + } + public Set getSupportedFormats() { return new TreeSet(_supportedFormats.keySet()); } diff --git a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/ServerResource.java b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/ServerResource.java index b49b183e4..0f51ce875 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/ServerResource.java +++ b/gemp-lotr/gemp-lotr-web/src/main/java/com/gempukku/lotro/server/ServerResource.java @@ -35,7 +35,7 @@ import java.util.Set; @Path("/") public class ServerResource { private static final Logger _logger = Logger.getLogger(ServerResource.class); - private boolean _test = true; + private boolean _test = false; private HallServer _hallServer; private LotroServer _lotroServer; @@ -62,15 +62,44 @@ public class ServerResource { @Path("/login") @POST - public void login( + @Produces("text/html") + public String login( @FormParam("login") String login, @FormParam("password") String password, - @Context HttpServletRequest request) { - _logger.debug("/server/login " + login + ", " + password); - if (login == null) - sendError(Response.Status.NOT_FOUND); - if (password != null && password.equals("test")) + @Context HttpServletRequest request) throws Exception { + if (_lotroServer.getPlayerDao().loginUser(login, password) != null) { logUser(request, login); + return ""; + } else { + return "Invalid login or password. Please try again.
" + getLoginHTML(); + } + } + + @Path("/register") + @POST + @Produces("text/html") + public String register( + @FormParam("login") String login, + @FormParam("password") String password, + @Context HttpServletRequest request) throws Exception { + if (_lotroServer.getPlayerDao().registerUser(login, password)) { + logUser(request, login); + return ""; + } else { + StringBuilder sb = new StringBuilder(); + sb.append("User with this name already exists or your login is invalid.
"); + sb.append("Login must be between 2-10 characters long, contain only
english letters, numbers or _ (underscore) and - (dash) characters.
"); + sb.append("Try to again."); + return sb.toString(); + } + } + + private String getLoginHTML() { + StringBuilder sb = new StringBuilder(); + sb.append("Login:
"); + sb.append("Password:
"); + sb.append(""); + return sb.toString(); } @Path("/game/{gameId}") @@ -419,6 +448,24 @@ public class ServerResource { _hallServer.leaveAwaitingTables(participantId); } + @GET + @Produces("text/html") + public String getStatus( + @QueryParam("participantId") String participantId, + @Context HttpServletRequest request) throws ParserConfigurationException { + StringBuilder sb = new StringBuilder(); + participantId = getUserNameIfLogged(request); + if (participantId != null) { + sb.append(""); + } else { + sb.append("You are not logged in, log in below or ."); + sb.append("
There are currently ").append(_hallServer.getTablesCount()).append(" tables in the Game Hall
"); + sb.append(getLoginHTML()); + } + + return sb.toString(); + } + private Document marshalException(HallException e) throws ParserConfigurationException { DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); @@ -611,6 +658,10 @@ public class ServerResource { request.getSession().setAttribute("logged", login); } + private String getUserNameIfLogged(HttpServletRequest request) { + return (String) request.getSession().getAttribute("logged"); + } + private String getLoggedUser(HttpServletRequest request) { String loggedUser = (String) request.getSession().getAttribute("logged"); if (loggedUser == null) diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/hall.html b/gemp-lotr/gemp-lotr-web/src/main/webapp/hall.html new file mode 100644 index 000000000..412f8e609 --- /dev/null +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/hall.html @@ -0,0 +1,82 @@ + + + + Gemp-LotR + + + + + + + + + + + + + + + + + + + + +
+
+
+ + +17 \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/index.html b/gemp-lotr/gemp-lotr-web/src/main/webapp/index.html index db4e100e9..2c490faed 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/index.html +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/index.html @@ -11,38 +11,18 @@ font-size: 12px; } - .tableStatus { - text-align: center; - font-style: italic; - font-size: 120%; - } - - .tablePlayer { - text-align: center; - } - - .chatMessage { - color: #ffffff; - } - - .warningMessage { - color: #ff0000; - } - - .chatUser { - color: #ffffff; + .ui-button-text-only .ui-button-text { + font-size: 70%; + padding: .2em .5em; } - - - -
-
-
+
-17 \ No newline at end of file diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/index.jsp b/gemp-lotr/gemp-lotr-web/src/main/webapp/index.jsp deleted file mode 100644 index 39b0e077d..000000000 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/index.jsp +++ /dev/null @@ -1,16 +0,0 @@ - - - - LotR-Online - - - - -
- - - -
- - diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/communication.js b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/communication.js index c35a15aff..2e1eb2ba5 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/communication.js +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/communication.js @@ -179,5 +179,57 @@ var GempLotrCommunication = Class.extend({ error: this.failure, dataType: "xml" }); + }, + getStatus: function(callback) { + $.ajax({ + type: "GET", + url: this.url + "/", + cache: false, + data: { + participantId: getUrlParam("participantId")}, + success: callback, + error: this.failure, + dataType: "html" + }); + }, + login: function(login, password, callback) { + $.ajax({ + type: "POST", + url: this.url + "/login", + cache: false, + data: { + login: login, + password: password, + participantId: getUrlParam("participantId")}, + success: callback, + error: this.failure, + dataType: "html" + }); + }, + register: function(login, password, callback) { + $.ajax({ + type: "POST", + url: this.url + "/register", + cache: false, + data: { + login: login, + password: password, + participantId: getUrlParam("participantId")}, + success: callback, + error: this.failure, + dataType: "html" + }); + }, + getRegistrationForm: function(callback) { + $.ajax({ + type: "POST", + url: "/gemp-lotr/registrationForm.html", + cache: false, + data: { + participantId: getUrlParam("participantId")}, + success: callback, + error: this.failure, + dataType: "html" + }); } }); diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameUi.js b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameUi.js index fd35d0a7e..2b40e1326 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameUi.js +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/gameUi.js @@ -453,7 +453,7 @@ var GempLotrGameUI = Class.extend({ var minutes = Math.floor(value / 60); var seconds = value % 60; - $("#clock" + index).text(sign + minutes + ":" + (seconds < 10) ? ("0" + seconds) : seconds); + $("#clock" + index).text(sign + minutes + ":" + ((seconds < 10) ? ("0" + seconds) : seconds)); } } diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/hallUi.js b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/hallUi.js index 73ff06a4a..62204d681 100644 --- a/gemp-lotr/gemp-lotr-web/src/main/webapp/js/hallUi.js +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/js/hallUi.js @@ -29,6 +29,14 @@ var GempLotrHallUI = Class.extend({ var that = this; + var editDeck = $(""); + editDeck.button().click( + function() { + location.href = 'deckBuild.html'; + }); + + buttonsDiv.append(editDeck); + this.supportedFormatsSelect = $(""); this.supportedFormatsSelect.hide(); @@ -123,10 +131,10 @@ var GempLotrHallUI = Class.extend({ if (waiting) { this.supportedFormatsSelect.hide(); this.createTableButton.hide(); - this.leaveTableButton.show(); + this.leaveTableButton.css("display", ""); } else { - this.supportedFormatsSelect.show(); - this.createTableButton.show(); + this.supportedFormatsSelect.css("display", ""); + this.createTableButton.css("display", ""); this.leaveTableButton.hide(); } diff --git a/gemp-lotr/gemp-lotr-web/src/main/webapp/registrationForm.html b/gemp-lotr/gemp-lotr-web/src/main/webapp/registrationForm.html new file mode 100644 index 000000000..c82f16a14 --- /dev/null +++ b/gemp-lotr/gemp-lotr-web/src/main/webapp/registrationForm.html @@ -0,0 +1,4 @@ +Login:
+Password:
+Password repeated:
+