· 5 years ago · Jun 11, 2020, 01:12 PM
1// ...
2// All NMS imports related to net.minecraft.server.v1_10_R1
3// ...
4public class SessChkMain extends JavaPlugin {
5 // ...
6 @Override
7 public void onEnable() {
8 // ...
9 this.registerListener();
10 }
11 // ...
12 private class SessChkRun implements Runnable {
13 private SessChkMain plugin;
14 private String name;
15 private String serverId;
16 public SessChkRun(SessChkMain plugin, String name, String serverId) {
17 this.plugin = plugin;
18 this.name = name;
19 this.serverId = serverId;
20 }
21 @Override
22 public void run() {
23 this.plugin.checkSession(this.name, this.serverId);
24 }
25 }
26 private class EncBegAdapter extends PacketAdapter {
27 private SessChkMain plugin;
28 public EncBegAdapter(SessChkMain plugin) {
29 super(plugin, PacketType.Login.Client.ENCRYPTION_BEGIN);
30 this.plugin = plugin;
31 }
32 @Override
33 public void onPacketSending(PacketEvent event) {
34 this.plugin.getLogger().info("Received LoginInEncryptionBegin from " + event.getPlayer().getName() + " [" + event.getPlayer().getUniqueId().toString() + "]");
35 String serverId = this.plugin.getServerId((PacketLoginInEncryptionBegin) event.getPacket().getHandle(), ((CraftServer) this.plugin.getServer()).getServer());
36 this.plugin.getLogger().info("Decrypted his sent server ID (\"" + serverId + "\") and requesting mojang check.");
37 this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, new SessChkRun(this.plugin, event.getPlayer().getName(), serverId));
38 }
39 }
40 private void registerListener() {
41 ProtocolLibrary.getProtocolManager().addPacketListener(new EncBegAdapter(this));
42 }
43 public String getServerId(PacketLoginInEncryptionBegin packet, MinecraftServer server) {
44 // Decryption copied from "net.minecraft.server.v1_10_R1.LoginListener.a(PacketLoginInEncryptionBegin)"
45 SecretKey loginKey = ((PacketLoginInEncryptionBegin) packet).a(server.O().getPrivate());
46 return new BigInteger(MinecraftEncryption.a("", server.O().getPublic(), loginKey)).toString(16);
47 }
48 public void checkSession(String name, String serverId) {
49 try {
50 URL url= new URL("https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" + name + "&serverId=" + serverId);
51 this.getLogger().info("Starting HTTP GET request to \"https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" + name + "&serverId=" + serverId + "\"");
52 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
53 if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
54 InputStream streamIn = connection.getInputStream();
55 byte[] buffer = new byte[streamIn.available()];
56 streamIn.read(buffer);
57 streamIn.close();
58 this.getLogger().info("Received data: " + new String(buffer, "UTF-8"));
59 } else {
60 this.getLogger().info("Error: HTTP/" + Integer.toString(connection.getResponseCode()) + ", " + connection.getResponseMessage());
61 }
62 } catch (IOException e) {
63 e.printStackTrace();
64 }
65 }
66}