From cf9709a283260198e8431e7a3bb9a48c15716f31 Mon Sep 17 00:00:00 2001 From: "marcins78@gmail.com" Date: Thu, 23 Aug 2012 22:32:35 +0000 Subject: [PATCH] Added code to detect if players are cheating (creating multiple accounts or joining the same league from multiple accounts). --- .../lotro/db/DbLeagueParticipationDAO.java | 5 +++-- .../lotro/db/LeagueParticipationDAO.java | 2 +- .../java/com/gempukku/lotro/db/PlayerDAO.java | 21 +++++++++++++++++-- .../league/CachedLeagueParticipationDAO.java | 4 ++-- .../gempukku/lotro/league/LeagueService.java | 4 ++-- .../gempukku/lotro/server/LeagueResource.java | 2 +- .../gempukku/lotro/server/ServerResource.java | 6 ++++-- 7 files changed, 32 insertions(+), 12 deletions(-) diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbLeagueParticipationDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbLeagueParticipationDAO.java index 82119928b..a84490c5c 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbLeagueParticipationDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbLeagueParticipationDAO.java @@ -17,14 +17,15 @@ public class DbLeagueParticipationDAO implements LeagueParticipationDAO { _dbAccess = dbAccess; } - public void userJoinsLeague(String leagueId, Player player) { + public void userJoinsLeague(String leagueId, Player player, String remoteAddr) { try { Connection conn = _dbAccess.getDataSource().getConnection(); try { - PreparedStatement statement = conn.prepareStatement("insert into league_participation (league_type, player_name) values (?,?)"); + PreparedStatement statement = conn.prepareStatement("insert into league_participation (league_type, player_name, join_ip) values (?,?,?)"); try { statement.setString(1, leagueId); statement.setString(2, player.getName()); + statement.setString(3, remoteAddr); statement.execute(); } finally { statement.close(); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/LeagueParticipationDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/LeagueParticipationDAO.java index 5d2e7c175..95ad9206c 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/LeagueParticipationDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/LeagueParticipationDAO.java @@ -5,7 +5,7 @@ import com.gempukku.lotro.game.Player; import java.util.Collection; public interface LeagueParticipationDAO { - public void userJoinsLeague(String leagueId, Player player); + public void userJoinsLeague(String leagueId, Player player, String remoteAddr); public Collection getUsersParticipating(String leagueId); } 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 1fb59a2fe..6dd988ae8 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 @@ -122,18 +122,19 @@ public class PlayerDAO { } } - public synchronized boolean registerUser(String login, String password) throws SQLException { + public synchronized boolean registerUser(String login, String password, String remoteAddr) 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 (?, ?, ?)"); + PreparedStatement statement = conn.prepareStatement("insert into player (name, password, type, create_ip) values (?, ?, ?, ?)"); try { statement.setString(1, login); statement.setString(2, encodePassword(password)); statement.setString(3, "u"); + statement.setString(4, remoteAddr); statement.execute(); return true; } finally { @@ -260,4 +261,20 @@ public class PlayerDAO { conn.close(); } } + + public void updateLastLoginIp(String login, String remoteAddr) throws SQLException { + Connection conn = _dbAccess.getDataSource().getConnection(); + try { + PreparedStatement statement = conn.prepareStatement("update player set last_ip=? where name=?"); + try { + statement.setString(1, remoteAddr); + statement.setString(2, login); + statement.execute(); + } finally { + statement.close(); + } + } finally { + conn.close(); + } + } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/CachedLeagueParticipationDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/CachedLeagueParticipationDAO.java index 0beed0acc..564f4f9e3 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/CachedLeagueParticipationDAO.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/CachedLeagueParticipationDAO.java @@ -23,11 +23,11 @@ public class CachedLeagueParticipationDAO implements LeagueParticipationDAO { } @Override - public void userJoinsLeague(String leagueId, Player player) { + public void userJoinsLeague(String leagueId, Player player, String remoteAddr) { _readWriteLock.writeLock().lock(); try { getLeagueParticipantsInWriteLock(leagueId).add(player.getName()); - _leagueParticipationDAO.userJoinsLeague(leagueId, player); + _leagueParticipationDAO.userJoinsLeague(leagueId, player, remoteAddr); } finally { _readWriteLock.writeLock().unlock(); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/LeagueService.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/LeagueService.java index db5cb1e2b..6baade1f2 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/LeagueService.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/league/LeagueService.java @@ -90,12 +90,12 @@ public class LeagueService { return _leagueParticipationDAO.getUsersParticipating(league.getType()).contains(player.getName()); } - public synchronized boolean playerJoinsLeague(League league, Player player) { + public synchronized boolean playerJoinsLeague(League league, Player player, String remoteAddr) { if (isPlayerInLeague(league, player)) return false; int cost = league.getCost(); if (_collectionsManager.removeCurrencyFromPlayerCollection(player, new CollectionType("permanent", "My cards"), cost)) { - _leagueParticipationDAO.userJoinsLeague(league.getType(), player); + _leagueParticipationDAO.userJoinsLeague(league.getType(), player, remoteAddr); league.getLeagueData().joinLeague(_collectionsManager, player, DateUtils.getCurrentDate()); _leagueStandings.remove(LeagueMapKeys.getLeagueMapKey(league)); diff --git a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/LeagueResource.java b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/LeagueResource.java index 037bda39e..4241cc81b 100644 --- a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/LeagueResource.java +++ b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/LeagueResource.java @@ -44,7 +44,7 @@ public class LeagueResource extends AbstractResource { if (league == null) sendError(Response.Status.NOT_FOUND); - if (!_leagueService.playerJoinsLeague(league, resourceOwner)) + if (!_leagueService.playerJoinsLeague(league, resourceOwner, request.getRemoteAddr())) sendError(Response.Status.CONFLICT); } diff --git a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/ServerResource.java b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/ServerResource.java index 206a75192..5b477283d 100644 --- a/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/ServerResource.java +++ b/gemp-lotr/gemp-lotr-web-server/src/main/java/com/gempukku/lotro/server/ServerResource.java @@ -22,6 +22,7 @@ import javax.xml.parsers.ParserConfigurationException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.sql.SQLException; import java.text.DecimalFormat; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -82,7 +83,7 @@ public class ServerResource extends AbstractResource { @FormParam("login") String login, @FormParam("password") String password, @Context HttpServletRequest request) throws Exception { - if (_playerDao.registerUser(login, password)) { + if (_playerDao.registerUser(login, password, request.getRemoteAddr())) { logUser(request, login); return ""; } else { @@ -309,7 +310,8 @@ public class ServerResource extends AbstractResource { } } - private void logUser(HttpServletRequest request, String login) { + private void logUser(HttpServletRequest request, String login) throws SQLException { + _playerDao.updateLastLoginIp(login, request.getRemoteAddr()); request.getSession().setAttribute("logged", login); }