· 7 years ago · Jul 30, 2018, 06:48 PM
1package fr.packcraft.earthskyhub;
2
3import java.io.IOException;
4import java.io.InputStream;
5import java.math.BigInteger;
6import java.net.HttpURLConnection;
7import java.net.URL;
8
9import javax.crypto.SecretKey;
10
11import org.bukkit.craftbukkit.v1_10_R1.CraftServer;
12import org.bukkit.event.EventHandler;
13import org.bukkit.event.Listener;
14import org.bukkit.event.player.PlayerLoginEvent;
15import org.bukkit.plugin.java.JavaPlugin;
16
17import com.comphenix.protocol.PacketType;
18import com.comphenix.protocol.ProtocolLibrary;
19import com.comphenix.protocol.events.PacketAdapter;
20import com.comphenix.protocol.events.PacketEvent;
21
22import net.minecraft.server.v1_10_R1.MinecraftEncryption;
23import net.minecraft.server.v1_10_R1.MinecraftServer;
24import net.minecraft.server.v1_10_R1.PacketLoginInEncryptionBegin;
25
26public class main extends JavaPlugin implements Listener {
27
28
29 @Override
30 public void onEnable() {
31 this.registerListener();
32
33 }
34
35 @EventHandler
36 public void join(PlayerLoginEvent e){
37 }
38
39 private class SessChkRun implements Runnable {
40 private main plugin;
41 private String name;
42 private String serverId;
43 public SessChkRun(main plugin, String name, String serverId) {
44 this.plugin = plugin;
45 this.name = name;
46 this.serverId = serverId;
47 }
48 @Override
49 public void run() {
50 this.plugin.checkSession(this.name, this.serverId);
51 }
52 }
53
54 private class EncBegAdapter extends PacketAdapter {
55 private main plugin;
56 public EncBegAdapter(main plugin) {
57 super(plugin, PacketType.Login.Client.ENCRYPTION_BEGIN);
58 this.plugin = plugin;
59 }
60 @Override
61 public void onPacketSending(PacketEvent event) {
62 this.plugin.getLogger().info("Received LoginInEncryptionBegin from " + event.getPlayer().getName() + " [" + event.getPlayer().getUniqueId().toString() + "]");
63 String serverId = this.plugin.getServerId((PacketLoginInEncryptionBegin) event.getPacket().getHandle(), ((CraftServer) this.plugin.getServer()).getServer());
64 this.plugin.getLogger().info("Decrypted his sent server ID (\"" + serverId + "\") and requesting mojang check.");
65 this.plugin.getServer().getScheduler().runTaskAsynchronously(this.plugin, new SessChkRun(this.plugin, event.getPlayer().getName(), serverId));
66 }
67 }
68
69 private void registerListener() {
70 ProtocolLibrary.getProtocolManager().addPacketListener(new EncBegAdapter(this));
71 }
72
73 public String getServerId(PacketLoginInEncryptionBegin packet, MinecraftServer server) {
74 // Decryption copied from "net.minecraft.server.v1_10_R1.LoginListener.a(PacketLoginInEncryptionBegin)"
75 SecretKey loginKey = ((PacketLoginInEncryptionBegin) packet).a(server.O().getPrivate());
76 return new BigInteger(MinecraftEncryption.a("", server.O().getPublic(), loginKey)).toString(16);
77 }
78
79 public void checkSession(String name, String serverId) {
80 try {
81 URL url= new URL("https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" + name + "&serverId=" + serverId);
82 this.getLogger().info("Starting HTTP GET request to \"https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" + name + "&serverId=" + serverId + "\"");
83 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
84 if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
85 InputStream streamIn = connection.getInputStream();
86 byte[] buffer = new byte[streamIn.available()];
87 streamIn.read(buffer);
88 streamIn.close();
89 this.getLogger().info("Received data: " + new String(buffer, "UTF-8"));
90 } else {
91 this.getLogger().info("Error: HTTP/" + Integer.toString(connection.getResponseCode()) + ", " + connection.getResponseMessage());
92 }
93 } catch (IOException e) {
94 e.printStackTrace();
95 }
96 }
97
98}