2015-10-19 17:43:46 +00:00
|
|
|
package me.totalfreedom.totalfreedommod.banning;
|
|
|
|
|
|
|
|
import com.google.common.collect.Lists;
|
|
|
|
import com.google.common.collect.Maps;
|
|
|
|
import com.google.common.collect.Sets;
|
2020-05-29 10:14:21 +00:00
|
|
|
import java.sql.ResultSet;
|
|
|
|
import java.sql.SQLException;
|
|
|
|
import java.util.ArrayList;
|
2018-07-31 07:05:28 +00:00
|
|
|
import java.util.Collection;
|
|
|
|
import java.util.Collections;
|
2020-05-29 10:14:21 +00:00
|
|
|
import java.util.Date;
|
2018-07-31 07:05:28 +00:00
|
|
|
import java.util.List;
|
|
|
|
import java.util.Map;
|
|
|
|
import java.util.Set;
|
2020-08-10 05:25:04 +00:00
|
|
|
import java.util.UUID;
|
2016-03-01 16:47:01 +00:00
|
|
|
import me.totalfreedom.totalfreedommod.FreedomService;
|
2016-03-06 15:56:15 +00:00
|
|
|
import me.totalfreedom.totalfreedommod.config.ConfigEntry;
|
|
|
|
import me.totalfreedom.totalfreedommod.util.FLog;
|
2015-11-15 23:32:04 +00:00
|
|
|
import me.totalfreedom.totalfreedommod.util.FUtil;
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import org.bukkit.event.EventHandler;
|
|
|
|
import org.bukkit.event.EventPriority;
|
|
|
|
import org.bukkit.event.player.PlayerJoinEvent;
|
|
|
|
import org.bukkit.event.player.PlayerLoginEvent;
|
2015-10-19 17:43:46 +00:00
|
|
|
|
2016-03-01 16:47:01 +00:00
|
|
|
public class BanManager extends FreedomService
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
2015-11-22 18:26:47 +00:00
|
|
|
|
2015-11-15 23:32:04 +00:00
|
|
|
private final Set<Ban> bans = Sets.newHashSet();
|
|
|
|
private final Map<String, Ban> nameBans = Maps.newHashMap();
|
2020-08-10 05:25:04 +00:00
|
|
|
private final Map<UUID, Ban> uuidBans = Maps.newHashMap();
|
|
|
|
private final Map<String, Ban> ipBans = Maps.newHashMap();
|
2015-10-19 17:43:46 +00:00
|
|
|
private final List<String> unbannableUsernames = Lists.newArrayList();
|
2017-10-13 18:35:11 +00:00
|
|
|
|
2015-10-19 17:43:46 +00:00
|
|
|
//
|
|
|
|
|
|
|
|
@Override
|
2020-07-01 01:51:06 +00:00
|
|
|
public void onStart()
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
|
|
|
bans.clear();
|
2020-05-29 10:14:21 +00:00
|
|
|
try
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
2020-05-29 10:14:21 +00:00
|
|
|
ResultSet banSet = plugin.sql.getBanList();
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
2020-05-29 10:14:21 +00:00
|
|
|
while (banSet.next())
|
|
|
|
{
|
|
|
|
String name = banSet.getString("name");
|
2020-08-10 05:25:04 +00:00
|
|
|
UUID uuid = null;
|
|
|
|
String strUUID = banSet.getString("uuid");
|
|
|
|
if (strUUID != null)
|
|
|
|
{
|
|
|
|
uuid = UUID.fromString(strUUID);
|
|
|
|
}
|
2020-05-29 10:14:21 +00:00
|
|
|
List<String> ips = FUtil.stringToList(banSet.getString("ips"));
|
|
|
|
String by = banSet.getString("by");
|
|
|
|
Date at = new Date(banSet.getLong("at"));
|
|
|
|
Date expires = new Date(banSet.getLong("expires"));
|
|
|
|
String reason = banSet.getString("reason");
|
2020-08-10 05:25:04 +00:00
|
|
|
Ban ban = new Ban(name, uuid, ips, by, at, expires, reason);
|
2020-05-29 10:14:21 +00:00
|
|
|
bans.add(ban);
|
|
|
|
}
|
2015-10-19 17:43:46 +00:00
|
|
|
}
|
2020-05-29 10:14:21 +00:00
|
|
|
}
|
|
|
|
catch (SQLException e)
|
|
|
|
{
|
|
|
|
FLog.severe("Failed to load ban list: " + e.getMessage());
|
2015-10-19 17:43:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Remove expired bans, repopulate ipBans and nameBans,
|
|
|
|
updateViews();
|
|
|
|
|
2016-03-06 15:56:15 +00:00
|
|
|
FLog.info("Loaded " + ipBans.size() + " IP bans and " + nameBans.size() + " username bans.");
|
2015-10-19 17:43:46 +00:00
|
|
|
|
|
|
|
// Load unbannable usernames
|
|
|
|
unbannableUsernames.clear();
|
2020-12-25 19:46:43 +00:00
|
|
|
unbannableUsernames.addAll(ConfigEntry.FAMOUS_PLAYERS.getStringList());
|
2015-10-19 17:43:46 +00:00
|
|
|
FLog.info("Loaded " + unbannableUsernames.size() + " unbannable usernames.");
|
|
|
|
}
|
|
|
|
|
2016-03-06 15:56:15 +00:00
|
|
|
@Override
|
2020-07-01 01:51:06 +00:00
|
|
|
public void onStop()
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
2016-03-06 15:56:15 +00:00
|
|
|
}
|
2015-10-19 17:43:46 +00:00
|
|
|
|
2016-03-06 15:56:15 +00:00
|
|
|
public Set<Ban> getAllBans()
|
|
|
|
{
|
|
|
|
return Collections.unmodifiableSet(bans);
|
|
|
|
}
|
2015-10-19 17:43:46 +00:00
|
|
|
|
2016-03-06 15:56:15 +00:00
|
|
|
public Collection<Ban> getIpBans()
|
|
|
|
{
|
|
|
|
return Collections.unmodifiableCollection(ipBans.values());
|
|
|
|
}
|
2015-10-19 17:43:46 +00:00
|
|
|
|
2016-03-06 15:56:15 +00:00
|
|
|
public Collection<Ban> getUsernameBans()
|
|
|
|
{
|
|
|
|
return Collections.unmodifiableCollection(nameBans.values());
|
2015-10-19 17:43:46 +00:00
|
|
|
}
|
|
|
|
|
2015-11-15 23:32:04 +00:00
|
|
|
public Ban getByIp(String ip)
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
2015-11-15 23:32:04 +00:00
|
|
|
final Ban directBan = ipBans.get(ip);
|
2015-10-19 17:43:46 +00:00
|
|
|
if (directBan != null && !directBan.isExpired())
|
|
|
|
{
|
|
|
|
return directBan;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Match fuzzy IP
|
2015-11-15 23:32:04 +00:00
|
|
|
for (Ban loopBan : ipBans.values())
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
|
|
|
if (loopBan.isExpired())
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (String loopIp : loopBan.getIps())
|
|
|
|
{
|
|
|
|
if (!loopIp.contains("*"))
|
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2020-07-01 01:51:06 +00:00
|
|
|
if (FUtil.fuzzyIpMatch(ip, loopIp, 4))
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
|
|
|
return loopBan;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2015-11-15 23:32:04 +00:00
|
|
|
public Ban getByUsername(String username)
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
|
|
|
username = username.toLowerCase();
|
2015-11-15 23:32:04 +00:00
|
|
|
final Ban directBan = nameBans.get(username);
|
2015-10-19 17:43:46 +00:00
|
|
|
|
|
|
|
if (directBan != null && !directBan.isExpired())
|
|
|
|
{
|
|
|
|
return directBan;
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2020-08-10 05:25:04 +00:00
|
|
|
public Ban getByUUID(UUID uuid)
|
|
|
|
{
|
|
|
|
final Ban directBan = uuidBans.get(uuid);
|
|
|
|
|
|
|
|
if (directBan != null && !directBan.isExpired())
|
|
|
|
{
|
|
|
|
return directBan;
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2015-11-15 23:32:04 +00:00
|
|
|
public Ban unbanIp(String ip)
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
2015-11-15 23:32:04 +00:00
|
|
|
final Ban ban = getByIp(ip);
|
2015-10-19 17:43:46 +00:00
|
|
|
|
2016-03-06 15:56:15 +00:00
|
|
|
if (ban != null)
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
2016-03-06 15:56:15 +00:00
|
|
|
bans.remove(ban);
|
2015-10-19 17:43:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return ban;
|
|
|
|
}
|
|
|
|
|
2015-11-15 23:32:04 +00:00
|
|
|
public Ban unbanUsername(String username)
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
2015-11-15 23:32:04 +00:00
|
|
|
final Ban ban = getByUsername(username);
|
2015-10-19 17:43:46 +00:00
|
|
|
|
2016-03-06 15:56:15 +00:00
|
|
|
if (ban != null)
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
2016-03-06 15:56:15 +00:00
|
|
|
bans.remove(ban);
|
2015-10-19 17:43:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return ban;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isIpBanned(String ip)
|
|
|
|
{
|
|
|
|
return getByIp(ip) != null;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isUsernameBanned(String username)
|
|
|
|
{
|
|
|
|
return getByUsername(username) != null;
|
|
|
|
}
|
|
|
|
|
2020-12-25 19:46:43 +00:00
|
|
|
public void addBan(Ban ban)
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
2020-06-30 07:25:38 +00:00
|
|
|
if (ban.getUsername() != null && getByUsername(ban.getUsername()) != null)
|
2020-05-29 10:14:21 +00:00
|
|
|
{
|
|
|
|
removeBan(ban);
|
|
|
|
}
|
2020-06-30 07:25:38 +00:00
|
|
|
else
|
|
|
|
{
|
|
|
|
|
|
|
|
for (String ip : ban.getIps())
|
|
|
|
{
|
|
|
|
if (getByIp(ip) != null)
|
|
|
|
{
|
|
|
|
removeBan(ban);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-10-19 17:43:46 +00:00
|
|
|
if (bans.add(ban))
|
|
|
|
{
|
2020-05-29 10:14:21 +00:00
|
|
|
plugin.sql.addBan(ban);
|
|
|
|
updateViews();
|
2015-10-19 17:43:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2020-12-25 19:46:43 +00:00
|
|
|
public void removeBan(Ban ban)
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
|
|
|
if (bans.remove(ban))
|
|
|
|
{
|
2020-05-29 10:14:21 +00:00
|
|
|
plugin.sql.removeBan(ban);
|
|
|
|
updateViews();
|
2015-10-19 17:43:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
2016-03-06 15:56:15 +00:00
|
|
|
public int purge()
|
2015-10-19 17:43:46 +00:00
|
|
|
{
|
2016-03-06 15:56:15 +00:00
|
|
|
int size = bans.size();
|
|
|
|
bans.clear();
|
|
|
|
updateViews();
|
2020-05-29 10:14:21 +00:00
|
|
|
plugin.sql.truncate("bans");
|
2016-03-06 15:56:15 +00:00
|
|
|
return size;
|
2015-10-19 17:43:46 +00:00
|
|
|
}
|
2015-11-15 23:32:04 +00:00
|
|
|
|
2020-04-29 23:29:43 +00:00
|
|
|
@EventHandler(priority = EventPriority.NORMAL)
|
2015-11-15 23:32:04 +00:00
|
|
|
public void onPlayerLogin(PlayerLoginEvent event)
|
|
|
|
{
|
|
|
|
final String username = event.getPlayer().getName();
|
2020-08-10 05:25:04 +00:00
|
|
|
final UUID uuid = event.getPlayer().getUniqueId();
|
2020-07-01 01:51:06 +00:00
|
|
|
final String ip = FUtil.getIp(event);
|
2015-11-15 23:32:04 +00:00
|
|
|
|
|
|
|
// Regular ban
|
2016-03-06 15:56:15 +00:00
|
|
|
Ban ban = getByUsername(username);
|
2015-11-15 23:32:04 +00:00
|
|
|
if (ban == null)
|
|
|
|
{
|
2020-08-10 05:25:04 +00:00
|
|
|
ban = getByUUID(uuid);
|
|
|
|
|
|
|
|
if (ban == null)
|
|
|
|
{
|
|
|
|
ban = getByIp(ip);
|
|
|
|
}
|
2015-11-15 23:32:04 +00:00
|
|
|
}
|
|
|
|
|
2016-03-06 15:56:15 +00:00
|
|
|
if (ban != null && !ban.isExpired())
|
2015-11-15 23:32:04 +00:00
|
|
|
{
|
2020-05-29 10:14:21 +00:00
|
|
|
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, ban.bakeKickMessage());
|
2015-11-15 23:32:04 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-29 23:29:43 +00:00
|
|
|
@EventHandler(priority = EventPriority.NORMAL)
|
2015-11-15 23:32:04 +00:00
|
|
|
public void onPlayerJoin(PlayerJoinEvent event)
|
|
|
|
{
|
|
|
|
final Player player = event.getPlayer();
|
|
|
|
|
2020-12-04 00:28:53 +00:00
|
|
|
if (!plugin.al.isAdmin(player))
|
2015-11-15 23:32:04 +00:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Unban admins
|
2020-06-30 07:25:38 +00:00
|
|
|
Ban ban = getByUsername(player.getName());
|
|
|
|
if (ban != null)
|
2015-11-15 23:32:04 +00:00
|
|
|
{
|
2020-06-30 07:25:38 +00:00
|
|
|
removeBan(ban);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2020-07-01 01:51:06 +00:00
|
|
|
ban = getByIp(FUtil.getIp(player));
|
2020-06-30 07:25:38 +00:00
|
|
|
if (ban != null)
|
|
|
|
{
|
|
|
|
removeBan(ban);
|
|
|
|
}
|
2015-11-15 23:32:04 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-03-06 15:56:15 +00:00
|
|
|
private void updateViews()
|
|
|
|
{
|
|
|
|
// Remove expired bans
|
2020-05-29 10:14:21 +00:00
|
|
|
for (Ban ban : new ArrayList<>(bans))
|
2016-03-06 15:56:15 +00:00
|
|
|
{
|
2020-05-29 10:14:21 +00:00
|
|
|
if (ban.isExpired())
|
2016-03-06 15:56:15 +00:00
|
|
|
{
|
2020-05-29 10:14:21 +00:00
|
|
|
bans.remove(ban);
|
|
|
|
plugin.sql.removeBan(ban);
|
2016-03-06 15:56:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
nameBans.clear();
|
2020-08-10 05:25:04 +00:00
|
|
|
uuidBans.clear();
|
2016-03-06 15:56:15 +00:00
|
|
|
ipBans.clear();
|
|
|
|
for (Ban ban : bans)
|
|
|
|
{
|
|
|
|
if (ban.hasUsername())
|
|
|
|
{
|
|
|
|
nameBans.put(ban.getUsername().toLowerCase(), ban);
|
|
|
|
}
|
|
|
|
|
2020-08-10 05:25:04 +00:00
|
|
|
if (ban.hasUUID())
|
|
|
|
{
|
|
|
|
uuidBans.put(ban.getUuid(), ban);
|
|
|
|
}
|
|
|
|
|
2016-03-06 15:56:15 +00:00
|
|
|
if (ban.hasIps())
|
|
|
|
{
|
|
|
|
for (String ip : ban.getIps())
|
|
|
|
{
|
|
|
|
ipBans.put(ip, ban);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-12-04 00:28:53 +00:00
|
|
|
}
|