diff --git a/lib/bungeecord-api.jar b/lib/bungeecord-api.jar
deleted file mode 100644
index 73c5e094..00000000
Binary files a/lib/bungeecord-api.jar and /dev/null differ
diff --git a/pom.xml b/pom.xml
index 7c560341..3610ffcd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,12 +24,12 @@
- 3.3.6
+ 3.4
org.bukkit
craftbukkit
- 1.7.5-R0.1-SNAPSHOT
+ 1.7.9-R0.2
net.milkbowl.vault
@@ -128,13 +128,6 @@
Pre2.9.4.1
system
${project.basedir}/lib/Essentials.jar
-
-
- net.md-5
- bungeecord-api
- 1.7.2-SNAPSHOT
- system
- ${project.basedir}/lib/bungeecord-api.jar
\ No newline at end of file
diff --git a/src/main/java/fr/xephi/authme/AuthMe.java b/src/main/java/fr/xephi/authme/AuthMe.java
index fe253e49..8c7cfc86 100644
--- a/src/main/java/fr/xephi/authme/AuthMe.java
+++ b/src/main/java/fr/xephi/authme/AuthMe.java
@@ -537,7 +537,8 @@ public class AuthMe extends JavaPlugin {
player.getInventory().setArmorContents(limbo.getArmour());
player.getInventory().setContents(limbo.getInventory());
}
- player.teleport(limbo.getLoc());
+ if (!Settings.noTeleport)
+ player.teleport(limbo.getLoc());
this.utils.addNormal(player, limbo.getGroup());
player.setOp(limbo.getOperator());
this.plugin.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId());
diff --git a/src/main/java/fr/xephi/authme/api/API.java b/src/main/java/fr/xephi/authme/api/API.java
index e34eebcb..f37b4d90 100644
--- a/src/main/java/fr/xephi/authme/api/API.java
+++ b/src/main/java/fr/xephi/authme/api/API.java
@@ -32,7 +32,7 @@ public class API {
*/
public static AuthMe hookAuthMe() {
Plugin plugin = Bukkit.getServer().getPluginManager().getPlugin("AuthMe");
- if (plugin == null && !(plugin instanceof AuthMe)) {
+ if (plugin == null || !(plugin instanceof AuthMe)) {
return null;
}
return (AuthMe) plugin;
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 4f7cb6d8..e9292750 100644
--- a/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java
+++ b/src/main/java/fr/xephi/authme/cache/auth/PlayerAuth.java
@@ -26,6 +26,7 @@ public class PlayerAuth {
this.lastLogin = lastLogin;
this.email = email;
this.realName = realName;
+
}
public PlayerAuth(String nickname, double x, double y, double z, String world) {
@@ -34,6 +35,8 @@ public class PlayerAuth {
this.y = y;
this.z = z;
this.world = world;
+ this.lastLogin = System.currentTimeMillis();
+
}
public PlayerAuth(String nickname, String hash, String ip, long lastLogin, double x, double y, double z, String world, String email, String realName) {
@@ -47,6 +50,7 @@ public class PlayerAuth {
this.world = world;
this.email = email;
this.realName = realName;
+
}
public PlayerAuth(String nickname, String hash, String salt, int groupId, String ip, long lastLogin, double x, double y, double z, String world, String email, String realName) {
@@ -62,6 +66,7 @@ public class PlayerAuth {
this.groupId = groupId;
this.email = email;
this.realName = realName;
+
}
public PlayerAuth(String nickname, String hash, String salt, int groupId , String ip, long lastLogin, String realName) {
@@ -72,6 +77,7 @@ public class PlayerAuth {
this.salt = salt;
this.groupId = groupId;
this.realName = realName;
+
}
public PlayerAuth(String nickname, String hash, String salt, String ip, long lastLogin, String realName) {
@@ -81,6 +87,7 @@ public class PlayerAuth {
this.lastLogin = lastLogin;
this.salt = salt;
this.realName = realName;
+
}
public PlayerAuth(String nickname, String hash, String salt, String ip, long lastLogin, double x, double y, double z, String world, String email, String realName) {
@@ -101,6 +108,14 @@ public class PlayerAuth {
this.nickname = nickname;
this.ip = ip;
this.lastLogin = lastLogin;
+
+ }
+
+ public PlayerAuth(String nickname, String hash, String ip, long lastLogin) {
+ this.nickname = nickname;
+ this.ip = ip;
+ this.lastLogin = lastLogin;
+ this.hash = hash;
}
public String getIp() {
@@ -218,5 +233,4 @@ public class PlayerAuth {
public String getRealname() {
return realName;
}
-
}
diff --git a/src/main/java/fr/xephi/authme/cache/backup/FileCache.java b/src/main/java/fr/xephi/authme/cache/backup/FileCache.java
index a6177035..75b77805 100644
--- a/src/main/java/fr/xephi/authme/cache/backup/FileCache.java
+++ b/src/main/java/fr/xephi/authme/cache/backup/FileCache.java
@@ -10,11 +10,14 @@ import java.util.Scanner;
import org.bukkit.Material;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+import fr.xephi.authme.AuthMe;
import fr.xephi.authme.api.API;
public class FileCache {
+ private AuthMe plugin = AuthMe.getInstance();
public FileCache() {
final File folder = new File("cache");
if (!folder.exists()) {
@@ -127,25 +130,25 @@ public class FileCache {
final File file = new File("cache/" + playername
+ ".cache");
- ItemStack[] stacki = new ItemStack[36];
- ItemStack[] stacka = new ItemStack[4];
- String group = null;
- boolean op = false;
- boolean flying = false;
- if (!file.exists()) {
- return new DataFileCache(stacki, stacka);
- }
+ ItemStack[] stacki = new ItemStack[36];
+ ItemStack[] stacka = new ItemStack[4];
+ String group = null;
+ boolean op = false;
+ boolean flying = false;
+ if (!file.exists()) {
+ return new DataFileCache(stacki, stacka);
+ }
- Scanner reader = null;
- try {
- reader = new Scanner(file);
+ Scanner reader = null;
+ try {
+ reader = new Scanner(file);
- int i = 0;
- int a = 0;
- while (reader.hasNextLine()) {
- String line = reader.nextLine();
+ int i = 0;
+ int a = 0;
+ while (reader.hasNextLine()) {
+ String line = reader.nextLine();
- if (!line.contains(":")) {
+ if (!line.contains(":")) {
// the fist line represent the player group, operator status and flying status
final String[] playerInfo = line.split(";");
group = playerInfo[0];
@@ -154,77 +157,88 @@ public class FileCache {
op = true;
} else op = false;
if (playerInfo.length > 2) {
- if (Integer.parseInt(playerInfo[2]) == 1)
- flying = true;
- else flying = false;
+ if (Integer.parseInt(playerInfo[2]) == 1)
+ flying = true;
+ else flying = false;
}
continue;
- }
+ }
- if (!line.startsWith("i") && !line.startsWith("w")) {
- continue;
- }
- String lores = "";
- String name = "";
- if (line.split("\\*").length > 1) {
- lores = line.split("\\*")[1];
- line = line.split("\\*")[0];
- }
- if (line.split(";").length > 1) {
- name = line.split(";")[1];
- line = line.split(";")[0];
- }
- final String[] in = line.split(":");
+ if (!line.startsWith("i") && !line.startsWith("w")) {
+ continue;
+ }
+ String lores = "";
+ String name = "";
+ if (line.split("\\*").length > 1) {
+ lores = line.split("\\*")[1];
+ line = line.split("\\*")[0];
+ }
+ if (line.split(";").length > 1) {
+ name = line.split(";")[1];
+ line = line.split(";")[0];
+ }
+ final String[] in = line.split(":");
// can enchant item? size ofstring in file - 4 all / 2 = number of enchant
- if (in[0].equals("i")) {
- stacki[i] = new ItemStack(Material.getMaterial(in[1]),
- Integer.parseInt(in[2]), Short.parseShort((in[3])));
- if(in.length > 4 && !in[4].isEmpty()) {
- for(int k=4;k loreList = new ArrayList();
- for (String s : lores.split("%newline%")) {
- loreList.add(s);
- }
- stacki[i].getItemMeta().setLore(loreList);
- }
- i++;
- } else {
- stacka[a] = new ItemStack(Material.getMaterial(in[1]),
- Integer.parseInt(in[2]), Short.parseShort((in[3])));
- if(in.length > 4 && !in[4].isEmpty()) {
- for(int k=4;k loreList = new ArrayList();
- for (String s : lores.split("%newline%")) {
- loreList.add(s);
- }
- stacka[a].getItemMeta().setLore(loreList);
- }
- a++;
- }
- }
- } catch (final Exception e) {
- e.printStackTrace();
- } finally {
- if (reader != null) {
- reader.close();
- }
- }
- return new DataFileCache(stacki, stacka, group, op, flying);
+ if (in[0].equals("i")) {
+ stacki[i] = new ItemStack(Material.getMaterial(in[1]),
+ Integer.parseInt(in[2]), Short.parseShort((in[3])));
+ if(in.length > 4 && !in[4].isEmpty()) {
+ for(int k=4;k loreList = new ArrayList();
+ for (String s : lores.split("%newline%")) {
+ loreList.add(s);
+ }
+ meta.setLore(loreList);
+ }
+ if (meta != null)
+ stacki[i].setItemMeta(meta);
+ } catch (Exception e) {}
+ i++;
+ } else {
+ stacka[a] = new ItemStack(Material.getMaterial(in[1]),
+ Integer.parseInt(in[2]), Short.parseShort((in[3])));
+ if(in.length > 4 && !in[4].isEmpty()) {
+ for(int k=4;k loreList = new ArrayList();
+ for (String s : lores.split("%newline%")) {
+ loreList.add(s);
+ }
+ meta.setLore(loreList);
+ }
+ if (meta != null)
+ stacki[i].setItemMeta(meta);
+ } catch (Exception e) {}
+ a++;
+ }
+ }
+ } catch (final Exception e) {
+ e.printStackTrace();
+ } finally {
+ if (reader != null) {
+ reader.close();
+ }
+ }
+ return new DataFileCache(stacki, stacka, group, op, flying);
}
public void removeCache(String playername) {
diff --git a/src/main/java/fr/xephi/authme/commands/AdminCommand.java b/src/main/java/fr/xephi/authme/commands/AdminCommand.java
index 1b36c3a2..154a2018 100644
--- a/src/main/java/fr/xephi/authme/commands/AdminCommand.java
+++ b/src/main/java/fr/xephi/authme/commands/AdminCommand.java
@@ -2,7 +2,6 @@ package fr.xephi.authme.commands;
import java.io.File;
import java.io.FileOutputStream;
-import java.io.IOException;
import java.io.InputStream;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
@@ -33,12 +32,12 @@ 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.limbo.LimboCache;
+import fr.xephi.authme.converter.Converter;
import fr.xephi.authme.converter.FlatToSql;
import fr.xephi.authme.converter.FlatToSqlite;
import fr.xephi.authme.converter.RakamakConverter;
import fr.xephi.authme.converter.RoyalAuthConverter;
-import fr.xephi.authme.converter.newxAuthToFlat;
-import fr.xephi.authme.converter.oldxAuthToFlat;
+import fr.xephi.authme.converter.xAuthConverter;
import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.events.SpawnTeleportEvent;
import fr.xephi.authme.security.PasswordSecurity;
@@ -301,44 +300,26 @@ public class AdminCommand implements CommandExecutor {
}
return true;
} else if (args[0].equalsIgnoreCase("convertflattosql")) {
- try {
- FlatToSql converter = new FlatToSql();
- if (sender instanceof Player) {
- if (converter.convert())
- sender.sendMessage("[AuthMe] FlatFile converted to authme.sql file");
- else sender.sendMessage("[AuthMe] Error while converting to authme.sql");
- }
-
- } catch (IOException e) {
- e.printStackTrace();
- } catch (NullPointerException ex) {
- System.out.println(ex.getMessage());
- }
+ FlatToSql converter = new FlatToSql();
+ try {
+ converter.convert();
+ } catch (Exception e) {
+ sender.sendMessage("[AuthMe] Error while converting to authme.sql");
+ }
} else if (args[0].equalsIgnoreCase("flattosqlite")) {
- try {
- String s = FlatToSqlite.convert();
- if (sender instanceof Player)
- sender.sendMessage(s);
- } catch (IOException e) {
- e.printStackTrace();
- } catch (NullPointerException ex) {
- System.out.println(ex.getMessage());
- }
+ FlatToSqlite converter = new FlatToSqlite(sender);
+ try {
+ converter.convert();
+ } catch (Exception e) {
+ }
return true;
} else if (args[0].equalsIgnoreCase("xauthimport")) {
- try {
- Class.forName("com.cypherx.xauth.xAuth");
- oldxAuthToFlat converter = new oldxAuthToFlat(plugin, database, sender);
- converter.run();
- } catch (ClassNotFoundException e) {
- try {
- Class.forName("de.luricos.bukkit.xAuth.xAuth");
- newxAuthToFlat converter = new newxAuthToFlat(plugin, database, sender);
- converter.run();
- } catch (ClassNotFoundException ce) {
- sender.sendMessage("[AuthMe] No version of xAuth found or xAuth isn't enable! ");
- }
- }
+ Converter converter = new xAuthConverter(plugin, database, sender);
+ try {
+ converter.convert();
+ } catch (Exception e) {
+ sender.sendMessage("Error while importing xAuth data, check your logs");
+ }
return true;
} else if (args[0].equalsIgnoreCase("getemail")) {
if (args.length != 2) {
@@ -373,15 +354,12 @@ public class AdminCommand implements CommandExecutor {
PlayerCache.getInstance().updatePlayer(getAuth);
return true;
} else if (args[0].equalsIgnoreCase("convertfromrakamak")) {
- try {
- RakamakConverter.RakamakConvert();
- if (sender instanceof Player)
- sender.sendMessage("[AuthMe] Rakamak database converted to auths.db");
- } catch (IOException e) {
- e.printStackTrace();
- } catch (NullPointerException ex) {
- ConsoleLogger.showError(ex.getMessage());
- }
+ Converter converter = new RakamakConverter(plugin, database, sender);
+ try {
+ converter.convert();
+ } catch (Exception e) {
+ sender.sendMessage("Error while importing Rakamak data, check your logs");
+ }
return true;
} else if (args[0].equalsIgnoreCase("setspawn")) {
try {
@@ -509,7 +487,7 @@ public class AdminCommand implements CommandExecutor {
Utils.getInstance().setGroup(name, groupType.UNREGISTERED);
if (target != null) {
if (target.isOnline()) {
- if (Settings.isTeleportToSpawnEnabled) {
+ if (Settings.isTeleportToSpawnEnabled && !Settings.noTeleport) {
Location spawn = plugin.getSpawnLocation(target);
SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(target, target.getLocation(), spawn, false);
plugin.getServer().getPluginManager().callEvent(tpEvent);
@@ -587,7 +565,7 @@ public class AdminCommand implements CommandExecutor {
sender.sendMessage("Usage : /authme getip onlinePlayerName");
return true;
}
- if (Bukkit.getOfflinePlayer(args[1]).isOnline()) {
+ if (Bukkit.getPlayer(args[1]) != null) {
Player player = Bukkit.getPlayer(args[1]);
sender.sendMessage(player.getName() + " actual ip is : " + player.getAddress().getAddress().getHostAddress() + ":" + player.getAddress().getPort());
sender.sendMessage(player.getName() + " real ip is : " + plugin.getIP(player));
diff --git a/src/main/java/fr/xephi/authme/commands/LogoutCommand.java b/src/main/java/fr/xephi/authme/commands/LogoutCommand.java
index 28aaa88e..cccc289d 100644
--- a/src/main/java/fr/xephi/authme/commands/LogoutCommand.java
+++ b/src/main/java/fr/xephi/authme/commands/LogoutCommand.java
@@ -69,7 +69,7 @@ public class LogoutCommand implements CommandExecutor {
PlayerCache.getInstance().removePlayer(name);
database.setUnlogged(name);
- if (Settings.isTeleportToSpawnEnabled) {
+ if (Settings.isTeleportToSpawnEnabled && !Settings.noTeleport) {
Location spawnLoc = plugin.getSpawnLocation(player);
AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, spawnLoc);
plugin.getServer().getPluginManager().callEvent(tpEvent);
diff --git a/src/main/java/fr/xephi/authme/commands/UnregisterCommand.java b/src/main/java/fr/xephi/authme/commands/UnregisterCommand.java
index 1998645f..bf8e831f 100644
--- a/src/main/java/fr/xephi/authme/commands/UnregisterCommand.java
+++ b/src/main/java/fr/xephi/authme/commands/UnregisterCommand.java
@@ -70,7 +70,7 @@ public class UnregisterCommand implements CommandExecutor {
return true;
}
if(Settings.isForcedRegistrationEnabled) {
- if (Settings.isTeleportToSpawnEnabled) {
+ if (Settings.isTeleportToSpawnEnabled && !Settings.noTeleport) {
Location spawn = plugin.getSpawnLocation(player);
SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawn, false);
plugin.getServer().getPluginManager().callEvent(tpEvent);
@@ -113,7 +113,7 @@ public class UnregisterCommand implements CommandExecutor {
if(plugin.notifications != null) {
plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " unregistered himself!"));
}
- if (Settings.isTeleportToSpawnEnabled) {
+ if (Settings.isTeleportToSpawnEnabled && !Settings.noTeleport) {
Location spawn = plugin.getSpawnLocation(player);
SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawn, false);
plugin.getServer().getPluginManager().callEvent(tpEvent);
diff --git a/src/main/java/fr/xephi/authme/converter/Converter.java b/src/main/java/fr/xephi/authme/converter/Converter.java
new file mode 100644
index 00000000..e9ccd6c9
--- /dev/null
+++ b/src/main/java/fr/xephi/authme/converter/Converter.java
@@ -0,0 +1,6 @@
+package fr.xephi.authme.converter;
+
+public interface Converter {
+
+ void convert() throws Exception;
+}
diff --git a/src/main/java/fr/xephi/authme/converter/FlatToSql.java b/src/main/java/fr/xephi/authme/converter/FlatToSql.java
index 389bc8b7..359ca1e0 100644
--- a/src/main/java/fr/xephi/authme/converter/FlatToSql.java
+++ b/src/main/java/fr/xephi/authme/converter/FlatToSql.java
@@ -17,7 +17,7 @@ import fr.xephi.authme.settings.Settings;
*
* @author Xephi59
*/
-public class FlatToSql {
+public class FlatToSql implements Converter {
private static String tableName;
private static String columnName;
@@ -49,7 +49,7 @@ public class FlatToSql {
columnID = Settings.getMySQLColumnId;
}
- public boolean convert() throws IOException {
+ public void convert() throws IOException {
try {
source = new File(AuthMe.getInstance().getDataFolder() + File.separator + "auths.db");
source.createNewFile();
@@ -93,12 +93,10 @@ public class FlatToSql {
sql.close();
br.close();
ConsoleLogger.info("The FlatFile has been converted to authme.sql file");
- return true;
} catch (FileNotFoundException ex) {
ConsoleLogger.showError(ex.getMessage());
} catch (IOException ex) {
ConsoleLogger.showError(ex.getMessage());
}
- return false;
}
}
diff --git a/src/main/java/fr/xephi/authme/converter/FlatToSqlite.java b/src/main/java/fr/xephi/authme/converter/FlatToSqlite.java
index 550f1693..bf6721ca 100644
--- a/src/main/java/fr/xephi/authme/converter/FlatToSqlite.java
+++ b/src/main/java/fr/xephi/authme/converter/FlatToSqlite.java
@@ -12,12 +12,20 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import org.bukkit.command.CommandSender;
+
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.settings.Settings;
-public class FlatToSqlite {
+public class FlatToSqlite implements Converter {
+
+ public CommandSender sender;
+
+ public FlatToSqlite(CommandSender sender) {
+ this.sender = sender;
+ }
private static String tableName;
private static String columnName;
@@ -34,7 +42,7 @@ public class FlatToSqlite {
private static String columnID;
private static Connection con;
- public static String convert() throws IOException {
+ public void convert() throws Exception {
database = Settings.getMySQLDatabase;
tableName = Settings.getMySQLTablename;
columnName = Settings.getMySQLColumnName;
@@ -49,14 +57,16 @@ public class FlatToSqlite {
columnID = Settings.getMySQLColumnId;
ConsoleLogger.info("Converting FlatFile to SQLite ...");
if (new File(AuthMe.getInstance().getDataFolder() + File.separator + database + ".db").exists()) {
- return "The Database " + database + ".db can't be created cause the file already exist";
+ sender.sendMessage("The Database " + database + ".db can't be created cause the file already exist");
+ return;
}
try {
connect();
setup();
} catch (Exception e) {
ConsoleLogger.showError("Problem while trying to convert to sqlite !");
- return "Problem while trying to convert to sqlite !";
+ sender.sendMessage("Problem while trying to convert to sqlite !");
+ return;
}
try {
source = new File(AuthMe.getInstance().getDataFolder() + File.separator + "auths.db");
@@ -84,13 +94,15 @@ public class FlatToSqlite {
br.close();
ConsoleLogger.info("The FlatFile has been converted to " + database + ".db file");
close();
- return ("The FlatFile has been converted to " + database + ".db file");
+ sender.sendMessage("The FlatFile has been converted to " + database + ".db file");
+ return;
} catch (FileNotFoundException ex) {
ConsoleLogger.showError(ex.getMessage());
} catch (IOException ex) {
ConsoleLogger.showError(ex.getMessage());
}
- return "Errors appears while trying to convert to SQLite";
+ sender.sendMessage("Errors appears while trying to convert to SQLite");
+ return;
}
private synchronized static void connect() throws ClassNotFoundException, SQLException {
diff --git a/src/main/java/fr/xephi/authme/converter/RakamakConverter.java b/src/main/java/fr/xephi/authme/converter/RakamakConverter.java
index aa9348e7..9386f44b 100644
--- a/src/main/java/fr/xephi/authme/converter/RakamakConverter.java
+++ b/src/main/java/fr/xephi/authme/converter/RakamakConverter.java
@@ -1,50 +1,52 @@
package fr.xephi.authme.converter;
import java.io.BufferedReader;
-import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
-import java.io.FileWriter;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map.Entry;
+import org.bukkit.command.CommandSender;
+
import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger;
+import fr.xephi.authme.cache.auth.PlayerAuth;
+import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.security.HashAlgorithm;
import fr.xephi.authme.security.PasswordSecurity;
import fr.xephi.authme.settings.Settings;
-
/**
*
* @author Xephi59
*/
-public class RakamakConverter {
+public class RakamakConverter implements Converter {
public AuthMe instance;
+ public DataSource database;
+ public CommandSender sender;
- public RakamakConverter (AuthMe instance) {
+ public RakamakConverter (AuthMe instance, DataSource database, CommandSender sender) {
this.instance = instance;
+ this.database = database;
+ this.sender = sender;
}
public RakamakConverter getInstance() {
return this;
}
- private static HashAlgorithm hash;
private static Boolean useIP;
private static String fileName;
private static String ipFileName;
private static File source;
- private static File output;
private static File ipfiles;
- private static boolean alreadyExist = false;
- public static void RakamakConvert() throws IOException {
- hash = Settings.rakamakHash;
+ public void convert() throws Exception {
+ HashAlgorithm hash = Settings.getPasswordHash;
useIP = Settings.rakamakUseIp;
fileName = Settings.rakamakUsers;
ipFileName = Settings.rakamakUsersIp;
@@ -53,19 +55,12 @@ public class RakamakConverter {
try {
source = new File(AuthMe.getInstance().getDataFolder() + File.separator + fileName);
ipfiles = new File(AuthMe.getInstance().getDataFolder() + File.separator + ipFileName);
- output = new File(AuthMe.getInstance().getDataFolder() + File.separator + "auths.db");
source.createNewFile();
ipfiles.createNewFile();
- if (new File(AuthMe.getInstance().getDataFolder() + File.separator + "auths.db").exists()) {
- alreadyExist = true;
- }
- output.createNewFile();
BufferedReader users = null;
- BufferedWriter outputDB = null;
BufferedReader ipFile = null;
ipFile = new BufferedReader(new FileReader(ipfiles));
String line;
- String newLine = null;
if (useIP) {
String tempLine;
while ((tempLine = ipFile.readLine()) != null) {
@@ -81,33 +76,28 @@ public class RakamakConverter {
if (line.contains("=")) {
String[] arguments = line.split("=");
try {
- playerPSW.put(arguments[0],PasswordSecurity.getHash(hash, arguments[1], arguments[0].toLowerCase()));
+ playerPSW.put(arguments[0],PasswordSecurity.getHash(hash, arguments[1], arguments[0]));
} catch (NoSuchAlgorithmException e) {
ConsoleLogger.showError(e.getMessage());
}
}
}
users.close();
- outputDB = new BufferedWriter(new FileWriter(output));
for (Entry m : playerPSW.entrySet()) {
+ String player = m.getKey();
+ String psw = playerPSW.get(player);
+ String ip;
if (useIP) {
- String player = m.getKey();
- String psw = playerPSW.get(player);
- String ip = playerIP.get(player);
- newLine = player + ":" + psw + ":" + ip + ":1325376060:0:0:0:world:your@email.com";
+ ip = playerIP.get(player);
} else {
- String player = m.getKey();
- String psw = playerPSW.get(player);
- String ip = "127.0.0.1";
- newLine = player + ":" + psw + ":" + ip + ":1325376060:0:0:0:world:your@email.com";
+ ip = "127.0.0.1";
}
- if (alreadyExist) outputDB.newLine();
- outputDB.write(newLine);
- System.out.println("Write line");
- outputDB.newLine();
+ PlayerAuth auth = new PlayerAuth(player, psw, ip, System.currentTimeMillis());
+ if (PasswordSecurity.userSalt.containsKey(player))
+ auth.setSalt(PasswordSecurity.userSalt.get(player));
+ database.saveAuth(auth);
}
- outputDB.close();
- ConsoleLogger.info("Rakamak database has been converted to auths.db");
+ ConsoleLogger.info("Rakamak database has been imported correctly");
} catch (FileNotFoundException ex) {
ConsoleLogger.showError(ex.getMessage());
} catch (IOException ex) {
diff --git a/src/main/java/fr/xephi/authme/converter/RoyalAuthConverter.java b/src/main/java/fr/xephi/authme/converter/RoyalAuthConverter.java
index f5ad9d85..b51e9926 100644
--- a/src/main/java/fr/xephi/authme/converter/RoyalAuthConverter.java
+++ b/src/main/java/fr/xephi/authme/converter/RoyalAuthConverter.java
@@ -9,7 +9,7 @@ import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.cache.auth.PlayerAuth;
import fr.xephi.authme.datasource.DataSource;
-public class RoyalAuthConverter extends Thread {
+public class RoyalAuthConverter extends Thread implements Converter {
public AuthMe plugin;
private DataSource data;
@@ -21,23 +21,27 @@ public class RoyalAuthConverter extends Thread {
}
public void run() {
- for (OfflinePlayer o : plugin.getServer().getOfflinePlayers()) {
- try {
- String name = o.getName().toLowerCase();
- String separator = File.separator;
- File file = new File("." + separator + "plugins" + separator + "RoyalAuth" + separator + "userdata" + separator + name + ".yml");
- if (data.isAuthAvailable(name))
- continue;
- if (!file.exists())
- continue;
- RoyalAuthYamlReader ra = new RoyalAuthYamlReader(file);
- PlayerAuth auth = new PlayerAuth(name, ra.getHash(), "127.0.0.1", ra.getLastLogin(), "your@email.com", o.getName());
- data.saveAuth(auth);
- } catch (Exception e) {
- ConsoleLogger.showError("Error while trying to import "+ o.getName() + " RoyalAuth datas");
- }
- }
- this.interrupt();
}
+ @Override
+ public void convert() throws Exception {
+ for (OfflinePlayer o : plugin.getServer().getOfflinePlayers()) {
+ try {
+ String name = o.getName().toLowerCase();
+ String separator = File.separator;
+ File file = new File("." + separator + "plugins" + separator + "RoyalAuth" + separator + "userdata" + separator + name + ".yml");
+ if (data.isAuthAvailable(name))
+ continue;
+ if (!file.exists())
+ continue;
+ RoyalAuthYamlReader ra = new RoyalAuthYamlReader(file);
+ PlayerAuth auth = new PlayerAuth(name, ra.getHash(), "127.0.0.1", ra.getLastLogin(), "your@email.com", o.getName());
+ data.saveAuth(auth);
+ } catch (Exception e) {
+ ConsoleLogger.showError("Error while trying to import "+ o.getName() + " RoyalAuth datas");
+ }
+ }
+ this.interrupt();
+ }
+
}
diff --git a/src/main/java/fr/xephi/authme/converter/xAuthConverter.java b/src/main/java/fr/xephi/authme/converter/xAuthConverter.java
new file mode 100644
index 00000000..52d63d6e
--- /dev/null
+++ b/src/main/java/fr/xephi/authme/converter/xAuthConverter.java
@@ -0,0 +1,35 @@
+package fr.xephi.authme.converter;
+
+import org.bukkit.command.CommandSender;
+
+import fr.xephi.authme.AuthMe;
+import fr.xephi.authme.datasource.DataSource;
+
+public class xAuthConverter implements Converter {
+
+ public AuthMe plugin;
+ public DataSource database;
+ public CommandSender sender;
+
+ public xAuthConverter(AuthMe plugin, DataSource database, CommandSender sender) {
+ this.plugin = plugin;
+ this.database = database;
+ this.sender = sender;
+ }
+ @Override
+ public void convert() throws Exception {
+ try {
+ Class.forName("com.cypherx.xauth.xAuth");
+ oldxAuthToFlat converter = new oldxAuthToFlat(plugin, database, sender);
+ converter.run();
+ } catch (ClassNotFoundException e) {
+ try {
+ Class.forName("de.luricos.bukkit.xAuth.xAuth");
+ newxAuthToFlat converter = new newxAuthToFlat(plugin, database, sender);
+ converter.run();
+ } catch (ClassNotFoundException ce) {
+ }
+ }
+ }
+
+}
diff --git a/src/main/java/fr/xephi/authme/datasource/MySQLDataSource.java b/src/main/java/fr/xephi/authme/datasource/MySQLDataSource.java
index 3e7a8a26..6cbe7875 100644
--- a/src/main/java/fr/xephi/authme/datasource/MySQLDataSource.java
+++ b/src/main/java/fr/xephi/authme/datasource/MySQLDataSource.java
@@ -235,7 +235,7 @@ public class MySQLDataSource implements DataSource {
PreparedStatement pst = null;
try {
con = makeSureConnectionIsReady();
- if ((columnSalt == null || columnSalt.isEmpty()) && (auth.getSalt() == null || auth.getSalt().isEmpty())) {
+ if ((columnSalt == null || columnSalt.isEmpty()) || (auth.getSalt() == null || auth.getSalt().isEmpty())) {
pst = con.prepareStatement("INSERT INTO " + tableName + "(" + columnName + "," + columnPassword + "," + columnIp + "," + columnLastLogin + ") VALUES (?,?,?,?);");
pst.setString(1, auth.getNickname());
pst.setString(2, auth.getHash());
diff --git a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java
index 13767bff..a477a2f3 100644
--- a/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java
+++ b/src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java
@@ -580,7 +580,6 @@ public class AuthMePlayerListener implements Listener {
long cur = new Date().getTime();
if((cur - lastLogin < timeout || timeout == 0) && !auth.getIp().equals("198.18.0.1") ) {
if (auth.getNickname().equalsIgnoreCase(name) && auth.getIp().equals(ip) ) {
- plugin.getServer().getPluginManager().callEvent(new SessionEvent(auth, true));
if(PlayerCache.getInstance().getAuth(name) != null) {
PlayerCache.getInstance().updatePlayer(auth);
} else {
@@ -590,6 +589,7 @@ public class AuthMePlayerListener implements Listener {
m._(player, "valid_session");
// Restore Permission Group
utils.setGroup(player, Utils.groupType.LOGGEDIN);
+ plugin.getServer().getPluginManager().callEvent(new SessionEvent(auth, true));
return;
} else if (!Settings.sessionExpireOnIpChange){
GameMode gM = gameMode.get(name);
@@ -627,15 +627,16 @@ public class AuthMePlayerListener implements Listener {
Utils.forceGM(player);
this.causeByAuthMe = false;
}
- if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) {
- SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name));
- plugin.getServer().getPluginManager().callEvent(tpEvent);
- if(!tpEvent.isCancelled()) {
- if (player != null && player.isOnline() && tpEvent.getTo() != null) {
- player.teleport(tpEvent.getTo());
- }
+ if (!Settings.noTeleport)
+ if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) {
+ SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name));
+ plugin.getServer().getPluginManager().callEvent(tpEvent);
+ if(!tpEvent.isCancelled()) {
+ if (player != null && player.isOnline() && tpEvent.getTo() != null) {
+ player.teleport(tpEvent.getTo());
+ }
+ }
}
- }
placePlayerSafely(player, spawnLoc);
LimboCache.getInstance().updateLimboPlayer(player);
DataFileCache dataFile = new DataFileCache(LimboCache.getInstance().getLimboPlayer(name).getInventory(),LimboCache.getInstance().getLimboPlayer(name).getArmour());
@@ -649,15 +650,16 @@ public class AuthMePlayerListener implements Listener {
if(!Settings.unRegisteredGroup.isEmpty()){
utils.setGroup(player, Utils.groupType.UNREGISTERED);
}
- if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) {
- SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name));
- plugin.getServer().getPluginManager().callEvent(tpEvent);
- if(!tpEvent.isCancelled()) {
- if (player != null && player.isOnline() && tpEvent.getTo() != null) {
- player.teleport(tpEvent.getTo());
- }
+ if (!Settings.noTeleport)
+ if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName()))) {
+ SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawnLoc, PlayerCache.getInstance().isAuthenticated(name));
+ plugin.getServer().getPluginManager().callEvent(tpEvent);
+ if(!tpEvent.isCancelled()) {
+ if (player != null && player.isOnline() && tpEvent.getTo() != null) {
+ player.teleport(tpEvent.getTo());
+ }
+ }
}
- }
if (!Settings.isForcedRegistrationEnabled) {
return;
}
@@ -711,13 +713,14 @@ public class AuthMePlayerListener implements Listener {
player.performCommand("motd");
// Remove the join message while the player isn't logging in
- if (Settings.enableProtection) {
+ if (Settings.enableProtection || Settings.delayJoinMessage) {
joinMessage.put(name, event.getJoinMessage());
event.setJoinMessage(null);
}
}
private void placePlayerSafely(Player player, Location spawnLoc) {
+ if (!Settings.noTeleport) return;
if (Settings.isTeleportToSpawnEnabled || (Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName())))
return;
Block b = player.getLocation().getBlock();
@@ -843,6 +846,7 @@ public class AuthMePlayerListener implements Listener {
ConsoleLogger.showError("Problem while restore " + name + " inventory after a kick");
}
}
+ if (!Settings.noTeleport)
try {
AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, limbo.getLoc());
plugin.getServer().getPluginManager().callEvent(tpEvent);
diff --git a/src/main/java/fr/xephi/authme/plugin/manager/CombatTagComunicator.java b/src/main/java/fr/xephi/authme/plugin/manager/CombatTagComunicator.java
index a5c372eb..f3c57651 100644
--- a/src/main/java/fr/xephi/authme/plugin/manager/CombatTagComunicator.java
+++ b/src/main/java/fr/xephi/authme/plugin/manager/CombatTagComunicator.java
@@ -1,64 +1,39 @@
package fr.xephi.authme.plugin.manager;
+import org.bukkit.Bukkit;
+import org.bukkit.entity.Entity;
+
import com.trc202.CombatTag.CombatTag;
import com.trc202.CombatTagApi.CombatTagApi;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Player;
-
public abstract class CombatTagComunicator {
- static CombatTagApi combatApi;
+ public static CombatTagApi combatApi;
- public CombatTagComunicator() {
- if(Bukkit.getServer().getPluginManager().getPlugin("CombatTag") != null){
- combatApi = new CombatTagApi((CombatTag)Bukkit.getServer().getPluginManager().getPlugin("CombatTag"));
- }
+ /**
+ * Returns if the entity is an NPC
+ * @param player
+ * @return true if the player is an NPC
+ */
+ public static boolean isNPC(Entity player) {
+ try {
+ if(Bukkit.getServer().getPluginManager().getPlugin("CombatTag") != null){
+ combatApi = new CombatTagApi((CombatTag) Bukkit.getServer().getPluginManager().getPlugin("CombatTag"));
+ try {
+ combatApi.getClass().getMethod("isNPC");
+ } catch (Exception e) {
+ return false;
+ }
+ return combatApi.isNPC(player);
+ }
+ } catch (ClassCastException ex) {
+ return false;
+ } catch (NullPointerException npe) {
+ return false;
+ } catch (NoClassDefFoundError ncdfe) {
+ return false;
+ }
+ return false;
}
- /**
- * Checks to see if the player is in combat. The combat time can be configured by the server owner
- * If the player has died while in combat the player is no longer considered in combat and as such will return false
- * @param playerName
- * @return true if player is in combat
- */
- public abstract boolean isInCombat(String player);
-
- /**
- * Checks to see if the player is in combat. The combat time can be configured by the server owner
- * If the player has died while in combat the player is no longer considered in combat and as such will return false
- * @param player
- * @return true if player is in combat
- */
- public abstract boolean isInCombat(Player player);
- /**
- * Returns the time before the tag is over
- * -1 if the tag has expired
- * -2 if the player is not in combat
- * @param player
- * @return
- */
- public abstract long getRemainingTagTime(String player);
-
- /**
- * Returns if the entity is an NPC
- * @param player
- * @return true if the player is an NPC
- */
- public static boolean isNPC(Entity player) {
- try {
- if(Bukkit.getServer().getPluginManager().getPlugin("CombatTag") != null){
- combatApi = new CombatTagApi((CombatTag) Bukkit.getServer().getPluginManager().getPlugin("CombatTag"));
- return combatApi.isNPC(player);
- }
- } catch (ClassCastException ex) {
- return false;
- } catch (NullPointerException npe) {
- return false;
- } catch (NoClassDefFoundError ncdfe) {
- return false;
- }
- return false;
- }
}
diff --git a/src/main/java/fr/xephi/authme/process/login/ProcessSyncronousPlayerLogin.java b/src/main/java/fr/xephi/authme/process/login/ProcessSyncronousPlayerLogin.java
index 9da36174..49ee068a 100644
--- a/src/main/java/fr/xephi/authme/process/login/ProcessSyncronousPlayerLogin.java
+++ b/src/main/java/fr/xephi/authme/process/login/ProcessSyncronousPlayerLogin.java
@@ -132,36 +132,24 @@ public class ProcessSyncronousPlayerLogin implements Runnable {
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();
+ if (!Settings.noTeleport) {
+ // Teleport the player
+ if(Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds.contains(player.getWorld().getName())) {
+ // If we have force the spawn location on join
+ teleportToSpawn();
} else {
- teleportBackFromSpawn();
+ 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
+ }
+ }
}
- } 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
diff --git a/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousEmailRegister.java b/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousEmailRegister.java
index eabf68df..fa42713c 100644
--- a/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousEmailRegister.java
+++ b/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousEmailRegister.java
@@ -46,7 +46,7 @@ public class ProcessSyncronousEmailRegister implements Runnable {
int nwMsg = Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, new MessageTask(plugin, name, m._("login_msg"), msgInterval));
LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(nwMsg);
- if (Settings.isTeleportToSpawnEnabled) {
+ if (Settings.isTeleportToSpawnEnabled && !Settings.noTeleport) {
Location loca = plugin.getSpawnLocation(player);
RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, loca);
plugin.getServer().getPluginManager().callEvent(tpEvent);
diff --git a/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousPasswordRegister.java b/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousPasswordRegister.java
index 8faac815..5730c28f 100644
--- a/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousPasswordRegister.java
+++ b/src/main/java/fr/xephi/authme/process/register/ProcessSyncronousPasswordRegister.java
@@ -42,7 +42,7 @@ public class ProcessSyncronousPasswordRegister implements Runnable {
}
protected void forceLogin(Player player) {
- if (Settings.isTeleportToSpawnEnabled) {
+ if (Settings.isTeleportToSpawnEnabled && !Settings.noTeleport) {
Location spawnLoc = plugin.getSpawnLocation(player);
AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, spawnLoc);
plugin.getServer().getPluginManager().callEvent(tpEvent);
@@ -78,7 +78,7 @@ public class ProcessSyncronousPasswordRegister implements Runnable {
LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name);
if (limbo != null) {
player.setGameMode(limbo.getGameMode());
- if (Settings.isTeleportToSpawnEnabled) {
+ if (Settings.isTeleportToSpawnEnabled && !Settings.noTeleport) {
Location loca = plugin.getSpawnLocation(player);
RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, loca);
plugin.getServer().getPluginManager().callEvent(tpEvent);
diff --git a/src/main/java/fr/xephi/authme/security/HashAlgorithm.java b/src/main/java/fr/xephi/authme/security/HashAlgorithm.java
index f75780b1..b0795136 100644
--- a/src/main/java/fr/xephi/authme/security/HashAlgorithm.java
+++ b/src/main/java/fr/xephi/authme/security/HashAlgorithm.java
@@ -21,11 +21,13 @@ public enum HashAlgorithm {
JOOMLA(fr.xephi.authme.security.crypts.JOOMLA.class),
BCRYPT(fr.xephi.authme.security.crypts.BCRYPT.class),
WBB3(fr.xephi.authme.security.crypts.WBB3.class),
+ WBB4(fr.xephi.authme.security.crypts.WBB4.class),
SHA512(fr.xephi.authme.security.crypts.SHA512.class),
DOUBLEMD5(fr.xephi.authme.security.crypts.DOUBLEMD5.class),
PBKDF2(fr.xephi.authme.security.crypts.CryptPBKDF2.class),
WORDPRESS(fr.xephi.authme.security.crypts.WORDPRESS.class),
ROYALAUTH(fr.xephi.authme.security.crypts.ROYALAUTH.class),
+ CRAZYCRYPT1(fr.xephi.authme.security.crypts.CRAZYCRYPT1.class),
CUSTOM(Null.class);
Class> classe;
diff --git a/src/main/java/fr/xephi/authme/security/PasswordSecurity.java b/src/main/java/fr/xephi/authme/security/PasswordSecurity.java
index fb672699..13826c01 100644
--- a/src/main/java/fr/xephi/authme/security/PasswordSecurity.java
+++ b/src/main/java/fr/xephi/authme/security/PasswordSecurity.java
@@ -80,12 +80,16 @@ public class PasswordSecurity {
salt = createSalt(40);
userSalt.put(playerName, salt);
break;
+ case WBB4:
+ salt = BCRYPT.gensalt(8);
+ userSalt.put(playerName, salt);
+ break;
case PBKDF2:
salt = createSalt(12);
userSalt.put(playerName, salt);
break;
case SMF:
- return method.getHash(password, playerName.toLowerCase());
+ return method.getHash(password, null, playerName);
case PHPBB:
salt = createSalt(16);
userSalt.put(playerName, salt);
@@ -96,6 +100,8 @@ public class PasswordSecurity {
case PLAINTEXT:
case XENFORO:
case SHA512:
+ case ROYALAUTH:
+ case CRAZYCRYPT1:
case DOUBLEMD5:
case WORDPRESS:
case CUSTOM:
@@ -108,7 +114,7 @@ public class PasswordSecurity {
method = event.getMethod();
if (method == null)
throw new NoSuchAlgorithmException("Unknown hash algorithm");
- return method.getHash(password, salt);
+ return method.getHash(password, salt, playerName);
}
public static boolean comparePasswordWithHash(String password, String hash, String playerName) throws NoSuchAlgorithmException {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/BCRYPT.java b/src/main/java/fr/xephi/authme/security/crypts/BCRYPT.java
index da64eb13..ab470244 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/BCRYPT.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/BCRYPT.java
@@ -750,8 +750,35 @@ public class BCRYPT implements EncryptionMethod {
return (hashed.compareTo(hashpw(plaintext, hashed)) == 0);
}
+ /**
+ * Check that a text password matches a previously hashed
+ * one with the specified number of rounds using recursion
+ *
+ * @param text plaintext or hashed text
+ * @param hashed the previously-hashed password
+ * @param rounds number of rounds to hash the password
+ * @return
+ */
+ public static boolean checkpw(String text, String hashed, int rounds) {
+ boolean matched = false;
+
+ if (rounds > 0) {
+ String hash = hashpw(text, hashed);
+
+ if (rounds > 1) {
+ matched = checkpw(hash, hashed, rounds - 1);
+ } else {
+ matched = hash.compareTo(hashed) == 0;
+ }
+ } else {
+ matched = text.compareTo(hashed) == 0;
+ }
+
+ return matched;
+ }
+
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
return hashpw(password, salt);
}
@@ -761,4 +788,9 @@ public class BCRYPT implements EncryptionMethod {
String playerName) throws NoSuchAlgorithmException {
return checkpw(password, hash);
}
+
+ public static String getDoubleHash(String text, String salt) {
+ String hash = hashpw(text, salt);
+ return hashpw(text, hash);
+ }
}
diff --git a/src/main/java/fr/xephi/authme/security/crypts/CRAZYCRYPT1.java b/src/main/java/fr/xephi/authme/security/crypts/CRAZYCRYPT1.java
new file mode 100644
index 00000000..8bd4d83b
--- /dev/null
+++ b/src/main/java/fr/xephi/authme/security/crypts/CRAZYCRYPT1.java
@@ -0,0 +1,44 @@
+package fr.xephi.authme.security.crypts;
+
+import java.nio.charset.Charset;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+public class CRAZYCRYPT1 implements EncryptionMethod {
+
+ protected final Charset charset = Charset.forName("UTF-8");
+ private static final char[] CRYPTCHARS = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
+
+ @Override
+ public String getHash(String password, String salt, String name)
+ throws NoSuchAlgorithmException {
+ final String text = "ÜÄaeut//&/=I " + password + "7421€547" + name + "__+IÄIH§%NK " + password;
+ try
+ {
+ final MessageDigest md = MessageDigest.getInstance("SHA-512");
+ md.update(text.getBytes(charset), 0, text.length());
+ return byteArrayToHexString(md.digest());
+ }
+ catch (final NoSuchAlgorithmException e)
+ {
+ return null;
+ }
+ }
+
+ @Override
+ public boolean comparePassword(String hash, String password,
+ String playerName) throws NoSuchAlgorithmException {
+ return hash.equals(getHash(password, null, playerName));
+ }
+
+ public static String byteArrayToHexString(final byte... args)
+ {
+ final char[] chars = new char[args.length * 2];
+ for (int i = 0; i < args.length; i++) {
+ chars[i * 2] = CRYPTCHARS[(args[i] >> 4) & 0xF];
+ chars[i * 2 + 1] = CRYPTCHARS[(args[i]) & 0xF];
+ }
+ return new String(chars);
+ }
+
+}
diff --git a/src/main/java/fr/xephi/authme/security/crypts/CryptPBKDF2.java b/src/main/java/fr/xephi/authme/security/crypts/CryptPBKDF2.java
index 78f09c3d..f2673f73 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/CryptPBKDF2.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/CryptPBKDF2.java
@@ -9,7 +9,7 @@ import fr.xephi.authme.security.pbkdf2.PBKDF2Parameters;
public class CryptPBKDF2 implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
String result = "pbkdf2_sha256$10000$"+salt+"$";
PBKDF2Parameters params = new PBKDF2Parameters("HmacSHA256", "ASCII", salt.getBytes(), 10000);
diff --git a/src/main/java/fr/xephi/authme/security/crypts/DOUBLEMD5.java b/src/main/java/fr/xephi/authme/security/crypts/DOUBLEMD5.java
index 7ac3c0fc..e4c3caaf 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/DOUBLEMD5.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/DOUBLEMD5.java
@@ -7,7 +7,7 @@ import java.security.NoSuchAlgorithmException;
public class DOUBLEMD5 implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
return getMD5(getMD5(password));
}
@@ -15,7 +15,7 @@ public class DOUBLEMD5 implements EncryptionMethod {
@Override
public boolean comparePassword(String hash, String password,
String playerName) throws NoSuchAlgorithmException {
- return hash.equals(getHash(password, ""));
+ return hash.equals(getHash(password, "", ""));
}
private static String getMD5(String message) throws NoSuchAlgorithmException {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/EncryptionMethod.java b/src/main/java/fr/xephi/authme/security/crypts/EncryptionMethod.java
index d320eaa8..d5cd9562 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/EncryptionMethod.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/EncryptionMethod.java
@@ -16,7 +16,7 @@ public interface EncryptionMethod {
* @return Hashing password
* @throws NoSuchAlgorithmException
*/
- String getHash(String password, String salt) throws NoSuchAlgorithmException;
+ String getHash(String password, String salt, String name) throws NoSuchAlgorithmException;
/**
* @param hash
diff --git a/src/main/java/fr/xephi/authme/security/crypts/IPB3.java b/src/main/java/fr/xephi/authme/security/crypts/IPB3.java
index f350e081..1f944336 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/IPB3.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/IPB3.java
@@ -10,7 +10,7 @@ import fr.xephi.authme.AuthMe;
public class IPB3 implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
return getMD5(getMD5(salt) + getMD5(password));
}
@@ -19,7 +19,7 @@ public class IPB3 implements EncryptionMethod {
public boolean comparePassword(String hash, String password,
String playerName) throws NoSuchAlgorithmException {
String salt = AuthMe.getInstance().database.getAuth(playerName).getSalt();
- return hash.equals(getHash(password, salt));
+ return hash.equals(getHash(password, salt, playerName));
}
private static String getMD5(String message) throws NoSuchAlgorithmException {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/JOOMLA.java b/src/main/java/fr/xephi/authme/security/crypts/JOOMLA.java
index 0fdb95dd..9b20f35c 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/JOOMLA.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/JOOMLA.java
@@ -7,7 +7,7 @@ import java.security.NoSuchAlgorithmException;
public class JOOMLA implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
return getMD5(password + salt) + ":" + salt;
}
diff --git a/src/main/java/fr/xephi/authme/security/crypts/MD5.java b/src/main/java/fr/xephi/authme/security/crypts/MD5.java
index 33e4cf5e..9fd2d786 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/MD5.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/MD5.java
@@ -7,13 +7,13 @@ import java.security.NoSuchAlgorithmException;
public class MD5 implements EncryptionMethod {
@Override
- public String getHash(String password, String salt) throws NoSuchAlgorithmException {
+ public String getHash(String password, String salt, String name) throws NoSuchAlgorithmException {
return getMD5(password);
}
@Override
public boolean comparePassword(String hash, String password, String playerName) throws NoSuchAlgorithmException {
- return hash.equals(getHash(password, ""));
+ return hash.equals(getHash(password, "", ""));
}
private static String getMD5(String message) throws NoSuchAlgorithmException {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/MD5VB.java b/src/main/java/fr/xephi/authme/security/crypts/MD5VB.java
index 1ec31075..8b6df78a 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/MD5VB.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/MD5VB.java
@@ -7,7 +7,7 @@ import java.security.NoSuchAlgorithmException;
public class MD5VB implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
return "$MD5vb$" + salt + "$" + getMD5(getMD5(password) + salt);
}
@@ -16,7 +16,7 @@ public class MD5VB implements EncryptionMethod {
public boolean comparePassword(String hash, String password,
String playerName) throws NoSuchAlgorithmException {
String[] line = hash.split("\\$");
- return hash.equals(getHash(password, line[2]));
+ return hash.equals(getHash(password, line[2], ""));
}
private static String getMD5(String message) throws NoSuchAlgorithmException {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/MYBB.java b/src/main/java/fr/xephi/authme/security/crypts/MYBB.java
index 1ea28b46..9bd50bf7 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/MYBB.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/MYBB.java
@@ -10,7 +10,7 @@ import fr.xephi.authme.AuthMe;
public class MYBB implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
return getMD5(getMD5(salt)+ getMD5(password));
}
@@ -19,7 +19,7 @@ public class MYBB implements EncryptionMethod {
public boolean comparePassword(String hash, String password,
String playerName) throws NoSuchAlgorithmException {
String salt = AuthMe.getInstance().database.getAuth(playerName).getSalt();
- return hash.equals(getHash(password, salt));
+ return hash.equals(getHash(password, salt, playerName));
}
private static String getMD5(String message) throws NoSuchAlgorithmException {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/PHPBB.java b/src/main/java/fr/xephi/authme/security/crypts/PHPBB.java
index f85ff021..b965a7b4 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/PHPBB.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/PHPBB.java
@@ -151,7 +151,7 @@ private String _hash_gensalt_private(
}
@Override
-public String getHash(String password, String salt)
+public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
return phpbb_hash(password, salt);
}
diff --git a/src/main/java/fr/xephi/authme/security/crypts/PHPFUSION.java b/src/main/java/fr/xephi/authme/security/crypts/PHPFUSION.java
index b88a911e..e74b45fd 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/PHPFUSION.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/PHPFUSION.java
@@ -15,7 +15,7 @@ import fr.xephi.authme.AuthMe;
public class PHPFUSION implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
String digest = null;
String algo = "HmacSHA256";
@@ -45,7 +45,7 @@ public class PHPFUSION implements EncryptionMethod {
public boolean comparePassword(String hash, String password,
String playerName) throws NoSuchAlgorithmException {
String salt = AuthMe.getInstance().database.getAuth(playerName).getSalt();
- return hash.equals(getHash(password, salt));
+ return hash.equals(getHash(password, salt, ""));
}
private static String getSHA1(String message) throws NoSuchAlgorithmException {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/PLAINTEXT.java b/src/main/java/fr/xephi/authme/security/crypts/PLAINTEXT.java
index c69cada4..4562d7d5 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/PLAINTEXT.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/PLAINTEXT.java
@@ -5,7 +5,7 @@ import java.security.NoSuchAlgorithmException;
public class PLAINTEXT implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
return password;
}
diff --git a/src/main/java/fr/xephi/authme/security/crypts/ROYALAUTH.java b/src/main/java/fr/xephi/authme/security/crypts/ROYALAUTH.java
index 675cbd99..368514bb 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/ROYALAUTH.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/ROYALAUTH.java
@@ -6,20 +6,26 @@ import java.security.NoSuchAlgorithmException;
public class ROYALAUTH implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
- throws NoSuchAlgorithmException {
- MessageDigest md = MessageDigest.getInstance("SHA-512");
- md.update(password.getBytes());
- byte byteData[] = md.digest();
- StringBuilder sb = new StringBuilder();
- for (byte aByteData : byteData) sb.append(Integer.toString((aByteData & 0xff) + 0x100, 16).substring(1));
- return sb.toString();
+ public String getHash(String password, String salt, String name) throws NoSuchAlgorithmException {
+ String data = "";
+ for (int i = 0; i < 25; i++)
+ data = hash(data, salt);
+ return data;
+ }
+
+ public String hash(String password, String salt) throws NoSuchAlgorithmException {
+ MessageDigest md = MessageDigest.getInstance("SHA-512");
+ md.update(password.getBytes());
+ byte byteData[] = md.digest();
+ StringBuilder sb = new StringBuilder();
+ for (byte aByteData : byteData)
+ sb.append(Integer.toString((aByteData & 0xff) + 0x100, 16).substring(1));
+ return sb.toString();
}
@Override
- public boolean comparePassword(String hash, String password,
- String playerName) throws NoSuchAlgorithmException {
- return hash.equalsIgnoreCase(getHash(password, ""));
+ public boolean comparePassword(String hash, String password, String playerName) throws NoSuchAlgorithmException {
+ return hash.equalsIgnoreCase(getHash(password, "", ""));
}
}
diff --git a/src/main/java/fr/xephi/authme/security/crypts/SALTED2MD5.java b/src/main/java/fr/xephi/authme/security/crypts/SALTED2MD5.java
index bc1266d2..326f1f74 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/SALTED2MD5.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/SALTED2MD5.java
@@ -10,7 +10,7 @@ import fr.xephi.authme.AuthMe;
public class SALTED2MD5 implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
return getMD5(getMD5(password) + salt);
}
diff --git a/src/main/java/fr/xephi/authme/security/crypts/SHA1.java b/src/main/java/fr/xephi/authme/security/crypts/SHA1.java
index 056f9aa1..79d8b6f2 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/SHA1.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/SHA1.java
@@ -7,14 +7,14 @@ import java.security.NoSuchAlgorithmException;
public class SHA1 implements EncryptionMethod {
@Override
- public String getHash(String password, String salt) throws NoSuchAlgorithmException {
+ public String getHash(String password, String salt, String name) throws NoSuchAlgorithmException {
return getSHA1(password);
}
@Override
public boolean comparePassword(String hash, String password, String playerName)
throws NoSuchAlgorithmException {
- return hash.equals(getHash(password, ""));
+ return hash.equals(getHash(password, "", ""));
}
private static String getSHA1(String message) throws NoSuchAlgorithmException {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/SHA256.java b/src/main/java/fr/xephi/authme/security/crypts/SHA256.java
index e1808fbc..6b5d08b1 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/SHA256.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/SHA256.java
@@ -7,7 +7,7 @@ import java.security.NoSuchAlgorithmException;
public class SHA256 implements EncryptionMethod {
@Override
- public String getHash(String password, String salt) throws NoSuchAlgorithmException {
+ public String getHash(String password, String salt, String name) throws NoSuchAlgorithmException {
return "$SHA$" + salt + "$" + getSHA256(getSHA256(password) + salt);
}
@@ -15,7 +15,7 @@ public class SHA256 implements EncryptionMethod {
public boolean comparePassword(String hash, String password, String playerName)
throws NoSuchAlgorithmException {
String[] line = hash.split("\\$");
- return hash.equals(getHash(password, line[2]));
+ return hash.equals(getHash(password, line[2], ""));
}
private static String getSHA256(String message) throws NoSuchAlgorithmException {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/SHA512.java b/src/main/java/fr/xephi/authme/security/crypts/SHA512.java
index eb69a060..738ce5c2 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/SHA512.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/SHA512.java
@@ -7,7 +7,7 @@ import java.security.NoSuchAlgorithmException;
public class SHA512 implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
return getSHA512(password);
}
@@ -15,7 +15,7 @@ public class SHA512 implements EncryptionMethod {
@Override
public boolean comparePassword(String hash, String password,
String playerName) throws NoSuchAlgorithmException {
- return hash.equals(getHash(password, ""));
+ return hash.equals(getHash(password, "", ""));
}
private static String getSHA512(String message) throws NoSuchAlgorithmException {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/SMF.java b/src/main/java/fr/xephi/authme/security/crypts/SMF.java
index 16d726fc..6941b79d 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/SMF.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/SMF.java
@@ -7,15 +7,15 @@ import java.security.NoSuchAlgorithmException;
public class SMF implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
- return getSHA1(salt.toLowerCase() + password);
+ return getSHA1(name.toLowerCase() + password);
}
@Override
public boolean comparePassword(String hash, String password,
String playerName) throws NoSuchAlgorithmException {
- return hash.equals(getHash(password, playerName.toLowerCase()));
+ return hash.equals(getHash(password, null, playerName));
}
private static String getSHA1(String message) throws NoSuchAlgorithmException {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/WBB3.java b/src/main/java/fr/xephi/authme/security/crypts/WBB3.java
index 8a0a0e4d..7969df0b 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/WBB3.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/WBB3.java
@@ -10,7 +10,7 @@ import fr.xephi.authme.AuthMe;
public class WBB3 implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
return getSHA1(salt.concat(getSHA1(salt.concat(getSHA1(password)))));
}
@@ -19,7 +19,7 @@ public class WBB3 implements EncryptionMethod {
public boolean comparePassword(String hash, String password,
String playerName) throws NoSuchAlgorithmException {
String salt = AuthMe.getInstance().database.getAuth(playerName).getSalt();
- return hash.equals(getHash(password, salt));
+ return hash.equals(getHash(password, salt, ""));
}
private static String getSHA1(String message) throws NoSuchAlgorithmException {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/WBB4.java b/src/main/java/fr/xephi/authme/security/crypts/WBB4.java
new file mode 100644
index 00000000..895e52f4
--- /dev/null
+++ b/src/main/java/fr/xephi/authme/security/crypts/WBB4.java
@@ -0,0 +1,19 @@
+package fr.xephi.authme.security.crypts;
+
+import java.security.NoSuchAlgorithmException;
+
+public class WBB4 implements EncryptionMethod {
+
+ @Override
+ public String getHash(String password, String salt, String name)
+ throws NoSuchAlgorithmException {
+ return BCRYPT.getDoubleHash(password, salt);
+ }
+
+ @Override
+ public boolean comparePassword(String hash, String password,
+ String playerName) throws NoSuchAlgorithmException {
+ return BCRYPT.checkpw(password, hash, 2);
+ }
+
+}
diff --git a/src/main/java/fr/xephi/authme/security/crypts/WHIRLPOOL.java b/src/main/java/fr/xephi/authme/security/crypts/WHIRLPOOL.java
index d82b4840..8a58498f 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/WHIRLPOOL.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/WHIRLPOOL.java
@@ -408,7 +408,7 @@ public class WHIRLPOOL implements EncryptionMethod {
}
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
byte[] digest = new byte[DIGESTBYTES];
NESSIEinit();
@@ -420,6 +420,6 @@ public class WHIRLPOOL implements EncryptionMethod {
@Override
public boolean comparePassword(String hash, String password,
String playerName) throws NoSuchAlgorithmException {
- return hash.equals(getHash(password, ""));
+ return hash.equals(getHash(password, "", ""));
}
}
diff --git a/src/main/java/fr/xephi/authme/security/crypts/WORDPRESS.java b/src/main/java/fr/xephi/authme/security/crypts/WORDPRESS.java
index ebd9772a..3a525c8b 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/WORDPRESS.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/WORDPRESS.java
@@ -99,7 +99,7 @@ public class WORDPRESS implements EncryptionMethod {
}
@Override
- public String getHash(String password, String salt) throws NoSuchAlgorithmException {
+ public String getHash(String password, String salt, String name) throws NoSuchAlgorithmException {
byte random[] = new byte[6];
this.randomGen.nextBytes(random);
return crypt(password, gensaltPrivate(stringToUtf8(new String(random))));
diff --git a/src/main/java/fr/xephi/authme/security/crypts/XAUTH.java b/src/main/java/fr/xephi/authme/security/crypts/XAUTH.java
index 59af0eb9..2e4e7ba0 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/XAUTH.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/XAUTH.java
@@ -5,7 +5,7 @@ import java.security.NoSuchAlgorithmException;
public class XAUTH implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
String hash = getWhirlpool(salt + password).toLowerCase();
int saltPos = (password.length() >= hash.length() ? hash.length() - 1 : password.length());
@@ -17,7 +17,7 @@ public class XAUTH implements EncryptionMethod {
String playerName) throws NoSuchAlgorithmException {
int saltPos = (password.length() >= hash.length() ? hash.length() - 1 : password.length());
String salt = hash.substring(saltPos, saltPos + 12);
- return hash.equals(getHash(password, salt));
+ return hash.equals(getHash(password, salt, ""));
}
public static String getWhirlpool(String message) {
diff --git a/src/main/java/fr/xephi/authme/security/crypts/XF.java b/src/main/java/fr/xephi/authme/security/crypts/XF.java
index d522a413..9d954a36 100644
--- a/src/main/java/fr/xephi/authme/security/crypts/XF.java
+++ b/src/main/java/fr/xephi/authme/security/crypts/XF.java
@@ -13,7 +13,7 @@ import fr.xephi.authme.AuthMe;
public class XF implements EncryptionMethod {
@Override
- public String getHash(String password, String salt)
+ public String getHash(String password, String salt, String name)
throws NoSuchAlgorithmException {
return getSHA256(getSHA256(password) + regmatch("\"salt\";.:..:\"(.*)\";.:.:\"hashFunc\"", salt));
}
diff --git a/src/main/java/fr/xephi/authme/settings/Settings.java b/src/main/java/fr/xephi/authme/settings/Settings.java
index 5eb5b57b..6065777a 100644
--- a/src/main/java/fr/xephi/authme/settings/Settings.java
+++ b/src/main/java/fr/xephi/authme/settings/Settings.java
@@ -43,7 +43,6 @@ public final class Settings extends YamlConfiguration {
private final File file;
public static DataSourceType getDataSource;
public static HashAlgorithm getPasswordHash;
- public static HashAlgorithm rakamakHash;
public static Boolean useLogging = false;
public static int purgeDelay = 60;
public static List welcomeMsg = null;
@@ -60,7 +59,8 @@ public final class Settings extends YamlConfiguration {
disableSocialSpy, useMultiThreading, forceOnlyAfterLogin, useEssentialsMotd,
usePurge, purgePlayerDat, purgeEssentialsFile, supportOldPassword, purgeLimitedCreative,
purgeAntiXray, purgePermissions, enableProtection, enableAntiBot, recallEmail, useWelcomeMessage,
- broadcastWelcomeMessage, forceRegKick, forceRegLogin, checkVeryGames;
+ broadcastWelcomeMessage, forceRegKick, forceRegLogin, checkVeryGames, delayJoinMessage,
+ noTeleport;
public static String getNickRegex, getUnloggedinGroup, getMySQLHost, getMySQLPort,
getMySQLUsername, getMySQLPassword, getMySQLDatabase, getMySQLTablename,
@@ -178,7 +178,6 @@ public void loadConfigOptions() {
rakamakUsers = configFile.getString("Converter.Rakamak.fileName", "users.rak");
rakamakUsersIp = configFile.getString("Converter.Rakamak.ipFileName", "UsersIp.rak");
rakamakUseIp = configFile.getBoolean("Converter.Rakamak.useIp", false);
- rakamakHash = getRakamakHash();
noConsoleSpam = configFile.getBoolean("Security.console.noConsoleSpam", false);
removePassword = configFile.getBoolean("Security.console.removePassword", true);
getmailAccount = configFile.getString("Email.mailAccount", "");
@@ -244,6 +243,8 @@ public void loadConfigOptions() {
getMaxLoginPerIp = configFile.getInt("settings.restrictions.maxLoginPerIp", 0);
getMaxJoinPerIp = configFile.getInt("settings.restrictions.maxJoinPerIp", 0);
checkVeryGames = configFile.getBoolean("VeryGames.enableIpCheck", false);
+ delayJoinMessage = configFile.getBoolean("settings.delayJoinMessage", false);
+ noTeleport = configFile.getBoolean("settings.restrictions.noTeleport", false);
// Load the welcome message
getWelcomeMessage(plugin);
@@ -337,7 +338,6 @@ public static void reloadConfigOptions(YamlConfiguration newConfig) {
rakamakUsers = configFile.getString("Converter.Rakamak.fileName", "users.rak");
rakamakUsersIp = configFile.getString("Converter.Rakamak.ipFileName", "UsersIp.rak");
rakamakUseIp = configFile.getBoolean("Converter.Rakamak.useIp", false);
- rakamakHash = getRakamakHash();
noConsoleSpam = configFile.getBoolean("Security.console.noConsoleSpam", false);
removePassword = configFile.getBoolean("Security.console.removePassword", true);
getmailAccount = configFile.getString("Email.mailAccount", "");
@@ -403,6 +403,8 @@ public static void reloadConfigOptions(YamlConfiguration newConfig) {
getMaxLoginPerIp = configFile.getInt("settings.restrictions.maxLoginPerIp", 0);
getMaxJoinPerIp = configFile.getInt("settings.restrictions.maxJoinPerIp", 0);
checkVeryGames = configFile.getBoolean("VeryGames.enableIpCheck", false);
+ delayJoinMessage = configFile.getBoolean("settings.delayJoinMessage", false);
+ noTeleport = configFile.getBoolean("settings.restrictions.noTeleport", false);
// Reload the welcome message
getWelcomeMessage(AuthMe.getInstance());
@@ -505,10 +507,20 @@ public static void reloadConfigOptions(YamlConfiguration newConfig) {
}
if(getString("settings.restrictions.allowedNicknameCharacters").equals("[a-zA-Z0-9_?]*"))
set("settings.restrictions.allowedNicknameCharacters", "[a-zA-Z0-9_]*");
+ if(!contains("settings.delayJoinMessage")) {
+ set("settings.delayJoinMessage", false);
+ changes = true;
+ }
+ if(!contains("settings.restrictions.noTeleport")) {
+ set("settings.restrictions.noTeleport", false);
+ changes = true;
+ }
+ if(contains("Converter.Rakamak.newPasswordHash"))
+ set("Converter.Rakamak.newPasswordHash", null);
if (changes) {
- plugin.getLogger().warning("Merge new Config Options if needed..");
- plugin.getLogger().warning("Please check your config.yml file!");
+ plugin.getLogger().warning("Merge new Config Options - I'm not an error, please don't report me");
+ plugin.getLogger().warning("Please check your config.yml file for new configs!");
}
plugin.saveConfig();
@@ -525,17 +537,6 @@ public static void reloadConfigOptions(YamlConfiguration newConfig) {
}
}
- private static HashAlgorithm getRakamakHash() {
- String key = "Converter.Rakamak.newPasswordHash";
-
- try {
- return HashAlgorithm.valueOf(configFile.getString(key,"SHA256").toUpperCase());
- } catch (IllegalArgumentException ex) {
- ConsoleLogger.showError("Unknown Hash Algorithm; defaulting to SHA256");
- return HashAlgorithm.SHA256;
- }
- }
-
private static DataSourceType getDataSource() {
String key = "DataSource.backend";
try {
diff --git a/src/main/java/fr/xephi/authme/threads/MySQLThread.java b/src/main/java/fr/xephi/authme/threads/MySQLThread.java
index 53f498d5..59a13062 100644
--- a/src/main/java/fr/xephi/authme/threads/MySQLThread.java
+++ b/src/main/java/fr/xephi/authme/threads/MySQLThread.java
@@ -264,7 +264,7 @@ public class MySQLThread extends Thread implements DataSource {
PreparedStatement pst = null;
try {
con = makeSureConnectionIsReady();
- if ((columnSalt == null || columnSalt.isEmpty()) && (auth.getSalt() == null || auth.getSalt().isEmpty())) {
+ if ((columnSalt == null || columnSalt.isEmpty()) || (auth.getSalt() == null || auth.getSalt().isEmpty())) {
pst = con.prepareStatement("INSERT INTO " + tableName + "(" + columnName + "," + columnPassword + "," + columnIp + "," + columnLastLogin + ") VALUES (?,?,?,?);");
pst.setString(1, auth.getNickname());
pst.setString(2, auth.getHash());
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index 744878b9..70a991e6 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -162,6 +162,8 @@ settings:
maxLoginPerIp: 0
# Maximum Join authorized by IP
maxJoinPerIp: 0
+ # AuthMe will NEVER teleport players !
+ noTeleport: false
GameMode:
# ForceSurvivalMode to player when join ?
ForceSurvivalMode: false
@@ -254,6 +256,8 @@ settings:
useWelcomeMessage: true
# Do we need to broadcast the welcome message to all server or only to the player? set true for server or false for player
broadcastWelcomeMessage: false
+ # Do we need to delay the X has joined the game after /login ?
+ delayJoinMessage: false
ExternalBoardOptions:
# MySQL column for the salt , needed for some forum/cms support
mySQLColumnSalt: ''
@@ -325,11 +329,6 @@ Converter:
useIP: false
# IP file name for rakamak
ipFileName: UsersIp.rak
- # possible values: MD5, SHA1, SHA256, WHIRLPOOL, XAUTH, MD5VB, PHPBB,
- # PLAINTEXT ( unhashed password),
- # MYBB, IPB3, PHPFUSION, SMF, XENFORO, SALTED2MD5, JOOMLA, BCRYPT, WBB3, SHA512,
- # DOUBLEMD5, PBKDF2, WORDPRESS, CUSTOM(for developpers only)
- newPasswordHash: SHA256
Email:
# Email SMTP server host
mailSMTP: smtp.gmail.com
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index e4092e34..13b85402 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.6
+version: 3.4
softdepend: [Vault, ChestShop, Spout, Multiverse-Core, Notifications, Citizens, CombatTag, Essentials, EssentialsSpawn]
commands:
register: