diff --git a/lib/BungeeCord.jar b/lib/BungeeCord.jar deleted file mode 100644 index 9cc530342..000000000 Binary files a/lib/BungeeCord.jar and /dev/null differ diff --git a/lib/bungeecord-api.jar b/lib/bungeecord-api.jar new file mode 100644 index 000000000..73c5e094b Binary files /dev/null and b/lib/bungeecord-api.jar differ diff --git a/lib/xAuth-2.4.4.jar b/lib/xAuth-2.4.4.jar new file mode 100644 index 000000000..39c79f9f1 Binary files /dev/null and b/lib/xAuth-2.4.4.jar differ diff --git a/pom.xml b/pom.xml index 7f7919073..bb458c03f 100644 --- a/pom.xml +++ b/pom.xml @@ -24,12 +24,12 @@ - 3.0 + 3.1.1 org.bukkit bukkit - 1.6.4-R0.1-SNAPSHOT + 1.7.2-R0.1-SNAPSHOT net.milkbowl.vault @@ -107,6 +107,13 @@ 2.0.26 system ${project.basedir}/lib/xAuth.jar + + + de.luricos.bukkit + xAuth + 2.4.4 + system + ${project.basedir}/lib/xAuth-2.4.4.jar com.onarandombox @@ -125,9 +132,9 @@ net.md-5 bungeecord-api - 1.6.4-SNAPSHOT + 1.7.2-SNAPSHOT system - ${project.basedir}/lib/BungeeCord.jar + ${project.basedir}/lib/bungeecord-api.jar \ No newline at end of file diff --git a/src/main/java/fr/xephi/authme/AuthMe.java b/src/main/java/fr/xephi/authme/AuthMe.java index 0ab394787..7b283def4 100644 --- a/src/main/java/fr/xephi/authme/AuthMe.java +++ b/src/main/java/fr/xephi/authme/AuthMe.java @@ -1,10 +1,17 @@ package fr.xephi.authme; import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.InetAddress; +import java.net.URL; +import java.net.URLConnection; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Random; +import java.util.zip.GZIPInputStream; import com.earth2me.essentials.Essentials; @@ -25,6 +32,7 @@ import org.bukkit.Location; import org.bukkit.Server; import org.bukkit.World; +import com.maxmind.geoip.LookupService; import com.onarandombox.MultiverseCore.MultiverseCore; import fr.xephi.authme.api.API; @@ -48,6 +56,7 @@ import fr.xephi.authme.datasource.FileDataSource; import fr.xephi.authme.datasource.MySQLDataSource; import fr.xephi.authme.datasource.SqliteDataSource; import fr.xephi.authme.listener.AuthMeBlockListener; +import fr.xephi.authme.listener.AuthMeBungeeCordListener; import fr.xephi.authme.listener.AuthMeChestShopListener; import fr.xephi.authme.listener.AuthMeEntityListener; import fr.xephi.authme.listener.AuthMePlayerListener; @@ -94,6 +103,9 @@ public class AuthMe extends JavaPlugin { public MultiverseCore multiverse = null; public Location essentialsSpawn; public Thread databaseThread = null; + public LookupService ls = null; + public boolean antibotMod = false; + public boolean delayedAntiBot = true; @Override public void onEnable() { @@ -105,14 +117,34 @@ public class AuthMe extends JavaPlugin { settings = new Settings(this); settings.loadConfigOptions(); + if (Settings.enableAntiBot) { + Bukkit.getScheduler().scheduleSyncDelayedTask(this, new Runnable() { + @Override + public void run() { + delayedAntiBot = false; + } + }, 2400); + } + + m = Messages.getInstance(); + setMessages(Messages.getInstance()); pllog = PlayersLogs.getInstance(); server = getServer(); //Set Console Filter - if (Settings.removePassword) - Bukkit.getLogger().setFilter(new ConsoleFilter()); + if (Settings.removePassword) { + Bukkit.getLogger().setFilter(new ConsoleFilter()); + /*// Check the log4j usage and apply a filter + try { + if (Class.forName("org.apache.logging.log4j.LogManager") != null) { + + } + } catch (Exception e) {} + */ + } + //Load MailApi if(!Settings.getmailAccount.isEmpty() && !Settings.getmailPassword.isEmpty()) @@ -137,7 +169,7 @@ public class AuthMe extends JavaPlugin { checkEssentials(); /* - * Back style on start if avaible + * Back style on start if avalaible */ if(Settings.isBackupActivated && Settings.isBackupOnStart) { Boolean Backup = new PerformBackup(this).DoBackup(); @@ -164,7 +196,7 @@ public class AuthMe extends JavaPlugin { if (Settings.isStopEnabled) { ConsoleLogger.showError("Can't use FLAT FILE... SHUTDOWN..."); server.shutdown(); - } + } if (!Settings.isStopEnabled) this.getServer().getPluginManager().disablePlugin(this); return; @@ -185,7 +217,7 @@ public class AuthMe extends JavaPlugin { if (Settings.isStopEnabled) { ConsoleLogger.showError("Can't use MySQL... Please input correct MySQL informations ! SHUTDOWN..."); server.shutdown(); - } + } if (!Settings.isStopEnabled) this.getServer().getPluginManager().disablePlugin(this); return; @@ -225,6 +257,16 @@ public class AuthMe extends JavaPlugin { management = new Management(database, this); PluginManager pm = getServer().getPluginManager(); + if (Settings.bungee) { + Bukkit.getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); + Bukkit.getMessenger().registerIncomingPluginChannel(this, "BungeeCord", new BungeeCordMessage(this)); + try { + if (Class.forName("net.md_5.bungee.api.event.ChatEvent") != null) + pm.registerEvents(new AuthMeBungeeCordListener(database, this), this); + } catch (ClassNotFoundException e) { + } + ConsoleLogger.info("Successfully hook with BungeeCord!"); + } if (pm.isPluginEnabled("Spout")) { pm.registerEvents(new AuthMeSpoutListener(database), this); ConsoleLogger.info("Successfully hook with Spout!"); @@ -236,10 +278,6 @@ public class AuthMe extends JavaPlugin { pm.registerEvents(new AuthMeChestShopListener(database, this), this); ConsoleLogger.info("Successfully hook with ChestShop!"); } - if (Settings.bungee) { - Bukkit.getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); - Bukkit.getMessenger().registerIncomingPluginChannel(this, "BungeeCord", new BungeeCordMessage(this)); - } //Find Permissions if (pm.getPlugin("Vault") != null) { @@ -283,6 +321,8 @@ public class AuthMe extends JavaPlugin { } } catch (NullPointerException ex) { } + if (Settings.enableProtection) + enableProtection(); if (Settings.usePurge) autoPurge(); ConsoleLogger.info("Authme " + this.getDescription().getVersion() + " enabled"); @@ -338,7 +378,7 @@ public class AuthMe extends JavaPlugin { } } } - + private void checkEssentials() { if (this.getServer().getPluginManager().getPlugin("Essentials") != null && this.getServer().getPluginManager().getPlugin("Essentials").isEnabled()) { try { @@ -405,7 +445,7 @@ public class AuthMe extends JavaPlugin { if (database != null) { database.close(); } - + if (databaseThread != null) { databaseThread.interrupt(); } @@ -414,7 +454,7 @@ public class AuthMe extends JavaPlugin { Boolean Backup = new PerformBackup(this).DoBackup(); if(Backup) ConsoleLogger.info("Backup Complete"); else ConsoleLogger.showError("Error while making Backup"); - } + } ConsoleLogger.info("Authme " + this.getDescription().getVersion() + " disabled"); } @@ -427,7 +467,7 @@ public class AuthMe extends JavaPlugin { PlayerAuth pAuth = database.getAuth(name); if(pAuth == null) break; - PlayerAuth auth = new PlayerAuth(name, pAuth.getHash(), pAuth.getIp(), new Date().getTime()); + PlayerAuth auth = new PlayerAuth(name, pAuth.getHash(), pAuth.getIp(), new Date().getTime(), pAuth.getEmail(), player.getName()); database.updateSession(auth); PlayerCache.getInstance().addPlayer(auth); } @@ -519,7 +559,7 @@ public class AuthMe extends JavaPlugin { } return player; } - + public boolean authmePermissible(Player player, String perm) { if (player.hasPermission(perm)) return true; @@ -536,7 +576,7 @@ public class AuthMe extends JavaPlugin { } return false; } - + private void autoPurge() { if (!Settings.usePurge) { return; @@ -551,9 +591,68 @@ public class AuthMe extends JavaPlugin { purgeEssentials(cleared); if (Settings.purgePlayerDat) purgeDat(cleared); + if (Settings.purgeLimitedCreative) + purgeLimitedCreative(cleared); + if (Settings.purgeAntiXray) + purgeAntiXray(cleared); + //if (Settings.purgePermissions && permission != null) + //purgePerms(cleared); } - private void purgeDat(List cleared) { +/* private void purgePerms(List cleared) { + int i = 0; + for (String name : cleared) { + org.bukkit.OfflinePlayer player = Bukkit.getOfflinePlayer(name); + if (player == null) continue; + String playerName = player.getName(); + for (String group : permission.getPlayerGroups((String) null, playerName)) { + permission.playerRemoveGroup((String) null, playerName, group); + } + } + ConsoleLogger.info("AutoPurgeDatabase : Remove " + i + " players permissions"); + } */ + + public void purgeAntiXray(List cleared) { + int i = 0; + for (String name : cleared) { + org.bukkit.OfflinePlayer player = Bukkit.getOfflinePlayer(name); + if (player == null) continue; + String playerName = player.getName(); + File playerFile = new File("." + File.separator + "plugins" + File.separator + "AntiXRayData" + File.separator + "PlayerData" + File.separator + playerName); + if (playerFile.exists()) { + playerFile.delete(); + i++; + } + } + ConsoleLogger.info("AutoPurgeDatabase : Remove " + i + " AntiXRayData Files"); + } + + public void purgeLimitedCreative(List cleared) { + int i = 0; + for (String name : cleared) { + org.bukkit.OfflinePlayer player = Bukkit.getOfflinePlayer(name); + if (player == null) continue; + String playerName = player.getName(); + File playerFile = new File("." + File.separator + "plugins" + File.separator + "LimitedCreative" + File.separator + "inventories" + File.separator + playerName + ".yml"); + if (playerFile.exists()) { + playerFile.delete(); + i++; + } + playerFile = new File("." + File.separator + "plugins" + File.separator + "LimitedCreative" + File.separator + "inventories" + File.separator + playerName + "_creative.yml"); + if (playerFile.exists()) { + playerFile.delete(); + i++; + } + playerFile = new File("." + File.separator + "plugins" + File.separator + "LimitedCreative" + File.separator + "inventories" + File.separator + playerName + "_adventure.yml"); + if (playerFile.exists()) { + playerFile.delete(); + i++; + } + } + ConsoleLogger.info("AutoPurgeDatabase : Remove " + i + " LimitedCreative Survival, Creative and Adventure files"); + } + + public void purgeDat(List cleared) { int i = 0; for (String name : cleared) { org.bukkit.OfflinePlayer player = Bukkit.getOfflinePlayer(name); @@ -568,7 +667,7 @@ public class AuthMe extends JavaPlugin { ConsoleLogger.info("AutoPurgeDatabase : Remove " + i + " .dat Files"); } - private void purgeEssentials(List cleared) { + public void purgeEssentials(List cleared) { int i = 0; for (String name : cleared) { File playerFile = new File(this.ess.getDataFolder() + File.separator + "userdata" + File.separator + name + ".yml"); @@ -582,7 +681,7 @@ public class AuthMe extends JavaPlugin { public Location getSpawnLocation(World world) { Location spawnLoc = world.getSpawnLocation(); - if (multiverse != null) { + if (multiverse != null && Settings.multiverse) { try { spawnLoc = multiverse.getMVWorldManager().getMVWorld(world).getSpawnLocation(); } catch (NullPointerException npe) { @@ -597,4 +696,47 @@ public class AuthMe extends JavaPlugin { spawnLoc = Spawn.getInstance().getLocation(); return spawnLoc; } + + private void enableProtection() { + ConsoleLogger.info(" This product includes GeoLite data created by MaxMind, available from http://www.maxmind.com"); + File file = new File(getDataFolder(), "GeoIP.dat"); + if (!file.exists()) { + try { + String url = "http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz"; + URL downloadUrl = new URL(url); + URLConnection conn = downloadUrl.openConnection(); + conn.setConnectTimeout(10000); + conn.connect(); + InputStream input = conn.getInputStream(); + if (url.endsWith(".gz")) + input = new GZIPInputStream(input); + OutputStream output = new FileOutputStream(file); + byte[] buffer = new byte[2048]; + int length = input.read(buffer); + while (length >= 0) { + output.write(buffer, 0, length); + length = input.read(buffer); + } + output.close(); + input.close(); + } catch (Exception e) {} + } + } + + public String getCountryCode(InetAddress ip) { + try { + if (ls == null) + ls = new LookupService(new File(getDataFolder(), "GeoIP.dat")); + String code = ls.getCountry(ip).getCode(); + if (code != null && !code.isEmpty()) + return code; + } catch (Exception e) {} + return null; + } + + public void switchAntiBotMod(boolean mode) { + this.antibotMod = mode; + Settings.switchAntiBotMod(mode); + } + } diff --git a/src/main/java/fr/xephi/authme/Management.java b/src/main/java/fr/xephi/authme/Management.java index 6f7186351..2e04889a6 100644 --- a/src/main/java/fr/xephi/authme/Management.java +++ b/src/main/java/fr/xephi/authme/Management.java @@ -50,24 +50,28 @@ public class Management { this.pm = plugin.getServer().getPluginManager(); } - public void performLogin(final Player player, final String password, final boolean passpartu) { + public void performLogin(final Player player, final String password, final boolean passpartu, final boolean forceLogin) { if (passpartu) { // Passpartu-Login Bypasses Password-Authentication. - Bukkit.getScheduler().runTaskAsynchronously(plugin, new AsyncronousPasspartuLogin(player)); + new AsyncronousPasspartuLogin(player).pass(); } else { - Bukkit.getScheduler().runTaskAsynchronously(plugin, new AsyncronousLogin(player, password)); + new AsyncronousLogin(player, password, forceLogin).process(); } } - class AsyncronousLogin implements Runnable { + class AsyncronousLogin { protected Player player; protected String name; protected String password; + protected String realName; + protected boolean forceLogin; - public AsyncronousLogin(Player player, String password) { + public AsyncronousLogin(Player player, String password, boolean forceLogin) { this.player = player; this.password = password; name = player.getName().toLowerCase(); + realName = player.getName(); + this.forceLogin = forceLogin; } protected String getIP() { @@ -87,12 +91,11 @@ public class Management { plugin.captcha.remove(name); plugin.captcha.put(name, i); } - if (plugin.captcha.containsKey(name) && plugin.captcha.get(name) > Settings.maxLoginTry) { - player.sendMessage(m._("need_captcha")); + if (plugin.captcha.containsKey(name) && plugin.captcha.get(name) >= Settings.maxLoginTry) { plugin.cap.put(name, rdm.nextString()); - player.sendMessage("Type : /captcha " + plugin.cap.get(name)); + player.sendMessage(m._("need_captcha").replace("THE_CAPTCHA", plugin.cap.get(name)).replace("", plugin.cap.get(name))); return true; - } else if (plugin.captcha.containsKey(name) && plugin.captcha.get(name) > Settings.maxLoginTry) { + } else if (plugin.captcha.containsKey(name) && plugin.captcha.get(name) >= Settings.maxLoginTry) { try { plugin.captcha.remove(name); plugin.cap.remove(name); @@ -127,8 +130,7 @@ public class Management { return pAuth; } - @Override - public void run() { + protected void process() { PlayerAuth pAuth = preAuth(); if (pAuth == null || needsCaptcha()) return; @@ -136,15 +138,16 @@ public class Management { String hash = pAuth.getHash(); String email = pAuth.getEmail(); boolean passwordVerified = true; - try { - passwordVerified = PasswordSecurity.comparePasswordWithHash(password, hash, name); - } catch (Exception ex) { - ConsoleLogger.showError(ex.getMessage()); - player.sendMessage(m._("error")); - return; - } + if (!forceLogin) + try { + passwordVerified = PasswordSecurity.comparePasswordWithHash(password, hash, name); + } catch (Exception ex) { + ConsoleLogger.showError(ex.getMessage()); + player.sendMessage(m._("error")); + return; + } if (passwordVerified && player.isOnline()) { - PlayerAuth auth = new PlayerAuth(name, hash, getIP(), new Date().getTime(), email); + PlayerAuth auth = new PlayerAuth(name, hash, getIP(), new Date().getTime(), email, realName); database.updateSession(auth); /* @@ -216,13 +219,12 @@ public class Management { } } - class AsyncronousPasspartuLogin extends AsyncronousLogin implements Runnable { + class AsyncronousPasspartuLogin extends AsyncronousLogin { public AsyncronousPasspartuLogin(Player player) { - super(player, null); + super(player, null, false); } - @Override - public void run() { + public void pass() { PlayerAuth pAuth = preAuth(); if (pAuth == null) return; @@ -230,7 +232,7 @@ public class Management { String hash = pAuth.getHash(); String email = pAuth.getEmail(); - PlayerAuth auth = new PlayerAuth(name, hash, getIP(), new Date().getTime(), email); + PlayerAuth auth = new PlayerAuth(name, hash, getIP(), new Date().getTime(), email, realName); database.updateSession(auth); /* @@ -338,6 +340,13 @@ public class Management { API.setPlayerInventory(player, event.getInventory(), event.getArmor()); } } + protected void forceCommands() { + for (String command : Settings.forceCommands) { + try { + player.performCommand(command.replace("%p", player.getName())); + } catch (Exception e) {} + } + } @Override public void run() { @@ -386,7 +395,7 @@ public class Management { // Re-Force Survival GameMode if we need due to world change specification if (Settings.isForceSurvivalModeEnabled) - player.setGameMode(GameMode.SURVIVAL); + Utils.forceGM(player); // Cleanup no longer used temporary data LimboCache.getInstance().deleteLimboPlayer(name); @@ -394,9 +403,21 @@ public class Management { playerCache.removeCache(name); } } + + // We can now display the join message + if (AuthMePlayerListener.joinMessage.containsKey(name) && AuthMePlayerListener.joinMessage.get(name) != null) { + for (Player p : Bukkit.getServer().getOnlinePlayers()) { + if (p.isOnline()) + p.sendMessage(AuthMePlayerListener.joinMessage.get(name)); + } + } + // The Loginevent now fires (as intended) after everything is processed Bukkit.getServer().getPluginManager().callEvent(new LoginEvent(player, true)); player.saveData(); + + // Login is now finish , we can force all commands + forceCommands(); } } diff --git a/src/main/java/fr/xephi/authme/Utils.java b/src/main/java/fr/xephi/authme/Utils.java index ccc301ad7..4aef45329 100644 --- a/src/main/java/fr/xephi/authme/Utils.java +++ b/src/main/java/fr/xephi/authme/Utils.java @@ -7,11 +7,13 @@ import java.util.Random; import java.util.Scanner; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; import fr.xephi.authme.api.API; +import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.events.AuthMeTeleportEvent; import fr.xephi.authme.settings.Settings; @@ -126,24 +128,28 @@ public class Utils { } }); - id = Bukkit.getScheduler().scheduleSyncRepeatingTask(AuthMe.getInstance(), new Runnable() - { - @Override - public void run() { - int current = (int)pl.getLocation().getY(); - World currentWorld = pl.getWorld(); - if (current != fY && world.getName() == currentWorld.getName()) { - pl.teleport(loc); - } - } - }, 1L, 20L); - Bukkit.getScheduler().scheduleSyncDelayedTask(AuthMe.getInstance(), new Runnable() - { - @Override - public void run() { - Bukkit.getScheduler().cancelTask(id); - } - }, 60L); + if (!PlayerCache.getInstance().isAuthenticated(pl.getName().toLowerCase())) { + id = Bukkit.getScheduler().scheduleSyncRepeatingTask(AuthMe.getInstance(), new Runnable() + { + @Override + public void run() { + if (!PlayerCache.getInstance().isAuthenticated(pl.getName().toLowerCase())) { + int current = (int)pl.getLocation().getY(); + World currentWorld = pl.getWorld(); + if (current != fY && world.getName() == currentWorld.getName()) { + pl.teleport(loc); + } + } + } + }, 1L, 20L); + Bukkit.getScheduler().scheduleSyncDelayedTask(AuthMe.getInstance(), new Runnable() + { + @Override + public void run() { + Bukkit.getScheduler().cancelTask(id); + } + }, 60L); + } } /* @@ -217,6 +223,14 @@ public class Utils { return new String(arr); } + /* + * Used for force player GameMode + */ + public static void forceGM(Player player) { + if (!AuthMe.getInstance().authmePermissible(player, "authme.bypassforcesurvival")) + player.setGameMode(GameMode.SURVIVAL); + } + public enum groupType { UNREGISTERED, REGISTERED, NOTLOGGEDIN, LOGGEDIN } diff --git a/src/main/java/fr/xephi/authme/api/API.java b/src/main/java/fr/xephi/authme/api/API.java index 723b23f9e..6b45387f3 100644 --- a/src/main/java/fr/xephi/authme/api/API.java +++ b/src/main/java/fr/xephi/authme/api/API.java @@ -145,7 +145,7 @@ public class API { if (isRegistered(name)) { return false; } - PlayerAuth auth = new PlayerAuth(name, hash, "198.18.0.1", 0); + PlayerAuth auth = new PlayerAuth(name, hash, "198.18.0.1", 0, "your@email.com", getPlayerRealName(name)); if (!database.saveAuth(auth)) { return false; } @@ -154,5 +154,26 @@ public class API { return false; } } + + /** + * Get Player realName from lowerCase nickname + * @param String playerName + * return String player real name + */ + public static String getPlayerRealName(String nickname) { + try { + String realName = Bukkit.getOfflinePlayer(nickname).getName(); + if (realName != null && !realName.isEmpty()) + return realName; + } catch (NullPointerException npe) {} + return nickname; + } + /** + * Force a player to login + * @param Player player + */ + public static void forceLogin(Player player) { + instance.management.performLogin(player, "dontneed", false, true); + } } diff --git a/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java b/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java index 6b6d477ab..324d8dfbc 100644 --- a/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java +++ b/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java @@ -5,10 +5,10 @@ import fr.xephi.authme.settings.Settings; public class PlayerAuth { - private String nickname; - private String hash; + private String nickname = ""; + private String hash = ""; private String ip = "198.18.0.1"; - private long lastLogin; + private long lastLogin = 0; private int x = 0; private int y = 0; private int z = 0; @@ -17,20 +17,15 @@ public class PlayerAuth { private String vBhash = null; private int groupId; private String email = "your@email.com"; + private String realName = ""; - public PlayerAuth(String nickname, String hash, String ip, long lastLogin) { - this.nickname = nickname; - this.hash = hash; - this.ip = ip; - this.lastLogin = lastLogin; - } - - public PlayerAuth(String nickname, String hash, String ip, long lastLogin, String email) { + public PlayerAuth(String nickname, String hash, String ip, long lastLogin, String email, String realName) { this.nickname = nickname; this.hash = hash; this.ip = ip; this.lastLogin = lastLogin; this.email = email; + this.realName = realName; } public PlayerAuth(String nickname, int x, int y, int z, String world) { @@ -41,7 +36,7 @@ public class PlayerAuth { this.world = world; } - public PlayerAuth(String nickname, String hash, String ip, long lastLogin, int x, int y, int z, String world, String email) { + public PlayerAuth(String nickname, String hash, String ip, long lastLogin, int x, int y, int z, String world, String email, String realName) { this.nickname = nickname; this.hash = hash; this.ip = ip; @@ -51,9 +46,10 @@ public class PlayerAuth { this.z = z; this.world = world; this.email = email; + this.realName = realName; } - public PlayerAuth(String nickname, String hash, String salt, int groupId, String ip, long lastLogin, int x, int y, int z, String world, String email) { + public PlayerAuth(String nickname, String hash, String salt, int groupId, String ip, long lastLogin, int x, int y, int z, String world, String email, String realName) { this.nickname = nickname; this.hash = hash; this.ip = ip; @@ -64,27 +60,30 @@ public class PlayerAuth { this.world = world; this.salt = salt; this.groupId = groupId; - this.email = email; + this.email = email; + this.realName = realName; } - public PlayerAuth(String nickname, String hash, String salt, int groupId , String ip, long lastLogin) { + public PlayerAuth(String nickname, String hash, String salt, int groupId , String ip, long lastLogin, String realName) { this.nickname = nickname; this.hash = hash; this.ip = ip; this.lastLogin = lastLogin; this.salt = salt; this.groupId = groupId; + this.realName = realName; } - public PlayerAuth(String nickname, String hash, String salt, String ip, long lastLogin) { + public PlayerAuth(String nickname, String hash, String salt, String ip, long lastLogin, String realName) { this.nickname = nickname; this.hash = hash; this.ip = ip; this.lastLogin = lastLogin; this.salt = salt; + this.realName = realName; } - public PlayerAuth(String nickname, String hash, String salt, String ip, long lastLogin, int x, int y, int z, String world, String email) { + public PlayerAuth(String nickname, String hash, String salt, String ip, long lastLogin, int x, int y, int z, String world, String email, String realName) { this.nickname = nickname; this.hash = hash; this.ip = ip; @@ -94,19 +93,8 @@ public class PlayerAuth { this.z = z; this.world = world; this.salt = salt; - this.email = email; - } - - public PlayerAuth(String nickname, String hash, String ip, long lastLogin, int x, int y, int z, String world) { - this.nickname = nickname; - this.hash = hash; - this.ip = ip; - this.lastLogin = lastLogin; - this.x = x; - this.y = y; - this.z = z; - this.world = world; - this.email = "your@email.com"; + this.email = email; + this.realName = realName; } public String getIp() { @@ -118,7 +106,7 @@ public class PlayerAuth { } public String getHash() { - if(!salt.isEmpty() && Settings.getPasswordHash == HashAlgorithm.MD5VB) { + if(salt != null && !salt.isEmpty() && Settings.getPasswordHash == HashAlgorithm.MD5VB) { vBhash = "$MD5vb$"+salt+"$"+hash; return vBhash; } @@ -208,9 +196,13 @@ public class PlayerAuth { @Override public String toString() { String s = "Player : " + nickname + " ! IP : " + ip + " ! LastLogin : " + lastLogin + " ! LastPosition : " + x + "," + y + "," + z + "," + world - + " ! Email : " + email + " ! Hash : " + hash + " ! Salt : " + salt; + + " ! Email : " + email + " ! Hash : " + hash + " ! Salt : " + salt + " ! RealName : " + realName; return s; } + public String getRealname() { + return realName; + } + } diff --git a/src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java b/src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java index 301813f2a..f4f93870d 100644 --- a/src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java +++ b/src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java @@ -3,12 +3,12 @@ package fr.xephi.authme.cache.limbo; import java.util.HashMap; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import fr.xephi.authme.AuthMe; -import fr.xephi.authme.api.API; import fr.xephi.authme.cache.backup.FileCache; import fr.xephi.authme.events.ResetInventoryEvent; import fr.xephi.authme.events.StoreInventoryEvent; @@ -30,6 +30,7 @@ public class LimboCache { public void addLimboPlayer(Player player) { String name = player.getName().toLowerCase(); Location loc = player.getLocation(); + loc.setY(loc.getY() + 0.4D); int gameMode = player.getGameMode().getValue(); ItemStack[] arm; ItemStack[] inv; @@ -69,11 +70,11 @@ public class LimboCache { } if(Settings.isForceSurvivalModeEnabled) { - if(Settings.isResetInventoryIfCreative && gameMode != 0 ) { + if(Settings.isResetInventoryIfCreative && player.getGameMode() == GameMode.CREATIVE ) { ResetInventoryEvent event = new ResetInventoryEvent(player); Bukkit.getServer().getPluginManager().callEvent(event); if (!event.isCancelled()) { - API.setPlayerInventory(player, new ItemStack[36], new ItemStack[4]); + player.getInventory().clear(); player.sendMessage("Your inventory has been cleaned!"); } } diff --git a/src/main/java/fr/xephi/authme/commands/AdminCommand.java b/src/main/java/fr/xephi/authme/commands/AdminCommand.java index 74a402fa5..4cf129d18 100644 --- a/src/main/java/fr/xephi/authme/commands/AdminCommand.java +++ b/src/main/java/fr/xephi/authme/commands/AdminCommand.java @@ -25,12 +25,14 @@ import org.bukkit.plugin.java.JavaPlugin; import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.Utils; +import fr.xephi.authme.api.API; import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.converter.FlatToSql; import fr.xephi.authme.converter.FlatToSqlite; import fr.xephi.authme.converter.RakamakConverter; -import fr.xephi.authme.converter.xAuthToFlat; +import fr.xephi.authme.converter.newxAuthToFlat; +import fr.xephi.authme.converter.oldxAuthToFlat; import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.security.PasswordSecurity; import fr.xephi.authme.settings.Messages; @@ -66,6 +68,8 @@ public class AdminCommand implements CommandExecutor { sender.sendMessage("/authme spawn - Teleport you to the AuthMe SpawnPoint"); sender.sendMessage("/authme chgemail - Change player email"); sender.sendMessage("/authme getemail - Get player email"); + sender.sendMessage("/authme purgelastpos - Purge last position for a player"); + sender.sendMessage("/authme switchantibot on/off - Enable/Disable antibot method"); return true; } @@ -100,7 +104,16 @@ public class AdminCommand implements CommandExecutor { try { long days = Long.parseLong(args[1]) * 86400000; long until = new Date().getTime() - days; - sender.sendMessage("Deleted " + database.purgeDatabase(until) + " user accounts"); + List purged = database.autoPurgeDatabase(until); + sender.sendMessage("Deleted " + purged.size() + " user accounts"); + if (Settings.purgeEssentialsFile && plugin.ess != null) + plugin.purgeEssentials(purged); + if (Settings.purgePlayerDat) + plugin.purgeDat(purged); + if (Settings.purgeLimitedCreative) + plugin.purgeLimitedCreative(purged); + if (Settings.purgeAntiXray) + plugin.purgeAntiXray(purged); return true; } catch (NumberFormatException e) { sender.sendMessage("Usage: /authme purge "); @@ -256,24 +269,27 @@ public class AdminCommand implements CommandExecutor { } try { String name = args[1].toLowerCase(); - String hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[2], name); if (database.isAuthAvailable(name)) { sender.sendMessage(m._("user_regged")); return true; } - PlayerAuth auth = new PlayerAuth(name, hash, "198.18.0.1", 0); - auth.setSalt(PasswordSecurity.userSalt.get(name)); + String hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[2], name); + PlayerAuth auth = new PlayerAuth(name, hash, "198.18.0.1", 0L, "your@email.com", API.getPlayerRealName(name)); + if (PasswordSecurity.userSalt.containsKey(name) && PasswordSecurity.userSalt.get(name) != null) + auth.setSalt(PasswordSecurity.userSalt.get(name)); + else + auth.setSalt(""); if (!database.saveAuth(auth)) { sender.sendMessage(m._("error")); return true; } - database.updateSalt(auth); sender.sendMessage(m._("registered")); ConsoleLogger.info(args[1] + " registered"); } catch (NoSuchAlgorithmException ex) { ConsoleLogger.showError(ex.getMessage()); sender.sendMessage(m._("error")); } + return true; } else if (args[0].equalsIgnoreCase("convertflattosql")) { try { FlatToSql.FlatToSqlConverter(); @@ -294,13 +310,22 @@ public class AdminCommand implements CommandExecutor { } catch (NullPointerException ex) { System.out.println(ex.getMessage()); } + return true; } else if (args[0].equalsIgnoreCase("xauthimport")) { - xAuthToFlat converter = new xAuthToFlat(plugin, database); - if (converter.convert(sender)) { - sender.sendMessage("[AuthMe] Successfull convert from xAuth database"); - } else { - sender.sendMessage("[AuthMe] Error while trying to convert from xAuth database"); - } + try { + Class.forName("com.cypherx.xauth.xAuth"); + oldxAuthToFlat converter = new oldxAuthToFlat(plugin, database, sender); + converter.run(); + } catch (ClassNotFoundException e) { + try { + Class.forName("de.luricos.bukkit.xAuth.xAuth"); + newxAuthToFlat converter = new newxAuthToFlat(plugin, database, sender); + converter.run(); + } catch (ClassNotFoundException ce) { + sender.sendMessage("[AuthMe] No version of xAuth found or xAuth isn't enable! "); + } + } + return true; } else if (args[0].equalsIgnoreCase("getemail")) { if (args.length != 2) { sender.sendMessage("Usage: /authme getemail playername"); @@ -343,6 +368,7 @@ public class AdminCommand implements CommandExecutor { } catch (NullPointerException ex) { ConsoleLogger.showError(ex.getMessage()); } + return true; } else if (args[0].equalsIgnoreCase("setspawn")) { try { if (sender instanceof Player) { @@ -355,6 +381,7 @@ public class AdminCommand implements CommandExecutor { } catch (NullPointerException ex) { ConsoleLogger.showError(ex.getMessage()); } + return true; } else if (args[0].equalsIgnoreCase("purgebannedplayers")) { List bannedPlayers = new ArrayList(); for (OfflinePlayer off : plugin.getServer().getBannedPlayers()) { @@ -371,6 +398,15 @@ public class AdminCommand implements CommandExecutor { } }); } + if (Settings.purgeEssentialsFile && plugin.ess != null) + plugin.purgeEssentials(bannedPlayers); + if (Settings.purgePlayerDat) + plugin.purgeDat(bannedPlayers); + if (Settings.purgeLimitedCreative) + plugin.purgeLimitedCreative(bannedPlayers); + if (Settings.purgeAntiXray) + plugin.purgeAntiXray(bannedPlayers); + return true; } else if (args[0].equalsIgnoreCase("spawn")) { try { if (sender instanceof Player) { @@ -383,6 +419,7 @@ public class AdminCommand implements CommandExecutor { } catch (NullPointerException ex) { ConsoleLogger.showError(ex.getMessage()); } + return true; } else if (args[0].equalsIgnoreCase("changepassword") || args[0].equalsIgnoreCase("cp")) { if (args.length != 3) { sender.sendMessage("Usage: /authme changepassword playername newpassword"); @@ -413,6 +450,7 @@ public class AdminCommand implements CommandExecutor { ConsoleLogger.showError(ex.getMessage()); sender.sendMessage(m._("error")); } + return true; } else if (args[0].equalsIgnoreCase("unregister") || args[0].equalsIgnoreCase("unreg") || args[0].equalsIgnoreCase("del") ) { if (args.length != 2) { sender.sendMessage("Usage: /authme unregister playername"); @@ -426,6 +464,49 @@ public class AdminCommand implements CommandExecutor { PlayerCache.getInstance().removePlayer(name); sender.sendMessage("unregistered"); ConsoleLogger.info(args[1] + " unregistered"); + return true; + } else if (args[0].equalsIgnoreCase("purgelastpos")){ + if (args.length != 2) { + sender.sendMessage("Usage: /authme purgelastpos playername"); + return true; + } + try { + String name = args[1].toLowerCase(); + PlayerAuth auth = database.getAuth(name); + if (auth == null) { + sender.sendMessage("The player " + name + " is not registered "); + return true; + } + auth.setQuitLocX(0); + auth.setQuitLocY(0); + auth.setQuitLocZ(0); + auth.setWorld("world"); + database.updateQuitLoc(auth); + sender.sendMessage(name + " 's last pos location is now reset"); + } catch (Exception e) { + ConsoleLogger.showError("An error occured while trying to reset location or player do not exist, please see below: "); + ConsoleLogger.showError(e.getMessage()); + if (sender instanceof Player) + sender.sendMessage("An error occured while trying to reset location or player do not exist, please see logs"); + } + return true; + } else if (args[0].equalsIgnoreCase("switchantibot")) { + if (args.length != 2) { + sender.sendMessage("Usage : /authme switchantibot on/off"); + return true; + } + if (args[1].equalsIgnoreCase("on")) { + plugin.switchAntiBotMod(true); + sender.sendMessage("[AuthMe] AntiBotMod enabled"); + return true; + } + if (args[1].equalsIgnoreCase("off")) { + plugin.switchAntiBotMod(false); + sender.sendMessage("[AuthMe] AntiBotMod disabled"); + return true; + } + sender.sendMessage("Usage : /authme switchantibot on/off"); + return true; } else { sender.sendMessage("Usage: /authme reload|register playername password|changepassword playername password|unregister playername"); } diff --git a/src/main/java/fr/xephi/authme/commands/ChangePasswordCommand.java b/src/main/java/fr/xephi/authme/commands/ChangePasswordCommand.java index dcfbe6a53..861834d52 100644 --- a/src/main/java/fr/xephi/authme/commands/ChangePasswordCommand.java +++ b/src/main/java/fr/xephi/authme/commands/ChangePasswordCommand.java @@ -59,7 +59,10 @@ public class ChangePasswordCommand implements CommandExecutor { if (PasswordSecurity.comparePasswordWithHash(args[0], PlayerCache.getInstance().getAuth(name).getHash(), name)) { PlayerAuth auth = PlayerCache.getInstance().getAuth(name); auth.setHash(hashnew); - auth.setSalt(PasswordSecurity.userSalt.get(name)); + if (PasswordSecurity.userSalt.containsKey(name) && PasswordSecurity.userSalt.get(name) != null) + auth.setSalt(PasswordSecurity.userSalt.get(name)); + else + auth.setSalt(""); if (!database.updatePassword(auth)) { player.sendMessage(m._("error")); return true; diff --git a/src/main/java/fr/xephi/authme/commands/LoginCommand.java b/src/main/java/fr/xephi/authme/commands/LoginCommand.java index 58cf2e7db..299c12a9b 100644 --- a/src/main/java/fr/xephi/authme/commands/LoginCommand.java +++ b/src/main/java/fr/xephi/authme/commands/LoginCommand.java @@ -35,7 +35,7 @@ public class LoginCommand implements CommandExecutor { player.sendMessage(m._("no_perm")); return true; } - plugin.management.performLogin(player, args[0], false); + plugin.management.performLogin(player, args[0], false, false); return true; } } diff --git a/src/main/java/fr/xephi/authme/commands/LogoutCommand.java b/src/main/java/fr/xephi/authme/commands/LogoutCommand.java index ce1e8149b..5c62cbb9a 100644 --- a/src/main/java/fr/xephi/authme/commands/LogoutCommand.java +++ b/src/main/java/fr/xephi/authme/commands/LogoutCommand.java @@ -65,18 +65,14 @@ public class LogoutCommand implements CommandExecutor { PlayerAuth auth = PlayerCache.getInstance().getAuth(name); auth.setIp("198.18.0.1"); database.updateSession(auth); + auth.setQuitLocX(player.getLocation().getBlockX()); + auth.setQuitLocY(player.getLocation().getBlockY()); + auth.setQuitLocZ(player.getLocation().getBlockZ()); + auth.setWorld(player.getWorld().getName()); + database.updateQuitLoc(auth); PlayerCache.getInstance().removePlayer(name); - LimboCache.getInstance().addLimboPlayer(player , utils.removeAll(player)); - LimboCache.getInstance().addLimboPlayer(player); - if(Settings.protectInventoryBeforeLogInEnabled) { - player.getInventory().setArmorContents(new ItemStack[4]); - player.getInventory().setContents(new ItemStack[36]); - // create cache file for handling lost of inventories on unlogged in status - DataFileCache playerData = new DataFileCache(player.getInventory().getContents(),player.getInventory().getArmorContents()); - playerBackup.createCache(name, playerData, LimboCache.getInstance().getLimboPlayer(name).getGroup(),LimboCache.getInstance().getLimboPlayer(name).getOperator(),LimboCache.getInstance().getLimboPlayer(name).isFlying()); - } if (Settings.isTeleportToSpawnEnabled) { Location spawnLoc = player.getWorld().getSpawnLocation(); if (plugin.essentialsSpawn != null) { @@ -94,6 +90,17 @@ public class LogoutCommand implements CommandExecutor { } } + if (LimboCache.getInstance().hasLimboPlayer(name)) + LimboCache.getInstance().deleteLimboPlayer(name); + LimboCache.getInstance().addLimboPlayer(player , utils.removeAll(player)); + LimboCache.getInstance().addLimboPlayer(player); + if(Settings.protectInventoryBeforeLogInEnabled) { + player.getInventory().clear(); + // create cache file for handling lost of inventories on unlogged in status + DataFileCache playerData = new DataFileCache(LimboCache.getInstance().getLimboPlayer(name).getInventory(),LimboCache.getInstance().getLimboPlayer(name).getArmour()); + playerBackup.createCache(name, playerData, LimboCache.getInstance().getLimboPlayer(name).getGroup(),LimboCache.getInstance().getLimboPlayer(name).getOperator(),LimboCache.getInstance().getLimboPlayer(name).isFlying()); + } + int delay = Settings.getRegistrationTimeout * 20; int interval = Settings.getWarnMessageInterval; BukkitScheduler sched = sender.getServer().getScheduler(); diff --git a/src/main/java/fr/xephi/authme/commands/PasspartuCommand.java b/src/main/java/fr/xephi/authme/commands/PasspartuCommand.java index ea85a9c27..dcc6f1672 100644 --- a/src/main/java/fr/xephi/authme/commands/PasspartuCommand.java +++ b/src/main/java/fr/xephi/authme/commands/PasspartuCommand.java @@ -18,7 +18,7 @@ import fr.xephi.authme.settings.Messages; public class PasspartuCommand implements CommandExecutor { private Utils utils = new Utils(); public AuthMe plugin; - private Messages m; + private Messages m = Messages.getInstance(); public PasspartuCommand(AuthMe plugin) { this.plugin = plugin; @@ -39,7 +39,7 @@ public class PasspartuCommand implements CommandExecutor { if ((sender instanceof Player) && args.length == 1) { if(utils.readToken(args[0])) { //bypass login! - plugin.management.performLogin((Player) sender, "dontneed", true); + plugin.management.performLogin((Player) sender, "dontneed", true, false); return true; } sender.sendMessage("Time is expired or Token is Wrong!"); diff --git a/src/main/java/fr/xephi/authme/commands/RegisterCommand.java b/src/main/java/fr/xephi/authme/commands/RegisterCommand.java index 2341b1a97..78e9341d4 100644 --- a/src/main/java/fr/xephi/authme/commands/RegisterCommand.java +++ b/src/main/java/fr/xephi/authme/commands/RegisterCommand.java @@ -126,7 +126,7 @@ public class RegisterCommand implements CommandExecutor { if (PasswordSecurity.userSalt.containsKey(name)) { try { final String hashnew = PasswordSecurity.getHash(Settings.getPasswordHash, thePass, name); - final PlayerAuth fAuth = new PlayerAuth(name, hashnew, PasswordSecurity.userSalt.get(name), ip, new Date().getTime(), (int) player.getLocation().getX() , (int) player.getLocation().getY(), (int) player.getLocation().getZ(), player.getLocation().getWorld().getName(), email); + final PlayerAuth fAuth = new PlayerAuth(name, hashnew, PasswordSecurity.userSalt.get(name), ip, new Date().getTime(), (int) player.getLocation().getX() , (int) player.getLocation().getY(), (int) player.getLocation().getZ(), player.getLocation().getWorld().getName(), email, player.getName()); database.saveAuth(fAuth); database.updateEmail(fAuth); database.updateSession(fAuth); @@ -137,7 +137,7 @@ public class RegisterCommand implements CommandExecutor { } else { try { final String hashnew = PasswordSecurity.getHash(Settings.getPasswordHash, thePass, name); - final PlayerAuth fAuth = new PlayerAuth(name, hashnew, ip, new Date().getTime(), (int) player.getLocation().getX() , (int) player.getLocation().getY(), (int) player.getLocation().getZ(), player.getLocation().getWorld().getName(), email); + final PlayerAuth fAuth = new PlayerAuth(name, hashnew, ip, new Date().getTime(), (int) player.getLocation().getX() , (int) player.getLocation().getY(), (int) player.getLocation().getZ(), player.getLocation().getWorld().getName(), email, player.getName()); database.saveAuth(fAuth); database.updateEmail(fAuth); database.updateSession(fAuth); @@ -216,9 +216,9 @@ public class RegisterCommand implements CommandExecutor { hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name); if (Settings.getMySQLColumnSalt.isEmpty()) { - auth = new PlayerAuth(name, hash, ip, new Date().getTime()); + auth = new PlayerAuth(name, hash, ip, new Date().getTime(), "your@email.com", player.getName()); } else { - auth = new PlayerAuth(name, hash, PasswordSecurity.userSalt.get(name), ip, new Date().getTime()); + auth = new PlayerAuth(name, hash, PasswordSecurity.userSalt.get(name), ip, new Date().getTime(), player.getName()); } if (!database.saveAuth(auth)) { player.sendMessage(m._("error")); diff --git a/src/main/java/fr/xephi/authme/converter/FlatToSql.java b/src/main/java/fr/xephi/authme/converter/FlatToSql.java index ac0cdeab5..37b4d5a1e 100644 --- a/src/main/java/fr/xephi/authme/converter/FlatToSql.java +++ b/src/main/java/fr/xephi/authme/converter/FlatToSql.java @@ -77,6 +77,8 @@ public class FlatToSql { newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", " + args[4] + ", " + args[5] + ", " + args[6] + ", 'world', 'your@email.com');"; else if (args.length == 8) newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", " + args[4] + ", " + args[5] + ", " + args[6] + ", '" + args[7] + "', 'your@email.com');"; + else if (args.length == 9) + newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", " + args[4] + ", " + args[5] + ", " + args[6] + ", '" + args[7] + "', '" + args[8] + "');"; else newline = ""; if (newline != "") diff --git a/src/main/java/fr/xephi/authme/converter/FlatToSqlite.java b/src/main/java/fr/xephi/authme/converter/FlatToSqlite.java index 613a1b4aa..550f16939 100644 --- a/src/main/java/fr/xephi/authme/converter/FlatToSqlite.java +++ b/src/main/java/fr/xephi/authme/converter/FlatToSqlite.java @@ -73,6 +73,8 @@ public class FlatToSqlite { newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", " + args[4] + ", " + args[5] + ", " + args[6] + ", 'world', 'your@email.com');"; else if (args.length == 8) newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", " + args[4] + ", " + args[5] + ", " + args[6] + ", '" + args[7] + "', 'your@email.com');"; + else if (args.length == 9) + newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", " + args[4] + ", " + args[5] + ", " + args[6] + ", '" + args[7] + "', '" + args[8] + "');"; else newline = ""; if (newline != "") diff --git a/src/main/java/fr/xephi/authme/converter/RakamakConverter.java b/src/main/java/fr/xephi/authme/converter/RakamakConverter.java index 5c0c7c601..aa9348e72 100644 --- a/src/main/java/fr/xephi/authme/converter/RakamakConverter.java +++ b/src/main/java/fr/xephi/authme/converter/RakamakConverter.java @@ -94,12 +94,12 @@ public class RakamakConverter { String player = m.getKey(); String psw = playerPSW.get(player); String ip = playerIP.get(player); - newLine = player + ":" + psw + ":" + ip + ":1325376060:0:0:0"; + newLine = player + ":" + psw + ":" + ip + ":1325376060:0:0:0:world:your@email.com"; } else { String player = m.getKey(); String psw = playerPSW.get(player); String ip = "127.0.0.1"; - newLine = player + ":" + psw + ":" + ip + ":1325376060:0:0:0"; + newLine = player + ":" + psw + ":" + ip + ":1325376060:0:0:0:world:your@email.com"; } if (alreadyExist) outputDB.newLine(); outputDB.write(newLine); diff --git a/src/main/java/fr/xephi/authme/converter/newxAuthToFlat.java b/src/main/java/fr/xephi/authme/converter/newxAuthToFlat.java new file mode 100644 index 000000000..3cf336e83 --- /dev/null +++ b/src/main/java/fr/xephi/authme/converter/newxAuthToFlat.java @@ -0,0 +1,137 @@ +package fr.xephi.authme.converter; + +import java.io.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.command.CommandSender; + +import de.luricos.bukkit.xAuth.xAuth; +import de.luricos.bukkit.xAuth.database.Table; +import de.luricos.bukkit.xAuth.utils.xAuthLog; + +import fr.xephi.authme.AuthMe; +import fr.xephi.authme.api.API; +import fr.xephi.authme.cache.auth.PlayerAuth; +import fr.xephi.authme.datasource.DataSource; + +public class newxAuthToFlat extends Thread { + + public AuthMe instance; + public DataSource database; + public CommandSender sender; + + public newxAuthToFlat(AuthMe instance, DataSource database, CommandSender sender) { + this.instance = instance; + this.database = database; + this.sender = sender; + } + + public void run() { + convert(); + if (isAlive()) + interrupt(); + } + + public boolean convert() { + if (instance.getServer().getPluginManager().getPlugin("xAuth") == null) { + sender.sendMessage("[AuthMe] xAuth plugin not found"); + return false; + } + if (!(new File("./plugins/xAuth/xAuth.h2.db").exists())) { + sender.sendMessage("[AuthMe] xAuth H2 database not found, checking for MySQL or SQLite data..."); + } + List players = getXAuthPlayers(); + if (players == null || players.isEmpty()) { + sender.sendMessage("[AuthMe] Error while import xAuthPlayers"); + return false; + } + sender.sendMessage("[AuthMe] Starting import..."); + try { + for (int id : players) { + String pl = getIdPlayer(id); + String psw = getPassword(id); + if (psw != null && !psw.isEmpty() && pl != null) { + PlayerAuth auth = new PlayerAuth(pl, psw, "198.18.0.1", 0, "your@email.com", API.getPlayerRealName(pl)); + database.saveAuth(auth); + } + } + sender.sendMessage("[AuthMe] Successfull convert from xAuth database"); + } catch (Exception e) { + sender.sendMessage("[AuthMe] An error has been thrown while import xAuth database, the import hadn't fail but can be not complete "); + } + return true; + } + + public String getIdPlayer(int id) { + String realPass = ""; + Connection conn = xAuth.getPlugin().getDatabaseController().getConnection(); + PreparedStatement ps = null; + ResultSet rs = null; + try { + String sql = String.format("SELECT `playername` FROM `%s` WHERE `id` = ?", + xAuth.getPlugin().getDatabaseController().getTable(Table.ACCOUNT)); + ps = conn.prepareStatement(sql); + ps.setInt(1, id); + rs = ps.executeQuery(); + if (!rs.next()) + return null; + realPass = rs.getString("playername").toLowerCase(); + } catch (SQLException e) { + xAuthLog.severe("Failed to retrieve name for account: " + id, e); + return null; + } finally { + xAuth.getPlugin().getDatabaseController().close(conn, ps, rs); + } + return realPass; + } + + public List getXAuthPlayers() { + List xP = new ArrayList(); + Connection conn = xAuth.getPlugin().getDatabaseController().getConnection(); + PreparedStatement ps = null; + ResultSet rs = null; + try { + String sql = String.format("SELECT * FROM `%s`", + xAuth.getPlugin().getDatabaseController().getTable(Table.ACCOUNT)); + ps = conn.prepareStatement(sql); + rs = ps.executeQuery(); + while(rs.next()) { + xP.add(rs.getInt("id")); + } + } catch (SQLException e) { + xAuthLog.severe("Cannot import xAuthPlayers", e); + return new ArrayList(); + } finally { + xAuth.getPlugin().getDatabaseController().close(conn, ps, rs); + } + return xP; + } + + public String getPassword(int accountId) { + String realPass = ""; + Connection conn = xAuth.getPlugin().getDatabaseController().getConnection(); + PreparedStatement ps = null; + ResultSet rs = null; + try { + String sql = String.format("SELECT `password`, `pwtype` FROM `%s` WHERE `id` = ?", + xAuth.getPlugin().getDatabaseController().getTable(Table.ACCOUNT)); + ps = conn.prepareStatement(sql); + ps.setInt(1, accountId); + rs = ps.executeQuery(); + if (!rs.next()) + return null; + realPass = rs.getString("password"); + } catch (SQLException e) { + xAuthLog.severe("Failed to retrieve password hash for account: " + accountId, e); + return null; + } finally { + xAuth.getPlugin().getDatabaseController().close(conn, ps, rs); + } + return realPass; + } +} diff --git a/src/main/java/fr/xephi/authme/converter/xAuthToFlat.java b/src/main/java/fr/xephi/authme/converter/oldxAuthToFlat.java similarity index 81% rename from src/main/java/fr/xephi/authme/converter/xAuthToFlat.java rename to src/main/java/fr/xephi/authme/converter/oldxAuthToFlat.java index dbb3b4c48..738063702 100644 --- a/src/main/java/fr/xephi/authme/converter/xAuthToFlat.java +++ b/src/main/java/fr/xephi/authme/converter/oldxAuthToFlat.java @@ -15,6 +15,7 @@ import com.cypherx.xauth.database.Table; import com.cypherx.xauth.utils.xAuthLog; import fr.xephi.authme.AuthMe; +import fr.xephi.authme.api.API; import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.datasource.DataSource; @@ -23,17 +24,25 @@ import fr.xephi.authme.datasource.DataSource; * * @author Xephi59 */ -public class xAuthToFlat { +public class oldxAuthToFlat extends Thread { public AuthMe instance; public DataSource database; + public CommandSender sender; - public xAuthToFlat(AuthMe instance, DataSource database) { + public oldxAuthToFlat(AuthMe instance, DataSource database, CommandSender sender) { this.instance = instance; this.database = database; + this.sender = sender; + } + + public void run() { + convert(); + if (isAlive()) + interrupt(); } - public boolean convert(CommandSender sender) { + public boolean convert() { if (instance.getServer().getPluginManager().getPlugin("xAuth") == null) { sender.sendMessage("[AuthMe] xAuth plugin not found"); return false; @@ -47,15 +56,19 @@ public class xAuthToFlat { return false; } sender.sendMessage("[AuthMe] Starting import..."); - for (int id : players) { - String pl = getIdPlayer(id); - String psw = getPassword(id); - if (psw != null && !psw.isEmpty() && pl != null) { - PlayerAuth auth = new PlayerAuth(pl, psw, "198.18.0.1", 0); - database.saveAuth(auth); + try { + for (int id : players) { + String pl = getIdPlayer(id); + String psw = getPassword(id); + if (psw != null && !psw.isEmpty() && pl != null) { + PlayerAuth auth = new PlayerAuth(pl, psw, "198.18.0.1", 0, "your@email.com", API.getPlayerRealName(pl)); + database.saveAuth(auth); + } } + sender.sendMessage("[AuthMe] Successfull convert from xAuth database"); + } catch (Exception e) { + sender.sendMessage("[AuthMe] An error has been thrown while import xAuth database, the import hadn't fail but can be not complete "); } - sender.sendMessage("[AuthMe] Import done!"); return true; } diff --git a/src/main/java/fr/xephi/authme/datasource/FileDataSource.java b/src/main/java/fr/xephi/authme/datasource/FileDataSource.java index 0afdbab4c..e2925e6e3 100644 --- a/src/main/java/fr/xephi/authme/datasource/FileDataSource.java +++ b/src/main/java/fr/xephi/authme/datasource/FileDataSource.java @@ -11,6 +11,7 @@ import java.util.ArrayList; import java.util.List; import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.api.API; import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.settings.Settings; @@ -19,9 +20,10 @@ public class FileDataSource implements DataSource { /* file layout: * - * PLAYERNAME:HASHSUM:IP:LOGININMILLIESECONDS:LASTPOSX:LASTPOSY:LASTPOSZ:LASTPOSWORLD + * PLAYERNAME:HASHSUM:IP:LOGININMILLIESECONDS:LASTPOSX:LASTPOSY:LASTPOSZ:LASTPOSWORLD:EMAIL * * Old but compatible: + * PLAYERNAME:HASHSUM:IP:LOGININMILLIESECONDS:LASTPOSX:LASTPOSY:LASTPOSZ:LASTPOSWORLD * PLAYERNAME:HASHSUM:IP:LOGININMILLIESECONDS * PLAYERNAME:HASHSUM:IP * PLAYERNAME:HASHSUM @@ -71,7 +73,7 @@ public class FileDataSource implements DataSource { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(source, true)); - bw.write(auth.getNickname() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + ":" + auth.getQuitLocX() + ":" + auth.getQuitLocY() + ":" + auth.getQuitLocZ() + ":" + auth.getWorld() + "\n"); + bw.write(auth.getNickname() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + ":" + auth.getQuitLocX() + ":" + auth.getQuitLocY() + ":" + auth.getQuitLocZ() + ":" + auth.getWorld() + ":" + auth.getEmail() + "\n"); } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); return false; @@ -101,19 +103,23 @@ public class FileDataSource implements DataSource { if (args[0].equals(auth.getNickname())) { switch (args.length) { case 4: { - newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), 0, 0, 0, "world"); + newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), 0, 0, 0, "world", "your@email.com", API.getPlayerRealName(args[0])); break; } case 7: { - newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "world"); + newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "world", "your@email.com", API.getPlayerRealName(args[0])); break; } case 8: { - newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7]); + newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], "your@email.com", API.getPlayerRealName(args[0])); + break; + } + case 9: { + newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], args[8], API.getPlayerRealName(args[0])); break; } default: { - newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], 0, 0, 0, 0, "world"); + newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], 0, 0, 0, 0, "world", "your@email.com", API.getPlayerRealName(args[0])); break; } } @@ -154,19 +160,23 @@ public class FileDataSource implements DataSource { if (args[0].equals(auth.getNickname())) { switch (args.length) { case 4: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), 0, 0, 0, "world"); + newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), 0, 0, 0, "world", "your@email.com", API.getPlayerRealName(args[0])); break; } case 7: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "world"); + newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "world", "your@email.com", API.getPlayerRealName(args[0])); break; } case 8: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7]); + newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], "your@email.com", API.getPlayerRealName(args[0])); + break; + } + case 9: { + newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], args[8], API.getPlayerRealName(args[0])); break; } default: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), 0, 0, 0, "world"); + newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), 0, 0, 0, "world", "your@email.com", API.getPlayerRealName(args[0])); break; } } @@ -205,7 +215,7 @@ public class FileDataSource implements DataSource { while ((line = br.readLine()) != null) { String[] args = line.split(":"); if (args[0].equals(auth.getNickname())) { - newAuth = new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ(), auth.getWorld()); + newAuth = new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ(), auth.getWorld(), auth.getEmail(), API.getPlayerRealName(args[0])); break; } } @@ -407,15 +417,17 @@ public class FileDataSource implements DataSource { if (args[0].equals(user)) { switch (args.length) { case 2: - return new PlayerAuth(args[0], args[1], "198.18.0.1", 0); + return new PlayerAuth(args[0], args[1], "198.18.0.1", 0, "your@email.com", API.getPlayerRealName(args[0])); case 3: - return new PlayerAuth(args[0], args[1], args[2], 0); + return new PlayerAuth(args[0], args[1], args[2], 0, "your@email.com", API.getPlayerRealName(args[0])); case 4: - return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3])); + return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), "your@email.com", API.getPlayerRealName(args[0])); case 7: - return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "unavailableworld"); + return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "unavailableworld", "your@email.com", API.getPlayerRealName(args[0])); case 8: - return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7]); + return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], "your@email.com", API.getPlayerRealName(args[0])); + case 9: + return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], args[8], API.getPlayerRealName(args[0])); } } } @@ -446,7 +458,38 @@ public class FileDataSource implements DataSource { @Override public boolean updateEmail(PlayerAuth auth) { - return false; + if (!isAuthAvailable(auth.getNickname())) { + return false; + } + PlayerAuth newAuth = null; + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(source)); + String line = ""; + while ((line = br.readLine()) != null) { + String[] args = line.split(":"); + if (args[0].equals(auth.getNickname())) { + newAuth = new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], auth.getEmail(), API.getPlayerRealName(args[0])); + break; + } + } + } catch (FileNotFoundException ex) { + ConsoleLogger.showError(ex.getMessage()); + return false; + } catch (IOException ex) { + ConsoleLogger.showError(ex.getMessage()); + return false; + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ex) { + } + } + } + removeAuth(auth.getNickname()); + saveAuth(newAuth); + return true; } @Override @@ -511,12 +554,37 @@ public class FileDataSource implements DataSource { } catch (IOException ex) { } } - } + } } @Override public List getAllAuthsByEmail(String email) { - return new ArrayList(); + BufferedReader br = null; + List countEmail = new ArrayList(); + try { + br = new BufferedReader(new FileReader(source)); + String line; + while ((line = br.readLine()) != null) { + String[] args = line.split(":"); + if (args.length > 8 && args[8].equals(email)) { + countEmail.add(args[0]); + } + } + return countEmail; + } catch (FileNotFoundException ex) { + ConsoleLogger.showError(ex.getMessage()); + return new ArrayList(); + } catch (IOException ex) { + ConsoleLogger.showError(ex.getMessage()); + return new ArrayList(); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ex) { + } + } + } } @Override diff --git a/src/main/java/fr/xephi/authme/datasource/MySQLDataSource.java b/src/main/java/fr/xephi/authme/datasource/MySQLDataSource.java index 587735e37..73aa8ea03 100644 --- a/src/main/java/fr/xephi/authme/datasource/MySQLDataSource.java +++ b/src/main/java/fr/xephi/authme/datasource/MySQLDataSource.java @@ -4,6 +4,7 @@ import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource; import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.api.API; import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.datasource.MiniConnectionPoolManager.TimeoutException; import fr.xephi.authme.security.HashAlgorithm; @@ -177,14 +178,14 @@ public class MySQLDataSource implements DataSource { rs = pst.executeQuery(); if (rs.next()) { if (rs.getString(columnIp).isEmpty() ) { - return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "198.18.0.1", rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld),rs.getString(columnEmail)); + return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "198.18.0.1", rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld),rs.getString(columnEmail), API.getPlayerRealName(rs.getString(columnName))); } else { if(!columnSalt.isEmpty()){ if(!columnGroup.isEmpty()) - return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getInt(columnGroup), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail)); - else return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld),rs.getString(columnEmail)); + return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getInt(columnGroup), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), API.getPlayerRealName(rs.getString(columnName))); + else return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld),rs.getString(columnEmail), API.getPlayerRealName(rs.getString(columnName))); } else { - return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail)); + return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), API.getPlayerRealName(rs.getString(columnName))); } } } else { @@ -209,7 +210,7 @@ public class MySQLDataSource implements DataSource { PreparedStatement pst = null; try { con = makeSureConnectionIsReady(); - if ((columnSalt.isEmpty() || columnSalt == null) && (auth.getSalt().isEmpty() || auth.getSalt() == null)) { + if ((columnSalt == null || columnSalt.isEmpty()) && (auth.getSalt() == null || auth.getSalt().isEmpty())) { pst = con.prepareStatement("INSERT INTO " + tableName + "(" + columnName + "," + columnPassword + "," + columnIp + "," + columnLastLogin + ") VALUES (?,?,?,?);"); pst.setString(1, auth.getNickname()); pst.setString(2, auth.getHash()); @@ -227,8 +228,8 @@ public class MySQLDataSource implements DataSource { } if (!columnOthers.isEmpty()) { for(String column : columnOthers) { - pst = con.prepareStatement("UPDATE " + tableName + " SET " + tableName + "." + column + "=? WHERE " + columnName + "=?;"); - pst.setString(1, auth.getNickname()); + pst = con.prepareStatement("UPDATE " + tableName + " SET " + column + "=? WHERE " + columnName + "=?;"); + pst.setString(1, auth.getRealname()); pst.setString(2, auth.getNickname()); pst.executeUpdate(); } @@ -241,12 +242,30 @@ public class MySQLDataSource implements DataSource { rs = pst.executeQuery(); if (rs.next()) { id = rs.getInt(columnID); + // Insert player in phpbb_user_group pst = con.prepareStatement("INSERT INTO " + Settings.getPhpbbPrefix + "user_group (group_id, user_id, group_leader, user_pending) VALUES (?,?,?,?);"); pst.setInt(1, Settings.getPhpbbGroup); pst.setInt(2, id); pst.setInt(3, 0); pst.setInt(4, 0); pst.executeUpdate(); + // Update player group in phpbb_users + pst = con.prepareStatement("UPDATE " + tableName + " SET " + tableName + ".group_id=? WHERE " + columnName + "=?;"); + pst.setInt(1, Settings.getPhpbbGroup); + pst.setString(2, auth.getNickname()); + pst.executeUpdate(); + // Get current time without ms + long time = System.currentTimeMillis()/1000; + // Update user_regdate + pst = con.prepareStatement("UPDATE " + tableName + " SET " + tableName + ".user_regdate=? WHERE " + columnName + "=?;"); + pst.setLong(1, time); + pst.setString(2, auth.getNickname()); + pst.executeUpdate(); + // Update user_lastvisit + pst = con.prepareStatement("UPDATE " + tableName + " SET " + tableName + ".user_lastvisit=? WHERE " + columnName + "=?;"); + pst.setLong(1, time); + pst.setString(2, auth.getNickname()); + pst.executeUpdate(); } } if (Settings.getPasswordHash == HashAlgorithm.WORDPRESS) { @@ -426,6 +445,9 @@ public class MySQLDataSource implements DataSource { while (rs.next()) { list.add(rs.getString(columnName)); } + pst = con.prepareStatement("DELETE FROM " + tableName + " WHERE " + columnLastLogin + " gameMode = new HashMap(); + public static HashMap joinMessage = new HashMap(); private Utils utils = Utils.getInstance(); private Messages m = Messages.getInstance(); public AuthMe plugin; private DataSource data; private FileCache playerBackup = new FileCache(); + public boolean causeByAuthMe = false; + private HashMap antibot = new HashMap(); public AuthMePlayerListener(AuthMe plugin, DataSource data) { this.plugin = plugin; @@ -384,6 +388,21 @@ public class AuthMePlayerListener implements Listener { return; } + if (Settings.enableProtection && !Settings.countries.isEmpty()) { + String code = plugin.getCountryCode(event.getAddress()); + if (((code == null) || (!Settings.countries.contains(code) && !API.isRegistered(name))) && !plugin.authmePermissible(player, "authme.bypassantibot")) { + event.disallow(PlayerLoginEvent.Result.KICK_OTHER, m._("country_banned")); + return; + } + } + + if (Settings.isKickNonRegisteredEnabled) { + if (!data.isAuthAvailable(name)) { + event.disallow(PlayerLoginEvent.Result.KICK_OTHER, m._("reg_only")); + return; + } + } + if (player.isOnline() && Settings.isForceSingleSessionEnabled) { event.disallow(PlayerLoginEvent.Result.KICK_OTHER, m._("same_nick")); return; @@ -442,11 +461,19 @@ public class AuthMePlayerListener implements Listener { return; } - if (Settings.isKickNonRegisteredEnabled) { - if (!data.isAuthAvailable(name)) { - event.disallow(PlayerLoginEvent.Result.KICK_OTHER, m._("reg_only")); - return; + if (event.getResult() == PlayerLoginEvent.Result.ALLOWED) { + checkAntiBotMod(event); + if (Settings.bungee) { + final ByteArrayOutputStream b = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(b); + + try { + out.writeUTF("IP"); + } catch (IOException e) { + } + player.sendPluginMessage(plugin, "BungeeCord", b.toByteArray()); } + return; } if (event.getResult() != PlayerLoginEvent.Result.KICK_FULL) return; if (player.isBanned()) return; @@ -467,34 +494,38 @@ public class AuthMePlayerListener implements Listener { } else { ConsoleLogger.info("The player " + player.getName() + " wants to join, but the server is full"); event.disallow(Result.KICK_FULL, m._("kick_fullserver")); + return; } } } - @EventHandler(priority = EventPriority.LOWEST) - public void onPlayerLowestJoin(PlayerJoinEvent event) { - if (event.getPlayer() == null) return; - final Player player = event.getPlayer(); - - if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { - return; - } - - if (Settings.bungee) { - final ByteArrayOutputStream b = new ByteArrayOutputStream(); - DataOutputStream out = new DataOutputStream(b); - - try { - out.writeUTF("IP"); - } catch (IOException e) { - } - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() { - @Override - public void run() { - player.sendPluginMessage(plugin, "BungeeCord", b.toByteArray()); - } - }); - } + private void checkAntiBotMod(final PlayerLoginEvent event) { + if (plugin.delayedAntiBot || plugin.antibotMod) + return; + if (plugin.authmePermissible(event.getPlayer(), "authme.bypassantibot")) + return; + if (antibot.keySet().size() > Settings.antiBotSensibility) { + plugin.switchAntiBotMod(true); + Bukkit.broadcastMessage(m._("antibot_auto_enabled")); + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable(){ + @Override + public void run() { + if (plugin.antibotMod) { + plugin.switchAntiBotMod(false); + antibot.clear(); + Bukkit.broadcastMessage(m._("antibot_auto_disabled").replace("%m", "" + Settings.antiBotDuration)); + } + } + }, Settings.antiBotDuration * 1200); + return; + } + antibot.put(event.getPlayer().getName().toLowerCase(), event); + Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable(){ + @Override + public void run() { + antibot.remove(event.getPlayer().getName().toLowerCase()); + } + }, 300); } @EventHandler(priority = EventPriority.HIGHEST) @@ -510,14 +541,16 @@ public class AuthMePlayerListener implements Listener { final String name = player.getName().toLowerCase(); gameMode.put(name, gm); BukkitScheduler sched = plugin.getServer().getScheduler(); - final PlayerJoinEvent e = event; if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { return; } - if (plugin.ess != null && Settings.disableSocialSpy) - plugin.ess.getUser(player.getName()).setSocialSpyEnabled(false); + if (plugin.ess != null && Settings.disableSocialSpy) { + try { + plugin.ess.getUser(player.getName()).setSocialSpyEnabled(false); + } catch (Exception e) {} + } String ip = player.getAddress().getAddress().getHostAddress(); if (Settings.bungee) { @@ -526,7 +559,9 @@ public class AuthMePlayerListener implements Listener { } if(Settings.isAllowRestrictedIp && !Settings.getRestrictedIp(name, ip)) { int gM = gameMode.get(name); + this.causeByAuthMe = true; player.setGameMode(GameMode.getByValue(gM)); + this.causeByAuthMe = false; player.kickPlayer("You are not the Owner of this account, please try another name!"); if (Settings.banUnsafeIp) plugin.getServer().banIP(ip); @@ -550,22 +585,25 @@ public class AuthMePlayerListener implements Listener { return; } else if (!Settings.sessionExpireOnIpChange){ int gM = gameMode.get(name); + this.causeByAuthMe = true; player.setGameMode(GameMode.getByValue(gM)); + this.causeByAuthMe = false; player.kickPlayer(m._("unvalid_session")); return; } else if (auth.getNickname().equalsIgnoreCase(name)){ - if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) - sched.scheduleSyncDelayedTask(plugin, new Runnable() { - public void run() { - e.getPlayer().setGameMode(GameMode.SURVIVAL); - } - }); + if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) { + this.causeByAuthMe = true; + Utils.forceGM(player); + this.causeByAuthMe = false; + } //Player change his IP between 2 relog-in PlayerCache.getInstance().removePlayer(name); LimboCache.getInstance().addLimboPlayer(player , utils.removeAll(player)); } else { int gM = gameMode.get(name); + this.causeByAuthMe = true; player.setGameMode(GameMode.getByValue(gM)); + this.causeByAuthMe = false; player.kickPlayer(m._("unvalid_session")); return; } @@ -576,8 +614,11 @@ public class AuthMePlayerListener implements Listener { } } // isent in session or session was ended correctly - if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) - e.getPlayer().setGameMode(GameMode.SURVIVAL); + if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) { + this.causeByAuthMe = true; + Utils.forceGM(player); + this.causeByAuthMe = false; + } if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) { SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name)); plugin.getServer().getPluginManager().callEvent(tpEvent); @@ -593,8 +634,11 @@ public class AuthMePlayerListener implements Listener { DataFileCache dataFile = new DataFileCache(LimboCache.getInstance().getLimboPlayer(name).getInventory(),LimboCache.getInstance().getLimboPlayer(name).getArmour()); playerBackup.createCache(name, dataFile, LimboCache.getInstance().getLimboPlayer(name).getGroup(),LimboCache.getInstance().getLimboPlayer(name).getOperator(),LimboCache.getInstance().getLimboPlayer(name).isFlying()); } else { - if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) - e.getPlayer().setGameMode(GameMode.SURVIVAL); + if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) { + this.causeByAuthMe = true; + Utils.forceGM(player); + this.causeByAuthMe = false; + } if(!Settings.unRegisteredGroup.isEmpty()){ utils.setGroup(player, Utils.groupType.UNREGISTERED); } @@ -643,6 +687,10 @@ public class AuthMePlayerListener implements Listener { player.setNoDamageTicks(Settings.getRegistrationTimeout * 20); if (Settings.useEssentialsMotd) player.performCommand("motd"); + + // Remove the join message while the player isn't logging in + joinMessage.put(name, event.getJoinMessage()); + event.setJoinMessage(null); } private void placePlayerSafely(Player player, Location spawnLoc) { @@ -688,7 +736,9 @@ public class AuthMePlayerListener implements Listener { } } catch (NullPointerException npe) { } } - } + } else { + event.setQuitMessage(null); + } if (LimboCache.getInstance().hasLimboPlayer(name)) { LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); @@ -762,6 +812,8 @@ public class AuthMePlayerListener implements Listener { }); } } catch (NullPointerException npe) { } + } else if (!PlayerCache.getInstance().isAuthenticated(name)){ + event.setLeaveMessage(null); } if (LimboCache.getInstance().hasLimboPlayer(name)) @@ -1040,12 +1092,48 @@ public class AuthMePlayerListener implements Listener { if (!data.isAuthAvailable(name)) if (!Settings.isForcedRegistrationEnabled) return; - - if (!Settings.isTeleportToSpawnEnabled && !Settings.isForceSpawnLocOnJoinEnabled) - return; Location spawn = plugin.getSpawnLocation(player.getWorld()); + if(Settings.isSaveQuitLocationEnabled && data.isAuthAvailable(name)) { + final PlayerAuth auth = new PlayerAuth(name,spawn.getBlockX(),spawn.getBlockY(),spawn.getBlockZ(),spawn.getWorld().getName()); + try { + data.updateQuitLoc(auth); + } catch (NullPointerException npe) { } + } event.setRespawnLocation(spawn); } + @EventHandler (priority = EventPriority.HIGHEST) + public void onPlayerGameModeChange(PlayerGameModeChangeEvent event) { + if (event.isCancelled()) + return; + if (event.getPlayer() == null || event == null) + return; + if (!Settings.isForceSurvivalModeEnabled) + return; + + Player player = event.getPlayer(); + + if (plugin.authmePermissible(player, "authme.bypassforcesurvival")) + return; + + String name = player.getName().toLowerCase(); + + if (Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) + return; + + if(plugin.getCitizensCommunicator().isNPC(player, plugin)) + return; + + if (PlayerCache.getInstance().isAuthenticated(name)) + return; + + if (!data.isAuthAvailable(name)) + if (!Settings.isForcedRegistrationEnabled) + return; + + if (this.causeByAuthMe) + return; + event.setCancelled(true); + } } diff --git a/src/main/java/fr/xephi/authme/plugin/manager/BungeeCordMessage.java b/src/main/java/fr/xephi/authme/plugin/manager/BungeeCordMessage.java index d64e3c9f6..8d533eb37 100644 --- a/src/main/java/fr/xephi/authme/plugin/manager/BungeeCordMessage.java +++ b/src/main/java/fr/xephi/authme/plugin/manager/BungeeCordMessage.java @@ -20,10 +20,15 @@ public class BungeeCordMessage implements PluginMessageListener { @Override public void onPluginMessageReceived(String channel, Player player, byte[] message) { + if (!channel.equals("BungeeCord")) { + return; + } try { final DataInputStream in = new DataInputStream(new ByteArrayInputStream(message)); - if (in.readUTF().equals("IP")) { //We need only the IP channel - plugin.realIp.put(player.getName().toLowerCase(), in.readUTF()); //Put the IP (only the ip not the port) in the hashmap + String subchannel = in.readUTF(); + if (subchannel.equals("IP")) { //We need only the IP channel + String ip = in.readUTF(); + plugin.realIp.put(player.getName().toLowerCase(), ip); //Put the IP (only the ip not the port) in the hashmap } } catch (IOException ex) { } diff --git a/src/main/java/fr/xephi/authme/security/HashAlgorithm.java b/src/main/java/fr/xephi/authme/security/HashAlgorithm.java index 65ec13274..fd8b56328 100644 --- a/src/main/java/fr/xephi/authme/security/HashAlgorithm.java +++ b/src/main/java/fr/xephi/authme/security/HashAlgorithm.java @@ -36,4 +36,5 @@ public enum HashAlgorithm { public Class getclass() { return classe; } + } \ No newline at end of file diff --git a/src/main/java/fr/xephi/authme/security/PasswordSecurity.java b/src/main/java/fr/xephi/authme/security/PasswordSecurity.java index ff963ddab..718929f1f 100644 --- a/src/main/java/fr/xephi/authme/security/PasswordSecurity.java +++ b/src/main/java/fr/xephi/authme/security/PasswordSecurity.java @@ -6,6 +6,8 @@ import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.HashMap; +import org.bukkit.Bukkit; + import fr.xephi.authme.AuthMe; import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.events.PasswordEncryptionEvent; @@ -19,7 +21,7 @@ public class PasswordSecurity { private static SecureRandom rnd = new SecureRandom(); public static HashMap userSalt = new HashMap(); - private static String createSalt(int length) throws NoSuchAlgorithmException { + public static String createSalt(int length) throws NoSuchAlgorithmException { byte[] msg = new byte[40]; rnd.nextBytes(msg); MessageDigest sha1 = MessageDigest.getInstance("SHA1"); @@ -41,64 +43,68 @@ public class PasswordSecurity { } String salt = ""; switch (alg) { - case MD5: - case SHA1: - case WHIRLPOOL: - case PHPBB: - case PLAINTEXT: - case XENFORO: - case SHA512: - case DOUBLEMD5: - case WORDPRESS: - case CUSTOM: - break; - case SHA256: - salt = createSalt(16); - break; - case MD5VB: - salt = createSalt(16); - break; - case XAUTH: - salt = createSalt(12); - break; - case MYBB: - salt = createSalt(8); - userSalt.put(playerName, salt); - break; - case IPB3: - salt = createSalt(5); - userSalt.put(playerName, salt); - break; - case PHPFUSION: - salt = createSalt(12); - userSalt.put(playerName, salt); - break; - case SALTED2MD5: - salt = createSalt(Settings.saltLength); - userSalt.put(playerName, salt); - break; - case JOOMLA: - salt = createSalt(32); - userSalt.put(playerName, salt); - break; - case BCRYPT: - salt = BCRYPT.gensalt(Settings.bCryptLog2Rounds); - userSalt.put(playerName, salt); - break; - case WBB3: - salt = createSalt(40); - userSalt.put(playerName, salt); - break; - case PBKDF2: - salt = createSalt(12); - userSalt.put(playerName, salt); - break; - case SMF: - return method.getHash(password, playerName.toLowerCase()); - default: - throw new NoSuchAlgorithmException("Unknown hash algorithm"); + case SHA256: + salt = createSalt(16); + break; + case MD5VB: + salt = createSalt(16); + break; + case XAUTH: + salt = createSalt(12); + break; + case MYBB: + salt = createSalt(8); + userSalt.put(playerName, salt); + break; + case IPB3: + salt = createSalt(5); + userSalt.put(playerName, salt); + break; + case PHPFUSION: + salt = createSalt(12); + userSalt.put(playerName, salt); + break; + case SALTED2MD5: + salt = createSalt(Settings.saltLength); + userSalt.put(playerName, salt); + break; + case JOOMLA: + salt = createSalt(32); + userSalt.put(playerName, salt); + break; + case BCRYPT: + salt = BCRYPT.gensalt(Settings.bCryptLog2Rounds); + userSalt.put(playerName, salt); + break; + case WBB3: + salt = createSalt(40); + userSalt.put(playerName, salt); + break; + case PBKDF2: + salt = createSalt(12); + userSalt.put(playerName, salt); + break; + case SMF: + return method.getHash(password, playerName.toLowerCase()); + case PHPBB: + salt = createSalt(16); + userSalt.put(playerName, salt); + break; + case MD5: + case SHA1: + case WHIRLPOOL: + case PLAINTEXT: + case XENFORO: + case SHA512: + case DOUBLEMD5: + case WORDPRESS: + case CUSTOM: + break; + default: + throw new NoSuchAlgorithmException("Unknown hash algorithm"); } PasswordEncryptionEvent event = new PasswordEncryptionEvent(method, playerName); + Bukkit.getPluginManager().callEvent(event); method = event.getMethod(); if (method == null) throw new NoSuchAlgorithmException("Unknown hash algorithm"); @@ -118,6 +124,7 @@ public class PasswordSecurity { throw new NoSuchAlgorithmException("Problem with this hash algorithm"); } PasswordEncryptionEvent event = new PasswordEncryptionEvent(method, playerName); + Bukkit.getPluginManager().callEvent(event); method = event.getMethod(); if (method == null) throw new NoSuchAlgorithmException("Unknown hash algorithm"); @@ -136,8 +143,9 @@ public class PasswordSecurity { private static boolean compareWithAllEncryptionMethod(String password, String hash, String playerName) throws NoSuchAlgorithmException { for (HashAlgorithm algo : HashAlgorithm.values()) { try { - if (algo != HashAlgorithm.CUSTOM) - if (((EncryptionMethod) algo.getclass().newInstance()).comparePassword(hash, password, playerName)) { + EncryptionMethod method = (EncryptionMethod) algo.getclass().newInstance(); + if (algo != HashAlgorithm.CUSTOM) { + if (method.comparePassword(hash, password, playerName)) { PlayerAuth nAuth = AuthMe.getInstance().database.getAuth(playerName); if (nAuth != null) { nAuth.setHash(getHash(Settings.getPasswordHash, password, playerName)); @@ -147,9 +155,8 @@ public class PasswordSecurity { } return true; } - } catch (InstantiationException e) { - } catch (IllegalAccessException e) { - } + } + } catch (Exception e) {} } return false; } diff --git a/src/main/java/fr/xephi/authme/security/crypts/BCRYPT.java b/src/main/java/fr/xephi/authme/security/crypts/BCRYPT.java index d0077fd00..da64eb131 100644 --- a/src/main/java/fr/xephi/authme/security/crypts/BCRYPT.java +++ b/src/main/java/fr/xephi/authme/security/crypts/BCRYPT.java @@ -18,9 +18,6 @@ import java.io.UnsupportedEncodingException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; -import fr.xephi.authme.AuthMe; - - /** * BCrypt implements OpenBSD-style Blowfish password hashing using * the scheme described in "A Future-Adaptable Password Scheme" by @@ -762,7 +759,6 @@ public class BCRYPT implements EncryptionMethod { @Override public boolean comparePassword(String hash, String password, String playerName) throws NoSuchAlgorithmException { - String salt = AuthMe.getInstance().database.getAuth(playerName).getSalt(); - return hash.equals(hashpw(password, salt)); + return checkpw(password, hash); } } diff --git a/src/main/java/fr/xephi/authme/security/crypts/PHPBB.java b/src/main/java/fr/xephi/authme/security/crypts/PHPBB.java index 207b21407..f85ff0215 100644 --- a/src/main/java/fr/xephi/authme/security/crypts/PHPBB.java +++ b/src/main/java/fr/xephi/authme/security/crypts/PHPBB.java @@ -18,14 +18,14 @@ public class PHPBB implements EncryptionMethod { private String itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - public String phpbb_hash(String password) { - String random_state = unique_id(); + public String phpbb_hash(String password, String salt) { + String random_state = salt; String random = ""; int count = 6; if (random.length() < count) { random = ""; for (int i = 0; i < count; i += 16) { - random_state = md5(unique_id() + random_state); + random_state = md5(salt + random_state); random += pack(md5(random_state)); } random = random.substring(0, count); @@ -37,15 +37,6 @@ public class PHPBB implements EncryptionMethod { return md5(password); } - private String unique_id() { - return unique_id("c"); - } - - private String unique_id(String extra) { - //TODO: Maybe check the salt? - return "1234567890abcdef"; - } - private String _hash_gensalt_private(String input, String itoa64) { return _hash_gensalt_private(input, itoa64, 6); } @@ -162,7 +153,7 @@ private String _hash_gensalt_private( @Override public String getHash(String password, String salt) throws NoSuchAlgorithmException { - return phpbb_hash(password); + return phpbb_hash(password, salt); } @Override diff --git a/src/main/java/fr/xephi/authme/security/crypts/WHIRLPOOL.java b/src/main/java/fr/xephi/authme/security/crypts/WHIRLPOOL.java index 54934a58f..d82b48406 100644 --- a/src/main/java/fr/xephi/authme/security/crypts/WHIRLPOOL.java +++ b/src/main/java/fr/xephi/authme/security/crypts/WHIRLPOOL.java @@ -61,8 +61,6 @@ import java.security.NoSuchAlgorithmException; import java.util.Arrays; public class WHIRLPOOL implements EncryptionMethod { - - public WHIRLPOOL() {} /** * The message digest size (in bits) @@ -181,6 +179,9 @@ public class WHIRLPOOL implements EncryptionMethod { protected long[] block = new long[8]; protected long[] state = new long[8]; + public WHIRLPOOL() { + } + /** * The core Whirlpool transform. */ diff --git a/src/main/java/fr/xephi/authme/security/crypts/XAUTH.java b/src/main/java/fr/xephi/authme/security/crypts/XAUTH.java index 47d7377df..59af0eb9d 100644 --- a/src/main/java/fr/xephi/authme/security/crypts/XAUTH.java +++ b/src/main/java/fr/xephi/authme/security/crypts/XAUTH.java @@ -7,8 +7,7 @@ public class XAUTH implements EncryptionMethod { @Override public String getHash(String password, String salt) throws NoSuchAlgorithmException { - WHIRLPOOL w = new WHIRLPOOL(); - String hash = w.getHash((salt + password).toLowerCase(), ""); + String hash = getWhirlpool(salt + password).toLowerCase(); int saltPos = (password.length() >= hash.length() ? hash.length() - 1 : password.length()); return hash.substring(0, saltPos) + salt + hash.substring(saltPos); } @@ -21,4 +20,13 @@ public class XAUTH implements EncryptionMethod { return hash.equals(getHash(password, salt)); } + public static String getWhirlpool(String message) { + WHIRLPOOL w = new WHIRLPOOL(); + byte[] digest = new byte[WHIRLPOOL.DIGESTBYTES]; + w.NESSIEinit(); + w.NESSIEadd(message); + w.NESSIEfinalize(digest); + return WHIRLPOOL.display(digest); + } + } diff --git a/src/main/java/fr/xephi/authme/settings/Messages.java b/src/main/java/fr/xephi/authme/settings/Messages.java index 5d9a1b76e..80cebbd4e 100644 --- a/src/main/java/fr/xephi/authme/settings/Messages.java +++ b/src/main/java/fr/xephi/authme/settings/Messages.java @@ -1,73 +1,64 @@ package fr.xephi.authme.settings; import java.io.File; +import java.io.InputStream; + +import org.bukkit.configuration.file.YamlConfiguration; + +import fr.xephi.authme.AuthMe; public class Messages extends CustomConfiguration { private static Messages singleton = null; - public Messages() { - super(new File(Settings.MESSAGE_FILE+"_"+Settings.messagesLanguage+".yml")); - loadDefaults(); + public Messages(File file) { + super(file); + loadDefaults(file); loadFile(); + saveDefaults(file); singleton = this; } - private void loadDefaults() { - this.set("logged_in", "&cAlready logged in!"); - this.set("not_logged_in", "&cNot logged in!"); - this.set("reg_disabled", "&cRegistration is disabled"); - this.set("user_regged", "&cUsername already registered"); - this.set("usage_reg", "&cUsage: /register password ConfirmPassword"); - this.set("usage_log", "&cUsage: /login password"); - this.set("user_unknown", "&cUsername not registered"); - this.set("pwd_changed", "&cPassword changed!"); - this.set("reg_only", "&fRegistered players only! Please visit http://example.com to register"); - this.set("valid_session", "&cSession login"); - this.set("login_msg", "&cPlease login with \"/login password\""); - this.set("reg_msg", "&cPlease register with \"/register password ConfirmPassword\""); - this.set("reg_email_msg", "&cPlease register with \"/register \""); - this.set("timeout", "&fLogin Timeout"); - this.set("wrong_pwd", "&cWrong password"); - this.set("logout", "&cSuccessful logout"); - this.set("usage_unreg", "&cUsage: /unregister password"); - this.set("registered", "&cSuccessfully registered!"); - this.set("unregistered", "&cSuccessfully unregistered!"); - this.set("login", "&cSuccessful login!"); - this.set("no_perm", "&cNo Permission"); - this.set("same_nick", "&fSame nick is already playing"); - this.set("reg_voluntarily", "&fYou can register your nickname with the server with the command \"/register password ConfirmPassword\""); - this.set("reload", "&fConfiguration and database has been reloaded"); - this.set("error", "&fAn error ocurred; Please contact the admin"); - this.set("unknown_user", "&fUser is not in database"); - this.set("unsafe_spawn","&fYour Quit location was unsafe, teleporting you to World Spawn"); - this.set("unvalid_session","&fSession Dataes doesnt corrispond Plaese wait the end of session"); - this.set("max_reg","&fYou have Exceded the max number of Registration for your Account"); - this.set("password_error","&fPassword doesnt match"); - this.set("pass_len","&fYour password dind''t reach the minimum length or exeded the max length"); - this.set("vb_nonActiv","&fYour Account isent Activated yet check your Emails!"); - this.set("usage_changepassword", "&fUsage: /changepassword oldPassword newPassword"); - this.set("name_len", "&cYour nickname is too Short or too long"); - this.set("regex", "&cYour nickname contains illegal characters. Allowed chars: REG_EX"); - this.set("add_email","&cPlease add your email with : /email add yourEmail confirmEmail"); - this.set("bad_database_email", "[AuthMe] This /email command only available with MySQL and SQLite, contact an Admin"); - this.set("recovery_email", "&cForgot your password? Please use /email recovery "); - this.set("usage_captcha", "&cUsage: /captcha "); - this.set("wrong_captcha", "&cWrong Captcha, please use : /captcha THE_CAPTCHA"); - this.set("valid_captcha", "&cYour captcha is valid !"); - this.set("kick_forvip", "&cA VIP Player join the full server!"); - this.set("kick_fullserver", "&cThe server is actually full, Sorry!"); - this.set("usage_email_add", "&fUsage: /email add "); - this.set("usage_email_change", "&Usage: /email change "); - this.set("usage_email_recovery", "&Usage: /email recovery "); - this.set("email_add", "[AuthMe] /email add "); - this.set("new_email_invalid", "[AuthMe] New email invalid!"); - this.set("old_email_invalid", "[AuthMe] Old email invalid!"); - this.set("email_invalid", "[AuthMe] Invalid Email !"); - this.set("email_added", "[AuthMe] Email Added !"); - this.set("email_confirm", "[AuthMe] Confirm your Email !"); - this.set("email_changed", "[AuthMe] Email Change !"); - this.set("email_send", "[AuthMe] Recovery Email Send !"); + /** + * Loads a file from the plugin jar and sets as default + * + * @param filename The filename to open + */ + public final void loadDefaults(File file) { + InputStream stream = AuthMe.getInstance().getResource(file.getName()); + if(stream == null) return; + + setDefaults(YamlConfiguration.loadConfiguration(stream)); + } + + /** + * Saves the configuration to disk + * + * @return True if saved successfully + */ + public final boolean saved(File file) { + try { + save(file); + return true; + } catch (Exception ex) { + return false; + } + } + + /** + * Saves current configuration (plus defaults) to disk. + * + * If defaults and configuration are empty, saves blank file. + * + * @return True if saved successfully + */ + public final boolean saveDefaults(File file) { + options().copyDefaults(true); + options().copyHeader(true); + boolean success = saved(file); + options().copyDefaults(false); + options().copyHeader(false); + return success; } private void loadFile() { @@ -76,23 +67,24 @@ public class Messages extends CustomConfiguration { } public String _(String msg) { - String loc = (String) this.get(msg); + String loc = (String) this.get(msg, this.getDefault(msg)); if (loc != null) { return loc.replace("&", "\u00a7"); } if (loc == null && !contains(msg)) { set(msg, this.getDefault(msg)); save(); - loc = (String) this.get(msg); + load(); + loc = (String) this.get(msg, this.getDefault(msg)); } if (loc == null) - return "Error with Translation files; Please contact the admin"; + return "Error with Translation files; Please contact the admin "; return loc.replace("&", "\u00a7"); } public static Messages getInstance() { if (singleton == null) { - singleton = new Messages(); + singleton = new Messages(new File(Settings.MESSAGE_FILE+"_"+Settings.messagesLanguage+".yml")); } return singleton; } diff --git a/src/main/java/fr/xephi/authme/settings/Settings.java b/src/main/java/fr/xephi/authme/settings/Settings.java index 5a2be8391..ce99352dc 100644 --- a/src/main/java/fr/xephi/authme/settings/Settings.java +++ b/src/main/java/fr/xephi/authme/settings/Settings.java @@ -29,8 +29,10 @@ public final class Settings extends YamlConfiguration { private static List getRestrictedIp; public static List getMySQLOtherUsernameColumn = null; public static List getForcedWorlds = null; + public static List countries = null; + public static List forceCommands = null; public final Plugin plugin; - private final File file; + private final File file; public static DataSourceType getDataSource; public static HashAlgorithm getPasswordHash; public static HashAlgorithm rakamakHash; @@ -39,13 +41,14 @@ public final class Settings extends YamlConfiguration { public static Boolean isPermissionCheckEnabled, isRegistrationEnabled, isForcedRegistrationEnabled, isTeleportToSpawnEnabled, isSessionsEnabled, isChatAllowed, isAllowRestrictedIp, isMovementAllowed, isKickNonRegisteredEnabled, isForceSingleSessionEnabled, - isForceSpawnLocOnJoinEnabled, isForceExactSpawnEnabled, isSaveQuitLocationEnabled, + isForceSpawnLocOnJoinEnabled, isSaveQuitLocationEnabled, isForceSurvivalModeEnabled, isResetInventoryIfCreative, isCachingEnabled, isKickOnWrongPasswordEnabled, getEnablePasswordVerifier, protectInventoryBeforeLogInEnabled, isBackupActivated, isBackupOnStart, isBackupOnStop, enablePasspartu, isStopEnabled, reloadSupport, rakamakUseIp, noConsoleSpam, removePassword, displayOtherAccounts, useCaptcha, emailRegistration, multiverse, notifications, chestshop, bungee, banUnsafeIp, doubleEmailCheck, sessionExpireOnIpChange, disableSocialSpy, useMultiThreading, forceOnlyAfterLogin, useEssentialsMotd, - usePurge, purgePlayerDat, purgeEssentialsFile, supportOldPassword; + usePurge, purgePlayerDat, purgeEssentialsFile, supportOldPassword, purgeLimitedCreative, + purgeAntiXray, purgePermissions, enableProtection, enableAntiBot; public static String getNickRegex, getUnloggedinGroup, getMySQLHost, getMySQLPort, getMySQLUsername, getMySQLPassword, getMySQLDatabase, getMySQLTablename, @@ -59,7 +62,7 @@ public final class Settings extends YamlConfiguration { public static int getWarnMessageInterval, getSessionTimeout, getRegistrationTimeout, getMaxNickLength, getMinNickLength, getPasswordMinLen, getMovementRadius, getmaxRegPerIp, getNonActivatedGroup, passwordMaxLength, getRecoveryPassLength, getMailPort, maxLoginTry, captchaLength, saltLength, getmaxRegPerEmail, - bCryptLog2Rounds, purgeDelay, getPhpbbGroup; + bCryptLog2Rounds, purgeDelay, getPhpbbGroup, antiBotSensibility, antiBotDuration; protected static YamlConfiguration configFile; @@ -187,7 +190,7 @@ public void loadConfigOptions() { chestshop = configFile.getBoolean("Hooks.chestshop", true); notifications = configFile.getBoolean("Hooks.notifications", true); bungee = configFile.getBoolean("Hooks.bungeecord", false); - getForcedWorlds = (List) configFile.getList("settings.restrictions.ForceSpawnOnTheseWorlds"); + getForcedWorlds = (List) configFile.getList("settings.restrictions.ForceSpawnOnTheseWorlds", new ArrayList()); banUnsafeIp = configFile.getBoolean("settings.restrictions.banUnsafedIP", false); doubleEmailCheck = configFile.getBoolean("settings.registration.doubleEmailCheck", false); sessionExpireOnIpChange = configFile.getBoolean("settings.sessions.sessionExpireOnIpChange", false); @@ -206,6 +209,15 @@ public void loadConfigOptions() { getPhpbbGroup = configFile.getInt("ExternalBoardOptions.phpbbActivatedGroupId", 2); supportOldPassword = configFile.getBoolean("settings.security.supportOldPasswordHash", false); getWordPressPrefix = configFile.getString("ExternalBoardOptions.wordpressTablePrefix", "wp_"); + purgeLimitedCreative = configFile.getBoolean("Purge.removeLimitedCreativesInventories", false); + purgeAntiXray = configFile.getBoolean("Purge.removeAntiXRayFile", false); + //purgePermissions = configFile.getBoolean("Purge.removePermissions", false); + enableProtection = configFile.getBoolean("Protection.enableProtection", false); + countries = (List) configFile.getList("Protection.countries", new ArrayList()); + enableAntiBot = configFile.getBoolean("Protection.enableAntiBot", false); + antiBotSensibility = configFile.getInt("Protection.antiBotSensibility", 5); + antiBotDuration = configFile.getInt("Protection.antiBotDuration", 10); + forceCommands = (List) configFile.getList("settings.forceCommands", new ArrayList()); saveDefaults(); } @@ -339,6 +351,15 @@ public static void reloadConfigOptions(YamlConfiguration newConfig) { getPhpbbGroup = configFile.getInt("ExternalBoardOptions.phpbbActivatedGroupId", 2); supportOldPassword = configFile.getBoolean("settings.security.supportOldPasswordHash", false); getWordPressPrefix = configFile.getString("ExternalBoardOptions.wordpressTablePrefix", "wp_"); + purgeLimitedCreative = configFile.getBoolean("Purge.removeLimitedCreativesInventories", false); + purgeAntiXray = configFile.getBoolean("Purge.removeAntiXRayFile", false); + //purgePermissions = configFile.getBoolean("Purge.removePermissions", false); + enableProtection = configFile.getBoolean("Protection.enableProtection", false); + countries = (List) configFile.getList("Protection.countries"); + enableAntiBot = configFile.getBoolean("Protection.enableAntiBot", false); + antiBotSensibility = configFile.getInt("Protection.antiBotSensibility", 5); + antiBotDuration = configFile.getInt("Protection.antiBotDuration", 10); + forceCommands = (List) configFile.getList("settings.forceCommands", new ArrayList()); } public void mergeConfig() { @@ -433,7 +454,29 @@ public void mergeConfig() { set("Xenoforo.predefinedSalt", null); if(configFile.getString("settings.security.passwordHash","SHA256").toUpperCase().equals("XFSHA1") || configFile.getString("settings.security.passwordHash","SHA256").toUpperCase().equals("XFSHA256")) set("settings.security.passwordHash", "XENFORO"); - + if(!contains("Purge.removeLimitedCreativesInventories")) + set("Purge.removeLimitedCreativesInventories", false); + if(!contains("Purge.removeAntiXRayFile")) + set("Purge.removeAntiXRayFile", false); + /*if(!contains("Purge.removePermissions")) + set("Purge.removePermissions", false);*/ + if(!contains("Protection.enableProtection")) + set("Protection.enableProtection", false); + if(!contains("Protection.countries")) { + countries = new ArrayList(); + countries.add("US"); + countries.add("GB"); + set("Protection.countries", countries); + } + if(!contains("Protection.enableAntiBot")) + set("Protection.enableAntiBot", false); + if(!contains("Protection.antiBotSensibility")) + set("Protection.antiBotSensibility", 5); + if(!contains("Protection.antiBotDuration")) + set("Protection.antiBotDuration", 10); + if(!contains("settings.forceCommands")) + set("settings.forceCommands", new ArrayList()); + plugin.getLogger().info("Merge new Config Options if needed.."); plugin.saveConfig(); @@ -581,11 +624,11 @@ public void mergeConfig() { setDefaults(new MemoryConfiguration()); } -/** -* Check loaded defaults against current configuration -* -* @return false When all defaults aren't present in config -*/ + /** + * Check loaded defaults against current configuration + * + * @return false When all defaults aren't present in config + */ public boolean checkDefaults() { if (getDefaults() == null) { return true; @@ -604,8 +647,14 @@ public void mergeConfig() { return "en"; } - public enum messagesLang { - en, de, br, cz, pl, fr, ru, hu, sk, es, zhtw, fi, zhcn, lt, it, ko, pt + public static void switchAntiBotMod(boolean mode) { + if (mode) + isKickNonRegisteredEnabled = true; + else + isKickNonRegisteredEnabled = configFile.getBoolean("settings.restrictions.kickNonRegistered",false); } + public enum messagesLang { + en, de, br, cz, pl, fr, ru, hu, sk, es, zhtw, fi, zhcn, lt, it, ko, pt, nl + } } diff --git a/src/main/java/fr/xephi/authme/task/MessageTask.java b/src/main/java/fr/xephi/authme/task/MessageTask.java index 34171e77d..b0aaf3321 100644 --- a/src/main/java/fr/xephi/authme/task/MessageTask.java +++ b/src/main/java/fr/xephi/authme/task/MessageTask.java @@ -25,9 +25,9 @@ public class MessageTask implements Runnable { @Override public void run() { - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(name)) return; - } + for (Player player : plugin.getServer().getOnlinePlayers()) { if (player.getName().toLowerCase().equals(name)) { player.sendMessage(msg); diff --git a/src/main/java/fr/xephi/authme/task/TimeoutTask.java b/src/main/java/fr/xephi/authme/task/TimeoutTask.java index 22ef7ab92..9762a385c 100644 --- a/src/main/java/fr/xephi/authme/task/TimeoutTask.java +++ b/src/main/java/fr/xephi/authme/task/TimeoutTask.java @@ -32,13 +32,14 @@ public class TimeoutTask implements Runnable { @Override public void run() { - if (PlayerCache.getInstance().isAuthenticated(name)) { + if (PlayerCache.getInstance().isAuthenticated(name)) return; - } + for (Player player : plugin.getServer().getOnlinePlayers()) { if (player.getName().toLowerCase().equals(name)) { if (LimboCache.getInstance().hasLimboPlayer(name)) { LimboPlayer inv = LimboCache.getInstance().getLimboPlayer(name); + player.getServer().getScheduler().cancelTask(inv.getMessageTaskId()); player.getServer().getScheduler().cancelTask(inv.getTimeoutTaskId()); if(playerCache.doesCacheExist(name)) { playerCache.removeCache(name); diff --git a/src/main/java/fr/xephi/authme/threads/FlatFileThread.java b/src/main/java/fr/xephi/authme/threads/FlatFileThread.java index 6dfddba4a..bf0cc9ec5 100644 --- a/src/main/java/fr/xephi/authme/threads/FlatFileThread.java +++ b/src/main/java/fr/xephi/authme/threads/FlatFileThread.java @@ -12,6 +12,7 @@ import java.util.List; import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.api.API; import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.settings.Settings; @@ -21,9 +22,10 @@ public class FlatFileThread extends Thread implements DataSource { /* file layout: * - * PLAYERNAME:HASHSUM:IP:LOGININMILLIESECONDS:LASTPOSX:LASTPOSY:LASTPOSZ:LASTPOSWORLD + * PLAYERNAME:HASHSUM:IP:LOGININMILLIESECONDS:LASTPOSX:LASTPOSY:LASTPOSZ:LASTPOSWORLD:EMAIL * * Old but compatible: + * PLAYERNAME:HASHSUM:IP:LOGININMILLIESECONDS:LASTPOSX:LASTPOSY:LASTPOSZ:LASTPOSWORLD * PLAYERNAME:HASHSUM:IP:LOGININMILLIESECONDS * PLAYERNAME:HASHSUM:IP * PLAYERNAME:HASHSUM @@ -84,7 +86,7 @@ public class FlatFileThread extends Thread implements DataSource { BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(source, true)); - bw.write(auth.getNickname() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + ":" + auth.getQuitLocX() + ":" + auth.getQuitLocY() + ":" + auth.getQuitLocZ() + ":" + auth.getWorld() + "\n"); + bw.write(auth.getNickname() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + ":" + auth.getQuitLocX() + ":" + auth.getQuitLocY() + ":" + auth.getQuitLocZ() + ":" + auth.getWorld() + ":" + auth.getEmail() + "\n"); } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); return false; @@ -114,19 +116,23 @@ public class FlatFileThread extends Thread implements DataSource { if (args[0].equals(auth.getNickname())) { switch (args.length) { case 4: { - newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), 0, 0, 0, "world"); + newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), 0, 0, 0, "world", "your@email.com", API.getPlayerRealName(args[0])); break; } case 7: { - newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "world"); + newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "world", "your@email.com", API.getPlayerRealName(args[0])); break; } case 8: { - newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7]); + newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], "your@email.com", API.getPlayerRealName(args[0])); + break; + } + case 9: { + newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], args[8], API.getPlayerRealName(args[0])); break; } default: { - newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], 0, 0, 0, 0, "world"); + newAuth = new PlayerAuth(args[0], auth.getHash(), args[2], 0, 0, 0, 0, "world", "your@email.com", API.getPlayerRealName(args[0])); break; } } @@ -167,19 +173,23 @@ public class FlatFileThread extends Thread implements DataSource { if (args[0].equals(auth.getNickname())) { switch (args.length) { case 4: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), 0, 0, 0, "world"); + newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), 0, 0, 0, "world", "your@email.com", API.getPlayerRealName(args[0])); break; } case 7: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "world"); + newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "world", "your@email.com", API.getPlayerRealName(args[0])); break; } case 8: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7]); + newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], "your@email.com", API.getPlayerRealName(args[0])); + break; + } + case 9: { + newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], args[8], API.getPlayerRealName(args[0])); break; } default: { - newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), 0, 0, 0, "world"); + newAuth = new PlayerAuth(args[0], args[1], auth.getIp(), auth.getLastLogin(), 0, 0, 0, "world", "your@email.com", API.getPlayerRealName(args[0])); break; } } @@ -218,7 +228,7 @@ public class FlatFileThread extends Thread implements DataSource { while ((line = br.readLine()) != null) { String[] args = line.split(":"); if (args[0].equals(auth.getNickname())) { - newAuth = new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ(), auth.getWorld()); + newAuth = new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ(), auth.getWorld(), auth.getEmail(), API.getPlayerRealName(args[0])); break; } } @@ -420,15 +430,17 @@ public class FlatFileThread extends Thread implements DataSource { if (args[0].equals(user)) { switch (args.length) { case 2: - return new PlayerAuth(args[0], args[1], "198.18.0.1", 0); + return new PlayerAuth(args[0], args[1], "198.18.0.1", 0, "your@email.com", API.getPlayerRealName(args[0])); case 3: - return new PlayerAuth(args[0], args[1], args[2], 0); + return new PlayerAuth(args[0], args[1], args[2], 0, "your@email.com", API.getPlayerRealName(args[0])); case 4: - return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3])); + return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), "your@email.com", API.getPlayerRealName(args[0])); case 7: - return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "unavailableworld"); + return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "unavailableworld", "your@email.com", API.getPlayerRealName(args[0])); case 8: - return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7]); + return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], "your@email.com", API.getPlayerRealName(args[0])); + case 9: + return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], args[8], API.getPlayerRealName(args[0])); } } } @@ -459,7 +471,38 @@ public class FlatFileThread extends Thread implements DataSource { @Override public boolean updateEmail(PlayerAuth auth) { - return false; + if (!isAuthAvailable(auth.getNickname())) { + return false; + } + PlayerAuth newAuth = null; + BufferedReader br = null; + try { + br = new BufferedReader(new FileReader(source)); + String line = ""; + while ((line = br.readLine()) != null) { + String[] args = line.split(":"); + if (args[0].equals(auth.getNickname())) { + newAuth = new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7], auth.getEmail(), API.getPlayerRealName(args[0])); + break; + } + } + } catch (FileNotFoundException ex) { + ConsoleLogger.showError(ex.getMessage()); + return false; + } catch (IOException ex) { + ConsoleLogger.showError(ex.getMessage()); + return false; + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ex) { + } + } + } + removeAuth(auth.getNickname()); + saveAuth(newAuth); + return true; } @Override @@ -524,12 +567,37 @@ public class FlatFileThread extends Thread implements DataSource { } catch (IOException ex) { } } - } + } } @Override public List getAllAuthsByEmail(String email) { - return new ArrayList(); + BufferedReader br = null; + List countEmail = new ArrayList(); + try { + br = new BufferedReader(new FileReader(source)); + String line; + while ((line = br.readLine()) != null) { + String[] args = line.split(":"); + if (args.length > 8 && args[8].equals(email)) { + countEmail.add(args[0]); + } + } + return countEmail; + } catch (FileNotFoundException ex) { + ConsoleLogger.showError(ex.getMessage()); + return new ArrayList(); + } catch (IOException ex) { + ConsoleLogger.showError(ex.getMessage()); + return new ArrayList(); + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ex) { + } + } + } } @Override diff --git a/src/main/java/fr/xephi/authme/threads/MySQLThread.java b/src/main/java/fr/xephi/authme/threads/MySQLThread.java index b6a8b94bc..4043cf428 100644 --- a/src/main/java/fr/xephi/authme/threads/MySQLThread.java +++ b/src/main/java/fr/xephi/authme/threads/MySQLThread.java @@ -13,6 +13,7 @@ import com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource; import fr.xephi.authme.AuthMe; import fr.xephi.authme.ConsoleLogger; +import fr.xephi.authme.api.API; import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.datasource.MiniConnectionPoolManager; @@ -208,14 +209,14 @@ public class MySQLThread extends Thread implements DataSource { rs = pst.executeQuery(); if (rs.next()) { if (rs.getString(columnIp).isEmpty() ) { - return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "198.18.0.1", rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld),rs.getString(columnEmail)); + return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "198.18.0.1", rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld),rs.getString(columnEmail), API.getPlayerRealName(rs.getString(columnName))); } else { if(!columnSalt.isEmpty()){ if(!columnGroup.isEmpty()) - return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getInt(columnGroup), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail)); - else return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld),rs.getString(columnEmail)); + return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getInt(columnGroup), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), API.getPlayerRealName(rs.getString(columnName))); + else return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld),rs.getString(columnEmail), API.getPlayerRealName(rs.getString(columnName))); } else { - return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail)); + return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail), API.getPlayerRealName(rs.getString(columnName))); } } } else { @@ -258,8 +259,8 @@ public class MySQLThread extends Thread implements DataSource { } if (!columnOthers.isEmpty()) { for(String column : columnOthers) { - pst = con.prepareStatement("UPDATE " + tableName + " SET " + tableName + "." + column + "=? WHERE " + columnName + "=?;"); - pst.setString(1, auth.getNickname()); + pst = con.prepareStatement("UPDATE " + tableName + " SET " + column + "=? WHERE " + columnName + "=?;"); + pst.setString(1, auth.getRealname()); pst.setString(2, auth.getNickname()); pst.executeUpdate(); } @@ -272,12 +273,30 @@ public class MySQLThread extends Thread implements DataSource { rs = pst.executeQuery(); if (rs.next()) { id = rs.getInt(columnID); + // Insert player in phpbb_user_group pst = con.prepareStatement("INSERT INTO " + Settings.getPhpbbPrefix + "user_group (group_id, user_id, group_leader, user_pending) VALUES (?,?,?,?);"); pst.setInt(1, Settings.getPhpbbGroup); pst.setInt(2, id); pst.setInt(3, 0); pst.setInt(4, 0); pst.executeUpdate(); + // Update player group in phpbb_users + pst = con.prepareStatement("UPDATE " + tableName + " SET " + tableName + ".group_id=? WHERE " + columnName + "=?;"); + pst.setInt(1, Settings.getPhpbbGroup); + pst.setString(2, auth.getNickname()); + pst.executeUpdate(); + // Get current time without ms + long time = System.currentTimeMillis()/1000; + // Update user_regdate + pst = con.prepareStatement("UPDATE " + tableName + " SET " + tableName + ".user_regdate=? WHERE " + columnName + "=?;"); + pst.setLong(1, time); + pst.setString(2, auth.getNickname()); + pst.executeUpdate(); + // Update user_lastvisit + pst = con.prepareStatement("UPDATE " + tableName + " SET " + tableName + ".user_lastvisit=? WHERE " + columnName + "=?;"); + pst.setLong(1, time); + pst.setString(2, auth.getNickname()); + pst.executeUpdate(); } } if (Settings.getPasswordHash == HashAlgorithm.WORDPRESS) { @@ -457,6 +476,9 @@ public class MySQLThread extends Thread implements DataSource { while (rs.next()) { list.add(rs.getString(columnName)); } + pst = con.prepareStatement("DELETE FROM " + tableName + " WHERE " + columnLastLogin + "' -usage_captcha: '&cUsage: /captcha ' +usage_captcha: '&cYou need to type a captcha, please type: /captcha ' wrong_captcha: '&cWrong Captcha, please use : /captcha THE_CAPTCHA' valid_captcha: '&cYour captcha is valid !' kick_forvip: '&cA VIP Player join the full server!' @@ -51,3 +51,6 @@ email_added: '[AuthMe] Email Added !' email_confirm: '[AuthMe] Confirm your Email !' email_changed: '[AuthMe] Email Change !' email_send: '[AuthMe] Recovery Email Send !' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' \ No newline at end of file diff --git a/src/main/resources/messages_es.yml b/src/main/resources/messages_es.yml index b6824ff77..9cae27adf 100644 --- a/src/main/resources/messages_es.yml +++ b/src/main/resources/messages_es.yml @@ -52,3 +52,6 @@ email_added: '[AuthMe] Email agregado !' email_confirm: '[AuthMe] Confirma tu Email !' email_changed: '[AuthMe] Email cambiado !' email_send: '[AuthMe] Correo de recuperación enviado !' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' \ No newline at end of file diff --git a/src/main/resources/messages_fi.yml b/src/main/resources/messages_fi.yml index 82af59d27..8fccc444d 100644 --- a/src/main/resources/messages_fi.yml +++ b/src/main/resources/messages_fi.yml @@ -51,3 +51,6 @@ email_added: '[AuthMe] Sähköposti lisätty!' email_confirm: '[AuthMe] Vahvistuta sähköposti!' email_changed: '[AuthMe] Sähköposti vaihdettu!' email_send: '[AuthMe] Palautus sähköposti lähetetty!' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' \ No newline at end of file diff --git a/src/main/resources/messages_fr.yml b/src/main/resources/messages_fr.yml index 1f203dd5b..07368f9cf 100644 --- a/src/main/resources/messages_fr.yml +++ b/src/main/resources/messages_fr.yml @@ -26,7 +26,7 @@ unvalid_session: '&fSession invalide, relancez le jeu ou attendez la fin de la s reg_only: '&fSeul les joueurs enregistré sont admis!' logged_in: '&cVous êtes déjà connecté!' logout: '&cVous avez été déconnecté!' -same_nick: '&fUne personne ayant ce même pseudo joue deja..' +same_nick: '&fUne personne ayant ce même pseudo joue déjà..' registered: '&cEnregistrement réussi avec succès!' pass_len: '&fVotre mot de passe n''est pas assez long..' reload: '&fConfiguration et BDD relancé avec succès' @@ -45,10 +45,13 @@ kick_fullserver: '&cLe serveur est actuellement plein, désolé!' usage_email_add: '&fUsage: /email add ' usage_email_change: '&fUsage: /email change ' usage_email_recovery: '&fUsage: /email recovery ' -new_email_invalid: '[AuthMe] New email invalid!' -old_email_invalid: '[AuthMe] Old email invalid!' -email_invalid: '[AuthMe] Invalid Email' -email_added: '[AuthMe] Email Added !' -email_confirm: '[AuthMe] Confirm your Email !' -email_changed: '[AuthMe] Email Change !' -email_send: '[AuthMe] Recovery Email Send !' +new_email_invalid: '[AuthMe] Nouvel email invalide!' +old_email_invalid: '[AuthMe] Ancien email invalide!' +email_invalid: '[AuthMe] Email invalide' +email_added: '[AuthMe] Email ajouté !' +email_confirm: '[AuthMe] Confirmez votre email !' +email_changed: '[AuthMe] Email changé !' +email_send: '[AuthMe] Email de récupération envoyé!' +country_banned: 'Votre pays est banni de ce serveur' +antibot_auto_enabled: '[AuthMe] AntiBotMod a été activé automatiquement à cause de nombreuses connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod a été désactivé automatiquement après %m Minutes, espérons que l''invasion soit arrêtée!' \ No newline at end of file diff --git a/src/main/resources/messages_hu.yml b/src/main/resources/messages_hu.yml index e5d9454bc..0d736503b 100644 --- a/src/main/resources/messages_hu.yml +++ b/src/main/resources/messages_hu.yml @@ -51,3 +51,6 @@ email_added: '[AuthMe] Email Added !' email_confirm: '[AuthMe] Confirm your Email !' email_changed: '[AuthMe] Email Change !' email_send: '[AuthMe] Recovery Email Send !' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' diff --git a/src/main/resources/messages_it.yml b/src/main/resources/messages_it.yml index e578811d4..0eb355fcb 100644 --- a/src/main/resources/messages_it.yml +++ b/src/main/resources/messages_it.yml @@ -51,3 +51,6 @@ email_added: '[AuthMe] Email Aggiunta!' email_confirm: '[AuthMe] Conferma la tua Email!' email_changed: '[AuthMe] Email cambiata!' email_send: '[AuthMe] Email di recupero inviata!' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' diff --git a/src/main/resources/messages_ko.yml b/src/main/resources/messages_ko.yml index 194332b18..b173f2990 100644 --- a/src/main/resources/messages_ko.yml +++ b/src/main/resources/messages_ko.yml @@ -42,7 +42,7 @@ valid_captcha: '&c당신의 캡차는 올바릅니다 !' kick_forvip: '&c한 VIP 플레이어가 만원인 서버에 입장했습니다!!' kick_fullserver: '&c그 서버는 실제로 만원입니다, 미안!' usage_email_add: '&f사용법: /email add <이메일> <이메일재입력> ' -usage_email_change: '&f사용법: /email change ' +usage_email_change: '&f사용법: /email change <기존이메일> <새이메일> ' usage_email_recovery: '&f사용법: /email recovery <이메일>' new_email_invalid: '[AuthMe] 새 이메일이 잘못되었습니다!' old_email_invalid: '[AuthMe] 기존 이메일이 잘못되었습니다!' @@ -51,3 +51,6 @@ email_added: '[AuthMe] 이메일 추가됨 !' email_confirm: '[AuthMe] 이메일을 확인해주세요 !' email_changed: '[AuthMe] 이메일 변경됨 !' email_send: '[AuthMe] 복구 이메일 발송됨 !' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' diff --git a/src/main/resources/messages_lt.yml b/src/main/resources/messages_lt.yml index 333275880..10524730f 100644 --- a/src/main/resources/messages_lt.yml +++ b/src/main/resources/messages_lt.yml @@ -50,4 +50,7 @@ email_invalid: '[AuthMe] Invalid Email' email_added: '[AuthMe] Email Added !' email_confirm: '[AuthMe] Confirm your Email !' email_changed: '[AuthMe] Email Change !' -email_send: '[AuthMe] Recovery Email Send !' \ No newline at end of file +email_send: '[AuthMe] Recovery Email Send !' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' diff --git a/src/main/resources/messages_nl.yml b/src/main/resources/messages_nl.yml new file mode 100644 index 000000000..46f5c0879 --- /dev/null +++ b/src/main/resources/messages_nl.yml @@ -0,0 +1,55 @@ +unknown_user: Gebruiker is niet gevonden in database +unsafe_spawn: De locatie waar je de vorige keer het spel verlied was gevaarlijk, je bent geteleporteert naar de Spawn +not_logged_in: '&cNiet ingelogt!' +reg_voluntarily: Je kunt je gebruikersnaam registreren met "/register " +usage_log: '&cGebruik: /login ' +wrong_pwd: '&cFout wachtwoord' +unregistered: '&cRegistratie succesvol ongedaan gemaakt!' +reg_disabled: '&cRegistratie is uitgeschakeld' +valid_session: '&cSessie ingelogt' +login: '&cSuccesvol ingelogt!' +vb_nonActiv: Je accound is nog niet geactiveerd, controleer je mailbox! +user_regged: '&cGebruikersnaam is al geregistreerd' +usage_reg: '&cGebruik: /register ' +max_reg: Je hebt de maximale registraties van jouw account overschreden. +no_perm: '&cGeen toegang!' +error: Error; neem contact op met een ADMIN! +login_msg: '&cLog in met "/login "' +reg_msg: '&cRegistreer met "/register "' +usage_unreg: '&cGebruik: /unregister password' +pwd_changed: '&cWachtwoord aangepast!' +user_unknown: '&cGebruikersnaam niet geregistreerd' +password_error: Wachtwoord incorrect! +unvalid_session: Sessie beschadigt, wacht tot de sessie is verlopen en join opnieuw. +reg_only: Alleen voor geregistreerde spelers! Bezoek http://example.com om te registreren +logged_in: '&cJe bent al ingelogt!' +logout: '&cJe bent succesvol uitgelogt' +same_nick: Er is al iemand met jou gebruikersnaam online. +registered: '&cSuccesvol geregistreerd!' +pass_len: Je gekozen wachtwoord voldoet niet aan de minimum of maximum lengte +reload: Configuratie en database is opnieuw opgestard +timeout: Login time-out; het duurde telang voor je je inlogde. +usage_changepassword: 'Gebruik: /changepassword ' +name_len: '&cJouw gebruikersnaam is te kort' +regex: '&cJouw gebruikersnaam bestaat uit illegale tekens. tegestaan chars: REG_EX' +add_email: '&cVoeg uw email toe Alstublieft met: /email add jouw wachtwoord herhaalwachtwoord' +bad_database_email: '[AuthMe] deze /email command is alleen beschikbaar met MySQL en SQLite, neem contact op met een Admin' +recovery_email: '&cWachtwoord vergeten? gebruik alstublieft /email recovery ' +usage_captcha: '&cGebruik: /captcha ' +wrong_captcha: '&cverkeerde Captcha, Gebruik alstublieft : /captcha THE_CAPTCHA' +valid_captcha: '&cJouw captcha is geldig!' +kick_forvip: '&cA VIP Gebruiker ga naar de volledige server!' +kick_fullserver: '&cDe server is eigenlijk vol, Sorry!' +usage_email_add: '&fGebruik: /email add ' +usage_email_change: '&fGebruik: /email change ' +usage_email_recovery: '&fGebruik: /email recovery ' +new_email_invalid: '[AuthMe] Nieuw email ongeldig!' +old_email_invalid: '[AuthMe] Oud email ongeldig!' +email_invalid: '[AuthMe] ongeldig Email' +email_added: '[AuthMe] Bevestig jouw Email !' +email_confirm: '[AuthMe] Bevestig jouw Email !' +email_changed: '[AuthMe] Email Veranderd !' +email_send: '[AuthMe] Herstel Email Verzonden !' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' diff --git a/src/main/resources/messages_pl.yml b/src/main/resources/messages_pl.yml index 3175dcba8..248d49cee 100644 --- a/src/main/resources/messages_pl.yml +++ b/src/main/resources/messages_pl.yml @@ -51,3 +51,6 @@ email_added: '[AuthMe] Email dodany!' email_confirm: '[AuthMe] Potwierdz swoj email!' email_changed: '[AuthMe] Email zmieniony!' email_send: '[AuthMe] Email z odzyskaniem wyslany!' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' \ No newline at end of file diff --git a/src/main/resources/messages_pt.yml b/src/main/resources/messages_pt.yml index 91e5cd369..faa41e329 100644 --- a/src/main/resources/messages_pt.yml +++ b/src/main/resources/messages_pt.yml @@ -52,3 +52,6 @@ email_added: 'Email adicionado com sucesso!' email_confirm: 'Confirme o seu email!' email_changed: 'Email alterado com sucesso!' email_send: 'Nova palavra-passe enviada para o seu email!' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' \ No newline at end of file diff --git a/src/main/resources/messages_ru.yml b/src/main/resources/messages_ru.yml index 268d961b0..e251a0d8d 100644 --- a/src/main/resources/messages_ru.yml +++ b/src/main/resources/messages_ru.yml @@ -1,58 +1,56 @@ -unknown_user: '&cЭтого игрока нет в базе' -unsafe_spawn: '&6Твоё расположение перед выходом из игры было небезопасным - &aты - перенесён на спавн' -not_logged_in: '&cТы не в игре!' -reg_voluntarily: '&eЗарегистрируйся - &d/reg ПАРОЛЬ ПОВТОР_ПАРОЛЯ &eили &d/register - ПАРОЛЬ ПОВТОР_ПАРОЛЯ' -usage_log: '&eСинтаксис: &d/l ПАРОЛЬ &eили &d/login ПАРОЛЬ' -wrong_pwd: '&cНеправильный пароль' -unregistered: '&aРегистрация снята' +unknown_user: '&cТакой игрок не зарегестрирован' +unsafe_spawn: '&6Ваше расположение перед выходом было опасным - &aВы перенесены на спавн.' +not_logged_in: '&cВы еще не вошли!' +reg_voluntarily: '&eРегистрация - &d/reg ПАРОЛЬ ПОВТОР_ПАРОЛЯ' +usage_log: '&eИспользование: &d/l ПАРОЛЬ' +wrong_pwd: '&cНеверный пароль' +unregistered: '&cВы успешно удалили свой аккаунт!' reg_disabled: '&6Регистрация отключена' -valid_session: '&aСессия открыта' -login: '&aТы в игре' -vb_nonActiv: '&aТвой аккаунт активирован. &5Проверь свою электронную почту.' -user_regged: '&cЭтот игрок уже зарегистрирован' -usage_reg: '&eСинтаксис: &d/reg ПАРОЛЬ ПОВТОР_ПАРОЛЯ &eили &d/register ПАРОЛЬ ПОВТОР_ПАРОЛЯ' -max_reg: '&cТы превысил максимальное число регистраций' -no_perm: '&cНет разрешения' -error: '&cЧто-то пошло не так... &5Свяжись с администратором.' -login_msg: '&eВойди в игру - &d/l ПАРОЛЬ &eили &d/login ПАРОЛЬ' -reg_msg: '&eЗарегистрируйся - &d/reg ПАРОЛЬ ПОВТОР_ПАРОЛЯ &eили &d/register ПАРОЛЬ - ПОВТОР_ПАРОЛЯ' -reg_email_msg: '&cPlease register with "/register "' -usage_unreg: '&eСинтаксис: &d/unregister ПАРОЛЬ' -pwd_changed: '&aПароль изменён' +valid_session: '&cСессия включена' +login: '&cУспешная авторизация!' +vb_nonActiv: '&aВаш аккаунт активирован. &5Проверьте свою электронную почту.' +user_regged: '&cТакой игрок уже зарегистрирован' +usage_reg: '&cИспользование: /reg ПАРОЛЬ ПОВТОР_ПАРОЛЯ' +max_reg: '&fВы превысили максимальное количество регистраций на аккаунт' +no_perm: '&cУ Вас нет прав' +error: '&cЧто-то пошло не так; &5Свяжитесь с администратором.' +login_msg: '&cВойти в игру - /login ПАРОЛЬ' +reg_msg: '&eЗарегистрируйтесь - &d/reg ПАРОЛЬ ПОВТОР_ПАРОЛЯ' +reg_email_msg: '&cЗарегистрируйтесь - /register ВАШ_EMAIL ВАШ_EMAIL' +usage_unreg: '&cИспользование: /unregister ПАРОЛЬ' +pwd_changed: '&cПароль успешно изменен!' user_unknown: '&cТакой игрок не зарегистрирован' -password_error: '&cПароль не найден' -unvalid_session: '&cДата сессии некорректна. &5Дождись конца сессии.' -reg_only: '&cРегистрация только для игроков! &5Зайди на &dhttp://example.com &5для - регистрации.' -logged_in: '&cТы уже в матрице!' -logout: '&aТы вышел с сервера' -same_nick: '&cЭтот игрок уже играет' -registered: '&aУспешная регистрация' +password_error: '&fПароль не совпадает' +unvalid_session: '&cСессия некорректна. &5Дождитесь, пока сессия закончится.' +reg_only: '&fВход доступен только зарегистрированным игрокам! Зарегистрируйтесь здесь - http://example.com/?do=register' +logged_in: '&cВы уже вошли!' +logout: '&cВы успешно вышли' +same_nick: '&fТакой игрок уже играет на сервере' +registered: '&cУспешная регистрация!' pass_len: '&cТвой пароль либо слишком длинный, либо слишком короткий' -reload: '&aКонфигурация и база данных перезагружена' -timeout: '&cТы не успел войти в игру' -usage_changepassword: '&eСинтаксис: &d/changepassword СТАРЫЙ_ПАРОЛЬ НОВЫЙ_ПАРОЛЬ' -name_len: '&cТвой ник либо слишком длинный, либо слишком короткий' -regex: '&cТвой ник содержит недопустимые символы. Разрешено использовать: REG_EX' -add_email: '&eДобавь свой email: &d/email add АДРЕС_ПОЧТЫ ПОВТОР_АДРЕСА_ПОЧТЫ' -bad_database_email: '&c[AuthMe] Команда &d/email&c доступна только при работе с MySQL - или SQLite' -recovery_email: '&cЗабыл пароль? Используй команду &d/email recovery <АДРЕС_ПОЧТЫ>' -usage_captcha: '&cUsage: /captcha ' -wrong_captcha: '&cWrong Captcha, please use : /captcha THE_CAPTCHA' -valid_captcha: '&cYour captcha is valid !' -kick_forvip: '&cA VIP Player join the full server!' -kick_fullserver: '&cThe server is actually full, Sorry!' -usage_email_add: '&fUsage: /email add ' -usage_email_change: '&fUsage: /email change ' -usage_email_recovery: '&fUsage: /email recovery ' -new_email_invalid: '[AuthMe] New email invalid!' -old_email_invalid: '[AuthMe] Old email invalid!' -email_invalid: '[AuthMe] Invalid Email' -email_added: '[AuthMe] Email Added !' -email_confirm: '[AuthMe] Confirm your Email !' -email_changed: '[AuthMe] Email Change !' -email_send: '[AuthMe] Recovery Email Send !' +reload: '&fКонфигурация и база данных перезагружены.' +timeout: '&fВремя входа истекло, попробуйте еще раз, но быстрее' +usage_changepassword: '&fИспользование: /changepassword СТАРЫЙ_ПАРОЛЬ НОВЫЙ_ПАРОЛЬ' +name_len: '&cВаш логин слишком длинный или слишком короткий' +regex: '&cВаш логин содержит запрещенные символы. Разрешенные символы: REG_EX' +add_email: '&cДобавьте свой email: /email add ВАШ_EMAIL ВАШ_EMAIL' +bad_database_email: '&c[AuthMe] Команда &d/email&c доступна только при работе с MySQL или SQLite' +recovery_email: '&cЗабыли пароль? Используйте /email recovery ВАШ_EMAIL' +usage_captcha: '&cИспользование: /captcha СИМВОЛЫ_ВЫШЕ' +wrong_captcha: '&cНеправильная капча: /captcha СИМВОЛЫ_ВЫШЕ' +valid_captcha: '&cКапча введена правильно!' +kick_forvip: '&cVIP игрок зашел на переполненный сервер!' +kick_fullserver: '&cСервер переполнен!' +usage_email_add: '&fИспользование: /email add ВАШ_EMAIL ВАШ_EMAIL ' +usage_email_change: '&fИспользование: /email change СТАРЫЙ_EMAIL НОВЫЙ_EMAIL ' +usage_email_recovery: '&fИспользование: /email recovery ВАШ_EMAIL' +new_email_invalid: '[AuthMe] Новый email недействителен!' +old_email_invalid: '[AuthMe] Старый email недействителен!' +email_invalid: '[AuthMe] Email неправильный' +email_added: '[AuthMe] Email добавлен!' +email_confirm: '[AuthMe] Подтвердите ваш email!' +email_changed: '[AuthMe] Email изменен!' +email_send: '[AuthMe] Восстановительное письмо отправлено!' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' \ No newline at end of file diff --git a/src/main/resources/messages_sk.yml b/src/main/resources/messages_sk.yml index 6626b781a..6be8bfbdc 100644 --- a/src/main/resources/messages_sk.yml +++ b/src/main/resources/messages_sk.yml @@ -54,4 +54,7 @@ email_invalid: '[AuthMe] Invalid Email' email_added: '[AuthMe] Email Added !' email_confirm: '[AuthMe] Confirm your Email !' email_changed: '[AuthMe] Email Change !' -email_send: '[AuthMe] Recovery Email Send !' \ No newline at end of file +email_send: '[AuthMe] Recovery Email Send !' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' \ No newline at end of file diff --git a/src/main/resources/messages_zhcn.yml b/src/main/resources/messages_zhcn.yml index 117c415f2..6ce9e7f14 100644 --- a/src/main/resources/messages_zhcn.yml +++ b/src/main/resources/messages_zhcn.yml @@ -51,3 +51,6 @@ email_added: '[AuthMe] Email Added !' email_confirm: '[AuthMe] Confirm your Email !' email_changed: '[AuthMe] Email Change !' email_send: '[AuthMe] Recovery Email Send !' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' \ No newline at end of file diff --git a/src/main/resources/messages_zhtw.yml b/src/main/resources/messages_zhtw.yml index e333f050e..cb5495675 100644 --- a/src/main/resources/messages_zhtw.yml +++ b/src/main/resources/messages_zhtw.yml @@ -1,3 +1,5 @@ +# Translator: uSoc_lifehome (http://lifeho.me) # +# -------------------------------------------- # unknown_user: '&f用戶資料並不存在於資料庫中 。' unsafe_spawn: '&f你的登出位置不安全 , 現在將傳送你到重生點 。' not_logged_in: '&c你還沒有登入 !' @@ -16,13 +18,13 @@ no_perm: '&c你並沒有這個權限 。' error: '&f發生錯誤 , 請與管理員聯絡 。' login_msg: '&c請使用這個指令來登入 : 《 /login <密碼> 》' reg_msg: '&c請使用這個的指令來註冊 : 《 /register <密碼> <重覆密碼> 》' -reg_email_msg: '&cPlease register with "/register "' +reg_email_msg: '&c請使用這個的指令來註冊 : 《 /register <電郵> <重覆電郵> 》' usage_unreg: '&c用法 : 《 /unregister <密碼> 》' pwd_changed: '&c你成功的更換了你的密碼 !' user_unknown: '&c此用戶名沒有已登記資料 。' password_error: '&f密碼不符合 。' unvalid_session: '&f登入階段資料已損壞 , 請等待登入階段結束 。' -reg_only: '&f限已註冊會員 , 請先到 http://example.com 註冊 。' +reg_only: '&f限已註冊會員 , 請先到 https://www.craftinghk.com/ 註冊 。' logged_in: '&c你已經登入過了 。' logout: '&b你成功的登出了 。' same_nick: '&f同名玩家已在遊玩 。' @@ -39,15 +41,18 @@ recovery_email: '&c忘記密碼 ? 請使用這個的指令來更新密碼 : usage_captcha: '&c用法 : 《 /captcha <驗證碼> 》' wrong_captcha: '&c你輸入了錯誤的驗證碼,請使用 《 /captcha <驗證碼> 》 再次輸入 。' valid_captcha: '&c你的驗證碼是無效的 !' -kick_forvip: '&cA VIP Player join the full server!' -kick_fullserver: '&cThe server is actually full, Sorry!' -usage_email_add: '&fUsage: /email add ' -usage_email_change: '&fUsage: /email change ' -usage_email_recovery: '&fUsage: /email recovery ' -new_email_invalid: '[AuthMe] New email invalid!' -old_email_invalid: '[AuthMe] Old email invalid!' -email_invalid: '[AuthMe] Invalid Email' -email_added: '[AuthMe] Email Added !' -email_confirm: '[AuthMe] Confirm your Email !' -email_changed: '[AuthMe] Email Change !' -email_send: '[AuthMe] Recovery Email Send !' \ No newline at end of file +kick_forvip: '&cA 因為有VIP玩家進入了伺服器 。' +kick_fullserver: '&c抱歉! 這個伺服器滿人了,也許你需要VIP會藉?' +usage_email_add: '&f用法 : 《 /email add <電郵> <重覆電郵> 》' +usage_email_change: '&f用法 : 《 /email change <舊電郵> <新電郵> 》' +usage_email_recovery: '&f用法 : 《 /email recovery <電郵> 》' +new_email_invalid: '你所填寫的新電郵地址並不正確。' +old_email_invalid: '你所填寫的舊電郵地址並不正確。' +email_invalid: '你所填寫的電郵地址並不正確。' +email_added: '已加入你的電郵地址記錄。' +email_confirm: '請重覆輸入你的電郵地址。' +email_changed: '你的電郵地址記錄已更改。' +email_send: '忘記密碼確定信件已寄出,請查收。' +country_banned: 'Your country is banned from this server' +antibot_auto_enabled: '[AuthMe] AntiBotMod automatically enabled due to massive connections!' +antibot_auto_disabled: '[AuthMe] AntiBotMod automatically disabled after %m Minutes, hope invasion stopped' \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index abfe7881b..e22d43ef6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ author: Xephi59 website: http://dev.bukkit.org/bukkit-plugins/authme-recoded/ description: AuthMe prevents people, which aren't logged in, from doing stuff like placing blocks, moving, typing commands or seeing the inventory of the current player. main: fr.xephi.authme.AuthMe -version: 3.0 +version: 3.1.1 softdepend: [Vault, ChestShop, Spout, Multiverse-Core, Notifications, Citizens, CombatTag, Essentials, EssentialsSpawn] commands: register: @@ -60,6 +60,9 @@ permissions: authme.admin.lastlogin: true authme.admin.getemail: true authme.admin.chgemail: true + authme.admin.purgelastpos: true + authme.admin.switchantibot: true + authme.bypassantibot: true authme.register: description: Register an account default: true @@ -77,7 +80,7 @@ permissions: default: true authme.passpartu: description: passpartu - default: true + default: true authme.allow2accounts: description: allow more accounts for same ip default: false @@ -140,4 +143,16 @@ permissions: default: op authme.admin.flattosqlite: description: Convert File to Sqlite method + default: op + authme.bypassforcesurvival: + description: Bypass all ForceSurvival features + default: false + authme.admin.purgelastpos: + description: Purge last pos of players + default: op + authme.admin.switchantibot: + description: Switch AntiBot mode on/off + default: op + authme.bypassantibot: + description: Bypass the AntiBot check default: op \ No newline at end of file