mirror of
https://github.com/AtlasMediaGroup/TotalFreedomMod.git
synced 2025-06-30 20:16:41 +00:00
[Bleeding] First compile of new banning system
Updated to CraftBukkit 1.7.8-R0.1
This commit is contained in:
@ -2,16 +2,12 @@ package me.StevenLawson.TotalFreedomMod;
|
||||
|
||||
import me.StevenLawson.TotalFreedomMod.Config.TFM_ConfigEntry;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.UUID;
|
||||
import java.util.regex.Pattern;
|
||||
import net.minecraft.server.v1_7_R2.BanEntry;
|
||||
import net.minecraft.server.v1_7_R2.BanList;
|
||||
import net.minecraft.server.v1_7_R2.MinecraftServer;
|
||||
import net.minecraft.server.v1_7_R2.PlayerList;
|
||||
import net.minecraft.server.v1_7_R2.PropertyManager;
|
||||
import net.minecraft.server.v1_7_R3.MinecraftServer;
|
||||
import net.minecraft.server.v1_7_R3.PropertyManager;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Server;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -21,244 +17,138 @@ import org.bukkit.event.player.PlayerLoginEvent.Result;
|
||||
public class TFM_ServerInterface
|
||||
{
|
||||
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd \'at\' HH:mm:ss z");
|
||||
public static final Pattern INVALID_CHARS_REGEX = Pattern.compile("[^a-zA-Z0-9\\-\\.\\_]");
|
||||
|
||||
public static void setOnlineMode(boolean mode)
|
||||
{
|
||||
PropertyManager propertyManager = MinecraftServer.getServer().getPropertyManager();
|
||||
propertyManager.a("online-mode", mode);
|
||||
propertyManager.savePropertiesFile();
|
||||
}
|
||||
|
||||
public static void wipeNameBans()
|
||||
{
|
||||
BanList nameBans = MinecraftServer.getServer().getPlayerList().getNameBans();
|
||||
nameBans.getEntries().clear();
|
||||
nameBans.save();
|
||||
}
|
||||
|
||||
public static void wipeIpBans()
|
||||
{
|
||||
BanList IPBans = MinecraftServer.getServer().getPlayerList().getIPBans();
|
||||
IPBans.getEntries().clear();
|
||||
IPBans.save();
|
||||
}
|
||||
|
||||
public static void unbanUsername(String name)
|
||||
{
|
||||
name = name.toLowerCase().trim();
|
||||
BanList nameBans = MinecraftServer.getServer().getPlayerList().getNameBans();
|
||||
nameBans.remove(name);
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public static void banUsername(String name, String reason, String source, Date expireDate)
|
||||
{
|
||||
name = name.toLowerCase().trim();
|
||||
|
||||
if (TFM_AdminList.getSuperadminUUIDs().contains(name))
|
||||
{
|
||||
TFM_Log.info("Not banning username " + name + ": is superadmin");
|
||||
return;
|
||||
}
|
||||
|
||||
for (String username : (List<String>) TFM_ConfigEntry.UNBANNABLE_USERNAMES.getList())
|
||||
{
|
||||
if (username.toLowerCase().trim().equals(name))
|
||||
{
|
||||
TFM_Log.info("Not banning username " + name + ": is unbannable as defined in config.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
BanEntry entry = new BanEntry(name);
|
||||
if (expireDate != null)
|
||||
{
|
||||
entry.setExpires(expireDate);
|
||||
}
|
||||
if (reason != null)
|
||||
{
|
||||
entry.setReason(reason);
|
||||
}
|
||||
if (source != null)
|
||||
{
|
||||
entry.setSource(source);
|
||||
}
|
||||
BanList nameBans = MinecraftServer.getServer().getPlayerList().getNameBans();
|
||||
nameBans.add(entry);
|
||||
}
|
||||
|
||||
public static boolean isNameBanned(String name)
|
||||
{
|
||||
name = name.toLowerCase().trim();
|
||||
BanList nameBans = MinecraftServer.getServer().getPlayerList().getNameBans();
|
||||
nameBans.removeExpired();
|
||||
return nameBans.getEntries().containsKey(name);
|
||||
}
|
||||
|
||||
public static void banIP(String ip, String reason, String source, Date expireDate)
|
||||
{
|
||||
ip = ip.toLowerCase().trim();
|
||||
BanEntry entry = new BanEntry(ip);
|
||||
if (expireDate != null)
|
||||
{
|
||||
entry.setExpires(expireDate);
|
||||
}
|
||||
if (reason != null)
|
||||
{
|
||||
entry.setReason(reason);
|
||||
}
|
||||
if (source != null)
|
||||
{
|
||||
entry.setSource(source);
|
||||
}
|
||||
BanList ipBans = MinecraftServer.getServer().getPlayerList().getIPBans();
|
||||
ipBans.add(entry);
|
||||
}
|
||||
|
||||
public static void unbanIP(String ip)
|
||||
{
|
||||
ip = ip.toLowerCase().trim();
|
||||
BanList ipBans = MinecraftServer.getServer().getPlayerList().getIPBans();
|
||||
ipBans.remove(ip);
|
||||
}
|
||||
|
||||
public static boolean isIPBanned(String ip)
|
||||
{
|
||||
ip = ip.toLowerCase().trim();
|
||||
BanList ipBans = MinecraftServer.getServer().getPlayerList().getIPBans();
|
||||
ipBans.removeExpired();
|
||||
return ipBans.getEntries().containsKey(ip);
|
||||
final PropertyManager manager = MinecraftServer.getServer().getPropertyManager();
|
||||
manager.a("online-mode", mode);
|
||||
manager.savePropertiesFile();
|
||||
}
|
||||
|
||||
public static int purgeWhitelist()
|
||||
{
|
||||
Set whitelisted = MinecraftServer.getServer().getPlayerList().getWhitelisted();
|
||||
int size = whitelisted.size();
|
||||
whitelisted.clear();
|
||||
String[] whitelisted = MinecraftServer.getServer().getPlayerList().getWhitelisted();
|
||||
int size = whitelisted.length;
|
||||
for (String player : MinecraftServer.getServer().getPlayerList().getWhitelist().getEntries())
|
||||
{
|
||||
MinecraftServer.getServer().getPlayerList().getWhitelist().remove(player);
|
||||
}
|
||||
MinecraftServer.getServer().getPlayerList().getWhitelist().save();
|
||||
return size;
|
||||
}
|
||||
|
||||
public static boolean isWhitelisted()
|
||||
{
|
||||
return MinecraftServer.getServer().getPlayerList().hasWhitelist;
|
||||
}
|
||||
|
||||
public static List<?> getWhitelisted()
|
||||
{
|
||||
return Arrays.asList(MinecraftServer.getServer().getPlayerList().getWhitelisted());
|
||||
}
|
||||
|
||||
public static String getVersion()
|
||||
{
|
||||
return MinecraftServer.getServer().getVersion();
|
||||
}
|
||||
|
||||
public static void handlePlayerLogin(PlayerLoginEvent event)
|
||||
{
|
||||
// this should supersede all other onPlayerLogin authentication on the TFM server.
|
||||
// when using the TFM CraftBukkit, CraftBukkit itself should not do any of its own authentication.
|
||||
|
||||
final Server server = TotalFreedomMod.server;
|
||||
|
||||
final PlayerList playerList = MinecraftServer.getServer().getPlayerList();
|
||||
final BanList ipBans = playerList.getIPBans();
|
||||
final BanList nameBans = playerList.getNameBans();
|
||||
final TFM_BanManager banManager = TFM_BanManager.getInstance();
|
||||
|
||||
final Player player = event.getPlayer();
|
||||
|
||||
final String username = player.getName();
|
||||
final UUID uuid = player.getUniqueId();
|
||||
final String ip = event.getAddress().getHostAddress().trim();
|
||||
|
||||
if (username.trim().length() <= 2)
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Your username is too short (must be at least 3 characters long).");
|
||||
return;
|
||||
}
|
||||
else if (Pattern.compile("[^a-zA-Z0-9\\-\\.\\_]").matcher(username).find())
|
||||
if (INVALID_CHARS_REGEX.matcher(username).find())
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Your username contains invalid characters.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (username.length() <= 2)
|
||||
{
|
||||
event.disallow(Result.KICK_OTHER, "Your username is too short (must be at least 3 characters long).");
|
||||
return;
|
||||
}
|
||||
|
||||
// not safe to use TFM_Util.isSuperAdmin for player logging in because player.getAddress() will return a null until after player login.
|
||||
boolean isSuperadmin;
|
||||
boolean isAdmin;
|
||||
if (server.getOnlineMode())
|
||||
{
|
||||
isSuperadmin = TFM_AdminList.getSuperadminUUIDs().contains(username.toLowerCase());
|
||||
isAdmin = TFM_AdminList.getSuperadminUUIDs().contains(uuid);
|
||||
}
|
||||
else
|
||||
{
|
||||
isSuperadmin = TFM_AdminList.checkPartialSuperadminIp(ip, username.toLowerCase());
|
||||
isAdmin = TFM_AdminList.getEntryByIp(ip) != null;
|
||||
}
|
||||
|
||||
// Validation below this point
|
||||
|
||||
if (!isSuperadmin) // non-admins
|
||||
if (!isAdmin) // If the player is not an admin
|
||||
{
|
||||
// banned-players.txt
|
||||
if (nameBans.isBanned(username.toLowerCase()))
|
||||
// UUID bans
|
||||
if (banManager.isUuidBanned(uuid))
|
||||
{
|
||||
final BanEntry nameBan = (BanEntry) nameBans.getEntries().get(username.toLowerCase());
|
||||
final TFM_Ban ban = banManager.getByUuid(uuid);
|
||||
|
||||
String kickMessage = ChatColor.RED + "You are temporarily banned from this server.\nAppeal at http://totalfreedom.boards.net/.";
|
||||
if (nameBan != null)
|
||||
|
||||
if (!ban.getReason().equals("none"))
|
||||
{
|
||||
kickMessage = kickMessage + "\nReason: " + nameBan.getReason();
|
||||
if (nameBan.getExpires() != null)
|
||||
{
|
||||
kickMessage = kickMessage + "\nYour ban will be removed on " + dateFormat.format(nameBan.getExpires());
|
||||
}
|
||||
kickMessage = kickMessage + "\nReason: " + ban.getReason();
|
||||
}
|
||||
|
||||
if (ban.getExpireUnix() != 0)
|
||||
{
|
||||
kickMessage = kickMessage + "\nYour ban will be removed on " + dateFormat.format(TFM_Util.getUnixDate(ban.getExpireUnix()));
|
||||
}
|
||||
|
||||
event.disallow(Result.KICK_OTHER, kickMessage);
|
||||
return;
|
||||
}
|
||||
|
||||
// banned-ips.txt
|
||||
final Iterator ipBansIt = ipBans.getEntries().keySet().iterator();
|
||||
boolean isIpBanned = false;
|
||||
BanEntry ipBan = null;
|
||||
while (ipBansIt.hasNext())
|
||||
if (banManager.isIpBanned(ip))
|
||||
{
|
||||
String testIp = (String) ipBansIt.next();
|
||||
final TFM_Ban ban = banManager.getByIp(ip);
|
||||
|
||||
if (!testIp.matches("^\\d{1,3}\\.\\d{1,3}\\.(\\d{1,3}|\\*)\\.(\\d{1,3}|\\*)$"))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (ip.equals(testIp))
|
||||
{
|
||||
isIpBanned = true;
|
||||
ipBan = (BanEntry) ipBans.getEntries().get(testIp);
|
||||
break;
|
||||
}
|
||||
|
||||
if (TFM_Util.fuzzyIpMatch(testIp, ip, 4))
|
||||
{
|
||||
isIpBanned = true;
|
||||
ipBan = (BanEntry) ipBans.getEntries().get(testIp);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (isIpBanned)
|
||||
{
|
||||
String kickMessage = ChatColor.RED + "Your IP address is temporarily banned from this server.\nAppeal at http://totalfreedom.boards.net/.";
|
||||
if (ipBan != null)
|
||||
|
||||
if (!ban.getReason().equals("none"))
|
||||
{
|
||||
kickMessage = kickMessage + "\nReason: " + ipBan.getReason();
|
||||
if (ipBan.getExpires() != null)
|
||||
{
|
||||
kickMessage = kickMessage + "\nYour ban will be removed on " + dateFormat.format(ipBan.getExpires());
|
||||
}
|
||||
kickMessage = kickMessage + "\nReason: " + ban.getReason();
|
||||
}
|
||||
|
||||
if (ban.getExpireUnix() != 0)
|
||||
{
|
||||
kickMessage = kickMessage + "\nYour ban will be removed on " + dateFormat.format(TFM_Util.getUnixDate(ban.getExpireUnix()));
|
||||
}
|
||||
|
||||
event.disallow(Result.KICK_OTHER, kickMessage);
|
||||
return;
|
||||
}
|
||||
|
||||
// permban.yml - ips
|
||||
// Permbanned Ips
|
||||
for (String testIp : TotalFreedomMod.permbannedIps)
|
||||
{
|
||||
if (TFM_Util.fuzzyIpMatch(testIp, ip, 4))
|
||||
{
|
||||
event.disallow(Result.KICK_OTHER, ChatColor.RED + "Your IP address is permanently banned from this server.\nRelease procedures are available at http://bit.ly/TF_PermBan");
|
||||
event.disallow(Result.KICK_OTHER,
|
||||
ChatColor.RED + "Your IP address is permanently banned from this server.\nRelease procedures are available at http://bit.ly/TF_PermBan");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// permban.yml - names
|
||||
// Permbanned names
|
||||
for (String testPlayer : TotalFreedomMod.permbannedPlayers)
|
||||
{
|
||||
if (testPlayer.equalsIgnoreCase(username))
|
||||
{
|
||||
event.disallow(Result.KICK_OTHER, ChatColor.RED + "Your username is permanently banned from this server.\nRelease procedures are available at http://bit.ly/TF_PermBan");
|
||||
event.disallow(Result.KICK_OTHER,
|
||||
ChatColor.RED + "Your username is permanently banned from this server.\nRelease procedures are available at http://bit.ly/TF_PermBan");
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -285,9 +175,9 @@ public class TFM_ServerInterface
|
||||
}
|
||||
|
||||
// Whitelist check
|
||||
if (playerList.hasWhitelist)
|
||||
if (isWhitelisted())
|
||||
{
|
||||
if (!playerList.getWhitelisted().contains(username.toLowerCase()))
|
||||
if (!getWhitelisted().contains(username.toLowerCase()))
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "You are not whitelisted on this server.");
|
||||
return;
|
||||
@ -295,9 +185,9 @@ public class TFM_ServerInterface
|
||||
}
|
||||
|
||||
// Username already logged in check
|
||||
for (Player test_player : server.getOnlinePlayers())
|
||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
||||
{
|
||||
if (test_player.getName().equalsIgnoreCase(username))
|
||||
if (onlinePlayer.getName().equalsIgnoreCase(username))
|
||||
{
|
||||
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Your username is already logged into this server.");
|
||||
return;
|
||||
@ -309,32 +199,32 @@ public class TFM_ServerInterface
|
||||
// force-allow superadmins to log in
|
||||
event.allow();
|
||||
|
||||
if (isIPBanned(ip))
|
||||
if (banManager.isIpBanned(ip))
|
||||
{
|
||||
unbanIP(ip);
|
||||
banManager.unbanIp(ip);
|
||||
}
|
||||
|
||||
if (isNameBanned(username))
|
||||
if (banManager.isUuidBanned(uuid))
|
||||
{
|
||||
unbanUsername(username);
|
||||
banManager.unbanUuid(uuid);
|
||||
}
|
||||
|
||||
for (Player testPlayer : server.getOnlinePlayers())
|
||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
||||
{
|
||||
if (testPlayer.getName().equalsIgnoreCase(username))
|
||||
if (onlinePlayer.getName().equalsIgnoreCase(username))
|
||||
{
|
||||
testPlayer.kickPlayer("An admin just logged in with the username you are using.");
|
||||
onlinePlayer.kickPlayer("An admin just logged in with the username you are using.");
|
||||
}
|
||||
}
|
||||
|
||||
int count = server.getOnlinePlayers().length;
|
||||
if (count >= server.getMaxPlayers())
|
||||
{
|
||||
for (Player p : server.getOnlinePlayers())
|
||||
for (Player onlinePlayer : server.getOnlinePlayers())
|
||||
{
|
||||
if (!TFM_AdminList.isSuperAdmin(p))
|
||||
if (!TFM_AdminList.isSuperAdmin(onlinePlayer))
|
||||
{
|
||||
p.kickPlayer("You have been kicked to free up room for an admin.");
|
||||
onlinePlayer.kickPlayer("You have been kicked to free up room for an admin.");
|
||||
count--;
|
||||
}
|
||||
|
||||
@ -352,15 +242,5 @@ public class TFM_ServerInterface
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (TotalFreedomMod.lockdownEnabled)
|
||||
{
|
||||
TFM_Util.playerMsg(player, "Warning: Server is currenty in lockdown-mode, new players will not be able to join!", ChatColor.RED);
|
||||
}
|
||||
}
|
||||
|
||||
public static String getVersion()
|
||||
{
|
||||
return MinecraftServer.getServer().getVersion();
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user