diff --git a/pom.xml b/pom.xml
index 123c682f..b8a5f6a1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
- 3.3.2-DEV-1
+ 3.3.2
org.bukkit
diff --git a/src/main/java/fr/xephi/authme/AuthMe.java b/src/main/java/fr/xephi/authme/AuthMe.java
index 5d06ac6e..cb5b34a3 100644
--- a/src/main/java/fr/xephi/authme/AuthMe.java
+++ b/src/main/java/fr/xephi/authme/AuthMe.java
@@ -65,6 +65,7 @@ import fr.xephi.authme.plugin.manager.BungeeCordMessage;
import fr.xephi.authme.plugin.manager.CitizensCommunicator;
import fr.xephi.authme.plugin.manager.CombatTagComunicator;
import fr.xephi.authme.plugin.manager.EssSpawn;
+import fr.xephi.authme.process.Management;
import fr.xephi.authme.settings.Messages;
import fr.xephi.authme.settings.PlayersLogs;
import fr.xephi.authme.settings.Settings;
@@ -79,7 +80,7 @@ public class AuthMe extends JavaPlugin {
public DataSource database = null;
private Settings settings;
private Messages m;
- private PlayersLogs pllog;
+ public PlayersLogs pllog;
public static Server server;
public static Logger authmeLogger = Logger.getLogger("AuthMe");
public static AuthMe authme;
@@ -135,11 +136,13 @@ public class AuthMe extends JavaPlugin {
m = Messages.getInstance();
- setMessages(Messages.getInstance());
pllog = PlayersLogs.getInstance();
server = getServer();
+ //Find Permissions
+ checkVault();
+
//Set Console Filter
if (Settings.removePassword) {
this.getLogger().setFilter(new ConsoleFilter());
@@ -293,11 +296,8 @@ public class AuthMe extends JavaPlugin {
ConsoleLogger.info("Successfully hook with ChestShop!");
}
- //Find Permissions
- checkVault();
-
this.getCommand("authme").setExecutor(new AdminCommand(this, database));
- this.getCommand("register").setExecutor(new RegisterCommand(database, this));
+ this.getCommand("register").setExecutor(new RegisterCommand(this));
this.getCommand("login").setExecutor(new LoginCommand(this));
this.getCommand("changepassword").setExecutor(new ChangePasswordCommand(database, this));
this.getCommand("logout").setExecutor(new LogoutCommand(this,database));
@@ -355,8 +355,7 @@ public class AuthMe extends JavaPlugin {
if (permissionProvider != null) {
permission = permissionProvider.getProvider();
ConsoleLogger.info("Vault plugin detected, hook with " + permission.getName() + " system");
- }
- else {
+ } else {
ConsoleLogger.showError("Vault plugin is detected but not the permissions plugin!");
}
} else {
@@ -483,7 +482,7 @@ public class AuthMe extends JavaPlugin {
@Override
public void onDisable() {
- if (Bukkit.getOnlinePlayers() != null)
+ if (Bukkit.getOnlinePlayers().length != 0)
for(Player player : Bukkit.getOnlinePlayers()) {
this.savePlayer(player);
}
@@ -538,15 +537,9 @@ public class AuthMe extends JavaPlugin {
} catch (Exception e) { }
try {
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(), player.getWorld().getName());
- Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
- @Override
- public void run() {
- database.updateQuitLoc(auth);
- }
- });
+ if (PlayerCache.getInstance().isAuthenticated(name) && !player.isDead() && Settings.isSaveQuitLocationEnabled) {
+ final PlayerAuth auth = new PlayerAuth(player.getName().toLowerCase(), player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ(), player.getWorld().getName());
+ database.updateQuitLoc(auth);
}
if (LimboCache.getInstance().hasLimboPlayer(name))
{
@@ -820,16 +813,18 @@ public class AuthMe extends JavaPlugin {
}
public String replaceAllInfos(String message, Player player) {
- message = message.replace("&", "\u00a7");
- message = message.replace("{PLAYER}", player.getName());
- message = message.replace("{ONLINE}", ""+this.getServer().getOnlinePlayers().length);
- message = message.replace("{MAXPLAYERS}", ""+this.getServer().getMaxPlayers());
- message = message.replace("{IP}", player.getAddress().getAddress().getHostAddress());
- message = message.replace("{LOGINS}", ""+PlayerCache.getInstance().getLogged());
- message = message.replace("{WORLD}", player.getWorld().getName());
- message = message.replace("{SERVER}", this.getServer().getServerName());
- message = message.replace("{VERSION}", this.getServer().getBukkitVersion());
- message = message.replace("{COUNTRY}", this.getCountryName(player.getAddress().getAddress()));
+ try {
+ message = message.replace("&", "\u00a7");
+ message = message.replace("{PLAYER}", player.getName());
+ message = message.replace("{ONLINE}", ""+this.getServer().getOnlinePlayers().length);
+ message = message.replace("{MAXPLAYERS}", ""+this.getServer().getMaxPlayers());
+ message = message.replace("{IP}", player.getAddress().getAddress().getHostAddress());
+ message = message.replace("{LOGINS}", ""+PlayerCache.getInstance().getLogged());
+ message = message.replace("{WORLD}", player.getWorld().getName());
+ message = message.replace("{SERVER}", this.getServer().getServerName());
+ message = message.replace("{VERSION}", this.getServer().getBukkitVersion());
+ message = message.replace("{COUNTRY}", this.getCountryName(player.getAddress().getAddress()));
+ } catch (Exception e) {}
return message;
}
}
diff --git a/src/main/java/fr/xephi/authme/ConsoleLogger.java b/src/main/java/fr/xephi/authme/ConsoleLogger.java
index 48b1427b..89b866fa 100644
--- a/src/main/java/fr/xephi/authme/ConsoleLogger.java
+++ b/src/main/java/fr/xephi/authme/ConsoleLogger.java
@@ -19,7 +19,7 @@ public class ConsoleLogger {
public static void info(String message) {
if (AuthMe.getInstance().isEnabled()) {
- log.info(message);
+ log.info("[AuthMe] " + message);
if (Settings.useLogging) {
Calendar date = Calendar.getInstance();
final String actually = "[" + DateFormat.getDateInstance().format(date.getTime()) + ", " + date.get(Calendar.HOUR_OF_DAY) + ":" + date.get(Calendar.MINUTE) + ":" + date.get(Calendar.SECOND) + "] " + message;
@@ -35,7 +35,7 @@ public class ConsoleLogger {
public static void showError(String message) {
if (AuthMe.getInstance().isEnabled()) {
- log.warning(" ERROR: " + message);
+ log.warning("[AuthMe] ERROR: " + message);
if (Settings.useLogging) {
Calendar date = Calendar.getInstance();
final String actually = "[" + DateFormat.getDateInstance().format(date.getTime()) + ", " + date.get(Calendar.HOUR_OF_DAY) + ":" + date.get(Calendar.MINUTE) + ":" + date.get(Calendar.SECOND) + "] ERROR : " + message;
diff --git a/src/main/java/fr/xephi/authme/Management.java b/src/main/java/fr/xephi/authme/Management.java
deleted file mode 100644
index eeef7a60..00000000
--- a/src/main/java/fr/xephi/authme/Management.java
+++ /dev/null
@@ -1,472 +0,0 @@
-package fr.xephi.authme;
-
-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.entity.Player;
-import org.bukkit.plugin.PluginManager;
-
-import fr.xephi.authme.Utils.groupType;
-import fr.xephi.authme.api.API;
-import fr.xephi.authme.cache.auth.PlayerAuth;
-import fr.xephi.authme.cache.auth.PlayerCache;
-import fr.xephi.authme.cache.backup.FileCache;
-import fr.xephi.authme.cache.limbo.LimboCache;
-import fr.xephi.authme.cache.limbo.LimboPlayer;
-import fr.xephi.authme.datasource.DataSource;
-import fr.xephi.authme.events.AuthMeTeleportEvent;
-import fr.xephi.authme.events.LoginEvent;
-import fr.xephi.authme.events.RestoreInventoryEvent;
-import fr.xephi.authme.events.SpawnTeleportEvent;
-import fr.xephi.authme.listener.AuthMePlayerListener;
-import fr.xephi.authme.security.PasswordSecurity;
-import fr.xephi.authme.security.RandomString;
-import fr.xephi.authme.settings.Messages;
-import fr.xephi.authme.settings.PlayersLogs;
-import fr.xephi.authme.settings.Settings;
-
-/**
- *
- * @authors Xephi59, Possible
- *
- */
-public class Management 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;
- 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 void run() {
- }
-
- public void performLogin(final Player player, final String password, final boolean passpartu, final boolean forceLogin) {
- if (passpartu) {
- // Passpartu-Login Bypasses Password-Authentication.
- new AsyncronousPasspartuLogin(player).pass();
- } else {
- new AsyncronousLogin(player, password, forceLogin).process();
- }
- }
-
- class AsyncronousLogin {
- protected Player player;
- protected String name;
- protected String password;
- protected String realName;
- protected boolean forceLogin;
-
- public AsyncronousLogin(Player player, String password, boolean forceLogin) {
- this.player = player;
- this.password = password;
- name = player.getName().toLowerCase();
- realName = player.getName();
- this.forceLogin = forceLogin;
- }
-
- protected String getIP() {
- String ip = player.getAddress().getAddress().getHostAddress();
- if (Settings.bungee) {
- if (plugin.realIp.containsKey(name))
- ip = plugin.realIp.get(name);
- }
- return ip;
- }
- protected boolean needsCaptcha() {
- 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) {
- plugin.cap.put(name, rdm.nextString());
- for (String s : m._("need_captcha")) {
- player.sendMessage(s.replace("THE_CAPTCHA", plugin.cap.get(name)).replace("", plugin.cap.get(name)));
- }
- return true;
- } else if (plugin.captcha.containsKey(name) && plugin.captcha.get(name) >= Settings.maxLoginTry) {
- try {
- plugin.captcha.remove(name);
- plugin.cap.remove(name);
- } catch (NullPointerException npe) {
- }
- }
- }
- return false;
- }
-
- /**
- * Checks the precondition for authentication (like user known) and returns the playerAuth-State
- */
- protected PlayerAuth preAuth() {
- if (PlayerCache.getInstance().isAuthenticated(name)) {
- m._(player, "logged_in");
- return null;
- }
- if (!database.isAuthAvailable(name)) {
- m._(player, "user_unknown");
- return null;
- }
- PlayerAuth pAuth = database.getAuth(name);
- if (pAuth == null) {
- m._(player, "user_unknown");
- return null;
- }
- if (!Settings.getMySQLColumnGroup.isEmpty() && pAuth.getGroupId() == Settings.getNonActivatedGroup) {
- m._(player, "vb_nonActiv");
- return null;
- }
- return pAuth;
- }
-
- protected void process() {
- PlayerAuth pAuth = preAuth();
- if (pAuth == null || needsCaptcha())
- return;
-
- String hash = pAuth.getHash();
- String email = pAuth.getEmail();
- boolean passwordVerified = true;
- if (!forceLogin)
- try {
- passwordVerified = PasswordSecurity.comparePasswordWithHash(password, hash, name);
- } catch (Exception ex) {
- ConsoleLogger.showError(ex.getMessage());
- m._(player, "error");
- return;
- }
- if (passwordVerified && player.isOnline()) {
- PlayerAuth auth = new PlayerAuth(name, hash, getIP(), new Date().getTime(), email, realName);
- database.updateSession(auth);
-
- pllog.addPlayer(player);
-
- if (Settings.useCaptcha) {
- if (plugin.captcha.containsKey(name)) {
- plugin.captcha.remove(name);
- }
- if (plugin.cap.containsKey(name)) {
- plugin.cap.remove(name);
- }
- }
-
- player.setNoDamageTicks(0);
- m._(player, "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!"));
- }
-
- // makes player isLoggedin via API
- PlayerCache.getInstance().addPlayer(auth);
-
- // As the scheduling executes the Task most likely after the current task, we schedule it in the end
- // so that we can be sure, and have not to care if it might be processed in other order.
- ProcessSyncronousPlayerLogin syncronousPlayerLogin = new ProcessSyncronousPlayerLogin(player);
- if (syncronousPlayerLogin.getLimbo() != null) {
- player.getServer().getScheduler().cancelTask(syncronousPlayerLogin.getLimbo().getTimeoutTaskId());
- player.getServer().getScheduler().cancelTask(syncronousPlayerLogin.getLimbo().getMessageTaskId());
- }
- Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, syncronousPlayerLogin);
- } else if (player.isOnline()) {
- if (!Settings.noConsoleSpam)
- ConsoleLogger.info(player.getName() + " used the wrong password");
- if (Settings.isKickOnWrongPasswordEnabled) {
- Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
- @Override
- public void run() {
- if (AuthMePlayerListener.gameMode != null && AuthMePlayerListener.gameMode.containsKey(name)) {
- player.setGameMode(AuthMePlayerListener.gameMode.get(name));
- }
- player.kickPlayer(m._("wrong_pwd")[0]);
- }
- });
- } else {
- m._(player, "wrong_pwd");
- return;
- }
- } else {
- ConsoleLogger.showError("Player " + name + " wasn't online during login process, aborted... ");
- }
- }
- }
-
- class AsyncronousPasspartuLogin extends AsyncronousLogin {
- public AsyncronousPasspartuLogin(Player player) {
- super(player, null, false);
- }
-
- public void pass() {
- PlayerAuth pAuth = preAuth();
- if (pAuth == null)
- return;
-
- String hash = pAuth.getHash();
- String email = pAuth.getEmail();
-
- PlayerAuth auth = new PlayerAuth(name, hash, getIP(), new Date().getTime(), email, realName);
- database.updateSession(auth);
-
- pllog.addPlayer(player);
-
- if (Settings.useCaptcha) {
- if (plugin.captcha.containsKey(name)) {
- plugin.captcha.remove(name);
- }
- if (plugin.cap.containsKey(name)) {
- plugin.cap.remove(name);
- }
- }
-
- player.setNoDamageTicks(0);
- m._(player, "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!"));
- }
-
- // makes player isLoggedin via API
- PlayerCache.getInstance().addPlayer(auth);
-
- // As the scheduling executes the Task most likely after the current task, we schedule it in the end
- // so that we can be sure, and have not to care if it might be processed in other order.
- ProcessSyncronousPlayerLogin syncronousPlayerLogin = new ProcessSyncronousPlayerLogin(player);
- if (syncronousPlayerLogin.getLimbo() != null) {
- player.getServer().getScheduler().cancelTask(syncronousPlayerLogin.getLimbo().getTimeoutTaskId());
- player.getServer().getScheduler().cancelTask(syncronousPlayerLogin.getLimbo().getMessageTaskId());
- }
- Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, syncronousPlayerLogin);
- }
- }
-
- class ProcessSyncronousPlayerLogin implements Runnable {
- private LimboPlayer limbo;
- private Player player;
- private String name;
- private PlayerAuth auth;
- public ProcessSyncronousPlayerLogin(Player player) {
- this.player = player;
- this.name = player.getName().toLowerCase();
- this.limbo = LimboCache.getInstance().getLimboPlayer(name);
- this.auth = database.getAuth(name);
- }
-
- public LimboPlayer getLimbo() {
- return limbo;
- }
-
- protected void restoreOpState() {
- player.setOp(limbo.getOperator());
- if (player.getGameMode() != GameMode.CREATIVE && !Settings.isMovementAllowed) {
- player.setAllowFlight(limbo.isFlying());
- player.setFlying(limbo.isFlying());
- }
- }
- protected void packQuitLocation() {
- utils.packCoords(auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ(), auth.getWorld(), player);
- }
- protected void teleportBackFromSpawn() {
- AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, limbo.getLoc());
- pm.callEvent(tpEvent);
- if (!tpEvent.isCancelled()) {
- Location fLoc = tpEvent.getTo();
- if (!fLoc.getChunk().isLoaded()) {
- fLoc.getChunk().load();
- }
- player.teleport(fLoc);
- }
- }
- protected void teleportToSpawn() {
- Location spawnL = plugin.getSpawnLocation(player.getWorld());
- 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);
- }
- }
- protected void restoreInventory() {
- RestoreInventoryEvent event = new RestoreInventoryEvent(player, limbo.getInventory(), limbo.getArmour());
- Bukkit.getServer().getPluginManager().callEvent(event);
- if (!event.isCancelled()) {
- API.setPlayerInventory(player, event.getInventory(), event.getArmor());
- }
- }
- protected void forceCommands() {
- for (String command : Settings.forceCommands) {
- try {
- player.performCommand(command.replace("%p", player.getName()));
- } catch (Exception e) {}
- }
- }
-
- @Override
- public void run() {
- // Limbo contains the State of the Player before /login
- if (limbo != null) {
- // Op & Flying
- restoreOpState();
-
- /*
- * Restore Inventories and GameMode
- * We need to restore them before teleport the player
- * Cause in AuthMePlayerListener, we call ProtectInventoryEvent after Teleporting
- * Also it's the current world inventory !
- */
- if (!Settings.forceOnlyAfterLogin) {
- player.setGameMode(limbo.getGameMode());
- // Inventory - Make it after restore GameMode , cause we need to restore the
- // right inventory in the right gamemode
- if (Settings.protectInventoryBeforeLogInEnabled && player.hasPlayedBefore()) {
- restoreInventory();
- }
- }
- else {
- // Inventory - Make it before force the survival GameMode to cancel all
- // inventory problem
- if (Settings.protectInventoryBeforeLogInEnabled && player.hasPlayedBefore()) {
- restoreInventory();
- }
- player.setGameMode(GameMode.SURVIVAL);
- }
-
- // Teleport the player
- if(Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName())) {
- // If we have force the spawn location on join
- teleportToSpawn();
- } else {
- if (Settings.isTeleportToSpawnEnabled) {
- // If and only if teleport unauthed to spawn is activate
- teleportBackFromSpawn();
- } else {
- if (Settings.isSaveQuitLocationEnabled && auth.getQuitLocY() != 0) {
- // Teleport the player on the saved location
- packQuitLocation();
- } else {
- // Do not move the player from his position
- }
- }
- }
- // Teleport
- if (Settings.isTeleportToSpawnEnabled && !Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName())) {
- if (Settings.isSaveQuitLocationEnabled && auth.getQuitLocY() != 0) {
- packQuitLocation();
- } else {
- teleportBackFromSpawn();
- }
- } else if (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName())) {
- teleportToSpawn();
- } else if (Settings.isSaveQuitLocationEnabled && auth.getQuitLocY() != 0) {
- packQuitLocation();
- } else {
- teleportBackFromSpawn();
- }
-
- // Re-Force Survival GameMode if we need due to world change specification
- if (Settings.isForceSurvivalModeEnabled)
- Utils.forceGM(player);
-
- // Restore Permission Group
- utils.setGroup(player, groupType.LOGGEDIN);
-
- // Cleanup no longer used temporary data
- LimboCache.getInstance().deleteLimboPlayer(name);
- if (playerCache.doesCacheExist(name)) {
- playerCache.removeCache(name);
- }
- }
-
- // We can now display the join message
- if (AuthMePlayerListener.joinMessage.containsKey(name) && AuthMePlayerListener.joinMessage.get(name) != null && !AuthMePlayerListener.joinMessage.get(name).isEmpty()) {
- for (Player p : Bukkit.getServer().getOnlinePlayers()) {
- if (p.isOnline())
- p.sendMessage(AuthMePlayerListener.joinMessage.get(name));
- }
- AuthMePlayerListener.joinMessage.remove(name);
- }
-
- // The Loginevent now fires (as intended) after everything is processed
- Bukkit.getServer().getPluginManager().callEvent(new LoginEvent(player, true));
- player.saveData();
-
- // Login is finish, display welcome message
- if(Settings.useWelcomeMessage)
- if(Settings.broadcastWelcomeMessage) {
- for (String s : Settings.welcomeMsg) {
- Bukkit.getServer().broadcastMessage(s);
- }
- } else {
- for (String s : Settings.welcomeMsg) {
- player.sendMessage(plugin.replaceAllInfos(s, player));
- }
- }
-
- // Login is now finish , we can force all commands
- forceCommands();
- }
- }
-
- 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/fr/xephi/authme/Utils.java b/src/main/java/fr/xephi/authme/Utils.java
index 19fbe909..bb27414f 100644
--- a/src/main/java/fr/xephi/authme/Utils.java
+++ b/src/main/java/fr/xephi/authme/Utils.java
@@ -35,7 +35,13 @@ public class Utils {
return;
if(plugin.permission == null)
return;
- currentGroup = plugin.permission.getPrimaryGroup(player);
+ try {
+ currentGroup = plugin.permission.getPrimaryGroup(player);
+ } catch (UnsupportedOperationException e) {
+ ConsoleLogger.showError("Your permission system (" + plugin.permission.getName() + ") do not support Group system with that config... unhook!");
+ plugin.permission = null;
+ return;
+ }
World world = null;
String name = player.getName();
switch(group) {
@@ -69,14 +75,20 @@ public class Utils {
}
public boolean addNormal(Player player, String group) {
- if(!Utils.getInstance().useGroupSystem()){
+ if(!useGroupSystem()){
return false;
}
if(plugin.permission == null) return false;
World world = null;
- if(plugin.permission.playerRemoveGroup(world,player.getName().toString(),Settings.getUnloggedinGroup) && plugin.permission.playerAddGroup(world,player.getName().toString(),group)) {
- return true;
- }
+ try {
+ if(plugin.permission.playerRemoveGroup(world,player.getName().toString(),Settings.getUnloggedinGroup) && plugin.permission.playerAddGroup(world,player.getName().toString(),group)) {
+ return true;
+ }
+ } catch (UnsupportedOperationException e) {
+ ConsoleLogger.showError("Your permission system (" + plugin.permission.getName() + ") do not support Group system with that config... unhook!");
+ plugin.permission = null;
+ return false;
+ }
return false;
}
diff --git a/src/main/java/fr/xephi/authme/api/API.java b/src/main/java/fr/xephi/authme/api/API.java
index 3bdeff73..ccc7179f 100644
--- a/src/main/java/fr/xephi/authme/api/API.java
+++ b/src/main/java/fr/xephi/authme/api/API.java
@@ -174,6 +174,6 @@ public class API {
* @param Player player
*/
public static void forceLogin(Player player) {
- instance.management.performLogin(player, "dontneed", false, true);
+ instance.management.performLogin(player, "dontneed", true);
}
}
diff --git a/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java b/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java
index 64139648..657b3582 100644
--- a/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java
+++ b/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java
@@ -15,7 +15,7 @@ public class PlayerAuth {
private String world = "world";
private String salt = "";
private String vBhash = null;
- private int groupId;
+ private int groupId = -1;
private String email = "your@email.com";
private String realName = "";
diff --git a/src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java b/src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java
index fe484143..926d6d13 100644
--- a/src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java
+++ b/src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java
@@ -9,6 +9,7 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import fr.xephi.authme.AuthMe;
+import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.cache.backup.FileCache;
import fr.xephi.authme.events.ResetInventoryEvent;
import fr.xephi.authme.events.StoreInventoryEvent;
@@ -66,8 +67,14 @@ public class LimboCache {
if(player.isFlying())
flying = true;
else flying = false;
- if (plugin.permission != null)
- playerGroup = plugin.permission.getPrimaryGroup(player);
+ if (plugin.permission != null) {
+ try {
+ playerGroup = plugin.permission.getPrimaryGroup(player);
+ } catch (UnsupportedOperationException e) {
+ ConsoleLogger.showError("Your permission system (" + plugin.permission.getName() + ") do not support Group system with that config... unhook!");
+ plugin.permission = null;
+ }
+ }
}
if(Settings.isForceSurvivalModeEnabled) {
diff --git a/src/main/java/fr/xephi/authme/cache/limbo/LimboPlayer.java b/src/main/java/fr/xephi/authme/cache/limbo/LimboPlayer.java
index 2542a7cf..4910533a 100644
--- a/src/main/java/fr/xephi/authme/cache/limbo/LimboPlayer.java
+++ b/src/main/java/fr/xephi/authme/cache/limbo/LimboPlayer.java
@@ -14,7 +14,7 @@ public class LimboPlayer {
private int messageTaskId = -1;
private GameMode gameMode = GameMode.SURVIVAL;
private boolean operator = false;
- private String group = null;
+ private String group = "";
private boolean flying = false;
public LimboPlayer(String name, Location loc, ItemStack[] inventory, ItemStack[] armour, GameMode gameMode, boolean operator, String group, boolean flying) {
diff --git a/src/main/java/fr/xephi/authme/commands/LoginCommand.java b/src/main/java/fr/xephi/authme/commands/LoginCommand.java
index bff292f2..fdfa5f86 100644
--- a/src/main/java/fr/xephi/authme/commands/LoginCommand.java
+++ b/src/main/java/fr/xephi/authme/commands/LoginCommand.java
@@ -35,7 +35,7 @@ public class LoginCommand implements CommandExecutor {
m._(player, "no_perm");
return true;
}
- plugin.management.performLogin(player, args[0], false, false);
+ plugin.management.performLogin(player, args[0], false);
return true;
}
}
diff --git a/src/main/java/fr/xephi/authme/commands/PasspartuCommand.java b/src/main/java/fr/xephi/authme/commands/PasspartuCommand.java
index dbbbdd84..a434ca1a 100644
--- a/src/main/java/fr/xephi/authme/commands/PasspartuCommand.java
+++ b/src/main/java/fr/xephi/authme/commands/PasspartuCommand.java
@@ -39,7 +39,7 @@ public class PasspartuCommand implements CommandExecutor {
if ((sender instanceof Player) && args.length == 1) {
if(utils.readToken(args[0])) {
//bypass login!
- plugin.management.performLogin((Player) sender, "dontneed", true, false);
+ plugin.management.performLogin((Player) sender, "dontneed", true);
return true;
}
sender.sendMessage("Time is expired or Token is Wrong!");
diff --git a/src/main/java/fr/xephi/authme/commands/RegisterCommand.java b/src/main/java/fr/xephi/authme/commands/RegisterCommand.java
index 0366ef81..70a150c5 100644
--- a/src/main/java/fr/xephi/authme/commands/RegisterCommand.java
+++ b/src/main/java/fr/xephi/authme/commands/RegisterCommand.java
@@ -1,297 +1,69 @@
package fr.xephi.authme.commands;
-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.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import fr.xephi.authme.AuthMe;
-import fr.xephi.authme.ConsoleLogger;
-import fr.xephi.authme.Utils;
import fr.xephi.authme.cache.auth.PlayerAuth;
-import fr.xephi.authme.cache.auth.PlayerCache;
-import fr.xephi.authme.cache.limbo.LimboCache;
-import fr.xephi.authme.cache.limbo.LimboPlayer;
-import fr.xephi.authme.datasource.DataSource;
-import fr.xephi.authme.events.LoginEvent;
-import fr.xephi.authme.events.RegisterTeleportEvent;
-import fr.xephi.authme.security.PasswordSecurity;
import fr.xephi.authme.security.RandomString;
import fr.xephi.authme.settings.Messages;
-import fr.xephi.authme.settings.PlayersLogs;
import fr.xephi.authme.settings.Settings;
-import fr.xephi.authme.task.MessageTask;
-import fr.xephi.authme.task.TimeoutTask;
public class RegisterCommand implements CommandExecutor {
private Messages m = Messages.getInstance();
- private PlayersLogs pllog = PlayersLogs.getInstance();
- private DataSource database;
public PlayerAuth auth;
public AuthMe plugin;
- public RegisterCommand(DataSource database, AuthMe plugin) {
- this.database = database;
+ public RegisterCommand(AuthMe plugin) {
this.plugin = plugin;
}
@Override
public boolean onCommand(CommandSender sender, Command cmnd, String label, String[] args) {
if (!(sender instanceof Player)) {
- return true;
+ sender.sendMessage("Player Only! Use 'authme register ' instead");
+ return true;
}
-
if (!plugin.authmePermissible(sender, "authme." + label.toLowerCase())) {
m._(sender, "no_perm");
return true;
}
-
final Player player = (Player) sender;
- final String name = player.getName().toLowerCase();
- String ipA = player.getAddress().getAddress().getHostAddress();
-
- if (Settings.bungee) {
- if (plugin.realIp.containsKey(name))
- ipA = plugin.realIp.get(name);
- }
-
- final String ip = ipA;
-
- if (PlayerCache.getInstance().isAuthenticated(name)) {
- m._(player, "logged_in");
- return true;
- }
-
- if (!Settings.isRegistrationEnabled) {
- m._(player, "reg_disabled");
- return true;
- }
-
- if (database.isAuthAvailable(player.getName().toLowerCase())) {
- m._(player, "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) {
- m._(player, "max_reg");
- return true;
- }
- }
-
- if(Settings.emailRegistration && !Settings.getmailAccount.isEmpty()) {
- if(!args[0].contains("@")) {
+ if(Settings.emailRegistration && !Settings.getmailAccount.isEmpty()) {
+ if(Settings.doubleEmailCheck) {
+ if(args.length < 2) {
m._(player, "usage_reg");
return true;
- }
- if(Settings.doubleEmailCheck) {
- if(args.length < 2) {
- m._(player, "usage_reg");
- return true;
- }
- if(!args[0].equals(args[1])) {
- m._(player, "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) {
- m._(player, "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, player.getName());
- 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, player.getName());
- 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);
- }
- m._(player, "vb_nonActiv");
- int time = Settings.getRegistrationTimeout * 20;
- int msgInterval = Settings.getWarnMessageInterval;
- if (time != 0) {
- Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getTimeoutTaskId());
- int id = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new TimeoutTask(plugin, name), time);
- LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id);
- }
-
- Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getMessageTaskId());
- int nwMsg = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new MessageTask(plugin, name, m._("login_msg"), msgInterval));
- LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(nwMsg);
-
- if (Settings.isTeleportToSpawnEnabled) {
- World world = player.getWorld();
- Location loca = plugin.getSpawnLocation(world);
- 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());
- }
- }
- if (player.getGameMode() != GameMode.CREATIVE && !Settings.isMovementAllowed) {
- player.setAllowFlight(false);
- player.setFlying(false);
- }
- 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 by email!"));
- }
- return true;
- }
- }
-
- if (args.length == 0 || (Settings.getEnablePasswordVerifier && args.length < 2) ) {
+ }
+ if(!args[0].equals(args[1])) {
+ m._(player, "usage_reg");
+ return true;
+ }
+ }
+ if(!args[0].contains("@")) {
m._(player, "usage_reg");
return true;
- }
-
- if(args[0].length() < Settings.getPasswordMinLen || args[0].length() > Settings.passwordMaxLength) {
- m._(player, "pass_len");
- return true;
- }
- if(!Settings.unsafePasswords.isEmpty()) {
- if (Settings.unsafePasswords.contains(args[0].toLowerCase())) {
- m._(player, "password_error");
- return true;
- }
-
- }
- try {
- String hash;
- if(Settings.getEnablePasswordVerifier) {
- if (args[0].equals(args[1])) {
- hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name);
- } else {
- m._(player, "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(), "your@email.com", player.getName());
- } else {
- auth = new PlayerAuth(name, hash, PasswordSecurity.userSalt.get(name), ip, new Date().getTime(), player.getName());
- }
- if (!database.saveAuth(auth)) {
- m._(player, "error");
- return true;
- }
- PlayerCache.getInstance().addPlayer(auth);
- LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name);
- if (limbo != null) {
- player.setGameMode(limbo.getGameMode());
- if (Settings.isTeleportToSpawnEnabled) {
- World world = player.getWorld();
- Location loca = plugin.getSpawnLocation(world);
- 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);
- }
- m._(player, "registered");
- if (!Settings.getmailAccount.isEmpty())
- m._(player, "add_email");
- if (player.getGameMode() != GameMode.CREATIVE && !Settings.isMovementAllowed) {
- player.setAllowFlight(false);
- player.setFlying(false);
- }
- // The Loginevent now fires (as intended) after everything is processed
- Bukkit.getServer().getPluginManager().callEvent(new LoginEvent(player, true));
- player.saveData();
-
- // Register is finish and player is logged, display welcome message
- if(Settings.useWelcomeMessage)
- if(Settings.broadcastWelcomeMessage) {
- for (String s : Settings.welcomeMsg) {
- Bukkit.getServer().broadcastMessage(s);
- }
- } else {
- for (String s : Settings.welcomeMsg) {
- player.sendMessage(plugin.replaceAllInfos(s, player));
- }
- }
-
- // Register is now finish , we can force all commands
- forceCommands(player);
- 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());
- m._(sender, "error");
- }
+ }
+ final String email = args[0];
+ RandomString rand = new RandomString(Settings.getRecoveryPassLength);
+ final String thePass = rand.nextString();
+ plugin.management.performRegister(player, thePass, email);
+ return true;
+ }
+ if (args.length == 0 || (Settings.getEnablePasswordVerifier && args.length < 2)) {
+ m._(player, "usage_reg");
+ return true;
+ }
+ if (args.length > 1 && Settings.getEnablePasswordVerifier)
+ if(!args[0].equals(args[1])) {
+ m._(player, "password_error");
+ return true;
+ }
+ plugin.management.performRegister(player, args[0], "");
return true;
}
-
- protected void forceCommands(Player player) {
- for (String command : Settings.forceCommands) {
- try {
- player.performCommand(command.replace("%p", player.getName()));
- } catch (Exception e) {}
- }
- }
}
diff --git a/src/main/java/fr/xephi/authme/commands/UnregisterCommand.java b/src/main/java/fr/xephi/authme/commands/UnregisterCommand.java
index e5ab602d..146fc04b 100644
--- a/src/main/java/fr/xephi/authme/commands/UnregisterCommand.java
+++ b/src/main/java/fr/xephi/authme/commands/UnregisterCommand.java
@@ -72,9 +72,9 @@ public class UnregisterCommand implements CommandExecutor {
return true;
}
if(Settings.isForcedRegistrationEnabled) {
- player.getInventory().setArmorContents(new ItemStack[4]);
- player.getInventory().setContents(new ItemStack[36]);
- player.saveData();
+ player.getInventory().setContents(new ItemStack[36]);
+ player.getInventory().setArmorContents(new ItemStack[4]);
+ player.saveData();
PlayerCache.getInstance().removePlayer(player.getName().toLowerCase());
LimboCache.getInstance().addLimboPlayer(player);
Utils.getInstance().setGroup(player, groupType.UNREGISTERED);
@@ -85,11 +85,11 @@ public class UnregisterCommand implements CommandExecutor {
int id = sched.scheduleSyncDelayedTask(plugin, new TimeoutTask(plugin, name), delay);
LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id);
}
- sched.scheduleSyncDelayedTask(plugin, new MessageTask(plugin, name, m._("reg_msg"), interval));
+ LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(sched.scheduleSyncDelayedTask(plugin, new MessageTask(plugin, name, m._("reg_msg"), interval)));
if(!Settings.unRegisteredGroup.isEmpty()){
Utils.getInstance().setGroup(player, Utils.groupType.UNREGISTERED);
}
- player.sendMessage("unregistered");
+ m._(player, "unregistered");
ConsoleLogger.info(player.getDisplayName() + " unregistered himself");
if(plugin.notifications != null) {
plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " unregistered himself!"));
@@ -108,7 +108,7 @@ public class UnregisterCommand implements CommandExecutor {
PlayersLogs.players.remove(player.getName());
pllog.save();
}
- player.sendMessage("unregistered");
+ m._(player, "unregistered");
ConsoleLogger.info(player.getDisplayName() + " unregistered himself");
if(plugin.notifications != null) {
plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " unregistered himself!"));
diff --git a/src/main/java/fr/xephi/authme/gui/screens/LoginScreen.java b/src/main/java/fr/xephi/authme/gui/screens/LoginScreen.java
index 4a4986c7..c5758890 100644
--- a/src/main/java/fr/xephi/authme/gui/screens/LoginScreen.java
+++ b/src/main/java/fr/xephi/authme/gui/screens/LoginScreen.java
@@ -117,7 +117,7 @@ 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(), false, false);
+ plugin.management.performLogin(player, passBox.getText(), false);
}else if(b.equals(exitBtn))
{
event.getPlayer().kickPlayer(exitMsg);
diff --git a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java
index ae44ae69..aed8036c 100644
--- a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java
+++ b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java
@@ -588,7 +588,7 @@ public class AuthMePlayerListener implements Listener {
PlayerCache.getInstance().addPlayer(auth);
}
m._(player, "valid_session");
- return;
+ return;
} else if (!Settings.sessionExpireOnIpChange){
GameMode gM = gameMode.get(name);
this.causeByAuthMe = true;
@@ -615,7 +615,7 @@ public class AuthMePlayerListener implements Listener {
} else {
//Session is ended correctly
PlayerCache.getInstance().removePlayer(name);
- }
+ }
}
// isent in session or session was ended correctly
if (Settings.isForceSurvivalModeEnabled && !Settings.forceOnlyAfterLogin) {
@@ -698,8 +698,10 @@ public class AuthMePlayerListener implements Listener {
player.performCommand("motd");
// Remove the join message while the player isn't logging in
- joinMessage.put(name, event.getJoinMessage());
- event.setJoinMessage(null);
+ if (Settings.enableProtection) {
+ joinMessage.put(name, event.getJoinMessage());
+ event.setJoinMessage(null);
+ }
}
private void placePlayerSafely(Player player, Location spawnLoc) {
@@ -736,7 +738,7 @@ public class AuthMePlayerListener implements Listener {
}
}
- if (data.getAuth(name) != null && !PlayerCache.getInstance().isAuthenticated(name))
+ if (data.getAuth(name) != null && !PlayerCache.getInstance().isAuthenticated(name) && Settings.enableProtection)
event.setQuitMessage(null);
if (LimboCache.getInstance().hasLimboPlayer(name)) {
@@ -755,6 +757,7 @@ public class AuthMePlayerListener implements Listener {
player.setFlying(limbo.isFlying());
}
this.plugin.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId());
+ this.plugin.getServer().getScheduler().cancelTask(limbo.getMessageTaskId());
LimboCache.getInstance().deleteLimboPlayer(name);
if(playerBackup.doesCacheExist(name)) {
playerBackup.removeCache(name);
@@ -802,7 +805,7 @@ public class AuthMePlayerListener implements Listener {
} catch (NullPointerException npe) { }
}
- if (data.getAuth(name) != null && !PlayerCache.getInstance().isAuthenticated(name))
+ if (data.getAuth(name) != null && !PlayerCache.getInstance().isAuthenticated(name) && Settings.enableProtection)
event.setLeaveMessage(null);
if (LimboCache.getInstance().hasLimboPlayer(name))
@@ -837,6 +840,7 @@ public class AuthMePlayerListener implements Listener {
player.setFlying(limbo.isFlying());
}
this.plugin.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId());
+ this.plugin.getServer().getScheduler().cancelTask(limbo.getMessageTaskId());
LimboCache.getInstance().deleteLimboPlayer(name);
if (this.playerBackup.doesCacheExist(name)) {
this.playerBackup.removeCache(name);
diff --git a/src/main/java/fr/xephi/authme/process/Management.java b/src/main/java/fr/xephi/authme/process/Management.java
new file mode 100644
index 00000000..5f463908
--- /dev/null
+++ b/src/main/java/fr/xephi/authme/process/Management.java
@@ -0,0 +1,40 @@
+package fr.xephi.authme.process;
+
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.PluginManager;
+
+import fr.xephi.authme.AuthMe;
+import fr.xephi.authme.datasource.DataSource;
+import fr.xephi.authme.process.login.AsyncronousLogin;
+import fr.xephi.authme.process.register.AsyncronousRegister;
+import fr.xephi.authme.security.RandomString;
+import fr.xephi.authme.settings.Settings;
+
+/**
+ *
+ * @authors Xephi59, Possible
+ *
+ */
+public class Management extends Thread {
+ public 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 void run() {
+ }
+
+ public void performLogin(final Player player, final String password, final boolean forceLogin) {
+ new AsyncronousLogin(player, password, forceLogin, plugin, database).process();
+ }
+
+ public void performRegister(final Player player, final String password, final String email) {
+ new AsyncronousRegister(player, password, email, plugin, database).process();
+ }
+}
diff --git a/src/main/java/fr/xephi/authme/process/login/AsyncronousLogin.java b/src/main/java/fr/xephi/authme/process/login/AsyncronousLogin.java
new file mode 100644
index 00000000..d41d6600
--- /dev/null
+++ b/src/main/java/fr/xephi/authme/process/login/AsyncronousLogin.java
@@ -0,0 +1,223 @@
+package fr.xephi.authme.process.login;
+
+import java.util.Date;
+import java.util.List;
+
+import me.muizers.Notifications.Notification;
+
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Player;
+
+import fr.xephi.authme.AuthMe;
+import fr.xephi.authme.ConsoleLogger;
+import fr.xephi.authme.cache.auth.PlayerAuth;
+import fr.xephi.authme.cache.auth.PlayerCache;
+import fr.xephi.authme.cache.limbo.LimboCache;
+import fr.xephi.authme.datasource.DataSource;
+import fr.xephi.authme.listener.AuthMePlayerListener;
+import fr.xephi.authme.security.PasswordSecurity;
+import fr.xephi.authme.security.RandomString;
+import fr.xephi.authme.settings.Messages;
+import fr.xephi.authme.settings.Settings;
+import fr.xephi.authme.task.MessageTask;
+
+public class AsyncronousLogin {
+ protected Player player;
+ protected String name;
+ protected String password;
+ protected String realName;
+ protected boolean forceLogin;
+ private AuthMe plugin;
+ private DataSource database;
+ private static RandomString rdm = new RandomString(Settings.captchaLength);
+ private Messages m = Messages.getInstance();
+
+ public AsyncronousLogin(Player player, String password, boolean forceLogin, AuthMe plugin, DataSource data) {
+ this.player = player;
+ this.password = password;
+ name = player.getName().toLowerCase();
+ realName = player.getName();
+ this.forceLogin = forceLogin;
+ this.plugin = plugin;
+ this.database = data;
+ }
+
+ protected String getIP() {
+ String ip = player.getAddress().getAddress().getHostAddress();
+ if (Settings.bungee) {
+ if (plugin.realIp.containsKey(name))
+ ip = plugin.realIp.get(name);
+ }
+ return ip;
+ }
+ protected boolean needsCaptcha() {
+ 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) {
+ plugin.cap.put(name, rdm.nextString());
+ for (String s : m._("need_captcha")) {
+ player.sendMessage(s.replace("THE_CAPTCHA", plugin.cap.get(name)).replace("", plugin.cap.get(name)));
+ }
+ return true;
+ } else if (plugin.captcha.containsKey(name) && plugin.captcha.get(name) >= Settings.maxLoginTry) {
+ try {
+ plugin.captcha.remove(name);
+ plugin.cap.remove(name);
+ } catch (NullPointerException npe) {
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Checks the precondition for authentication (like user known) and returns the playerAuth-State
+ */
+ protected PlayerAuth preAuth() {
+ if (PlayerCache.getInstance().isAuthenticated(name)) {
+ m._(player, "logged_in");
+ return null;
+ }
+ if (!database.isAuthAvailable(name)) {
+ m._(player, "user_unknown");
+ if(LimboCache.getInstance().hasLimboPlayer(name)) {
+ Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getMessageTaskId());
+ String[] msg;
+ if(Settings.emailRegistration) {
+ msg = m._("reg_email_msg");
+ } else {
+ msg = m._("reg_msg");
+ }
+ int msgT = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new MessageTask(plugin, name, msg, Settings.getWarnMessageInterval));
+ LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(msgT);
+ }
+ return null;
+ }
+ PlayerAuth pAuth = database.getAuth(name);
+ if (pAuth == null) {
+ m._(player, "user_unknown");
+ return null;
+ }
+ if (!Settings.getMySQLColumnGroup.isEmpty() && pAuth.getGroupId() == Settings.getNonActivatedGroup) {
+ m._(player, "vb_nonActiv");
+ return null;
+ }
+ return pAuth;
+ }
+
+ public void process() {
+ PlayerAuth pAuth = preAuth();
+ if (pAuth == null || needsCaptcha())
+ return;
+
+ String hash = pAuth.getHash();
+ String email = pAuth.getEmail();
+ boolean passwordVerified = true;
+ if (!forceLogin)
+ try {
+ passwordVerified = PasswordSecurity.comparePasswordWithHash(password, hash, name);
+ } catch (Exception ex) {
+ ConsoleLogger.showError(ex.getMessage());
+ m._(player, "error");
+ return;
+ }
+ if (passwordVerified && player.isOnline()) {
+ PlayerAuth auth = new PlayerAuth(name, hash, getIP(), new Date().getTime(), email, realName);
+ database.updateSession(auth);
+
+ plugin.pllog.addPlayer(player);
+
+ if (Settings.useCaptcha) {
+ if (plugin.captcha.containsKey(name)) {
+ plugin.captcha.remove(name);
+ }
+ if (plugin.cap.containsKey(name)) {
+ plugin.cap.remove(name);
+ }
+ }
+
+ player.setNoDamageTicks(0);
+ m._(player, "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!"));
+ }
+
+ // makes player isLoggedin via API
+ PlayerCache.getInstance().addPlayer(auth);
+
+ // As the scheduling executes the Task most likely after the current task, we schedule it in the end
+ // so that we can be sure, and have not to care if it might be processed in other order.
+ ProcessSyncronousPlayerLogin syncronousPlayerLogin = new ProcessSyncronousPlayerLogin(player, plugin, database);
+ if (syncronousPlayerLogin.getLimbo() != null) {
+ player.getServer().getScheduler().cancelTask(syncronousPlayerLogin.getLimbo().getTimeoutTaskId());
+ player.getServer().getScheduler().cancelTask(syncronousPlayerLogin.getLimbo().getMessageTaskId());
+ }
+ Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, syncronousPlayerLogin);
+ } else if (player.isOnline()) {
+ if (!Settings.noConsoleSpam)
+ ConsoleLogger.info(player.getName() + " used the wrong password");
+ if (Settings.isKickOnWrongPasswordEnabled) {
+ Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
+ @Override
+ public void run() {
+ if (AuthMePlayerListener.gameMode != null && AuthMePlayerListener.gameMode.containsKey(name)) {
+ player.setGameMode(AuthMePlayerListener.gameMode.get(name));
+ }
+ player.kickPlayer(m._("wrong_pwd")[0]);
+ }
+ });
+ } else {
+ m._(player, "wrong_pwd");
+ return;
+ }
+ } else {
+ ConsoleLogger.showError("Player " + name + " wasn't online during login process, aborted... ");
+ }
+ }
+
+ public 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 : plugin.getServer().getOnlinePlayers()) {
+ if (plugin.authmePermissible(player, "authme.seeOtherAccounts")) {
+ player.sendMessage("[AuthMe] The player " + auth.getNickname() + " has "
+ + accountList.size() + " accounts");
+ player.sendMessage(message);
+ }
+ }
+ }
+}
diff --git a/src/main/java/fr/xephi/authme/process/login/ProcessSyncronousPlayerLogin.java b/src/main/java/fr/xephi/authme/process/login/ProcessSyncronousPlayerLogin.java
new file mode 100644
index 00000000..14257771
--- /dev/null
+++ b/src/main/java/fr/xephi/authme/process/login/ProcessSyncronousPlayerLogin.java
@@ -0,0 +1,202 @@
+package fr.xephi.authme.process.login;
+
+import org.bukkit.Bukkit;
+import org.bukkit.GameMode;
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.PluginManager;
+
+import fr.xephi.authme.AuthMe;
+import fr.xephi.authme.Utils;
+import fr.xephi.authme.Utils.groupType;
+import fr.xephi.authme.api.API;
+import fr.xephi.authme.cache.auth.PlayerAuth;
+import fr.xephi.authme.cache.backup.FileCache;
+import fr.xephi.authme.cache.limbo.LimboCache;
+import fr.xephi.authme.cache.limbo.LimboPlayer;
+import fr.xephi.authme.datasource.DataSource;
+import fr.xephi.authme.events.AuthMeTeleportEvent;
+import fr.xephi.authme.events.LoginEvent;
+import fr.xephi.authme.events.RestoreInventoryEvent;
+import fr.xephi.authme.events.SpawnTeleportEvent;
+import fr.xephi.authme.listener.AuthMePlayerListener;
+import fr.xephi.authme.settings.Settings;
+
+public class ProcessSyncronousPlayerLogin implements Runnable {
+ private LimboPlayer limbo;
+ private Player player;
+ private String name;
+ private PlayerAuth auth;
+ private AuthMe plugin;
+ private DataSource database;
+ private PluginManager pm;
+ private FileCache playerCache = new FileCache();
+
+ public ProcessSyncronousPlayerLogin(Player player, AuthMe plugin, DataSource data) {
+ this.plugin = plugin;
+ this.database = data;
+ this.pm = plugin.getServer().getPluginManager();
+ this.player = player;
+ this.name = player.getName().toLowerCase();
+ this.limbo = LimboCache.getInstance().getLimboPlayer(name);
+ this.auth = database.getAuth(name);
+ }
+
+ public LimboPlayer getLimbo() {
+ return limbo;
+ }
+
+ protected void restoreOpState() {
+ player.setOp(limbo.getOperator());
+ if (player.getGameMode() != GameMode.CREATIVE && !Settings.isMovementAllowed) {
+ player.setAllowFlight(limbo.isFlying());
+ player.setFlying(limbo.isFlying());
+ }
+ }
+ protected void packQuitLocation() {
+ Utils.getInstance().packCoords(auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ(), auth.getWorld(), player);
+ }
+ protected void teleportBackFromSpawn() {
+ AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, limbo.getLoc());
+ pm.callEvent(tpEvent);
+ if (!tpEvent.isCancelled()) {
+ Location fLoc = tpEvent.getTo();
+ if (!fLoc.getChunk().isLoaded()) {
+ fLoc.getChunk().load();
+ }
+ player.teleport(fLoc);
+ }
+ }
+ protected void teleportToSpawn() {
+ Location spawnL = plugin.getSpawnLocation(player.getWorld());
+ 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);
+ }
+ }
+ protected void restoreInventory() {
+ RestoreInventoryEvent event = new RestoreInventoryEvent(player, limbo.getInventory(), limbo.getArmour());
+ Bukkit.getServer().getPluginManager().callEvent(event);
+ if (!event.isCancelled()) {
+ API.setPlayerInventory(player, event.getInventory(), event.getArmor());
+ }
+ }
+ protected void forceCommands() {
+ for (String command : Settings.forceCommands) {
+ try {
+ player.performCommand(command.replace("%p", player.getName()));
+ } catch (Exception e) {}
+ }
+ }
+
+ @Override
+ public void run() {
+ // Limbo contains the State of the Player before /login
+ if (limbo != null) {
+ // Op & Flying
+ restoreOpState();
+
+ /*
+ * Restore Inventories and GameMode
+ * We need to restore them before teleport the player
+ * Cause in AuthMePlayerListener, we call ProtectInventoryEvent after Teleporting
+ * Also it's the current world inventory !
+ */
+ if (!Settings.forceOnlyAfterLogin) {
+ player.setGameMode(limbo.getGameMode());
+ // Inventory - Make it after restore GameMode , cause we need to restore the
+ // right inventory in the right gamemode
+ if (Settings.protectInventoryBeforeLogInEnabled && player.hasPlayedBefore()) {
+ restoreInventory();
+ }
+ }
+ else {
+ // Inventory - Make it before force the survival GameMode to cancel all
+ // inventory problem
+ if (Settings.protectInventoryBeforeLogInEnabled && player.hasPlayedBefore()) {
+ restoreInventory();
+ }
+ player.setGameMode(GameMode.SURVIVAL);
+ }
+
+ // Teleport the player
+ if(Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName())) {
+ // If we have force the spawn location on join
+ teleportToSpawn();
+ } else {
+ if (Settings.isTeleportToSpawnEnabled) {
+ // If and only if teleport unauthed to spawn is activate
+ teleportBackFromSpawn();
+ } else {
+ if (Settings.isSaveQuitLocationEnabled && auth.getQuitLocY() != 0) {
+ // Teleport the player on the saved location
+ packQuitLocation();
+ } else {
+ // Do not move the player from his position
+ }
+ }
+ }
+ // Teleport
+ if (Settings.isTeleportToSpawnEnabled && !Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName())) {
+ if (Settings.isSaveQuitLocationEnabled && auth.getQuitLocY() != 0) {
+ packQuitLocation();
+ } else {
+ teleportBackFromSpawn();
+ }
+ } else if (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName())) {
+ teleportToSpawn();
+ } else if (Settings.isSaveQuitLocationEnabled && auth.getQuitLocY() != 0) {
+ packQuitLocation();
+ } else {
+ teleportBackFromSpawn();
+ }
+
+ // Re-Force Survival GameMode if we need due to world change specification
+ if (Settings.isForceSurvivalModeEnabled)
+ Utils.forceGM(player);
+
+ // Restore Permission Group
+ Utils.getInstance().setGroup(player, groupType.LOGGEDIN);
+
+ // Cleanup no longer used temporary data
+ LimboCache.getInstance().deleteLimboPlayer(name);
+ if (playerCache.doesCacheExist(name)) {
+ playerCache.removeCache(name);
+ }
+ }
+
+ // We can now display the join message
+ if (AuthMePlayerListener.joinMessage.containsKey(name) && AuthMePlayerListener.joinMessage.get(name) != null && !AuthMePlayerListener.joinMessage.get(name).isEmpty()) {
+ for (Player p : Bukkit.getServer().getOnlinePlayers()) {
+ if (p.isOnline())
+ p.sendMessage(AuthMePlayerListener.joinMessage.get(name));
+ }
+ AuthMePlayerListener.joinMessage.remove(name);
+ }
+
+ // The Loginevent now fires (as intended) after everything is processed
+ Bukkit.getServer().getPluginManager().callEvent(new LoginEvent(player, true));
+ player.saveData();
+
+ // Login is finish, display welcome message
+ if(Settings.useWelcomeMessage)
+ if(Settings.broadcastWelcomeMessage) {
+ for (String s : Settings.welcomeMsg) {
+ Bukkit.getServer().broadcastMessage(s);
+ }
+ } else {
+ for (String s : Settings.welcomeMsg) {
+ player.sendMessage(plugin.replaceAllInfos(s, player));
+ }
+ }
+
+ // Login is now finish , we can force all commands
+ forceCommands();
+ }
+
+}
diff --git a/src/main/java/fr/xephi/authme/process/register/AsyncronousRegister.java b/src/main/java/fr/xephi/authme/process/register/AsyncronousRegister.java
new file mode 100644
index 00000000..df0d23ad
--- /dev/null
+++ b/src/main/java/fr/xephi/authme/process/register/AsyncronousRegister.java
@@ -0,0 +1,149 @@
+package fr.xephi.authme.process.register;
+
+import java.security.NoSuchAlgorithmException;
+import java.util.Date;
+
+import org.bukkit.entity.Player;
+
+import fr.xephi.authme.AuthMe;
+import fr.xephi.authme.ConsoleLogger;
+import fr.xephi.authme.cache.auth.PlayerAuth;
+import fr.xephi.authme.cache.auth.PlayerCache;
+import fr.xephi.authme.datasource.DataSource;
+import fr.xephi.authme.security.PasswordSecurity;
+import fr.xephi.authme.settings.Messages;
+import fr.xephi.authme.settings.Settings;
+
+public class AsyncronousRegister {
+ protected Player player;
+ protected String name;
+ protected String password;
+ protected String realName;
+ protected String email = "";
+ protected boolean allowRegister;
+ private AuthMe plugin;
+ private DataSource database;
+ private Messages m = Messages.getInstance();
+
+ public AsyncronousRegister(Player player, String password, String email, AuthMe plugin, DataSource data) {
+ this.player = player;
+ this.password = password;
+ name = player.getName().toLowerCase();
+ realName = player.getName();
+ this.email = email;
+ this.plugin = plugin;
+ this.database = data;
+ this.allowRegister = true;
+ }
+
+ protected String getIp() {
+ String ip = player.getAddress().getAddress().getHostAddress();
+
+ if (Settings.bungee) {
+ if (plugin.realIp.containsKey(name))
+ ip = plugin.realIp.get(name);
+ }
+ return ip;
+ }
+
+ protected void preRegister() {
+ if (PlayerCache.getInstance().isAuthenticated(name)) {
+ m._(player, "logged_in");
+ allowRegister = false;
+ }
+
+ if (!Settings.isRegistrationEnabled) {
+ m._(player, "reg_disabled");
+ allowRegister = false;
+ }
+
+ if (database.isAuthAvailable(player.getName().toLowerCase())) {
+ m._(player, "user_regged");
+ if (plugin.pllog.getStringList("players").contains(player.getName())) {
+ plugin.pllog.getStringList("players").remove(player.getName());
+ }
+ allowRegister = false;
+ }
+
+ if(Settings.getmaxRegPerIp > 0 ){
+ if(!plugin.authmePermissible(player, "authme.allow2accounts") && database.getAllAuthsByIp(getIp()).size() >= Settings.getmaxRegPerIp) {
+ m._(player, "max_reg");
+ allowRegister = false;
+ }
+ }
+ }
+
+ public void process() {
+ preRegister();
+ if(!allowRegister) return;
+ if(!email.isEmpty() && email != "") {
+ emailRegister();
+ return;
+ }
+ passwordRegister();
+ }
+
+ protected void emailRegister() {
+ if(Settings.getmaxRegPerEmail > 0) {
+ if (!plugin.authmePermissible(player, "authme.allow2accounts") && database.getAllAuthsByEmail(email).size() >= Settings.getmaxRegPerEmail) {
+ m._(player, "max_reg");
+ return;
+ }
+ }
+ PlayerAuth auth = null;
+ try {
+ final String hashnew = PasswordSecurity.getHash(Settings.getPasswordHash, password, name);
+ auth = new PlayerAuth(name, hashnew, getIp(), new Date().getTime(), (int) player.getLocation().getX() , (int) player.getLocation().getY(), (int) player.getLocation().getZ(), player.getLocation().getWorld().getName(), email, realName);
+ } catch (NoSuchAlgorithmException e) {
+ ConsoleLogger.showError(e.getMessage());
+ m._(player, "error");
+ return;
+ }
+ if (PasswordSecurity.userSalt.containsKey(name)) {
+ auth.setSalt(PasswordSecurity.userSalt.get(name));
+ }
+ database.saveAuth(auth);
+ database.updateEmail(auth);
+ database.updateSession(auth);
+ plugin.mail.main(auth, password);
+ ProcessSyncronousEmailRegister syncronous = new ProcessSyncronousEmailRegister(player, plugin);
+ plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, syncronous);
+ return;
+ }
+
+ protected void passwordRegister() {
+ if(password.length() < Settings.getPasswordMinLen || password.length() > Settings.passwordMaxLength) {
+ m._(player, "pass_len");
+ return;
+ }
+ if(!Settings.unsafePasswords.isEmpty()) {
+ if (Settings.unsafePasswords.contains(password.toLowerCase())) {
+ m._(player, "password_error");
+ return;
+ }
+ }
+ PlayerAuth auth = null;
+ String hash = "";
+ try {
+ hash = PasswordSecurity.getHash(Settings.getPasswordHash, password, name);
+ } catch (NoSuchAlgorithmException e) {
+ ConsoleLogger.showError(e.getMessage());
+ m._(player, "error");
+ return;
+ }
+ if (Settings.getMySQLColumnSalt.isEmpty() && !PasswordSecurity.userSalt.containsKey(name))
+ {
+ auth = new PlayerAuth(name, hash, getIp(), new Date().getTime(), "your@email.com", player.getName());
+ } else {
+ auth = new PlayerAuth(name, hash, PasswordSecurity.userSalt.get(name), getIp(), new Date().getTime(), player.getName());
+ }
+ if (!database.saveAuth(auth)) {
+ m._(player, "error");
+ return;
+ }
+ PlayerCache.getInstance().addPlayer(auth);
+ ProcessSyncronousPasswordRegister syncronous = new ProcessSyncronousPasswordRegister(player, plugin);
+ plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, syncronous);
+ return;
+ }
+}
diff --git a/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousEmailRegister.java b/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousEmailRegister.java
new file mode 100644
index 00000000..f8b778b7
--- /dev/null
+++ b/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousEmailRegister.java
@@ -0,0 +1,74 @@
+package fr.xephi.authme.process.register;
+
+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 fr.xephi.authme.AuthMe;
+import fr.xephi.authme.ConsoleLogger;
+import fr.xephi.authme.Utils;
+import fr.xephi.authme.cache.limbo.LimboCache;
+import fr.xephi.authme.events.RegisterTeleportEvent;
+import fr.xephi.authme.settings.Messages;
+import fr.xephi.authme.settings.Settings;
+import fr.xephi.authme.task.MessageTask;
+import fr.xephi.authme.task.TimeoutTask;
+
+public class ProcessSyncronousEmailRegister implements Runnable {
+
+ protected Player player;
+ protected String name;
+ private AuthMe plugin;
+ private Messages m = Messages.getInstance();
+ public ProcessSyncronousEmailRegister(Player player, AuthMe plugin) {
+ this.player = player;
+ this.name = player.getName().toLowerCase();
+ this.plugin = plugin;
+ }
+ @Override
+ public void run() {
+ if(!Settings.getRegisteredGroup.isEmpty()){
+ Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED);
+ }
+ m._(player, "vb_nonActiv");
+ int time = Settings.getRegistrationTimeout * 20;
+ int msgInterval = Settings.getWarnMessageInterval;
+ if (time != 0) {
+ Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getTimeoutTaskId());
+ int id = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new TimeoutTask(plugin, name), time);
+ LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id);
+ }
+
+ Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getMessageTaskId());
+ int nwMsg = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new MessageTask(plugin, name, m._("login_msg"), msgInterval));
+ LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(nwMsg);
+
+ if (Settings.isTeleportToSpawnEnabled) {
+ World world = player.getWorld();
+ Location loca = plugin.getSpawnLocation(world);
+ 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());
+ }
+ }
+ if (player.getGameMode() != GameMode.CREATIVE && !Settings.isMovementAllowed) {
+ player.setAllowFlight(false);
+ player.setFlying(false);
+ }
+ 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 by email!"));
+ }
+ }
+
+}
diff --git a/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousPasswordRegister.java b/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousPasswordRegister.java
new file mode 100644
index 00000000..1482c968
--- /dev/null
+++ b/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousPasswordRegister.java
@@ -0,0 +1,97 @@
+package fr.xephi.authme.process.register;
+
+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 fr.xephi.authme.AuthMe;
+import fr.xephi.authme.ConsoleLogger;
+import fr.xephi.authme.Utils;
+import fr.xephi.authme.cache.limbo.LimboCache;
+import fr.xephi.authme.cache.limbo.LimboPlayer;
+import fr.xephi.authme.events.LoginEvent;
+import fr.xephi.authme.events.RegisterTeleportEvent;
+import fr.xephi.authme.settings.Messages;
+import fr.xephi.authme.settings.Settings;
+
+public class ProcessSyncronousPasswordRegister implements Runnable {
+
+ protected Player player;
+ protected String name;
+ private AuthMe plugin;
+ private Messages m = Messages.getInstance();
+ public ProcessSyncronousPasswordRegister(Player player, AuthMe plugin) {
+ this.player = player;
+ this.name = player.getName().toLowerCase();
+ this.plugin = plugin;
+ }
+
+ protected void forceCommands(Player player) {
+ for (String command : Settings.forceCommands) {
+ try {
+ player.performCommand(command.replace("%p", player.getName()));
+ } catch (Exception e) {}
+ }
+ }
+ @Override
+ public void run() {
+ LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name);
+ if (limbo != null) {
+ player.setGameMode(limbo.getGameMode());
+ if (Settings.isTeleportToSpawnEnabled) {
+ World world = player.getWorld();
+ Location loca = plugin.getSpawnLocation(world);
+ 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());
+ }
+ }
+ plugin.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId());
+ plugin.getServer().getScheduler().cancelTask(limbo.getMessageTaskId());
+ LimboCache.getInstance().deleteLimboPlayer(name);
+ }
+
+ if(!Settings.getRegisteredGroup.isEmpty()){
+ Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED);
+ }
+ m._(player, "registered");
+ if (!Settings.getmailAccount.isEmpty())
+ m._(player, "add_email");
+ if (player.getGameMode() != GameMode.CREATIVE && !Settings.isMovementAllowed) {
+ player.setAllowFlight(false);
+ player.setFlying(false);
+ }
+ // The Loginevent now fires (as intended) after everything is processed
+ Bukkit.getServer().getPluginManager().callEvent(new LoginEvent(player, true));
+ player.saveData();
+
+ // Register is finish and player is logged, display welcome message
+ if(Settings.useWelcomeMessage)
+ if(Settings.broadcastWelcomeMessage) {
+ for (String s : Settings.welcomeMsg) {
+ Bukkit.getServer().broadcastMessage(s);
+ }
+ } else {
+ for (String s : Settings.welcomeMsg) {
+ player.sendMessage(plugin.replaceAllInfos(s, player));
+ }
+ }
+
+ // Register is now finish , we can force all commands
+ forceCommands(player);
+ 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!"));
+ }
+ }
+
+}
diff --git a/src/main/java/fr/xephi/authme/settings/Settings.java b/src/main/java/fr/xephi/authme/settings/Settings.java
index 02fd382d..959e554a 100644
--- a/src/main/java/fr/xephi/authme/settings/Settings.java
+++ b/src/main/java/fr/xephi/authme/settings/Settings.java
@@ -512,8 +512,12 @@ public void mergeConfig() {
set("Email.delayRecall", 5);
if(!contains("settings.useWelcomeMessage"))
set("settings.useWelcomeMessage", true);
- if(!contains("settings.security.unsafePasswords"))
- set("settings.security.unsafePasswords", new ArrayList());
+ if(!contains("settings.security.unsafePasswords")) {
+ List str = new ArrayList();
+ str.add("123456");
+ str.add("password");
+ set("settings.security.unsafePasswords", str);
+ }
if(!contains("Protection.countriesBlacklist")) {
countriesBlacklist = new ArrayList();
countriesBlacklist.add("A1");
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 99527df0..4dedf56d 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -353,8 +353,8 @@ Hooks:
useEssentialsMotd: false
Performances:
# HIGHLY recommended to use this! This will increase database performance
- # Default is false due to little servers
- useMultiThreading: false
+ # Default is true, change it to false if you experience issues
+ useMultiThreading: true
Purge:
# On Enable , does AuthMe need to purge automatically old accounts unused ?
useAutoPurge: false
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index baa944d3..68d631ae 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -3,7 +3,7 @@ author: Xephi59
website: http://dev.bukkit.org/bukkit-plugins/authme-reloaded/
description: AuthMe prevents people, which aren't logged in, from doing stuff like placing blocks, moving, typing commands or seeing the inventory of the current player.
main: fr.xephi.authme.AuthMe
-version: 3.3.2-DEV-1
+version: 3.3.2
softdepend: [Vault, ChestShop, Spout, Multiverse-Core, Notifications, Citizens, CombatTag, Essentials, EssentialsSpawn]
commands:
register: