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