From 6b19470f06f106e92b34050810e34e95a53ac478 Mon Sep 17 00:00:00 2001 From: marcins78 Date: Thu, 9 Jan 2014 10:44:48 +0000 Subject: [PATCH] Support for storing IP and IP prefix bans in database. --- .../lotro/async/LotroHttpRequestHandler.java | 7 +- .../gempukku/lotro/builder/DaoBuilder.java | 5 + .../com/gempukku/lotro/db/CachedIpBanDAO.java | 60 +++++++++ .../com/gempukku/lotro/db/DbIpBanDAO.java | 118 ++++++++++++++++++ .../java/com/gempukku/lotro/db/IpBanDAO.java | 10 ++ 5 files changed, 198 insertions(+), 2 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CachedIpBanDAO.java create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbIpBanDAO.java create mode 100644 gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/IpBanDAO.java diff --git a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LotroHttpRequestHandler.java b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LotroHttpRequestHandler.java index 1687cd50b..fc50cd0f8 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LotroHttpRequestHandler.java +++ b/gemp-lotr/gemp-lotr-async/src/main/java/com/gempukku/lotro/async/LotroHttpRequestHandler.java @@ -1,6 +1,7 @@ package com.gempukku.lotro.async; import com.gempukku.lotro.async.handler.UriRequestHandler; +import com.gempukku.lotro.db.IpBanDAO; import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; import org.jboss.netty.buffer.ChannelBuffers; @@ -34,10 +35,12 @@ public class LotroHttpRequestHandler extends SimpleChannelUpstreamHandler { private Map _objects; private UriRequestHandler _uriRequestHandler; + private IpBanDAO _ipBanDAO; public LotroHttpRequestHandler(Map objects, UriRequestHandler uriRequestHandler) { _objects = objects; _uriRequestHandler = uriRequestHandler; + _ipBanDAO = (IpBanDAO) _objects.get(IpBanDAO.class); } private Collection _bannedIps = Arrays.asList("108.251.13.101", "188.123.232.46", "193.235.73.197", "5.228.68.175", "89.88.173.207", "76.171.226.172", "97.73.50.119", "108.251.13.101"); @@ -113,9 +116,9 @@ public class LotroHttpRequestHandler extends SimpleChannelUpstreamHandler { } private boolean isBanned(String ipAddress) { - if (_bannedIps.contains(ipAddress)) + if (_ipBanDAO.getIpBans().contains(ipAddress)) return true; - for (String bannedRange : _bannedRanges) { + for (String bannedRange : _ipBanDAO.getIpPrefixBans()) { if (ipAddress.startsWith(bannedRange)) return true; } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/builder/DaoBuilder.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/builder/DaoBuilder.java index b161a2d03..bde0c317f 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/builder/DaoBuilder.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/builder/DaoBuilder.java @@ -50,12 +50,17 @@ public class DaoBuilder { CachedTransferDAO transferDao = new CachedTransferDAO(dbTransferDao); objectMap.put(TransferDAO.class, transferDao); + DbIpBanDAO dbIpBanDao = new DbIpBanDAO(dbAccess); + CachedIpBanDAO ipBanDao = new CachedIpBanDAO(dbIpBanDao); + objectMap.put(DbIpBanDAO.class, ipBanDao); + CacheManager cacheManager = new CacheManager(); cacheManager.addCache(merchantDao); cacheManager.addCache(deckDao); cacheManager.addCache(collectionDao); cacheManager.addCache(playerDao); cacheManager.addCache(transferDao); + cacheManager.addCache(ipBanDao); objectMap.put(CacheManager.class, cacheManager); } } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CachedIpBanDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CachedIpBanDAO.java new file mode 100644 index 000000000..1a7e31eb1 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/CachedIpBanDAO.java @@ -0,0 +1,60 @@ +package com.gempukku.lotro.db; + +import com.gempukku.lotro.cache.Cached; + +import java.util.Set; + +public class CachedIpBanDAO implements IpBanDAO, Cached { + private IpBanDAO _delegate; + private Set _bannedIps; + private Set _bannedIpPrefixes; + + public CachedIpBanDAO(IpBanDAO delegate) { + _delegate = delegate; + } + + @Override + public void clearCache() { + _bannedIps = null; + _bannedIpPrefixes = null; + } + + @Override + public int getItemCount() { + return 2; + } + + @Override + public void addIpBan(String ip) { + _delegate.addIpBan(ip); + _bannedIps = null; + } + + @Override + public void addIpPrefixBan(String ipPrefix) { + _delegate.addIpPrefixBan(ipPrefix); + _bannedIpPrefixes = null; + } + + @Override + public Set getIpBans() { + Set result = _bannedIps; + if (result != null) + return result; + + result = _delegate.getIpBans(); + _bannedIps = result; + return result; + } + + @Override + public Set getIpPrefixBans() { + Set result = _bannedIpPrefixes; + if (result != null) + return result; + + result = _delegate.getIpPrefixBans(); + _bannedIpPrefixes = result; + return result; + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbIpBanDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbIpBanDAO.java new file mode 100644 index 000000000..a6340afe9 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/DbIpBanDAO.java @@ -0,0 +1,118 @@ +package com.gempukku.lotro.db; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashSet; +import java.util.Set; + +public class DbIpBanDAO implements IpBanDAO { + private DbAccess _dbAccess; + + public DbIpBanDAO(DbAccess dbAccess) { + _dbAccess = dbAccess; + } + + @Override + public void addIpBan(String ip) { + try { + Connection connection = _dbAccess.getDataSource().getConnection(); + try { + PreparedStatement statement = connection.prepareStatement("insert into ip_ban (ip, prefix) values (?, 0)"); + try { + statement.setString(1, ip); + + statement.execute(); + } finally { + statement.close(); + } + } finally { + connection.close(); + } + } catch (SQLException exp) { + throw new RuntimeException("Unable to add an IP ban", exp); + } + } + + @Override + public void addIpPrefixBan(String ipPrefix) { + try { + Connection connection = _dbAccess.getDataSource().getConnection(); + try { + PreparedStatement statement = connection.prepareStatement("insert into ip_ban (ip, prefix) values (?, 1)"); + try { + statement.setString(1, ipPrefix); + + statement.execute(); + } finally { + statement.close(); + } + } finally { + connection.close(); + } + } catch (SQLException exp) { + throw new RuntimeException("Unable to add an IP prefix ban", exp); + } + } + + @Override + public Set getIpBans() { + try { + Connection connection = _dbAccess.getDataSource().getConnection(); + try { + PreparedStatement statement = connection.prepareStatement("select ip from ip_ban where prefix=0"); + try { + ResultSet rs = statement.executeQuery(); + try { + Set result = new HashSet(); + while (rs.next()) { + String ip = rs.getString(1); + + result.add(ip); + } + return result; + } finally { + rs.close(); + } + } finally { + statement.close(); + } + } finally { + connection.close(); + } + } catch (SQLException exp) { + throw new RuntimeException("Unable to get count of player games", exp); + } + } + + @Override + public Set getIpPrefixBans() { + try { + Connection connection = _dbAccess.getDataSource().getConnection(); + try { + PreparedStatement statement = connection.prepareStatement("select ip from ip_ban where prefix=1"); + try { + ResultSet rs = statement.executeQuery(); + try { + Set result = new HashSet(); + while (rs.next()) { + String ip = rs.getString(1); + + result.add(ip); + } + return result; + } finally { + rs.close(); + } + } finally { + statement.close(); + } + } finally { + connection.close(); + } + } catch (SQLException exp) { + throw new RuntimeException("Unable to get count of player games", exp); + } + } +} diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/IpBanDAO.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/IpBanDAO.java new file mode 100644 index 000000000..ae05ede40 --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/db/IpBanDAO.java @@ -0,0 +1,10 @@ +package com.gempukku.lotro.db; + +import java.util.Set; + +public interface IpBanDAO { + public Set getIpBans(); + public Set getIpPrefixBans(); + public void addIpBan(String ip); + public void addIpPrefixBan(String ipPrefix); +}