Merge remote-tracking branch 'origin/master' into authme-process

Conflicts:
	src/main/java/fr/xephi/authme/cache/limbo/LimboCache.java
	src/main/java/fr/xephi/authme/listener/AuthMePlayerListener.java
	src/main/java/fr/xephi/authme/process/register/AsyncRegister.java
	src/main/java/fr/xephi/authme/settings/Settings.java
This commit is contained in:
DNx5 2015-12-05 03:23:50 +07:00
commit 93484a3449
71 changed files with 1488 additions and 1274 deletions

View File

@ -285,7 +285,7 @@
<dependency> <dependency>
<groupId>com.zaxxer</groupId> <groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId> <artifactId>HikariCP</artifactId>
<version>2.4.1</version> <version>2.4.2</version>
<scope>compile</scope> <scope>compile</scope>
<exclusions> <exclusions>
<exclusion> <exclusion>
@ -298,7 +298,7 @@
<dependency> <dependency>
<groupId>org.slf4j</groupId> <groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId> <artifactId>slf4j-jdk14</artifactId>
<version>1.7.12</version> <version>1.7.13</version>
<scope>compile</scope> <scope>compile</scope>
<optional>true</optional> <optional>true</optional>
</dependency> </dependency>
@ -502,6 +502,10 @@
<artifactId>AllPay</artifactId> <artifactId>AllPay</artifactId>
<groupId>com.fernferret.allpay</groupId> <groupId>com.fernferret.allpay</groupId>
</exclusion> </exclusion>
<exclusion>
<artifactId>Vault</artifactId>
<groupId>net.milkbowl.vault</groupId>
</exclusion>
<exclusion> <exclusion>
<artifactId>VaultAPI</artifactId> <artifactId>VaultAPI</artifactId>
<groupId>net.milkbowl.vault</groupId> <groupId>net.milkbowl.vault</groupId>

View File

