[Bleeding] First compile of new banning system

Updated to CraftBukkit 1.7.8-R0.1
This commit is contained in:
unknown
2014-04-14 21:11:41 +02:00
parent 5237fa0ca2
commit d613e0266b
20 changed files with 642 additions and 352 deletions

View File

@ -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();
}
}