Fixed json parsing for logins

This commit is contained in:
games647
2015-10-06 19:22:37 +02:00
parent 8abe9562e0
commit 253181d34e
9 changed files with 30 additions and 26 deletions

View File

@ -24,7 +24,8 @@ import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
/**
* Encryption and decryption minecraft util for connection between servers and paid minecraft account clients
* Encryption and decryption minecraft util for connection between servers
* and paid minecraft account clients.
*
* Source: https://github.com/bergerkiller/CraftSource/blob/master/net.minecraft.server/MinecraftEncryption.java
*

View File

@ -76,7 +76,7 @@ public class FastLogin extends JavaPlugin {
protocolManager.addPacketListener(new StartPacketListener(this, protocolManager));
//register commands using a unique name
getCommand(getName()).setExecutor(new PremiumCommand(this));
getCommand("premium").setExecutor(new PremiumCommand(this));
}
@Override
@ -145,6 +145,7 @@ public class FastLogin extends JavaPlugin {
Class<?> clazz = clazzInfo.load();
//uses only member classes which uses AuthPlugin interface (skip interfaces)
if (AuthPlugin.class.isAssignableFrom(clazz)
//check only for enabled plugins. A single plugin could be disabled by plugin managers
&& getServer().getPluginManager().isPluginEnabled(pluginName)) {
authPluginHook = (AuthPlugin) clazz.newInstance();
getLogger().log(Level.INFO, "Hooking into auth plugin: {0}", pluginName);

View File

@ -1,7 +1,6 @@
package com.github.games647.fastlogin.hooks;
import fr.xephi.authme.api.NewAPI;
import fr.xephi.authme.cache.limbo.LimboCache;
import org.bukkit.entity.Player;
@ -13,12 +12,6 @@ public class AuthMeHook implements AuthPlugin {
@Override
public void forceLogin(Player player) {
//here is the gamemode, inventory ... saved
if (!LimboCache.getInstance().hasLimboPlayer(player.getName().toLowerCase())) {
//add cache entry - otherwise logging in wouldn't work
LimboCache.getInstance().addLimboPlayer(player);
}
//skips registration and login
NewAPI.getInstance().forceLogin(player);
}

View File

@ -21,6 +21,7 @@ public class CrazyLoginHook implements AuthPlugin {
if (playerData == null) {
//create a fake account - this will be saved to the database with the password=FAILEDLOADING
//user cannot login with that password unless the admin uses plain text
//this automatically marks the player as logged in
playerData = new LoginPlayerData(player);
crazyDatabase.save(playerData);
} else {

View File

@ -24,7 +24,7 @@ public class LoginSecurityHook implements AuthPlugin {
securityPlugin.authList.remove(name);
//cancel timeout timer
securityPlugin.thread.timeout.remove(name);
//remove effects
//remove effects and restore location
securityPlugin.rehabPlayer(player, name);
}
}

View File

@ -19,18 +19,20 @@ public class xAuthHook implements AuthPlugin {
xAuth xAuthPlugin = xAuth.getPlugin();
xAuthPlayer xAuthPlayer = xAuthPlugin.getPlayerManager().getPlayer(player);
//we checked that the player is premium (paid account)
xAuthPlayer.setPremium(true);
//mark the player online
xAuthPlugin.getAuthClass(xAuthPlayer).online(xAuthPlayer.getName());
if (xAuthPlayer != null) {
//we checked that the player is premium (paid account)
xAuthPlayer.setPremium(true);
//mark the player online
xAuthPlugin.getAuthClass(xAuthPlayer).online(xAuthPlayer.getName());
//update last login time
xAuthPlayer.setLoginTime(new Timestamp(System.currentTimeMillis()));
//update last login time
xAuthPlayer.setLoginTime(new Timestamp(System.currentTimeMillis()));
//mark the player as logged in
xAuthPlayer.setStatus(Status.AUTHENTICATED);
//mark the player as logged in
xAuthPlayer.setStatus(Status.AUTHENTICATED);
//restore inventory
xAuthPlugin.getPlayerManager().unprotect(xAuthPlayer);
//restore inventory
xAuthPlugin.getPlayerManager().unprotect(xAuthPlayer);
}
}
}

View File

@ -28,6 +28,7 @@ import java.util.logging.Level;
import javax.crypto.SecretKey;
import org.bukkit.entity.Player;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;
@ -198,9 +199,10 @@ public class EncryptionPacketListener extends PacketAdapter {
String uuid = (String) userData.get("id");
String name = (String) userData.get("name");
JSONObject properties = (JSONObject) userData.get("properties");
JSONArray properties = (JSONArray) userData.get("properties");
JSONObject skinData = (JSONObject) properties.get(0);
//base64 encoded skin data
String encodedSkin = (String) properties.get("value");
String encodedSkin = (String) skinData.get("value");
return true;
}
@ -218,6 +220,7 @@ public class EncryptionPacketListener extends PacketAdapter {
//see StartPacketListener for packet information
PacketContainer startPacket = protocolManager.createPacket(PacketType.Login.Client.START, true);
//uuid is ignored
WrappedGameProfile fakeProfile = new WrappedGameProfile(UUID.randomUUID(), username);
startPacket.getGameProfiles().write(0, fakeProfile);
try {

View File

@ -18,6 +18,8 @@ import org.bukkit.event.player.PlayerJoinEvent;
* plugin can skip authentication.
*/
public class PlayerListener implements Listener {
private static final long DELAY_LOGIN = 1 * 20L;
private final FastLogin plugin;
private final AuthPlugin authPlugin;
@ -46,7 +48,7 @@ public class PlayerListener implements Listener {
}
}
//Wait before auth plugin initializes the player
}, 2 * 20L);
}, DELAY_LOGIN);
}
}
}

View File

@ -36,12 +36,13 @@ public class StartPacketListener extends PacketAdapter {
private static final String UUID_LINK = "https://api.mojang.com/users/profiles/minecraft/";
//this includes a-zA-Z1-9_
private static final String VALID_PLAYERNAME = "^\\w{2,16}$";
private static final int VERIFY_TOKEN_LENGTH = 4;
private final ProtocolManager protocolManager;
//hides the inherit Plugin plugin field, but we need a more detailed type than just Plugin
private final FastLogin plugin;
//just create a new once on plugin enable
//just create a new once on plugin enable. This used for verify token generation
private final Random random = new Random();
//compile the pattern on plugin enable
private final Pattern playernameMatcher = Pattern.compile(VALID_PLAYERNAME);
@ -121,15 +122,15 @@ public class StartPacketListener extends PacketAdapter {
newPacket.getSpecificModifier(PublicKey.class).write(0, plugin.getKeyPair().getPublic());
//generate a random token which should be the same when we receive it from the client
byte[] verifyToken = new byte[4];
byte[] verifyToken = new byte[VERIFY_TOKEN_LENGTH];
random.nextBytes(verifyToken);
newPacket.getByteArrays().write(0, verifyToken);
protocolManager.sendServerPacket(player, newPacket);
//cancel only if the player has a paid account otherwise login as normal offline player
packetEvent.setCancelled(true);
plugin.getSessions().put(sessionKey, new PlayerSession(verifyToken, username));
packetEvent.setCancelled(true);
} catch (InvocationTargetException ex) {
plugin.getLogger().log(Level.SEVERE, "Cannot send encryption packet. Falling back to normal login", ex);
}