Update 2.8

* Update to CB 1.5.2-R1.0
* Add multi-world support in databases
* Add multi-plugins spawns support : in this order :
BukkitWorldSpawn(default) < Multiverse-Core < EssentialsSpawn <
Authme(/authme setspawn)
* Add BCRYPT passwordhashing method
* Set the Email method to HTML ! you can now send html email correctly
:)
* Some fix with BungeeCord
* Some fix with inventory security ( i recommend you to disable
ProtectInventoryBeforeLogin if you encounter issues , all inventory
click method are now cancelled )
* Add a separate thread for /login command (enable multi-threading in
config file)
* Add a separate thead for /register command (enable multi-threading in
config file)
* Add isRegistered(String playerName) in the API
* Some other code reworks
* Some other debugs
* Re-Indent code
This commit is contained in:
Xephi 2013-06-20 02:15:27 +02:00
parent 0d47578323
commit d699f86cc7
37 changed files with 2957 additions and 899 deletions

View File

@ -28,12 +28,12 @@
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
<version>2.7.16b4</version> <version>2.8</version>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId> <artifactId>bukkit</artifactId>
<version>1.5.2-R0.1</version> <version>1.5.2-R1.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.milkbowl.vault</groupId> <groupId>net.milkbowl.vault</groupId>

View File

@ -19,8 +19,10 @@ package uk.org.whoami.authme;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Random; import java.util.Random;
import com.earth2me.essentials.Essentials; import com.earth2me.essentials.Essentials;
@ -59,6 +61,7 @@ import uk.org.whoami.authme.listener.AuthMeSpoutListener;
import uk.org.whoami.authme.plugin.manager.BungeeCordMessage; import uk.org.whoami.authme.plugin.manager.BungeeCordMessage;
import uk.org.whoami.authme.plugin.manager.CitizensCommunicator; import uk.org.whoami.authme.plugin.manager.CitizensCommunicator;
import uk.org.whoami.authme.plugin.manager.CombatTagComunicator; import uk.org.whoami.authme.plugin.manager.CombatTagComunicator;
import uk.org.whoami.authme.plugin.manager.EssSpawn;
import uk.org.whoami.authme.settings.Messages; import uk.org.whoami.authme.settings.Messages;
import uk.org.whoami.authme.settings.PlayersLogs; import uk.org.whoami.authme.settings.PlayersLogs;
import uk.org.whoami.authme.settings.Settings; import uk.org.whoami.authme.settings.Settings;
@ -68,13 +71,13 @@ import net.citizensnpcs.Citizens;
import net.milkbowl.vault.permission.Permission; import net.milkbowl.vault.permission.Permission;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Server; import org.bukkit.Server;
import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.MultiverseCore;
import uk.org.whoami.authme.commands.PasspartuCommand; import uk.org.whoami.authme.commands.PasspartuCommand;
import uk.org.whoami.authme.datasource.SqliteDataSource; import uk.org.whoami.authme.datasource.SqliteDataSource;
import uk.org.whoami.authme.filter.ConsoleFilter;
public class AuthMe extends JavaPlugin { public class AuthMe extends JavaPlugin {
@ -82,7 +85,6 @@ public class AuthMe extends JavaPlugin {
private Settings settings; private Settings settings;
private Messages m; private Messages m;
private PlayersLogs pllog; private PlayersLogs pllog;
public Management management;
public static Server server; public static Server server;
public static Plugin authme; public static Plugin authme;
public static Permission permission; public static Permission permission;
@ -99,10 +101,13 @@ public class AuthMe extends JavaPlugin {
public Essentials ess; public Essentials ess;
public Notifications notifications; public Notifications notifications;
public API api; public API api;
public Management management;
public HashMap<String, Integer> captcha = new HashMap<String, Integer>(); public HashMap<String, Integer> captcha = new HashMap<String, Integer>();
public HashMap<String, String> cap = new HashMap<String, String>(); public HashMap<String, String> cap = new HashMap<String, String>();
public HashMap<String, String> realIp = new HashMap<String, String>(); public HashMap<String, String> realIp = new HashMap<String, String>();
public List<String> premium = new ArrayList<String>();
public MultiverseCore mv = null; public MultiverseCore mv = null;
public Location essentialsSpawn;
@Override @Override
public void onEnable() { public void onEnable() {
@ -238,9 +243,11 @@ public class AuthMe extends JavaPlugin {
database = new CacheDataSource(this, database); database = new CacheDataSource(this, database);
} }
// Setup API
api = new API(this, database); api = new API(this, database);
management = new Management(database, this); // Setup Management
management = new Management(database, this);
PluginManager pm = getServer().getPluginManager(); PluginManager pm = getServer().getPluginManager();
if (pm.isPluginEnabled("Spout")) { if (pm.isPluginEnabled("Spout")) {
@ -368,6 +375,10 @@ public class AuthMe extends JavaPlugin {
ess = null; ess = null;
} }
} }
if (this.getServer().getPluginManager().getPlugin("EssentialsSpawn") != null && this.getServer().getPluginManager().getPlugin("EssentialsSpawn").isEnabled()) {
this.essentialsSpawn = new EssSpawn().getLocation();
ConsoleLogger.info("Hook with EssentialsSpawn plugin");
}
} }
private void checkNotifications() { private void checkNotifications() {
@ -461,7 +472,7 @@ public class AuthMe extends JavaPlugin {
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
if ((PlayerCache.getInstance().isAuthenticated(name)) && (!player.isDead()) && if ((PlayerCache.getInstance().isAuthenticated(name)) && (!player.isDead()) &&
(Settings.isSaveQuitLocationEnabled.booleanValue())) { (Settings.isSaveQuitLocationEnabled.booleanValue())) {
final PlayerAuth auth = new PlayerAuth(player.getName().toLowerCase(), (int)player.getLocation().getX(), (int)player.getLocation().getY(), (int)player.getLocation().getZ()); final PlayerAuth auth = new PlayerAuth(player.getName().toLowerCase(), (int)player.getLocation().getX(), (int)player.getLocation().getY(), (int)player.getLocation().getZ(), player.getWorld().getName());
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override @Override
public void run() { public void run() {

View File

@ -0,0 +1,30 @@
package uk.org.whoami.authme;
import java.util.logging.Filter;
import java.util.logging.LogRecord;
/**
*
* @author Xephi59
*/
public class ConsoleFilter implements Filter {
public ConsoleFilter() {}
@Override
public boolean isLoggable(LogRecord record) {
try {
if (record == null || record.getMessage() == null) return true;
String logM = record.getMessage().toLowerCase();
if (!logM.contains("issued server command:")) return true;
if (!logM.contains("/login ") && !logM.contains("/l ") && !logM.contains("/reg ") && !logM.contains("/changepassword ") && !logM.contains("/unregister ")
&& !logM.contains("/authme register ") && !logM.contains("/authme changepassword ")&& !logM.contains("/authme reg ")&& !logM.contains("/authme cp ") && !logM.contains("/register ")) return true;
String playername = record.getMessage().split(" ")[0];
record.setMessage(playername + " issued an AuthMe command!");
return true;
} catch (NullPointerException npe) {
return true;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,7 @@
package uk.org.whoami.authme; package uk.org.whoami.authme;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties; import java.util.Properties;
import javax.mail.Message; import javax.mail.Message;
import javax.mail.MessagingException; import javax.mail.MessagingException;
@ -62,11 +63,12 @@ public class SendMailSSL {
message.setRecipients(Message.RecipientType.TO, message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(auth.getEmail())); InternetAddress.parse(auth.getEmail()));
message.setSubject(Settings.getMailSubject); message.setSubject(Settings.getMailSubject);
message.setSentDate(new Date());
String text = Settings.getMailText; String text = Settings.getMailText;
text = text.replaceAll("<playername>", auth.getNickname()); text = text.replaceAll("<playername>", auth.getNickname());
text = text.replaceAll("<servername>", instance.getServer().getServerName()); text = text.replaceAll("<servername>", instance.getServer().getServerName());
text = text.replaceAll("<generatedpass>", newPass); text = text.replaceAll("<generatedpass>", newPass);
message.setText(text); message.setContent(text, "text/html");
Bukkit.getScheduler().runTaskAsynchronously(instance, new Runnable() { Bukkit.getScheduler().runTaskAsynchronously(instance, new Runnable() {
@Override @Override
public void run() { public void run() {

View File

@ -114,11 +114,20 @@ public class Utils {
} return false; } return false;
} }
public void packCoords(int x, int y, int z, final Player pl) public void packCoords(int x, int y, int z, String w, final Player pl)
{ {
final World world = pl.getWorld(); World theWorld;
if (w.equals("unavailableworld")) {
theWorld = pl.getWorld();
} else {
theWorld = Bukkit.getWorld(w);
}
if (theWorld == null)
theWorld = pl.getWorld();
final World world = theWorld;
final int fY = y; final int fY = y;
final Location loc = new Location(world, x, y + 0.6D, z); final Location locat = new Location(world, x, y + 0.6D, z);
final Location loc = locat.getBlock().getLocation();
Bukkit.getScheduler().runTask(AuthMe.getInstance(), new Runnable() { Bukkit.getScheduler().runTask(AuthMe.getInstance(), new Runnable() {
@ -132,7 +141,7 @@ public class Utils {
pl.teleport(tpEvent.getTo()); pl.teleport(tpEvent.getTo());
} }
} }
}); });
id = Bukkit.getScheduler().runTaskTimer(AuthMe.authme, new Runnable() id = Bukkit.getScheduler().runTaskTimer(AuthMe.authme, new Runnable()
@ -146,12 +155,11 @@ public class Utils {
} }
} }
}, 1L, 20L); }, 1L, 20L);
Bukkit.getScheduler().runTaskLaterAsynchronously(AuthMe.authme, new Runnable() Bukkit.getScheduler().runTaskLater(AuthMe.authme, new Runnable()
{ {
@Override @Override
public void run() { public void run() {
id.cancel(); id.cancel();
} }
}, 60L); }, 60L);
} }

View File

@ -131,7 +131,7 @@ public class API {
PlayerAuth auth = PlayerCache.getInstance().getAuth(player.getName()); PlayerAuth auth = PlayerCache.getInstance().getAuth(player.getName());
if (auth != null) { if (auth != null) {
Location loc = new Location(player.getWorld(), auth.getQuitLocX(), auth.getQuitLocY() , auth.getQuitLocZ()); Location loc = new Location(Bukkit.getWorld(auth.getWorld()), auth.getQuitLocX(), auth.getQuitLocY() , auth.getQuitLocZ());
return loc; return loc;
} else { } else {
return null; return null;
@ -182,5 +182,17 @@ public class API {
} }
}); });
} }
/**
*
* @param playerName
* @return true if player is registered
*/
public static boolean isRegistered(String playerName) {
PlayerAuth auth = PlayerCache.getInstance().getAuth(playerName);
if (auth != null)
return true;
return false;
}
} }

View File

@ -28,6 +28,7 @@ public class PlayerAuth {
private int x = 0; private int x = 0;
private int y = 0; private int y = 0;
private int z = 0; private int z = 0;
private String world = "world";
private String salt = ""; private String salt = "";
private String vBhash = null; private String vBhash = null;
private int groupId; private int groupId;
@ -48,14 +49,15 @@ public class PlayerAuth {
this.email = email; this.email = email;
} }
public PlayerAuth(String nickname, int x, int y, int z) { public PlayerAuth(String nickname, int x, int y, int z, String world) {
this.nickname = nickname; this.nickname = nickname;
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
this.world = world;
} }
public PlayerAuth(String nickname, String hash, String ip, long lastLogin, int x, int y, int z, String email) { public PlayerAuth(String nickname, String hash, String ip, long lastLogin, int x, int y, int z, String world, String email) {
this.nickname = nickname; this.nickname = nickname;
this.hash = hash; this.hash = hash;
this.ip = ip; this.ip = ip;
@ -63,17 +65,19 @@ public class PlayerAuth {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
this.world = world;
this.email = email; this.email = email;
} }
public PlayerAuth(String nickname, String hash, String salt, int groupId, String ip, long lastLogin, int x, int y, int z, String email) { public PlayerAuth(String nickname, String hash, String salt, int groupId, String ip, long lastLogin, int x, int y, int z, String world, String email) {
this.nickname = nickname; this.nickname = nickname;
this.hash = hash; this.hash = hash;
this.ip = ip; this.ip = ip;
this.lastLogin = lastLogin; this.lastLogin = lastLogin;
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
this.world = world;
this.salt = salt; this.salt = salt;
this.groupId = groupId; this.groupId = groupId;
this.email = email; this.email = email;
@ -96,19 +100,7 @@ public class PlayerAuth {
this.salt = salt; this.salt = salt;
} }
public PlayerAuth(String nickname, String hash, String salt, String ip, long lastLogin, int x, int y, int z, String email) { public PlayerAuth(String nickname, String hash, String salt, String ip, long lastLogin, int x, int y, int z, String world, String email) {
this.nickname = nickname;
this.hash = hash;
this.ip = ip;
this.lastLogin = lastLogin;
this.x = x;
this.y = y;
this.z = z;
this.salt = salt;
this.email = email;
}
public PlayerAuth(String nickname, String hash, String ip, long lastLogin, int x, int y, int z) {
this.nickname = nickname; this.nickname = nickname;
this.hash = hash; this.hash = hash;
this.ip = ip; this.ip = ip;
@ -116,6 +108,20 @@ public class PlayerAuth {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
this.world = world;
this.salt = salt;
this.email = email;
}
public PlayerAuth(String nickname, String hash, String ip, long lastLogin, int x, int y, int z, String world) {
this.nickname = nickname;
this.hash = hash;
this.ip = ip;
this.lastLogin = lastLogin;
this.x = x;
this.y = y;
this.z = z;
this.world = world;
this.email = "your@email.com"; this.email = "your@email.com";
} }
@ -207,4 +213,12 @@ public class PlayerAuth {
return hashCode; return hashCode;
} }
public void setWorld(String world) {
this.world = world;
}
public String getWorld() {
return world;
}
} }

View File

@ -28,6 +28,7 @@ import uk.org.whoami.authme.cache.backup.FileCache;
import uk.org.whoami.authme.events.ResetInventoryEvent; import uk.org.whoami.authme.events.ResetInventoryEvent;
import uk.org.whoami.authme.events.StoreInventoryEvent; import uk.org.whoami.authme.events.StoreInventoryEvent;
import uk.org.whoami.authme.settings.Settings; import uk.org.whoami.authme.settings.Settings;
import uk.org.whoami.authme.settings.Spawn;
public class LimboCache { public class LimboCache {
@ -97,6 +98,8 @@ public class LimboCache {
loc = plugin.mv.getMVWorldManager().getMVWorld(player.getWorld().getName()).getSpawnLocation(); loc = plugin.mv.getMVWorldManager().getMVWorld(player.getWorld().getName()).getSpawnLocation();
} catch (NullPointerException npe) {} } catch (NullPointerException npe) {}
} }
if (Spawn.getInstance().getLocation() != null)
loc = Spawn.getInstance().getLocation();
} }
try { try {
if(cache.containsKey(name) && playerGroup.isEmpty()) { if(cache.containsKey(name) && playerGroup.isEmpty()) {

View File

@ -103,11 +103,11 @@ public class EmailCommand implements CommandExecutor {
} else if(args[0].equalsIgnoreCase("change") && args.length == 3 ) { } else if(args[0].equalsIgnoreCase("change") && args.length == 3 ) {
if(PlayerCache.getInstance().isAuthenticated(name)) { if(PlayerCache.getInstance().isAuthenticated(name)) {
PlayerAuth auth = PlayerCache.getInstance().getAuth(name); PlayerAuth auth = PlayerCache.getInstance().getAuth(name);
if (auth.getEmail() == null || auth.getEmail() == "your@email.com") { if (auth.getEmail() == null || auth.getEmail().equals("your@email.com")) {
player.sendMessage("[AuthMe] Please use : /email add <email> <confirmEmail>"); player.sendMessage("[AuthMe] Please use : /email add <email> <confirmEmail>");
return true; return true;
} }
if (args[1] != auth.getEmail()) { if (!args[1].equals(auth.getEmail())) {
player.sendMessage("[AuthMe] Invalid Email !"); player.sendMessage("[AuthMe] Invalid Email !");
return true; return true;
} }
@ -161,7 +161,7 @@ public class EmailCommand implements CommandExecutor {
sender.sendMessage(m._("unknown_user")); sender.sendMessage(m._("unknown_user"));
return true; return true;
} }
if (Settings.getmailAccount == "" || Settings.getmailAccount.isEmpty()) { if (Settings.getmailAccount.equals("") || Settings.getmailAccount.isEmpty()) {
player.sendMessage(m._("error")); player.sendMessage(m._("error"));
return true; return true;
} }

View File

@ -23,6 +23,8 @@ import org.bukkit.entity.Player;
import uk.org.whoami.authme.AuthMe; import uk.org.whoami.authme.AuthMe;
import uk.org.whoami.authme.settings.Messages; import uk.org.whoami.authme.settings.Messages;
import uk.org.whoami.authme.settings.Settings;
import uk.org.whoami.authme.threads.LoginThread;
public class LoginCommand implements CommandExecutor { public class LoginCommand implements CommandExecutor {
@ -50,8 +52,12 @@ public class LoginCommand implements CommandExecutor {
player.sendMessage(m._("no_perm")); player.sendMessage(m._("no_perm"));
return true; return true;
} }
if (Settings.useMultiThreading) {
plugin.management.performLogin(player, args[0]); plugin.management.performLogin(player, args[0], false);
} else {
Thread mThread = new LoginThread(plugin.database, plugin, player, args[0]);
mThread.run();
}
return true; return true;
} }
} }

View File

@ -94,6 +94,9 @@ public class LogoutCommand implements CommandExecutor {
} }
if (Settings.isTeleportToSpawnEnabled) { if (Settings.isTeleportToSpawnEnabled) {
Location spawnLoc = player.getWorld().getSpawnLocation(); Location spawnLoc = player.getWorld().getSpawnLocation();
if (plugin.essentialsSpawn != null) {
spawnLoc = plugin.essentialsSpawn;
}
if (Spawn.getInstance().getLocation() != null) if (Spawn.getInstance().getLocation() != null)
spawnLoc = Spawn.getInstance().getLocation(); spawnLoc = Spawn.getInstance().getLocation();
AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, spawnLoc); AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(player, spawnLoc);

View File

@ -10,11 +10,12 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import uk.org.whoami.authme.AuthMe; import uk.org.whoami.authme.AuthMe;
import uk.org.whoami.authme.Management;
import uk.org.whoami.authme.Utils; import uk.org.whoami.authme.Utils;
import uk.org.whoami.authme.cache.auth.PlayerCache; import uk.org.whoami.authme.cache.auth.PlayerCache;
import uk.org.whoami.authme.datasource.DataSource; import uk.org.whoami.authme.datasource.DataSource;
import uk.org.whoami.authme.settings.Messages; import uk.org.whoami.authme.settings.Messages;
import uk.org.whoami.authme.settings.Settings;
import uk.org.whoami.authme.threads.LoginThread;
/** /**
* *
@ -46,9 +47,13 @@ public class PasspartuCommand implements CommandExecutor {
if ((sender instanceof Player) && args.length == 1) { if ((sender instanceof Player) && args.length == 1) {
if(utils.readToken(args[0])) { if(utils.readToken(args[0])) {
//bypass login! //bypass login!
Management bypass = new Management(database,true, plugin); if (Settings.useMultiThreading) {
bypass.performLogin((Player)sender, "dontneed"); Thread bypass = new LoginThread(database, false, plugin, (Player) sender, "dontneed");
return true; bypass.run();
} else {
plugin.management.performLogin((Player) sender, "dontneed", true);
}
return true;
} }
sender.sendMessage("Time is expired or Token is Wrong!"); sender.sendMessage("Time is expired or Token is Wrong!");
return true; return true;

View File

@ -48,6 +48,7 @@ import uk.org.whoami.authme.settings.Settings;
import uk.org.whoami.authme.settings.Spawn; import uk.org.whoami.authme.settings.Spawn;
import uk.org.whoami.authme.task.MessageTask; import uk.org.whoami.authme.task.MessageTask;
import uk.org.whoami.authme.task.TimeoutTask; import uk.org.whoami.authme.task.TimeoutTask;
import uk.org.whoami.authme.threads.RegisterThread;
public class RegisterCommand implements CommandExecutor { public class RegisterCommand implements CommandExecutor {
@ -85,125 +86,218 @@ public class RegisterCommand implements CommandExecutor {
} }
final String ip = ipA; final String ip = ipA;
if (PlayerCache.getInstance().isAuthenticated(name)) {
player.sendMessage(m._("logged_in")); if (Settings.useMultiThreading) {
return true; Thread register = new RegisterThread(plugin, database, player, ip, args);
} register.run();
return true;
if (!Settings.isRegistrationEnabled) { } else {
player.sendMessage(m._("reg_disabled")); if (PlayerCache.getInstance().isAuthenticated(name)) {
return true; player.sendMessage(m._("logged_in"));
}
if (database.isAuthAvailable(player.getName().toLowerCase())) {
player.sendMessage(m._("user_regged"));
if (pllog.getStringList("players").contains(player.getName())) {
pllog.getStringList("players").remove(player.getName());
}
return true;
}
if(Settings.getmaxRegPerIp > 0 ){
if(!plugin.authmePermissible(sender, "authme.allow2accounts") && database.getAllAuthsByIp(ipA).size() >= Settings.getmaxRegPerIp) {
player.sendMessage(m._("max_reg"));
return true; return true;
} }
}
if(Settings.emailRegistration && !Settings.getmailAccount.isEmpty()) { if (!Settings.isRegistrationEnabled) {
if(!args[0].contains("@")) { player.sendMessage(m._("reg_disabled"));
return true;
}
if (database.isAuthAvailable(player.getName().toLowerCase())) {
player.sendMessage(m._("user_regged"));
if (pllog.getStringList("players").contains(player.getName())) {
pllog.getStringList("players").remove(player.getName());
}
return true;
}
if(Settings.getmaxRegPerIp > 0 ){
if(!plugin.authmePermissible(sender, "authme.allow2accounts") && database.getAllAuthsByIp(ipA).size() >= Settings.getmaxRegPerIp) {
player.sendMessage(m._("max_reg"));
return true;
}
}
if(Settings.emailRegistration && !Settings.getmailAccount.isEmpty()) {
if(!args[0].contains("@")) {
player.sendMessage(m._("usage_reg"));
return true;
}
if(Settings.doubleEmailCheck) {
if(args.length < 2) {
player.sendMessage(m._("usage_reg"));
return true;
}
if(!args[0].equals(args[1])) {
player.sendMessage(m._("usage_reg"));
return true;
}
}
final String email = args[0];
if(Settings.getmaxRegPerEmail > 0) {
if (!plugin.authmePermissible(sender, "authme.allow2accounts") && database.getAllAuthsByEmail(email).size() >= Settings.getmaxRegPerEmail) {
player.sendMessage(m._("max_reg"));
return true;
}
}
RandomString rand = new RandomString(Settings.getRecoveryPassLength);
final String thePass = rand.nextString();
if (!thePass.isEmpty()) {
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
if (PasswordSecurity.userSalt.containsKey(name)) {
try {
final String hashnew = PasswordSecurity.getHash(Settings.getPasswordHash, thePass, name);
final PlayerAuth fAuth = new PlayerAuth(name, hashnew, PasswordSecurity.userSalt.get(name), ip, new Date().getTime(), (int) player.getLocation().getX() , (int) player.getLocation().getY(), (int) player.getLocation().getZ(), player.getLocation().getWorld().getName(), email);
database.saveAuth(fAuth);
database.updateEmail(fAuth);
database.updateSession(fAuth);
plugin.mail.main(fAuth, thePass);
} catch (NoSuchAlgorithmException e) {
ConsoleLogger.showError(e.getMessage());
}
} else {
try {
final String hashnew = PasswordSecurity.getHash(Settings.getPasswordHash, thePass, name);
final PlayerAuth fAuth = new PlayerAuth(name, hashnew, ip, new Date().getTime(), (int) player.getLocation().getX() , (int) player.getLocation().getY(), (int) player.getLocation().getZ(), player.getLocation().getWorld().getName(), email);
database.saveAuth(fAuth);
database.updateEmail(fAuth);
database.updateSession(fAuth);
plugin.mail.main(fAuth, thePass);
} catch (NoSuchAlgorithmException e) {
ConsoleLogger.showError(e.getMessage());
}
}
}
});
if(!Settings.getRegisteredGroup.isEmpty()){
Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED);
}
player.sendMessage(m._("vb_nonActiv"));
String msg = m._("login_msg");
int time = Settings.getRegistrationTimeout * 20;
int msgInterval = Settings.getWarnMessageInterval;
if (time != 0) {
Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getTimeoutTaskId());
BukkitTask id = Bukkit.getScheduler().runTaskLater(plugin, new TimeoutTask(plugin, name), time);
LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id.getTaskId());
}
Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getMessageTaskId());
BukkitTask nwMsg = Bukkit.getScheduler().runTask(plugin, new MessageTask(plugin, name, msg, msgInterval));
LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(nwMsg.getTaskId());
LimboCache.getInstance().deleteLimboPlayer(name);
if (Settings.isTeleportToSpawnEnabled) {
World world = player.getWorld();
Location loca = world.getSpawnLocation();
if (plugin.mv != null) {
try {
loca = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation();
} catch (NullPointerException npe) {
} catch (ClassCastException cce) {
} catch (NoClassDefFoundError ncdfe) {
}
}
if (plugin.essentialsSpawn != null) {
loca = plugin.essentialsSpawn;
}
if (Spawn.getInstance().getLocation() != null)
loca = Spawn.getInstance().getLocation();
RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, loca);
plugin.getServer().getPluginManager().callEvent(tpEvent);
if(!tpEvent.isCancelled()) {
if (!tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).isLoaded()) {
tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).load();
}
player.teleport(tpEvent.getTo());
}
}
this.isFirstTimeJoin = true;
player.saveData();
if (!Settings.noConsoleSpam)
ConsoleLogger.info(player.getName() + " registered "+player.getAddress().getAddress().getHostAddress());
if(plugin.notifications != null) {
plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " has registered!"));
}
return true;
}
}
if (args.length == 0 || (Settings.getEnablePasswordVerifier && args.length < 2) ) {
player.sendMessage(m._("usage_reg")); player.sendMessage(m._("usage_reg"));
return true; return true;
} }
if(Settings.doubleEmailCheck) {
if(args.length < 2) { if(args[0].length() < Settings.getPasswordMinLen || args[0].length() > Settings.passwordMaxLength) {
player.sendMessage(m._("usage_reg")); player.sendMessage(m._("pass_len"));
return true;
}
try {
String hash;
if(Settings.getEnablePasswordVerifier) {
if (args[0].equals(args[1])) {
hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name);
} else {
player.sendMessage(m._("password_error"));
return true;
}
} else
hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name);
if (Settings.getMySQLColumnSalt.isEmpty())
{
auth = new PlayerAuth(name, hash, ip, new Date().getTime());
} else {
auth = new PlayerAuth(name, hash, PasswordSecurity.userSalt.get(name), ip, new Date().getTime());
}
if (!database.saveAuth(auth)) {
player.sendMessage(m._("error"));
return true; return true;
} }
if(!args[0].equals(args[1])) { PlayerCache.getInstance().addPlayer(auth);
player.sendMessage(m._("usage_reg")); LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name);
return true; if (limbo != null) {
} player.setGameMode(GameMode.getByValue(limbo.getGameMode()));
} if (Settings.isTeleportToSpawnEnabled) {
final String email = args[0]; World world = player.getWorld();
if(Settings.getmaxRegPerEmail > 0) { Location loca = world.getSpawnLocation();
if (!plugin.authmePermissible(sender, "authme.allow2accounts") && database.getAllAuthsByEmail(email).size() >= Settings.getmaxRegPerEmail) { if (plugin.mv != null) {
player.sendMessage(m._("max_reg")); try {
return true; loca = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation();
} } catch (NullPointerException npe) {
}
RandomString rand = new RandomString(Settings.getRecoveryPassLength); } catch (ClassCastException cce) {
final String thePass = rand.nextString();
if (!thePass.isEmpty()) { } catch (NoClassDefFoundError ncdfe) {
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override }
public void run() { }
if (PasswordSecurity.userSalt.containsKey(name)) { if (plugin.essentialsSpawn != null) {
try { loca = plugin.essentialsSpawn;
final String hashnew = PasswordSecurity.getHash(Settings.getPasswordHash, thePass, name); }
final PlayerAuth fAuth = new PlayerAuth(name, hashnew, PasswordSecurity.userSalt.get(name), ip, new Date().getTime(), (int) player.getLocation().getX() , (int) player.getLocation().getY(), (int) player.getLocation().getZ(), email); if (Spawn.getInstance().getLocation() != null)
database.saveAuth(fAuth); loca = Spawn.getInstance().getLocation();
database.updateEmail(fAuth); RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, loca);
database.updateSession(fAuth); plugin.getServer().getPluginManager().callEvent(tpEvent);
plugin.mail.main(fAuth, thePass); if(!tpEvent.isCancelled()) {
} catch (NoSuchAlgorithmException e) { if (!tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).isLoaded()) {
ConsoleLogger.showError(e.getMessage()); tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).load();
} }
} else { player.teleport(tpEvent.getTo());
try { }
final String hashnew = PasswordSecurity.getHash(Settings.getPasswordHash, thePass, name); }
final PlayerAuth fAuth = new PlayerAuth(name, hashnew, ip, new Date().getTime(), (int) player.getLocation().getX() , (int) player.getLocation().getY(), (int) player.getLocation().getZ(), email); sender.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId());
database.saveAuth(fAuth); sender.getServer().getScheduler().cancelTask(limbo.getMessageTaskId());
database.updateEmail(fAuth); LimboCache.getInstance().deleteLimboPlayer(name);
database.updateSession(fAuth); }
plugin.mail.main(fAuth, thePass);
} catch (NoSuchAlgorithmException e) {
ConsoleLogger.showError(e.getMessage());
}
}
}
});
if(!Settings.getRegisteredGroup.isEmpty()){ if(!Settings.getRegisteredGroup.isEmpty()){
Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED); Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED);
} }
player.sendMessage(m._("vb_nonActiv")); player.sendMessage(m._("registered"));
String msg = m._("login_msg"); if (!Settings.getmailAccount.isEmpty())
int time = Settings.getRegistrationTimeout * 20; player.sendMessage(m._("add_email"));
int msgInterval = Settings.getWarnMessageInterval;
if (time != 0) {
Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getTimeoutTaskId());
BukkitTask id = Bukkit.getScheduler().runTaskLater(plugin, new TimeoutTask(plugin, name), time);
LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id.getTaskId());
}
Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getMessageTaskId());
BukkitTask nwMsg = Bukkit.getScheduler().runTask(plugin, new MessageTask(plugin, name, msg, msgInterval));
LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(nwMsg.getTaskId());
LimboCache.getInstance().deleteLimboPlayer(name);
if (Settings.isTeleportToSpawnEnabled) {
World world = player.getWorld();
Location loca = world.getSpawnLocation();
if (plugin.mv != null) {
try {
loca = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation();
} catch (NullPointerException npe) {
} catch (ClassCastException cce) {
} catch (NoClassDefFoundError ncdfe) {
}
}
if (Spawn.getInstance().getLocation() != null)
loca = Spawn.getInstance().getLocation();
RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, loca);
plugin.getServer().getPluginManager().callEvent(tpEvent);
if(!tpEvent.isCancelled()) {
if (!tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).isLoaded()) {
tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).load();
}
player.teleport(tpEvent.getTo());
}
}
this.isFirstTimeJoin = true; this.isFirstTimeJoin = true;
player.saveData(); player.saveData();
if (!Settings.noConsoleSpam) if (!Settings.noConsoleSpam)
@ -211,91 +305,11 @@ public class RegisterCommand implements CommandExecutor {
if(plugin.notifications != null) { if(plugin.notifications != null) {
plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " has registered!")); plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " has registered!"));
} }
return true; } catch (NoSuchAlgorithmException ex) {
ConsoleLogger.showError(ex.getMessage());
sender.sendMessage(m._("error"));
} }
} }
if (args.length == 0 || (Settings.getEnablePasswordVerifier && args.length < 2) ) {
player.sendMessage(m._("usage_reg"));
return true;
}
if(args[0].length() < Settings.getPasswordMinLen || args[0].length() > Settings.passwordMaxLength) {
player.sendMessage(m._("pass_len"));
return true;
}
try {
String hash;
if(Settings.getEnablePasswordVerifier) {
if (args[0].equals(args[1])) {
hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name);
} else {
player.sendMessage(m._("password_error"));
return true;
}
} else
hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name);
if (Settings.getMySQLColumnSalt.isEmpty())
{
auth = new PlayerAuth(name, hash, ip, new Date().getTime());
} else {
auth = new PlayerAuth(name, hash, PasswordSecurity.userSalt.get(name), ip, new Date().getTime());
}
if (!database.saveAuth(auth)) {
player.sendMessage(m._("error"));
return true;
}
PlayerCache.getInstance().addPlayer(auth);
LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name);
if (limbo != null) {
player.setGameMode(GameMode.getByValue(limbo.getGameMode()));
if (Settings.isTeleportToSpawnEnabled) {
World world = player.getWorld();
Location loca = world.getSpawnLocation();
if (plugin.mv != null) {
try {
loca = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation();
} catch (NullPointerException npe) {
} catch (ClassCastException cce) {
} catch (NoClassDefFoundError ncdfe) {
}
}
if (Spawn.getInstance().getLocation() != null)
loca = Spawn.getInstance().getLocation();
RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, loca);
plugin.getServer().getPluginManager().callEvent(tpEvent);
if(!tpEvent.isCancelled()) {
if (!tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).isLoaded()) {
tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).load();
}
player.teleport(tpEvent.getTo());
}
}
sender.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId());
sender.getServer().getScheduler().cancelTask(limbo.getMessageTaskId());
LimboCache.getInstance().deleteLimboPlayer(name);
}
if(!Settings.getRegisteredGroup.isEmpty()){
Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED);
}
player.sendMessage(m._("registered"));
if (!Settings.getmailAccount.isEmpty())
player.sendMessage(m._("add_email"));
this.isFirstTimeJoin = true;
player.saveData();
if (!Settings.noConsoleSpam)
ConsoleLogger.info(player.getName() + " registered "+player.getAddress().getAddress().getHostAddress());
if(plugin.notifications != null) {
plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " has registered!"));
}
} catch (NoSuchAlgorithmException ex) {
ConsoleLogger.showError(ex.getMessage());
sender.sendMessage(m._("error"));
}
return true; return true;
} }
} }

View File

@ -138,6 +138,9 @@ public class UnregisterCommand implements CommandExecutor {
} catch (NoClassDefFoundError ncdfe) { } catch (NoClassDefFoundError ncdfe) {
} }
} }
if (plugin.essentialsSpawn != null) {
spawn = plugin.essentialsSpawn;
}
if (Spawn.getInstance().getLocation() != null) if (Spawn.getInstance().getLocation() != null)
spawn = Spawn.getInstance().getLocation(); spawn = Spawn.getInstance().getLocation();
SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawn, false); SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(player, player.getLocation(), spawn, false);

View File

@ -36,6 +36,7 @@ public class FlatToSql {
private static String lastlocX; private static String lastlocX;
private static String lastlocY; private static String lastlocY;
private static String lastlocZ; private static String lastlocZ;
private static String lastlocWorld;
private static String columnEmail; private static String columnEmail;
private static File source; private static File source;
private static File output; private static File output;
@ -49,6 +50,7 @@ public class FlatToSql {
lastlocX = Settings.getMySQLlastlocX; lastlocX = Settings.getMySQLlastlocX;
lastlocY = Settings.getMySQLlastlocY; lastlocY = Settings.getMySQLlastlocY;
lastlocZ = Settings.getMySQLlastlocZ; lastlocZ = Settings.getMySQLlastlocZ;
lastlocWorld = Settings.getMySQLlastlocWorld;
columnEmail = Settings.getMySQLColumnEmail; columnEmail = Settings.getMySQLColumnEmail;
try { try {
@ -68,6 +70,7 @@ public class FlatToSql {
+ lastlocX + " smallint(6) DEFAULT '0'," + lastlocX + " smallint(6) DEFAULT '0',"
+ lastlocY + " smallint(6) DEFAULT '0'," + lastlocY + " smallint(6) DEFAULT '0',"
+ lastlocZ + " smallint(6) DEFAULT '0'," + lastlocZ + " smallint(6) DEFAULT '0',"
+ lastlocWorld + " VARCHAR(255) DEFAULT 'world',"
+ columnEmail + " VARCHAR(255) NOT NULL," + columnEmail + " VARCHAR(255) NOT NULL,"
+ "CONSTRAINT table_const_prim PRIMARY KEY (id));"; + "CONSTRAINT table_const_prim PRIMARY KEY (id));";
sql.write(createDB); sql.write(createDB);
@ -78,9 +81,11 @@ public class FlatToSql {
sql.newLine(); sql.newLine();
String[] args = line.split(":"); String[] args = line.split(":");
if (args.length == 4) if (args.length == 4)
newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", 0, 0, 0, " + "'your@email.com'" + ");"; newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", 0, 0, 0, 'world', 'your@email.com');";
else if (args.length == 7) else if (args.length == 7)
newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", " + args[4] + ", " + args[5] + ", " + args[6] + ", " + "'your@email.com'" + ");"; newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", " + args[4] + ", " + args[5] + ", " + args[6] + ", 'world', 'your@email.com');";
else if (args.length == 8)
newline = "INSERT INTO " + tableName + " VALUES (" + i + ", '" + args[0] + "', '" + args[1] + "', '" + args[2] + "', " + args[3] + ", " + args[4] + ", " + args[5] + ", " + args[6] + ", " + args[7] + ", 'your@email.com');";
else else
newline = ""; newline = "";
if (newline != "") if (newline != "")

View File

@ -86,6 +86,7 @@ public class CacheDataSource implements DataSource {
cache.get(auth.getNickname()).setQuitLocX(auth.getQuitLocX()); cache.get(auth.getNickname()).setQuitLocX(auth.getQuitLocX());
cache.get(auth.getNickname()).setQuitLocY(auth.getQuitLocY()); cache.get(auth.getNickname()).setQuitLocY(auth.getQuitLocY());
cache.get(auth.getNickname()).setQuitLocZ(auth.getQuitLocZ()); cache.get(auth.getNickname()).setQuitLocZ(auth.getQuitLocZ());
cache.get(auth.getNickname()).setWorld(auth.getWorld());
return true; return true;
} }
return false; return false;

View File

@ -89,7 +89,7 @@ public class FileDataSource implements DataSource {
bw.write(auth.getNickname() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + "\n"); bw.write(auth.getNickname() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + "\n");
} else { } else {
bw = new BufferedWriter(new FileWriter(source, true)); bw = new BufferedWriter(new FileWriter(source, true));
bw.write(auth.getNickname() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + ":" + auth.getQuitLocX() + ":" + auth.getQuitLocY() + ":" + auth.getQuitLocZ() + "\n"); bw.write(auth.getNickname() + ":" + auth.getHash() + ":" + auth.getIp() + ":" + auth.getLastLogin() + ":" + auth.getQuitLocX() + ":" + auth.getQuitLocY() + ":" + auth.getQuitLocZ() + ":" + auth.getWorld() + "\n");
} }
} catch (IOException ex) { } catch (IOException ex) {
ConsoleLogger.showError(ex.getMessage()); ConsoleLogger.showError(ex.getMessage());
@ -190,7 +190,7 @@ public class FileDataSource implements DataSource {
while ((line = br.readLine()) != null) { while ((line = br.readLine()) != null) {
String[] args = line.split(":"); String[] args = line.split(":");
if (args[0].equals(auth.getNickname())) { if (args[0].equals(auth.getNickname())) {
newAuth = new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ()); newAuth = new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), auth.getQuitLocX(), auth.getQuitLocY(), auth.getQuitLocZ(), auth.getWorld());
break; break;
} }
} }
@ -350,7 +350,9 @@ public class FileDataSource implements DataSource {
case 4: case 4:
return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3])); return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]));
case 7: case 7:
return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6])); return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), "unavailableworld");
case 8:
return new PlayerAuth(args[0], args[1], args[2], Long.parseLong(args[3]), Integer.parseInt(args[4]), Integer.parseInt(args[5]), Integer.parseInt(args[6]), args[7]);
} }
} }
} }

View File

@ -48,6 +48,7 @@ public class MySQLDataSource implements DataSource {
private String lastlocX; private String lastlocX;
private String lastlocY; private String lastlocY;
private String lastlocZ; private String lastlocZ;
private String lastlocWorld;
private String columnEmail; private String columnEmail;
private String columnID; private String columnID;
private List<String> columnOthers; private List<String> columnOthers;
@ -67,6 +68,7 @@ public class MySQLDataSource implements DataSource {
this.lastlocX = Settings.getMySQLlastlocX; this.lastlocX = Settings.getMySQLlastlocX;
this.lastlocY = Settings.getMySQLlastlocY; this.lastlocY = Settings.getMySQLlastlocY;
this.lastlocZ = Settings.getMySQLlastlocZ; this.lastlocZ = Settings.getMySQLlastlocZ;
this.lastlocWorld = Settings.getMySQLlastlocWorld;
this.columnSalt = Settings.getMySQLColumnSalt; this.columnSalt = Settings.getMySQLColumnSalt;
this.columnGroup = Settings.getMySQLColumnGroup; this.columnGroup = Settings.getMySQLColumnGroup;
this.columnEmail = Settings.getMySQLColumnEmail; this.columnEmail = Settings.getMySQLColumnEmail;
@ -106,6 +108,7 @@ public class MySQLDataSource implements DataSource {
+ lastlocX + " smallint(6) DEFAULT '0'," + lastlocX + " smallint(6) DEFAULT '0',"
+ lastlocY + " smallint(6) DEFAULT '0'," + lastlocY + " smallint(6) DEFAULT '0',"
+ lastlocZ + " smallint(6) DEFAULT '0'," + lastlocZ + " smallint(6) DEFAULT '0',"
+ lastlocWorld + " VARCHAR(255) DEFAULT 'world',"
+ columnEmail + " VARCHAR(255) DEFAULT 'your@email.com'," + columnEmail + " VARCHAR(255) DEFAULT 'your@email.com',"
+ "CONSTRAINT table_const_prim PRIMARY KEY (" + columnID + "));"); + "CONSTRAINT table_const_prim PRIMARY KEY (" + columnID + "));");
rs = con.getMetaData().getColumns(null, null, tableName, columnPassword); rs = con.getMetaData().getColumns(null, null, tableName, columnPassword);
@ -132,6 +135,11 @@ public class MySQLDataSource implements DataSource {
+ columnLastLogin +" , ADD " + lastlocY + " smallint(6) NOT NULL DEFAULT '0' AFTER " + lastlocX + " , ADD " + lastlocZ + " smallint(6) NOT NULL DEFAULT '0' AFTER " + lastlocY + ";"); + columnLastLogin +" , ADD " + lastlocY + " smallint(6) NOT NULL DEFAULT '0' AFTER " + lastlocX + " , ADD " + lastlocZ + " smallint(6) NOT NULL DEFAULT '0' AFTER " + lastlocY + ";");
} }
rs.close(); rs.close();
rs = con.getMetaData().getColumns(null, null, tableName, lastlocWorld);
if (!rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + lastlocWorld + " VARCHAR(255) NOT NULL DEFAULT 'world' AFTER " + lastlocZ + ";");
}
rs.close();
rs = con.getMetaData().getColumns(null, null, tableName, columnEmail); rs = con.getMetaData().getColumns(null, null, tableName, columnEmail);
if (!rs.next()) { if (!rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + columnEmail + " VARCHAR(255) DEFAULT 'your@email.com' AFTER " + lastlocZ +";"); st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + columnEmail + " VARCHAR(255) DEFAULT 'your@email.com' AFTER " + lastlocZ +";");
@ -182,14 +190,14 @@ public class MySQLDataSource implements DataSource {
rs = pst.executeQuery(); rs = pst.executeQuery();
if (rs.next()) { if (rs.next()) {
if (rs.getString(columnIp).isEmpty() ) { if (rs.getString(columnIp).isEmpty() ) {
return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "198.18.0.1", rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(columnEmail)); return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "198.18.0.1", rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld),rs.getString(columnEmail));
} else { } else {
if(!columnSalt.isEmpty()){ if(!columnSalt.isEmpty()){
if(!columnGroup.isEmpty()) if(!columnGroup.isEmpty())
return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getInt(columnGroup), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(columnEmail)); return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getInt(columnGroup), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail));
else return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(columnEmail)); else return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld),rs.getString(columnEmail));
} else { } else {
return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(columnEmail)); return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld), rs.getString(columnEmail));
} }
} }
} else { } else {
@ -347,11 +355,12 @@ public class MySQLDataSource implements DataSource {
PreparedStatement pst = null; PreparedStatement pst = null;
try { try {
con = conPool.getValidConnection(); con = conPool.getValidConnection();
pst = con.prepareStatement("UPDATE " + tableName + " SET "+ lastlocX + " =?, "+ lastlocY +"=?, "+ lastlocZ +"=? WHERE " + columnName + "=?;"); pst = con.prepareStatement("UPDATE " + tableName + " SET "+ lastlocX + " =?, "+ lastlocY +"=?, "+ lastlocZ +"=?, " + lastlocWorld + "=? WHERE " + columnName + "=?;");
pst.setLong(1, auth.getQuitLocX()); pst.setLong(1, auth.getQuitLocX());
pst.setLong(2, auth.getQuitLocY()); pst.setLong(2, auth.getQuitLocY());
pst.setLong(3, auth.getQuitLocZ()); pst.setLong(3, auth.getQuitLocZ());
pst.setString(4, auth.getNickname()); pst.setString(4, auth.getWorld());
pst.setString(5, auth.getNickname());
pst.executeUpdate(); pst.executeUpdate();
} catch (SQLException ex) { } catch (SQLException ex) {
ConsoleLogger.showError(ex.getMessage()); ConsoleLogger.showError(ex.getMessage());

View File

@ -37,6 +37,7 @@ public class SqliteDataSource implements DataSource {
private String lastlocX; private String lastlocX;
private String lastlocY; private String lastlocY;
private String lastlocZ; private String lastlocZ;
private String lastlocWorld;
private String columnEmail; private String columnEmail;
private String columnID; private String columnID;
private Connection con; private Connection con;
@ -57,6 +58,7 @@ public class SqliteDataSource implements DataSource {
this.lastlocX = Settings.getMySQLlastlocX; this.lastlocX = Settings.getMySQLlastlocX;
this.lastlocY = Settings.getMySQLlastlocY; this.lastlocY = Settings.getMySQLlastlocY;
this.lastlocZ = Settings.getMySQLlastlocZ; this.lastlocZ = Settings.getMySQLlastlocZ;
this.lastlocWorld = Settings.getMySQLlastlocWorld;
this.nonActivatedGroup = Settings.getNonActivatedGroup; this.nonActivatedGroup = Settings.getNonActivatedGroup;
this.columnEmail = Settings.getMySQLColumnEmail; this.columnEmail = Settings.getMySQLColumnEmail;
this.columnID = Settings.getMySQLColumnId; this.columnID = Settings.getMySQLColumnId;
@ -86,6 +88,7 @@ public class SqliteDataSource implements DataSource {
+ lastlocX + " smallint(6) DEFAULT '0'," + lastlocX + " smallint(6) DEFAULT '0',"
+ lastlocY + " smallint(6) DEFAULT '0'," + lastlocY + " smallint(6) DEFAULT '0',"
+ lastlocZ + " smallint(6) DEFAULT '0'," + lastlocZ + " smallint(6) DEFAULT '0',"
+ lastlocWorld + " VARCHAR(255) DEFAULT 'world',"
+ columnEmail + " VARCHAR(255) DEFAULT 'your@email.com'," + columnEmail + " VARCHAR(255) DEFAULT 'your@email.com',"
+ "CONSTRAINT table_const_prim PRIMARY KEY (" + columnID + "));"); + "CONSTRAINT table_const_prim PRIMARY KEY (" + columnID + "));");
rs = con.getMetaData().getColumns(null, null, tableName, columnPassword); rs = con.getMetaData().getColumns(null, null, tableName, columnPassword);
@ -113,6 +116,10 @@ public class SqliteDataSource implements DataSource {
+ "ALTER TABLE " + tableName + " ADD COLUMN " + lastlocZ + " smallint(6) NOT NULL DEFAULT '0';"); + "ALTER TABLE " + tableName + " ADD COLUMN " + lastlocZ + " smallint(6) NOT NULL DEFAULT '0';");
} }
rs.close(); rs.close();
if (!rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + lastlocWorld + " VARCHAR(255) NOT NULL DEFAULT 'world' AFTER " + lastlocZ + ";");
}
rs.close();
rs = con.getMetaData().getColumns(null, null, tableName, columnEmail); rs = con.getMetaData().getColumns(null, null, tableName, columnEmail);
if (!rs.next()) { if (!rs.next()) {
st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + columnEmail + " VARCHAR(255) DEFAULT 'your@email.com';"); st.executeUpdate("ALTER TABLE " + tableName + " ADD COLUMN " + columnEmail + " VARCHAR(255) DEFAULT 'your@email.com';");
@ -153,12 +160,12 @@ public class SqliteDataSource implements DataSource {
rs = pst.executeQuery(); rs = pst.executeQuery();
if (rs.next()) { if (rs.next()) {
if (rs.getString(columnIp).isEmpty() ) { if (rs.getString(columnIp).isEmpty() ) {
return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "198.18.0.1", rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(columnEmail)); return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), "198.18.0.1", rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld) , rs.getString(columnEmail));
} else { } else {
if(!columnSalt.isEmpty()){ if(!columnSalt.isEmpty()){
return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getInt(columnGroup), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(columnEmail)); return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword),rs.getString(columnSalt), rs.getInt(columnGroup), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld) , rs.getString(columnEmail));
} else { } else {
return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(columnEmail)); return new PlayerAuth(rs.getString(columnName), rs.getString(columnPassword), rs.getString(columnIp), rs.getLong(columnLastLogin), rs.getInt(lastlocX), rs.getInt(lastlocY), rs.getInt(lastlocZ), rs.getString(lastlocWorld) , rs.getString(columnEmail));
} }
} }
} else { } else {
@ -273,11 +280,12 @@ public class SqliteDataSource implements DataSource {
public boolean updateQuitLoc(PlayerAuth auth) { public boolean updateQuitLoc(PlayerAuth auth) {
PreparedStatement pst = null; PreparedStatement pst = null;
try { try {
pst = con.prepareStatement("UPDATE " + tableName + " SET " + lastlocX + "=?, "+ lastlocY +"=?, "+ lastlocZ +"=? WHERE " + columnName + "=?;"); pst = con.prepareStatement("UPDATE " + tableName + " SET " + lastlocX + "=?, "+ lastlocY +"=?, "+ lastlocZ +"=?, " + lastlocWorld + "=? WHERE " + columnName + "=?;");
pst.setLong(1, auth.getQuitLocX()); pst.setLong(1, auth.getQuitLocX());
pst.setLong(2, auth.getQuitLocY()); pst.setLong(2, auth.getQuitLocY());
pst.setLong(3, auth.getQuitLocZ()); pst.setLong(3, auth.getQuitLocZ());
pst.setString(4, auth.getNickname()); pst.setString(4, auth.getWorld());
pst.setString(5, auth.getNickname());
pst.executeUpdate(); pst.executeUpdate();
} catch (SQLException ex) { } catch (SQLException ex) {
ConsoleLogger.showError(ex.getMessage()); ConsoleLogger.showError(ex.getMessage());

View File

@ -1,51 +0,0 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*
* http://forums.bukkit.org/threads/cardboard-serializable-itemstack-with-enchantments.75768/
*/
package uk.org.whoami.authme.debug;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.inventory.ItemStack;
public class CardboardBox implements Serializable {
private static final long serialVersionUID = 729890133797629668L;
private final int type, amount;
private final short damage;
private final HashMap<CardboardEnchantment, Integer> enchants;
public CardboardBox(ItemStack item) {
this.type = item.getTypeId();
this.amount = item.getAmount();
this.damage = item.getDurability();
HashMap<CardboardEnchantment, Integer> map = new HashMap<CardboardEnchantment, Integer>();
Map<Enchantment, Integer> enchantments = item.getEnchantments();
for(Enchantment enchantment : enchantments.keySet()) {
map.put(new CardboardEnchantment(enchantment), enchantments.get(enchantment));
}
this.enchants = map;
}
public ItemStack unbox() {
ItemStack item = new ItemStack(type, amount, damage);
HashMap<Enchantment, Integer> map = new HashMap<Enchantment, Integer>();
for(CardboardEnchantment cEnchantment : enchants.keySet()) {
map.put(cEnchantment.unbox(), enchants.get(cEnchantment));
}
item.addUnsafeEnchantments(map);
return item;
}
}

View File

@ -1,26 +0,0 @@
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package uk.org.whoami.authme.debug;
import java.io.Serializable;
import org.bukkit.enchantments.Enchantment;
/**
* A serializable Enchantment
*/
public class CardboardEnchantment implements Serializable {
private static final long serialVersionUID = 8973856768102665381L;
private final int id;
public CardboardEnchantment(Enchantment enchantment) {
this.id = enchantment.getId();
}
public Enchantment unbox() {
return Enchantment.getById(this.id);
}
}

View File

@ -1,25 +0,0 @@
package uk.org.whoami.authme.filter;
import java.util.logging.Filter;
import java.util.logging.LogRecord;
/**
*
* @author Xephi59
*/
public class ConsoleFilter implements Filter {
public ConsoleFilter() {}
@Override
public boolean isLoggable(LogRecord record) {
String logM = record.getMessage().toLowerCase();
if (!logM.contains("issued server command:")) return true;
if (!logM.contains("/login ") && !logM.contains("/l ") && !logM.contains("/reg ") && !logM.contains("/changepassword ") && !logM.contains("/unregister ")
&& !logM.contains("/authme register ") && !logM.contains("/authme changepassword ")&& !logM.contains("/authme reg ")&& !logM.contains("/authme cp ")) return true;
String playername = record.getMessage().split(" ")[0];
record.setMessage(playername + " issued an AuthMe command!");
return true;
}
}

View File

@ -21,7 +21,9 @@ import org.getspout.spoutapi.player.SpoutPlayer;
import uk.org.whoami.authme.AuthMe; import uk.org.whoami.authme.AuthMe;
import uk.org.whoami.authme.gui.Clickable; import uk.org.whoami.authme.gui.Clickable;
import uk.org.whoami.authme.gui.CustomButton; import uk.org.whoami.authme.gui.CustomButton;
import uk.org.whoami.authme.settings.Settings;
import uk.org.whoami.authme.settings.SpoutCfg; import uk.org.whoami.authme.settings.SpoutCfg;
import uk.org.whoami.authme.threads.LoginThread;
public class LoginScreen extends GenericPopup implements Clickable{ public class LoginScreen extends GenericPopup implements Clickable{
@ -119,7 +121,12 @@ public class LoginScreen extends GenericPopup implements Clickable{
if (event.isCancelled() || event == null || event.getPlayer() == null) return; if (event.isCancelled() || event == null || event.getPlayer() == null) return;
if (b.equals(loginBtn)) if (b.equals(loginBtn))
{ {
plugin.management.performLogin(player, passBox.getText()); if (Settings.useMultiThreading) {
Thread mT = new LoginThread(plugin.database, plugin, player, passBox.getText());
mT.run();
} else {
plugin.management.performLogin(player, passBox.getText(), false);
}
}else if(b.equals(exitBtn)) }else if(b.equals(exitBtn))
{ {
event.getPlayer().kickPlayer(exitMsg); event.getPlayer().kickPlayer(exitMsg);

View File

@ -26,7 +26,6 @@ import uk.org.whoami.authme.AuthMe;
import uk.org.whoami.authme.Utils; import uk.org.whoami.authme.Utils;
import uk.org.whoami.authme.cache.auth.PlayerCache; import uk.org.whoami.authme.cache.auth.PlayerCache;
import uk.org.whoami.authme.datasource.DataSource; import uk.org.whoami.authme.datasource.DataSource;
import uk.org.whoami.authme.plugin.manager.CombatTagComunicator;
import uk.org.whoami.authme.settings.Settings; import uk.org.whoami.authme.settings.Settings;
public class AuthMeBlockListener implements Listener { public class AuthMeBlockListener implements Listener {
@ -48,7 +47,7 @@ public class AuthMeBlockListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
if(instance.getCitizensCommunicator().isNPC(player, instance) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { if(Utils.getInstance().isUnrestricted(player)) {
return; return;
} }
@ -73,7 +72,7 @@ public class AuthMeBlockListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
if(instance.getCitizensCommunicator().isNPC(player, instance) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { if(Utils.getInstance().isUnrestricted(player)) {
return; return;
} }

View File

@ -31,7 +31,6 @@ import uk.org.whoami.authme.AuthMe;
import uk.org.whoami.authme.Utils; import uk.org.whoami.authme.Utils;
import uk.org.whoami.authme.cache.auth.PlayerCache; import uk.org.whoami.authme.cache.auth.PlayerCache;
import uk.org.whoami.authme.datasource.DataSource; import uk.org.whoami.authme.datasource.DataSource;
import uk.org.whoami.authme.plugin.manager.CombatTagComunicator;
import uk.org.whoami.authme.settings.Settings; import uk.org.whoami.authme.settings.Settings;
public class AuthMeEntityListener implements Listener{ public class AuthMeEntityListener implements Listener{
@ -55,7 +54,7 @@ public class AuthMeEntityListener implements Listener{
return; return;
} }
if(instance.getCitizensCommunicator().isNPC(entity, instance) || Utils.getInstance().isUnrestricted((Player)entity) || CombatTagComunicator.isNPC(entity)) { if(Utils.getInstance().isUnrestricted((Player)entity)) {
return; return;
} }
@ -170,7 +169,7 @@ public class AuthMeEntityListener implements Listener{
Player player = (Player) event.getEntity(); Player player = (Player) event.getEntity();
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
if (instance.getCitizensCommunicator().isNPC(player, instance) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { if (Utils.getInstance().isUnrestricted(player)) {
return; return;
} }
@ -199,7 +198,7 @@ public class AuthMeEntityListener implements Listener{
Player player = (Player) event.getEntity(); Player player = (Player) event.getEntity();
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
if (instance.getCitizensCommunicator().isNPC(player, instance) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { if (Utils.getInstance().isUnrestricted(player)) {
return; return;
} }

View File

@ -21,6 +21,7 @@ import java.io.DataOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.regex.PatternSyntaxException;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.GameMode; import org.bukkit.GameMode;
@ -28,7 +29,13 @@ import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerBedEnterEvent; import org.bukkit.event.player.PlayerBedEnterEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerDropItemEvent;
@ -41,23 +48,20 @@ import org.bukkit.event.player.PlayerLoginEvent.Result;
import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitScheduler;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import uk.org.whoami.authme.api.API;
import uk.org.whoami.authme.cache.backup.DataFileCache;
import uk.org.whoami.authme.cache.backup.FileCache;
import uk.org.whoami.authme.AuthMe; import uk.org.whoami.authme.AuthMe;
import uk.org.whoami.authme.ConsoleLogger; import uk.org.whoami.authme.ConsoleLogger;
import uk.org.whoami.authme.Utils; import uk.org.whoami.authme.Utils;
import uk.org.whoami.authme.api.API;
import uk.org.whoami.authme.cache.auth.PlayerAuth; import uk.org.whoami.authme.cache.auth.PlayerAuth;
import uk.org.whoami.authme.cache.auth.PlayerCache; import uk.org.whoami.authme.cache.auth.PlayerCache;
import uk.org.whoami.authme.cache.limbo.LimboPlayer; import uk.org.whoami.authme.cache.backup.DataFileCache;
import uk.org.whoami.authme.cache.backup.FileCache;
import uk.org.whoami.authme.cache.limbo.LimboCache; import uk.org.whoami.authme.cache.limbo.LimboCache;
import uk.org.whoami.authme.cache.limbo.LimboPlayer;
import uk.org.whoami.authme.datasource.DataSource; import uk.org.whoami.authme.datasource.DataSource;
import uk.org.whoami.authme.events.AuthMeTeleportEvent; import uk.org.whoami.authme.events.AuthMeTeleportEvent;
import uk.org.whoami.authme.events.ProtectInventoryEvent; import uk.org.whoami.authme.events.ProtectInventoryEvent;
@ -136,18 +140,6 @@ public class AuthMePlayerListener implements Listener {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final String name = player.getName().toLowerCase(); final String name = player.getName().toLowerCase();
if(plugin.CitizensVersion != 0) {
if (plugin.getCitizensCommunicator().isNPC(player, plugin)) {
return;
}
}
if(plugin.CombatTag != 0) {
if (CombatTagComunicator.isNPC(player)) {
return;
}
}
if (Utils.getInstance().isUnrestricted(player)) { if (Utils.getInstance().isUnrestricted(player)) {
return; return;
} }
@ -197,18 +189,6 @@ public class AuthMePlayerListener implements Listener {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final String name = player.getName().toLowerCase(); final String name = player.getName().toLowerCase();
if(plugin.CitizensVersion != 0) {
if (plugin.getCitizensCommunicator().isNPC(player, plugin)) {
return;
}
}
if(plugin.CombatTag != 0) {
if (CombatTagComunicator.isNPC(player)) {
return;
}
}
if (Utils.getInstance().isUnrestricted(player)) { if (Utils.getInstance().isUnrestricted(player)) {
return; return;
} }
@ -258,18 +238,6 @@ public class AuthMePlayerListener implements Listener {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final String name = player.getName().toLowerCase(); final String name = player.getName().toLowerCase();
if(plugin.CitizensVersion != 0) {
if (plugin.getCitizensCommunicator().isNPC(player, plugin)) {
return;
}
}
if(plugin.CombatTag != 0) {
if (CombatTagComunicator.isNPC(player)) {
return;
}
}
if (Utils.getInstance().isUnrestricted(player)) { if (Utils.getInstance().isUnrestricted(player)) {
return; return;
} }
@ -281,6 +249,7 @@ public class AuthMePlayerListener implements Listener {
String cmd = event.getMessage().split(" ")[0]; String cmd = event.getMessage().split(" ")[0];
if (!Settings.isChatAllowed && !(Settings.allowCommands.contains(cmd))) { if (!Settings.isChatAllowed && !(Settings.allowCommands.contains(cmd))) {
//System.out.println("debug chat: chat isnt allowed");
event.setCancelled(true); event.setCancelled(true);
return; return;
} }
@ -319,18 +288,6 @@ public class AuthMePlayerListener implements Listener {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final String name = player.getName().toLowerCase(); final String name = player.getName().toLowerCase();
if(plugin.CitizensVersion != 0) {
if (plugin.getCitizensCommunicator().isNPC(player, plugin)) {
return;
}
}
if(plugin.CombatTag != 0) {
if (CombatTagComunicator.isNPC(player)) {
return;
}
}
if (Utils.getInstance().isUnrestricted(player)) { if (Utils.getInstance().isUnrestricted(player)) {
return; return;
} }
@ -380,18 +337,6 @@ public class AuthMePlayerListener implements Listener {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final String name = player.getName().toLowerCase(); final String name = player.getName().toLowerCase();
if(plugin.CitizensVersion != 0) {
if (plugin.getCitizensCommunicator().isNPC(player, plugin)) {
return;
}
}
if(plugin.CombatTag != 0) {
if (CombatTagComunicator.isNPC(player)) {
return;
}
}
if (Utils.getInstance().isUnrestricted(player)) { if (Utils.getInstance().isUnrestricted(player)) {
return; return;
} }
@ -441,18 +386,6 @@ public class AuthMePlayerListener implements Listener {
final Player player = event.getPlayer(); final Player player = event.getPlayer();
final String name = player.getName().toLowerCase(); final String name = player.getName().toLowerCase();
if(plugin.CitizensVersion != 0) {
if (plugin.getCitizensCommunicator().isNPC(player, plugin)) {
return;
}
}
if(plugin.CombatTag != 0) {
if (CombatTagComunicator.isNPC(player)) {
return;
}
}
if (Utils.getInstance().isUnrestricted(player)) { if (Utils.getInstance().isUnrestricted(player)) {
return; return;
} }
@ -533,7 +466,10 @@ public class AuthMePlayerListener implements Listener {
} catch (NoClassDefFoundError ncdfe) { } catch (NoClassDefFoundError ncdfe) {
} }
} }
if (Spawn.getInstance().getLocation() != null) if (plugin.essentialsSpawn != null) {
spawn = plugin.essentialsSpawn;
}
if (Spawn.getInstance().getLocation() != null && Spawn.getInstance().getLocation().getWorld().equals(player.getWorld()))
spawn = Spawn.getInstance().getLocation(); spawn = Spawn.getInstance().getLocation();
if ((spawn.distance(player.getLocation()) > radius) ) { if ((spawn.distance(player.getLocation()) > radius) ) {
@ -587,7 +523,20 @@ public class AuthMePlayerListener implements Listener {
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, m._("name_len")); event.disallow(PlayerLoginEvent.Result.KICK_OTHER, m._("name_len"));
return; return;
} }
if (!player.getName().matches(regex) || name.equals("Player")) { try {
if (!player.getName().matches(regex) || name.equals("Player")) {
try {
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, m._("regex").replaceAll("REG_EX", regex));
} catch (StringIndexOutOfBoundsException exc) {
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "allowed char : " + regex);
}
return;
}
} catch (PatternSyntaxException pse) {
if (regex == null || regex.isEmpty()) {
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Your nickname do not match");
return;
}
try { try {
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, m._("regex").replaceAll("REG_EX", regex)); event.disallow(PlayerLoginEvent.Result.KICK_OTHER, m._("regex").replaceAll("REG_EX", regex));
} catch (StringIndexOutOfBoundsException exc) { } catch (StringIndexOutOfBoundsException exc) {
@ -655,6 +604,17 @@ public class AuthMePlayerListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
World world = player.getWorld(); World world = player.getWorld();
Location spawnLoc = world.getSpawnLocation(); Location spawnLoc = world.getSpawnLocation();
if (plugin.mv != null) {
try {
spawnLoc = plugin.mv.getMVWorldManager().getMVWorld(player.getWorld()).getSpawnLocation();
} catch (NullPointerException npe) {
} catch (ClassCastException cce) {
} catch (NoClassDefFoundError ncdfe) {
}
}
if (plugin.essentialsSpawn != null) {
spawnLoc = plugin.essentialsSpawn;
}
if (Spawn.getInstance().getLocation() != null) if (Spawn.getInstance().getLocation() != null)
spawnLoc = Spawn.getInstance().getLocation(); spawnLoc = Spawn.getInstance().getLocation();
gm = player.getGameMode().getValue(); gm = player.getGameMode().getValue();
@ -796,7 +756,7 @@ public class AuthMePlayerListener implements Listener {
if (PlayerCache.getInstance().isAuthenticated(name) && !player.isDead()) { if (PlayerCache.getInstance().isAuthenticated(name) && !player.isDead()) {
if(Settings.isSaveQuitLocationEnabled && data.isAuthAvailable(name)) { if(Settings.isSaveQuitLocationEnabled && data.isAuthAvailable(name)) {
final PlayerAuth auth = new PlayerAuth(event.getPlayer().getName().toLowerCase(),loc.getBlockX(),loc.getBlockY(),loc.getBlockZ()); final PlayerAuth auth = new PlayerAuth(event.getPlayer().getName().toLowerCase(),loc.getBlockX(),loc.getBlockY(),loc.getBlockZ(),loc.getWorld().getName());
try { try {
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override @Override
@ -833,6 +793,7 @@ public class AuthMePlayerListener implements Listener {
} catch (NullPointerException ex) { } catch (NullPointerException ex) {
} }
if (gameMode.containsKey(name)) gameMode.remove(name); if (gameMode.containsKey(name)) gameMode.remove(name);
plugin.premium.remove(player.getName());
player.saveData(); player.saveData();
} }
@ -863,7 +824,7 @@ public class AuthMePlayerListener implements Listener {
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
if ((PlayerCache.getInstance().isAuthenticated(name)) && (!player.isDead()) && if ((PlayerCache.getInstance().isAuthenticated(name)) && (!player.isDead()) &&
(Settings.isSaveQuitLocationEnabled.booleanValue()) && data.isAuthAvailable(name)) { (Settings.isSaveQuitLocationEnabled.booleanValue()) && data.isAuthAvailable(name)) {
final PlayerAuth auth = new PlayerAuth(event.getPlayer().getName().toLowerCase(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ()); final PlayerAuth auth = new PlayerAuth(event.getPlayer().getName().toLowerCase(), loc.getBlockX(), loc.getBlockY(), loc.getBlockZ(),loc.getWorld().getName());
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override @Override
public void run() { public void run() {
@ -913,6 +874,7 @@ public class AuthMePlayerListener implements Listener {
if (gameMode.containsKey(name)) gameMode.remove(name); if (gameMode.containsKey(name)) gameMode.remove(name);
player.getVehicle().eject(); player.getVehicle().eject();
player.saveData(); player.saveData();
plugin.premium.remove(player.getName());
} catch (NullPointerException ex) {} } catch (NullPointerException ex) {}
} }
@ -925,7 +887,7 @@ public class AuthMePlayerListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { if (Utils.getInstance().isUnrestricted(player)) {
return; return;
} }
@ -949,7 +911,7 @@ public class AuthMePlayerListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { if (Utils.getInstance().isUnrestricted(player)) {
return; return;
} }
@ -968,6 +930,53 @@ public class AuthMePlayerListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
} }
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerInventoryOpen(InventoryOpenEvent event) {
if (event.isCancelled() || event.getPlayer() == null) return;
if (!(event.getPlayer() instanceof Player)) return;
Player player = (Player) event.getPlayer();
String name = player.getName().toLowerCase();
if (Utils.getInstance().isUnrestricted(player)) {
return;
}
if (PlayerCache.getInstance().isAuthenticated(player.getName().toLowerCase())) {
return;
}
if (!data.isAuthAvailable(name)) {
if (!Settings.isForcedRegistrationEnabled) {
return;
}
}
event.setCancelled(true);
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerInventoryClick(InventoryClickEvent event) {
if (event.isCancelled() || event.getWhoClicked() == null) return;
if (!(event.getWhoClicked() instanceof Player)) return;
Player player = (Player) event.getWhoClicked();
String name = player.getName().toLowerCase();
if (Utils.getInstance().isUnrestricted(player)) {
return;
}
if (PlayerCache.getInstance().isAuthenticated(player.getName().toLowerCase())) {
return;
}
if (!data.isAuthAvailable(name)) {
if (!Settings.isForcedRegistrationEnabled) {
return;
}
}
event.setResult(org.bukkit.event.Event.Result.DENY);
event.setCancelled(true);
}
@EventHandler(priority = EventPriority.LOWEST) @EventHandler(priority = EventPriority.LOWEST)
public void onPlayerInteractEntity(PlayerInteractEntityEvent event) { public void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
if (event.isCancelled() || event.getPlayer() == null) { if (event.isCancelled() || event.getPlayer() == null) {
@ -1001,7 +1010,7 @@ public class AuthMePlayerListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { if (Utils.getInstance().isUnrestricted(player)) {
return; return;
} }
@ -1025,7 +1034,7 @@ public class AuthMePlayerListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) { if (Utils.getInstance().isUnrestricted(player)) {
return; return;
} }
@ -1048,15 +1057,12 @@ public class AuthMePlayerListener implements Listener {
} }
Player player = event.getPlayer(); Player player = event.getPlayer();
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
if (Utils.getInstance().isUnrestricted(player)) {
if (plugin.getCitizensCommunicator().isNPC(player, plugin) || Utils.getInstance().isUnrestricted(player) || CombatTagComunicator.isNPC(player)) {
return; return;
} }
if (PlayerCache.getInstance().isAuthenticated(name)) { if (PlayerCache.getInstance().isAuthenticated(name)) {
return; return;
} }
if (!data.isAuthAvailable(name)) { if (!data.isAuthAvailable(name)) {
if (!Settings.isForcedRegistrationEnabled) { if (!Settings.isForcedRegistrationEnabled) {
return; return;
@ -1065,4 +1071,50 @@ public class AuthMePlayerListener implements Listener {
event.setCancelled(true); event.setCancelled(true);
} }
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerRespawn(PlayerRespawnEvent event) {
if (event.getPlayer() == null || event == null) {
return;
}
Player player = event.getPlayer();
String name = player.getName().toLowerCase();
if (Utils.getInstance().isUnrestricted(player))
return;
if (PlayerCache.getInstance().isAuthenticated(name))
return;
if (!data.isAuthAvailable(name))
if (!Settings.isForcedRegistrationEnabled)
return;
if (!Settings.isTeleportToSpawnEnabled && !Settings.isForceSpawnLocOnJoinEnabled)
return;
Location spawn = player.getWorld().getSpawnLocation();
if (plugin.mv != null) {
try {
spawn = plugin.mv.getMVWorldManager().getMVWorld(player.getWorld()).getSpawnLocation();
} catch (NullPointerException npe) {
} catch (ClassCastException cce) {
} catch (NoClassDefFoundError ncdfe) {
}
}
if (plugin.essentialsSpawn != null) {
spawn = plugin.essentialsSpawn;
}
if (Spawn.getInstance().getLocation() != null && Spawn.getInstance().getLocation().getWorld().equals(player.getWorld()))
spawn = Spawn.getInstance().getLocation();
final PlayerAuth auth = new PlayerAuth(event.getPlayer().getName().toLowerCase(), spawn.getBlockX(), spawn.getBlockY(), spawn.getBlockZ(),spawn.getWorld().getName());
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable(){
@Override
public void run() {
data.updateQuitLoc(auth);
}
});
event.setRespawnLocation(spawn);
}
} }

View File

@ -19,7 +19,7 @@ public class AuthMeSpoutListener implements Listener {
public AuthMeSpoutListener(DataSource data) { public AuthMeSpoutListener(DataSource data) {
this.data = data; this.data = data;
} }
@EventHandler @EventHandler
public void onSpoutCraftEnable(final SpoutCraftEnableEvent event) { public void onSpoutCraftEnable(final SpoutCraftEnableEvent event) {

View File

@ -0,0 +1,43 @@
package uk.org.whoami.authme.plugin.manager;
import java.io.File;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import uk.org.whoami.authme.settings.CustomConfiguration;
/**
*
* @author Xephi59
*/
public class EssSpawn extends CustomConfiguration {
private static EssSpawn spawn;
public EssSpawn() {
super(new File("./plugins/Essentials/spawn.yml"));
spawn = this;
load();
}
public static EssSpawn getInstance() {
if (spawn == null) {
spawn = new EssSpawn();
}
return spawn;
}
public Location getLocation() {
try {
if (this.getString("spawns.default.world").isEmpty() || this.getString("spawns.default.world") == "") return null;
Location location = new Location(Bukkit.getWorld(this.getString("spawns.default.world")), this.getDouble("spawns.default.x"), this.getDouble("spawns.default.y"), this.getDouble("spawns.default.z"), Float.parseFloat(this.getString("spawns.default.yaw")), Float.parseFloat(this.getString("spawns.default.pitch")));
return location;
} catch (NullPointerException npe) {
return null;
} catch (NumberFormatException nfe) {
return null;
}
}
}

View File

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

View File

@ -89,6 +89,10 @@ public class PasswordSecurity {
private static String getSaltedIPB3(String message, String salt) throws NoSuchAlgorithmException { private static String getSaltedIPB3(String message, String salt) throws NoSuchAlgorithmException {
return getMD5(getMD5(salt) + getMD5(message)); return getMD5(getMD5(salt) + getMD5(message));
} }
private static String getBCrypt(String message, String salt) {
return BCrypt.hashpw(message, salt);
}
private static String createSalt(int length) throws NoSuchAlgorithmException { private static String createSalt(int length) throws NoSuchAlgorithmException {
byte[] msg = new byte[40]; byte[] msg = new byte[40];
@ -182,6 +186,18 @@ public class PasswordSecurity {
userSalt.put(name, saltj); userSalt.put(name, saltj);
} }
return getMD5(password + saltj) + ":" + saltj; return getMD5(password + saltj) + ":" + saltj;
case BCRYPT:
String saltbcrypt = "";
try {
saltbcrypt = AuthMe.getInstance().database.getAuth(name).getSalt();
} catch (NullPointerException npe) {
} catch (ArrayIndexOutOfBoundsException aioobe) {
}
if(saltbcrypt.isEmpty() || saltbcrypt == null) {
saltbcrypt = BCrypt.gensalt(Settings.bCryptLog2Rounds);
userSalt.put(name, saltbcrypt);
}
return getBCrypt(password, saltbcrypt);
default: default:
throw new NoSuchAlgorithmException("Unknown hash algorithm"); throw new NoSuchAlgorithmException("Unknown hash algorithm");
} }
@ -196,6 +212,10 @@ public class PasswordSecurity {
String saltipb = AuthMe.getInstance().database.getAuth(playername).getSalt(); String saltipb = AuthMe.getInstance().database.getAuth(playername).getSalt();
return hash.equals(getSaltedIPB3(password, saltipb)); return hash.equals(getSaltedIPB3(password, saltipb));
} }
if(!Settings.getMySQLColumnSalt.isEmpty() && Settings.getPasswordHash == HashAlgorithm.BCRYPT) {
String saltbcrypt = AuthMe.getInstance().database.getAuth(playername).getSalt();
return hash.equals(BCrypt.hashpw(password, saltbcrypt));
}
if(!Settings.getMySQLColumnSalt.isEmpty() && Settings.getPasswordHash == HashAlgorithm.PHPFUSION) { if(!Settings.getMySQLColumnSalt.isEmpty() && Settings.getPasswordHash == HashAlgorithm.PHPFUSION) {
String saltfusion = AuthMe.getInstance().database.getAuth(playername).getSalt(); String saltfusion = AuthMe.getInstance().database.getAuth(playername).getSalt();
return hash.equals(getPhPFusion(password, saltfusion)); return hash.equals(getPhPFusion(password, saltfusion));
@ -285,7 +305,7 @@ public class PasswordSecurity {
public enum HashAlgorithm { public enum HashAlgorithm {
MD5, SHA1, SHA256, WHIRLPOOL, XAUTH, MD5VB, PHPBB, PLAINTEXT, MYBB, IPB3, PHPFUSION, SMF, XFSHA1, XFSHA256, SALTED2MD5, JOOMLA MD5, SHA1, SHA256, WHIRLPOOL, XAUTH, MD5VB, PHPBB, PLAINTEXT, MYBB, IPB3, PHPFUSION, SMF, XFSHA1, XFSHA256, SALTED2MD5, JOOMLA, BCRYPT
} }
} }

View File

@ -36,4 +36,4 @@ public class RandomString
return new String(buf); return new String(buf);
} }
} }

View File

@ -17,11 +17,11 @@
package uk.org.whoami.authme.settings; package uk.org.whoami.authme.settings;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import org.bukkit.configuration.MemoryConfiguration; import org.bukkit.configuration.MemoryConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
@ -60,7 +60,7 @@ public final class Settings extends YamlConfiguration {
getEnablePasswordVerifier, protectInventoryBeforeLogInEnabled, isBackupActivated, isBackupOnStart, getEnablePasswordVerifier, protectInventoryBeforeLogInEnabled, isBackupActivated, isBackupOnStart,
isBackupOnStop, enablePasspartu, isStopEnabled, reloadSupport, rakamakUseIp, noConsoleSpam, removePassword, displayOtherAccounts, isBackupOnStop, enablePasspartu, isStopEnabled, reloadSupport, rakamakUseIp, noConsoleSpam, removePassword, displayOtherAccounts,
useCaptcha, emailRegistration, multiverse, notifications, chestshop, bungee, banUnsafeIp, doubleEmailCheck, sessionExpireOnIpChange, useCaptcha, emailRegistration, multiverse, notifications, chestshop, bungee, banUnsafeIp, doubleEmailCheck, sessionExpireOnIpChange,
disableSocialSpy; disableSocialSpy, useMultiThreading;
public static String getNickRegex, getUnloggedinGroup, getMySQLHost, getMySQLPort, public static String getNickRegex, getUnloggedinGroup, getMySQLHost, getMySQLPort,
getMySQLUsername, getMySQLPassword, getMySQLDatabase, getMySQLTablename, getMySQLUsername, getMySQLPassword, getMySQLDatabase, getMySQLTablename,
@ -68,11 +68,12 @@ public final class Settings extends YamlConfiguration {
getMySQLColumnSalt, getMySQLColumnGroup, getMySQLColumnEmail, unRegisteredGroup, backupWindowsPath, getMySQLColumnSalt, getMySQLColumnGroup, getMySQLColumnEmail, unRegisteredGroup, backupWindowsPath,
getcUnrestrictedName, getRegisteredGroup, messagesLanguage, getMySQLlastlocX, getMySQLlastlocY, getMySQLlastlocZ, getcUnrestrictedName, getRegisteredGroup, messagesLanguage, getMySQLlastlocX, getMySQLlastlocY, getMySQLlastlocZ,
rakamakUsers, rakamakUsersIp, getmailAccount, getmailPassword, getmailSMTP, getMySQLColumnId, getmailSenderName, rakamakUsers, rakamakUsersIp, getmailAccount, getmailPassword, getmailSMTP, getMySQLColumnId, getmailSenderName,
getPredefinedSalt, getMailSubject, getMailText; getPredefinedSalt, getMailSubject, getMailText, getMySQLlastlocWorld;
public static int getWarnMessageInterval, getSessionTimeout, getRegistrationTimeout, getMaxNickLength, public static int getWarnMessageInterval, getSessionTimeout, getRegistrationTimeout, getMaxNickLength,
getMinNickLength, getPasswordMinLen, getMovementRadius, getmaxRegPerIp, getNonActivatedGroup, getMinNickLength, getPasswordMinLen, getMovementRadius, getmaxRegPerIp, getNonActivatedGroup,
passwordMaxLength, getRecoveryPassLength, getMailPort, maxLoginTry, captchaLength, saltLength, getmaxRegPerEmail; passwordMaxLength, getRecoveryPassLength, getMailPort, maxLoginTry, captchaLength, saltLength, getmaxRegPerEmail,
bCryptLog2Rounds;
protected static YamlConfiguration configFile; protected static YamlConfiguration configFile;
@ -141,6 +142,7 @@ public void loadConfigOptions() {
getMySQLlastlocX = configFile.getString("DataSource.mySQLlastlocX","x"); getMySQLlastlocX = configFile.getString("DataSource.mySQLlastlocX","x");
getMySQLlastlocY = configFile.getString("DataSource.mySQLlastlocY","y"); getMySQLlastlocY = configFile.getString("DataSource.mySQLlastlocY","y");
getMySQLlastlocZ = configFile.getString("DataSource.mySQLlastlocZ","z"); getMySQLlastlocZ = configFile.getString("DataSource.mySQLlastlocZ","z");
getMySQLlastlocWorld = configFile.getString("DataSource.mySQLlastlocWorld", "world");
getNonActivatedGroup = configFile.getInt("ExternalBoardOptions.nonActivedUserGroup", -1); getNonActivatedGroup = configFile.getInt("ExternalBoardOptions.nonActivedUserGroup", -1);
unRegisteredGroup = configFile.getString("GroupOptions.UnregisteredPlayerGroup",""); unRegisteredGroup = configFile.getString("GroupOptions.UnregisteredPlayerGroup","");
getUnrestrictedName = configFile.getStringList("settings.unrestrictions.UnrestrictedName"); getUnrestrictedName = configFile.getStringList("settings.unrestrictions.UnrestrictedName");
@ -192,7 +194,7 @@ public void loadConfigOptions() {
maxLoginTry = configFile.getInt("Security.captcha.maxLoginTry", 5); maxLoginTry = configFile.getInt("Security.captcha.maxLoginTry", 5);
captchaLength = configFile.getInt("Security.captcha.captchaLength", 5); captchaLength = configFile.getInt("Security.captcha.captchaLength", 5);
getMailSubject = configFile.getString("Email.mailSubject", "Your new AuthMe Password"); getMailSubject = configFile.getString("Email.mailSubject", "Your new AuthMe Password");
getMailText = configFile.getString("Email.mailText", "Dear <playername>, \n\n This is your new AuthMe password for the server : \n\n <servername> \n\n <generatedpass>\n\n Do not forget to change password after login! \n /changepassword <generatedpass> newPassword"); getMailText = configFile.getString("Email.mailText", "Dear <playername>, <br /><br /> This is your new AuthMe password for the server <br /><br /> <servername> : <br /><br /> <generatedpass><br /><br />Do not forget to change password after login! <br /> /changepassword <generatedpass> newPassword");
emailRegistration = configFile.getBoolean("settings.registration.enableEmailRegistrationSystem", false); emailRegistration = configFile.getBoolean("settings.registration.enableEmailRegistrationSystem", false);
saltLength = configFile.getInt("settings.security.doubleMD5SaltLength", 8); saltLength = configFile.getInt("settings.security.doubleMD5SaltLength", 8);
getmaxRegPerEmail = configFile.getInt("Email.maxRegPerEmail", 1); getmaxRegPerEmail = configFile.getInt("Email.maxRegPerEmail", 1);
@ -206,6 +208,8 @@ public void loadConfigOptions() {
sessionExpireOnIpChange = configFile.getBoolean("settings.sessions.sessionExpireOnIpChange", false); sessionExpireOnIpChange = configFile.getBoolean("settings.sessions.sessionExpireOnIpChange", false);
useLogging = configFile.getBoolean("Security.console.logConsole", false); useLogging = configFile.getBoolean("Security.console.logConsole", false);
disableSocialSpy = configFile.getBoolean("Hooks.disableSocialSpy", true); disableSocialSpy = configFile.getBoolean("Hooks.disableSocialSpy", true);
useMultiThreading = configFile.getBoolean("Performances.useMultiThreading", false);
bCryptLog2Rounds = configFile.getInt("ExternalBoardOptions.bCryptLog2Round", 10);
saveDefaults(); saveDefaults();
} }
@ -259,6 +263,7 @@ public static void reloadConfigOptions(YamlConfiguration newConfig) {
getMySQLlastlocX = configFile.getString("DataSource.mySQLlastlocX","x"); getMySQLlastlocX = configFile.getString("DataSource.mySQLlastlocX","x");
getMySQLlastlocY = configFile.getString("DataSource.mySQLlastlocY","y"); getMySQLlastlocY = configFile.getString("DataSource.mySQLlastlocY","y");
getMySQLlastlocZ = configFile.getString("DataSource.mySQLlastlocZ","z"); getMySQLlastlocZ = configFile.getString("DataSource.mySQLlastlocZ","z");
getMySQLlastlocWorld = configFile.getString("DataSource.mySQLlastlocWorld", "world");
getMySQLColumnSalt = configFile.getString("ExternalBoardOptions.mySQLColumnSalt",""); getMySQLColumnSalt = configFile.getString("ExternalBoardOptions.mySQLColumnSalt","");
getMySQLColumnGroup = configFile.getString("ExternalBoardOptions.mySQLColumnGroup",""); getMySQLColumnGroup = configFile.getString("ExternalBoardOptions.mySQLColumnGroup","");
getNonActivatedGroup = configFile.getInt("ExternalBoardOptions.nonActivedUserGroup", -1); getNonActivatedGroup = configFile.getInt("ExternalBoardOptions.nonActivedUserGroup", -1);
@ -312,7 +317,7 @@ public static void reloadConfigOptions(YamlConfiguration newConfig) {
maxLoginTry = configFile.getInt("Security.captcha.maxLoginTry", 5); maxLoginTry = configFile.getInt("Security.captcha.maxLoginTry", 5);
captchaLength = configFile.getInt("Security.captcha.captchaLength", 5); captchaLength = configFile.getInt("Security.captcha.captchaLength", 5);
getMailSubject = configFile.getString("Email.mailSubject", "Your new AuthMe Password"); getMailSubject = configFile.getString("Email.mailSubject", "Your new AuthMe Password");
getMailText = configFile.getString("Email.mailText", "Dear <playername>, \n\n This is your new AuthMe password for the server : \n\n <servername> \n\n <generatedpass>\n\n Do not forget to change password after login! \n /changepassword <generatedpass> newPassword"); getMailText = configFile.getString("Email.mailText", "Dear <playername>, <br /><br /> This is your new AuthMe password for the server <br /><br /> <servername> : <br /><br /> <generatedpass><br /><br />Do not forget to change password after login! <br /> /changepassword <generatedpass> newPassword");
emailRegistration = configFile.getBoolean("settings.registration.enableEmailRegistrationSystem", false); emailRegistration = configFile.getBoolean("settings.registration.enableEmailRegistrationSystem", false);
saltLength = configFile.getInt("settings.security.doubleMD5SaltLength", 8); saltLength = configFile.getInt("settings.security.doubleMD5SaltLength", 8);
getmaxRegPerEmail = configFile.getInt("Email.maxRegPerEmail", 1); getmaxRegPerEmail = configFile.getInt("Email.maxRegPerEmail", 1);
@ -326,7 +331,8 @@ public static void reloadConfigOptions(YamlConfiguration newConfig) {
sessionExpireOnIpChange = configFile.getBoolean("settings.sessions.sessionExpireOnIpChange", false); sessionExpireOnIpChange = configFile.getBoolean("settings.sessions.sessionExpireOnIpChange", false);
useLogging = configFile.getBoolean("Security.console.logConsole", false); useLogging = configFile.getBoolean("Security.console.logConsole", false);
disableSocialSpy = configFile.getBoolean("Hooks.disableSocialSpy", true); disableSocialSpy = configFile.getBoolean("Hooks.disableSocialSpy", true);
useMultiThreading = configFile.getBoolean("Performances.useMultiThreading", false);
bCryptLog2Rounds = configFile.getInt("ExternalBoardOptions.bCryptLog2Round", 10);
} }
public void mergeConfig() { public void mergeConfig() {
@ -371,7 +377,15 @@ public void mergeConfig() {
if(!contains("Email.mailSubject")) if(!contains("Email.mailSubject"))
set("Email.mailSubject", ""); set("Email.mailSubject", "");
if(!contains("Email.mailText")) if(!contains("Email.mailText"))
set("Email.mailText", "Dear <playername>, \n\n This is your new AuthMe password for the server : \n\n <servername> \n\n <generatedpass>\n\n Do not forget to change password after login! \n /changepassword <generatedpass> newPassword"); set("Email.mailText", "Dear <playername>, <br /><br /> This is your new AuthMe password for the server <br /><br /> <servername> : <br /><br /> <generatedpass><br /><br />Do not forget to change password after login! <br /> /changepassword <generatedpass> newPassword");
if(contains("Email.mailText")) {
try {
String s = getString("Email.mailText");
s = s.replaceAll("\n", "<br />");
set("Email.mailText", null);
set("Email.mailText", s);
} catch (Exception e) {}
}
if(!contains("settings.registration.enableEmailRegistrationSystem")) if(!contains("settings.registration.enableEmailRegistrationSystem"))
set("settings.registration.enableEmailRegistrationSystem", false); set("settings.registration.enableEmailRegistrationSystem", false);
if(!contains("settings.security.doubleMD5SaltLength")) if(!contains("settings.security.doubleMD5SaltLength"))
@ -396,6 +410,12 @@ public void mergeConfig() {
set("Security.console.logConsole", false); set("Security.console.logConsole", false);
if(!contains("Hooks.disableSocialSpy")) if(!contains("Hooks.disableSocialSpy"))
set("Hooks.disableSocialSpy", true); set("Hooks.disableSocialSpy", true);
if(!contains("Performances.useMultiThreading"))
set("Performances.useMultiThreading", false);
if(!contains("ExternalBoardOptions.bCryptLog2Round"))
set("ExternalBoardOptions.bCryptLog2Round", 10);
if(!contains("DataSource.mySQLlastlocWorld"))
set("DataSource.mySQLlastlocWorld", "world");
plugin.getLogger().info("Merge new Config Options if needed.."); plugin.getLogger().info("Merge new Config Options if needed..");
plugin.saveConfig(); plugin.saveConfig();

View File

@ -0,0 +1,639 @@
package uk.org.whoami.authme.threads;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import java.util.List;
import me.muizers.Notifications.Notification;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginManager;
import uk.org.whoami.authme.AuthMe;
import uk.org.whoami.authme.ConsoleLogger;
import uk.org.whoami.authme.Utils;
import uk.org.whoami.authme.api.API;
import uk.org.whoami.authme.cache.auth.PlayerAuth;
import uk.org.whoami.authme.cache.auth.PlayerCache;
import uk.org.whoami.authme.cache.backup.FileCache;
import uk.org.whoami.authme.cache.limbo.LimboCache;
import uk.org.whoami.authme.cache.limbo.LimboPlayer;
import uk.org.whoami.authme.datasource.DataSource;
import uk.org.whoami.authme.events.AuthMeTeleportEvent;
import uk.org.whoami.authme.events.LoginEvent;
import uk.org.whoami.authme.events.RestoreInventoryEvent;
import uk.org.whoami.authme.events.SpawnTeleportEvent;
import uk.org.whoami.authme.listener.AuthMePlayerListener;
import uk.org.whoami.authme.security.PasswordSecurity;
import uk.org.whoami.authme.security.RandomString;
import uk.org.whoami.authme.settings.Messages;
import uk.org.whoami.authme.settings.PlayersLogs;
import uk.org.whoami.authme.settings.Settings;
import uk.org.whoami.authme.settings.Spawn;
public class LoginThread extends Thread {
private Messages m = Messages.getInstance();
private PlayersLogs pllog = PlayersLogs.getInstance();
private Utils utils = Utils.getInstance();
private FileCache playerCache = new FileCache();
private DataSource database;
public AuthMe plugin;
private boolean passpartu = false;
public RandomString rdm = new RandomString(Settings.captchaLength);
public PluginManager pm;
private Player player;
private String password;
public LoginThread(DataSource database, AuthMe plugin, Player player,
String password) {
this.database = database;
this.plugin = plugin;
this.pm = plugin.getServer().getPluginManager();
this.player = player;
this.password = password;
}
public LoginThread(DataSource database, boolean passpartu, AuthMe plugin,
Player player, String password) {
this.database = database;
this.passpartu = passpartu;
this.plugin = plugin;
this.pm = plugin.getServer().getPluginManager();
this.player = player;
this.password = password;
}
public void run() {
final String name = player.getName().toLowerCase();
String ip = player.getAddress().getAddress().getHostAddress();
if (Settings.bungee) {
if (plugin.realIp.containsKey(name))
ip = plugin.realIp.get(name);
}
World world = player.getWorld();
Location spawnLoc = world.getSpawnLocation();
if (plugin.mv != null) {
try {
spawnLoc = plugin.mv.getMVWorldManager().getMVWorld(world)
.getSpawnLocation();
} catch (NullPointerException npe) {
} catch (ClassCastException cce) {
} catch (NoClassDefFoundError ncdfe) {
}
}
if (plugin.essentialsSpawn != null) {
spawnLoc = plugin.essentialsSpawn;
}
if (Spawn.getInstance().getLocation() != null)
spawnLoc = Spawn.getInstance().getLocation();
if (PlayerCache.getInstance().isAuthenticated(name)) {
player.sendMessage(m._("logged_in"));
this.interrupt();
return;
}
if (!database.isAuthAvailable(player.getName().toLowerCase())) {
player.sendMessage(m._("user_unknown"));
this.interrupt();
return;
}
PlayerAuth pAuth = database.getAuth(name);
if (pAuth == null) {
player.sendMessage(m._("user_unknown"));
this.interrupt();
return;
}
if (!Settings.getMySQLColumnGroup.isEmpty()
&& pAuth.getGroupId() == Settings.getNonActivatedGroup) {
player.sendMessage(m._("vb_nonActiv"));
this.interrupt();
return;
}
String hash = pAuth.getHash();
String email = pAuth.getEmail();
try {
if (!passpartu) {
if (Settings.useCaptcha) {
if (!plugin.captcha.containsKey(name)) {
plugin.captcha.put(name, 1);
} else {
int i = plugin.captcha.get(name) + 1;
plugin.captcha.remove(name);
plugin.captcha.put(name, i);
}
if (plugin.captcha.containsKey(name)
&& plugin.captcha.get(name) > Settings.maxLoginTry) {
player.sendMessage(m._("need_captcha"));
plugin.cap.put(name, rdm.nextString());
player.sendMessage("Type : /captcha "
+ plugin.cap.get(name));
this.interrupt();
return;
} else if (plugin.captcha.containsKey(name)
&& plugin.captcha.get(name) > Settings.maxLoginTry) {
try {
plugin.captcha.remove(name);
plugin.cap.remove(name);
} catch (NullPointerException npe) {
}
}
}
if (PasswordSecurity.comparePasswordWithHash(password, hash,
name)) {
PlayerAuth auth = new PlayerAuth(name, hash, ip,
new Date().getTime(), email);
database.updateSession(auth);
PlayerCache.getInstance().addPlayer(auth);
final LimboPlayer limbo = LimboCache.getInstance()
.getLimboPlayer(name);
PlayerAuth getAuth = database.getAuth(name);
if (limbo != null) {
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
player.setOp(limbo.getOperator());
}
});
utils.addNormal(player, limbo.getGroup());
if ((Settings.isTeleportToSpawnEnabled)
&& (!Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds
.contains(player.getWorld().getName()))) {
if ((Settings.isSaveQuitLocationEnabled)
&& (getAuth.getQuitLocY() != 0)) {
utils.packCoords(getAuth.getQuitLocX(),
getAuth.getQuitLocY(),
getAuth.getQuitLocZ(),
getAuth.getWorld(), player);
} else {
Bukkit.getScheduler().runTask(plugin,
new Runnable() {
@Override
public void run() {
AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(
player, limbo.getLoc());
pm.callEvent(tpEvent);
Location fLoc = tpEvent.getTo();
if (!tpEvent.isCancelled()) {
if (!fLoc.getChunk()
.isLoaded()) {
fLoc.getChunk().load();
}
player.teleport(fLoc);
}
}
});
}
} else if (Settings.isForceSpawnLocOnJoinEnabled
&& Settings.getForcedWorlds.contains(player
.getWorld().getName())) {
final Location spawnL = spawnLoc;
Bukkit.getScheduler().runTask(plugin,
new Runnable() {
@Override
public void run() {
SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(
player, player
.getLocation(),
spawnL, true);
pm.callEvent(tpEvent);
if (!tpEvent.isCancelled()) {
Location fLoc = tpEvent.getTo();
if (!fLoc.getChunk().isLoaded()) {
fLoc.getChunk().load();
}
player.teleport(fLoc);
}
}
});
} else if ((Settings.isSaveQuitLocationEnabled)
&& (getAuth.getQuitLocY() != 0)) {
utils.packCoords(getAuth.getQuitLocX(),
getAuth.getQuitLocY(),
getAuth.getQuitLocZ(), getAuth.getWorld(),
player);
} else {
Bukkit.getScheduler().runTask(plugin,
new Runnable() {
@Override
public void run() {
AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(
player, limbo.getLoc());
pm.callEvent(tpEvent);
Location fLoc = tpEvent.getTo();
if (!tpEvent.isCancelled()) {
if (!fLoc.getChunk().isLoaded()) {
fLoc.getChunk().load();
}
player.teleport(fLoc);
}
}
});
}
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
player.setGameMode(GameMode.getByValue(limbo
.getGameMode()));
}
});
if (Settings.protectInventoryBeforeLogInEnabled
&& player.hasPlayedBefore()) {
Bukkit.getScheduler().runTask(plugin,
new Runnable() {
@Override
public void run() {
RestoreInventoryEvent event = new RestoreInventoryEvent(
player, limbo
.getInventory(),
limbo.getArmour());
Bukkit.getServer()
.getPluginManager()
.callEvent(event);
if (!event.isCancelled()) {
API.setPlayerInventory(player,
limbo.getInventory(),
limbo.getArmour());
}
}
});
}
player.getServer().getScheduler()
.cancelTask(limbo.getTimeoutTaskId());
player.getServer().getScheduler()
.cancelTask(limbo.getMessageTaskId());
LimboCache.getInstance().deleteLimboPlayer(name);
if (playerCache.doesCacheExist(name)) {
playerCache.removeCache(name);
}
}
/*
* Little Work Around under Registration Group Switching for
* admins that add Registration thru a web Scripts.
*/
if (Settings.isPermissionCheckEnabled
&& AuthMe.permission.playerInGroup(player,
Settings.unRegisteredGroup)
&& !Settings.unRegisteredGroup.isEmpty()) {
AuthMe.permission.playerRemoveGroup(player.getWorld(),
player.getName(), Settings.unRegisteredGroup);
AuthMe.permission.playerAddGroup(player.getWorld(),
player.getName(), Settings.getRegisteredGroup);
}
try {
if (!PlayersLogs.players.contains(player.getName()))
PlayersLogs.players.add(player.getName());
pllog.save();
} catch (NullPointerException ex) {
}
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
Bukkit.getServer().getPluginManager()
.callEvent(new LoginEvent(player, true));
}
});
if (Settings.useCaptcha) {
if (plugin.captcha.containsKey(name)) {
plugin.captcha.remove(name);
}
if (plugin.cap.containsKey(name)) {
plugin.cap.containsKey(name);
}
}
player.sendMessage(m._("login"));
displayOtherAccounts(auth);
if (!Settings.noConsoleSpam)
ConsoleLogger.info(player.getName() + " logged in!");
if (plugin.notifications != null) {
plugin.notifications
.showNotification(new Notification("[AuthMe] "
+ player.getName() + " logged in!"));
}
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
player.saveData();
}
});
this.interrupt();
return;
} else {
if (!Settings.noConsoleSpam)
ConsoleLogger.info(player.getName()
+ " used the wrong password");
if (Settings.isKickOnWrongPasswordEnabled) {
try {
final int gm = AuthMePlayerListener.gameMode
.get(name);
Bukkit.getScheduler().runTask(plugin,
new Runnable() {
@Override
public void run() {
player.setGameMode(GameMode
.getByValue(gm));
}
});
} catch (NullPointerException npe) {
}
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
player.kickPlayer(m._("wrong_pwd"));
}
});
} else {
player.sendMessage(m._("wrong_pwd"));
this.interrupt();
return;
}
}
} else {
// need for bypass password check if passpartu command is
// enabled
PlayerAuth auth = new PlayerAuth(name, hash, ip,
new Date().getTime(), email);
database.updateSession(auth);
PlayerCache.getInstance().addPlayer(auth);
final LimboPlayer limbo = LimboCache.getInstance()
.getLimboPlayer(name);
if (limbo != null) {
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
player.setOp(limbo.getOperator());
}
});
utils.addNormal(player, limbo.getGroup());
if ((Settings.isTeleportToSpawnEnabled)
&& (!Settings.isForceSpawnLocOnJoinEnabled && Settings.getForcedWorlds
.contains(player.getWorld().getName()))) {
if ((Settings.isSaveQuitLocationEnabled)
&& (database.getAuth(name).getQuitLocY() != 0)) {
String worldname = database.getAuth(name)
.getWorld();
World theWorld;
if (worldname.equals("unavailableworld")) {
theWorld = player.getWorld();
} else {
theWorld = Bukkit.getWorld(worldname);
}
if (theWorld == null)
theWorld = player.getWorld();
final Location quitLoc = new Location(
theWorld,
database.getAuth(name).getQuitLocX() + 0.5D,
database.getAuth(name).getQuitLocY() + 0.5D,
database.getAuth(name).getQuitLocZ() + 0.5D);
Bukkit.getScheduler().runTask(plugin,
new Runnable() {
@Override
public void run() {
AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(
player, quitLoc);
pm.callEvent(tpEvent);
Location fLoc = tpEvent.getTo();
if (!tpEvent.isCancelled()) {
if (!fLoc.getChunk().isLoaded()) {
fLoc.getChunk().load();
}
player.teleport(fLoc);
}
}
});
} else {
Bukkit.getScheduler().runTask(plugin,
new Runnable() {
@Override
public void run() {
AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(
player, limbo.getLoc());
pm.callEvent(tpEvent);
Location fLoc = tpEvent.getTo();
if (!tpEvent.isCancelled()) {
if (!fLoc.getChunk().isLoaded()) {
fLoc.getChunk().load();
}
player.teleport(fLoc);
}
}
});
}
} else if (Settings.isForceSpawnLocOnJoinEnabled
&& Settings.getForcedWorlds.contains(player
.getWorld().getName())) {
final Location spawnL = spawnLoc;
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
SpawnTeleportEvent tpEvent = new SpawnTeleportEvent(
player, player.getLocation(), spawnL,
true);
pm.callEvent(tpEvent);
if (!tpEvent.isCancelled()) {
Location fLoc = tpEvent.getTo();
if (!fLoc.getChunk().isLoaded()) {
fLoc.getChunk().load();
}
player.teleport(fLoc);
}
}
});
} else if ((Settings.isSaveQuitLocationEnabled)
&& (database.getAuth(name).getQuitLocY() != 0)) {
String worldname = database.getAuth(name).getWorld();
World theWorld;
if (worldname.equals("unavailableworld")) {
theWorld = player.getWorld();
} else {
theWorld = Bukkit.getWorld(worldname);
}
if (theWorld == null)
theWorld = player.getWorld();
final Location quitLoc = new Location(theWorld,
database.getAuth(name).getQuitLocX() + 0.5D,
database.getAuth(name).getQuitLocY() + 0.5D,
database.getAuth(name).getQuitLocZ() + 0.5D);
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(
player, quitLoc);
pm.callEvent(tpEvent);
Location fLoc = tpEvent.getTo();
if (!tpEvent.isCancelled()) {
if (!fLoc.getChunk().isLoaded()) {
fLoc.getChunk().load();
}
player.teleport(fLoc);
}
}
});
} else {
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
AuthMeTeleportEvent tpEvent = new AuthMeTeleportEvent(
player, limbo.getLoc());
pm.callEvent(tpEvent);
Location fLoc = tpEvent.getTo();
if (!tpEvent.isCancelled()) {
if (!fLoc.getChunk().isLoaded()) {
fLoc.getChunk().load();
}
player.teleport(fLoc);
}
}
});
}
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
player.setGameMode(GameMode.getByValue(limbo
.getGameMode()));
}
});
if (Settings.protectInventoryBeforeLogInEnabled
&& player.hasPlayedBefore()) {
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
RestoreInventoryEvent event = new RestoreInventoryEvent(
player, limbo.getInventory(), limbo
.getArmour());
Bukkit.getServer().getPluginManager()
.callEvent(event);
if (!event.isCancelled()) {
API.setPlayerInventory(player,
limbo.getInventory(),
limbo.getArmour());
}
}
});
}
player.getServer().getScheduler()
.cancelTask(limbo.getTimeoutTaskId());
player.getServer().getScheduler()
.cancelTask(limbo.getMessageTaskId());
LimboCache.getInstance().deleteLimboPlayer(name);
if (playerCache.doesCacheExist(name)) {
playerCache.removeCache(name);
}
}
/*
* Little Work Around under Registration Group Switching for
* admins that add Registration thru a web Scripts.
*/
if (Settings.isPermissionCheckEnabled
&& AuthMe.permission.playerInGroup(player,
Settings.unRegisteredGroup)
&& !Settings.unRegisteredGroup.isEmpty()) {
AuthMe.permission.playerRemoveGroup(player.getWorld(),
player.getName(), Settings.unRegisteredGroup);
AuthMe.permission.playerAddGroup(player.getWorld(),
player.getName(), Settings.getRegisteredGroup);
}
try {
if (!PlayersLogs.players.contains(player.getName()))
PlayersLogs.players.add(player.getName());
pllog.save();
} catch (NullPointerException ex) {
}
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
Bukkit.getServer().getPluginManager()
.callEvent(new LoginEvent(player, true));
}
});
if (Settings.useCaptcha) {
if (plugin.captcha.containsKey(name)) {
plugin.captcha.remove(name);
}
if (plugin.cap.containsKey(name)) {
plugin.cap.containsKey(name);
}
}
player.sendMessage(m._("login"));
displayOtherAccounts(auth);
if (!Settings.noConsoleSpam)
ConsoleLogger.info(player.getName() + " logged in!");
if (plugin.notifications != null) {
plugin.notifications.showNotification(new Notification(
"[AuthMe] " + player.getName() + " logged in!"));
}
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
player.saveData();
}
});
this.interrupt();
}
} catch (NoSuchAlgorithmException ex) {
ConsoleLogger.showError(ex.getMessage());
player.sendMessage(m._("error"));
this.interrupt();
return;
}
this.interrupt();
return;
}
private void displayOtherAccounts(PlayerAuth auth) {
if (!Settings.displayOtherAccounts) {
return;
}
if (auth == null) {
return;
}
if (this.database.getAllAuthsByName(auth).isEmpty()
|| this.database.getAllAuthsByName(auth) == null) {
return;
}
if (this.database.getAllAuthsByName(auth).size() == 1) {
return;
}
List<String> 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);
}
}
}
}

View File

@ -0,0 +1,305 @@
package uk.org.whoami.authme.threads;
import java.security.NoSuchAlgorithmException;
import java.util.Date;
import me.muizers.Notifications.Notification;
import org.bukkit.Bukkit;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitTask;
import uk.org.whoami.authme.AuthMe;
import uk.org.whoami.authme.ConsoleLogger;
import uk.org.whoami.authme.Utils;
import uk.org.whoami.authme.cache.auth.PlayerAuth;
import uk.org.whoami.authme.cache.auth.PlayerCache;
import uk.org.whoami.authme.cache.limbo.LimboCache;
import uk.org.whoami.authme.cache.limbo.LimboPlayer;
import uk.org.whoami.authme.datasource.DataSource;
import uk.org.whoami.authme.events.RegisterTeleportEvent;
import uk.org.whoami.authme.security.PasswordSecurity;
import uk.org.whoami.authme.security.RandomString;
import uk.org.whoami.authme.settings.Messages;
import uk.org.whoami.authme.settings.PlayersLogs;
import uk.org.whoami.authme.settings.Settings;
import uk.org.whoami.authme.settings.Spawn;
import uk.org.whoami.authme.task.MessageTask;
import uk.org.whoami.authme.task.TimeoutTask;
public class RegisterThread extends Thread {
private Messages m = Messages.getInstance();
private PlayersLogs pllog = PlayersLogs.getInstance();
private DataSource database;
private boolean isFirstTimeJoin;
private PlayerAuth auth;
private AuthMe plugin;
private Player player;
private String[] args;
private String ip;
public RegisterThread(AuthMe plugin, DataSource database, Player player, String ip, String[] args) {
this.database = database;
this.setFirstTimeJoin(false);
this.plugin = plugin;
this.player = player;
this.args = args.clone();
this.ip = ip;
}
public void run() {
final String name = player.getName().toLowerCase();
if (PlayerCache.getInstance().isAuthenticated(name)) {
player.sendMessage(m._("logged_in"));
this.interrupt();
return;
}
if (!Settings.isRegistrationEnabled) {
player.sendMessage(m._("reg_disabled"));
this.interrupt();
return;
}
if (database.isAuthAvailable(player.getName().toLowerCase())) {
player.sendMessage(m._("user_regged"));
if (pllog.getStringList("players").contains(player.getName())) {
pllog.getStringList("players").remove(player.getName());
}
this.interrupt();
return;
}
if(Settings.getmaxRegPerIp > 0 ){
if(!plugin.authmePermissible(player, "authme.allow2accounts") && database.getAllAuthsByIp(ip).size() >= Settings.getmaxRegPerIp) {
player.sendMessage(m._("max_reg"));
this.interrupt();
return;
}
}
if(Settings.emailRegistration && !Settings.getmailAccount.isEmpty()) {
if(!args[0].contains("@")) {
player.sendMessage(m._("usage_reg"));
this.interrupt();
return;
}
if(Settings.doubleEmailCheck) {
if(args.length < 2) {
player.sendMessage(m._("usage_reg"));
this.interrupt();
return;
}
if(!args[0].equals(args[1])) {
player.sendMessage(m._("usage_reg"));
this.interrupt();
return;
}
}
final String email = args[0];
if(Settings.getmaxRegPerEmail > 0) {
if (!plugin.authmePermissible(player, "authme.allow2accounts") && database.getAllAuthsByEmail(email).size() >= Settings.getmaxRegPerEmail) {
player.sendMessage(m._("max_reg"));
this.interrupt();
return;
}
}
RandomString rand = new RandomString(Settings.getRecoveryPassLength);
final String thePass = rand.nextString();
if (!thePass.isEmpty()) {
if (PasswordSecurity.userSalt.containsKey(name)) {
try {
final String hashnew = PasswordSecurity.getHash(Settings.getPasswordHash, thePass, name);
final PlayerAuth fAuth = new PlayerAuth(name, hashnew, PasswordSecurity.userSalt.get(name), ip, new Date().getTime(), (int) player.getLocation().getX() , (int) player.getLocation().getY(), (int) player.getLocation().getZ(), player.getWorld().getName(), email);
database.saveAuth(fAuth);
database.updateEmail(fAuth);
database.updateSession(fAuth);
plugin.mail.main(fAuth, thePass);
} catch (NoSuchAlgorithmException e) {
ConsoleLogger.showError(e.getMessage());
}
} else {
try {
final String hashnew = PasswordSecurity.getHash(Settings.getPasswordHash, thePass, name);
final PlayerAuth fAuth = new PlayerAuth(name, hashnew, ip, new Date().getTime(), (int) player.getLocation().getX() , (int) player.getLocation().getY(), (int) player.getLocation().getZ(), player.getWorld().getName(), email);
database.saveAuth(fAuth);
database.updateEmail(fAuth);
database.updateSession(fAuth);
plugin.mail.main(fAuth, thePass);
} catch (NoSuchAlgorithmException e) {
ConsoleLogger.showError(e.getMessage());
}
}
if(!Settings.getRegisteredGroup.isEmpty()){
Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED);
}
player.sendMessage(m._("vb_nonActiv"));
String msg = m._("login_msg");
int time = Settings.getRegistrationTimeout * 20;
int msgInterval = Settings.getWarnMessageInterval;
if (time != 0) {
Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getTimeoutTaskId());
BukkitTask id = Bukkit.getScheduler().runTaskLater(plugin, new TimeoutTask(plugin, name), time);
LimboCache.getInstance().getLimboPlayer(name).setTimeoutTaskId(id.getTaskId());
}
Bukkit.getScheduler().cancelTask(LimboCache.getInstance().getLimboPlayer(name).getMessageTaskId());
BukkitTask nwMsg = Bukkit.getScheduler().runTask(plugin, new MessageTask(plugin, name, msg, msgInterval));
LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(nwMsg.getTaskId());
LimboCache.getInstance().deleteLimboPlayer(name);
if (Settings.isTeleportToSpawnEnabled) {
World world = player.getWorld();
Location loca = world.getSpawnLocation();
if (plugin.mv != null) {
try {
loca = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation();
} catch (NullPointerException npe) {
} catch (ClassCastException cce) {
} catch (NoClassDefFoundError ncdfe) {
}
}
if (plugin.essentialsSpawn != null) {
loca = plugin.essentialsSpawn;
}
if (Spawn.getInstance().getLocation() != null)
loca = Spawn.getInstance().getLocation();
final Location locaT = loca;
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, locaT);
plugin.getServer().getPluginManager().callEvent(tpEvent);
if(!tpEvent.isCancelled()) {
if (!tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).isLoaded()) {
tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).load();
}
player.teleport(tpEvent.getTo());
}
}
});
}
this.setFirstTimeJoin(true);
player.saveData();
if (!Settings.noConsoleSpam)
ConsoleLogger.info(player.getName() + " registered "+player.getAddress().getAddress().getHostAddress());
if(plugin.notifications != null) {
plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " has registered!"));
}
this.interrupt();
return;
}
}
if (args.length == 0 || (Settings.getEnablePasswordVerifier && args.length < 2) ) {
player.sendMessage(m._("usage_reg"));
this.interrupt();
return;
}
if(args[0].length() < Settings.getPasswordMinLen || args[0].length() > Settings.passwordMaxLength) {
player.sendMessage(m._("pass_len"));
this.interrupt();
return;
}
try {
String hash;
if(Settings.getEnablePasswordVerifier) {
if (args[0].equals(args[1])) {
hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name);
} else {
player.sendMessage(m._("password_error"));
this.interrupt();
return;
}
} else
hash = PasswordSecurity.getHash(Settings.getPasswordHash, args[0], name);
if (Settings.getMySQLColumnSalt.isEmpty())
{
auth = new PlayerAuth(name, hash, ip, new Date().getTime());
} else {
auth = new PlayerAuth(name, hash, PasswordSecurity.userSalt.get(name), ip, new Date().getTime());
}
if (!database.saveAuth(auth)) {
player.sendMessage(m._("error"));
this.interrupt();
return;
}
PlayerCache.getInstance().addPlayer(auth);
final LimboPlayer limbo = LimboCache.getInstance().getLimboPlayer(name);
if (limbo != null) {
Bukkit.getScheduler().runTask(plugin, new Runnable(){
@Override
public void run() {
player.setGameMode(GameMode.getByValue(limbo.getGameMode()));
}
});
if (Settings.isTeleportToSpawnEnabled) {
World world = player.getWorld();
Location loca = world.getSpawnLocation();
if (plugin.mv != null) {
try {
loca = plugin.mv.getMVWorldManager().getMVWorld(world).getSpawnLocation();
} catch (NullPointerException npe) {
} catch (ClassCastException cce) {
} catch (NoClassDefFoundError ncdfe) {
}
}
if (plugin.essentialsSpawn != null) {
loca = plugin.essentialsSpawn;
}
if (Spawn.getInstance().getLocation() != null)
loca = Spawn.getInstance().getLocation();
final Location locaT = loca;
Bukkit.getScheduler().runTask(plugin, new Runnable(){
@Override
public void run() {
RegisterTeleportEvent tpEvent = new RegisterTeleportEvent(player, locaT);
plugin.getServer().getPluginManager().callEvent(tpEvent);
if(!tpEvent.isCancelled()) {
if (!tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).isLoaded()) {
tpEvent.getTo().getWorld().getChunkAt(tpEvent.getTo()).load();
}
player.teleport(tpEvent.getTo());
}
}
});
}
player.getServer().getScheduler().cancelTask(limbo.getTimeoutTaskId());
player.getServer().getScheduler().cancelTask(limbo.getMessageTaskId());
LimboCache.getInstance().deleteLimboPlayer(name);
}
if(!Settings.getRegisteredGroup.isEmpty()){
Utils.getInstance().setGroup(player, Utils.groupType.REGISTERED);
}
player.sendMessage(m._("registered"));
if (!Settings.getmailAccount.isEmpty())
player.sendMessage(m._("add_email"));
this.setFirstTimeJoin(true);
player.saveData();
if (!Settings.noConsoleSpam)
ConsoleLogger.info(player.getName() + " registered "+player.getAddress().getAddress().getHostAddress());
if(plugin.notifications != null) {
plugin.notifications.showNotification(new Notification("[AuthMe] " + player.getName() + " has registered!"));
}
this.interrupt();
} catch (NoSuchAlgorithmException ex) {
ConsoleLogger.showError(ex.getMessage());
player.sendMessage(m._("error"));
this.interrupt();
}
}
public void setFirstTimeJoin(boolean isFirstTimeJoin) {
this.isFirstTimeJoin = isFirstTimeJoin;
}
public boolean isFirstTimeJoin() {
return isFirstTimeJoin;
}
}

