diff --git a/README.md b/README.md
index 370ba59e..22e8b52e 100644
--- a/README.md
+++ b/README.md
@@ -1,11 +1,19 @@
# FastLogin
-Checks if a minecraft player has a valid premium (paid account). If so, they can skip offline authentification.
+Checks if a minecraft player has a valid premium (paid account). If so, they can skip offline authentication.
-Requirements:
+###Commands:
+* /premium Marks the invoker as paid account
+* /premium [playername] Mark player specified as a paid account
+
+###Premissions:
+* fastlogin.command.premium
+* fastlogin.command.premium.others
+
+###Requirements:
* [ProtocolLib](http://www.spigotmc.org/resources/protocollib.1997/)
-* Bukkit 1.8.8
-* Java 8 or above
+* Tested Bukkit 1.8.8 (could also work with other versions)
+* Java 7 or above
* An auth plugin. Supported Plugins:
* [AuthMe](http://dev.bukkit.org/bukkit-plugins/authme-reloaded/)
* [xAuth](http://dev.bukkit.org/bukkit-plugins/xauth/)
diff --git a/pom.xml b/pom.xml
index e5188846..b8558d1d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,7 @@
jar
FastLogin
- 0.2.2
+ 0.2.3
2015
https://github.com/games647/FastLogin
@@ -127,12 +127,14 @@
fr.xephi
authme
5.0-SNAPSHOT
+ true
de.luricos.bukkit
xAuth
2.6
+ true
@@ -146,10 +148,12 @@
+
de.st_ddt.crazy
CrazyCore
10.7.7
+ true
system
${project.basedir}/lib/CrazyCore v10.7.7.jar
@@ -158,14 +162,17 @@
de.st_ddt.crazy
CrazyLogin
7.23
+ true
system
${project.basedir}/lib/CrazyLogin v7.23.2.jar
+
me.lenis0012.ls
LoginSecurity
2.0.10
+ true
system
${project.basedir}/lib/LoginSecurity v2.0.10.jar
diff --git a/src/main/java/com/github/games647/fastlogin/FastLogin.java b/src/main/java/com/github/games647/fastlogin/FastLogin.java
index 273cf880..2e3b9aea 100644
--- a/src/main/java/com/github/games647/fastlogin/FastLogin.java
+++ b/src/main/java/com/github/games647/fastlogin/FastLogin.java
@@ -149,7 +149,7 @@ public class FastLogin extends JavaPlugin {
}
if (authPluginHook == null) {
- //run this check for exceptions and not found plugins
+ //run this check for exceptions (errors) and not found plugins
getLogger().warning("No support offline Auth plugin found. ");
getLogger().warning("Disabling this plugin...");
diff --git a/src/main/java/com/github/games647/fastlogin/listener/EncryptionPacketListener.java b/src/main/java/com/github/games647/fastlogin/listener/EncryptionPacketListener.java
index f5b9a45d..84e1c0d6 100644
--- a/src/main/java/com/github/games647/fastlogin/listener/EncryptionPacketListener.java
+++ b/src/main/java/com/github/games647/fastlogin/listener/EncryptionPacketListener.java
@@ -7,6 +7,7 @@ import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import com.comphenix.protocol.injector.server.TemporaryPlayerFactory;
import com.comphenix.protocol.reflect.FuzzyReflection;
+import com.comphenix.protocol.wrappers.WrappedChatComponent;
import com.comphenix.protocol.wrappers.WrappedGameProfile;
import com.github.games647.fastlogin.Encryption;
import com.github.games647.fastlogin.FastLogin;
@@ -137,14 +138,29 @@ public class EncryptionPacketListener extends PacketAdapter {
packetEvent.setCancelled(true);
}
- private void disconnect(PacketEvent packetEvent, String kickMessage, Level logLevel, String logMessage
+ private void disconnect(PacketEvent packetEvent, String kickReason, Level logLevel, String logMessage
, Object... arguments) {
plugin.getLogger().log(logLevel, logMessage, arguments);
- packetEvent.getPlayer().kickPlayer(kickMessage);
+ kickPlayer(packetEvent.getPlayer(), kickReason);
//cancel the event in order to prevent the server receiving an invalid packet
packetEvent.setCancelled(true);
}
+ private void kickPlayer(Player player, String reason) {
+ PacketContainer kickPacket = protocolManager.createPacket(PacketType.Login.Server.DISCONNECT);
+ kickPacket.getChatComponents().write(0, WrappedChatComponent.fromText(reason));
+
+ try {
+ //send kick packet at login state
+ //the normal event.getPlayer.kickPlayer(String) method does only work at play state
+ protocolManager.sendServerPacket(player, kickPacket);
+ //tell the server that we want to close the connection
+ player.kickPlayer("Disconnect");
+ } catch (InvocationTargetException ex) {
+ plugin.getLogger().log(Level.SEVERE, "Error sending kickpacket", ex);
+ }
+ }
+
private Object getNetworkManager(Player player)
throws SecurityException, IllegalAccessException, NoSuchFieldException {
Object injector = TemporaryPlayerFactory.getInjectorFromPlayer(player);
@@ -178,8 +194,8 @@ public class EncryptionPacketListener extends PacketAdapter {
//catch not only ioexceptions also parse and NPE on unexpected json format
plugin.getLogger().log(Level.WARNING, "Failed to verify if session is valid", ex);
}
- //this connection doesn't need to be closed. So can make use of keep alive in java
+ //this connection doesn't need to be closed. So can make use of keep alive in java
return false;
}
@@ -191,11 +207,12 @@ public class EncryptionPacketListener extends PacketAdapter {
WrappedGameProfile fakeProfile = WrappedGameProfile.fromOfflinePlayer(Bukkit.getOfflinePlayer(username));
startPacket.getGameProfiles().write(0, fakeProfile);
try {
+ //we don't want to handle our own packets so ignore filters
protocolManager.recieveClientPacket(from, startPacket, false);
} catch (InvocationTargetException | IllegalAccessException ex) {
plugin.getLogger().log(Level.WARNING, "Failed to fake a new start packet", ex);
//cancel the event in order to prevent the server receiving an invalid packet
- from.kickPlayer("Error occurred");
+ kickPlayer(from, "Error occured");
}
}
}
diff --git a/src/main/java/com/github/games647/fastlogin/listener/PlayerListener.java b/src/main/java/com/github/games647/fastlogin/listener/PlayerListener.java
index cae84113..7fb4a043 100644
--- a/src/main/java/com/github/games647/fastlogin/listener/PlayerListener.java
+++ b/src/main/java/com/github/games647/fastlogin/listener/PlayerListener.java
@@ -32,11 +32,13 @@ public class PlayerListener implements Listener {
//check if it's the same player as we checked before
if (session != null && session.getUsername().equals(player.getName())
&& session.isVerified()) {
+//java 8
// Bukkit.getScheduler().runTaskLater(plugin, () -> {
// if (player.isOnline()) {
// plugin.getLogger().log(Level.FINER, "Logging player {0} in", player.getName());
// authPlugin.forceLogin(player);
// }
+ //java 7+
Bukkit.getScheduler().runTaskLater(plugin, new Runnable() {
@Override
@@ -47,7 +49,7 @@ public class PlayerListener implements Listener {
}
}
//Wait before auth plugin initializes the player
- }, 1 * 20L);
+ }, 2 * 20L);
}
}
}
diff --git a/src/main/java/com/github/games647/fastlogin/listener/StartPacketListener.java b/src/main/java/com/github/games647/fastlogin/listener/StartPacketListener.java
index 471b0cd2..de26f0fa 100644
--- a/src/main/java/com/github/games647/fastlogin/listener/StartPacketListener.java
+++ b/src/main/java/com/github/games647/fastlogin/listener/StartPacketListener.java
@@ -75,7 +75,7 @@ public class StartPacketListener extends PacketAdapter {
plugin.getLogger().log(Level.FINER, "Player {0} with {1} connecting to the server"
, new Object[]{sessionKey, username});
//do premium login process
- if (isPremium(username)) {
+ if (plugin.getEnabledPremium().contains(username) && isPremium(username)) {
//minecraft server implementation
//https://github.com/bergerkiller/CraftSource/blob/master/net.minecraft.server/LoginListener.java#L161
sentEncryptionRequest(sessionKey, username, player, packetEvent);
@@ -84,7 +84,7 @@ public class StartPacketListener extends PacketAdapter {
private boolean isPremium(String playerName) {
//check if it's a valid playername and the user activated fast logins
- if (playernameMatcher.matcher(playerName).matches() && plugin.getEnabledPremium().contains(playerName)) {
+ if (playernameMatcher.matcher(playerName).matches()) {
//only make a API call if the name is valid existing mojang account
try {
HttpURLConnection connection = plugin.getConnection(UUID_LINK + playerName);
@@ -119,7 +119,7 @@ public class StartPacketListener extends PacketAdapter {
random.nextBytes(verifyToken);
newPacket.getByteArrays().write(0, verifyToken);
- protocolManager.sendServerPacket(player, newPacket, false);
+ protocolManager.sendServerPacket(player, newPacket);
//cancel only if the player has a paid account otherwise login as normal offline player
packetEvent.setCancelled(true);
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index ef05e635..b09c4079 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -19,9 +19,9 @@ softdepend:
- LoginSecurity
commands:
- premium:
+ ${project.artifactId}.:
description: 'Marks the invoker or the player specified as premium'
- aliases: [prem, fastlogin, loginfast]
+ aliases: [prem, premium, loginfast]
usage: / [player]
permission: ${project.artifactId}.command.premium