diff --git a/bukkit/pom.xml b/bukkit/pom.xml
index fbbfd514..dc61c708 100644
--- a/bukkit/pom.xml
+++ b/bukkit/pom.xml
@@ -97,7 +97,6 @@
com.github.games647
fastlogin.core
- ${project.version}
diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java
index 65cc437b..70754f0c 100644
--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java
+++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/FastLoginBukkit.java
@@ -9,7 +9,6 @@ import com.github.games647.fastlogin.bukkit.listener.protocollib.SkinApplyListen
import com.github.games647.fastlogin.bukkit.listener.protocolsupport.ProtocolSupportListener;
import com.github.games647.fastlogin.bukkit.tasks.DelayedAuthHook;
import com.github.games647.fastlogin.core.CommonUtil;
-import com.github.games647.fastlogin.core.messages.ChangePremiumMessage;
import com.github.games647.fastlogin.core.messages.ChannelMessage;
import com.github.games647.fastlogin.core.shared.FastLoginCore;
import com.github.games647.fastlogin.core.shared.PlatformPlugin;
@@ -17,7 +16,6 @@ import com.google.common.io.ByteArrayDataOutput;
import com.google.common.io.ByteStreams;
import java.nio.file.Path;
-import java.util.Optional;
import java.util.concurrent.ConcurrentMap;
import org.bukkit.command.CommandSender;
@@ -114,23 +112,6 @@ public class FastLoginBukkit extends JavaPlugin implements PlatformPlugin optPlayer = getServer().getOnlinePlayers().stream().findFirst();
- if (!optPlayer.isPresent()) {
- logger.info("No player online to send a plugin message to the proxy");
- return;
- }
-
- Player sender = optPlayer.get();
- ChannelMessage message = new ChangePremiumMessage(target, activate, false);
- sendPluginMessage(sender, message);
- }
- }
-
/**
* Gets a thread-safe map about players which are connecting to the server are being checked to be premium (paid
* account)
@@ -141,7 +122,7 @@ public class FastLoginBukkit extends JavaPlugin implements PlatformPlugin {
- plugin.getCore().getStorage().save(profile);
- });
- } else {
- plugin.getCore().sendLocaleMessage("not-premium", sender);
- }
- }
-
- return true;
+ onCrackedSelf(sender, command, args);
} else {
onCrackedOther(sender, command, args);
}
@@ -53,34 +24,65 @@ public class CrackedCommand implements CommandExecutor {
return true;
}
- private void onCrackedOther(CommandSender sender, Command command, String[] args) {
- if (!sender.hasPermission(command.getPermission() + ".other")) {
- plugin.getCore().sendLocaleMessage("no-permission", sender);
+ private void onCrackedSelf(CommandSender sender, Command cmd, String[] args) {
+ if (isConsole(sender)) {
return;
}
-
- if (plugin.isBungeeCord()) {
- plugin.sendBungeeActivateMessage(sender, args[0], false);
+
+ if (forwardCrackedCommand(sender, sender.getName())) {
+ return;
+ }
+
+ if (plugin.isBungeeEnabled()) {
+ sendBungeeActivateMessage(sender, sender.getName(), false);
plugin.getCore().sendLocaleMessage("wait-on-proxy", sender);
} else {
- //todo: load async
- StoredProfile profile = plugin.getCore().getStorage().loadProfile(args[0]);
- if (profile == null) {
- sender.sendMessage("Error occurred");
- return;
- }
-
- //existing player is already cracked
- if (profile.isSaved() && !profile.isPremium()) {
- plugin.getCore().sendLocaleMessage("not-premium-other", sender);
- } else {
+ //todo: load async if
+ StoredProfile profile = plugin.getCore().getStorage().loadProfile(sender.getName());
+ if (profile.isPremium()) {
plugin.getCore().sendLocaleMessage("remove-premium", sender);
profile.setPremium(false);
+ profile.setId(null);
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
plugin.getCore().getStorage().save(profile);
});
+ } else {
+ plugin.getCore().sendLocaleMessage("not-premium", sender);
}
}
}
+
+ private void onCrackedOther(CommandSender sender, Command command, String[] args) {
+ if (!hasOtherPermission(sender, command)) {
+ return;
+ }
+
+ if (forwardCrackedCommand(sender, args[0])) {
+ return;
+ }
+
+ //todo: load async
+ StoredProfile profile = plugin.getCore().getStorage().loadProfile(args[0]);
+ if (profile == null) {
+ sender.sendMessage("Error occurred");
+ return;
+ }
+
+ //existing player is already cracked
+ if (profile.isSaved() && !profile.isPremium()) {
+ plugin.getCore().sendLocaleMessage("not-premium-other", sender);
+ } else {
+ plugin.getCore().sendLocaleMessage("remove-premium", sender);
+
+ profile.setPremium(false);
+ Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
+ plugin.getCore().getStorage().save(profile);
+ });
+ }
+ }
+
+ private boolean forwardCrackedCommand(CommandSender sender, String target) {
+ return forwardBungeeCommand(sender, target, false);
+ }
}
diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/PremiumCommand.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/PremiumCommand.java
index 9ea89eca..b9d52359 100644
--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/PremiumCommand.java
+++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/PremiumCommand.java
@@ -7,7 +7,6 @@ import java.util.UUID;
import org.bukkit.Bukkit;
import org.bukkit.command.Command;
-import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
@@ -16,52 +15,16 @@ import org.bukkit.entity.Player;
* the user has access to it's account. So we can make sure that not another
* person with a paid account and the same username can steal his account.
*/
-public class PremiumCommand implements CommandExecutor {
-
- private final FastLoginBukkit plugin;
+public class PremiumCommand extends ToggleCommand {
public PremiumCommand(FastLoginBukkit plugin) {
- this.plugin = plugin;
+ super(plugin);
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length == 0) {
- if (!(sender instanceof Player)) {
- //console or command block
- plugin.getCore().sendLocaleMessage("no-console", sender);
- return true;
- }
-
- if (plugin.isBungeeCord()) {
- plugin.sendBungeeActivateMessage(sender, sender.getName(), true);
- plugin.getCore().sendLocaleMessage("wait-on-proxy", sender);
- } else {
- UUID id = ((Player) sender).getUniqueId();
- if (plugin.getConfig().getBoolean("premium-warning")
- && !plugin.getCore().getPendingConfirms().contains(id)) {
- sender.sendMessage(plugin.getCore().getMessage("premium-warning"));
- plugin.getCore().getPendingConfirms().add(id);
- return true;
- }
-
- plugin.getCore().getPendingConfirms().remove(id);
- //todo: load async
- StoredProfile profile = plugin.getCore().getStorage().loadProfile(sender.getName());
- if (profile.isPremium()) {
- plugin.getCore().sendLocaleMessage("already-exists", sender);
- } else {
- //todo: resolve uuid
- profile.setPremium(true);
- Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
- plugin.getCore().getStorage().save(profile);
- });
-
- plugin.getCore().sendLocaleMessage("add-premium", sender);
- }
- }
-
- return true;
+ onPremiumSelf(sender, command, args);
} else {
onPremiumOther(sender, command, args);
}
@@ -69,25 +32,27 @@ public class PremiumCommand implements CommandExecutor {
return true;
}
- private void onPremiumOther(CommandSender sender, Command command, String[] args) {
- if (!sender.hasPermission(command.getPermission() + ".other")) {
- plugin.getCore().sendLocaleMessage("no-permission", sender);
- return ;
+ private void onPremiumSelf(CommandSender sender, Command cmd, String[] args) {
+ if (isConsole(sender)) {
+ return;
}
- if (plugin.isBungeeCord()) {
- plugin.sendBungeeActivateMessage(sender, args[0], true);
- plugin.getCore().sendLocaleMessage("wait-on-proxy", sender);
- } else {
- //todo: load async
- StoredProfile profile = plugin.getCore().getStorage().loadProfile(args[0]);
- if (profile == null) {
- plugin.getCore().sendLocaleMessage("player-unknown", sender);
+ if (forwardPremiumCommand(sender, sender.getName())) {
+ return;
+ }
+
+ UUID id = ((Player) sender).getUniqueId();
+ if (plugin.getConfig().getBoolean("premium-warning") && !plugin.getCore().getPendingConfirms().contains(id)) {
+ sender.sendMessage(plugin.getCore().getMessage("premium-warning"));
+ plugin.getCore().getPendingConfirms().add(id);
return;
}
-
+
+ plugin.getCore().getPendingConfirms().remove(id);
+ //todo: load async
+ StoredProfile profile = plugin.getCore().getStorage().loadProfile(sender.getName());
if (profile.isPremium()) {
- plugin.getCore().sendLocaleMessage("already-exists-other", sender);
+ plugin.getCore().sendLocaleMessage("already-exists", sender);
} else {
//todo: resolve uuid
profile.setPremium(true);
@@ -95,8 +60,40 @@ public class PremiumCommand implements CommandExecutor {
plugin.getCore().getStorage().save(profile);
});
- plugin.getCore().sendLocaleMessage("add-premium-other", sender);
+ plugin.getCore().sendLocaleMessage("add-premium", sender);
}
+ }
+
+ private void onPremiumOther(CommandSender sender, Command command, String[] args) {
+ if (!hasOtherPermission(sender, command)) {
+ return;
+ }
+
+ if (forwardPremiumCommand(sender, args[0])) {
+ return;
+ }
+
+ //todo: load async
+ StoredProfile profile = plugin.getCore().getStorage().loadProfile(args[0]);
+ if (profile == null) {
+ plugin.getCore().sendLocaleMessage("player-unknown", sender);
+ return;
+ }
+
+ if (profile.isPremium()) {
+ plugin.getCore().sendLocaleMessage("already-exists-other", sender);
+ } else {
+ //todo: resolve uuid
+ profile.setPremium(true);
+ Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
+ plugin.getCore().getStorage().save(profile);
+ });
+
+ plugin.getCore().sendLocaleMessage("add-premium-other", sender);
}
}
+
+ private boolean forwardPremiumCommand(CommandSender sender, String target) {
+ return forwardBungeeCommand(sender, target, true);
+ }
}
diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/ToggleCommand.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/ToggleCommand.java
new file mode 100644
index 00000000..11344457
--- /dev/null
+++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/commands/ToggleCommand.java
@@ -0,0 +1,69 @@
+package com.github.games647.fastlogin.bukkit.commands;
+
+import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
+import com.github.games647.fastlogin.core.messages.ChangePremiumMessage;
+import com.github.games647.fastlogin.core.messages.ChannelMessage;
+
+import java.util.Optional;
+
+import org.bukkit.Bukkit;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandExecutor;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.plugin.messaging.PluginMessageRecipient;
+
+public abstract class ToggleCommand implements CommandExecutor {
+
+ protected final FastLoginBukkit plugin;
+
+ public ToggleCommand(FastLoginBukkit plugin) {
+ this.plugin = plugin;
+ }
+
+ protected boolean hasOtherPermission(CommandSender sender, Command cmd) {
+ if (!sender.hasPermission(cmd.getPermission() + ".other")) {
+ plugin.getCore().sendLocaleMessage("no-permission", sender);
+ return false;
+ }
+
+ return true;
+ }
+
+ protected boolean forwardBungeeCommand(CommandSender sender, String target, boolean activate) {
+ if (plugin.isBungeeEnabled()) {
+ sendBungeeActivateMessage(sender, target, activate);
+ plugin.getCore().sendLocaleMessage("wait-on-proxy", sender);
+ return true;
+ }
+
+ return false;
+ }
+
+ protected boolean isConsole(CommandSender sender) {
+ if (sender instanceof Player) {
+ return false;
+ }
+
+ //console or command block
+ sender.sendMessage(plugin.getCore().getMessage("no-console"));
+ return true;
+ }
+
+ protected void sendBungeeActivateMessage(CommandSender invoker, String target, boolean activate) {
+ if (invoker instanceof PluginMessageRecipient) {
+ ChannelMessage message = new ChangePremiumMessage(target, activate, true);
+ plugin.sendPluginMessage((PluginMessageRecipient) invoker, message);
+ } else {
+ Optional extends Player> optPlayer = Bukkit.getServer().getOnlinePlayers().stream().findFirst();
+ if (!optPlayer.isPresent()) {
+ plugin.getLog().info("No player online to send a plugin message to the proxy");
+ return;
+ }
+
+ Player sender = optPlayer.get();
+ ChannelMessage message = new ChangePremiumMessage(target, activate, false);
+ plugin.sendPluginMessage(sender, message);
+ }
+ }
+}
diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BungeeListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BungeeListener.java
index c2b52a17..7ddef28b 100644
--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BungeeListener.java
+++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/BungeeListener.java
@@ -63,9 +63,12 @@ public class BungeeListener implements PluginMessageListener {
//check if the player is still online or disconnected
Player checkedPlayer = Bukkit.getPlayerExact(loginMessage.getPlayerName());
+ if (checkedPlayer == null) {
+ return;
+ }
//fail if target player is blacklisted because already authenticated or wrong bungeecord id
- if (checkedPlayer != null && !checkedPlayer.hasMetadata(plugin.getName())) {
+ if (checkedPlayer.hasMetadata(plugin.getName())) {
//fail if BungeeCord support is disabled (id = null)
UUID sourceId = loginMessage.getProxyId();
if (proxyIds.contains(sourceId)) {
@@ -73,6 +76,8 @@ public class BungeeListener implements PluginMessageListener {
} else {
plugin.getLog().warn("Received proxy id: {} that doesn't exist in the proxy whitelist file", sourceId);
}
+ } else {
+ plugin.getLog().warn("Received message {} from a blacklisted player {}", loginMessage, checkedPlayer);
}
}
diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/JoinListener.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/JoinListener.java
index 9c137e80..24185685 100644
--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/JoinListener.java
+++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/listener/JoinListener.java
@@ -38,7 +38,7 @@ public class JoinListener implements Listener {
public void onPlayerJoin(PlayerJoinEvent joinEvent) {
Player player = joinEvent.getPlayer();
- if (!plugin.isBungeeCord()) {
+ if (!plugin.isBungeeEnabled()) {
//Wait before auth plugin and we received a message from BungeeCord initializes the player
Runnable forceLoginTask = new ForceLoginTask(plugin.getCore(), player);
Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, forceLoginTask, DELAY_LOGIN);
diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/tasks/DelayedAuthHook.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/tasks/DelayedAuthHook.java
index d3a02486..6be5c2b8 100644
--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/tasks/DelayedAuthHook.java
+++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/tasks/DelayedAuthHook.java
@@ -27,7 +27,7 @@ public class DelayedAuthHook implements Runnable {
@Override
public void run() {
boolean hookFound = isHookFound();
- if (plugin.isBungeeCord()) {
+ if (plugin.isBungeeEnabled()) {
plugin.getLog().info("BungeeCord setting detected. No auth plugin is required");
} else if (!hookFound) {
plugin.getLog().warn("No auth plugin were found by this plugin "
diff --git a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/tasks/ForceLoginTask.java b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/tasks/ForceLoginTask.java
index bb9cc2f8..ee53de65 100644
--- a/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/tasks/ForceLoginTask.java
+++ b/bukkit/src/main/java/com/github/games647/fastlogin/bukkit/tasks/ForceLoginTask.java
@@ -2,7 +2,6 @@ package com.github.games647.fastlogin.bukkit.tasks;
import com.github.games647.fastlogin.bukkit.BukkitLoginSession;
import com.github.games647.fastlogin.bukkit.FastLoginBukkit;
-import com.github.games647.fastlogin.core.messages.ChannelMessage;
import com.github.games647.fastlogin.core.messages.SuccessMessage;
import com.github.games647.fastlogin.core.shared.FastLoginCore;
import com.github.games647.fastlogin.core.shared.ForceLoginManagement;
@@ -38,9 +37,8 @@ public class ForceLoginTask extends ForceLoginManagement
${project.groupId}
fastlogin.core
- ${project.version}
diff --git a/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/ConnectListener.java b/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/ConnectListener.java
index a7759a17..378b8aa8 100644
--- a/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/ConnectListener.java
+++ b/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/ConnectListener.java
@@ -1,6 +1,5 @@
package com.github.games647.fastlogin.bungee.listener;
-import com.github.games647.craftapi.UUIDAdapter;
import com.github.games647.fastlogin.bungee.FastLoginBungee;
import com.github.games647.fastlogin.bungee.tasks.AsyncPremiumCheck;
import com.github.games647.fastlogin.bungee.tasks.ForceLoginTask;
diff --git a/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/MessageListener.java b/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/MessageListener.java
index 2da1273a..52c3eea5 100644
--- a/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/MessageListener.java
+++ b/bungee/src/main/java/com/github/games647/fastlogin/bungee/listener/MessageListener.java
@@ -39,14 +39,16 @@ public class MessageListener implements Listener {
//moreover the client shouldn't be able fake a running premium check by sending the result message
pluginMessageEvent.setCancelled(true);
- //check if the message is sent from the server
- if (Server.class.isAssignableFrom(pluginMessageEvent.getSender().getClass())) {
- //so that we can safely process this in the background
- byte[] data = Arrays.copyOf(pluginMessageEvent.getData(), pluginMessageEvent.getData().length);
- ProxiedPlayer forPlayer = (ProxiedPlayer) pluginMessageEvent.getReceiver();
-
- ProxyServer.getInstance().getScheduler().runAsync(plugin, () -> readMessage(forPlayer, data));
+ if (!(pluginMessageEvent.getSender() instanceof Server)) {
+ //check if the message is sent from the server
+ return;
}
+
+ //so that we can safely process this in the background
+ byte[] data = Arrays.copyOf(pluginMessageEvent.getData(), pluginMessageEvent.getData().length);
+ ProxiedPlayer forPlayer = (ProxiedPlayer) pluginMessageEvent.getReceiver();
+
+ ProxyServer.getInstance().getScheduler().runAsync(plugin, () -> readMessage(forPlayer, data));
}
private void readMessage(ProxiedPlayer forPlayer, byte[] data) {
diff --git a/core/pom.xml b/core/pom.xml
index c266d52c..1d21c21c 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -66,7 +66,7 @@
com.github.games647
craftapi
- 0.1
+ 0.1.3
diff --git a/core/src/main/java/com/github/games647/fastlogin/core/messages/ChangePremiumMessage.java b/core/src/main/java/com/github/games647/fastlogin/core/messages/ChangePremiumMessage.java
index 0307db87..d2e718f7 100644
--- a/core/src/main/java/com/github/games647/fastlogin/core/messages/ChangePremiumMessage.java
+++ b/core/src/main/java/com/github/games647/fastlogin/core/messages/ChangePremiumMessage.java
@@ -49,4 +49,13 @@ public class ChangePremiumMessage implements ChannelMessage {
output.writeUTF(playerName);
output.writeBoolean(isSourceInvoker);
}
+
+ @Override
+ public String toString() {
+ return this.getClass().getSimpleName() + '{' +
+ "playerName='" + playerName + '\'' +
+ ", willEnable=" + willEnable +
+ ", isSourceInvoker=" + isSourceInvoker +
+ '}';
+ }
}
diff --git a/core/src/main/java/com/github/games647/fastlogin/core/messages/SuccessMessage.java b/core/src/main/java/com/github/games647/fastlogin/core/messages/SuccessMessage.java
index 9e807ba4..9ee72e15 100644
--- a/core/src/main/java/com/github/games647/fastlogin/core/messages/SuccessMessage.java
+++ b/core/src/main/java/com/github/games647/fastlogin/core/messages/SuccessMessage.java
@@ -19,4 +19,9 @@ public class SuccessMessage implements ChannelMessage {
public void writeTo(ByteArrayDataOutput output) {
//empty
}
+
+ @Override
+ public String toString() {
+ return this.getClass().getSimpleName() + "{}";
+ }
}