diff --git a/pom.xml b/pom.xml index 449ef6c73..161a2e6dd 100644 --- a/pom.xml +++ b/pom.xml @@ -28,12 +28,12 @@ - 2.7.16b4 + 2.8 org.bukkit bukkit - 1.5.2-R0.1 + 1.5.2-R1.0 net.milkbowl.vault diff --git a/src/main/java/uk/org/whoami/authme/AuthMe.java b/src/main/java/uk/org/whoami/authme/AuthMe.java index 71ac2ad44..ebda851c3 100644 --- a/src/main/java/uk/org/whoami/authme/AuthMe.java +++ b/src/main/java/uk/org/whoami/authme/AuthMe.java @@ -19,8 +19,10 @@ package uk.org.whoami.authme; import java.io.File; import java.io.IOException; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; +import java.util.List; import java.util.Random; import com.earth2me.essentials.Essentials; @@ -59,6 +61,7 @@ import uk.org.whoami.authme.listener.AuthMeSpoutListener; import uk.org.whoami.authme.plugin.manager.BungeeCordMessage; import uk.org.whoami.authme.plugin.manager.CitizensCommunicator; import uk.org.whoami.authme.plugin.manager.CombatTagComunicator; +import uk.org.whoami.authme.plugin.manager.EssSpawn; import uk.org.whoami.authme.settings.Messages; import uk.org.whoami.authme.settings.PlayersLogs; import uk.org.whoami.authme.settings.Settings; @@ -68,13 +71,13 @@ import net.citizensnpcs.Citizens; import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; +import org.bukkit.Location; import org.bukkit.Server; import com.onarandombox.MultiverseCore.MultiverseCore; import uk.org.whoami.authme.commands.PasspartuCommand; import uk.org.whoami.authme.datasource.SqliteDataSource; -import uk.org.whoami.authme.filter.ConsoleFilter; public class AuthMe extends JavaPlugin { @@ -82,7 +85,6 @@ public class AuthMe extends JavaPlugin { private Settings settings; private Messages m; private PlayersLogs pllog; - public Management management; public static Server server; public static Plugin authme; public static Permission permission; @@ -99,10 +101,13 @@ public class AuthMe extends JavaPlugin { public Essentials ess; public Notifications notifications; public API api; + public Management management; public HashMap captcha = new HashMap(); public HashMap cap = new HashMap(); public HashMap realIp = new HashMap(); + public List premium = new ArrayList(); public MultiverseCore mv = null; + public Location essentialsSpawn; @Override public void onEnable() { @@ -238,9 +243,11 @@ public class AuthMe extends JavaPlugin { database = new CacheDataSource(this, database); } + // Setup API api = new API(this, database); - management = new Management(database, this); + // Setup Management + management = new Management(database, this); PluginManager pm = getServer().getPluginManager(); if (pm.isPluginEnabled("Spout")) { @@ -368,6 +375,10 @@ public class AuthMe extends JavaPlugin { ess = null; } } + if (this.getServer().getPluginManager().getPlugin("EssentialsSpawn") != null && this.getServer().getPluginManager().getPlugin("EssentialsSpawn").isEnabled()) { + this.essentialsSpawn = new EssSpawn().getLocation(); + ConsoleLogger.info("Hook with EssentialsSpawn plugin"); + } } private void checkNotifications() { @@ -461,7 +472,7 @@ public class AuthMe extends JavaPlugin { String name = player.getName().toLowerCase(); if ((PlayerCache.getInstance().isAuthenticated(name)) && (!player.isDead()) && (Settings.isSaveQuitLocationEnabled.booleanValue())) { - final PlayerAuth auth = new PlayerAuth(player.getName().toLowerCase(), (int)player.getLocation().getX(), (int)player.getLocation().getY(), (int)player.getLocation().getZ()); + final PlayerAuth auth = new PlayerAuth(player.getName().toLowerCase(), (int)player.getLocation().getX(), (int)player.getLocation().getY(), (int)player.getLocation().getZ(), player.getWorld().getName()); Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { @Override public void run() { diff --git a/src/main/java/uk/org/whoami/authme/ConsoleFilter.java b/src/main/java/uk/org/whoami/authme/ConsoleFilter.java new file mode 100644 index 000000000..15077152b --- /dev/null +++ b/src/main/java/uk/org/whoami/authme/ConsoleFilter.java @@ -0,0 +1,30 @@ +package uk.org.whoami.authme; + +import java.util.logging.Filter; +import java.util.logging.LogRecord; + +/** +* +* @author Xephi59 +*/ +public class ConsoleFilter implements Filter { + + public ConsoleFilter() {} + + @Override + public boolean isLoggable(LogRecord record) { + try { + if (record == null || record.getMessage() == null) return true; + String logM = record.getMessage().toLowerCase(); + if (!logM.contains("issued server command:")) return true; + if (!logM.contains("/login ") && !logM.contains("/l ") && !logM.contains("/reg ") && !logM.contains("/changepassword ") && !logM.contains("/unregister ") + && !logM.contains("/authme register ") && !logM.contains("/authme changepassword ")&& !logM.contains("/authme reg ")&& !logM.contains("/authme cp ") && !logM.contains("/register ")) return true; + String playername = record.getMessage().split(" ")[0]; + record.setMessage(playername + " issued an AuthMe command!"); + return true; + } catch (NullPointerException npe) { + return true; + } + } + +} diff --git a/src/main/java/uk/org/whoami/authme/Management.java b/src/main/java/uk/org/whoami/authme/Management.java index b42ed74d3..d0986103f 100644 --- a/src/main/java/uk/org/whoami/authme/Management.java +++ b/src/main/java/uk/org/whoami/authme/Management.java @@ -34,470 +34,655 @@ import uk.org.whoami.authme.settings.Spawn; public class Management { - private Messages m = Messages.getInstance(); - private PlayersLogs pllog = PlayersLogs.getInstance(); - private Utils utils = Utils.getInstance(); - private FileCache playerCache = new FileCache(); - private DataSource database; - public AuthMe plugin; - private boolean passpartu = false; - public static RandomString rdm = new RandomString(Settings.captchaLength); - public PluginManager pm; + private Messages m = Messages.getInstance(); + private PlayersLogs pllog = PlayersLogs.getInstance(); + private Utils utils = Utils.getInstance(); + private FileCache playerCache = new FileCache(); + private DataSource database; + public AuthMe plugin; + public static RandomString rdm = new RandomString(Settings.captchaLength); + public PluginManager pm; - public Management(DataSource database, AuthMe plugin) { - this.database = database; - this.plugin = plugin; - this.pm = plugin.getServer().getPluginManager(); - } + public Management(DataSource database, AuthMe plugin) { + this.database = database; + this.plugin = plugin; + this.pm = plugin.getServer().getPluginManager(); + } - public Management(DataSource database, boolean passpartu, AuthMe plugin) { - this.database = database; - this.passpartu = passpartu; - this.plugin = plugin; - this.pm = plugin.getServer().getPluginManager(); - } + public void performLogin(final Player player, final String password, + final boolean passpartu) { + final String name = player.getName().toLowerCase(); - public void performLogin(final Player player, final String password) { - final String name = player.getName().toLowerCase(); - - Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { + Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { @Override public void run() { - String ip = player.getAddress().getAddress().getHostAddress(); - if (Settings.bungee) { - if (plugin.realIp.containsKey(name)) - ip = plugin.realIp.get(name); + String ip = player.getAddress().getAddress().getHostAddress(); + if (Settings.bungee) { + if (plugin.realIp.containsKey(name)) + ip = plugin.realIp.get(name); + } + World world = player.getWorld(); + Location spawnLoc = world.getSpawnLocation(); + if (plugin.mv != null) { + try { + spawnLoc = plugin.mv.getMVWorldManager() + .getMVWorld(world).getSpawnLocation(); + } catch (NullPointerException npe) { + } catch (ClassCastException cce) { + } catch (NoClassDefFoundError ncdfe) { + } + } + if (plugin.essentialsSpawn != null) { + spawnLoc = plugin.essentialsSpawn; } - World world = player.getWorld(); - Location spawnLoc = world.getSpawnLocation(); - if (plugin.mv != null) { - try { - spawnLoc = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation(); - } catch (NullPointerException npe) { - } catch (ClassCastException cce) { - } catch (NoClassDefFoundError ncdfe) { - } - } - if (Spawn.getInstance().getLocation() != null) - spawnLoc = Spawn.getInstance().getLocation(); - if (PlayerCache.getInstance().isAuthenticated(name)) { - player.sendMessage(m._("logged_in")); - return; - } - if (!database.isAuthAvailable(player.getName().toLowerCase())) { - player.sendMessage(m._("user_unknown")); - return; - } - PlayerAuth pAuth = database.getAuth(name); - if(pAuth == null) { - player.sendMessage(m._("user_unknown")); - return; - } - if(!Settings.getMySQLColumnGroup.isEmpty() && pAuth.getGroupId() == Settings.getNonActivatedGroup) { - player.sendMessage(m._("vb_nonActiv")); - return; - } - String hash = pAuth.getHash(); - String email = pAuth.getEmail(); - try { - if(!passpartu) { - if (Settings.useCaptcha) { - if(!plugin.captcha.containsKey(name)) { - plugin.captcha.put(name, 1); - } else { - int i = plugin.captcha.get(name) + 1; - 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")); - plugin.cap.put(name, rdm.nextString()); - player.sendMessage("Type : /captcha " + plugin.cap.get(name)); - return; - } else if (plugin.captcha.containsKey(name) && plugin.captcha.get(name) > Settings.maxLoginTry) { - try { - plugin.captcha.remove(name); - plugin.cap.remove(name); - } catch (NullPointerException npe) { - } - } - } - if (PasswordSecurity.comparePasswordWithHash(password, hash, name)) { - PlayerAuth auth = new PlayerAuth(name, hash, ip, new Date().getTime(), email); - database.updateSession(auth); - PlayerCache.getInstance().addPlayer(auth); - final LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); - PlayerAuth getAuth = database.getAuth(name); - if (limbo != null) { - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - player.setOp(limbo.getOperator()); + if (Spawn.getInstance().getLocation() != null) + spawnLoc = Spawn.getInstance().getLocation(); + if (PlayerCache.getInstance().isAuthenticated(name)) { + player.sendMessage(m._("logged_in")); + return; + } + if (!database.isAuthAvailable(player.getName().toLowerCase())) { + player.sendMessage(m._("user_unknown")); + return; + } + PlayerAuth pAuth = database.getAuth(name); + if (pAuth == null) { + player.sendMessage(m._("user_unknown")); + return; + } + if (!Settings.getMySQLColumnGroup.isEmpty() + && pAuth.getGroupId() == Settings.getNonActivatedGroup) { + player.sendMessage(m._("vb_nonActiv")); + return; + } + String hash = pAuth.getHash(); + String email = pAuth.getEmail(); + try { + if (!passpartu) { + if (Settings.useCaptcha) { + if (!plugin.captcha.containsKey(name)) { + plugin.captcha.put(name, 1); + } else { + int i = plugin.captcha.get(name) + 1; + 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")); + plugin.cap.put(name, rdm.nextString()); + player.sendMessage("Type : /captcha " + + plugin.cap.get(name)); + return; + } else if (plugin.captcha.containsKey(name) + && plugin.captcha.get(name) > Settings.maxLoginTry) { + try { + plugin.captcha.remove(name); + plugin.cap.remove(name); + } catch (NullPointerException npe) { } - }); - - utils.addNormal(player, limbo.getGroup()); - - if ((Settings.isTeleportToSpawnEnabled) && (!Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) - { - if ((Settings.isSaveQuitLocationEnabled) && (getAuth.getQuitLocY() != 0)) - { - utils.packCoords(getAuth.getQuitLocX(), getAuth.getQuitLocY(), getAuth.getQuitLocZ(), player); - } - else { - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, limbo.getLoc()); - pm.callEvent(tpEvent); - Location fLoc = tpEvent.getTo(); - if (!tpEvent.isCancelled()) { - if (!fLoc.getChunk().isLoaded()) { - fLoc.getChunk().load(); - } - player.teleport(fLoc); - } - } - }); - } - } - else if (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName())) { - final Location spawnL = spawnLoc; - Bukkit.getScheduler().runTask(plugin, new Runnable() { + } + } + if (PasswordSecurity.comparePasswordWithHash(password, + hash, name)) { + PlayerAuth auth = new PlayerAuth(name, hash, ip, + new Date().getTime(), email); + database.updateSession(auth); + PlayerCache.getInstance().addPlayer(auth); + final LimboPlayer limbo = LimboCache.getInstance() + .getLimboPlayer(name); + PlayerAuth getAuth = database.getAuth(name); + if (limbo != null) { + Bukkit.getScheduler().runTask(plugin, + new Runnable() { @Override public void run() { - SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnL, true); - pm.callEvent(tpEvent); - if(!tpEvent.isCancelled()) { - Location fLoc = tpEvent.getTo(); - if (!fLoc.getChunk().isLoaded()) { + player.setOp(limbo + .getOperator()); + } + }); + + utils.addNormal(player, limbo.getGroup()); + + if ((Settings.isTeleportToSpawnEnabled) + && (!Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds + .contains(player.getWorld() + .getName()))) { + if ((Settings.isSaveQuitLocationEnabled) + && (getAuth.getQuitLocY() != 0)) { + utils.packCoords(getAuth.getQuitLocX(), + getAuth.getQuitLocY(), + getAuth.getQuitLocZ(), + getAuth.getWorld(), player); + } else { + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent( + player, + limbo.getLoc()); + pm.callEvent(tpEvent); + Location fLoc = tpEvent + .getTo(); + if (!tpEvent + .isCancelled()) { + if (!fLoc + .getChunk() + .isLoaded()) { + fLoc.getChunk() + .load(); + } + player.teleport(fLoc); + } + } + }); + } + } else if (Settings.isForceSpawnLocOnJoinEnabled + && Settings.getForcedWorlds + .contains(player.getWorld() + .getName())) { + final Location spawnL = spawnLoc; + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + SpawnTeleportEvent tpEvent = new SpawnTeleportEvent( + player, + player.getLocation(), + spawnL, true); + pm.callEvent(tpEvent); + if (!tpEvent.isCancelled()) { + Location fLoc = tpEvent + .getTo(); + if (!fLoc.getChunk() + .isLoaded()) { + fLoc.getChunk() + .load(); + } + player.teleport(fLoc); + } + } + }); + } else if ((Settings.isSaveQuitLocationEnabled) + && (getAuth.getQuitLocY() != 0)) { + utils.packCoords(getAuth.getQuitLocX(), + getAuth.getQuitLocY(), + getAuth.getQuitLocZ(), + getAuth.getWorld(), player); + } else { + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent( + player, limbo + .getLoc()); + pm.callEvent(tpEvent); + Location fLoc = tpEvent + .getTo(); + if (!tpEvent.isCancelled()) { + if (!fLoc.getChunk() + .isLoaded()) { + fLoc.getChunk() + .load(); + } + player.teleport(fLoc); + } + } + }); + } + + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + player.setGameMode(GameMode + .getByValue(limbo + .getGameMode())); + } + }); + + if (Settings.protectInventoryBeforeLogInEnabled + && player.hasPlayedBefore()) { + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + RestoreInventoryEvent event = new RestoreInventoryEvent( + player, + limbo.getInventory(), + limbo.getArmour()); + Bukkit.getServer() + .getPluginManager() + .callEvent(event); + if (!event.isCancelled()) { + API.setPlayerInventory( + player, + limbo.getInventory(), + limbo.getArmour()); + } + } + }); + } + + player.getServer().getScheduler() + .cancelTask(limbo.getTimeoutTaskId()); + player.getServer().getScheduler() + .cancelTask(limbo.getMessageTaskId()); + LimboCache.getInstance() + .deleteLimboPlayer(name); + if (playerCache.doesCacheExist(name)) { + playerCache.removeCache(name); + } + } + + /* + * Little Work Around under Registration Group + * Switching for admins that add Registration thru a + * web Scripts. + */ + if (Settings.isPermissionCheckEnabled + && AuthMe.permission.playerInGroup(player, + Settings.unRegisteredGroup) + && !Settings.unRegisteredGroup.isEmpty()) { + AuthMe.permission.playerRemoveGroup( + player.getWorld(), player.getName(), + Settings.unRegisteredGroup); + AuthMe.permission.playerAddGroup( + player.getWorld(), player.getName(), + Settings.getRegisteredGroup); + } + + try { + if (!PlayersLogs.players.contains(player + .getName())) + PlayersLogs.players.add(player.getName()); + pllog.save(); + } catch (NullPointerException ex) { + } + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + Bukkit.getServer() + .getPluginManager() + .callEvent( + new LoginEvent( + player, + true)); + } + }); + if (Settings.useCaptcha) { + if (plugin.captcha.containsKey(name)) { + plugin.captcha.remove(name); + } + if (plugin.cap.containsKey(name)) { + plugin.cap.containsKey(name); + } + } + player.sendMessage(m._("login")); + displayOtherAccounts(auth); + if (!Settings.noConsoleSpam) + ConsoleLogger.info(player.getName() + + " logged in!"); + if (plugin.notifications != null) { + plugin.notifications + .showNotification(new Notification( + "[AuthMe] " + player.getName() + + " logged in!")); + } + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + player.saveData(); + } + }); + + } else { + if (!Settings.noConsoleSpam) + ConsoleLogger.info(player.getName() + + " used the wrong password"); + if (Settings.isKickOnWrongPasswordEnabled) { + try { + final int gm = AuthMePlayerListener.gameMode + .get(name); + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + player.setGameMode(GameMode + .getByValue(gm)); + } + }); + } catch (NullPointerException npe) { + } + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + player.kickPlayer(m + ._("wrong_pwd")); + } + }); + } else { + player.sendMessage(m._("wrong_pwd")); + return; + } + } + } else { + // need for bypass password check if passpartu command + // is enabled + PlayerAuth auth = new PlayerAuth(name, hash, ip, + new Date().getTime(), email); + database.updateSession(auth); + PlayerCache.getInstance().addPlayer(auth); + final LimboPlayer limbo = LimboCache.getInstance() + .getLimboPlayer(name); + if (limbo != null) { + + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + player.setOp(limbo.getOperator()); + } + }); + + utils.addNormal(player, limbo.getGroup()); + + if ((Settings.isTeleportToSpawnEnabled) + && (!Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds + .contains(player.getWorld() + .getName()))) { + if ((Settings.isSaveQuitLocationEnabled) + && (database.getAuth(name) + .getQuitLocY() != 0)) { + String worldname = database.getAuth(name) + .getWorld(); + World theWorld; + if (worldname.equals("unavailableworld")) { + theWorld = player.getWorld(); + } else { + theWorld = Bukkit.getWorld(worldname); + } + if (theWorld == null) + theWorld = player.getWorld(); + final Location quitLoc = new Location( + theWorld, database.getAuth(name) + .getQuitLocX() + 0.5D, + database.getAuth(name) + .getQuitLocY() + 0.5D, + database.getAuth(name) + .getQuitLocZ() + 0.5D); + + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent( + player, quitLoc); + pm.callEvent(tpEvent); + Location fLoc = tpEvent + .getTo(); + if (!tpEvent.isCancelled()) { + if (!fLoc.getChunk() + .isLoaded()) { + fLoc.getChunk() + .load(); + } + player.teleport(fLoc); + } + } + }); + } else { + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent( + player, limbo + .getLoc()); + pm.callEvent(tpEvent); + Location fLoc = tpEvent + .getTo(); + if (!tpEvent.isCancelled()) { + if (!fLoc.getChunk() + .isLoaded()) { + fLoc.getChunk() + .load(); + } + player.teleport(fLoc); + } + } + }); + } + } else if (Settings.isForceSpawnLocOnJoinEnabled + && Settings.getForcedWorlds.contains(player + .getWorld().getName())) { + final Location spawnL = spawnLoc; + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + SpawnTeleportEvent tpEvent = new SpawnTeleportEvent( + player, player + .getLocation(), + spawnL, true); + pm.callEvent(tpEvent); + if (!tpEvent.isCancelled()) { + Location fLoc = tpEvent + .getTo(); + if (!fLoc.getChunk() + .isLoaded()) { fLoc.getChunk().load(); } player.teleport(fLoc); } } - }); - } - else if ((Settings.isSaveQuitLocationEnabled) && (getAuth.getQuitLocY() != 0)) - { - utils.packCoords(getAuth.getQuitLocX(), getAuth.getQuitLocY(), getAuth.getQuitLocZ(), player); - } - else { - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, limbo.getLoc()); - pm.callEvent(tpEvent); - Location fLoc = tpEvent.getTo(); - if (!tpEvent.isCancelled()) { - if (!fLoc.getChunk().isLoaded()) { - fLoc.getChunk().load(); - } - player.teleport(fLoc); - } - } - }); - } - - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - player.setGameMode(GameMode.getByValue(limbo.getGameMode())); + }); + } else if ((Settings.isSaveQuitLocationEnabled) + && (database.getAuth(name).getQuitLocY() != 0)) { + String worldname = database.getAuth(name) + .getWorld(); + World theWorld; + if (worldname.equals("unavailableworld")) { + theWorld = player.getWorld(); + } else { + theWorld = Bukkit.getWorld(worldname); } - }); - - if (Settings.protectInventoryBeforeLogInEnabled && player.hasPlayedBefore()) { - RestoreInventoryEvent event = new RestoreInventoryEvent(player, limbo.getInventory(), limbo.getArmour()); - Bukkit.getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - API.setPlayerInventory(player, limbo.getInventory(), limbo.getArmour()); - } - } - - player.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId()); - player.getServer().getScheduler().cancelTask(limbo.getMessageTaskId()); - LimboCache.getInstance().deleteLimboPlayer(name); - if (playerCache.doesCacheExist(name)) { - playerCache.removeCache(name); - } - } - - /* - * Little Work Around under Registration Group Switching for admins that - * add Registration thru a web Scripts. - */ - if ( Settings.isPermissionCheckEnabled && AuthMe.permission.playerInGroup(player, Settings.unRegisteredGroup) && !Settings.unRegisteredGroup.isEmpty() ) { - AuthMe.permission.playerRemoveGroup(player.getWorld(), player.getName(), Settings.unRegisteredGroup); - AuthMe.permission.playerAddGroup(player.getWorld(), player.getName(), Settings.getRegisteredGroup); - } - - try { - if (!PlayersLogs.players.contains(player.getName())) - PlayersLogs.players.add(player.getName()); - pllog.save(); - } catch (NullPointerException ex) { - } - - Bukkit.getServer().getPluginManager().callEvent(new LoginEvent(player, true)); - if (Settings.useCaptcha) { - if(plugin.captcha.containsKey(name)) { - plugin.captcha.remove(name); - } - if(plugin.cap.containsKey(name)) { - plugin.cap.containsKey(name); - } - } - player.sendMessage(m._("login")); - displayOtherAccounts(auth); - if(!Settings.noConsoleSpam) - ConsoleLogger.info(player.getName() + " logged in!"); - if(plugin.notifications != null) { - plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " logged in!")); - } - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - player.saveData(); - } - }); - - } else { - if (!Settings.noConsoleSpam) - ConsoleLogger.info(player.getName() + " used the wrong password"); - if (Settings.isKickOnWrongPasswordEnabled) { - try { - final int gm = AuthMePlayerListener.gameMode.get(name); - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - player.setGameMode(GameMode.getByValue(gm)); - } - }); - } catch (NullPointerException npe) {} - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - player.kickPlayer(m._("wrong_pwd")); - } - }); - } else { - player.sendMessage(m._("wrong_pwd")); - return; - } - } - } else { - // need for bypass password check if passpartu command is enabled - PlayerAuth auth = new PlayerAuth(name, hash, ip, new Date().getTime(), email); - database.updateSession(auth); - PlayerCache.getInstance().addPlayer(auth); - final LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); - if (limbo != null) { - - Bukkit.getScheduler().runTask(plugin, new Runnable(){ - @Override - public void run() { - player.setOp(limbo.getOperator()); - } - }); - - utils.addNormal(player, limbo.getGroup()); - - if ((Settings.isTeleportToSpawnEnabled) && (!Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) - { - if ((Settings.isSaveQuitLocationEnabled) && (database.getAuth(name).getQuitLocY() != 0)) { - final Location quitLoc = new Location(player.getWorld(), database.getAuth(name).getQuitLocX() + 0.5D, database.getAuth(name).getQuitLocY() + 0.5D, database.getAuth(name).getQuitLocZ() + 0.5D); - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, quitLoc); - pm.callEvent(tpEvent); - Location fLoc = tpEvent.getTo(); - if (!tpEvent.isCancelled()) { - if (!fLoc.getChunk().isLoaded()) { - fLoc.getChunk().load(); - } - player.teleport(fLoc); - } - } - }); - } - else - { - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, limbo.getLoc()); - pm.callEvent(tpEvent); - Location fLoc = tpEvent.getTo(); - if (!tpEvent.isCancelled()) { - if (!fLoc.getChunk().isLoaded()) { - fLoc.getChunk().load(); - } - player.teleport(fLoc); - } - } - }); - } - } - else if (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName())) { - final Location spawnL = spawnLoc; - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnL, true); - pm.callEvent(tpEvent); - if(!tpEvent.isCancelled()) { + if (theWorld == null) + theWorld = player.getWorld(); + final Location quitLoc = new Location( + theWorld, + database.getAuth(name).getQuitLocX() + 0.5D, + database.getAuth(name).getQuitLocY() + 0.5D, + database.getAuth(name).getQuitLocZ() + 0.5D); + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent( + player, quitLoc); + pm.callEvent(tpEvent); Location fLoc = tpEvent.getTo(); - if (!fLoc.getChunk().isLoaded()) { - fLoc.getChunk().load(); + if (!tpEvent.isCancelled()) { + if (!fLoc.getChunk() + .isLoaded()) { + fLoc.getChunk().load(); + } + player.teleport(fLoc); } - player.teleport(fLoc); } - } - }); - } - else if ((Settings.isSaveQuitLocationEnabled) && (database.getAuth(name).getQuitLocY() != 0)) { - final Location quitLoc = new Location(player.getWorld(), database.getAuth(name).getQuitLocX() + 0.5D, database.getAuth(name).getQuitLocY() + 0.5D, database.getAuth(name).getQuitLocZ() + 0.5D); - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, quitLoc); - pm.callEvent(tpEvent); - Location fLoc = tpEvent.getTo(); - if (!tpEvent.isCancelled()) { - if (!fLoc.getChunk().isLoaded()) { - fLoc.getChunk().load(); - } - player.teleport(fLoc); - } - } - }); - } - else - { - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, limbo.getLoc()); - pm.callEvent(tpEvent); - Location fLoc = tpEvent.getTo(); - if (!tpEvent.isCancelled()) { - if (!fLoc.getChunk().isLoaded()) { - fLoc.getChunk().load(); - } - player.teleport(fLoc); - } + }); + } else { + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent( + player, limbo.getLoc()); + pm.callEvent(tpEvent); + Location fLoc = tpEvent.getTo(); + if (!tpEvent.isCancelled()) { + if (!fLoc.getChunk() + .isLoaded()) { + fLoc.getChunk().load(); + } + player.teleport(fLoc); } - }); - } + } + }); + } - Bukkit.getScheduler().runTask(plugin, new Runnable() { - @Override - public void run() { - player.setGameMode(GameMode.getByValue(limbo.getGameMode())); - } - }); + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + player.setGameMode(GameMode + .getByValue(limbo + .getGameMode())); + } + }); - if (Settings.protectInventoryBeforeLogInEnabled && player.hasPlayedBefore()) { - RestoreInventoryEvent event = new RestoreInventoryEvent(player, limbo.getInventory(), limbo.getArmour()); - Bukkit.getServer().getPluginManager().callEvent(event); - if (!event.isCancelled()) { - API.setPlayerInventory(player, limbo.getInventory(), limbo.getArmour()); - } - } + if (Settings.protectInventoryBeforeLogInEnabled + && player.hasPlayedBefore()) { + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + RestoreInventoryEvent event = new RestoreInventoryEvent( + player, + limbo.getInventory(), + limbo.getArmour()); + Bukkit.getServer() + .getPluginManager() + .callEvent(event); + if (!event.isCancelled()) { + API.setPlayerInventory( + player, + limbo.getInventory(), + limbo.getArmour()); + } + } + }); + } - player.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId()); - player.getServer().getScheduler().cancelTask(limbo.getMessageTaskId()); - LimboCache.getInstance().deleteLimboPlayer(name); - if (playerCache.doesCacheExist(name)) { - playerCache.removeCache(name); - } - } + player.getServer().getScheduler() + .cancelTask(limbo.getTimeoutTaskId()); + player.getServer().getScheduler() + .cancelTask(limbo.getMessageTaskId()); + LimboCache.getInstance().deleteLimboPlayer(name); + if (playerCache.doesCacheExist(name)) { + playerCache.removeCache(name); + } + } - /* - * Little Work Around under Registration Group Switching for admins that - * add Registration thru a web Scripts. - */ - if ( Settings.isPermissionCheckEnabled && AuthMe.permission.playerInGroup(player, Settings.unRegisteredGroup) && !Settings.unRegisteredGroup.isEmpty() ) { - AuthMe.permission.playerRemoveGroup(player.getWorld(), player.getName(), Settings.unRegisteredGroup); - AuthMe.permission.playerAddGroup(player.getWorld(), player.getName(), Settings.getRegisteredGroup); - } + /* + * Little Work Around under Registration Group Switching + * for admins that add Registration thru a web Scripts. + */ + if (Settings.isPermissionCheckEnabled + && AuthMe.permission.playerInGroup(player, + Settings.unRegisteredGroup) + && !Settings.unRegisteredGroup.isEmpty()) { + AuthMe.permission.playerRemoveGroup( + player.getWorld(), player.getName(), + Settings.unRegisteredGroup); + AuthMe.permission.playerAddGroup(player.getWorld(), + player.getName(), + Settings.getRegisteredGroup); + } - try { - if (!PlayersLogs.players.contains(player.getName())) - PlayersLogs.players.add(player.getName()); - pllog.save(); - } catch (NullPointerException ex) { } - - Bukkit.getServer().getPluginManager().callEvent(new LoginEvent(player, true)); - if (Settings.useCaptcha) { - if(plugin.captcha.containsKey(name)) { - plugin.captcha.remove(name); - } - if(plugin.cap.containsKey(name)) { - plugin.cap.containsKey(name); - } - } - player.sendMessage(m._("login")); - displayOtherAccounts(auth); - if(!Settings.noConsoleSpam) - ConsoleLogger.info(player.getName() + " logged in!"); - if(plugin.notifications != null) { - plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " logged in!")); - } - Bukkit.getScheduler().runTask(plugin, new Runnable() { + try { + if (!PlayersLogs.players.contains(player.getName())) + PlayersLogs.players.add(player.getName()); + pllog.save(); + } catch (NullPointerException ex) { + } + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + Bukkit.getServer() + .getPluginManager() + .callEvent(new LoginEvent(player, true)); + } + }); + if (Settings.useCaptcha) { + if (plugin.captcha.containsKey(name)) { + plugin.captcha.remove(name); + } + if (plugin.cap.containsKey(name)) { + plugin.cap.containsKey(name); + } + } + player.sendMessage(m._("login")); + displayOtherAccounts(auth); + if (!Settings.noConsoleSpam) + ConsoleLogger.info(player.getName() + " logged in!"); + if (plugin.notifications != null) { + plugin.notifications + .showNotification(new Notification( + "[AuthMe] " + player.getName() + + " logged in!")); + } + Bukkit.getScheduler().runTask(plugin, new Runnable() { @Override public void run() { player.saveData(); } - }); - passpartu = false; - } - } catch (NoSuchAlgorithmException ex) { - ConsoleLogger.showError(ex.getMessage()); - player.sendMessage(m._("error")); - return; - } - return; + }); + } + } catch (NoSuchAlgorithmException ex) { + ConsoleLogger.showError(ex.getMessage()); + player.sendMessage(m._("error")); + return; + } + return; } - - }); + + }); } - private void displayOtherAccounts(PlayerAuth auth) { - if (!Settings.displayOtherAccounts) { - return; - } - if (auth == null) { - return; - } - if (this.database.getAllAuthsByName(auth).isEmpty() || this.database.getAllAuthsByName(auth) == null) { - return; - } - if(this.database.getAllAuthsByName(auth).size() == 1) { - return; - } - List accountList = this.database.getAllAuthsByName(auth); - String message = "[AuthMe] "; - int i = 0; - for (String account : accountList) { - i++; - message = message + account; - if (i != accountList.size()) { - message = message + ", "; - } else { - message = message + "."; - } + private void displayOtherAccounts(PlayerAuth auth) { + if (!Settings.displayOtherAccounts) { + return; + } + if (auth == null) { + return; + } + if (this.database.getAllAuthsByName(auth).isEmpty() + || this.database.getAllAuthsByName(auth) == null) { + return; + } + if (this.database.getAllAuthsByName(auth).size() == 1) { + return; + } + List accountList = this.database.getAllAuthsByName(auth); + String message = "[AuthMe] "; + int i = 0; + for (String account : accountList) { + i++; + message = message + account; + if (i != accountList.size()) { + message = message + ", "; + } else { + message = message + "."; + } - } - for (Player player : AuthMe.getInstance().getServer().getOnlinePlayers()) { - if (plugin.authmePermissible(player, "authme.seeOtherAccounts")) { - player.sendMessage("[AuthMe] The player " + auth.getNickname() + " has " + String.valueOf(accountList.size()) + " accounts"); - player.sendMessage(message); - } - } - } + } + for (Player player : AuthMe.getInstance().getServer() + .getOnlinePlayers()) { + if (plugin.authmePermissible(player, "authme.seeOtherAccounts")) { + player.sendMessage("[AuthMe] The player " + auth.getNickname() + + " has " + String.valueOf(accountList.size()) + + " accounts"); + player.sendMessage(message); + } + } + } } diff --git a/src/main/java/uk/org/whoami/authme/SendMailSSL.java b/src/main/java/uk/org/whoami/authme/SendMailSSL.java index 1f8bc4377..26af1ed9b 100644 --- a/src/main/java/uk/org/whoami/authme/SendMailSSL.java +++ b/src/main/java/uk/org/whoami/authme/SendMailSSL.java @@ -1,6 +1,7 @@ package uk.org.whoami.authme; import java.io.UnsupportedEncodingException; +import java.util.Date; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; @@ -62,11 +63,12 @@ public class SendMailSSL { message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(auth.getEmail())); message.setSubject(Settings.getMailSubject); + message.setSentDate(new Date()); String text = Settings.getMailText; text = text.replaceAll("", auth.getNickname()); text = text.replaceAll("", instance.getServer().getServerName()); text = text.replaceAll("", newPass); - message.setText(text); + message.setContent(text, "text/html"); Bukkit.getScheduler().runTaskAsynchronously(instance, new Runnable() { @Override public void run() { diff --git a/src/main/java/uk/org/whoami/authme/Utils.java b/src/main/java/uk/org/whoami/authme/Utils.java index 2e4bfd2b3..864300c24 100644 --- a/src/main/java/uk/org/whoami/authme/Utils.java +++ b/src/main/java/uk/org/whoami/authme/Utils.java @@ -114,11 +114,20 @@ public class Utils { } return false; } - public void packCoords(int x, int y, int z, final Player pl) + public void packCoords(int x, int y, int z, String w, final Player pl) { - final World world = pl.getWorld(); + World theWorld; + if (w.equals("unavailableworld")) { + theWorld = pl.getWorld(); + } else { + theWorld = Bukkit.getWorld(w); + } + if (theWorld == null) + theWorld = pl.getWorld(); + final World world = theWorld; final int fY = y; - final Location loc = new Location(world, x, y + 0.6D, z); + final Location locat = new Location(world, x, y + 0.6D, z); + final Location loc = locat.getBlock().getLocation(); Bukkit.getScheduler().runTask(AuthMe.getInstance(), new Runnable() { @@ -132,7 +141,7 @@ public class Utils { pl.teleport(tpEvent.getTo()); } } - + }); id = Bukkit.getScheduler().runTaskTimer(AuthMe.authme, new Runnable() @@ -146,12 +155,11 @@ public class Utils { } } }, 1L, 20L); - Bukkit.getScheduler().runTaskLaterAsynchronously(AuthMe.authme, new Runnable() + Bukkit.getScheduler().runTaskLater(AuthMe.authme, new Runnable() { @Override public void run() { id.cancel(); - } }, 60L); } diff --git a/src/main/java/uk/org/whoami/authme/api/API.java b/src/main/java/uk/org/whoami/authme/api/API.java index 6cec7d55e..843df7c47 100644 --- a/src/main/java/uk/org/whoami/authme/api/API.java +++ b/src/main/java/uk/org/whoami/authme/api/API.java @@ -131,7 +131,7 @@ public class API { PlayerAuth auth = PlayerCache.getInstance().getAuth(player.getName()); if (auth != null) { - Location loc = new Location(player.getWorld(), auth.getQuitLocX(), auth.getQuitLocY() , auth.getQuitLocZ()); + Location loc = new Location(Bukkit.getWorld(auth.getWorld()), auth.getQuitLocX(), auth.getQuitLocY() , auth.getQuitLocZ()); return loc; } else { return null; @@ -182,5 +182,17 @@ public class API { } }); } + + /** + * + * @param playerName + * @return true if player is registered + */ + public static boolean isRegistered(String playerName) { + PlayerAuth auth = PlayerCache.getInstance().getAuth(playerName); + if (auth != null) + return true; + return false; + } } diff --git a/src/main/java/uk/org/whoami/authme/cache/auth/PlayerAuth.java b/src/main/java/uk/org/whoami/authme/cache/auth/PlayerAuth.java index eab1ccaf6..de95552ab 100644 --- a/src/main/java/uk/org/whoami/authme/cache/auth/PlayerAuth.java +++ b/src/main/java/uk/org/whoami/authme/cache/auth/PlayerAuth.java @@ -28,6 +28,7 @@ public class PlayerAuth { private int x = 0; private int y = 0; private int z = 0; + private String world = "world"; private String salt = ""; private String vBhash = null; private int groupId; @@ -48,14 +49,15 @@ public class PlayerAuth { this.email = email; } - public PlayerAuth(String nickname, int x, int y, int z) { + public PlayerAuth(String nickname, int x, int y, int z, String world) { this.nickname = nickname; this.x = x; this.y = y; this.z = z; + this.world = world; } - public PlayerAuth(String nickname, String hash, String ip, long lastLogin, int x, int y, int z, String email) { + public PlayerAuth(String nickname, String hash, String ip, long lastLogin, int x, int y, int z, String world, String email) { this.nickname = nickname; this.hash = hash; this.ip = ip; @@ -63,17 +65,19 @@ public class PlayerAuth { this.x = x; this.y = y; this.z = z; + this.world = world; this.email = email; } - public PlayerAuth(String nickname, String hash, String salt, int groupId, String ip, long lastLogin, int x, int y, int z, 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) { this.nickname = nickname; this.hash = hash; this.ip = ip; this.lastLogin = lastLogin; this.x = x; this.y = y; - this.z = z; + this.z = z; + this.world = world; this.salt = salt; this.groupId = groupId; this.email = email; @@ -96,19 +100,7 @@ public class PlayerAuth { this.salt = salt; } - public PlayerAuth(String nickname, String hash, String salt, String ip, long lastLogin, int x, int y, int z, String email) { - this.nickname = nickname; - this.hash = hash; - this.ip = ip; - this.lastLogin = lastLogin; - this.x = x; - this.y = y; - this.z = z; - this.salt = salt; - this.email = email; - } - - public PlayerAuth(String nickname, String hash, String ip, long lastLogin, int x, int y, int z) { + public PlayerAuth(String nickname, String hash, String salt, String ip, long lastLogin, int x, int y, int z, String world, String email) { this.nickname = nickname; this.hash = hash; this.ip = ip; @@ -116,6 +108,20 @@ public class PlayerAuth { this.x = x; this.y = y; 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"; } @@ -207,4 +213,12 @@ public class PlayerAuth { return hashCode; } + public void setWorld(String world) { + this.world = world; + } + + public String getWorld() { + return world; + } + } diff --git a/src/main/java/uk/org/whoami/authme/cache/limbo/LimboCache.java b/src/main/java/uk/org/whoami/authme/cache/limbo/LimboCache.java index ebefade8b..ae8b9a06d 100644 --- a/src/main/java/uk/org/whoami/authme/cache/limbo/LimboCache.java +++ b/src/main/java/uk/org/whoami/authme/cache/limbo/LimboCache.java @@ -28,6 +28,7 @@ import uk.org.whoami.authme.cache.backup.FileCache; import uk.org.whoami.authme.events.ResetInventoryEvent; import uk.org.whoami.authme.events.StoreInventoryEvent; import uk.org.whoami.authme.settings.Settings; +import uk.org.whoami.authme.settings.Spawn; public class LimboCache { @@ -97,6 +98,8 @@ public class LimboCache { loc = plugin.mv.getMVWorldManager().getMVWorld(player.getWorld().getName()).getSpawnLocation(); } catch (NullPointerException npe) {} } + if (Spawn.getInstance().getLocation() != null) + loc = Spawn.getInstance().getLocation(); } try { if(cache.containsKey(name) && playerGroup.isEmpty()) { diff --git a/src/main/java/uk/org/whoami/authme/commands/EmailCommand.java b/src/main/java/uk/org/whoami/authme/commands/EmailCommand.java index 2ee66e936..3fbaa52a8 100644 --- a/src/main/java/uk/org/whoami/authme/commands/EmailCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/EmailCommand.java @@ -103,11 +103,11 @@ public class EmailCommand implements CommandExecutor { } else if(args[0].equalsIgnoreCase("change") && args.length == 3 ) { if(PlayerCache.getInstance().isAuthenticated(name)) { PlayerAuth auth = PlayerCache.getInstance().getAuth(name); - if (auth.getEmail() == null || auth.getEmail() == "your@email.com") { + if (auth.getEmail() == null || auth.getEmail().equals("your@email.com")) { player.sendMessage("[AuthMe] Please use : /email add "); return true; } - if (args[1] != auth.getEmail()) { + if (!args[1].equals(auth.getEmail())) { player.sendMessage("[AuthMe] Invalid Email !"); return true; } @@ -161,7 +161,7 @@ public class EmailCommand implements CommandExecutor { sender.sendMessage(m._("unknown_user")); return true; } - if (Settings.getmailAccount == "" || Settings.getmailAccount.isEmpty()) { + if (Settings.getmailAccount.equals("") || Settings.getmailAccount.isEmpty()) { player.sendMessage(m._("error")); return true; } diff --git a/src/main/java/uk/org/whoami/authme/commands/LoginCommand.java b/src/main/java/uk/org/whoami/authme/commands/LoginCommand.java index 80e8ad1cc..bf536d717 100644 --- a/src/main/java/uk/org/whoami/authme/commands/LoginCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/LoginCommand.java @@ -23,6 +23,8 @@ import org.bukkit.entity.Player; import uk.org.whoami.authme.AuthMe; import uk.org.whoami.authme.settings.Messages; +import uk.org.whoami.authme.settings.Settings; +import uk.org.whoami.authme.threads.LoginThread; public class LoginCommand implements CommandExecutor { @@ -50,8 +52,12 @@ public class LoginCommand implements CommandExecutor { player.sendMessage(m._("no_perm")); return true; } - - plugin.management.performLogin(player, args[0]); + if (Settings.useMultiThreading) { + plugin.management.performLogin(player, args[0], false); + } else { + Thread mThread = new LoginThread(plugin.database, plugin, player, args[0]); + mThread.run(); + } return true; } } diff --git a/src/main/java/uk/org/whoami/authme/commands/LogoutCommand.java b/src/main/java/uk/org/whoami/authme/commands/LogoutCommand.java index 9e9e1d50b..05cc1fb0b 100644 --- a/src/main/java/uk/org/whoami/authme/commands/LogoutCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/LogoutCommand.java @@ -94,6 +94,9 @@ public class LogoutCommand implements CommandExecutor { } if (Settings.isTeleportToSpawnEnabled) { Location spawnLoc = player.getWorld().getSpawnLocation(); + if (plugin.essentialsSpawn != null) { + spawnLoc = plugin.essentialsSpawn; + } if (Spawn.getInstance().getLocation() != null) spawnLoc = Spawn.getInstance().getLocation(); AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, spawnLoc); diff --git a/src/main/java/uk/org/whoami/authme/commands/PasspartuCommand.java b/src/main/java/uk/org/whoami/authme/commands/PasspartuCommand.java index 6bfafa9d4..fc90e23a2 100644 --- a/src/main/java/uk/org/whoami/authme/commands/PasspartuCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/PasspartuCommand.java @@ -10,11 +10,12 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import uk.org.whoami.authme.AuthMe; -import uk.org.whoami.authme.Management; import uk.org.whoami.authme.Utils; import uk.org.whoami.authme.cache.auth.PlayerCache; import uk.org.whoami.authme.datasource.DataSource; import uk.org.whoami.authme.settings.Messages; +import uk.org.whoami.authme.settings.Settings; +import uk.org.whoami.authme.threads.LoginThread; /** * @@ -46,9 +47,13 @@ public class PasspartuCommand implements CommandExecutor { if ((sender instanceof Player) && args.length == 1) { if(utils.readToken(args[0])) { //bypass login! - Management bypass = new Management(database,true, plugin); - bypass.performLogin((Player)sender, "dontneed"); - return true; + if (Settings.useMultiThreading) { + Thread bypass = new LoginThread(database, false, plugin, (Player) sender, "dontneed"); + bypass.run(); + } else { + plugin.management.performLogin((Player) sender, "dontneed", true); + } + return true; } sender.sendMessage("Time is expired or Token is Wrong!"); return true; diff --git a/src/main/java/uk/org/whoami/authme/commands/RegisterCommand.java b/src/main/java/uk/org/whoami/authme/commands/RegisterCommand.java index f49919ec0..a87477cde 100644 --- a/src/main/java/uk/org/whoami/authme/commands/RegisterCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/RegisterCommand.java @@ -48,6 +48,7 @@ import uk.org.whoami.authme.settings.Settings; import uk.org.whoami.authme.settings.Spawn; import uk.org.whoami.authme.task.MessageTask; import uk.org.whoami.authme.task.TimeoutTask; +import uk.org.whoami.authme.threads.RegisterThread; public class RegisterCommand implements CommandExecutor { @@ -85,125 +86,218 @@ public class RegisterCommand implements CommandExecutor { } final String ip = ipA; - if (PlayerCache.getInstance().isAuthenticated(name)) { - player.sendMessage(m._("logged_in")); - return true; - } - - if (!Settings.isRegistrationEnabled) { - player.sendMessage(m._("reg_disabled")); - return true; - } - - if (database.isAuthAvailable(player.getName().toLowerCase())) { - player.sendMessage(m._("user_regged")); - if (pllog.getStringList("players").contains(player.getName())) { - pllog.getStringList("players").remove(player.getName()); - } - return true; - } - - if(Settings.getmaxRegPerIp > 0 ){ - if(!plugin.authmePermissible(sender, "authme.allow2accounts") && database.getAllAuthsByIp(ipA).size() >= Settings.getmaxRegPerIp) { - player.sendMessage(m._("max_reg")); + + if (Settings.useMultiThreading) { + Thread register = new RegisterThread(plugin, database, player, ip, args); + register.run(); + return true; + } else { + if (PlayerCache.getInstance().isAuthenticated(name)) { + player.sendMessage(m._("logged_in")); return true; - } - } + } - if(Settings.emailRegistration && !Settings.getmailAccount.isEmpty()) { - if(!args[0].contains("@")) { + if (!Settings.isRegistrationEnabled) { + player.sendMessage(m._("reg_disabled")); + return true; + } + + if (database.isAuthAvailable(player.getName().toLowerCase())) { + player.sendMessage(m._("user_regged")); + if (pllog.getStringList("players").contains(player.getName())) { + pllog.getStringList("players").remove(player.getName()); + } + return true; + } + + if(Settings.getmaxRegPerIp > 0 ){ + if(!plugin.authmePermissible(sender, "authme.allow2accounts") && database.getAllAuthsByIp(ipA).size() >= Settings.getmaxRegPerIp) { + player.sendMessage(m._("max_reg")); + return true; + } + } + + if(Settings.emailRegistration && !Settings.getmailAccount.isEmpty()) { + if(!args[0].contains("@")) { + player.sendMessage(m._("usage_reg")); + return true; + } + if(Settings.doubleEmailCheck) { + if(args.length < 2) { + player.sendMessage(m._("usage_reg")); + return true; + } + if(!args[0].equals(args[1])) { + player.sendMessage(m._("usage_reg")); + return true; + } + } + final String email = args[0]; + if(Settings.getmaxRegPerEmail > 0) { + if (!plugin.authmePermissible(sender, "authme.allow2accounts") && database.getAllAuthsByEmail(email).size() >= Settings.getmaxRegPerEmail) { + player.sendMessage(m._("max_reg")); + return true; + } + } + RandomString rand = new RandomString(Settings.getRecoveryPassLength); + final String thePass = rand.nextString(); + if (!thePass.isEmpty()) { + Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { + @Override + public void run() { + 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); + database.saveAuth(fAuth); + database.updateEmail(fAuth); + database.updateSession(fAuth); + plugin.mail.main(fAuth, thePass); + } catch (NoSuchAlgorithmException e) { + ConsoleLogger.showError(e.getMessage()); + } + } 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); + database.saveAuth(fAuth); + database.updateEmail(fAuth); + database.updateSession(fAuth); + plugin.mail.main(fAuth, thePass); + } catch (NoSuchAlgorithmException e) { + ConsoleLogger.showError(e.getMessage()); + } + } + } + }); + + if(!Settings.getRegisteredGroup.isEmpty()){ + Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED); + } + player.sendMessage(m._("vb_nonActiv")); + String msg = m._("login_msg"); + int time = Settings.getRegistrationTimeout * 20; + int msgInterval = Settings.getWarnMessageInterval; + if (time != 0) { + Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getTimeoutTaskId()); + BukkitTask id = Bukkit.getScheduler().runTaskLater(plugin, new TimeoutTask(plugin, name), time); + LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id.getTaskId()); + } + + Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getMessageTaskId()); + BukkitTask nwMsg = Bukkit.getScheduler().runTask(plugin, new MessageTask(plugin, name, msg, msgInterval)); + LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(nwMsg.getTaskId()); + + LimboCache.getInstance().deleteLimboPlayer(name); + if (Settings.isTeleportToSpawnEnabled) { + World world = player.getWorld(); + Location loca = world.getSpawnLocation(); + if (plugin.mv != null) { + try { + loca = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation(); + } catch (NullPointerException npe) { + } catch (ClassCastException cce) { + } catch (NoClassDefFoundError ncdfe) { + } + } + if (plugin.essentialsSpawn != null) { + loca = plugin.essentialsSpawn; + } + if (Spawn.getInstance().getLocation() != null) + loca = Spawn.getInstance().getLocation(); + RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, loca); + plugin.getServer().getPluginManager().callEvent(tpEvent); + if(!tpEvent.isCancelled()) { + if (!tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).isLoaded()) { + tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).load(); + } + player.teleport(tpEvent.getTo()); + } + } + this.isFirstTimeJoin = true; + player.saveData(); + if (!Settings.noConsoleSpam) + ConsoleLogger.info(player.getName() + " registered "+player.getAddress().getAddress().getHostAddress()); + if(plugin.notifications != null) { + plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " has registered!")); + } + return true; + } + } + + if (args.length == 0 || (Settings.getEnablePasswordVerifier && args.length < 2) ) { player.sendMessage(m._("usage_reg")); return true; - } - if(Settings.doubleEmailCheck) { - if(args.length < 2) { - player.sendMessage(m._("usage_reg")); + } + + if(args[0].length() < Settings.getPasswordMinLen || args[0].length() > Settings.passwordMaxLength) { + player.sendMessage(m._("pass_len")); + return true; + } + try { + String hash; + if(Settings.getEnablePasswordVerifier) { + if (args[0].equals(args[1])) { + hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name); + } else { + player.sendMessage(m._("password_error")); + return true; + } + } else + hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name); + if (Settings.getMySQLColumnSalt.isEmpty()) + { + auth = new PlayerAuth(name, hash, ip, new Date().getTime()); + } else { + auth = new PlayerAuth(name, hash, PasswordSecurity.userSalt.get(name), ip, new Date().getTime()); + } + if (!database.saveAuth(auth)) { + player.sendMessage(m._("error")); return true; - } - if(!args[0].equals(args[1])) { - player.sendMessage(m._("usage_reg")); - return true; - } - } - final String email = args[0]; - if(Settings.getmaxRegPerEmail > 0) { - if (!plugin.authmePermissible(sender, "authme.allow2accounts") && database.getAllAuthsByEmail(email).size() >= Settings.getmaxRegPerEmail) { - player.sendMessage(m._("max_reg")); - return true; - } - } - RandomString rand = new RandomString(Settings.getRecoveryPassLength); - final String thePass = rand.nextString(); - if (!thePass.isEmpty()) { - Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { - @Override - public void run() { - 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(), email); - database.saveAuth(fAuth); - database.updateEmail(fAuth); - database.updateSession(fAuth); - plugin.mail.main(fAuth, thePass); - } catch (NoSuchAlgorithmException e) { - ConsoleLogger.showError(e.getMessage()); - } - } 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(), email); - database.saveAuth(fAuth); - database.updateEmail(fAuth); - database.updateSession(fAuth); - plugin.mail.main(fAuth, thePass); - } catch (NoSuchAlgorithmException e) { - ConsoleLogger.showError(e.getMessage()); - } - } - } - }); + } + PlayerCache.getInstance().addPlayer(auth); + LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); + if (limbo != null) { + player.setGameMode(GameMode.getByValue(limbo.getGameMode())); + if (Settings.isTeleportToSpawnEnabled) { + World world = player.getWorld(); + Location loca = world.getSpawnLocation(); + if (plugin.mv != null) { + try { + loca = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation(); + } catch (NullPointerException npe) { + + } catch (ClassCastException cce) { + + } catch (NoClassDefFoundError ncdfe) { + + } + } + if (plugin.essentialsSpawn != null) { + loca = plugin.essentialsSpawn; + } + if (Spawn.getInstance().getLocation() != null) + loca = Spawn.getInstance().getLocation(); + RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, loca); + plugin.getServer().getPluginManager().callEvent(tpEvent); + if(!tpEvent.isCancelled()) { + if (!tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).isLoaded()) { + tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).load(); + } + player.teleport(tpEvent.getTo()); + } + } + sender.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId()); + sender.getServer().getScheduler().cancelTask(limbo.getMessageTaskId()); + LimboCache.getInstance().deleteLimboPlayer(name); + } if(!Settings.getRegisteredGroup.isEmpty()){ Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED); } - player.sendMessage(m._("vb_nonActiv")); - String msg = m._("login_msg"); - int time = Settings.getRegistrationTimeout * 20; - int msgInterval = Settings.getWarnMessageInterval; - if (time != 0) { - Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getTimeoutTaskId()); - BukkitTask id = Bukkit.getScheduler().runTaskLater(plugin, new TimeoutTask(plugin, name), time); - LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id.getTaskId()); - } - - Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getMessageTaskId()); - BukkitTask nwMsg = Bukkit.getScheduler().runTask(plugin, new MessageTask(plugin, name, msg, msgInterval)); - LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(nwMsg.getTaskId()); - - LimboCache.getInstance().deleteLimboPlayer(name); - if (Settings.isTeleportToSpawnEnabled) { - World world = player.getWorld(); - Location loca = world.getSpawnLocation(); - if (plugin.mv != null) { - try { - loca = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation(); - } catch (NullPointerException npe) { - } catch (ClassCastException cce) { - } catch (NoClassDefFoundError ncdfe) { - } - } - if (Spawn.getInstance().getLocation() != null) - loca = Spawn.getInstance().getLocation(); - RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, loca); - plugin.getServer().getPluginManager().callEvent(tpEvent); - if(!tpEvent.isCancelled()) { - if (!tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).isLoaded()) { - tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).load(); - } - player.teleport(tpEvent.getTo()); - } - } + player.sendMessage(m._("registered")); + if (!Settings.getmailAccount.isEmpty()) + player.sendMessage(m._("add_email")); this.isFirstTimeJoin = true; player.saveData(); if (!Settings.noConsoleSpam) @@ -211,91 +305,11 @@ public class RegisterCommand implements CommandExecutor { if(plugin.notifications != null) { plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " has registered!")); } - return true; + } catch (NoSuchAlgorithmException ex) { + ConsoleLogger.showError(ex.getMessage()); + sender.sendMessage(m._("error")); } } - - if (args.length == 0 || (Settings.getEnablePasswordVerifier && args.length < 2) ) { - player.sendMessage(m._("usage_reg")); - return true; - } - - if(args[0].length() < Settings.getPasswordMinLen || args[0].length() > Settings.passwordMaxLength) { - player.sendMessage(m._("pass_len")); - return true; - } - try { - String hash; - if(Settings.getEnablePasswordVerifier) { - if (args[0].equals(args[1])) { - hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name); - } else { - player.sendMessage(m._("password_error")); - return true; - } - } else - hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name); - if (Settings.getMySQLColumnSalt.isEmpty()) - { - auth = new PlayerAuth(name, hash, ip, new Date().getTime()); - } else { - auth = new PlayerAuth(name, hash, PasswordSecurity.userSalt.get(name), ip, new Date().getTime()); - } - if (!database.saveAuth(auth)) { - player.sendMessage(m._("error")); - return true; - } - PlayerCache.getInstance().addPlayer(auth); - LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); - if (limbo != null) { - player.setGameMode(GameMode.getByValue(limbo.getGameMode())); - if (Settings.isTeleportToSpawnEnabled) { - World world = player.getWorld(); - Location loca = world.getSpawnLocation(); - if (plugin.mv != null) { - try { - loca = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation(); - } catch (NullPointerException npe) { - - } catch (ClassCastException cce) { - - } catch (NoClassDefFoundError ncdfe) { - - } - } - if (Spawn.getInstance().getLocation() != null) - loca = Spawn.getInstance().getLocation(); - RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, loca); - plugin.getServer().getPluginManager().callEvent(tpEvent); - if(!tpEvent.isCancelled()) { - if (!tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).isLoaded()) { - tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).load(); - } - player.teleport(tpEvent.getTo()); - } - } - sender.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId()); - sender.getServer().getScheduler().cancelTask(limbo.getMessageTaskId()); - LimboCache.getInstance().deleteLimboPlayer(name); - } - - if(!Settings.getRegisteredGroup.isEmpty()){ - Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED); - } - player.sendMessage(m._("registered")); - if (!Settings.getmailAccount.isEmpty()) - player.sendMessage(m._("add_email")); - this.isFirstTimeJoin = true; - player.saveData(); - if (!Settings.noConsoleSpam) - ConsoleLogger.info(player.getName() + " registered "+player.getAddress().getAddress().getHostAddress()); - if(plugin.notifications != null) { - plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " has registered!")); - } - } catch (NoSuchAlgorithmException ex) { - ConsoleLogger.showError(ex.getMessage()); - sender.sendMessage(m._("error")); - } return true; } } diff --git a/src/main/java/uk/org/whoami/authme/commands/UnregisterCommand.java b/src/main/java/uk/org/whoami/authme/commands/UnregisterCommand.java index 09132ee21..eb61eb712 100644 --- a/src/main/java/uk/org/whoami/authme/commands/UnregisterCommand.java +++ b/src/main/java/uk/org/whoami/authme/commands/UnregisterCommand.java @@ -138,6 +138,9 @@ public class UnregisterCommand implements CommandExecutor { } catch (NoClassDefFoundError ncdfe) { } } + if (plugin.essentialsSpawn != null) { + spawn = plugin.essentialsSpawn; + } if (Spawn.getInstance().getLocation() != null) spawn = Spawn.getInstance().getLocation(); SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawn, false); diff --git a/src/main/java/uk/org/whoami/authme/converter/FlatToSql.java b/src/main/java/uk/org/whoami/authme/converter/FlatToSql.java index 178554e3e..4f153015f 100644 --- a/src/main/java/uk/org/whoami/authme/converter/FlatToSql.java +++ b/src/main/java/uk/org/whoami/authme/converter/FlatToSql.java @@ -36,6 +36,7 @@ public class FlatToSql { private static String lastlocX; private static String lastlocY; private static String lastlocZ; + private static String lastlocWorld; private static String columnEmail; private static File source; private static File output; @@ -49,6 +50,7 @@ public class FlatToSql { lastlocX = Settings.getMySQLlastlocX; lastlocY = Settings.getMySQLlastlocY; lastlocZ = Settings.getMySQLlastlocZ; + lastlocWorld = Settings.getMySQLlastlocWorld; columnEmail = Settings.getMySQLColumnEmail; try { @@ -68,6 +70,7 @@ public class FlatToSql { + lastlocX + " smallint(6) DEFAULT '0'," + lastlocY + " smallint(6) DEFAULT '0'," + lastlocZ + " smallint(6) DEFAULT '0'," + + lastlocWorld + " VARCHAR(255) DEFAULT 'world'," + columnEmail + " VARCHAR(255) NOT NULL," + "CONSTRAINT table_const_prim PRIMARY KEY (id));"; sql.write(createDB); @@ -78,9 +81,11 @@ public class FlatToSql { sql.newLine(); String[] args = line.split(":"); if (args.length == 4) - newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", 0, 0, 0, " + "'your@email.com'" + ");"; + newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", 0, 0, 0, 'world', 'your@email.com');"; else if (args.length == 7) - newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", " + args[4] + ", " + args[5] + ", " + args[6] + ", " + "'your@email.com'" + ");"; + 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 newline = ""; if (newline != "") diff --git a/src/main/java/uk/org/whoami/authme/datasource/CacheDataSource.java b/src/main/java/uk/org/whoami/authme/datasource/CacheDataSource.java index 4d443858b..6b61fcc8a 100644 --- a/src/main/java/uk/org/whoami/authme/datasource/CacheDataSource.java +++ b/src/main/java/uk/org/whoami/authme/datasource/CacheDataSource.java @@ -86,6 +86,7 @@ public class CacheDataSource implements DataSource { cache.get(auth.getNickname()).setQuitLocX(auth.getQuitLocX()); cache.get(auth.getNickname()).setQuitLocY(auth.getQuitLocY()); cache.get(auth.getNickname()).setQuitLocZ(auth.getQuitLocZ()); + cache.get(auth.getNickname()).setWorld(auth.getWorld()); return true; } return false; diff --git a/src/main/java/uk/org/whoami/authme/datasource/FileDataSource.java b/src/main/java/uk/org/whoami/authme/datasource/FileDataSource.java index a169c248b..c9179e20c 100644 --- a/src/main/java/uk/org/whoami/authme/datasource/FileDataSource.java +++ b/src/main/java/uk/org/whoami/authme/datasource/FileDataSource.java @@ -89,7 +89,7 @@ public class FileDataSource implements DataSource { bw.write(auth.getNickname() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + "\n"); } else { bw = new BufferedWriter(new FileWriter(source, true)); - bw.write(auth.getNickname() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + ":" + auth.getQuitLocX() + ":" + auth.getQuitLocY() + ":" + auth.getQuitLocZ() + "\n"); + bw.write(auth.getNickname() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + ":" + auth.getQuitLocX() + ":" + auth.getQuitLocY() + ":" + auth.getQuitLocZ() + ":" + auth.getWorld() + "\n"); } } catch (IOException ex) { ConsoleLogger.showError(ex.getMessage()); @@ -190,7 +190,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()); + newAuth = new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ(), auth.getWorld()); break; } } @@ -350,7 +350,9 @@ public class FileDataSource implements DataSource { case 4: return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3])); 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])); + 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"); + 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]); } } } diff --git a/src/main/java/uk/org/whoami/authme/datasource/MySQLDataSource.java b/src/main/java/uk/org/whoami/authme/datasource/MySQLDataSource.java index 08b963979..cd82d1123 100644 --- a/src/main/java/uk/org/whoami/authme/datasource/MySQLDataSource.java +++ b/src/main/java/uk/org/whoami/authme/datasource/MySQLDataSource.java @@ -48,6 +48,7 @@ public class MySQLDataSource implements DataSource { private String lastlocX; private String lastlocY; private String lastlocZ; + private String lastlocWorld; private String columnEmail; private String columnID; private List columnOthers; @@ -67,6 +68,7 @@ public class MySQLDataSource implements DataSource { this.lastlocX = Settings.getMySQLlastlocX; this.lastlocY = Settings.getMySQLlastlocY; this.lastlocZ = Settings.getMySQLlastlocZ; + this.lastlocWorld = Settings.getMySQLlastlocWorld; this.columnSalt = Settings.getMySQLColumnSalt; this.columnGroup = Settings.getMySQLColumnGroup; this.columnEmail = Settings.getMySQLColumnEmail; @@ -106,6 +108,7 @@ public class MySQLDataSource implements DataSource { + lastlocX + " smallint(6) DEFAULT '0'," + lastlocY + " smallint(6) DEFAULT '0'," + lastlocZ + " smallint(6) DEFAULT '0'," + + lastlocWorld + " VARCHAR(255) DEFAULT 'world'," + columnEmail + " VARCHAR(255) DEFAULT 'your@email.com'," + "CONSTRAINT table_const_prim PRIMARY KEY (" + columnID + "));"); rs = con.getMetaData().getColumns(null, null, tableName, columnPassword); @@ -132,6 +135,11 @@ public class MySQLDataSource implements DataSource { + columnLastLogin +" , ADD " + lastlocY + " smallint(6) NOT NULL DEFAULT '0' AFTER " + lastlocX + " , ADD " + lastlocZ + " smallint(6) NOT NULL DEFAULT '0' AFTER " + lastlocY + ";"); } rs.close(); + rs = con.getMetaData().getColumns(null, null, tableName, lastlocWorld); + if (!rs.next()) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + lastlocWorld + " VARCHAR(255) NOT NULL DEFAULT 'world' AFTER " + lastlocZ + ";"); + } + rs.close(); rs = con.getMetaData().getColumns(null, null, tableName, columnEmail); if (!rs.next()) { st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + columnEmail + " VARCHAR(255) DEFAULT 'your@email.com' AFTER " + lastlocZ +";"); @@ -182,14 +190,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(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)); } 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(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(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)); + 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)); } 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(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)); } } } else { @@ -347,11 +355,12 @@ public class MySQLDataSource implements DataSource { PreparedStatement pst = null; try { con = conPool.getValidConnection(); - pst = con.prepareStatement("UPDATE " + tableName + " SET "+ lastlocX + " =?, "+ lastlocY +"=?, "+ lastlocZ +"=? WHERE " + columnName + "=?;"); + pst = con.prepareStatement("UPDATE " + tableName + " SET "+ lastlocX + " =?, "+ lastlocY +"=?, "+ lastlocZ +"=?, " + lastlocWorld + "=? WHERE " + columnName + "=?;"); pst.setLong(1, auth.getQuitLocX()); pst.setLong(2, auth.getQuitLocY()); pst.setLong(3, auth.getQuitLocZ()); - pst.setString(4, auth.getNickname()); + pst.setString(4, auth.getWorld()); + pst.setString(5, auth.getNickname()); pst.executeUpdate(); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); diff --git a/src/main/java/uk/org/whoami/authme/datasource/SqliteDataSource.java b/src/main/java/uk/org/whoami/authme/datasource/SqliteDataSource.java index 5438cbdf1..0d81f3205 100644 --- a/src/main/java/uk/org/whoami/authme/datasource/SqliteDataSource.java +++ b/src/main/java/uk/org/whoami/authme/datasource/SqliteDataSource.java @@ -37,6 +37,7 @@ public class SqliteDataSource implements DataSource { private String lastlocX; private String lastlocY; private String lastlocZ; + private String lastlocWorld; private String columnEmail; private String columnID; private Connection con; @@ -57,6 +58,7 @@ public class SqliteDataSource implements DataSource { this.lastlocX = Settings.getMySQLlastlocX; this.lastlocY = Settings.getMySQLlastlocY; this.lastlocZ = Settings.getMySQLlastlocZ; + this.lastlocWorld = Settings.getMySQLlastlocWorld; this.nonActivatedGroup = Settings.getNonActivatedGroup; this.columnEmail = Settings.getMySQLColumnEmail; this.columnID = Settings.getMySQLColumnId; @@ -86,6 +88,7 @@ public class SqliteDataSource implements DataSource { + lastlocX + " smallint(6) DEFAULT '0'," + lastlocY + " smallint(6) DEFAULT '0'," + lastlocZ + " smallint(6) DEFAULT '0'," + + lastlocWorld + " VARCHAR(255) DEFAULT 'world'," + columnEmail + " VARCHAR(255) DEFAULT 'your@email.com'," + "CONSTRAINT table_const_prim PRIMARY KEY (" + columnID + "));"); rs = con.getMetaData().getColumns(null, null, tableName, columnPassword); @@ -113,6 +116,10 @@ public class SqliteDataSource implements DataSource { + "ALTER TABLE " + tableName + " ADD COLUMN " + lastlocZ + " smallint(6) NOT NULL DEFAULT '0';"); } rs.close(); + if (!rs.next()) { + st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + lastlocWorld + " VARCHAR(255) NOT NULL DEFAULT 'world' AFTER " + lastlocZ + ";"); + } + rs.close(); rs = con.getMetaData().getColumns(null, null, tableName, columnEmail); if (!rs.next()) { st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + columnEmail + " VARCHAR(255) DEFAULT 'your@email.com';"); @@ -153,12 +160,12 @@ public class SqliteDataSource 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(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)); } else { if(!columnSalt.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(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)); } 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(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)); } } } else { @@ -273,11 +280,12 @@ public class SqliteDataSource implements DataSource { public boolean updateQuitLoc(PlayerAuth auth) { PreparedStatement pst = null; try { - pst = con.prepareStatement("UPDATE " + tableName + " SET " + lastlocX + "=?, "+ lastlocY +"=?, "+ lastlocZ +"=? WHERE " + columnName + "=?;"); + pst = con.prepareStatement("UPDATE " + tableName + " SET " + lastlocX + "=?, "+ lastlocY +"=?, "+ lastlocZ +"=?, " + lastlocWorld + "=? WHERE " + columnName + "=?;"); pst.setLong(1, auth.getQuitLocX()); pst.setLong(2, auth.getQuitLocY()); pst.setLong(3, auth.getQuitLocZ()); - pst.setString(4, auth.getNickname()); + pst.setString(4, auth.getWorld()); + pst.setString(5, auth.getNickname()); pst.executeUpdate(); } catch (SQLException ex) { ConsoleLogger.showError(ex.getMessage()); diff --git a/src/main/java/uk/org/whoami/authme/debug/CardboardBox.java b/src/main/java/uk/org/whoami/authme/debug/CardboardBox.java deleted file mode 100644 index dce062740..000000000 --- a/src/main/java/uk/org/whoami/authme/debug/CardboardBox.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - * - * http://forums.bukkit.org/threads/cardboard-serializable-itemstack-with-enchantments.75768/ - */ -package uk.org.whoami.authme.debug; - -import java.io.Serializable; -import java.util.HashMap; -import java.util.Map; - -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemStack; - -public class CardboardBox implements Serializable { - private static final long serialVersionUID = 729890133797629668L; - private final int type, amount; - private final short damage; - private final HashMap enchants; - - public CardboardBox(ItemStack item) { - this.type = item.getTypeId(); - this.amount = item.getAmount(); - this.damage = item.getDurability(); - - HashMap map = new HashMap(); - - Map enchantments = item.getEnchantments(); - - for(Enchantment enchantment : enchantments.keySet()) { - map.put(new CardboardEnchantment(enchantment), enchantments.get(enchantment)); - } - - this.enchants = map; - } - - public ItemStack unbox() { - ItemStack item = new ItemStack(type, amount, damage); - - HashMap map = new HashMap(); - - for(CardboardEnchantment cEnchantment : enchants.keySet()) { - map.put(cEnchantment.unbox(), enchants.get(cEnchantment)); - } - - item.addUnsafeEnchantments(map); - - return item; - } -} \ No newline at end of file diff --git a/src/main/java/uk/org/whoami/authme/debug/CardboardEnchantment.java b/src/main/java/uk/org/whoami/authme/debug/CardboardEnchantment.java deleted file mode 100644 index e1da30c5e..000000000 --- a/src/main/java/uk/org/whoami/authme/debug/CardboardEnchantment.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package uk.org.whoami.authme.debug; - -import java.io.Serializable; -import org.bukkit.enchantments.Enchantment; - -/** - * A serializable Enchantment - */ -public class CardboardEnchantment implements Serializable { - private static final long serialVersionUID = 8973856768102665381L; - - private final int id; - - public CardboardEnchantment(Enchantment enchantment) { - this.id = enchantment.getId(); - } - - public Enchantment unbox() { - return Enchantment.getById(this.id); - } - -} diff --git a/src/main/java/uk/org/whoami/authme/filter/ConsoleFilter.java b/src/main/java/uk/org/whoami/authme/filter/ConsoleFilter.java deleted file mode 100644 index b86512080..000000000 --- a/src/main/java/uk/org/whoami/authme/filter/ConsoleFilter.java +++ /dev/null @@ -1,25 +0,0 @@ -package uk.org.whoami.authme.filter; - -import java.util.logging.Filter; -import java.util.logging.LogRecord; - -/** -* -* @author Xephi59 -*/ -public class ConsoleFilter implements Filter { - - public ConsoleFilter() {} - - @Override - public boolean isLoggable(LogRecord record) { - String logM = record.getMessage().toLowerCase(); - if (!logM.contains("issued server command:")) return true; - if (!logM.contains("/login ") && !logM.contains("/l ") && !logM.contains("/reg ") && !logM.contains("/changepassword ") && !logM.contains("/unregister ") - && !logM.contains("/authme register ") && !logM.contains("/authme changepassword ")&& !logM.contains("/authme reg ")&& !logM.contains("/authme cp ")) return true; - String playername = record.getMessage().split(" ")[0]; - record.setMessage(playername + " issued an AuthMe command!"); - return true; - } - -} diff --git a/src/main/java/uk/org/whoami/authme/gui/screens/LoginScreen.java b/src/main/java/uk/org/whoami/authme/gui/screens/LoginScreen.java index 654445267..ca319d582 100644 --- a/src/main/java/uk/org/whoami/authme/gui/screens/LoginScreen.java +++ b/src/main/java/uk/org/whoami/authme/gui/screens/LoginScreen.java @@ -21,7 +21,9 @@ import org.getspout.spoutapi.player.SpoutPlayer; import uk.org.whoami.authme.AuthMe; import uk.org.whoami.authme.gui.Clickable; import uk.org.whoami.authme.gui.CustomButton; +import uk.org.whoami.authme.settings.Settings; import uk.org.whoami.authme.settings.SpoutCfg; +import uk.org.whoami.authme.threads.LoginThread; public class LoginScreen extends GenericPopup implements Clickable{ @@ -119,7 +121,12 @@ public class LoginScreen extends GenericPopup implements Clickable{ if (event.isCancelled() || event == null || event.getPlayer() == null) return; if (b.equals(loginBtn)) { - plugin.management.performLogin(player, passBox.getText()); + if (Settings.useMultiThreading) { + Thread mT = new LoginThread(plugin.database, plugin, player, passBox.getText()); + mT.run(); + } else { + plugin.management.performLogin(player, passBox.getText(), false); + } }else if(b.equals(exitBtn)) { event.getPlayer().kickPlayer(exitMsg); diff --git a/src/main/java/uk/org/whoami/authme/listener/AuthMeBlockListener.java b/src/main/java/uk/org/whoami/authme/listener/AuthMeBlockListener.java index 8d1462b5f..7f351965f 100644 --- a/src/main/java/uk/org/whoami/authme/listener/AuthMeBlockListener.java +++ b/src/main/java/uk/org/whoami/authme/listener/AuthMeBlockListener.java @@ -26,7 +26,6 @@ import uk.org.whoami.authme.AuthMe; import uk.org.whoami.authme.Utils; import uk.org.whoami.authme.cache.auth.PlayerCache; import uk.org.whoami.authme.datasource.DataSource; -import uk.org.whoami.authme.plugin.manager.CombatTagComunicator; import uk.org.whoami.authme.settings.Settings; public class AuthMeBlockListener implements Listener { @@ -48,7 +47,7 @@ public class AuthMeBlockListener implements Listener { Player player = event.getPlayer(); String name = player.getName().toLowerCase(); - if(instance.getCitizensCommunicator().isNPC(player, instance) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { + if(Utils.getInstance().isUnrestricted(player)) { return; } @@ -73,7 +72,7 @@ public class AuthMeBlockListener implements Listener { Player player = event.getPlayer(); String name = player.getName().toLowerCase(); - if(instance.getCitizensCommunicator().isNPC(player, instance) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { + if(Utils.getInstance().isUnrestricted(player)) { return; } diff --git a/src/main/java/uk/org/whoami/authme/listener/AuthMeEntityListener.java b/src/main/java/uk/org/whoami/authme/listener/AuthMeEntityListener.java index 72531f567..4197602d1 100644 --- a/src/main/java/uk/org/whoami/authme/listener/AuthMeEntityListener.java +++ b/src/main/java/uk/org/whoami/authme/listener/AuthMeEntityListener.java @@ -31,7 +31,6 @@ import uk.org.whoami.authme.AuthMe; import uk.org.whoami.authme.Utils; import uk.org.whoami.authme.cache.auth.PlayerCache; import uk.org.whoami.authme.datasource.DataSource; -import uk.org.whoami.authme.plugin.manager.CombatTagComunicator; import uk.org.whoami.authme.settings.Settings; public class AuthMeEntityListener implements Listener{ @@ -55,7 +54,7 @@ public class AuthMeEntityListener implements Listener{ return; } - if(instance.getCitizensCommunicator().isNPC(entity, instance) || Utils.getInstance().isUnrestricted((Player)entity) || CombatTagComunicator.isNPC(entity)) { + if(Utils.getInstance().isUnrestricted((Player)entity)) { return; } @@ -170,7 +169,7 @@ public class AuthMeEntityListener implements Listener{ Player player = (Player) event.getEntity(); String name = player.getName().toLowerCase(); - if (instance.getCitizensCommunicator().isNPC(player, instance) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { + if (Utils.getInstance().isUnrestricted(player)) { return; } @@ -199,7 +198,7 @@ public class AuthMeEntityListener implements Listener{ Player player = (Player) event.getEntity(); String name = player.getName().toLowerCase(); - if (instance.getCitizensCommunicator().isNPC(player, instance) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { + if (Utils.getInstance().isUnrestricted(player)) { return; } diff --git a/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java b/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java index e76aa66ae..64e0faf96 100644 --- a/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java +++ b/src/main/java/uk/org/whoami/authme/listener/AuthMePlayerListener.java @@ -21,6 +21,7 @@ import java.io.DataOutputStream; import java.io.IOException; import java.util.Date; import java.util.HashMap; +import java.util.regex.PatternSyntaxException; import org.bukkit.Bukkit; import org.bukkit.GameMode; @@ -28,7 +29,13 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; import org.bukkit.event.block.SignChangeEvent; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerBedEnterEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerDropItemEvent; @@ -41,23 +48,20 @@ import org.bukkit.event.player.PlayerLoginEvent.Result; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerRespawnEvent; import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitTask; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.player.AsyncPlayerChatEvent; -import uk.org.whoami.authme.api.API; -import uk.org.whoami.authme.cache.backup.DataFileCache; -import uk.org.whoami.authme.cache.backup.FileCache; import uk.org.whoami.authme.AuthMe; import uk.org.whoami.authme.ConsoleLogger; import uk.org.whoami.authme.Utils; +import uk.org.whoami.authme.api.API; import uk.org.whoami.authme.cache.auth.PlayerAuth; import uk.org.whoami.authme.cache.auth.PlayerCache; -import uk.org.whoami.authme.cache.limbo.LimboPlayer; +import uk.org.whoami.authme.cache.backup.DataFileCache; +import uk.org.whoami.authme.cache.backup.FileCache; import uk.org.whoami.authme.cache.limbo.LimboCache; +import uk.org.whoami.authme.cache.limbo.LimboPlayer; import uk.org.whoami.authme.datasource.DataSource; import uk.org.whoami.authme.events.AuthMeTeleportEvent; import uk.org.whoami.authme.events.ProtectInventoryEvent; @@ -136,18 +140,6 @@ public class AuthMePlayerListener implements Listener { final Player player = event.getPlayer(); final String name = player.getName().toLowerCase(); - if(plugin.CitizensVersion != 0) { - if (plugin.getCitizensCommunicator().isNPC(player, plugin)) { - return; - } - } - - if(plugin.CombatTag != 0) { - if (CombatTagComunicator.isNPC(player)) { - return; - } - } - if (Utils.getInstance().isUnrestricted(player)) { return; } @@ -197,18 +189,6 @@ public class AuthMePlayerListener implements Listener { final Player player = event.getPlayer(); final String name = player.getName().toLowerCase(); - if(plugin.CitizensVersion != 0) { - if (plugin.getCitizensCommunicator().isNPC(player, plugin)) { - return; - } - } - - if(plugin.CombatTag != 0) { - if (CombatTagComunicator.isNPC(player)) { - return; - } - } - if (Utils.getInstance().isUnrestricted(player)) { return; } @@ -258,18 +238,6 @@ public class AuthMePlayerListener implements Listener { final Player player = event.getPlayer(); final String name = player.getName().toLowerCase(); - if(plugin.CitizensVersion != 0) { - if (plugin.getCitizensCommunicator().isNPC(player, plugin)) { - return; - } - } - - if(plugin.CombatTag != 0) { - if (CombatTagComunicator.isNPC(player)) { - return; - } - } - if (Utils.getInstance().isUnrestricted(player)) { return; } @@ -281,6 +249,7 @@ public class AuthMePlayerListener implements Listener { String cmd = event.getMessage().split(" ")[0]; if (!Settings.isChatAllowed && !(Settings.allowCommands.contains(cmd))) { + //System.out.println("debug chat: chat isnt allowed"); event.setCancelled(true); return; } @@ -319,18 +288,6 @@ public class AuthMePlayerListener implements Listener { final Player player = event.getPlayer(); final String name = player.getName().toLowerCase(); - if(plugin.CitizensVersion != 0) { - if (plugin.getCitizensCommunicator().isNPC(player, plugin)) { - return; - } - } - - if(plugin.CombatTag != 0) { - if (CombatTagComunicator.isNPC(player)) { - return; - } - } - if (Utils.getInstance().isUnrestricted(player)) { return; } @@ -380,18 +337,6 @@ public class AuthMePlayerListener implements Listener { final Player player = event.getPlayer(); final String name = player.getName().toLowerCase(); - if(plugin.CitizensVersion != 0) { - if (plugin.getCitizensCommunicator().isNPC(player, plugin)) { - return; - } - } - - if(plugin.CombatTag != 0) { - if (CombatTagComunicator.isNPC(player)) { - return; - } - } - if (Utils.getInstance().isUnrestricted(player)) { return; } @@ -441,18 +386,6 @@ public class AuthMePlayerListener implements Listener { final Player player = event.getPlayer(); final String name = player.getName().toLowerCase(); - if(plugin.CitizensVersion != 0) { - if (plugin.getCitizensCommunicator().isNPC(player, plugin)) { - return; - } - } - - if(plugin.CombatTag != 0) { - if (CombatTagComunicator.isNPC(player)) { - return; - } - } - if (Utils.getInstance().isUnrestricted(player)) { return; } @@ -533,7 +466,10 @@ public class AuthMePlayerListener implements Listener { } catch (NoClassDefFoundError ncdfe) { } } - if (Spawn.getInstance().getLocation() != null) + if (plugin.essentialsSpawn != null) { + spawn = plugin.essentialsSpawn; + } + if (Spawn.getInstance().getLocation() != null && Spawn.getInstance().getLocation().getWorld().equals(player.getWorld())) spawn = Spawn.getInstance().getLocation(); if ((spawn.distance(player.getLocation()) > radius) ) { @@ -587,7 +523,20 @@ public class AuthMePlayerListener implements Listener { event.disallow(PlayerLoginEvent.Result.KICK_OTHER, m._("name_len")); return; } - if (!player.getName().matches(regex) || name.equals("Player")) { + try { + if (!player.getName().matches(regex) || name.equals("Player")) { + try { + event.disallow(PlayerLoginEvent.Result.KICK_OTHER, m._("regex").replaceAll("REG_EX", regex)); + } catch (StringIndexOutOfBoundsException exc) { + event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "allowed char : " + regex); + } + return; + } + } catch (PatternSyntaxException pse) { + if (regex == null || regex.isEmpty()) { + event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Your nickname do not match"); + return; + } try { event.disallow(PlayerLoginEvent.Result.KICK_OTHER, m._("regex").replaceAll("REG_EX", regex)); } catch (StringIndexOutOfBoundsException exc) { @@ -655,6 +604,17 @@ public class AuthMePlayerListener implements Listener { Player player = event.getPlayer(); World world = player.getWorld(); Location spawnLoc = world.getSpawnLocation(); + if (plugin.mv != null) { + try { + spawnLoc = plugin.mv.getMVWorldManager().getMVWorld(player.getWorld()).getSpawnLocation(); + } catch (NullPointerException npe) { + } catch (ClassCastException cce) { + } catch (NoClassDefFoundError ncdfe) { + } + } + if (plugin.essentialsSpawn != null) { + spawnLoc = plugin.essentialsSpawn; + } if (Spawn.getInstance().getLocation() != null) spawnLoc = Spawn.getInstance().getLocation(); gm = player.getGameMode().getValue(); @@ -796,7 +756,7 @@ public class AuthMePlayerListener implements Listener { if (PlayerCache.getInstance().isAuthenticated(name) && !player.isDead()) { if(Settings.isSaveQuitLocationEnabled && data.isAuthAvailable(name)) { - final PlayerAuth auth = new PlayerAuth(event.getPlayer().getName().toLowerCase(),loc.getBlockX(),loc.getBlockY(),loc.getBlockZ()); + final PlayerAuth auth = new PlayerAuth(event.getPlayer().getName().toLowerCase(),loc.getBlockX(),loc.getBlockY(),loc.getBlockZ(),loc.getWorld().getName()); try { Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { @Override @@ -833,6 +793,7 @@ public class AuthMePlayerListener implements Listener { } catch (NullPointerException ex) { } if (gameMode.containsKey(name)) gameMode.remove(name); + plugin.premium.remove(player.getName()); player.saveData(); } @@ -863,7 +824,7 @@ public class AuthMePlayerListener implements Listener { String name = player.getName().toLowerCase(); if ((PlayerCache.getInstance().isAuthenticated(name)) && (!player.isDead()) && (Settings.isSaveQuitLocationEnabled.booleanValue()) && data.isAuthAvailable(name)) { - final PlayerAuth auth = new PlayerAuth(event.getPlayer().getName().toLowerCase(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); + final PlayerAuth auth = new PlayerAuth(event.getPlayer().getName().toLowerCase(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(),loc.getWorld().getName()); Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { @Override public void run() { @@ -913,6 +874,7 @@ public class AuthMePlayerListener implements Listener { if (gameMode.containsKey(name)) gameMode.remove(name); player.getVehicle().eject(); player.saveData(); + plugin.premium.remove(player.getName()); } catch (NullPointerException ex) {} } @@ -925,7 +887,7 @@ public class AuthMePlayerListener implements Listener { Player player = event.getPlayer(); String name = player.getName().toLowerCase(); - if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { + if (Utils.getInstance().isUnrestricted(player)) { return; } @@ -949,7 +911,7 @@ public class AuthMePlayerListener implements Listener { Player player = event.getPlayer(); String name = player.getName().toLowerCase(); - if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { + if (Utils.getInstance().isUnrestricted(player)) { return; } @@ -968,6 +930,53 @@ public class AuthMePlayerListener implements Listener { event.setCancelled(true); } + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerInventoryOpen(InventoryOpenEvent event) { + if (event.isCancelled() || event.getPlayer() == null) return; + if (!(event.getPlayer() instanceof Player)) return; + Player player = (Player) event.getPlayer(); + String name = player.getName().toLowerCase(); + + if (Utils.getInstance().isUnrestricted(player)) { + return; + } + + if (PlayerCache.getInstance().isAuthenticated(player.getName().toLowerCase())) { + return; + } + + if (!data.isAuthAvailable(name)) { + if (!Settings.isForcedRegistrationEnabled) { + return; + } + } + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerInventoryClick(InventoryClickEvent event) { + if (event.isCancelled() || event.getWhoClicked() == null) return; + if (!(event.getWhoClicked() instanceof Player)) return; + Player player = (Player) event.getWhoClicked(); + String name = player.getName().toLowerCase(); + + if (Utils.getInstance().isUnrestricted(player)) { + return; + } + + if (PlayerCache.getInstance().isAuthenticated(player.getName().toLowerCase())) { + return; + } + + if (!data.isAuthAvailable(name)) { + if (!Settings.isForcedRegistrationEnabled) { + return; + } + } + event.setResult(org.bukkit.event.Event.Result.DENY); + event.setCancelled(true); + } + @EventHandler(priority = EventPriority.LOWEST) public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { if (event.isCancelled() || event.getPlayer() == null) { @@ -1001,7 +1010,7 @@ public class AuthMePlayerListener implements Listener { Player player = event.getPlayer(); String name = player.getName().toLowerCase(); - if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { + if (Utils.getInstance().isUnrestricted(player)) { return; } @@ -1025,7 +1034,7 @@ public class AuthMePlayerListener implements Listener { Player player = event.getPlayer(); String name = player.getName().toLowerCase(); - if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { + if (Utils.getInstance().isUnrestricted(player)) { return; } @@ -1048,15 +1057,12 @@ public class AuthMePlayerListener implements Listener { } Player player = event.getPlayer(); String name = player.getName().toLowerCase(); - - if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { + if (Utils.getInstance().isUnrestricted(player)) { return; } - if (PlayerCache.getInstance().isAuthenticated(name)) { return; } - if (!data.isAuthAvailable(name)) { if (!Settings.isForcedRegistrationEnabled) { return; @@ -1065,4 +1071,50 @@ public class AuthMePlayerListener implements Listener { event.setCancelled(true); } + @EventHandler(priority = EventPriority.HIGHEST) + public void onPlayerRespawn(PlayerRespawnEvent event) { + if (event.getPlayer() == null || event == null) { + return; + } + + Player player = event.getPlayer(); + String name = player.getName().toLowerCase(); + + if (Utils.getInstance().isUnrestricted(player)) + return; + + if (PlayerCache.getInstance().isAuthenticated(name)) + return; + + if (!data.isAuthAvailable(name)) + if (!Settings.isForcedRegistrationEnabled) + return; + + if (!Settings.isTeleportToSpawnEnabled && !Settings.isForceSpawnLocOnJoinEnabled) + return; + + Location spawn = player.getWorld().getSpawnLocation(); + if (plugin.mv != null) { + try { + spawn = plugin.mv.getMVWorldManager().getMVWorld(player.getWorld()).getSpawnLocation(); + } catch (NullPointerException npe) { + } catch (ClassCastException cce) { + } catch (NoClassDefFoundError ncdfe) { + } + } + if (plugin.essentialsSpawn != null) { + spawn = plugin.essentialsSpawn; + } + if (Spawn.getInstance().getLocation() != null && Spawn.getInstance().getLocation().getWorld().equals(player.getWorld())) + spawn = Spawn.getInstance().getLocation(); + final PlayerAuth auth = new PlayerAuth(event.getPlayer().getName().toLowerCase(), spawn.getBlockX(), spawn.getBlockY(), spawn.getBlockZ(),spawn.getWorld().getName()); + Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable(){ + @Override + public void run() { + data.updateQuitLoc(auth); + } + }); + event.setRespawnLocation(spawn); + } + } diff --git a/src/main/java/uk/org/whoami/authme/listener/AuthMeSpoutListener.java b/src/main/java/uk/org/whoami/authme/listener/AuthMeSpoutListener.java index 2846408cc..ec2604520 100644 --- a/src/main/java/uk/org/whoami/authme/listener/AuthMeSpoutListener.java +++ b/src/main/java/uk/org/whoami/authme/listener/AuthMeSpoutListener.java @@ -19,7 +19,7 @@ public class AuthMeSpoutListener implements Listener { public AuthMeSpoutListener(DataSource data) { this.data = data; - } + } @EventHandler public void onSpoutCraftEnable(final SpoutCraftEnableEvent event) { diff --git a/src/main/java/uk/org/whoami/authme/plugin/manager/EssSpawn.java b/src/main/java/uk/org/whoami/authme/plugin/manager/EssSpawn.java new file mode 100644 index 000000000..3540e1a31 --- /dev/null +++ b/src/main/java/uk/org/whoami/authme/plugin/manager/EssSpawn.java @@ -0,0 +1,43 @@ +package uk.org.whoami.authme.plugin.manager; + +import java.io.File; + +import org.bukkit.Bukkit; +import org.bukkit.Location; + +import uk.org.whoami.authme.settings.CustomConfiguration; + +/** +* +* @author Xephi59 +*/ +public class EssSpawn extends CustomConfiguration { + + private static EssSpawn spawn; + + public EssSpawn() { + super(new File("./plugins/Essentials/spawn.yml")); + spawn = this; + load(); + } + + public static EssSpawn getInstance() { + if (spawn == null) { + spawn = new EssSpawn(); + } + return spawn; + } + + public Location getLocation() { + try { + if (this.getString("spawns.default.world").isEmpty() || this.getString("spawns.default.world") == "") return null; + Location location = new Location(Bukkit.getWorld(this.getString("spawns.default.world")), this.getDouble("spawns.default.x"), this.getDouble("spawns.default.y"), this.getDouble("spawns.default.z"), Float.parseFloat(this.getString("spawns.default.yaw")), Float.parseFloat(this.getString("spawns.default.pitch"))); + return location; + } catch (NullPointerException npe) { + return null; + } catch (NumberFormatException nfe) { + return null; + } + } + +} diff --git a/src/main/java/uk/org/whoami/authme/security/BCrypt.java b/src/main/java/uk/org/whoami/authme/security/BCrypt.java new file mode 100644 index 000000000..9f5aeba76 --- /dev/null +++ b/src/main/java/uk/org/whoami/authme/security/BCrypt.java @@ -0,0 +1,751 @@ +//Copyright (c) 2006 Damien Miller +// +// Permission to use, copy, modify, and distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +package uk.org.whoami.authme.security; + +import java.io.UnsupportedEncodingException; + +import java.security.SecureRandom; + +/** + * BCrypt implements OpenBSD-style Blowfish password hashing using + * the scheme described in "A Future-Adaptable Password Scheme" by + * Niels Provos and David Mazieres. + *

+ * This password hashing system tries to thwart off-line password + * cracking using a computationally-intensive hashing algorithm, + * based on Bruce Schneier's Blowfish cipher. The work factor of + * the algorithm is parameterised, so it can be increased as + * computers get faster. + *

+ * Usage is really simple. To hash a password for the first time, + * call the hashpw method with a random salt, like this: + *

+ * + * String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt());
+ *
+ *

+ * To check whether a plaintext password matches one that has been + * hashed previously, use the checkpw method: + *

+ * + * if (BCrypt.checkpw(candidate_password, stored_hash))
+ *     System.out.println("It matches");
+ * else
+ *     System.out.println("It does not match");
+ *
+ *

+ * The gensalt() method takes an optional parameter (log_rounds) + * that determines the computational complexity of the hashing: + *

+ * + * String strong_salt = BCrypt.gensalt(10)
+ * String stronger_salt = BCrypt.gensalt(12)
+ *
+ *

+ * The amount of work increases exponentially (2**log_rounds), so + * each increment is twice as much work. The default log_rounds is + * 10, and the valid range is 4 to 31. + * + * @author Damien Miller + * @version 0.2 + */ +public class BCrypt { + // BCrypt parameters + private static final int GENSALT_DEFAULT_LOG2_ROUNDS = 10; + private static final int BCRYPT_SALT_LEN = 16; + + // Blowfish parameters + private static final int BLOWFISH_NUM_ROUNDS = 16; + + // Initial contents of key schedule + private static final int P_orig[] = { + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b + }; + private static final int S_orig[] = { + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + }; + + // bcrypt IV: "OrpheanBeholderScryDoubt" + static private final int bf_crypt_ciphertext[] = { + 0x4f727068, 0x65616e42, 0x65686f6c, + 0x64657253, 0x63727944, 0x6f756274 + }; + + // Table for Base64 encoding + static private final char base64_code[] = { + '.', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', + 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', + 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', + 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', + '6', '7', '8', '9' + }; + + // Table for Base64 decoding + static private final byte index_64[] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 0, 1, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, -1, -1, + -1, -1, -1, -1, -1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, + -1, -1, -1, -1, -1, -1, 28, 29, 30, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 53, -1, -1, -1, -1, -1 + }; + + // Expanded Blowfish key + private int P[]; + private int S[]; + + /** + * Encode a byte array using bcrypt's slightly-modified base64 + * encoding scheme. Note that this is *not* compatible with + * the standard MIME-base64 encoding. + * + * @param d the byte array to encode + * @param len the number of bytes to encode + * @return base64-encoded string + * @exception IllegalArgumentException if the length is invalid + */ + private static String encode_base64(byte d[], int len) + throws IllegalArgumentException { + int off = 0; + StringBuffer rs = new StringBuffer(); + int c1, c2; + + if (len <= 0 || len > d.length) + throw new IllegalArgumentException ("Invalid len"); + + while (off < len) { + c1 = d[off++] & 0xff; + rs.append(base64_code[(c1 >> 2) & 0x3f]); + c1 = (c1 & 0x03) << 4; + if (off >= len) { + rs.append(base64_code[c1 & 0x3f]); + break; + } + c2 = d[off++] & 0xff; + c1 |= (c2 >> 4) & 0x0f; + rs.append(base64_code[c1 & 0x3f]); + c1 = (c2 & 0x0f) << 2; + if (off >= len) { + rs.append(base64_code[c1 & 0x3f]); + break; + } + c2 = d[off++] & 0xff; + c1 |= (c2 >> 6) & 0x03; + rs.append(base64_code[c1 & 0x3f]); + rs.append(base64_code[c2 & 0x3f]); + } + return rs.toString(); + } + + /** + * Look up the 3 bits base64-encoded by the specified character, + * range-checking againt conversion table + * @param x the base64-encoded value + * @return the decoded value of x + */ + private static byte char64(char x) { + if ((int)x < 0 || (int)x > index_64.length) + return -1; + return index_64[(int)x]; + } + + /** + * Decode a string encoded using bcrypt's base64 scheme to a + * byte array. Note that this is *not* compatible with + * the standard MIME-base64 encoding. + * @param s the string to decode + * @param maxolen the maximum number of bytes to decode + * @return an array containing the decoded bytes + * @throws IllegalArgumentException if maxolen is invalid + */ + private static byte[] decode_base64(String s, int maxolen) + throws IllegalArgumentException { + StringBuffer rs = new StringBuffer(); + int off = 0, slen = s.length(), olen = 0; + byte ret[]; + byte c1, c2, c3, c4, o; + + if (maxolen <= 0) + throw new IllegalArgumentException ("Invalid maxolen"); + + while (off < slen - 1 && olen < maxolen) { + c1 = char64(s.charAt(off++)); + c2 = char64(s.charAt(off++)); + if (c1 == -1 || c2 == -1) + break; + o = (byte)(c1 << 2); + o |= (c2 & 0x30) >> 4; + rs.append((char)o); + if (++olen >= maxolen || off >= slen) + break; + c3 = char64(s.charAt(off++)); + if (c3 == -1) + break; + o = (byte)((c2 & 0x0f) << 4); + o |= (c3 & 0x3c) >> 2; + rs.append((char)o); + if (++olen >= maxolen || off >= slen) + break; + c4 = char64(s.charAt(off++)); + o = (byte)((c3 & 0x03) << 6); + o |= c4; + rs.append((char)o); + ++olen; + } + + ret = new byte[olen]; + for (off = 0; off < olen; off++) + ret[off] = (byte)rs.charAt(off); + return ret; + } + + /** + * Blowfish encipher a single 64-bit block encoded as + * two 32-bit halves + * @param lr an array containing the two 32-bit half blocks + * @param off the position in the array of the blocks + */ + private final void encipher(int lr[], int off) { + int i, n, l = lr[off], r = lr[off + 1]; + + l ^= P[0]; + for (i = 0; i <= BLOWFISH_NUM_ROUNDS - 2;) { + // Feistel substitution on left word + n = S[(l >> 24) & 0xff]; + n += S[0x100 | ((l >> 16) & 0xff)]; + n ^= S[0x200 | ((l >> 8) & 0xff)]; + n += S[0x300 | (l & 0xff)]; + r ^= n ^ P[++i]; + + // Feistel substitution on right word + n = S[(r >> 24) & 0xff]; + n += S[0x100 | ((r >> 16) & 0xff)]; + n ^= S[0x200 | ((r >> 8) & 0xff)]; + n += S[0x300 | (r & 0xff)]; + l ^= n ^ P[++i]; + } + lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1]; + lr[off + 1] = l; + } + + /** + * Cycically extract a word of key material + * @param data the string to extract the data from + * @param offp a "pointer" (as a one-entry array) to the + * current offset into data + * @return the next word of material from data + */ + private static int streamtoword(byte data[], int offp[]) { + int i; + int word = 0; + int off = offp[0]; + + for (i = 0; i < 4; i++) { + word = (word << 8) | (data[off] & 0xff); + off = (off + 1) % data.length; + } + + offp[0] = off; + return word; + } + + /** + * Initialise the Blowfish key schedule + */ + private void init_key() { + P = (int[])P_orig.clone(); + S = (int[])S_orig.clone(); + } + + /** + * Key the Blowfish cipher + * @param key an array containing the key + */ + private void key(byte key[]) { + int i; + int koffp[] = { 0 }; + int lr[] = { 0, 0 }; + int plen = P.length, slen = S.length; + + for (i = 0; i < plen; i++) + P[i] = P[i] ^ streamtoword(key, koffp); + + for (i = 0; i < plen; i += 2) { + encipher(lr, 0); + P[i] = lr[0]; + P[i + 1] = lr[1]; + } + + for (i = 0; i < slen; i += 2) { + encipher(lr, 0); + S[i] = lr[0]; + S[i + 1] = lr[1]; + } + } + + /** + * Perform the "enhanced key schedule" step described by + * Provos and Mazieres in "A Future-Adaptable Password Scheme" + * http://www.openbsd.org/papers/bcrypt-paper.ps + * @param data salt information + * @param key password information + */ + private void ekskey(byte data[], byte key[]) { + int i; + int koffp[] = { 0 }, doffp[] = { 0 }; + int lr[] = { 0, 0 }; + int plen = P.length, slen = S.length; + + for (i = 0; i < plen; i++) + P[i] = P[i] ^ streamtoword(key, koffp); + + for (i = 0; i < plen; i += 2) { + lr[0] ^= streamtoword(data, doffp); + lr[1] ^= streamtoword(data, doffp); + encipher(lr, 0); + P[i] = lr[0]; + P[i + 1] = lr[1]; + } + + for (i = 0; i < slen; i += 2) { + lr[0] ^= streamtoword(data, doffp); + lr[1] ^= streamtoword(data, doffp); + encipher(lr, 0); + S[i] = lr[0]; + S[i + 1] = lr[1]; + } + } + + /** + * Perform the central password hashing step in the + * bcrypt scheme + * @param password the password to hash + * @param salt the binary salt to hash with the password + * @param log_rounds the binary logarithm of the number + * of rounds of hashing to apply + * @return an array containing the binary hashed password + */ + private byte[] crypt_raw(byte password[], byte salt[], int log_rounds) { + int rounds, i, j; + int cdata[] = (int[])bf_crypt_ciphertext.clone(); + int clen = cdata.length; + byte ret[]; + + if (log_rounds < 4 || log_rounds > 31) + throw new IllegalArgumentException ("Bad number of rounds"); + rounds = 1 << log_rounds; + if (salt.length != BCRYPT_SALT_LEN) + throw new IllegalArgumentException ("Bad salt length"); + + init_key(); + ekskey(salt, password); + for (i = 0; i < rounds; i++) { + key(password); + key(salt); + } + + for (i = 0; i < 64; i++) { + for (j = 0; j < (clen >> 1); j++) + encipher(cdata, j << 1); + } + + ret = new byte[clen * 4]; + for (i = 0, j = 0; i < clen; i++) { + ret[j++] = (byte)((cdata[i] >> 24) & 0xff); + ret[j++] = (byte)((cdata[i] >> 16) & 0xff); + ret[j++] = (byte)((cdata[i] >> 8) & 0xff); + ret[j++] = (byte)(cdata[i] & 0xff); + } + return ret; + } + + /** + * Hash a password using the OpenBSD bcrypt scheme + * @param password the password to hash + * @param salt the salt to hash with (perhaps generated + * using BCrypt.gensalt) + * @return the hashed password + */ + public static String hashpw(String password, String salt) { + BCrypt B; + String real_salt; + byte passwordb[], saltb[], hashed[]; + char minor = (char)0; + int rounds, off = 0; + StringBuffer rs = new StringBuffer(); + + if (salt.charAt(0) != '$' || salt.charAt(1) != '2') + throw new IllegalArgumentException ("Invalid salt version"); + if (salt.charAt(2) == '$') + off = 3; + else { + minor = salt.charAt(2); + if (minor != 'a' || salt.charAt(3) != '$') + throw new IllegalArgumentException ("Invalid salt revision"); + off = 4; + } + + // Extract number of rounds + if (salt.charAt(off + 2) > '$') + throw new IllegalArgumentException ("Missing salt rounds"); + rounds = Integer.parseInt(salt.substring(off, off + 2)); + + real_salt = salt.substring(off + 3, off + 25); + try { + passwordb = (password + (minor >= 'a' ? "\000" : "")).getBytes("UTF-8"); + } catch (UnsupportedEncodingException uee) { + throw new AssertionError("UTF-8 is not supported"); + } + + saltb = decode_base64(real_salt, BCRYPT_SALT_LEN); + + B = new BCrypt(); + hashed = B.crypt_raw(passwordb, saltb, rounds); + + rs.append("$2"); + if (minor >= 'a') + rs.append(minor); + rs.append("$"); + if (rounds < 10) + rs.append("0"); + rs.append(Integer.toString(rounds)); + rs.append("$"); + rs.append(encode_base64(saltb, saltb.length)); + rs.append(encode_base64(hashed, + bf_crypt_ciphertext.length * 4 - 1)); + return rs.toString(); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method + * @param log_rounds the log2 of the number of rounds of + * hashing to apply - the work factor therefore increases as + * 2**log_rounds. + * @param random an instance of SecureRandom to use + * @return an encoded salt value + */ + public static String gensalt(int log_rounds, SecureRandom random) { + StringBuffer rs = new StringBuffer(); + byte rnd[] = new byte[BCRYPT_SALT_LEN]; + + random.nextBytes(rnd); + + rs.append("$2a$"); + if (log_rounds < 10) + rs.append("0"); + rs.append(Integer.toString(log_rounds)); + rs.append("$"); + rs.append(encode_base64(rnd, rnd.length)); + return rs.toString(); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method + * @param log_rounds the log2 of the number of rounds of + * hashing to apply - the work factor therefore increases as + * 2**log_rounds. + * @return an encoded salt value + */ + public static String gensalt(int log_rounds) { + return gensalt(log_rounds, new SecureRandom()); + } + + /** + * Generate a salt for use with the BCrypt.hashpw() method, + * selecting a reasonable default for the number of hashing + * rounds to apply + * @return an encoded salt value + */ + public static String gensalt() { + return gensalt(GENSALT_DEFAULT_LOG2_ROUNDS); + } + + /** + * Check that a plaintext password matches a previously hashed + * one + * @param plaintext the plaintext password to verify + * @param hashed the previously-hashed password + * @return true if the passwords match, false otherwise + */ + public static boolean checkpw(String plaintext, String hashed) { + return (hashed.compareTo(hashpw(plaintext, hashed)) == 0); + } +} diff --git a/src/main/java/uk/org/whoami/authme/security/PasswordSecurity.java b/src/main/java/uk/org/whoami/authme/security/PasswordSecurity.java index e16affc40..3f4fee3ab 100644 --- a/src/main/java/uk/org/whoami/authme/security/PasswordSecurity.java +++ b/src/main/java/uk/org/whoami/authme/security/PasswordSecurity.java @@ -89,6 +89,10 @@ public class PasswordSecurity { private static String getSaltedIPB3(String message, String salt) throws NoSuchAlgorithmException { return getMD5(getMD5(salt) + getMD5(message)); } + + private static String getBCrypt(String message, String salt) { + return BCrypt.hashpw(message, salt); + } private static String createSalt(int length) throws NoSuchAlgorithmException { byte[] msg = new byte[40]; @@ -182,6 +186,18 @@ public class PasswordSecurity { userSalt.put(name, saltj); } return getMD5(password + saltj) + ":" + saltj; + case BCRYPT: + String saltbcrypt = ""; + try { + saltbcrypt = AuthMe.getInstance().database.getAuth(name).getSalt(); + } catch (NullPointerException npe) { + } catch (ArrayIndexOutOfBoundsException aioobe) { + } + if(saltbcrypt.isEmpty() || saltbcrypt == null) { + saltbcrypt = BCrypt.gensalt(Settings.bCryptLog2Rounds); + userSalt.put(name, saltbcrypt); + } + return getBCrypt(password, saltbcrypt); default: throw new NoSuchAlgorithmException("Unknown hash algorithm"); } @@ -196,6 +212,10 @@ public class PasswordSecurity { String saltipb = AuthMe.getInstance().database.getAuth(playername).getSalt(); return hash.equals(getSaltedIPB3(password, saltipb)); } + if(!Settings.getMySQLColumnSalt.isEmpty() && Settings.getPasswordHash == HashAlgorithm.BCRYPT) { + String saltbcrypt = AuthMe.getInstance().database.getAuth(playername).getSalt(); + return hash.equals(BCrypt.hashpw(password, saltbcrypt)); + } if(!Settings.getMySQLColumnSalt.isEmpty() && Settings.getPasswordHash == HashAlgorithm.PHPFUSION) { String saltfusion = AuthMe.getInstance().database.getAuth(playername).getSalt(); return hash.equals(getPhPFusion(password, saltfusion)); @@ -285,7 +305,7 @@ public class PasswordSecurity { public enum HashAlgorithm { - MD5, SHA1, SHA256, WHIRLPOOL, XAUTH, MD5VB, PHPBB, PLAINTEXT, MYBB, IPB3, PHPFUSION, SMF, XFSHA1, XFSHA256, SALTED2MD5, JOOMLA + MD5, SHA1, SHA256, WHIRLPOOL, XAUTH, MD5VB, PHPBB, PLAINTEXT, MYBB, IPB3, PHPFUSION, SMF, XFSHA1, XFSHA256, SALTED2MD5, JOOMLA, BCRYPT } } diff --git a/src/main/java/uk/org/whoami/authme/security/RandomString.java b/src/main/java/uk/org/whoami/authme/security/RandomString.java index 4ae022a1b..744a8cac1 100644 --- a/src/main/java/uk/org/whoami/authme/security/RandomString.java +++ b/src/main/java/uk/org/whoami/authme/security/RandomString.java @@ -36,4 +36,4 @@ public class RandomString return new String(buf); } -} \ No newline at end of file +} diff --git a/src/main/java/uk/org/whoami/authme/settings/Settings.java b/src/main/java/uk/org/whoami/authme/settings/Settings.java index 6460fced2..bb1ef2f3b 100644 --- a/src/main/java/uk/org/whoami/authme/settings/Settings.java +++ b/src/main/java/uk/org/whoami/authme/settings/Settings.java @@ -17,11 +17,11 @@ package uk.org.whoami.authme.settings; import java.io.File; - import java.io.InputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; + import org.bukkit.configuration.MemoryConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.plugin.Plugin; @@ -60,7 +60,7 @@ public final class Settings extends YamlConfiguration { getEnablePasswordVerifier, protectInventoryBeforeLogInEnabled, isBackupActivated, isBackupOnStart, isBackupOnStop, enablePasspartu, isStopEnabled, reloadSupport, rakamakUseIp, noConsoleSpam, removePassword, displayOtherAccounts, useCaptcha, emailRegistration, multiverse, notifications, chestshop, bungee, banUnsafeIp, doubleEmailCheck, sessionExpireOnIpChange, - disableSocialSpy; + disableSocialSpy, useMultiThreading; public static String getNickRegex, getUnloggedinGroup, getMySQLHost, getMySQLPort, getMySQLUsername, getMySQLPassword, getMySQLDatabase, getMySQLTablename, @@ -68,11 +68,12 @@ public final class Settings extends YamlConfiguration { getMySQLColumnSalt, getMySQLColumnGroup, getMySQLColumnEmail, unRegisteredGroup, backupWindowsPath, getcUnrestrictedName, getRegisteredGroup, messagesLanguage, getMySQLlastlocX, getMySQLlastlocY, getMySQLlastlocZ, rakamakUsers, rakamakUsersIp, getmailAccount, getmailPassword, getmailSMTP, getMySQLColumnId, getmailSenderName, - getPredefinedSalt, getMailSubject, getMailText; + getPredefinedSalt, getMailSubject, getMailText, getMySQLlastlocWorld; public static int getWarnMessageInterval, getSessionTimeout, getRegistrationTimeout, getMaxNickLength, getMinNickLength, getPasswordMinLen, getMovementRadius, getmaxRegPerIp, getNonActivatedGroup, - passwordMaxLength, getRecoveryPassLength, getMailPort, maxLoginTry, captchaLength, saltLength, getmaxRegPerEmail; + passwordMaxLength, getRecoveryPassLength, getMailPort, maxLoginTry, captchaLength, saltLength, getmaxRegPerEmail, + bCryptLog2Rounds; protected static YamlConfiguration configFile; @@ -141,6 +142,7 @@ public void loadConfigOptions() { getMySQLlastlocX = configFile.getString("DataSource.mySQLlastlocX","x"); getMySQLlastlocY = configFile.getString("DataSource.mySQLlastlocY","y"); getMySQLlastlocZ = configFile.getString("DataSource.mySQLlastlocZ","z"); + getMySQLlastlocWorld = configFile.getString("DataSource.mySQLlastlocWorld", "world"); getNonActivatedGroup = configFile.getInt("ExternalBoardOptions.nonActivedUserGroup", -1); unRegisteredGroup = configFile.getString("GroupOptions.UnregisteredPlayerGroup",""); getUnrestrictedName = configFile.getStringList("settings.unrestrictions.UnrestrictedName"); @@ -192,7 +194,7 @@ public void loadConfigOptions() { maxLoginTry = configFile.getInt("Security.captcha.maxLoginTry", 5); captchaLength = configFile.getInt("Security.captcha.captchaLength", 5); getMailSubject = configFile.getString("Email.mailSubject", "Your new AuthMe Password"); - getMailText = configFile.getString("Email.mailText", "Dear , \n\n This is your new AuthMe password for the server : \n\n \n\n \n\n Do not forget to change password after login! \n /changepassword newPassword"); + getMailText = configFile.getString("Email.mailText", "Dear ,

This is your new AuthMe password for the server

:



Do not forget to change password after login!
/changepassword newPassword"); emailRegistration = configFile.getBoolean("settings.registration.enableEmailRegistrationSystem", false); saltLength = configFile.getInt("settings.security.doubleMD5SaltLength", 8); getmaxRegPerEmail = configFile.getInt("Email.maxRegPerEmail", 1); @@ -206,6 +208,8 @@ public void loadConfigOptions() { sessionExpireOnIpChange = configFile.getBoolean("settings.sessions.sessionExpireOnIpChange", false); useLogging = configFile.getBoolean("Security.console.logConsole", false); disableSocialSpy = configFile.getBoolean("Hooks.disableSocialSpy", true); + useMultiThreading = configFile.getBoolean("Performances.useMultiThreading", false); + bCryptLog2Rounds = configFile.getInt("ExternalBoardOptions.bCryptLog2Round", 10); saveDefaults(); } @@ -259,6 +263,7 @@ public static void reloadConfigOptions(YamlConfiguration newConfig) { getMySQLlastlocX = configFile.getString("DataSource.mySQLlastlocX","x"); getMySQLlastlocY = configFile.getString("DataSource.mySQLlastlocY","y"); getMySQLlastlocZ = configFile.getString("DataSource.mySQLlastlocZ","z"); + getMySQLlastlocWorld = configFile.getString("DataSource.mySQLlastlocWorld", "world"); getMySQLColumnSalt = configFile.getString("ExternalBoardOptions.mySQLColumnSalt",""); getMySQLColumnGroup = configFile.getString("ExternalBoardOptions.mySQLColumnGroup",""); getNonActivatedGroup = configFile.getInt("ExternalBoardOptions.nonActivedUserGroup", -1); @@ -312,7 +317,7 @@ public static void reloadConfigOptions(YamlConfiguration newConfig) { maxLoginTry = configFile.getInt("Security.captcha.maxLoginTry", 5); captchaLength = configFile.getInt("Security.captcha.captchaLength", 5); getMailSubject = configFile.getString("Email.mailSubject", "Your new AuthMe Password"); - getMailText = configFile.getString("Email.mailText", "Dear , \n\n This is your new AuthMe password for the server : \n\n \n\n \n\n Do not forget to change password after login! \n /changepassword newPassword"); + getMailText = configFile.getString("Email.mailText", "Dear ,

This is your new AuthMe password for the server

:



Do not forget to change password after login!
/changepassword newPassword"); emailRegistration = configFile.getBoolean("settings.registration.enableEmailRegistrationSystem", false); saltLength = configFile.getInt("settings.security.doubleMD5SaltLength", 8); getmaxRegPerEmail = configFile.getInt("Email.maxRegPerEmail", 1); @@ -326,7 +331,8 @@ public static void reloadConfigOptions(YamlConfiguration newConfig) { sessionExpireOnIpChange = configFile.getBoolean("settings.sessions.sessionExpireOnIpChange", false); useLogging = configFile.getBoolean("Security.console.logConsole", false); disableSocialSpy = configFile.getBoolean("Hooks.disableSocialSpy", true); - + useMultiThreading = configFile.getBoolean("Performances.useMultiThreading", false); + bCryptLog2Rounds = configFile.getInt("ExternalBoardOptions.bCryptLog2Round", 10); } public void mergeConfig() { @@ -371,7 +377,15 @@ public void mergeConfig() { if(!contains("Email.mailSubject")) set("Email.mailSubject", ""); if(!contains("Email.mailText")) - set("Email.mailText", "Dear , \n\n This is your new AuthMe password for the server : \n\n \n\n \n\n Do not forget to change password after login! \n /changepassword newPassword"); + set("Email.mailText", "Dear ,

This is your new AuthMe password for the server

:



Do not forget to change password after login!
/changepassword newPassword"); + if(contains("Email.mailText")) { + try { + String s = getString("Email.mailText"); + s = s.replaceAll("\n", "
"); + set("Email.mailText", null); + set("Email.mailText", s); + } catch (Exception e) {} + } if(!contains("settings.registration.enableEmailRegistrationSystem")) set("settings.registration.enableEmailRegistrationSystem", false); if(!contains("settings.security.doubleMD5SaltLength")) @@ -396,6 +410,12 @@ public void mergeConfig() { set("Security.console.logConsole", false); if(!contains("Hooks.disableSocialSpy")) set("Hooks.disableSocialSpy", true); + if(!contains("Performances.useMultiThreading")) + set("Performances.useMultiThreading", false); + if(!contains("ExternalBoardOptions.bCryptLog2Round")) + set("ExternalBoardOptions.bCryptLog2Round", 10); + if(!contains("DataSource.mySQLlastlocWorld")) + set("DataSource.mySQLlastlocWorld", "world"); plugin.getLogger().info("Merge new Config Options if needed.."); plugin.saveConfig(); diff --git a/src/main/java/uk/org/whoami/authme/threads/LoginThread.java b/src/main/java/uk/org/whoami/authme/threads/LoginThread.java new file mode 100644 index 000000000..f702151fc --- /dev/null +++ b/src/main/java/uk/org/whoami/authme/threads/LoginThread.java @@ -0,0 +1,639 @@ +package uk.org.whoami.authme.threads; + +import java.security.NoSuchAlgorithmException; +import java.util.Date; +import java.util.List; + +import me.muizers.Notifications.Notification; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.plugin.PluginManager; + +import uk.org.whoami.authme.AuthMe; +import uk.org.whoami.authme.ConsoleLogger; +import uk.org.whoami.authme.Utils; +import uk.org.whoami.authme.api.API; +import uk.org.whoami.authme.cache.auth.PlayerAuth; +import uk.org.whoami.authme.cache.auth.PlayerCache; +import uk.org.whoami.authme.cache.backup.FileCache; +import uk.org.whoami.authme.cache.limbo.LimboCache; +import uk.org.whoami.authme.cache.limbo.LimboPlayer; +import uk.org.whoami.authme.datasource.DataSource; +import uk.org.whoami.authme.events.AuthMeTeleportEvent; +import uk.org.whoami.authme.events.LoginEvent; +import uk.org.whoami.authme.events.RestoreInventoryEvent; +import uk.org.whoami.authme.events.SpawnTeleportEvent; +import uk.org.whoami.authme.listener.AuthMePlayerListener; +import uk.org.whoami.authme.security.PasswordSecurity; +import uk.org.whoami.authme.security.RandomString; +import uk.org.whoami.authme.settings.Messages; +import uk.org.whoami.authme.settings.PlayersLogs; +import uk.org.whoami.authme.settings.Settings; +import uk.org.whoami.authme.settings.Spawn; + +public class LoginThread extends Thread { + + private Messages m = Messages.getInstance(); + private PlayersLogs pllog = PlayersLogs.getInstance(); + private Utils utils = Utils.getInstance(); + private FileCache playerCache = new FileCache(); + private DataSource database; + public AuthMe plugin; + private boolean passpartu = false; + public RandomString rdm = new RandomString(Settings.captchaLength); + public PluginManager pm; + private Player player; + private String password; + + public LoginThread(DataSource database, AuthMe plugin, Player player, + String password) { + this.database = database; + this.plugin = plugin; + this.pm = plugin.getServer().getPluginManager(); + this.player = player; + this.password = password; + } + + public LoginThread(DataSource database, boolean passpartu, AuthMe plugin, + Player player, String password) { + this.database = database; + this.passpartu = passpartu; + this.plugin = plugin; + this.pm = plugin.getServer().getPluginManager(); + this.player = player; + this.password = password; + } + + public void run() { + final String name = player.getName().toLowerCase(); + String ip = player.getAddress().getAddress().getHostAddress(); + if (Settings.bungee) { + if (plugin.realIp.containsKey(name)) + ip = plugin.realIp.get(name); + } + World world = player.getWorld(); + Location spawnLoc = world.getSpawnLocation(); + if (plugin.mv != null) { + try { + spawnLoc = plugin.mv.getMVWorldManager().getMVWorld(world) + .getSpawnLocation(); + } catch (NullPointerException npe) { + } catch (ClassCastException cce) { + } catch (NoClassDefFoundError ncdfe) { + } + } + if (plugin.essentialsSpawn != null) { + spawnLoc = plugin.essentialsSpawn; + } + if (Spawn.getInstance().getLocation() != null) + spawnLoc = Spawn.getInstance().getLocation(); + if (PlayerCache.getInstance().isAuthenticated(name)) { + player.sendMessage(m._("logged_in")); + this.interrupt(); + return; + } + if (!database.isAuthAvailable(player.getName().toLowerCase())) { + player.sendMessage(m._("user_unknown")); + this.interrupt(); + return; + } + PlayerAuth pAuth = database.getAuth(name); + if (pAuth == null) { + player.sendMessage(m._("user_unknown")); + this.interrupt(); + return; + } + if (!Settings.getMySQLColumnGroup.isEmpty() + && pAuth.getGroupId() == Settings.getNonActivatedGroup) { + player.sendMessage(m._("vb_nonActiv")); + this.interrupt(); + return; + } + String hash = pAuth.getHash(); + String email = pAuth.getEmail(); + try { + if (!passpartu) { + if (Settings.useCaptcha) { + if (!plugin.captcha.containsKey(name)) { + plugin.captcha.put(name, 1); + } else { + int i = plugin.captcha.get(name) + 1; + 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")); + plugin.cap.put(name, rdm.nextString()); + player.sendMessage("Type : /captcha " + + plugin.cap.get(name)); + this.interrupt(); + return; + } else if (plugin.captcha.containsKey(name) + && plugin.captcha.get(name) > Settings.maxLoginTry) { + try { + plugin.captcha.remove(name); + plugin.cap.remove(name); + } catch (NullPointerException npe) { + } + } + } + if (PasswordSecurity.comparePasswordWithHash(password, hash, + name)) { + PlayerAuth auth = new PlayerAuth(name, hash, ip, + new Date().getTime(), email); + database.updateSession(auth); + PlayerCache.getInstance().addPlayer(auth); + final LimboPlayer limbo = LimboCache.getInstance() + .getLimboPlayer(name); + PlayerAuth getAuth = database.getAuth(name); + if (limbo != null) { + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + player.setOp(limbo.getOperator()); + } + }); + + utils.addNormal(player, limbo.getGroup()); + + if ((Settings.isTeleportToSpawnEnabled) + && (!Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds + .contains(player.getWorld().getName()))) { + if ((Settings.isSaveQuitLocationEnabled) + && (getAuth.getQuitLocY() != 0)) { + utils.packCoords(getAuth.getQuitLocX(), + getAuth.getQuitLocY(), + getAuth.getQuitLocZ(), + getAuth.getWorld(), player); + } else { + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent( + player, limbo.getLoc()); + pm.callEvent(tpEvent); + Location fLoc = tpEvent.getTo(); + if (!tpEvent.isCancelled()) { + if (!fLoc.getChunk() + .isLoaded()) { + fLoc.getChunk().load(); + } + player.teleport(fLoc); + } + } + }); + } + } else if (Settings.isForceSpawnLocOnJoinEnabled + && Settings.getForcedWorlds.contains(player + .getWorld().getName())) { + final Location spawnL = spawnLoc; + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + SpawnTeleportEvent tpEvent = new SpawnTeleportEvent( + player, player + .getLocation(), + spawnL, true); + pm.callEvent(tpEvent); + if (!tpEvent.isCancelled()) { + Location fLoc = tpEvent.getTo(); + if (!fLoc.getChunk().isLoaded()) { + fLoc.getChunk().load(); + } + player.teleport(fLoc); + } + } + }); + } else if ((Settings.isSaveQuitLocationEnabled) + && (getAuth.getQuitLocY() != 0)) { + utils.packCoords(getAuth.getQuitLocX(), + getAuth.getQuitLocY(), + getAuth.getQuitLocZ(), getAuth.getWorld(), + player); + } else { + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent( + player, limbo.getLoc()); + pm.callEvent(tpEvent); + Location fLoc = tpEvent.getTo(); + if (!tpEvent.isCancelled()) { + if (!fLoc.getChunk().isLoaded()) { + fLoc.getChunk().load(); + } + player.teleport(fLoc); + } + } + }); + } + + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + player.setGameMode(GameMode.getByValue(limbo + .getGameMode())); + } + }); + + if (Settings.protectInventoryBeforeLogInEnabled + && player.hasPlayedBefore()) { + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + RestoreInventoryEvent event = new RestoreInventoryEvent( + player, limbo + .getInventory(), + limbo.getArmour()); + Bukkit.getServer() + .getPluginManager() + .callEvent(event); + if (!event.isCancelled()) { + API.setPlayerInventory(player, + limbo.getInventory(), + limbo.getArmour()); + } + } + }); + } + + player.getServer().getScheduler() + .cancelTask(limbo.getTimeoutTaskId()); + player.getServer().getScheduler() + .cancelTask(limbo.getMessageTaskId()); + LimboCache.getInstance().deleteLimboPlayer(name); + if (playerCache.doesCacheExist(name)) { + playerCache.removeCache(name); + } + } + + /* + * Little Work Around under Registration Group Switching for + * admins that add Registration thru a web Scripts. + */ + if (Settings.isPermissionCheckEnabled + && AuthMe.permission.playerInGroup(player, + Settings.unRegisteredGroup) + && !Settings.unRegisteredGroup.isEmpty()) { + AuthMe.permission.playerRemoveGroup(player.getWorld(), + player.getName(), Settings.unRegisteredGroup); + AuthMe.permission.playerAddGroup(player.getWorld(), + player.getName(), Settings.getRegisteredGroup); + } + + try { + if (!PlayersLogs.players.contains(player.getName())) + PlayersLogs.players.add(player.getName()); + pllog.save(); + } catch (NullPointerException ex) { + } + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + Bukkit.getServer().getPluginManager() + .callEvent(new LoginEvent(player, true)); + } + }); + if (Settings.useCaptcha) { + if (plugin.captcha.containsKey(name)) { + plugin.captcha.remove(name); + } + if (plugin.cap.containsKey(name)) { + plugin.cap.containsKey(name); + } + } + player.sendMessage(m._("login")); + displayOtherAccounts(auth); + if (!Settings.noConsoleSpam) + ConsoleLogger.info(player.getName() + " logged in!"); + if (plugin.notifications != null) { + plugin.notifications + .showNotification(new Notification("[AuthMe] " + + player.getName() + " logged in!")); + } + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + player.saveData(); + } + }); + this.interrupt(); + return; + } else { + if (!Settings.noConsoleSpam) + ConsoleLogger.info(player.getName() + + " used the wrong password"); + if (Settings.isKickOnWrongPasswordEnabled) { + try { + final int gm = AuthMePlayerListener.gameMode + .get(name); + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + player.setGameMode(GameMode + .getByValue(gm)); + } + }); + } catch (NullPointerException npe) { + } + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + player.kickPlayer(m._("wrong_pwd")); + } + }); + } else { + player.sendMessage(m._("wrong_pwd")); + this.interrupt(); + return; + } + } + } else { + // need for bypass password check if passpartu command is + // enabled + PlayerAuth auth = new PlayerAuth(name, hash, ip, + new Date().getTime(), email); + database.updateSession(auth); + PlayerCache.getInstance().addPlayer(auth); + final LimboPlayer limbo = LimboCache.getInstance() + .getLimboPlayer(name); + if (limbo != null) { + + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + player.setOp(limbo.getOperator()); + } + }); + + utils.addNormal(player, limbo.getGroup()); + + if ((Settings.isTeleportToSpawnEnabled) + && (!Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds + .contains(player.getWorld().getName()))) { + if ((Settings.isSaveQuitLocationEnabled) + && (database.getAuth(name).getQuitLocY() != 0)) { + String worldname = database.getAuth(name) + .getWorld(); + World theWorld; + if (worldname.equals("unavailableworld")) { + theWorld = player.getWorld(); + } else { + theWorld = Bukkit.getWorld(worldname); + } + if (theWorld == null) + theWorld = player.getWorld(); + final Location quitLoc = new Location( + theWorld, + database.getAuth(name).getQuitLocX() + 0.5D, + database.getAuth(name).getQuitLocY() + 0.5D, + database.getAuth(name).getQuitLocZ() + 0.5D); + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent( + player, quitLoc); + pm.callEvent(tpEvent); + Location fLoc = tpEvent.getTo(); + if (!tpEvent.isCancelled()) { + if (!fLoc.getChunk().isLoaded()) { + fLoc.getChunk().load(); + } + player.teleport(fLoc); + } + } + }); + } else { + Bukkit.getScheduler().runTask(plugin, + new Runnable() { + @Override + public void run() { + AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent( + player, limbo.getLoc()); + pm.callEvent(tpEvent); + Location fLoc = tpEvent.getTo(); + if (!tpEvent.isCancelled()) { + if (!fLoc.getChunk().isLoaded()) { + fLoc.getChunk().load(); + } + player.teleport(fLoc); + } + } + }); + } + } else if (Settings.isForceSpawnLocOnJoinEnabled + && Settings.getForcedWorlds.contains(player + .getWorld().getName())) { + final Location spawnL = spawnLoc; + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + SpawnTeleportEvent tpEvent = new SpawnTeleportEvent( + player, player.getLocation(), spawnL, + true); + pm.callEvent(tpEvent); + if (!tpEvent.isCancelled()) { + Location fLoc = tpEvent.getTo(); + if (!fLoc.getChunk().isLoaded()) { + fLoc.getChunk().load(); + } + player.teleport(fLoc); + } + } + }); + } else if ((Settings.isSaveQuitLocationEnabled) + && (database.getAuth(name).getQuitLocY() != 0)) { + String worldname = database.getAuth(name).getWorld(); + World theWorld; + if (worldname.equals("unavailableworld")) { + theWorld = player.getWorld(); + } else { + theWorld = Bukkit.getWorld(worldname); + } + if (theWorld == null) + theWorld = player.getWorld(); + final Location quitLoc = new Location(theWorld, + database.getAuth(name).getQuitLocX() + 0.5D, + database.getAuth(name).getQuitLocY() + 0.5D, + database.getAuth(name).getQuitLocZ() + 0.5D); + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent( + player, quitLoc); + pm.callEvent(tpEvent); + Location fLoc = tpEvent.getTo(); + if (!tpEvent.isCancelled()) { + if (!fLoc.getChunk().isLoaded()) { + fLoc.getChunk().load(); + } + player.teleport(fLoc); + } + } + }); + } else { + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent( + player, limbo.getLoc()); + pm.callEvent(tpEvent); + Location fLoc = tpEvent.getTo(); + if (!tpEvent.isCancelled()) { + if (!fLoc.getChunk().isLoaded()) { + fLoc.getChunk().load(); + } + player.teleport(fLoc); + } + } + }); + } + + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + player.setGameMode(GameMode.getByValue(limbo + .getGameMode())); + } + }); + + if (Settings.protectInventoryBeforeLogInEnabled + && player.hasPlayedBefore()) { + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + RestoreInventoryEvent event = new RestoreInventoryEvent( + player, limbo.getInventory(), limbo + .getArmour()); + Bukkit.getServer().getPluginManager() + .callEvent(event); + if (!event.isCancelled()) { + API.setPlayerInventory(player, + limbo.getInventory(), + limbo.getArmour()); + } + } + }); + } + + player.getServer().getScheduler() + .cancelTask(limbo.getTimeoutTaskId()); + player.getServer().getScheduler() + .cancelTask(limbo.getMessageTaskId()); + LimboCache.getInstance().deleteLimboPlayer(name); + if (playerCache.doesCacheExist(name)) { + playerCache.removeCache(name); + } + } + + /* + * Little Work Around under Registration Group Switching for + * admins that add Registration thru a web Scripts. + */ + if (Settings.isPermissionCheckEnabled + && AuthMe.permission.playerInGroup(player, + Settings.unRegisteredGroup) + && !Settings.unRegisteredGroup.isEmpty()) { + AuthMe.permission.playerRemoveGroup(player.getWorld(), + player.getName(), Settings.unRegisteredGroup); + AuthMe.permission.playerAddGroup(player.getWorld(), + player.getName(), Settings.getRegisteredGroup); + } + + try { + if (!PlayersLogs.players.contains(player.getName())) + PlayersLogs.players.add(player.getName()); + pllog.save(); + } catch (NullPointerException ex) { + } + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + Bukkit.getServer().getPluginManager() + .callEvent(new LoginEvent(player, true)); + } + }); + if (Settings.useCaptcha) { + if (plugin.captcha.containsKey(name)) { + plugin.captcha.remove(name); + } + if (plugin.cap.containsKey(name)) { + plugin.cap.containsKey(name); + } + } + player.sendMessage(m._("login")); + displayOtherAccounts(auth); + if (!Settings.noConsoleSpam) + ConsoleLogger.info(player.getName() + " logged in!"); + if (plugin.notifications != null) { + plugin.notifications.showNotification(new Notification( + "[AuthMe] " + player.getName() + " logged in!")); + } + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + player.saveData(); + } + }); + this.interrupt(); + } + } catch (NoSuchAlgorithmException ex) { + ConsoleLogger.showError(ex.getMessage()); + player.sendMessage(m._("error")); + this.interrupt(); + return; + } + this.interrupt(); + return; + } + + private void displayOtherAccounts(PlayerAuth auth) { + if (!Settings.displayOtherAccounts) { + return; + } + if (auth == null) { + return; + } + if (this.database.getAllAuthsByName(auth).isEmpty() + || this.database.getAllAuthsByName(auth) == null) { + return; + } + if (this.database.getAllAuthsByName(auth).size() == 1) { + return; + } + List accountList = this.database.getAllAuthsByName(auth); + String message = "[AuthMe] "; + int i = 0; + for (String account : accountList) { + i++; + message = message + account; + if (i != accountList.size()) { + message = message + ", "; + } else { + message = message + "."; + } + + } + for (Player player : AuthMe.getInstance().getServer() + .getOnlinePlayers()) { + if (plugin.authmePermissible(player, "authme.seeOtherAccounts")) { + player.sendMessage("[AuthMe] The player " + auth.getNickname() + + " has " + String.valueOf(accountList.size()) + + " accounts"); + player.sendMessage(message); + } + } + } + +} diff --git a/src/main/java/uk/org/whoami/authme/threads/RegisterThread.java b/src/main/java/uk/org/whoami/authme/threads/RegisterThread.java new file mode 100644 index 000000000..3c23fae0d --- /dev/null +++ b/src/main/java/uk/org/whoami/authme/threads/RegisterThread.java @@ -0,0 +1,305 @@ +package uk.org.whoami.authme.threads; + +import java.security.NoSuchAlgorithmException; +import java.util.Date; + +import me.muizers.Notifications.Notification; + +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitTask; + +import uk.org.whoami.authme.AuthMe; +import uk.org.whoami.authme.ConsoleLogger; +import uk.org.whoami.authme.Utils; +import uk.org.whoami.authme.cache.auth.PlayerAuth; +import uk.org.whoami.authme.cache.auth.PlayerCache; +import uk.org.whoami.authme.cache.limbo.LimboCache; +import uk.org.whoami.authme.cache.limbo.LimboPlayer; +import uk.org.whoami.authme.datasource.DataSource; +import uk.org.whoami.authme.events.RegisterTeleportEvent; +import uk.org.whoami.authme.security.PasswordSecurity; +import uk.org.whoami.authme.security.RandomString; +import uk.org.whoami.authme.settings.Messages; +import uk.org.whoami.authme.settings.PlayersLogs; +import uk.org.whoami.authme.settings.Settings; +import uk.org.whoami.authme.settings.Spawn; +import uk.org.whoami.authme.task.MessageTask; +import uk.org.whoami.authme.task.TimeoutTask; + +public class RegisterThread extends Thread { + + private Messages m = Messages.getInstance(); + private PlayersLogs pllog = PlayersLogs.getInstance(); + private DataSource database; + private boolean isFirstTimeJoin; + private PlayerAuth auth; + private AuthMe plugin; + private Player player; + private String[] args; + private String ip; + + public RegisterThread(AuthMe plugin, DataSource database, Player player, String ip, String[] args) { + this.database = database; + this.setFirstTimeJoin(false); + this.plugin = plugin; + this.player = player; + this.args = args.clone(); + this.ip = ip; + } + public void run() { + final String name = player.getName().toLowerCase(); + if (PlayerCache.getInstance().isAuthenticated(name)) { + player.sendMessage(m._("logged_in")); + this.interrupt(); + return; + } + + if (!Settings.isRegistrationEnabled) { + player.sendMessage(m._("reg_disabled")); + this.interrupt(); + return; + } + + if (database.isAuthAvailable(player.getName().toLowerCase())) { + player.sendMessage(m._("user_regged")); + if (pllog.getStringList("players").contains(player.getName())) { + pllog.getStringList("players").remove(player.getName()); + } + this.interrupt(); + return; + } + + if(Settings.getmaxRegPerIp > 0 ){ + if(!plugin.authmePermissible(player, "authme.allow2accounts") && database.getAllAuthsByIp(ip).size() >= Settings.getmaxRegPerIp) { + player.sendMessage(m._("max_reg")); + this.interrupt(); + return; + } + } + + if(Settings.emailRegistration && !Settings.getmailAccount.isEmpty()) { + if(!args[0].contains("@")) { + player.sendMessage(m._("usage_reg")); + this.interrupt(); + return; + } + if(Settings.doubleEmailCheck) { + if(args.length < 2) { + player.sendMessage(m._("usage_reg")); + this.interrupt(); + return; + } + if(!args[0].equals(args[1])) { + player.sendMessage(m._("usage_reg")); + this.interrupt(); + return; + } + } + final String email = args[0]; + if(Settings.getmaxRegPerEmail > 0) { + if (!plugin.authmePermissible(player, "authme.allow2accounts") && database.getAllAuthsByEmail(email).size() >= Settings.getmaxRegPerEmail) { + player.sendMessage(m._("max_reg")); + this.interrupt(); + return; + } + } + RandomString rand = new RandomString(Settings.getRecoveryPassLength); + final String thePass = rand.nextString(); + if (!thePass.isEmpty()) { + 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.getWorld().getName(), email); + database.saveAuth(fAuth); + database.updateEmail(fAuth); + database.updateSession(fAuth); + plugin.mail.main(fAuth, thePass); + } catch (NoSuchAlgorithmException e) { + ConsoleLogger.showError(e.getMessage()); + } + } 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.getWorld().getName(), email); + database.saveAuth(fAuth); + database.updateEmail(fAuth); + database.updateSession(fAuth); + plugin.mail.main(fAuth, thePass); + } catch (NoSuchAlgorithmException e) { + ConsoleLogger.showError(e.getMessage()); + } + } + if(!Settings.getRegisteredGroup.isEmpty()){ + Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED); + } + player.sendMessage(m._("vb_nonActiv")); + String msg = m._("login_msg"); + int time = Settings.getRegistrationTimeout * 20; + int msgInterval = Settings.getWarnMessageInterval; + if (time != 0) { + Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getTimeoutTaskId()); + BukkitTask id = Bukkit.getScheduler().runTaskLater(plugin, new TimeoutTask(plugin, name), time); + LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id.getTaskId()); + } + + Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getMessageTaskId()); + BukkitTask nwMsg = Bukkit.getScheduler().runTask(plugin, new MessageTask(plugin, name, msg, msgInterval)); + LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(nwMsg.getTaskId()); + + LimboCache.getInstance().deleteLimboPlayer(name); + if (Settings.isTeleportToSpawnEnabled) { + World world = player.getWorld(); + Location loca = world.getSpawnLocation(); + if (plugin.mv != null) { + try { + loca = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation(); + } catch (NullPointerException npe) { + } catch (ClassCastException cce) { + } catch (NoClassDefFoundError ncdfe) { + } + } + if (plugin.essentialsSpawn != null) { + loca = plugin.essentialsSpawn; + } + if (Spawn.getInstance().getLocation() != null) + loca = Spawn.getInstance().getLocation(); + final Location locaT = loca; + Bukkit.getScheduler().runTask(plugin, new Runnable() { + @Override + public void run() { + RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, locaT); + plugin.getServer().getPluginManager().callEvent(tpEvent); + if(!tpEvent.isCancelled()) { + if (!tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).isLoaded()) { + tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).load(); + } + player.teleport(tpEvent.getTo()); + } + } + }); + } + this.setFirstTimeJoin(true); + player.saveData(); + if (!Settings.noConsoleSpam) + ConsoleLogger.info(player.getName() + " registered "+player.getAddress().getAddress().getHostAddress()); + if(plugin.notifications != null) { + plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " has registered!")); + } + this.interrupt(); + return; + } + } + + if (args.length == 0 || (Settings.getEnablePasswordVerifier && args.length < 2) ) { + player.sendMessage(m._("usage_reg")); + this.interrupt(); + return; + } + + if(args[0].length() < Settings.getPasswordMinLen || args[0].length() > Settings.passwordMaxLength) { + player.sendMessage(m._("pass_len")); + this.interrupt(); + return; + } + try { + String hash; + if(Settings.getEnablePasswordVerifier) { + if (args[0].equals(args[1])) { + hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name); + } else { + player.sendMessage(m._("password_error")); + this.interrupt(); + return; + } + } else + hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name); + if (Settings.getMySQLColumnSalt.isEmpty()) + { + auth = new PlayerAuth(name, hash, ip, new Date().getTime()); + } else { + auth = new PlayerAuth(name, hash, PasswordSecurity.userSalt.get(name), ip, new Date().getTime()); + } + if (!database.saveAuth(auth)) { + player.sendMessage(m._("error")); + this.interrupt(); + return; + } + PlayerCache.getInstance().addPlayer(auth); + final LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name); + if (limbo != null) { + Bukkit.getScheduler().runTask(plugin, new Runnable(){ + @Override + public void run() { + player.setGameMode(GameMode.getByValue(limbo.getGameMode())); + } + }); + if (Settings.isTeleportToSpawnEnabled) { + World world = player.getWorld(); + Location loca = world.getSpawnLocation(); + if (plugin.mv != null) { + try { + loca = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation(); + } catch (NullPointerException npe) { + + } catch (ClassCastException cce) { + + } catch (NoClassDefFoundError ncdfe) { + + } + } + if (plugin.essentialsSpawn != null) { + loca = plugin.essentialsSpawn; + } + if (Spawn.getInstance().getLocation() != null) + loca = Spawn.getInstance().getLocation(); + final Location locaT = loca; + Bukkit.getScheduler().runTask(plugin, new Runnable(){ + @Override + public void run() { + RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, locaT); + plugin.getServer().getPluginManager().callEvent(tpEvent); + if(!tpEvent.isCancelled()) { + if (!tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).isLoaded()) { + tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).load(); + } + player.teleport(tpEvent.getTo()); + } + } + }); + } + player.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId()); + player.getServer().getScheduler().cancelTask(limbo.getMessageTaskId()); + LimboCache.getInstance().deleteLimboPlayer(name); + } + + if(!Settings.getRegisteredGroup.isEmpty()){ + Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED); + } + player.sendMessage(m._("registered")); + if (!Settings.getmailAccount.isEmpty()) + player.sendMessage(m._("add_email")); + this.setFirstTimeJoin(true); + player.saveData(); + if (!Settings.noConsoleSpam) + ConsoleLogger.info(player.getName() + " registered "+player.getAddress().getAddress().getHostAddress()); + if(plugin.notifications != null) { + plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " has registered!")); + } + this.interrupt(); + } catch (NoSuchAlgorithmException ex) { + ConsoleLogger.showError(ex.getMessage()); + player.sendMessage(m._("error")); + this.interrupt(); + } + } + public void setFirstTimeJoin(boolean isFirstTimeJoin) { + this.isFirstTimeJoin = isFirstTimeJoin; + } + public boolean isFirstTimeJoin() { + return isFirstTimeJoin; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index acff6f222..1ac923994 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -12,8 +12,9 @@ DataSource: mySQLPassword: '12345' caching: true mySQLlastlocX: x - mySQLlastlocY : y - mySQLlastlocZ : z + mySQLlastlocY: y + mySQLlastlocZ: z + mySQLlastlocWorld: world mySQLColumnEmail: email mySQLColumnId: id GroupOptions: @@ -81,6 +82,7 @@ ExternalBoardOptions: mySQLColumnGroup: '' nonActivedUserGroup: -1 mySQLOtherUsernameColumns: [] + bCryptLog2Round: 10 Xenoforo: predefinedSalt: '' permission: @@ -119,10 +121,12 @@ Email: mailSenderName: '' RecoveryPasswordLength: 8 mailSubject: 'Your new AuthMe Password' - mailText: 'Dear , \n\n This is your new AuthMe password for the server \n\n : \n\n \n\nDo not forget to change password after login! \n /changepassword newPassword' + mailText: 'Dear ,

This is your new AuthMe password for the server

:



Do not forget to change password after login!
/changepassword newPassword' maxRegPerEmail: 1 Hooks: multiverse: true chestshop: true bungeecord: false - notifications: true \ No newline at end of file + notifications: true +Performances: + useMultiThreading: false \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 1808c7eef..bc0e3e41b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,8 +3,8 @@ author: darkwarriors,Xephi website: http://www.multiplayer-italia.com/ 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: uk.org.whoami.authme.AuthMe -version: 2.7.16b4 -softdepend: [Vault, ChestShop, Spout, Multiverse-Core, Notifications, Citizens, CombatTag, Essentials] +version: 2.8 +softdepend: [Vault, ChestShop, Spout, Multiverse-Core, Notifications, Citizens, CombatTag, Essentials, EssentialsSpawn] commands: register: description: Register an account