· 9 years ago · Oct 17, 2016, 04:30 PM
1public class EncryptionResponsePacket extends EncryptionResponse {
2
3 @Override
4 public void handle(final AbstractPacketHandler handler) throws Exception {
5 EncryptionRequest request = BungeeReflections.REQUEST_FIELD.get(handler);
6 ChannelWrapper ch = BungeeReflections.CHANNEL_FIELD.get(handler);
7 final InitialHandler conn = (InitialHandler) handler; /* CHECK THIS PROBABLY */
8
9 final PlayerData playerData = BungeeLogin.getPlugin().getDataManager().getPlayerData(conn.getName());
10
11 SecretKey sharedKey = EncryptionUtil.getSecret(this, request);
12 BungeeCipher decrypt = EncryptionUtil.getCipher(false, sharedKey);
13 ch.addBefore(PipelineUtils.FRAME_DECODER, PipelineUtils.DECRYPT_HANDLER, new CipherDecoder(decrypt));
14 BungeeCipher encrypt = EncryptionUtil.getCipher(true, sharedKey);
15 ch.addBefore(PipelineUtils.FRAME_DECODER, PipelineUtils.ENCRYPT_HANDLER, new CipherEncoder(encrypt));
16
17 String encName = URLEncoder.encode(conn.getName(), "UTF-8");
18
19 MessageDigest sha = MessageDigest.getInstance("SHA-1");
20 byte[][] bits = new byte[][] {
21 request.getServerId().getBytes("ISO_8859_1"),
22 sharedKey.getEncoded(),
23 EncryptionUtil.keys.getPublic().getEncoded()
24 };
25
26 for (byte[] bit : bits) {
27 sha.update(bit);
28 }
29
30 String encodedHash = URLEncoder.encode(new BigInteger(sha.digest()).toString(16), "UTF-8");
31 String authURL = "https://sessionserver.mojang.com/session/minecraft/hasJoined?username=" + encName + "&serverId=" + encodedHash;
32
33 Callback<String> httpHandler = new Callback<String>() {
34 boolean replied = false; //For some reason Mojang replies two times, so we don't want that
35
36 @Override
37 public void done(String result, Throwable error) {
38 if(replied) {
39 return;
40 }
41
42 replied = true;
43
44 try {
45 if (error == null) { /* Assume player is online */
46 LoginResult loginResult = BungeeCord.getInstance().gson.fromJson(result, LoginResult.class);
47
48 if (loginResult == null) {
49 if(playerData.isNewData()) {
50 playerData.setPremiumUse(false);
51 }
52
53 if(playerData.isPremiumUse()) {
54 conn.disconnect(Messages.TRIED_USE_PREMIUM_ACCOUNT.getColored());
55 } else {
56 BungeeReflections.UNIQUE_ID_FIELD.set(handler, playerData.getUUID());
57 BungeeReflections.ONLINE_FIELD.set(conn, false);
58
59 BungeeReflections.FINISH_METHOD.invoke(handler);
60 }
61 } else {
62 BungeeReflections.UNIQUE_ID_FIELD.set(handler, playerData.getUUID());
63 BungeeReflections.LOGIN_PROFILE_FIELD.set(handler, loginResult);
64
65 BungeeReflections.FINISH_METHOD.invoke(handler);
66 }
67 } else {
68 conn.disconnect("No se ha podido comprobar su conexion");
69 BungeeLogin.getPlugin().getLogger().log(Level.SEVERE, "Error authenticating " + conn.getName() + " with minecraft.net", error);
70 }
71
72 } catch (Exception e) {
73 conn.disconnect("Error while authenticating");
74
75 BungeeLogin.getPlugin().getLogger().warning("Error while authenticating user:");
76 e.printStackTrace();
77 }
78 }
79 };
80
81 HttpClient.get(authURL, ch.getHandle().eventLoop(), httpHandler);
82 }
83}