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 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() + "{}"; + } }