View File

@ -12,8 +12,9 @@ DataSource:
mySQLPassword: '12345' mySQLPassword: '12345'
caching: true caching: true
mySQLlastlocX: x mySQLlastlocX: x
mySQLlastlocY : y mySQLlastlocY: y
mySQLlastlocZ : z mySQLlastlocZ: z
mySQLlastlocWorld: world
mySQLColumnEmail: email mySQLColumnEmail: email
mySQLColumnId: id mySQLColumnId: id
GroupOptions: GroupOptions:
@ -81,6 +82,7 @@ ExternalBoardOptions:
mySQLColumnGroup: '' mySQLColumnGroup: ''
nonActivedUserGroup: -1 nonActivedUserGroup: -1
mySQLOtherUsernameColumns: [] mySQLOtherUsernameColumns: []
bCryptLog2Round: 10
Xenoforo: Xenoforo:
predefinedSalt: '' predefinedSalt: ''
permission: permission:
@ -119,10 +121,12 @@ Email:
mailSenderName: '' mailSenderName: ''
RecoveryPasswordLength: 8 RecoveryPasswordLength: 8
mailSubject: 'Your new AuthMe Password' mailSubject: 'Your new AuthMe Password'
mailText: 'Dear <playername>, \n\n This is your new AuthMe password for the server \n\n <servername> : \n\n <generatedpass>\n\nDo not forget to change password after login! \n /changepassword <generatedpass> newPassword' mailText: 'Dear <playername>, <br /><br /> This is your new AuthMe password for the server <br /><br /> <servername> : <br /><br /> <generatedpass><br /><br />Do not forget to change password after login! <br /> /changepassword <generatedpass> newPassword'
maxRegPerEmail: 1 maxRegPerEmail: 1
Hooks: Hooks:
multiverse: true multiverse: true
chestshop: true chestshop: true
bungeecord: false bungeecord: false
notifications: true notifications: true
Performances:
useMultiThreading: false

View File

@ -3,8 +3,8 @@ author: darkwarriors,Xephi
website: http://www.multiplayer-italia.com/ website: http://www.multiplayer-italia.com/
description: AuthMe prevents people, which aren't logged in, from doing stuff like placing blocks, moving, typing commands or seeing the inventory of the current player. description: AuthMe prevents people, which aren't logged in, from doing stuff like placing blocks, moving, typing commands or seeing the inventory of the current player.
main: uk.org.whoami.authme.AuthMe main: uk.org.whoami.authme.AuthMe
version: 2.7.16b4 version: 2.8
softdepend: [Vault, ChestShop, Spout, Multiverse-Core, Notifications, Citizens, CombatTag, Essentials] softdepend: [Vault, ChestShop, Spout, Multiverse-Core, Notifications, Citizens, CombatTag, Essentials, EssentialsSpawn]
commands: commands:
register: register:
description: Register an account description: Register an account