@ -1,8 +1,8 @@
package fr.xephi.authme; package fr.xephi.authme;
import fr.xephi.authme.permission.UserPermission; import fr.xephi.authme.permission.PlayerPermission;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.util.Wrapper; import fr.xephi.authme.util.Wrapper;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -73,7 +73,7 @@ public class AntiBot {
if (antiBotStatus == AntiBotStatus.ACTIVE || antiBotStatus == AntiBotStatus.DISABLED) { if (antiBotStatus == AntiBotStatus.ACTIVE || antiBotStatus == AntiBotStatus.DISABLED) {
return; return;
} }
if (plugin.getPermissionsManager().hasPermission(player, UserPermission.BYPASS_ANTIBOT)) { if (plugin.getPermissionsManager().hasPermission(player, PlayerPermission.BYPASS_ANTIBOT)) {
return; return;
} }

View File

@ -17,8 +17,12 @@ import fr.xephi.authme.hooks.BungeeCordMessage;
import fr.xephi.authme.hooks.EssSpawn; import fr.xephi.authme.hooks.EssSpawn;
import fr.xephi.authme.listener.*; import fr.xephi.authme.listener.*;
import fr.xephi.authme.modules.ModuleManager; import fr.xephi.authme.modules.ModuleManager;
import fr.xephi.authme.output.ConsoleFilter;
import fr.xephi.authme.output.Log4JFilter;
import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.output.Messages;
import fr.xephi.authme.permission.PermissionsManager; import fr.xephi.authme.permission.PermissionsManager;
import fr.xephi.authme.permission.UserPermission; import fr.xephi.authme.permission.PlayerPermission;
import fr.xephi.authme.process.Management; import fr.xephi.authme.process.Management;
import fr.xephi.authme.settings.*; import fr.xephi.authme.settings.*;
import fr.xephi.authme.util.GeoLiteAPI; import fr.xephi.authme.util.GeoLiteAPI;
@ -227,7 +231,7 @@ public class AuthMe extends JavaPlugin {
this.otherAccounts = OtherAccounts.getInstance(); this.otherAccounts = OtherAccounts.getInstance();
// Setup messages // Setup messages
this.messages = new Messages(Settings.messageFile, Settings.messagesLanguage); this.messages = Messages.getInstance();
// Set up Metrics // Set up Metrics
setupMetrics(); setupMetrics();
@ -735,7 +739,7 @@ public class AuthMe extends JavaPlugin {
public Player generateKickPlayer(Collection<? extends Player> collection) { public Player generateKickPlayer(Collection<? extends Player> collection) {
Player player = null; Player player = null;
for (Player p : collection) { for (Player p : collection) {
if (!getPermissionsManager().hasPermission(p, UserPermission.IS_VIP)) { if (!getPermissionsManager().hasPermission(p, PlayerPermission.IS_VIP)) {
player = p; player = p;
break; break;
} }

View File

@ -1,42 +0,0 @@
package fr.xephi.authme;
import java.util.logging.Filter;
import java.util.logging.LogRecord;
/**
* Console filter Class
*
* @author Xephi59
* @version $Revision: 1.0 $
*/
public class ConsoleFilter implements Filter {
public ConsoleFilter() {
}
/**
* Method isLoggable.
*
* @param record LogRecord
*
* @return boolean * @see java.util.logging.Filter#isLoggable(LogRecord)
*/
@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;
}
}
}

View File

@ -48,7 +48,7 @@ public class SendMailSSL {
final String subject = Settings.getMailSubject; final String subject = Settings.getMailSubject;
final String smtp = Settings.getmailSMTP; final String smtp = Settings.getmailSMTP;
final String password = Settings.getmailPassword; final String password = Settings.getmailPassword;
final String mailText = Settings.getMailText.replace("<playername>", auth.getNickname()).replace("<servername>", plugin.getServer().getServerName()).replace("<generatedpass>", newPass); final String mailText = Settings.getMailText.replace("%playername%", auth.getNickname()).replace("%servername%", plugin.getServer().getServerName()).replace("%generatedpass%", newPass);
final String mail = auth.getEmail(); final String mail = auth.getEmail();
Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() { Bukkit.getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@ -76,7 +76,7 @@ public class SendMailSSL {
ImageIO.write(gen.generateImage(), "jpg", file); ImageIO.write(gen.generateImage(), "jpg", file);
DataSource source = new FileDataSource(file); DataSource source = new FileDataSource(file);
String tag = email.embed(source, auth.getNickname() + "_new_pass.jpg"); String tag = email.embed(source, auth.getNickname() + "_new_pass.jpg");
content = content.replace("<image>", "<img src=\"cid:" + tag + "\">"); content = content.replace("%image%", "<img src=\"cid:" + tag + "\">");
} catch (Exception e) { } catch (Exception e) {
ConsoleLogger.showError("Unable to send new password as image! Using normal text! Dest: " + mail); ConsoleLogger.showError("Unable to send new password as image! Using normal text! Dest: " + mail);
} }
@ -86,8 +86,7 @@ public class SendMailSSL {
try { try {
email.send(); email.send();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); ConsoleLogger.showError("Fail to send a mail to " + mail + " cause " + e.getLocalizedMessage());
ConsoleLogger.showError("Fail to send a mail to " + mail);
} }
if (file != null) if (file != null)
//noinspection ResultOfMethodCallIgnored //noinspection ResultOfMethodCallIgnored

View File

@ -162,8 +162,10 @@ public class PlayerAuth {
* @param email String * @param email String
* @param realName String * @param realName String
*/ */
public PlayerAuth(String nickname, String hash, String salt, int groupId, String ip, long lastLogin, double x, double y, double z, String world, String email, String realName) { public PlayerAuth(String nickname, String hash, String salt, int groupId, String ip,
this.nickname = nickname; long lastLogin, double x, double y, double z, String world, String email,
String realName) {
this.nickname = nickname.toLowerCase();
this.hash = hash; this.hash = hash;
this.ip = ip; this.ip = ip;
this.lastLogin = lastLogin; this.lastLogin = lastLogin;
@ -202,7 +204,7 @@ public class PlayerAuth {
* @param nickname String * @param nickname String
*/ */
public void setName(String nickname) { public void setName(String nickname) {
this.nickname = nickname; this.nickname = nickname.toLowerCase();
} }
/** /**

View File

@ -117,10 +117,9 @@ public class LimboCache {
* @param name String * @param name String
*/ */
public void deleteLimboPlayer(String name) { public void deleteLimboPlayer(String name) {
if(cache.containsKey(name)) { if (name == null)
cache.get(name).clearTask(); return;
cache.remove(name); cache.remove(name);
}
} }
/** /**
@ -131,6 +130,8 @@ public class LimboCache {
* @return LimboPlayer * @return LimboPlayer
*/ */
public LimboPlayer getLimboPlayer(String name) { public LimboPlayer getLimboPlayer(String name) {
if (name == null)
return null;
return cache.get(name); return cache.get(name);
} }
@ -142,6 +143,8 @@ public class LimboCache {
* @return boolean * @return boolean
*/ */
public boolean hasLimboPlayer(String name) { public boolean hasLimboPlayer(String name) {
if (name == null)
return false;
return cache.containsKey(name); return cache.containsKey(name);
} }
@ -151,9 +154,8 @@ public class LimboCache {
* @param player Player * @param player Player
*/ */
public void updateLimboPlayer(Player player) { public void updateLimboPlayer(Player player) {
String name = player.getName().toLowerCase(); if (this.hasLimboPlayer(player.getName().toLowerCase())) {
if (hasLimboPlayer(name)) { this.deleteLimboPlayer(player.getName().toLowerCase());
deleteLimboPlayer(name);
} }
addLimboPlayer(player); addLimboPlayer(player);
} }

View File

@ -735,11 +735,11 @@ public class CommandDescription {
this.permissions = new CommandPermissions(permissionNode, defaultPermission); this.permissions = new CommandPermissions(permissionNode, defaultPermission);
} }
public static Builder builder() { public static CommandBuilder builder() {
return new Builder(); return new CommandBuilder();
} }
public static final class Builder { public static final class CommandBuilder {
private List<String> labels; private List<String> labels;
private String description; private String description;
private String detailedDescription; private String detailedDescription;
@ -767,47 +767,47 @@ public class CommandDescription {
); );
} }
public Builder labels(List<String> labels) { public CommandBuilder labels(List<String> labels) {
this.labels = labels; this.labels = labels;
return this; return this;
} }
public Builder labels(String... labels) { public CommandBuilder labels(String... labels) {
return labels(asMutableList(labels)); return labels(asMutableList(labels));
} }
public Builder description(String description) { public CommandBuilder description(String description) {
this.description = description; this.description = description;
return this; return this;
} }
public Builder detailedDescription(String detailedDescription) { public CommandBuilder detailedDescription(String detailedDescription) {
this.detailedDescription = detailedDescription; this.detailedDescription = detailedDescription;
return this; return this;
} }
public Builder executableCommand(ExecutableCommand executableCommand) { public CommandBuilder executableCommand(ExecutableCommand executableCommand) {
this.executableCommand = executableCommand; this.executableCommand = executableCommand;
return this; return this;
} }
public Builder parent(CommandDescription parent) { public CommandBuilder parent(CommandDescription parent) {
this.parent = parent; this.parent = parent;
return this; return this;
} }
public Builder withArgument(String label, String description, boolean isOptional) { public CommandBuilder withArgument(String label, String description, boolean isOptional) {
arguments.add(new CommandArgumentDescription(label, description, isOptional)); arguments.add(new CommandArgumentDescription(label, description, isOptional));
return this; return this;
} }
public Builder noArgumentMaximum(boolean noArgumentMaximum) { public CommandBuilder noArgumentMaximum(boolean noArgumentMaximum) {
this.noArgumentMaximum = noArgumentMaximum; this.noArgumentMaximum = noArgumentMaximum;
return this; return this;
} }
public Builder permissions(CommandPermissions.DefaultPermission defaultPermission, public CommandBuilder permissions(CommandPermissions.DefaultPermission defaultPermission,
PermissionNode... permissionNodes) { PermissionNode... permissionNodes) {
this.permissions = new CommandPermissions(asMutableList(permissionNodes), defaultPermission); this.permissions = new CommandPermissions(asMutableList(permissionNodes), defaultPermission);
return this; return this;
} }

View File

@ -10,7 +10,7 @@ import fr.xephi.authme.command.executable.email.RecoverEmailCommand;
import fr.xephi.authme.command.executable.login.LoginCommand; import fr.xephi.authme.command.executable.login.LoginCommand;
import fr.xephi.authme.command.executable.logout.LogoutCommand; import fr.xephi.authme.command.executable.logout.LogoutCommand;
import fr.xephi.authme.permission.AdminPermission; import fr.xephi.authme.permission.AdminPermission;
import fr.xephi.authme.permission.UserPermission; import fr.xephi.authme.permission.PlayerPermission;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@ -73,7 +73,7 @@ public class CommandManager {
.description("Register a player") .description("Register a player")
.detailedDescription("Register the specified player with the specified password.") .detailedDescription("Register the specified player with the specified password.")
.parent(authMeBaseCommand) .parent(authMeBaseCommand)
.permissions(OP_ONLY, UserPermission.REGISTER) .permissions(OP_ONLY, PlayerPermission.REGISTER)
.withArgument("player", "Player name", false) .withArgument("player", "Player name", false)
.withArgument("password", "Password", false) .withArgument("password", "Password", false)
.build(); .build();
@ -85,7 +85,7 @@ public class CommandManager {
.description("Unregister a player") .description("Unregister a player")
.detailedDescription("Unregister the specified player.") .detailedDescription("Unregister the specified player.")
.parent(authMeBaseCommand) .parent(authMeBaseCommand)
.permissions(OP_ONLY, UserPermission.UNREGISTER) .permissions(OP_ONLY, PlayerPermission.UNREGISTER)
.withArgument("player", "Player name", false) .withArgument("player", "Player name", false)
.build(); .build();
@ -96,7 +96,7 @@ public class CommandManager {
.description("Enforce login player") .description("Enforce login player")
.detailedDescription("Enforce the specified player to login.") .detailedDescription("Enforce the specified player to login.")
.parent(authMeBaseCommand) .parent(authMeBaseCommand)
.permissions(OP_ONLY, UserPermission.CAN_LOGIN_BE_FORCED) .permissions(OP_ONLY, PlayerPermission.CAN_LOGIN_BE_FORCED)
.withArgument("player", "Online player name", true) .withArgument("player", "Online player name", true)
.build(); .build();
@ -107,7 +107,7 @@ public class CommandManager {
.description("Change a player's password") .description("Change a player's password")
.detailedDescription("Change the password of a player.") .detailedDescription("Change the password of a player.")
.parent(authMeBaseCommand) .parent(authMeBaseCommand)
.permissions(OP_ONLY, UserPermission.CHANGE_PASSWORD) .permissions(OP_ONLY, AdminPermission.CHANGE_PASSWORD)
.withArgument("player", "Player name", false) .withArgument("player", "Player name", false)
.withArgument("pwd", "New password", false) .withArgument("pwd", "New password", false)
.build(); .build();
@ -135,35 +135,30 @@ public class CommandManager {
.build(); .build();
// Register the getemail command // Register the getemail command
CommandDescription getEmailCommand = new CommandDescription(new GetEmailCommand(), new ArrayList<String>() { CommandDescription getEmailCommand = CommandDescription.builder()
.executableCommand(new GetEmailCommand())
{ .labels("getemail", "getmail", "email", "mail")
add("getemail"); .description("Display player's email")
add("getmail"); .detailedDescription("Display the email address of the specified player if set.")
add("email"); .parent(authMeBaseCommand)
add("mail"); .permissions(OP_ONLY, AdminPermission.GET_EMAIL)
} .withArgument("player", "Player name", true)
}, "Display player's email", "Display the email address of the specified player if set.", authMeBaseCommand); .build();
getEmailCommand.setCommandPermissions(AdminPermission.GET_EMAIL, OP_ONLY);
getEmailCommand.addArgument(new CommandArgumentDescription("player", "Player name", true));
// Register the setemail command // Register the setemail command
CommandDescription setEmailCommand = new CommandDescription(new SetEmailCommand(), new ArrayList<String>() { CommandDescription setEmailCommand = CommandDescription.builder()
.executableCommand(new SetEmailCommand())
{ .labels("chgemail", "chgmail", "setemail", "setmail")
add("chgemail"); .description("Change player's email")
add("chgmail"); .detailedDescription("Change the email address of the specified player.")
add("setemail"); .parent(authMeBaseCommand)
add("setmail"); .permissions(OP_ONLY, AdminPermission.CHANGE_EMAIL)
} .withArgument("player", "Player name", false)
}, "Change player's email", "Change the email address of the specified player.", authMeBaseCommand); .withArgument("email", "Player email", false)
setEmailCommand.setCommandPermissions(AdminPermission.CHANGE_EMAIL, OP_ONLY); .build();
setEmailCommand.addArgument(new CommandArgumentDescription("player", "Player name", false));
setEmailCommand.addArgument(new CommandArgumentDescription("email", "Player email", false));
// Register the getip command // Register the getip command
CommandDescription getIpCommand = new CommandDescription(new GetIpCommand(), new ArrayList<String>() { CommandDescription getIpCommand = new CommandDescription(new GetIpCommand(), new ArrayList<String>() {
{ {
add("getip"); add("getip");
add("ip"); add("ip");
@ -174,7 +169,6 @@ public class CommandManager {
// Register the spawn command // Register the spawn command
CommandDescription spawnCommand = new CommandDescription(new SpawnCommand(), new ArrayList<String>() { CommandDescription spawnCommand = new CommandDescription(new SpawnCommand(), new ArrayList<String>() {
{ {
add("spawn"); add("spawn");
add("home"); add("home");
@ -184,7 +178,6 @@ public class CommandManager {
// Register the setspawn command // Register the setspawn command
CommandDescription setSpawnCommand = new CommandDescription(new SetSpawnCommand(), new ArrayList<String>() { CommandDescription setSpawnCommand = new CommandDescription(new SetSpawnCommand(), new ArrayList<String>() {
{ {
add("setspawn"); add("setspawn");
add("chgspawn"); add("chgspawn");
@ -194,7 +187,6 @@ public class CommandManager {
// Register the firstspawn command // Register the firstspawn command
CommandDescription firstSpawnCommand = new CommandDescription(new FirstSpawnCommand(), new ArrayList<String>() { CommandDescription firstSpawnCommand = new CommandDescription(new FirstSpawnCommand(), new ArrayList<String>() {
{ {
add("firstspawn"); add("firstspawn");
add("firsthome"); add("firsthome");
@ -204,7 +196,6 @@ public class CommandManager {
// Register the setfirstspawn command // Register the setfirstspawn command
CommandDescription setFirstSpawnCommand = new CommandDescription(new SetFirstSpawnCommand(), new ArrayList<String>() { CommandDescription setFirstSpawnCommand = new CommandDescription(new SetFirstSpawnCommand(), new ArrayList<String>() {
{ {
add("setfirstspawn"); add("setfirstspawn");
add("chgfirstspawn"); add("chgfirstspawn");
@ -214,7 +205,6 @@ public class CommandManager {
// Register the purge command // Register the purge command
CommandDescription purgeCommand = new CommandDescription(new PurgeCommand(), new ArrayList<String>() { CommandDescription purgeCommand = new CommandDescription(new PurgeCommand(), new ArrayList<String>() {
{ {
add("purge"); add("purge");
add("delete"); add("delete");
@ -225,7 +215,6 @@ public class CommandManager {
// Register the purgelastposition command // Register the purgelastposition command
CommandDescription purgeLastPositionCommand = new CommandDescription(new PurgeLastPositionCommand(), new ArrayList<String>() { CommandDescription purgeLastPositionCommand = new CommandDescription(new PurgeLastPositionCommand(), new ArrayList<String>() {
{ {
add("resetpos"); add("resetpos");
add("purgelastposition"); add("purgelastposition");
@ -240,7 +229,6 @@ public class CommandManager {
// Register the purgebannedplayers command // Register the purgebannedplayers command
CommandDescription purgeBannedPlayersCommand = new CommandDescription(new PurgeBannedPlayersCommand(), new ArrayList<String>() { CommandDescription purgeBannedPlayersCommand = new CommandDescription(new PurgeBannedPlayersCommand(), new ArrayList<String>() {
{ {
add("purgebannedplayers"); add("purgebannedplayers");
add("purgebannedplayer"); add("purgebannedplayer");
@ -252,7 +240,6 @@ public class CommandManager {
// Register the switchantibot command // Register the switchantibot command
CommandDescription switchAntiBotCommand = new CommandDescription(new SwitchAntiBotCommand(), new ArrayList<String>() { CommandDescription switchAntiBotCommand = new CommandDescription(new SwitchAntiBotCommand(), new ArrayList<String>() {
{ {
add("switchantibot"); add("switchantibot");
add("toggleantibot"); add("toggleantibot");
@ -277,7 +264,6 @@ public class CommandManager {
// Register the reload command // Register the reload command
CommandDescription reloadCommand = new CommandDescription(new ReloadCommand(), new ArrayList<String>() { CommandDescription reloadCommand = new CommandDescription(new ReloadCommand(), new ArrayList<String>() {
{ {
add("reload"); add("reload");
add("rld"); add("rld");
@ -302,7 +288,7 @@ public class CommandManager {
.description("Login command") .description("Login command")
.detailedDescription("Command to log in using AuthMeReloaded.") .detailedDescription("Command to log in using AuthMeReloaded.")
.parent(null) .parent(null)
.permissions(ALLOWED, UserPermission.LOGIN) .permissions(ALLOWED, PlayerPermission.LOGIN)
.withArgument("password", "Login password", false) .withArgument("password", "Login password", false)
.build(); .build();
@ -313,12 +299,11 @@ public class CommandManager {
// Register the base logout command // Register the base logout command
CommandDescription logoutBaseCommand = new CommandDescription(new LogoutCommand(), new ArrayList<String>() { CommandDescription logoutBaseCommand = new CommandDescription(new LogoutCommand(), new ArrayList<String>() {
{ {
add("logout"); add("logout");
} }
}, "Logout command", "Command to logout using AuthMeReloaded.", null); }, "Logout command", "Command to logout using AuthMeReloaded.", null);
logoutBaseCommand.setCommandPermissions(UserPermission.LOGOUT, CommandPermissions.DefaultPermission.ALLOWED); logoutBaseCommand.setCommandPermissions(PlayerPermission.LOGOUT, CommandPermissions.DefaultPermission.ALLOWED);
// Register the help command // Register the help command
CommandDescription logoutHelpCommand = new CommandDescription(helpCommandExecutable, helpCommandLabels, CommandDescription logoutHelpCommand = new CommandDescription(helpCommandExecutable, helpCommandLabels,
@ -327,13 +312,12 @@ public class CommandManager {
// Register the base register command // Register the base register command
CommandDescription registerBaseCommand = new CommandDescription(new fr.xephi.authme.command.executable.register.RegisterCommand(), new ArrayList<String>() { CommandDescription registerBaseCommand = new CommandDescription(new fr.xephi.authme.command.executable.register.RegisterCommand(), new ArrayList<String>() {
{ {
add("register"); add("register");
add("reg"); add("reg");
} }
}, "Registration command", "Command to register using AuthMeReloaded.", null); }, "Registration command", "Command to register using AuthMeReloaded.", null);
registerBaseCommand.setCommandPermissions(UserPermission.REGISTER, CommandPermissions.DefaultPermission.ALLOWED); registerBaseCommand.setCommandPermissions(PlayerPermission.REGISTER, CommandPermissions.DefaultPermission.ALLOWED);
registerBaseCommand.addArgument(new CommandArgumentDescription("password", "Password", false)); registerBaseCommand.addArgument(new CommandArgumentDescription("password", "Password", false));
registerBaseCommand.addArgument(new CommandArgumentDescription("verifyPassword", "Verify password", false)); registerBaseCommand.addArgument(new CommandArgumentDescription("verifyPassword", "Verify password", false));
@ -344,13 +328,12 @@ public class CommandManager {
// Register the base unregister command // Register the base unregister command
CommandDescription unregisterBaseCommand = new CommandDescription(new fr.xephi.authme.command.executable.unregister.UnregisterCommand(), new ArrayList<String>() { CommandDescription unregisterBaseCommand = new CommandDescription(new fr.xephi.authme.command.executable.unregister.UnregisterCommand(), new ArrayList<String>() {
{ {
add("unregister"); add("unregister");
add("unreg"); add("unreg");
} }
}, "Unregistration command", "Command to unregister using AuthMeReloaded.", null); }, "Unregistration command", "Command to unregister using AuthMeReloaded.", null);
unregisterBaseCommand.setCommandPermissions(UserPermission.UNREGISTER, CommandPermissions.DefaultPermission.ALLOWED); unregisterBaseCommand.setCommandPermissions(PlayerPermission.UNREGISTER, CommandPermissions.DefaultPermission.ALLOWED);
unregisterBaseCommand.addArgument(new CommandArgumentDescription("password", "Password", false)); unregisterBaseCommand.addArgument(new CommandArgumentDescription("password", "Password", false));
// Register the help command // Register the help command
@ -359,13 +342,12 @@ public class CommandManager {
// Register the base changepassword command // Register the base changepassword command
CommandDescription changePasswordBaseCommand = new CommandDescription(new fr.xephi.authme.command.executable.changepassword.ChangePasswordCommand(), new ArrayList<String>() { CommandDescription changePasswordBaseCommand = new CommandDescription(new fr.xephi.authme.command.executable.changepassword.ChangePasswordCommand(), new ArrayList<String>() {
{ {
add("changepassword"); add("changepassword");
add("changepass"); add("changepass");
} }
}, "Change password command", "Command to change your password using AuthMeReloaded.", null); }, "Change password command", "Command to change your password using AuthMeReloaded.", null);
changePasswordBaseCommand.setCommandPermissions(UserPermission.CHANGE_PASSWORD, CommandPermissions.DefaultPermission.ALLOWED); changePasswordBaseCommand.setCommandPermissions(PlayerPermission.CHANGE_PASSWORD, CommandPermissions.DefaultPermission.ALLOWED);
changePasswordBaseCommand.addArgument(new CommandArgumentDescription("password", "Password", false)); changePasswordBaseCommand.addArgument(new CommandArgumentDescription("password", "Password", false));
changePasswordBaseCommand.addArgument(new CommandArgumentDescription("verifyPassword", "Verify password", false)); changePasswordBaseCommand.addArgument(new CommandArgumentDescription("verifyPassword", "Verify password", false));
@ -376,7 +358,6 @@ public class CommandManager {
// Register the base Dungeon Maze command // Register the base Dungeon Maze command
CommandDescription emailBaseCommand = new CommandDescription(helpCommandExecutable, new ArrayList<String>() { CommandDescription emailBaseCommand = new CommandDescription(helpCommandExecutable, new ArrayList<String>() {
{ {
add("email"); add("email");
add("mail"); add("mail");
@ -390,33 +371,30 @@ public class CommandManager {
// Register the add command // Register the add command
CommandDescription addEmailCommand = new CommandDescription(new AddEmailCommand(), new ArrayList<String>() { CommandDescription addEmailCommand = new CommandDescription(new AddEmailCommand(), new ArrayList<String>() {
{ {
add("add"); add("add");
add("addemail"); add("addemail");
add("addmail"); add("addmail");
} }
}, "Add E-mail", "Add an new E-Mail address to your account.", emailBaseCommand); }, "Add E-mail", "Add an new E-Mail address to your account.", emailBaseCommand);
addEmailCommand.setCommandPermissions(UserPermission.ADD_EMAIL, CommandPermissions.DefaultPermission.ALLOWED); addEmailCommand.setCommandPermissions(PlayerPermission.ADD_EMAIL, CommandPermissions.DefaultPermission.ALLOWED);
addEmailCommand.addArgument(new CommandArgumentDescription("email", "Email address", false)); addEmailCommand.addArgument(new CommandArgumentDescription("email", "Email address", false));
addEmailCommand.addArgument(new CommandArgumentDescription("verifyEmail", "Email address verification", false)); addEmailCommand.addArgument(new CommandArgumentDescription("verifyEmail", "Email address verification", false));
// Register the change command // Register the change command
CommandDescription changeEmailCommand = new CommandDescription(new ChangeEmailCommand(), new ArrayList<String>() { CommandDescription changeEmailCommand = new CommandDescription(new ChangeEmailCommand(), new ArrayList<String>() {
{ {
add("change"); add("change");
add("changeemail"); add("changeemail");
add("changemail"); add("changemail");
} }
}, "Change E-mail", "Change an E-Mail address of your account.", emailBaseCommand); }, "Change E-mail", "Change an E-Mail address of your account.", emailBaseCommand);
changeEmailCommand.setCommandPermissions(UserPermission.CHANGE_EMAIL, CommandPermissions.DefaultPermission.ALLOWED); changeEmailCommand.setCommandPermissions(PlayerPermission.CHANGE_EMAIL, CommandPermissions.DefaultPermission.ALLOWED);
changeEmailCommand.addArgument(new CommandArgumentDescription("oldEmail", "Old email address", false)); changeEmailCommand.addArgument(new CommandArgumentDescription("oldEmail", "Old email address", false));
changeEmailCommand.addArgument(new CommandArgumentDescription("newEmail", "New email address", false)); changeEmailCommand.addArgument(new CommandArgumentDescription("newEmail", "New email address", false));
// Register the recover command // Register the recover command
CommandDescription recoverEmailCommand = new CommandDescription(new RecoverEmailCommand(), new ArrayList<String>() { CommandDescription recoverEmailCommand = new CommandDescription(new RecoverEmailCommand(), new ArrayList<String>() {
{ {
add("recover"); add("recover");
add("recovery"); add("recovery");
@ -424,18 +402,17 @@ public class CommandManager {
add("recovermail"); add("recovermail");
} }
}, "Recover using E-mail", "Recover your account using an E-mail address.", emailBaseCommand); }, "Recover using E-mail", "Recover your account using an E-mail address.", emailBaseCommand);
recoverEmailCommand.setCommandPermissions(UserPermission.RECOVER_EMAIL, CommandPermissions.DefaultPermission.ALLOWED); recoverEmailCommand.setCommandPermissions(PlayerPermission.RECOVER_EMAIL, CommandPermissions.DefaultPermission.ALLOWED);
recoverEmailCommand.addArgument(new CommandArgumentDescription("email", "Email address", false)); recoverEmailCommand.addArgument(new CommandArgumentDescription("email", "Email address", false));
// Register the base captcha command // Register the base captcha command
CommandDescription captchaBaseCommand = new CommandDescription(new CaptchaCommand(), new ArrayList<String>() { CommandDescription captchaBaseCommand = new CommandDescription(new CaptchaCommand(), new ArrayList<String>() {
{ {
add("captcha"); add("captcha");
add("capt"); add("capt");
} }
}, "Captcha command", "Captcha command for AuthMeReloaded.", null); }, "Captcha command", "Captcha command for AuthMeReloaded.", null);
captchaBaseCommand.setCommandPermissions(UserPermission.CAPTCHA, CommandPermissions.DefaultPermission.ALLOWED); captchaBaseCommand.setCommandPermissions(PlayerPermission.CAPTCHA, CommandPermissions.DefaultPermission.ALLOWED);
captchaBaseCommand.addArgument(new CommandArgumentDescription("captcha", "The captcha", false)); captchaBaseCommand.addArgument(new CommandArgumentDescription("captcha", "The captcha", false));
// Register the help command // Register the help command
@ -445,14 +422,13 @@ public class CommandManager {
// Register the base converter command // Register the base converter command
CommandDescription converterBaseCommand = new CommandDescription(new ConverterCommand(), new ArrayList<String>() { CommandDescription converterBaseCommand = new CommandDescription(new ConverterCommand(), new ArrayList<String>() {
{ {
add("converter"); add("converter");
add("convert"); add("convert");
add("conv"); add("conv");
} }
}, "Convert command", "Convert command for AuthMeReloaded.", null); }, "Convert command", "Convert command for AuthMeReloaded.", null);
converterBaseCommand.setCommandPermissions(UserPermission.CONVERTER, OP_ONLY); converterBaseCommand.setCommandPermissions(AdminPermission.CONVERTER, OP_ONLY);
converterBaseCommand.addArgument(new CommandArgumentDescription("job", "Conversion job: flattosql / flattosqlite /| xauth / crazylogin / rakamak / royalauth / vauth / sqltoflat", false)); converterBaseCommand.addArgument(new CommandArgumentDescription("job", "Conversion job: flattosql / flattosqlite /| xauth / crazylogin / rakamak / royalauth / vauth / sqltoflat", false));
// Register the help command // Register the help command

View File

@ -5,8 +5,8 @@ import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerAuth;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -7,8 +7,8 @@ import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.security.PasswordSecurity; import fr.xephi.authme.security.PasswordSecurity;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -16,6 +16,7 @@ import org.bukkit.command.CommandSender;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
/** /**
* Admin command for changing a player's password.
*/ */
public class ChangePasswordCommand extends ExecutableCommand { public class ChangePasswordCommand extends ExecutableCommand {
@ -31,23 +32,26 @@ public class ChangePasswordCommand extends ExecutableCommand {
// Validate the password // Validate the password
String playerPassLowerCase = playerPass.toLowerCase(); String playerPassLowerCase = playerPass.toLowerCase();
if (playerPassLowerCase.contains("delete") || playerPassLowerCase.contains("where") || playerPassLowerCase.contains("insert") || playerPassLowerCase.contains("modify") || playerPassLowerCase.contains("from") || playerPassLowerCase.contains("select") || playerPassLowerCase.contains(";") || playerPassLowerCase.contains("null") || !playerPassLowerCase.matches(Settings.getPassRegex)) { if (playerPassLowerCase.contains("delete") || playerPassLowerCase.contains("where")
m.send(sender, MessageKey.PASSWORD_IS_USERNAME_ERROR); || playerPassLowerCase.contains("insert") || playerPassLowerCase.contains("modify")
|| playerPassLowerCase.contains("from") || playerPassLowerCase.contains("select")
|| playerPassLowerCase.contains(";") || playerPassLowerCase.contains("null")
|| !playerPassLowerCase.matches(Settings.getPassRegex)) {
m.send(sender, MessageKey.PASSWORD_MATCH_ERROR);
return true; return true;
} }
if (playerPassLowerCase.equalsIgnoreCase(playerName)) { if (playerPassLowerCase.equalsIgnoreCase(playerName)) {
m.send(sender, MessageKey.PASSWORD_IS_USERNAME_ERROR); m.send(sender, MessageKey.PASSWORD_IS_USERNAME_ERROR);
return true; return true;
} }
if (playerPassLowerCase.length() < Settings.getPasswordMinLen || playerPassLowerCase.length() > Settings.passwordMaxLength) { if (playerPassLowerCase.length() < Settings.getPasswordMinLen
|| playerPassLowerCase.length() > Settings.passwordMaxLength) {
m.send(sender, MessageKey.INVALID_PASSWORD_LENGTH); m.send(sender, MessageKey.INVALID_PASSWORD_LENGTH);
return true; return true;
} }
if (!Settings.unsafePasswords.isEmpty()) { if (!Settings.unsafePasswords.isEmpty() && Settings.unsafePasswords.contains(playerPassLowerCase)) {
if (Settings.unsafePasswords.contains(playerPassLowerCase)) { m.send(sender, MessageKey.PASSWORD_UNSAFE_ERROR);
m.send(sender, MessageKey.PASSWORD_UNSAFE_ERROR); return true;
return true;
}
} }
// Set the password // Set the password
final String playerNameLowerCase = playerName.toLowerCase(); final String playerNameLowerCase = playerName.toLowerCase();

View File

@ -3,7 +3,7 @@ package fr.xephi.authme.command.executable.authme;
import fr.xephi.authme.AuthMe; import fr.xephi.authme.AuthMe;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.permission.UserPermission; import fr.xephi.authme.permission.PlayerPermission;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -30,7 +30,7 @@ public class ForceLoginCommand extends ExecutableCommand {
sender.sendMessage("Player needs to be online!"); sender.sendMessage("Player needs to be online!");
return true; return true;
} }
if (!plugin.getPermissionsManager().hasPermission(player, UserPermission.CAN_LOGIN_BE_FORCED)) { if (!plugin.getPermissionsManager().hasPermission(player, PlayerPermission.CAN_LOGIN_BE_FORCED)) {
sender.sendMessage("You cannot force login for the player " + playerName + "!"); sender.sendMessage("You cannot force login for the player " + playerName + "!");
return true; return true;
} }

View File

@ -4,8 +4,8 @@ import fr.xephi.authme.AuthMe;
import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerAuth;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
/** /**

View File

@ -4,8 +4,8 @@ import fr.xephi.authme.AuthMe;
import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerAuth;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import java.util.Date; import java.util.Date;

View File

@ -5,8 +5,8 @@ import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerAuth;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -6,8 +6,8 @@ import fr.xephi.authme.cache.auth.PlayerAuth;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.security.PasswordSecurity; import fr.xephi.authme.security.PasswordSecurity;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -6,8 +6,8 @@ import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.util.Profiler; import fr.xephi.authme.util.Profiler;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -41,7 +41,7 @@ public class ReloadCommand extends ExecutableCommand {
try { try {
Settings.reload(); Settings.reload();
plugin.setMessages(new Messages(Settings.messageFile, Settings.messagesLanguage)); Messages.getInstance().reloadManager();
plugin.getModuleManager().reloadModules(); plugin.getModuleManager().reloadModules();
plugin.setupDatabase(); plugin.setupDatabase();
} catch (Exception e) { } catch (Exception e) {

View File

@ -5,8 +5,8 @@ import fr.xephi.authme.cache.auth.PlayerAuth;
import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -6,8 +6,8 @@ import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.cache.limbo.LimboCache; import fr.xephi.authme.cache.limbo.LimboCache;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.task.MessageTask; import fr.xephi.authme.task.MessageTask;
import fr.xephi.authme.task.TimeoutTask; import fr.xephi.authme.task.TimeoutTask;

View File

@ -5,8 +5,8 @@ import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.security.RandomString; import fr.xephi.authme.security.RandomString;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -4,8 +4,8 @@ import fr.xephi.authme.AuthMe;
import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.task.ChangePasswordTask; import fr.xephi.authme.task.ChangePasswordTask;
import fr.xephi.authme.util.Wrapper; import fr.xephi.authme.util.Wrapper;
@ -13,6 +13,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
/** /**
* The command for a player to change his password with.
*/ */
public class ChangePasswordCommand extends ExecutableCommand { public class ChangePasswordCommand extends ExecutableCommand {
@ -27,10 +28,10 @@ public class ChangePasswordCommand extends ExecutableCommand {
final Messages m = wrapper.getMessages(); final Messages m = wrapper.getMessages();
// Get the passwords // Get the passwords
String playerPass = commandArguments.get(0); String oldPassword = commandArguments.get(0);
String playerPassVerify = commandArguments.get(1); String newPassword = commandArguments.get(1);
// Get the player instance and make sure it's authenticated // Get the player instance and make sure he's authenticated
Player player = (Player) sender; Player player = (Player) sender;
String name = player.getName().toLowerCase(); String name = player.getName().toLowerCase();
final PlayerCache playerCache = wrapper.getPlayerCache(); final PlayerCache playerCache = wrapper.getPlayerCache();
@ -40,8 +41,7 @@ public class ChangePasswordCommand extends ExecutableCommand {
} }
// Make sure the password is allowed // Make sure the password is allowed
// TODO ljacqu 20151121: The password confirmation appears to be never verified String playerPassLowerCase = newPassword.toLowerCase();
String playerPassLowerCase = playerPass.toLowerCase();
if (playerPassLowerCase.contains("delete") || playerPassLowerCase.contains("where") if (playerPassLowerCase.contains("delete") || playerPassLowerCase.contains("where")
|| playerPassLowerCase.contains("insert") || playerPassLowerCase.contains("modify") || playerPassLowerCase.contains("insert") || playerPassLowerCase.contains("modify")
|| playerPassLowerCase.contains("from") || playerPassLowerCase.contains("select") || playerPassLowerCase.contains("from") || playerPassLowerCase.contains("select")
@ -66,8 +66,8 @@ public class ChangePasswordCommand extends ExecutableCommand {
// Set the password // Set the password
final AuthMe plugin = wrapper.getAuthMe(); final AuthMe plugin = wrapper.getAuthMe();
wrapper.getServer().getScheduler().runTaskAsynchronously(plugin, wrapper.getScheduler().runTaskAsynchronously(plugin,
new ChangePasswordTask(plugin, player, playerPass, playerPassVerify)); new ChangePasswordTask(plugin, player, oldPassword, newPassword));
return true; return true;
} }
} }

View File

@ -4,8 +4,8 @@ import fr.xephi.authme.AuthMe;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.converter.*; import fr.xephi.authme.converter.*;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -8,8 +8,8 @@ import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.security.PasswordSecurity; import fr.xephi.authme.security.PasswordSecurity;
import fr.xephi.authme.security.RandomString; import fr.xephi.authme.security.RandomString;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.util.Wrapper; import fr.xephi.authme.util.Wrapper;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;

View File

@ -5,8 +5,8 @@ import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.process.Management; import fr.xephi.authme.process.Management;
import fr.xephi.authme.security.RandomString; import fr.xephi.authme.security.RandomString;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.util.Wrapper; import fr.xephi.authme.util.Wrapper;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
@ -55,7 +55,7 @@ public class RegisterCommand extends ExecutableCommand {
} }
if (commandArguments.getCount() > 1 && Settings.getEnablePasswordVerifier) { if (commandArguments.getCount() > 1 && Settings.getEnablePasswordVerifier) {
if (!commandArguments.get(0).equals(commandArguments.get(1))) { if (!commandArguments.get(0).equals(commandArguments.get(1))) {
m.send(player, MessageKey.PASSWORD_IS_USERNAME_ERROR); m.send(player, MessageKey.PASSWORD_MATCH_ERROR);
return true; return true;
} }
} }

View File

@ -4,8 +4,8 @@ import fr.xephi.authme.AuthMe;
import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.command.ExecutableCommand; import fr.xephi.authme.command.ExecutableCommand;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -5,7 +5,7 @@ import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerAuth;
import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.datasource.FlatFile; import fr.xephi.authme.datasource.FlatFile;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import java.util.List; import java.util.List;

View File

@ -42,16 +42,16 @@ public class vAuthFileReader {
String name = line.split(": ")[0]; String name = line.split(": ")[0];
String password = line.split(": ")[1]; String password = line.split(": ")[1];
PlayerAuth auth; PlayerAuth auth;
if (isUUIDinstance(password)) { if (isUuidInstance(password)) {
String playerName; String pname;
try { try {
playerName = Bukkit.getOfflinePlayer(UUID.fromString(name)).getName(); pname = Bukkit.getOfflinePlayer(UUID.fromString(name)).getName();
} catch (Exception | NoSuchMethodError e) { } catch (Exception | NoSuchMethodError e) {
playerName = getName(UUID.fromString(name)); pname = getName(UUID.fromString(name));
} }
if (playerName == null) if (pname == null)
continue; continue;
auth = new PlayerAuth(playerName.toLowerCase(), password, "127.0.0.1", System.currentTimeMillis(), "your@email.com", playerName); auth = new PlayerAuth(pname.toLowerCase(), password, "127.0.0.1", System.currentTimeMillis(), "your@email.com", pname);
} else { } else {
auth = new PlayerAuth(name.toLowerCase(), password, "127.0.0.1", System.currentTimeMillis(), "your@email.com", name); auth = new PlayerAuth(name.toLowerCase(), password, "127.0.0.1", System.currentTimeMillis(), "your@email.com", name);
} }
@ -64,17 +64,8 @@ public class vAuthFileReader {
} }
/** private static boolean isUuidInstance(String s) {
* Method isUUIDinstance. return s.length() > 8 && s.charAt(8) == '-';
*
* @param s String
*
* @return boolean
*/
private boolean isUUIDinstance(String s) {
if (String.valueOf(s.charAt(8)).equalsIgnoreCase("-"))
return true;
return true;
} }
/** /**

File diff suppressed because it is too large Load Diff

View File

@ -32,6 +32,8 @@ import org.bukkit.event.player.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import static fr.xephi.authme.output.MessageKey.USERNAME_ALREADY_ONLINE_ERROR;
/** /**
*/ */
public class AuthMePlayerListener implements Listener { public class AuthMePlayerListener implements Listener {
@ -268,7 +270,7 @@ public class AuthMePlayerListener implements Listener {
PermissionsManager permsMan = plugin.getPermissionsManager(); PermissionsManager permsMan = plugin.getPermissionsManager();
final Player player = event.getPlayer(); final Player player = event.getPlayer();
if (event.getResult() == PlayerLoginEvent.Result.KICK_FULL && !permsMan.hasPermission(player, UserPermission.IS_VIP)) { if (event.getResult() == PlayerLoginEvent.Result.KICK_FULL && !permsMan.hasPermission(player, PlayerPermission.IS_VIP)) {
event.setKickMessage(m.retrieveSingle(MessageKey.KICK_FULL_SERVER)); event.setKickMessage(m.retrieveSingle(MessageKey.KICK_FULL_SERVER));
event.setResult(PlayerLoginEvent.Result.KICK_FULL); event.setResult(PlayerLoginEvent.Result.KICK_FULL);
return; return;
@ -280,7 +282,7 @@ public class AuthMePlayerListener implements Listener {
// TODO: Add message to the messages file!!! // TODO: Add message to the messages file!!!
if (Settings.isKickNonRegisteredEnabled && !isAuthAvailable) { if (Settings.isKickNonRegisteredEnabled && !isAuthAvailable) {
if (Settings.antiBotInAction) { if (Settings.antiBotInAction) {
event.setKickMessage("AntiBot service in action! You actually need to be registered!"); event.setKickMessage(m.retrieveSingle(MessageKey.KICK_ANTIBOT));
event.setResult(PlayerLoginEvent.Result.KICK_OTHER); event.setResult(PlayerLoginEvent.Result.KICK_OTHER);
return; return;
} else { } else {

View File

@ -2,8 +2,8 @@ package fr.xephi.authme.listener;
import fr.xephi.authme.AuthMe; import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.util.GeoLiteAPI; import fr.xephi.authme.util.GeoLiteAPI;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;

View File

@ -0,0 +1,26 @@
package fr.xephi.authme.output;
import java.util.logging.Filter;
import java.util.logging.LogRecord;
/**
* Console filter to replace sensitive AuthMe commands with a generic message.
*
* @author Xephi59
*/
public class ConsoleFilter implements Filter {
@Override
public boolean isLoggable(LogRecord record) {
if (record == null || record.getMessage() == null) {
return true;
}
if (LogFilterHelper.isSensitiveAuthMeCommand(record.getMessage())) {
String playerName = record.getMessage().split(" ")[0];
record.setMessage(playerName + " issued an AuthMe command");
}
return true;
}
}

View File

@ -1,8 +1,8 @@
package fr.xephi.authme; package fr.xephi.authme.output;
import fr.xephi.authme.util.StringUtils;
import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger; import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.message.Message;
@ -11,16 +11,8 @@ import org.apache.logging.log4j.message.Message;
* Implements a filter for Log4j to skip sensitive AuthMe commands. * Implements a filter for Log4j to skip sensitive AuthMe commands.
* *
* @author Xephi59 * @author Xephi59
* @version $Revision: 1.0 $
*/ */
public class Log4JFilter implements org.apache.logging.log4j.core.Filter { public class Log4JFilter implements Filter {
/**
* List of commands (lower-case) to skip.
*/
private static final String[] COMMANDS_TO_SKIP = {"/login ", "/l ", "/reg ", "/changepassword ",
"/unregister ", "/authme register ", "/authme changepassword ", "/authme reg ", "/authme cp ",
"/register "};
/** /**
* Constructor. * Constructor.
@ -29,13 +21,12 @@ public class Log4JFilter implements org.apache.logging.log4j.core.Filter {
} }
/** /**
* Validates a Message instance and returns the {@link Result} value * Validate a Message instance and return the {@link Result} value
* depending depending on whether the message contains sensitive AuthMe * depending on whether the message contains sensitive AuthMe data.
* data.
* *
* @param message the Message object to verify * @param message The Message object to verify
* *
* @return the Result value * @return The Result value
*/ */
private static Result validateMessage(Message message) { private static Result validateMessage(Message message) {
if (message == null) { if (message == null) {
@ -45,24 +36,17 @@ public class Log4JFilter implements org.apache.logging.log4j.core.Filter {
} }
/** /**
* Validates a message and returns the {@link Result} value depending * Validate a message and return the {@link Result} value depending
* depending on whether the message contains sensitive AuthMe data. * on whether the message contains sensitive AuthMe data.
* *
* @param message the message to verify * @param message The message to verify
* *
* @return the Result value * @return The Result value
*/ */
private static Result validateMessage(String message) { private static Result validateMessage(String message) {
if (message == null) { return LogFilterHelper.isSensitiveAuthMeCommand(message)
return Result.NEUTRAL; ? Result.DENY
} : Result.NEUTRAL;
String lowerMessage = message.toLowerCase();
if (lowerMessage.contains("issued server command:")
&& StringUtils.containsAny(lowerMessage, COMMANDS_TO_SKIP)) {
return Result.DENY;
}
return Result.NEUTRAL;
} }
@Override @Override
@ -74,14 +58,12 @@ public class Log4JFilter implements org.apache.logging.log4j.core.Filter {
} }
@Override @Override
public Result filter(Logger arg0, Level arg1, Marker arg2, String message, public Result filter(Logger arg0, Level arg1, Marker arg2, String message, Object... arg4) {
Object... arg4) {
return validateMessage(message); return validateMessage(message);
} }
@Override @Override
public Result filter(Logger arg0, Level arg1, Marker arg2, Object message, public Result filter(Logger arg0, Level arg1, Marker arg2, Object message, Throwable arg4) {
Throwable arg4) {
if (message == null) { if (message == null) {
return Result.NEUTRAL; return Result.NEUTRAL;
} }
@ -89,8 +71,7 @@ public class Log4JFilter implements org.apache.logging.log4j.core.Filter {
} }
@Override @Override
public Result filter(Logger arg0, Level arg1, Marker arg2, Message message, public Result filter(Logger arg0, Level arg1, Marker arg2, Message message, Throwable arg4) {
Throwable arg4) {
return validateMessage(message); return validateMessage(message);
} }

View File

@ -0,0 +1,34 @@
package fr.xephi.authme.output;
import fr.xephi.authme.util.StringUtils;
/**
* Service class for the log filters.
*/
public final class LogFilterHelper {
private static final String ISSUED_COMMAND_TEXT = "issued server command:";
private static final String[] COMMANDS_TO_SKIP = {"/login ", "/l ", "/reg ", "/changepassword ",
"/unregister ", "/authme register ", "/authme changepassword ", "/authme reg ", "/authme cp ",
"/register "};
private LogFilterHelper() {
// Util class
}
/**
* Validate a message and return whether the message contains a sensitive AuthMe command.
*
* @param message The message to verify
*
* @return True if it is a sensitive AuthMe command, false otherwise
*/
public static boolean isSensitiveAuthMeCommand(String message) {
if (message == null) {
return false;
}
String lowerMessage = message.toLowerCase();
return lowerMessage.contains(ISSUED_COMMAND_TEXT) && StringUtils.containsAny(lowerMessage, COMMANDS_TO_SKIP);
}
}

View File

@ -1,10 +1,12 @@
package fr.xephi.authme.settings; package fr.xephi.authme.output;
/** /**
* Keys for translatable messages managed by {@link Messages}. * Keys for translatable messages managed by {@link Messages}.
*/ */
public enum MessageKey { public enum MessageKey {
KICK_ANTIBOT("kick_antibot"),
UNKNOWN_USER("unknown_user"), UNKNOWN_USER("unknown_user"),
UNSAFE_QUIT_LOCATION("unsafe_spawn"), UNSAFE_QUIT_LOCATION("unsafe_spawn"),

View File

@ -0,0 +1,82 @@
package fr.xephi.authme.output;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.util.StringUtils;
import org.bukkit.command.CommandSender;
/**
* Class for retrieving and sending translatable messages to players.
* This class detects when the language settings have changed and will
* automatically update to use a new language file.
*/
public class Messages {
private static Messages singleton;
private final String language;
private MessagesManager manager;
private Messages(String language, MessagesManager manager) {
this.language = language;
this.manager = manager;
}
/**
* Get the instance of Messages.
*
* @return The Messages instance
*/
public static Messages getInstance() {
if (singleton == null) {
MessagesManager manager = new MessagesManager(Settings.messageFile);
singleton = new Messages(Settings.messagesLanguage, manager);
}
return singleton;
}
/**
* Send the given message code to the player.
*
* @param sender The entity to send the message to
* @param key The key of the message to send
*/
public void send(CommandSender sender, MessageKey key) {
String[] lines = manager.retrieve(key.getKey());
for (String line : lines) {
sender.sendMessage(line);
}
}
/**
* Retrieve the message from the text file and return it split by new line as an array.
*
* @param key The message key to retrieve
*
* @return The message split by new lines
*/
public String[] retrieve(MessageKey key) {
if (!Settings.messagesLanguage.equalsIgnoreCase(language)) {
reloadManager();
}
return manager.retrieve(key.getKey());
}
/**
* Retrieve the message from the text file.
*
* @param key The message key to retrieve
*
* @return The message from the file
*/
public String retrieveSingle(MessageKey key) {
return StringUtils.join("\n", retrieve(key));
}
/**
* Reload the messages manager.
*/
public void reloadManager() {
manager = new MessagesManager(Settings.messageFile);
}
}

View File

@ -0,0 +1,62 @@
package fr.xephi.authme.output;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.settings.CustomConfiguration;
import java.io.File;
/**
* Class responsible for reading messages from a file and formatting them for Minecraft.
* <p />
* This class is used within {@link Messages}, which offers a high-level interface for accessing
* or sending messages from a properties file.
*/
class MessagesManager extends CustomConfiguration {
/** The section symbol, used in Minecraft for formatting codes. */
private static final String SECTION_SIGN = "\u00a7";
/**
* Constructor for Messages.
*
* @param file the configuration file
*/
MessagesManager(File file) {
super(file);
load();
}
/**
* Retrieve the message from the configuration file.
*
* @param key The key to retrieve
*
* @return The message
*/
String[] retrieve(String key) {
String message = (String) get(key);
if (message != null) {
return formatMessage(message);
}
// Message is null: log key not being found and send error back as message
String retrievalError = "Error getting message with key '" + key + "'. ";
ConsoleLogger.showError(retrievalError + "Please verify your config file at '"
+ getConfigFile().getName() + "'");
return new String[]{
retrievalError + "Please contact the admin to verify or update the AuthMe messages file."};
}
static String[] formatMessage(String message) {
// TODO: Check that the codes actually exist, i.e. replace &c but not &y
// TODO: Allow '&' to be retained with the code '&&'
String[] lines = message.split("&n");
for (int i = 0; i < lines.length; ++i) {
// We don't initialize a StringBuilder here because mostly we will only have one entry
lines[i] = lines[i].replace("&", SECTION_SIGN);
}
return lines;
}
}

View File

@ -1,55 +1,125 @@
package fr.xephi.authme.permission; package fr.xephi.authme.permission;
/** /**
* AuthMe admin permissions. * AuthMe admin command permissions.
*/ */
public enum AdminPermission implements PermissionNode { public enum AdminPermission implements PermissionNode {
REGISTER("authme.admin.register"), /**
* Administrator command to register a new user.
*/
REGISTER("authme.command.admin.register"),
UNREGISTER("authme.admin.unregister"), /**
* Administrator command to unregister an existing user.
*/
UNREGISTER("authme.command.admin.unregister"),
FORCE_LOGIN("authme.admin.forcelogin"), /**
* Administrator command to force-login an existing user.
*/
FORCE_LOGIN("authme.command.admin.forcelogin"),
CHANGE_PASSWORD("authme.admin.changepassword"), /**
* Administrator command to change the password of a user.
*/
CHANGE_PASSWORD("authme.command.admin.changepassword"),
LAST_LOGIN("authme.admin.lastlogin"), /**
* Administrator command to see the last login date and time of an user.
*/
LAST_LOGIN("authme.command.admin.lastlogin"),
ACCOUNTS("authme.admin.accounts"), /**
* Administrator command to see all accounts associated with an user.
*/
ACCOUNTS("authme.command.admin.accounts"),
GET_EMAIL("authme.admin.getemail"), /**
* Administrator command to get the email address of an user, if set.
*/
GET_EMAIL("authme.command.admin.getemail"),
CHANGE_EMAIL("authme.admin.chgemail"), /**
* Administrator command to set or change the email adress of an user.
*/
CHANGE_EMAIL("authme.command.admin.changemail"),
GET_IP("authme.admin.getip"), /**
* Administrator command to get the last known IP of an user.
*/
GET_IP("authme.command.admin.getip"),
SPAWN("authme.admin.spawn"), /**
* Administrator command to teleport to the AuthMe spawn.
*/
SPAWN("authme.command.admin.spawn"),
SET_SPAWN("authme.admin.setspawn"), /**
* Administrator command to set the AuthMe spawn.
*/
SET_SPAWN("authme.command.admin.setspawn"),
FIRST_SPAWN("authme.admin.firstspawn"), /**
* Administrator command to teleport to the first AuthMe spawn.
*/
FIRST_SPAWN("authme.command.admin.firstspawn"),
SET_FIRST_SPAWN("authme.admin.setfirstspawn"), /**
* Administrator command to set the first AuthMe spawn.
*/
SET_FIRST_SPAWN("authme.command.admin.setfirstspawn"),
PURGE("authme.admin.purge"), /**
* Administrator command to purge old user data.
*/
PURGE("authme.command.admin.purge"),
PURGE_LAST_POSITION("authme.admin.purgelastpos"), /**
* Administrator command to purge the last position of an user.
*/
PURGE_LAST_POSITION("authme.command.admin.purgelastpos"),
PURGE_BANNED_PLAYERS("authme.admin.purgebannedplayers"), /**
* Administrator command to purge all data associated with banned players.
*/
PURGE_BANNED_PLAYERS("authme.command.admin.purgebannedplayers"),
SWITCH_ANTIBOT("authme.admin.switchantibot"), /**
* Administrator command to toggle the AntiBot protection status.
*/
SWITCH_ANTIBOT("authme.command.admin.switchantibot"),
RELOAD("authme.admin.reload"); /**
* Administrator command to convert old or other data to AuthMe data.
*/
CONVERTER("authme.command.admin.converter"),
/**
* Administrator command to reload the plugin configuration.
*/
RELOAD("authme.command.admin.reload");
/**
* Permission node.
*/
private String node; private String node;
/**
* Get the permission node.
* @return
*/
@Override @Override
public String getNode() { public String getNode() {
return node; return node;
} }
/**
* Constructor.
*
* @param node Permission node.
*/
AdminPermission(String node) { AdminPermission(String node) {
this.node = node; this.node = node;
} }
} }

View File

@ -0,0 +1,106 @@
package fr.xephi.authme.permission;
/**
* AuthMe player permission nodes, for regular players.
*/
public enum PlayerPermission implements PermissionNode {
/**
* Permission node to bypass AntiBot protection.
*/
BYPASS_ANTIBOT("authme.player.bypassantibot"),
/**
* Permission node to identify VIP users.
*/
IS_VIP("authme.player.vip"),
/**
* Command permission to login.
*/
LOGIN("authme.command.player.login"),
/**
* Command permission to logout.
*/
LOGOUT("authme.command.player.logout"),
/**
* Command permission to register.
*/
REGISTER("authme.command.player.register"),
/**
* Command permission to unregister.
*/
UNREGISTER("authme.command.player.unregister"),
/**
* Command permission to change the password.
*/
CHANGE_PASSWORD("authme.command.player.changepassword"),
/**
* Command permission to add an email address.
*/
ADD_EMAIL("authme.command.player.email.add"),
/**
* Command permission to change the email address.
*/
CHANGE_EMAIL("authme.command.player.email.change"),
/**
* Command permission to recover an account using it's email address.
*/
RECOVER_EMAIL("authme.command.player.email.recover"),
/**
* Command permission to use captcha.
*/
CAPTCHA("authme.command.player.captcha"),
/**
* Permission for users a login can be forced to.
*/
CAN_LOGIN_BE_FORCED("authme.player.canbeforced"),
/**
* Permission for users to bypass force-survival mode.
*/
BYPASS_FORCE_SURVIVAL("authme.command.player.bypassforcesurvival"),
/**
* Permission for users to allow two accounts.
*/
ALLOW_MULTIPLE_ACCOUNTS("authme.command.player.allow2accounts"),
/**
* Permission for user to see other accounts.
*/
SEE_OTHER_ACCOUNTS("authme.command.player.seeotheraccounts");
/**
* Permission node.
*/
private String node;
/**
* Get the permission node.
*
* @return Permission node.
*/
@Override
public String getNode() {
return node;
}
/**
* Constructor.
*
* @param node Permission node.
*/
PlayerPermission(String node) {
this.node = node;
}
}

View File

@ -1,52 +0,0 @@
package fr.xephi.authme.permission;
/**
* AuthMe user permission nodes.
*/
public enum UserPermission implements PermissionNode {
BYPASS_ANTIBOT("authme.bypassantibot"),
IS_VIP("authme.vip"),
LOGIN("authme.login"),
LOGOUT("authme.logout"),
REGISTER("authme.register"),
UNREGISTER("authme.unregister"),
CHANGE_PASSWORD("authme.changepassword"),
ADD_EMAIL("authme.email.add"),
CHANGE_EMAIL("authme.email.change"),
RECOVER_EMAIL("authme.email.recover"),
CAPTCHA("authme.captcha"),
CONVERTER("authme.converter"),
CAN_LOGIN_BE_FORCED("authme.canbeforced"),
BYPASS_FORCE_SURVIVAL("authme.bypassforcesurvival"),
ALLOW_MULTIPLE_ACCOUNTS("authme.allow2accounts"),
SEE_OTHER_ACCOUNTS("authme.seeOtherAccounts");
private String node;
@Override
public String getNode() {
return node;
}
UserPermission(String node) {
this.node = node;
}
}

View File

@ -4,9 +4,9 @@ import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerAuth;
import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.permission.UserPermission; import fr.xephi.authme.permission.PlayerPermission;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -39,7 +39,7 @@ public class AsyncChangeEmail {
String playerName = player.getName().toLowerCase(); String playerName = player.getName().toLowerCase();
if (Settings.getmaxRegPerEmail > 0) { if (Settings.getmaxRegPerEmail > 0) {
if (!plugin.getPermissionsManager().hasPermission(player, UserPermission.ALLOW_MULTIPLE_ACCOUNTS) if (!plugin.getPermissionsManager().hasPermission(player, PlayerPermission.ALLOW_MULTIPLE_ACCOUNTS)
&& plugin.database.getAllAuthsByEmail(newEmail).size() >= Settings.getmaxRegPerEmail) { && plugin.database.getAllAuthsByEmail(newEmail).size() >= Settings.getmaxRegPerEmail) {
m.send(player, MessageKey.MAX_REGISTER_EXCEEDED); m.send(player, MessageKey.MAX_REGISTER_EXCEEDED);
return; return;

View File

@ -10,9 +10,9 @@ import fr.xephi.authme.events.FirstSpawnTeleportEvent;
import fr.xephi.authme.events.ProtectInventoryEvent; import fr.xephi.authme.events.ProtectInventoryEvent;
import fr.xephi.authme.events.SpawnTeleportEvent; import fr.xephi.authme.events.SpawnTeleportEvent;
import fr.xephi.authme.listener.AuthMePlayerListener; import fr.xephi.authme.listener.AuthMePlayerListener;
import fr.xephi.authme.permission.UserPermission; import fr.xephi.authme.permission.PlayerPermission;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.settings.Spawn; import fr.xephi.authme.settings.Spawn;
import fr.xephi.authme.task.MessageTask; import fr.xephi.authme.task.MessageTask;
@ -78,7 +78,7 @@ public class AsynchronousJoin {
return; return;
} }
if (Settings.getMaxJoinPerIp > 0 if (Settings.getMaxJoinPerIp > 0
&& !plugin.getPermissionsManager().hasPermission(player, UserPermission.ALLOW_MULTIPLE_ACCOUNTS) && !plugin.getPermissionsManager().hasPermission(player, PlayerPermission.ALLOW_MULTIPLE_ACCOUNTS)
&& !ip.equalsIgnoreCase("127.0.0.1") && !ip.equalsIgnoreCase("127.0.0.1")
&& !ip.equalsIgnoreCase("localhost")) { && !ip.equalsIgnoreCase("localhost")) {
if (plugin.hasJoinedIp(player.getName(), ip)) { if (plugin.hasJoinedIp(player.getName(), ip)) {
@ -236,8 +236,11 @@ public class AsynchronousJoin {
? m.retrieve(MessageKey.REGISTER_EMAIL_MESSAGE) ? m.retrieve(MessageKey.REGISTER_EMAIL_MESSAGE)
: m.retrieve(MessageKey.REGISTER_MESSAGE); : m.retrieve(MessageKey.REGISTER_MESSAGE);
} }
BukkitTask msgTask = sched.runTaskAsynchronously(plugin, new MessageTask(plugin, name, msg, msgInterval)); if (LimboCache.getInstance().getLimboPlayer(name) != null)
LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(msgTask); {
BukkitTask msgTask = sched.runTaskAsynchronously(plugin, new MessageTask(plugin, name, msg, msgInterval));
LimboCache.getInstance().getLimboPlayer(name).setMessageTaskId(msgTask);
}
} }
private boolean needFirstSpawn() { private boolean needFirstSpawn() {

View File

@ -8,11 +8,11 @@ import fr.xephi.authme.cache.limbo.LimboCache;
import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.events.AuthMeAsyncPreLoginEvent; import fr.xephi.authme.events.AuthMeAsyncPreLoginEvent;
import fr.xephi.authme.listener.AuthMePlayerListener; import fr.xephi.authme.listener.AuthMePlayerListener;
import fr.xephi.authme.permission.UserPermission; import fr.xephi.authme.permission.PlayerPermission;
import fr.xephi.authme.security.PasswordSecurity; import fr.xephi.authme.security.PasswordSecurity;
import fr.xephi.authme.security.RandomString; import fr.xephi.authme.security.RandomString;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.task.MessageTask; import fr.xephi.authme.task.MessageTask;
import fr.xephi.authme.util.Utils; import fr.xephi.authme.util.Utils;
@ -120,7 +120,7 @@ public class AsynchronousLogin {
} }
return null; return null;
} }
if (Settings.getMaxLoginPerIp > 0 && !plugin.getPermissionsManager().hasPermission(player, UserPermission.ALLOW_MULTIPLE_ACCOUNTS) && !getIP().equalsIgnoreCase("127.0.0.1") && !getIP().equalsIgnoreCase("localhost")) { if (Settings.getMaxLoginPerIp > 0 && !plugin.getPermissionsManager().hasPermission(player, PlayerPermission.ALLOW_MULTIPLE_ACCOUNTS) && !getIP().equalsIgnoreCase("127.0.0.1") && !getIP().equalsIgnoreCase("localhost")) {
if (plugin.isLoggedIp(name, getIP())) { if (plugin.isLoggedIp(name, getIP())) {
m.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR); m.send(player, MessageKey.ALREADY_LOGGED_IN_ERROR);
return null; return null;
@ -268,7 +268,7 @@ public class AsynchronousLogin {
* uuidaccounts + "."; } } * uuidaccounts + "."; } }
*/ */
for (Player player : Utils.getOnlinePlayers()) { for (Player player : Utils.getOnlinePlayers()) {
if (plugin.getPermissionsManager().hasPermission(player, UserPermission.SEE_OTHER_ACCOUNTS)) { if (plugin.getPermissionsManager().hasPermission(player, PlayerPermission.SEE_OTHER_ACCOUNTS)) {
player.sendMessage("[AuthMe] The player " + auth.getNickname() + " has " + auths.size() + " accounts"); player.sendMessage("[AuthMe] The player " + auth.getNickname() + " has " + auths.size() + " accounts");
player.sendMessage(message.toString()); player.sendMessage(message.toString());
// player.sendMessage(uuidaccounts.replace("%size%", // player.sendMessage(uuidaccounts.replace("%size%",

View File

@ -5,8 +5,8 @@ import fr.xephi.authme.cache.auth.PlayerAuth;
import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.cache.limbo.LimboCache; import fr.xephi.authme.cache.limbo.LimboCache;
import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.util.Utils; import fr.xephi.authme.util.Utils;
import fr.xephi.authme.util.Utils.GroupType; import fr.xephi.authme.util.Utils.GroupType;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -4,8 +4,8 @@ import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.cache.limbo.LimboCache; import fr.xephi.authme.cache.limbo.LimboCache;
import fr.xephi.authme.events.LogoutEvent; import fr.xephi.authme.events.LogoutEvent;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.task.MessageTask; import fr.xephi.authme.task.MessageTask;
import fr.xephi.authme.task.TimeoutTask; import fr.xephi.authme.task.TimeoutTask;

View File

@ -5,10 +5,10 @@ import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerAuth;
import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.datasource.DataSource; import fr.xephi.authme.datasource.DataSource;
import fr.xephi.authme.permission.UserPermission; import fr.xephi.authme.permission.PlayerPermission;
import fr.xephi.authme.security.PasswordSecurity; import fr.xephi.authme.security.PasswordSecurity;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -4,8 +4,8 @@ import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ConsoleLogger; import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.cache.limbo.LimboCache; import fr.xephi.authme.cache.limbo.LimboCache;
import fr.xephi.authme.cache.limbo.LimboPlayer; import fr.xephi.authme.cache.limbo.LimboPlayer;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.task.MessageTask; import fr.xephi.authme.task.MessageTask;
import fr.xephi.authme.task.TimeoutTask; import fr.xephi.authme.task.TimeoutTask;

View File

@ -6,8 +6,8 @@ import fr.xephi.authme.cache.limbo.LimboCache;
import fr.xephi.authme.cache.limbo.LimboPlayer; import fr.xephi.authme.cache.limbo.LimboPlayer;
import fr.xephi.authme.events.LoginEvent; import fr.xephi.authme.events.LoginEvent;
import fr.xephi.authme.events.RestoreInventoryEvent; import fr.xephi.authme.events.RestoreInventoryEvent;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.task.MessageTask; import fr.xephi.authme.task.MessageTask;
import fr.xephi.authme.task.TimeoutTask; import fr.xephi.authme.task.TimeoutTask;

View File

@ -7,8 +7,8 @@ import fr.xephi.authme.cache.backup.JsonCache;
import fr.xephi.authme.cache.limbo.LimboCache; import fr.xephi.authme.cache.limbo.LimboCache;
import fr.xephi.authme.cache.limbo.LimboPlayer; import fr.xephi.authme.cache.limbo.LimboPlayer;
import fr.xephi.authme.security.PasswordSecurity; import fr.xephi.authme.security.PasswordSecurity;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.task.MessageTask; import fr.xephi.authme.task.MessageTask;
import fr.xephi.authme.task.TimeoutTask; import fr.xephi.authme.task.TimeoutTask;

View File

@ -1,115 +0,0 @@
package fr.xephi.authme.settings;
import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.util.StringUtils;
import org.bukkit.command.CommandSender;
import java.io.File;
/**
* Class for retrieving and sending translatable messages to players.
*/
// TODO ljacqu 20151124: This class is a weird mix between singleton and POJO
// TODO: change it into POJO
public class Messages extends CustomConfiguration {
/** The section symbol, used in Minecraft for formatting codes. */
private static final String SECTION_SIGN = "\u00a7";
private static Messages singleton;
private String language;
/**
* Constructor for Messages.
*
* @param file the configuration file
* @param lang the code of the language to use
*/
public Messages(File file, String lang) {
super(file);
load();
this.language = lang;
}
public static Messages getInstance() {
if (singleton == null) {
singleton = new Messages(Settings.messageFile, Settings.messagesLanguage);
}
return singleton;
}
/**
* Send the given message code to the player.
*
* @param sender The entity to send the message to
* @param key The key of the message to send
*/
public void send(CommandSender sender, MessageKey key) {
String[] lines = retrieve(key);
for (String line : lines) {
sender.sendMessage(line);
}
}
/**
* Retrieve the message from the text file and return it split by new line as an array.
*
* @param key The message key to retrieve
*
* @return The message split by new lines
*/
public String[] retrieve(MessageKey key) {
return retrieve(key.getKey());
}
/**
* Retrieve the message from the text file.
*
* @param key The message key to retrieve
*
* @return The message from the file
*/
public String retrieveSingle(MessageKey key) {
return StringUtils.join("\n", retrieve(key.getKey()));
}
/**
* Retrieve the message from the configuration file.
*
* @param key The key to retrieve
*
* @return The message
*/
private String[] retrieve(String key) {
if (!Settings.messagesLanguage.equalsIgnoreCase(language)) {
reloadMessages();
}
String message = (String) get(key);
if (message != null) {
return formatMessage(message);
}
// Message is null: log key not being found and send error back as message
String retrievalError = "Error getting message with key '" + key + "'. ";
ConsoleLogger.showError(retrievalError + "Please verify your config file at '"
+ getConfigFile().getName() + "'");
return new String[]{
retrievalError + "Please contact the admin to verify or update the AuthMe messages file."};
}
private static String[] formatMessage(String message) {
// TODO: Check that the codes actually exist, i.e. replace &c but not &y
// TODO: Allow '&' to be retained with the code '&&'
String[] lines = message.split("&n");
for (int i = 0; i < lines.length; ++i) {
// We don't initialize a StringBuilder here because mostly we will only have one entry
lines[i] = lines[i].replace("&", SECTION_SIGN);
}
return lines;
}
public void reloadMessages() {
singleton = new Messages(Settings.messageFile, Settings.messagesLanguage);
}
}

View File

@ -8,7 +8,11 @@ import fr.xephi.authme.security.HashAlgorithm;
import fr.xephi.authme.util.Wrapper; import fr.xephi.authme.util.Wrapper;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import com.google.common.base.Charsets;
import com.google.common.io.Files;
import java.io.*; import java.io.*;
import java.nio.charset.Charset;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
@ -17,12 +21,13 @@ import java.util.regex.Pattern;
/** /**
*/ */
public final class Settings extends YamlConfiguration { public final class Settings {
public static final File PLUGIN_FOLDER = Wrapper.getInstance().getDataFolder(); public static final File PLUGIN_FOLDER = Wrapper.getInstance().getDataFolder();
public static final File MODULE_FOLDER = new File(PLUGIN_FOLDER, "modules"); public static final File MODULE_FOLDER = new File(PLUGIN_FOLDER, "modules");
public static final File CACHE_FOLDER = new File(PLUGIN_FOLDER, "cache"); public static final File CACHE_FOLDER = new File(PLUGIN_FOLDER, "cache");
public static final File AUTH_FILE = new File(PLUGIN_FOLDER, "auths.db"); public static final File AUTH_FILE = new File(PLUGIN_FOLDER, "auths.db");
public static final File EMAIL_FILE = new File(PLUGIN_FOLDER, "email.html");
public static final File SETTINGS_FILE = new File(PLUGIN_FOLDER, "config.yml"); public static final File SETTINGS_FILE = new File(PLUGIN_FOLDER, "config.yml");
public static final File LOG_FILE = new File(PLUGIN_FOLDER, "authme.log"); public static final File LOG_FILE = new File(PLUGIN_FOLDER, "authme.log");
// This is not an option! // This is not an option!
@ -68,7 +73,7 @@ public final class Settings extends YamlConfiguration {
enableProtection, enableAntiBot, recallEmail, useWelcomeMessage, enableProtection, enableAntiBot, recallEmail, useWelcomeMessage,
broadcastWelcomeMessage, forceRegKick, forceRegLogin, broadcastWelcomeMessage, forceRegKick, forceRegLogin,
checkVeryGames, delayJoinLeaveMessages, noTeleport, applyBlindEffect, checkVeryGames, delayJoinLeaveMessages, noTeleport, applyBlindEffect,
customAttributes, generateImage, isRemoveSpeedEnabled, isMySQLWebsite; customAttributes, generateImage, isRemoveSpeedEnabled;
public static String helpHeader, getNickRegex, getUnloggedinGroup, getMySQLHost, public static String helpHeader, getNickRegex, getUnloggedinGroup, getMySQLHost,
getMySQLPort, getMySQLUsername, getMySQLPassword, getMySQLDatabase, getMySQLPort, getMySQLUsername, getMySQLPassword, getMySQLDatabase,
getMySQLTablename, getMySQLColumnName, getMySQLColumnPassword, getMySQLTablename, getMySQLColumnName, getMySQLColumnPassword,
@ -116,7 +121,7 @@ public final class Settings extends YamlConfiguration {
if (!exist) { if (!exist) {
plugin.saveDefaultConfig(); plugin.saveDefaultConfig();
} }
instance.load(SETTINGS_FILE); configFile.load(SETTINGS_FILE);
if (exist) { if (exist) {
instance.mergeConfig(); instance.mergeConfig();
} }
@ -231,7 +236,7 @@ public final class Settings extends YamlConfiguration {
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>, <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"); getMailText = loadEmailText();
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);
@ -289,20 +294,46 @@ public final class Settings extends YamlConfiguration {
forceRegisterCommandsAsConsole = configFile.getStringList("settings.forceRegisterCommandsAsConsole"); forceRegisterCommandsAsConsole = configFile.getStringList("settings.forceRegisterCommandsAsConsole");
customAttributes = configFile.getBoolean("Hooks.customAttributes"); customAttributes = configFile.getBoolean("Hooks.customAttributes");
generateImage = configFile.getBoolean("Email.generateImage", false); generateImage = configFile.getBoolean("Email.generateImage", false);
isMySQLWebsite = configFile.getBoolean("DataSource.mySQLWebsite", false);
// Load the welcome message // Load the welcome message
getWelcomeMessage(); getWelcomeMessage();
} }
/** private static String loadEmailText() {
* Method setValue. if (!EMAIL_FILE.exists())
* saveDefaultEmailText();
* @param key String StringBuilder str = new StringBuilder();
* @param value Object try {
*/ BufferedReader in = new BufferedReader(new FileReader(EMAIL_FILE));
public static void setValue(String key, Object value) { String s;
while ((s = in.readLine()) != null)
str.append(s);
in.close();
} catch(IOException e)
{
}
return str.toString();
}
private static void saveDefaultEmailText() {
InputStream file = plugin.getResource("email.html");
StringBuilder str = new StringBuilder();
try {
BufferedReader in = new BufferedReader(new InputStreamReader(file, Charset.forName("utf-8")));
String s;
while ((s = in.readLine()) != null)
str.append(s);
in.close();
Files.touch(EMAIL_FILE);
Files.write(str.toString(), EMAIL_FILE, Charsets.UTF_8);
}
catch(Exception e)
{
}
}
public static void setValue(String key, Object value) {
instance.set(key, value); instance.set(key, value);
save(); save();
} }
@ -373,9 +404,9 @@ public final class Settings extends YamlConfiguration {
*/ */
public static boolean save() { public static boolean save() {
try { try {
instance.save(SETTINGS_FILE); configFile.save(SETTINGS_FILE);
return true; return true;
} catch (Exception ex) { } catch (IOException ex) {
return false; return false;
} }
} }
@ -593,7 +624,7 @@ public final class Settings extends YamlConfiguration {
set("VeryGames.enableIpCheck", false); set("VeryGames.enableIpCheck", false);
changes = true; changes = true;
} }
if (getString("settings.restrictions.allowedNicknameCharacters").equals("[a-zA-Z0-9_?]*")) { if (configFile.getString("settings.restrictions.allowedNicknameCharacters").equals("[a-zA-Z0-9_?]*")) {
set("settings.restrictions.allowedNicknameCharacters", "[a-zA-Z0-9_]*"); set("settings.restrictions.allowedNicknameCharacters", "[a-zA-Z0-9_]*");
changes = true; changes = true;
} }
@ -681,9 +712,11 @@ public final class Settings extends YamlConfiguration {
set("DataSource.mySQLRealName", "realname"); set("DataSource.mySQLRealName", "realname");
changes = true; changes = true;
} }
if (!contains("DataSource.mySQLWebsite")) {
set("DataSource.mySQLWebsite", false); if (contains("Email.mailText"))
changes = true; {
set("Email.mailText", null);
ConsoleLogger.showError("Remove Email.mailText from config, we now use the email.html file");
} }
if (changes) { if (changes) {
@ -692,6 +725,15 @@ public final class Settings extends YamlConfiguration {
} }
} }
private static boolean contains(String path) {
return configFile.contains(path);
}
// public because it's used in AuthMe at one place
public void set(String path, Object value) {
configFile.set(path, value);
}
/** /**
* Saves current configuration (plus defaults) to disk. * Saves current configuration (plus defaults) to disk.
* <p> * <p>
@ -700,11 +742,13 @@ public final class Settings extends YamlConfiguration {
* @return True if saved successfully * @return True if saved successfully
*/ */
public final boolean saveDefaults() { public final boolean saveDefaults() {
options().copyDefaults(true); configFile.options()
options().copyHeader(true); .copyDefaults(true)
.copyHeader(true);
boolean success = save(); boolean success = save();
options().copyDefaults(false); configFile.options()
options().copyHeader(false); .copyDefaults(false)
.copyHeader(false);
return success; return success;
} }
} }

View File

@ -5,8 +5,8 @@ import fr.xephi.authme.ConsoleLogger;
import fr.xephi.authme.cache.auth.PlayerAuth; import fr.xephi.authme.cache.auth.PlayerAuth;
import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.security.PasswordSecurity; import fr.xephi.authme.security.PasswordSecurity;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -2,8 +2,8 @@ package fr.xephi.authme.task;
import fr.xephi.authme.AuthMe; import fr.xephi.authme.AuthMe;
import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;

View File

@ -7,7 +7,7 @@ import fr.xephi.authme.cache.limbo.LimboCache;
import fr.xephi.authme.cache.limbo.LimboPlayer; import fr.xephi.authme.cache.limbo.LimboPlayer;
import fr.xephi.authme.events.AuthMeTeleportEvent; import fr.xephi.authme.events.AuthMeTeleportEvent;
import fr.xephi.authme.permission.PermissionsManager; import fr.xephi.authme.permission.PermissionsManager;
import fr.xephi.authme.permission.UserPermission; import fr.xephi.authme.permission.PlayerPermission;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.GameMode; import org.bukkit.GameMode;
@ -202,7 +202,7 @@ public final class Utils {
* @param player the player to modify. * @param player the player to modify.
*/ */
public static void forceGM(Player player) { public static void forceGM(Player player) {
if (!plugin.getPermissionsManager().hasPermission(player, UserPermission.BYPASS_FORCE_SURVIVAL)) { if (!plugin.getPermissionsManager().hasPermission(player, PlayerPermission.BYPASS_FORCE_SURVIVAL)) {
player.setGameMode(GameMode.SURVIVAL); player.setGameMode(GameMode.SURVIVAL);
} }
} }

View File

@ -2,7 +2,7 @@ package fr.xephi.authme.util;
import fr.xephi.authme.AuthMe; import fr.xephi.authme.AuthMe;
import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitScheduler;

View File

@ -388,12 +388,14 @@ Protection:
# Enable some servers protection ( country based login, antibot ) # Enable some servers protection ( country based login, antibot )
enableProtection: false enableProtection: false
# Countries allowed to join the server and register, see http://dev.bukkit.org/bukkit-plugins/authme-reloaded/pages/countries-codes/ for countries' codes # Countries allowed to join the server and register, see http://dev.bukkit.org/bukkit-plugins/authme-reloaded/pages/countries-codes/ for countries' codes
# PLEASE USE QUOTES!
countries: countries:
- US - 'US'
- GB - 'GB'
# Countries blacklisted automatically ( without any needed to enable protection ) # Countries blacklisted automatically ( without any needed to enable protection )
# PLEASE USE QUOTES!
countriesBlacklist: countriesBlacklist:
- A1 - 'A1'
# Do we need to enable automatic antibot system? # Do we need to enable automatic antibot system?
enableAntiBot: false enableAntiBot: false
# Max number of player allowed to login in 5 secs before enable AntiBot system automatically # Max number of player allowed to login in 5 secs before enable AntiBot system automatically

View File

@ -0,0 +1,16 @@
<h1>
Dear %playername%,
</h1>
<p>
This is your new AuthMe password for the server %servername%:
%generatedpass%
%image%
Do not forget to change password after login!
/changepassword %generatedpass% newPassword'
See you on %servername%!
</p>

View File

@ -1,3 +1,4 @@
kick_antibot: 'AntiBot protection mode is enabled! You have to wait some minutes before joining the server.'
unknown_user: '&cCan''t find the requested user in the database!' unknown_user: '&cCan''t find the requested user in the database!'
unsafe_spawn: '&cYour quit location was unsafe, you have been teleported to the world''s spawnpoint.' unsafe_spawn: '&cYour quit location was unsafe, you have been teleported to the world''s spawnpoint.'
not_logged_in: '&cYou''re not logged in!' not_logged_in: '&cYou''re not logged in!'

View File

@ -1,50 +1,50 @@
unknown_user: '&fПользователь не найден в Базе Данных' unknown_user: '&fПользователь не найден в Базе Данных'
unsafe_spawn: '&eВаше расположение перед выходом было опасным - вы перенесены на спавн' unsafe_spawn: '&eВаше расположение перед выходом было опасным - вы перенесены на спавн'
not_logged_in: '&cВы еще не вошли!' not_logged_in: '&c&lВы еще не вошли!'
reg_voluntarily: '&aЧтобы зарегистрироваться введите: &5/reg ПАРОЛЬ ПОВТОРАРОЛЯ' reg_voluntarily: '&aЧтобы зарегистрироваться введите: &e&l/reg ПАРОЛЬ ПОВТОРАРОЛЯ'
usage_log: '&eСинтаксис: &d/l ПАРОЛЬ &eили &d/login ПАРОЛЬ' usage_log: '&eСинтаксис: &d/l ПАРОЛЬ &eили &d/login ПАРОЛЬ'
wrong_pwd: '&4Неправильный пароль!' wrong_pwd: '&c&lНеправильный пароль!'
unregistered: '&6Вы успешно удалили свой аккаунт!' unregistered: '&6Вы успешно удалили свой аккаунт!'
reg_disabled: '&4Регистрация отключена' reg_disabled: '&c&lРегистрация отключена'
valid_session: '&aСессия открыта' valid_session: '&aСессия открыта'
login: '&2Вы успешно вошли!' login: '&a&lВы успешно вошли!'
vb_nonActiv: '&6Ваш аккаунт еще не активирован! Проверьте вашу почту!' vb_nonActiv: '&6Ваш аккаунт еще не активирован! Проверьте вашу почту!'
user_regged: '&4Такой игрок уже зарегистрирован' user_regged: '&c&lТакой игрок уже зарегистрирован'
usage_reg: '&спользование: &5/reg ПАРОЛЬ ПОВТОРАРОЛЯ' usage_reg: '&c&lИспользование: &e&l/reg ПАРОЛЬ ПОВТОРАРОЛЯ'
max_reg: '&4Вы превысили макс количество регистраций на ваш IP' max_reg: '&c&lВы превысили макс количество регистраций на ваш IP'
no_perm: '&4Недостаточно прав' no_perm: '&c&lНедостаточно прав'
error: '&4Произошла ошибка. Свяжитесь с администратором' error: '&c&lПроизошла ошибка. Свяжитесь с администратором'
login_msg: '&4Авторизация: &5/l ПАРОЛЬ' login_msg: '&a&lАвторизация: &e&l/l ПАРОЛЬ'
reg_msg: '&4Регистрация: &5/reg ПАРОЛЬ ПОВТОРАРОЛЯ' reg_msg: '&a&lРегистрация: &e&l/reg ПАРОЛЬ ПОВТОРАРОЛЯ'
password_error_nick: '&fВы не можете использовать ваш ник в роли пароля' password_error_nick: '&c&lВы не можете использовать ваш ник в роли пароля'
password_error_unsafe: '&fВы не можете использовать небезопасный пароль' password_error_unsafe: '&c&lВы не можете использовать небезопасный пароль'
reg_email_msg: '&4Регистрация: &5/reg EMAIL ПОВТОР_EMAIL' reg_email_msg: '&c&lРегистрация: &e&l/reg EMAIL ПОВТОР_EMAIL'
usage_unreg: '&спользование: &5/unregister ПАРОЛЬ' usage_unreg: '&c&lИспользование: &e&l/unregister ПАРОЛЬ'
pwd_changed: '&2Пароль изменен!' pwd_changed: '&2Пароль изменен!'
user_unknown: '&4Такой игрок не зарегистрирован' user_unknown: '&c&lТакой игрок не зарегистрирован'
password_error: '&4Пароль не совпадает' password_error: '&c&lПароль не совпадает'
invalid_session: '&4Сессия некорректна. Дождитесь, пока она закончится' invalid_session: '&c&lСессия некорректна. Дождитесь, пока она закончится'
reg_only: '&4Только для зарегистрированных! Посетите http://сайт_сервера.com/register/ для регистрации' reg_only: '&c&lТолько для зарегистрированных! Посетите http://сайт_сервера.com/register/ для регистрации'
logged_in: '&4Вы уже авторизированы!' logged_in: '&c&lВы уже авторизированы!'
logout: '&2Вы успешно вышли' logout: '&2Вы успешно вышли'
same_nick: '&4Такой игрок уже играет на сервере' same_nick: '&c&lТакой игрок уже играет на сервере'
registered: '&2Успешная регистрация!' registered: '&a&lУспешная регистрация!'
pass_len: '&4Твой пароль либо слишком длинный, либо слишком короткий' pass_len: '&c&lТвой пароль либо слишком длинный, либо слишком короткий'
reload: '&6Конфигурация и база данных перезагружены' reload: '&6Конфигурация и база данных перезагружены'
timeout: '&4Время для авторизации истекло' timeout: '&c&lВремя для авторизации истекло'
usage_changepassword: '&спользование: &5/changepassword СТАРЫЙ_ПАРОЛЬ НОВЫЙ_ПАРОЛЬ' usage_changepassword: '&c&lИспользование: &e&l/changepassword СТАРЫЙ_ПАРОЛЬ НОВЫЙ_ПАРОЛЬ'
name_len: '&4Ваш логин слишком длинный или слишком короткий' name_len: '&c&lВаш ник слишком длинный или слишком короткий'
regex: '&4Ваш логин содержит запрещенные символы. Разрешенные символы: REG_EX' regex: '&c&lВаш логин содержит запрещенные символы. Разрешенные символы: REG_EX'
add_email: '&обавьте свой email: &5/email add ВАШ_EMAIL ВАШ_EMAIL' add_email: '&c&lДобавьте свой email: &e&l/email add ВАШ_EMAIL ВАШ_EMAIL'
recovery_email: '&4Забыли пароль? Используйте &5/email recovery ВАШ_EMAIL' recovery_email: '&c&lЗабыли пароль? Используйте &e&l/email recovery ВАШ_EMAIL'
usage_captcha: '&4Вы должны ввести код, используйте: &5/captcha <theCaptcha>' usage_captcha: '&c&lВы должны ввести код, используйте: &e&l/captcha <theCaptcha>'
wrong_captcha: '&4Неверный код, используйте: &5/captcha THE_CAPTCHA' wrong_captcha: '&c&lНеверный код, используйте: &e&l/captcha THE_CAPTCHA'
valid_captcha: '&2Вы успешно ввели код!' valid_captcha: '&2Вы успешно ввели код!'
kick_forvip: '&6VIP игрок зашел на переполненный сервер!' kick_forvip: '&6VIP игрок зашел на переполненный сервер!'
kick_fullserver: '&4Сервер переполнен!' kick_fullserver: '&c&lСервер переполнен!'
usage_email_add: '&спользование: &5/email add ВАШ_EMAIL ПОВТОР_EMAIL' usage_email_add: '&c&lИспользование: &e&l/email add ВАШ_EMAIL ПОВТОР_EMAIL'
usage_email_change: '&спользование: &5/email change СТАРЫЙ_EMAIL НОВЫЙ_EMAIL' usage_email_change: '&c&lИспользование: &e&l/email change СТАРЫЙ_EMAIL НОВЫЙ_EMAIL'
usage_email_recovery: '&4Использование: /email recovery EMAIL' usage_email_recovery: '&c&lИспользование: /email recovery EMAIL'
new_email_invalid: '[AuthMe] Недействительный новый email!' new_email_invalid: '[AuthMe] Недействительный новый email!'
old_email_invalid: '[AuthMe] Недействительный старый email!' old_email_invalid: '[AuthMe] Недействительный старый email!'
email_invalid: '[AuthMe] Недействительный email' email_invalid: '[AuthMe] Недействительный email'
@ -53,5 +53,5 @@ email_confirm: '[AuthMe] Подтвердите ваш Email!'
email_changed: '[AuthMe] Email изменен!' email_changed: '[AuthMe] Email изменен!'
email_send: '[AuthMe] Письмо с инструкциями для восстановления было отправлено на ваш Email!' email_send: '[AuthMe] Письмо с инструкциями для восстановления было отправлено на ваш Email!'
country_banned: 'Вход с IP-адресов вашей страны воспрещен на этом сервере' country_banned: 'Вход с IP-адресов вашей страны воспрещен на этом сервере'
antibot_auto_enabled: '[AuthMe] AntiBot-режим автоматически включен из-за большого количества входов!' antibot_auto_enabled: '&a[AuthMe] AntiBot-режим автоматически включен из-за большого количества входов!'
antibot_auto_disabled: '[AuthMe] AntiBot-режим автоматичски отключен после %m мин. Надеюсь атака закончилась' antibot_auto_disabled: '&a[AuthMe] AntiBot-режим автоматичски отключен после %m мин. Надеюсь атака закончилась'

View File

@ -4,8 +4,8 @@ import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ReflectionTestUtils; import fr.xephi.authme.ReflectionTestUtils;
import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.task.ChangePasswordTask; import fr.xephi.authme.task.ChangePasswordTask;
import fr.xephi.authme.util.WrapperMock; import fr.xephi.authme.util.WrapperMock;
@ -18,6 +18,7 @@ import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import static java.util.Arrays.asList; import static java.util.Arrays.asList;
@ -85,7 +86,7 @@ public class ChangePasswordCommandTest {
ChangePasswordCommand command = new ChangePasswordCommand(); ChangePasswordCommand command = new ChangePasswordCommand();
// when // when
command.executeCommand(sender, new CommandParts(), new CommandParts("!pass")); command.executeCommand(sender, new CommandParts(), newParts("old123", "!pass"));
// then // then
verify(messagesMock).send(sender, MessageKey.PASSWORD_MATCH_ERROR); verify(messagesMock).send(sender, MessageKey.PASSWORD_MATCH_ERROR);
@ -100,7 +101,7 @@ public class ChangePasswordCommandTest {
ChangePasswordCommand command = new ChangePasswordCommand(); ChangePasswordCommand command = new ChangePasswordCommand();
// when // when
command.executeCommand(sender, new CommandParts(), new CommandParts("Tester")); command.executeCommand(sender, new CommandParts(), newParts("old_", "Tester"));
// then // then
verify(messagesMock).send(sender, MessageKey.PASSWORD_IS_USERNAME_ERROR); verify(messagesMock).send(sender, MessageKey.PASSWORD_IS_USERNAME_ERROR);
@ -115,7 +116,7 @@ public class ChangePasswordCommandTest {
Settings.passwordMaxLength = 3; Settings.passwordMaxLength = 3;
// when // when
command.executeCommand(sender, new CommandParts(), new CommandParts("test")); command.executeCommand(sender, new CommandParts(), newParts("12", "test"));
// then // then
verify(messagesMock).send(sender, MessageKey.INVALID_PASSWORD_LENGTH); verify(messagesMock).send(sender, MessageKey.INVALID_PASSWORD_LENGTH);
@ -130,7 +131,7 @@ public class ChangePasswordCommandTest {
Settings.getPasswordMinLen = 7; Settings.getPasswordMinLen = 7;
// when // when
command.executeCommand(sender, new CommandParts(), new CommandParts("tester")); command.executeCommand(sender, new CommandParts(), newParts("oldverylongpassword", "tester"));
// then // then
verify(messagesMock).send(sender, MessageKey.INVALID_PASSWORD_LENGTH); verify(messagesMock).send(sender, MessageKey.INVALID_PASSWORD_LENGTH);
@ -145,7 +146,7 @@ public class ChangePasswordCommandTest {
Settings.unsafePasswords = asList("test", "abc123"); Settings.unsafePasswords = asList("test", "abc123");
// when // when
command.executeCommand(sender, new CommandParts(), new CommandParts("abc123")); command.executeCommand(sender, new CommandParts(), newParts("oldpw", "abc123"));
// then // then
verify(messagesMock).send(sender, MessageKey.PASSWORD_UNSAFE_ERROR); verify(messagesMock).send(sender, MessageKey.PASSWORD_UNSAFE_ERROR);
@ -157,16 +158,14 @@ public class ChangePasswordCommandTest {
// given // given
CommandSender sender = initPlayerWithName("parker", true); CommandSender sender = initPlayerWithName("parker", true);
ChangePasswordCommand command = new ChangePasswordCommand(); ChangePasswordCommand command = new ChangePasswordCommand();
BukkitScheduler schedulerMock = mock(BukkitScheduler.class);
given(wrapperMock.getServer().getScheduler()).willReturn(schedulerMock);
// when // when
command.executeCommand(sender, new CommandParts(), new CommandParts(asList("abc123", "abc123"))); command.executeCommand(sender, new CommandParts(), newParts("abc123", "abc123"));
// then // then
verify(messagesMock, never()).send(eq(sender), any(MessageKey.class)); verify(messagesMock, never()).send(eq(sender), any(MessageKey.class));
ArgumentCaptor<ChangePasswordTask> taskCaptor = ArgumentCaptor.forClass(ChangePasswordTask.class); ArgumentCaptor<ChangePasswordTask> taskCaptor = ArgumentCaptor.forClass(ChangePasswordTask.class);
verify(schedulerMock).runTaskAsynchronously(any(AuthMe.class), taskCaptor.capture()); verify(wrapperMock.getScheduler()).runTaskAsynchronously(any(AuthMe.class), taskCaptor.capture());
ChangePasswordTask task = taskCaptor.getValue(); ChangePasswordTask task = taskCaptor.getValue();
assertThat((String) ReflectionTestUtils.getFieldValue(ChangePasswordTask.class, task, "newPassword"), assertThat((String) ReflectionTestUtils.getFieldValue(ChangePasswordTask.class, task, "newPassword"),
equalTo("abc123")); equalTo("abc123"));
@ -179,4 +178,8 @@ public class ChangePasswordCommandTest {
return player; return player;
} }
private static CommandParts newParts(String... parts) {
return new CommandParts(Arrays.asList(parts));
}
} }

View File

@ -2,8 +2,8 @@ package fr.xephi.authme.command.executable.register;
import fr.xephi.authme.command.CommandParts; import fr.xephi.authme.command.CommandParts;
import fr.xephi.authme.process.Management; import fr.xephi.authme.process.Management;
import fr.xephi.authme.settings.MessageKey; import fr.xephi.authme.output.MessageKey;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.util.WrapperMock; import fr.xephi.authme.util.WrapperMock;
import org.bukkit.command.BlockCommandSender; import org.bukkit.command.BlockCommandSender;

View File

@ -131,7 +131,7 @@ public class HelpSyntaxHelperTest {
} }
private static CommandDescription.Builder getDescriptionBuilder() { private static CommandDescription.CommandBuilder getDescriptionBuilder() {
CommandDescription base = CommandDescription.builder() CommandDescription base = CommandDescription.builder()
.labels("authme") .labels("authme")
.description("Base command") .description("Base command")

View File

@ -0,0 +1,77 @@
package fr.xephi.authme.output;
import org.junit.Test;
import org.mockito.Mockito;
import java.util.logging.LogRecord;
import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Test for {@link ConsoleFilter}.
*/
public class ConsoleFilterTest {
private final ConsoleFilter filter = new ConsoleFilter();
private static final String SENSITIVE_COMMAND = "User issued server command: /login test test";
private static final String NORMAL_COMMAND = "User issued server command: /motd 2";
@Test
public void shouldReplaceSensitiveRecord() {
// given
LogRecord record = createRecord(SENSITIVE_COMMAND);
// when
boolean result = filter.isLoggable(record);
// then
assertThat(result, equalTo(true));
verify(record).setMessage("User issued an AuthMe command");
}
@Test
public void shouldNotFilterRegularCommand() {
// given
LogRecord record = createRecord(NORMAL_COMMAND);
// when
boolean result = filter.isLoggable(record);
// then
assertThat(result, equalTo(true));
verify(record, never()).setMessage("User issued an AuthMe command");
}
@Test
public void shouldManageRecordWithNullMessage() {
// given
LogRecord record = createRecord(null);
// when
boolean result = filter.isLoggable(record);
// then
assertThat(result, equalTo(true));
verify(record, never()).setMessage("User issued an AuthMe command");
}
/**
* Creates a mock of {@link LogRecord} and sets it to return the given message.
*
* @param message The message to set.
*
* @return Mock of LogRecord
*/
private static LogRecord createRecord(String message) {
LogRecord record = Mockito.mock(LogRecord.class);
when(record.getMessage()).thenReturn(message);
return record;
}
}

View File

@ -1,4 +1,4 @@
package fr.xephi.authme; package fr.xephi.authme.output;
import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.equalTo;
import static org.junit.Assert.assertThat; import static org.junit.Assert.assertThat;
@ -12,8 +12,6 @@ import org.mockito.Mockito;
/** /**
* Test for {@link Log4JFilter}. * Test for {@link Log4JFilter}.
* @author Gabriele
* @version $Revision: 1.0 $
*/ */
public class Log4JFilterTest { public class Log4JFilterTest {

View File

@ -1,4 +1,4 @@
package fr.xephi.authme.settings; package fr.xephi.authme.output;
import fr.xephi.authme.util.StringUtils; import fr.xephi.authme.util.StringUtils;
import org.junit.Test; import org.junit.Test;

View File

@ -1,5 +1,6 @@
package fr.xephi.authme.settings; package fr.xephi.authme.output;
import fr.xephi.authme.settings.Settings;
import fr.xephi.authme.util.WrapperMock; import fr.xephi.authme.util.WrapperMock;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.junit.Before; import org.junit.Before;
@ -18,7 +19,7 @@ import static org.mockito.Mockito.verify;
/** /**
* Test for {@link Messages}. * Test for {@link Messages}.
*/ */
public class MessagesTest { public class MessagesIntegrationTest {
private static final String YML_TEST_FILE = "messages_test.yml"; private static final String YML_TEST_FILE = "messages_test.yml";
private Messages messages; private Messages messages;
@ -38,8 +39,9 @@ public class MessagesTest {
throw new RuntimeException("File '" + YML_TEST_FILE + "' could not be loaded"); throw new RuntimeException("File '" + YML_TEST_FILE + "' could not be loaded");
} }
File file = new File(url.getFile()); Settings.messageFile = new File(url.getFile());
messages = new Messages(file, "en"); Settings.messagesLanguage = "en";
messages = Messages.getInstance();
} }
@Test @Test

View File

@ -13,14 +13,29 @@ import static org.junit.Assert.fail;
public class AdminPermissionTest { public class AdminPermissionTest {
@Test @Test
public void shouldStartWithAuthMeAdminPrefix() { public void shouldStartWithAuthMePrefix() {
// given // given
String requiredPrefix = "authme.admin."; String requiredPrefix = "authme.";
// when/then // when/then
for (AdminPermission perm : AdminPermission.values()) { for (AdminPermission permission : AdminPermission.values()) {
if (!perm.getNode().startsWith(requiredPrefix)) { if (!permission.getNode().startsWith(requiredPrefix)) {
fail("The permission '" + perm + "' does not start with the required prefix '" + requiredPrefix + "'"); fail("The permission '" + permission + "' does not start with the required prefix '"
+ requiredPrefix + "'");
}
}
}
@Test
public void shouldContainAdminBranch() {
// given
String requiredBranch = ".admin.";
// when/then
for (AdminPermission permission : AdminPermission.values()) {
if (!permission.getNode().contains(requiredBranch)) {
fail("The permission '" + permission + "' does not contain with the required branch '"
+ requiredBranch + "'");
} }
} }
} }
@ -31,11 +46,11 @@ public class AdminPermissionTest {
Set<String> nodes = new HashSet<>(); Set<String> nodes = new HashSet<>();
// when/then // when/then
for (AdminPermission perm : AdminPermission.values()) { for (AdminPermission permission : AdminPermission.values()) {
if (nodes.contains(perm.getNode())) { if (nodes.contains(permission.getNode())) {
fail("More than one enum value defines the node '" + perm.getNode() + "'"); fail("More than one enum value defines the node '" + permission.getNode() + "'");
} }
nodes.add(perm.getNode()); nodes.add(permission.getNode());
} }
} }

View File

@ -0,0 +1,61 @@
package fr.xephi.authme.permission;
import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
import static org.junit.Assert.fail;
/**
* Test for {@link PlayerPermission}.
*/
public class PlayerPermissionTest {
@Test
public void shouldStartWithAuthMePrefix() {
// given
String requiredPrefix = "authme.";
// when/then
for (PlayerPermission permission : PlayerPermission.values()) {
if (!permission.getNode().startsWith(requiredPrefix)) {
fail("The permission '" + permission + "' does not start with the required prefix '" + requiredPrefix
+ "'");
}
}
}
@Test
public void shouldContainPlayerBranch() {
// given
String playerBranch = ".player.";
String adminBranch = ".admin.";
// when/then
for (PlayerPermission permission : PlayerPermission.values()) {
if (permission.getNode().contains(adminBranch)) {
fail("The permission '" + permission + "' should not use a node with the admin-specific branch '"
+ adminBranch + "'");
} else if (!permission.getNode().contains(playerBranch)) {
fail("The permission '" + permission + "' should use a node with the player-specific branch '"
+ playerBranch + "'");
}
}
}
@Test
public void shouldHaveUniqueNodes() {
// given
Set<String> nodes = new HashSet<>();
// when/then
for (PlayerPermission permission : PlayerPermission.values()) {
if (nodes.contains(permission.getNode())) {
fail("More than one enum value defines the node '" + permission.getNode() + "'");
}
nodes.add(permission.getNode());
}
}
}

View File

@ -1,45 +0,0 @@
package fr.xephi.authme.permission;
import org.junit.Test;
import java.util.HashSet;
import java.util.Set;
import static org.junit.Assert.fail;
/**
* Test for {@link UserPermission}.
*/
public class UserPermissionTest {
@Test
public void shouldStartWithRegularAuthMePrefix() {
// given
String requiredPrefix = "authme.";
String adminPrefix = "authme.admin";
// when/then
for (UserPermission perm : UserPermission.values()) {
if (!perm.getNode().startsWith(requiredPrefix)) {
fail("The permission '" + perm + "' does not start with the required prefix '" + requiredPrefix + "'");
} else if (perm.getNode().startsWith(adminPrefix)) {
fail("The permission '" + perm + "' should not use a node with the admin-specific prefix '"
+ adminPrefix + "'");
}
}
}
@Test
public void shouldHaveUniqueNodes() {
// given
Set<String> nodes = new HashSet<>();
// when/then
for (UserPermission perm : UserPermission.values()) {
if (nodes.contains(perm.getNode())) {
fail("More than one enum value defines the node '" + perm.getNode() + "'");
}
nodes.add(perm.getNode());
}
}
}

View File

@ -3,7 +3,7 @@ package fr.xephi.authme.util;
import fr.xephi.authme.AuthMe; import fr.xephi.authme.AuthMe;
import fr.xephi.authme.ReflectionTestUtils; import fr.xephi.authme.ReflectionTestUtils;
import fr.xephi.authme.permission.PermissionsManager; import fr.xephi.authme.permission.PermissionsManager;
import fr.xephi.authme.permission.UserPermission; import fr.xephi.authme.permission.PlayerPermission;
import fr.xephi.authme.settings.Settings; import fr.xephi.authme.settings.Settings;
import org.bukkit.GameMode; import org.bukkit.GameMode;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -54,7 +54,7 @@ public class UtilsTest {
public void shouldForceSurvivalGameMode() { public void shouldForceSurvivalGameMode() {
// given // given
Player player = mock(Player.class); Player player = mock(Player.class);
given(permissionsManagerMock.hasPermission(player, UserPermission.BYPASS_FORCE_SURVIVAL)).willReturn(false); given(permissionsManagerMock.hasPermission(player, PlayerPermission.BYPASS_FORCE_SURVIVAL)).willReturn(false);
// when // when
Utils.forceGM(player); Utils.forceGM(player);
@ -68,14 +68,14 @@ public class UtilsTest {
public void shouldNotForceGameModeForUserWithBypassPermission() { public void shouldNotForceGameModeForUserWithBypassPermission() {
// given // given
Player player = mock(Player.class); Player player = mock(Player.class);
given(permissionsManagerMock.hasPermission(player, UserPermission.BYPASS_FORCE_SURVIVAL)).willReturn(true); given(permissionsManagerMock.hasPermission(player, PlayerPermission.BYPASS_FORCE_SURVIVAL)).willReturn(true);
// when // when
Utils.forceGM(player); Utils.forceGM(player);
// then // then
verify(authMeMock).getPermissionsManager(); verify(authMeMock).getPermissionsManager();
verify(permissionsManagerMock).hasPermission(player, UserPermission.BYPASS_FORCE_SURVIVAL); verify(permissionsManagerMock).hasPermission(player, PlayerPermission.BYPASS_FORCE_SURVIVAL);
verify(player, never()).setGameMode(any(GameMode.class)); verify(player, never()).setGameMode(any(GameMode.class));
} }

View File

@ -2,7 +2,7 @@ package fr.xephi.authme.util;
import fr.xephi.authme.AuthMe; import fr.xephi.authme.AuthMe;
import fr.xephi.authme.cache.auth.PlayerCache; import fr.xephi.authme.cache.auth.PlayerCache;
import fr.xephi.authme.settings.Messages; import fr.xephi.authme.output.Messages;
import org.bukkit.Server; import org.bukkit.Server;
import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitScheduler;
import org.mockito.Mockito; import org.mockito.Mockito;

View File

@ -3,18 +3,16 @@ AuthMe-Team:
Active staff: Active staff:
Xephi (Xephi59) - Leader, Main developer Xephi (Xephi59) - Leader, Main developer
DNx5 - Developer DNx5 - Developer
games647 - Developer ljacqu - Developer
TimVisee - Developer TimVisee - Developer
games647 - Developer
Gabriele C. (sgdc3) - Project Manager, Contributor Gabriele C. (sgdc3) - Project Manager, Contributor
Staff to contact: AuthMeBridge staff:
CryLegend - Contributor, AuthMeBridge Developer (Needs activation) CryLegend - Main developer, We need to contact him!
External Contributors: Retired staff:
Gnat008 - Contributor Maxetto - Ticket Manager, IT translator
Inactive staff:
Maxetto - Ticket Manager, Italian Translator, Basic Developer, Contributor (Inactive)
darkwarriors (d4rkwarriors) - Original AuthMeReloaded Author (Inactive) darkwarriors (d4rkwarriors) - Original AuthMeReloaded Author (Inactive)
Translators: Translators: