diff --git a/proxy/src/main/java/proxy/Proxy.java b/proxy/src/main/java/proxy/Proxy.java index 781f7f4..ac2ce40 100755 --- a/proxy/src/main/java/proxy/Proxy.java +++ b/proxy/src/main/java/proxy/Proxy.java @@ -375,16 +375,33 @@ public class Proxy { return this.users.get(user.toLowerCase(Locale.US)); } - public void setUser(String user, User password) { - this.users.put(user.toLowerCase(Locale.US), password); + public void setUser(User usr) { + this.users.put(usr.getUsername().toLowerCase(Locale.US), usr); + } + + public void deleteUser(String user) { + user = user.toLowerCase(Locale.US); + this.users.remove(user); + this.players.remove(user); } public void setLoggedIn(String user, ProxyHandler handler) { - this.players.put(user.toLowerCase(Locale.US), handler); + user = user.toLowerCase(Locale.US); + User usr = this.users.remove(user); + if(usr != null) + handler.copyFrom(usr); + this.users.put(user, handler); + this.players.put(user, handler); } public void setLoggedOut(String user) { - this.players.remove(user.toLowerCase(Locale.US)); + user = user.toLowerCase(Locale.US); + ProxyHandler handler = this.players.remove(user); + if(handler != null) { + User usr = new User(handler.getUsername()); + usr.copyFrom(handler); + this.users.put(user, usr); + } } public boolean isLoggedIn(String user) { @@ -404,6 +421,10 @@ public class Proxy { private void registerCommands() { this.register(new CommandHelp()); this.register(new CommandExit()); + this.register(new CommandAdmin()); + this.register(new CommandRevoke()); + this.register(new CommandRegister()); + this.register(new CommandDelete()); } public Map getCommands() { @@ -414,6 +435,26 @@ public class Proxy { return this.players.values(); } + public List getPlayerNames() { + List list = Lists.newArrayList(); + for(ProxyHandler player : this.players.values()) { + list.add(player.getUsername()); + } + return list; + } + + public Collection getUsers() { + return this.users.values(); + } + + public List getUserNames() { + List list = Lists.newArrayList(); + for(User user : this.users.values()) { + list.add(user.getUsername()); + } + return list; + } + public void shutdown() { this.running = false; } @@ -445,7 +486,16 @@ public class Proxy { player.sendMessage(Formatter.DARK_RED + "Internal error trying to execute command"); Log.error(t, "Could not execute '%s'" + (player != null ? " as %s" : ""), line, player != null ? player.getUsername() : null); } - if(player != null) + if(player != null) { + int redacted = cmd.getRedactedLogArg(argv.length); + if(redacted >= 0 && redacted < argv.length) { + StringBuilder sb = new StringBuilder("/vproxy " + cmd.getName()); + for(int z = 0; z < argv.length && z < redacted; z++) { + sb.append(' ').append(argv[z]); + } + line = sb.append(" [ ...]").toString(); + } Log.info("%s executed: %s", player.getUsername(), line); + } } } diff --git a/proxy/src/main/java/proxy/command/Command.java b/proxy/src/main/java/proxy/command/Command.java index e3ed5c7..a6d72ab 100644 --- a/proxy/src/main/java/proxy/command/Command.java +++ b/proxy/src/main/java/proxy/command/Command.java @@ -15,15 +15,26 @@ public abstract class Command { public Iterable complete(Proxy proxy, ProxyHandler player, String[] args) { return null; } + public int getRedactedLogArg(int args) { + return -1; + } protected static void sendMessage(ProxyHandler player, String msg) { if(player != null) - player.sendMessage(Formatter.DARK_PURPLE + msg); + player.sendMessage(msg); else - Log.info(msg); + Log.info(Formatter.strip(msg)); } protected static void sendMessage(ProxyHandler player, String fmt, Object ... args) { sendMessage(player, String.format(fmt, args)); } + + protected static void sendInfo(ProxyHandler player, String msg) { + sendMessage(player, Formatter.LIGHT_PURPLE + msg); + } + + protected static void sendInfo(ProxyHandler player, String fmt, Object ... args) { + sendInfo(player, String.format(fmt, args)); + } } diff --git a/proxy/src/main/java/proxy/command/CommandAdmin.java b/proxy/src/main/java/proxy/command/CommandAdmin.java new file mode 100644 index 0000000..6b1573b --- /dev/null +++ b/proxy/src/main/java/proxy/command/CommandAdmin.java @@ -0,0 +1,49 @@ +package proxy.command; + +import com.google.common.collect.Collections2; + +import proxy.Proxy; +import proxy.network.ProxyHandler; +import proxy.util.Formatter; +import proxy.util.User; + +public class CommandAdmin extends Command { + public String getName() { + return "admin"; + } + + public String getHelp() { + return "Makes a user an admin or lists admins"; + } + + public String getArgs() { + return "[username]"; + } + + public void run(Proxy proxy, ProxyHandler player, String[] args) { + if(args.length == 0) { + int cnt = 0; + for(User user : proxy.getUsers()) { + if(user.isAdmin()) { + sendMessage(player, Formatter.GREEN + user.getUsername()); + cnt++; + } + } + sendMessage(player, (cnt == 0 ? Formatter.GRAY + "No admins" : Formatter.DARK_GREEN + (cnt == 1 ? "1 admin" : "%d admins")) + " on this proxy", cnt); + return; + } + User user = proxy.getUser(args[0]); + if(user == null) + throw new RunException("'%s' is not registered", args[0]); + if(user.isAdmin()) + throw new RunException("%s is already an admin", user.getUsername()); + user.setAdmin(true); + if(user.isOnline()) + ((ProxyHandler)user).sendMessage(Formatter.GOLD + "You were given proxy admin privileges"); + sendInfo(player, "%s is now an admin", user.getUsername()); + } + + public Iterable complete(Proxy proxy, ProxyHandler player, String[] args) { + return args.length == 1 ? Collections2.filter(proxy.getUserNames(), user -> !proxy.getUser(user).isAdmin()) : null; + } +} diff --git a/proxy/src/main/java/proxy/command/CommandDelete.java b/proxy/src/main/java/proxy/command/CommandDelete.java new file mode 100644 index 0000000..16b8829 --- /dev/null +++ b/proxy/src/main/java/proxy/command/CommandDelete.java @@ -0,0 +1,39 @@ +package proxy.command; + +import com.google.common.collect.Collections2; + +import proxy.Proxy; +import proxy.network.ProxyHandler; +import proxy.util.User; + +public class CommandDelete extends Command { + public String getName() { + return "delete"; + } + + public String getHelp() { + return "Deletes a users profile (console only for admins)"; + } + + public String getArgs() { + return ""; + } + + public void run(Proxy proxy, ProxyHandler player, String[] args) { + if(args.length < 1) + throw new RunException("Please provide a username"); + User user = proxy.getUser(args[0]); + if(user == null) + throw new RunException("'%s' is not registered", args[0]); + if(player != null && user.isAdmin()) + throw new RunException("Only the console can delete users with admin status"); + if(user.isOnline()) + ((ProxyHandler)user).disconnect("Your profile was deleted"); + proxy.deleteUser(user.getUsername()); + sendInfo(player, "The profile of %s was deleted", user.getUsername()); + } + + public Iterable complete(Proxy proxy, ProxyHandler player, String[] args) { + return args.length == 1 ? Collections2.filter(proxy.getUserNames(), user -> !proxy.getUser(user).isAdmin()) : null; + } +} diff --git a/proxy/src/main/java/proxy/command/CommandHelp.java b/proxy/src/main/java/proxy/command/CommandHelp.java index b754835..aff130e 100644 --- a/proxy/src/main/java/proxy/command/CommandHelp.java +++ b/proxy/src/main/java/proxy/command/CommandHelp.java @@ -4,6 +4,7 @@ import java.util.Locale; import proxy.Proxy; import proxy.network.ProxyHandler; +import proxy.util.Formatter; public class CommandHelp extends Command { public String getName() { @@ -20,7 +21,8 @@ public class CommandHelp extends Command { private static String formatCommand(Command cmd, boolean prefix) { String args = cmd.getArgs(); - return (prefix ? "/vproxy " : "") + cmd.getName() + (args == null || args.isEmpty() ? "" : " " + args); + return (prefix ? Formatter.DARK_GRAY + "/" + Formatter.DARK_GREEN + "vproxy " : "") + Formatter.AQUA + cmd.getName() + (args == null || args.isEmpty() ? "" : Formatter.GREEN + " " + args) + + Formatter.GRAY + " - " + Formatter.YELLOW + cmd.getHelp(); } public void run(Proxy proxy, ProxyHandler player, String[] args) { diff --git a/proxy/src/main/java/proxy/command/CommandRegister.java b/proxy/src/main/java/proxy/command/CommandRegister.java new file mode 100644 index 0000000..f4c5ed5 --- /dev/null +++ b/proxy/src/main/java/proxy/command/CommandRegister.java @@ -0,0 +1,52 @@ +package proxy.command; + +import proxy.Proxy; +import proxy.network.ProxyHandler; +import proxy.util.Formatter; +import proxy.util.User; + +public class CommandRegister extends Command { + public String getName() { + return "register"; + } + + public String getHelp() { + return "Registers a new user or lists users"; + } + + public String getArgs() { + return " "; + } + + public int getRedactedLogArg(int args) { + return 1; + } + + public void run(Proxy proxy, ProxyHandler player, String[] args) { + if(args.length == 0) { + int cnt = proxy.getUsers().size(); + for(User user : proxy.getUsers()) { + sendMessage(player, (user.isAdmin() ? Formatter.GOLD : Formatter.GREEN) + user.getUsername()); + } + sendMessage(player, (cnt == 0 ? Formatter.GRAY + "No users" : Formatter.DARK_GREEN + (cnt == 1 ? "1 user" : "%d users")) + " on this proxy", cnt); + return; + } + if(args.length < 2) + throw new RunException("Please provide a username and a password"); + if(!Formatter.isValidUser(args[0])) + throw new RunException("'%s' is not a valid username", args[0]); + else if(args[0].length() < 3) + throw new RunException("Username too short, length must be between 3-16 characters"); + else if(args[0].length() > 16) + throw new RunException("Username too long, length must be between 3-16 characters"); + User user = proxy.getUser(args[0]); + if(user != null) + throw new RunException("%s is already registered", user.getUsername()); + if(args[1].isEmpty() || args[1].length() < proxy.getMinimumPasswordLength()) + throw new RunException("Password too short, length must be between %d-32 characters", proxy.getMinimumPasswordLength()); + else if(args[1].length() > 32) + throw new RunException("Password too long, length must be between %d-32 characters", proxy.getMinimumPasswordLength()); + proxy.setUser(User.createUser(args[0], args[1])); + sendInfo(player, "%s was successfully registered", args[0]); + } +} diff --git a/proxy/src/main/java/proxy/command/CommandRevoke.java b/proxy/src/main/java/proxy/command/CommandRevoke.java new file mode 100644 index 0000000..168289c --- /dev/null +++ b/proxy/src/main/java/proxy/command/CommandRevoke.java @@ -0,0 +1,36 @@ +package proxy.command; + +import proxy.Proxy; +import proxy.network.ProxyHandler; +import proxy.util.Formatter; +import proxy.util.User; + +public class CommandRevoke extends Command { + public String getName() { + return "revoke"; + } + + public String getHelp() { + return "Removes a users admin status (console only)"; + } + + public String getArgs() { + return ""; + } + + public void run(Proxy proxy, ProxyHandler player, String[] args) { + if(player != null) + throw new RunException("Only the console can revoke admin status"); + if(args.length < 1) + throw new RunException("Please provide a username"); + User user = proxy.getUser(args[0]); + if(user == null) + throw new RunException("'%s' is not registered", args[0]); + if(!user.isAdmin()) + throw new RunException("%s is not an admin", user.getUsername()); + user.setAdmin(false); + if(user.isOnline()) + ((ProxyHandler)user).sendMessage(Formatter.RED + "Your admin privileges were revoked"); + sendInfo(player, "%s is no longer an admin", user.getUsername()); + } +} diff --git a/proxy/src/main/java/proxy/network/LoginHandler.java b/proxy/src/main/java/proxy/network/LoginHandler.java index c1b22ca..42960ed 100755 --- a/proxy/src/main/java/proxy/network/LoginHandler.java +++ b/proxy/src/main/java/proxy/network/LoginHandler.java @@ -8,6 +8,7 @@ import proxy.packet.L01PacketEncryptionResponse; import proxy.packet.R00PacketDisconnect; import proxy.packet.R02PacketLoginSuccess; import proxy.packet.R03PacketEnableCompression; +import proxy.util.Formatter; import proxy.util.Log; public class LoginHandler implements Handler { @@ -22,15 +23,6 @@ public class LoginHandler implements Handler { private int timer; private String username; - private static boolean isValidUser(String name) { - for(int z = 0; z < name.length(); z++) { - char ch = name.charAt(z); - if((ch < '0' || ch > '9') && (ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z') && ch != '_') - return false; - } - return true; - } - public LoginHandler(Proxy proxy, Connection connection) { this.proxy = proxy; this.connection = connection; @@ -91,7 +83,7 @@ public class LoginHandler implements Handler { if(this.state != LoginState.INIT) throw new IllegalStateException("Unexpected hello packet"); this.username = packet.getProfile(); - if(this.username.length() < 3 || this.username.length() > 16 || !isValidUser(this.username)) { + if(this.username.length() < 3 || this.username.length() > 16 || !Formatter.isValidUser(this.username)) { this.disconnect("Invalid username"); return; } diff --git a/proxy/src/main/java/proxy/network/ProxyHandler.java b/proxy/src/main/java/proxy/network/ProxyHandler.java index cf164ba..64215cb 100755 --- a/proxy/src/main/java/proxy/network/ProxyHandler.java +++ b/proxy/src/main/java/proxy/network/ProxyHandler.java @@ -22,7 +22,7 @@ import proxy.util.User; import proxy.util.Stack; import proxy.util.Log; -public class ProxyHandler implements Handler { +public class ProxyHandler extends User implements Handler { public class ProxyLoginHandler implements Handler { public void handleEncryptionRequest(R01PacketEncryptionRequest packetIn) { ProxyHandler.this.server.closeChannel("Online mode auth request received"); @@ -59,7 +59,6 @@ public class ProxyHandler implements Handler { private final Proxy proxy; private final Connection client; - private final String username; private Connection server; @@ -73,7 +72,6 @@ public class ProxyHandler implements Handler { private boolean wasClosed; private volatile int signPreloaded; private String completion; - private boolean admin; private static boolean isAllowedChar(char ch) { return ch != 167 && ch >= 32 && ch != 127; @@ -99,9 +97,9 @@ public class ProxyHandler implements Handler { } public ProxyHandler(Proxy proxy, Connection client, String username) { + super(username); this.proxy = proxy; this.client = client; - this.username = username; } public String getUsername() { @@ -172,6 +170,10 @@ public class ProxyHandler implements Handler { } }); } + + public boolean isOnline() { + return true; + } private void connectToServer() { this.proxy.setLoggedIn(this.username, this); @@ -275,9 +277,8 @@ public class ProxyHandler implements Handler { Formatter.DARK_RED + "" + this.proxy.getMinimumPasswordLength() + "-32 characters"); } else { - this.proxy.setUser(this.username, User.createUser(this.username, password)); + this.proxy.setUser(User.createUser(this.username, password)); Log.info("%s registered with password", this.username); - this.admin = true; //false; this.connectToServer(); } } @@ -289,13 +290,16 @@ public class ProxyHandler implements Handler { this.setSign(Formatter.DARK_RED + "" + Formatter.UNDERLINE + "Wrong password", Formatter.DARK_RED + "Please try again"); Log.info("%s failed password attempt %d/%d", this.username, this.passwordAttempts, this.proxy.getMaximumPasswordAttempts()); } - else if(this.proxy.isCheckingCase() && !stored.getName().equals(this.username)) { - this.disconnect("You used the wrong username casing, please use '" + stored.getName() + "' exactly"); + else if(this.proxy.isCheckingCase() && !stored.getUsername().equals(this.username)) { + this.disconnect("You used the wrong username casing, please use '" + stored.getUsername() + "' exactly"); Log.info("%s tried to use a different username casing", this.username); } + else if(this.proxy.getPlayer(this.username) != null) { + this.disconnect("You are already logged in"); + Log.info("%s was already logged in from another client", this.username); + } else { Log.info("%s logged in with password", this.username); - this.admin = true; //stored.isAdmin(); this.connectToServer(); } } @@ -387,6 +391,7 @@ public class ProxyHandler implements Handler { for(ProxyHandler player : this.proxy.getPlayers()) { player.sendToClient(new S02PacketChat(msg, (byte)1)); } + Log.info(Formatter.strip(msg)); } } } @@ -849,7 +854,7 @@ public class ProxyHandler implements Handler { } public void handleCombatEvent(S42PacketCombatEvent packetIn) { - this.sendToClient(packetIn); +// this.sendToClient(packetIn); } public void handleServerDifficulty(S41PacketServerDifficulty packetIn) { diff --git a/proxy/src/main/java/proxy/packet/C02PacketUseEntity.java b/proxy/src/main/java/proxy/packet/C02PacketUseEntity.java index 8a36b8d..de2e04e 100755 --- a/proxy/src/main/java/proxy/packet/C02PacketUseEntity.java +++ b/proxy/src/main/java/proxy/packet/C02PacketUseEntity.java @@ -6,9 +6,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class C02PacketUseEntity implements Packet +public class C02PacketUseEntity extends EntityIdPacketServer implements Packet { - private int entityId; private C02PacketUseEntity.Action action; private float hitX; private float hitY; diff --git a/proxy/src/main/java/proxy/packet/C0BPacketEntityAction.java b/proxy/src/main/java/proxy/packet/C0BPacketEntityAction.java index 36df267..a72e554 100755 --- a/proxy/src/main/java/proxy/packet/C0BPacketEntityAction.java +++ b/proxy/src/main/java/proxy/packet/C0BPacketEntityAction.java @@ -6,9 +6,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class C0BPacketEntityAction implements Packet +public class C0BPacketEntityAction extends EntityIdPacketServer implements Packet { - private int entityID; private C0BPacketEntityAction.Action action; private int auxData; @@ -17,7 +16,7 @@ public class C0BPacketEntityAction implements Packet */ public void readPacketData(PacketBuffer buf) throws IOException { - this.entityID = buf.readVarIntFromBuffer(); + this.entityId = buf.readVarIntFromBuffer(); this.action = (C0BPacketEntityAction.Action)buf.readEnumValue(C0BPacketEntityAction.Action.class); this.auxData = buf.readVarIntFromBuffer(); } @@ -27,7 +26,7 @@ public class C0BPacketEntityAction implements Packet */ public void writePacketData(PacketBuffer buf) throws IOException { - buf.writeVarIntToBuffer(this.entityID); + buf.writeVarIntToBuffer(this.entityId); buf.writeEnumValue(this.action); buf.writeVarIntToBuffer(this.auxData); } diff --git a/proxy/src/main/java/proxy/packet/EntityIdPacketClient.java b/proxy/src/main/java/proxy/packet/EntityIdPacketClient.java new file mode 100644 index 0000000..ed4a2f2 --- /dev/null +++ b/proxy/src/main/java/proxy/packet/EntityIdPacketClient.java @@ -0,0 +1,10 @@ +package proxy.packet; + +public class EntityIdPacketClient { + protected int entityId; + + public void replaceEntityId(int real, int spoofed) { + if(this.entityId == real) + this.entityId = spoofed; + } +} diff --git a/proxy/src/main/java/proxy/packet/EntityIdPacketServer.java b/proxy/src/main/java/proxy/packet/EntityIdPacketServer.java new file mode 100644 index 0000000..0502a22 --- /dev/null +++ b/proxy/src/main/java/proxy/packet/EntityIdPacketServer.java @@ -0,0 +1,10 @@ +package proxy.packet; + +public class EntityIdPacketServer { + protected int entityId; + + public void replaceEntityId(int real, int spoofed) { + if(this.entityId == spoofed) + this.entityId = real; + } +} diff --git a/proxy/src/main/java/proxy/packet/S01PacketJoinGame.java b/proxy/src/main/java/proxy/packet/S01PacketJoinGame.java index cbb34ac..f59580e 100755 --- a/proxy/src/main/java/proxy/packet/S01PacketJoinGame.java +++ b/proxy/src/main/java/proxy/packet/S01PacketJoinGame.java @@ -6,9 +6,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S01PacketJoinGame implements Packet +public class S01PacketJoinGame extends EntityIdPacketClient implements Packet { - private int entityId; private boolean hardcoreMode; private byte gameType; private int dimension; diff --git a/proxy/src/main/java/proxy/packet/S04PacketEntityEquipment.java b/proxy/src/main/java/proxy/packet/S04PacketEntityEquipment.java index 36161f5..b7b4f18 100755 --- a/proxy/src/main/java/proxy/packet/S04PacketEntityEquipment.java +++ b/proxy/src/main/java/proxy/packet/S04PacketEntityEquipment.java @@ -7,9 +7,8 @@ import proxy.network.Packet; import proxy.network.PacketBuffer; import proxy.util.Stack; -public class S04PacketEntityEquipment implements Packet +public class S04PacketEntityEquipment extends EntityIdPacketClient implements Packet { - private int entityID; private int equipmentSlot; private Stack itemStack; @@ -18,7 +17,7 @@ public class S04PacketEntityEquipment implements Packet */ public void readPacketData(PacketBuffer buf) throws IOException { - this.entityID = buf.readVarIntFromBuffer(); + this.entityId = buf.readVarIntFromBuffer(); this.equipmentSlot = buf.readShort(); this.itemStack = buf.readStack(); } @@ -28,7 +27,7 @@ public class S04PacketEntityEquipment implements Packet */ public void writePacketData(PacketBuffer buf) throws IOException { - buf.writeVarIntToBuffer(this.entityID); + buf.writeVarIntToBuffer(this.entityId); buf.writeShort(this.equipmentSlot); buf.writeStack(this.itemStack); } diff --git a/proxy/src/main/java/proxy/packet/S0APacketUseBed.java b/proxy/src/main/java/proxy/packet/S0APacketUseBed.java index 46a6150..df3eae0 100755 --- a/proxy/src/main/java/proxy/packet/S0APacketUseBed.java +++ b/proxy/src/main/java/proxy/packet/S0APacketUseBed.java @@ -7,9 +7,8 @@ import proxy.network.Packet; import proxy.network.PacketBuffer; import proxy.util.Vec3; -public class S0APacketUseBed implements Packet +public class S0APacketUseBed extends EntityIdPacketClient implements Packet { - private int playerID; private Vec3 bedPos; /** @@ -17,7 +16,7 @@ public class S0APacketUseBed implements Packet */ public void readPacketData(PacketBuffer buf) throws IOException { - this.playerID = buf.readVarIntFromBuffer(); + this.entityId = buf.readVarIntFromBuffer(); this.bedPos = buf.readVector(); } @@ -26,7 +25,7 @@ public class S0APacketUseBed implements Packet */ public void writePacketData(PacketBuffer buf) throws IOException { - buf.writeVarIntToBuffer(this.playerID); + buf.writeVarIntToBuffer(this.entityId); buf.writeVector(this.bedPos); } diff --git a/proxy/src/main/java/proxy/packet/S0BPacketAnimation.java b/proxy/src/main/java/proxy/packet/S0BPacketAnimation.java index d21c438..e42ff04 100755 --- a/proxy/src/main/java/proxy/packet/S0BPacketAnimation.java +++ b/proxy/src/main/java/proxy/packet/S0BPacketAnimation.java @@ -6,9 +6,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S0BPacketAnimation implements Packet +public class S0BPacketAnimation extends EntityIdPacketClient implements Packet { - private int entityId; private int type; /** diff --git a/proxy/src/main/java/proxy/packet/S0CPacketSpawnPlayer.java b/proxy/src/main/java/proxy/packet/S0CPacketSpawnPlayer.java index 67ea79f..a2c1bf6 100755 --- a/proxy/src/main/java/proxy/packet/S0CPacketSpawnPlayer.java +++ b/proxy/src/main/java/proxy/packet/S0CPacketSpawnPlayer.java @@ -9,9 +9,8 @@ import proxy.network.Packet; import proxy.network.PacketBuffer; import proxy.util.EntityData; -public class S0CPacketSpawnPlayer implements Packet +public class S0CPacketSpawnPlayer extends EntityIdPacketClient implements Packet { - private int entityId; private UUID playerId; private int x; private int y; diff --git a/proxy/src/main/java/proxy/packet/S0DPacketCollectItem.java b/proxy/src/main/java/proxy/packet/S0DPacketCollectItem.java index 8a73df4..aa6e23b 100755 --- a/proxy/src/main/java/proxy/packet/S0DPacketCollectItem.java +++ b/proxy/src/main/java/proxy/packet/S0DPacketCollectItem.java @@ -6,10 +6,9 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S0DPacketCollectItem implements Packet +public class S0DPacketCollectItem extends EntityIdPacketClient implements Packet { private int collectedItemEntityId; - private int entityId; /** * Reads the raw packet data from the data stream. diff --git a/proxy/src/main/java/proxy/packet/S12PacketEntityVelocity.java b/proxy/src/main/java/proxy/packet/S12PacketEntityVelocity.java index a34bf5a..42848bf 100755 --- a/proxy/src/main/java/proxy/packet/S12PacketEntityVelocity.java +++ b/proxy/src/main/java/proxy/packet/S12PacketEntityVelocity.java @@ -6,9 +6,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S12PacketEntityVelocity implements Packet +public class S12PacketEntityVelocity extends EntityIdPacketClient implements Packet { - private int entityID; private int motionX; private int motionY; private int motionZ; @@ -18,7 +17,7 @@ public class S12PacketEntityVelocity implements Packet */ public void readPacketData(PacketBuffer buf) throws IOException { - this.entityID = buf.readVarIntFromBuffer(); + this.entityId = buf.readVarIntFromBuffer(); this.motionX = buf.readShort(); this.motionY = buf.readShort(); this.motionZ = buf.readShort(); @@ -29,7 +28,7 @@ public class S12PacketEntityVelocity implements Packet */ public void writePacketData(PacketBuffer buf) throws IOException { - buf.writeVarIntToBuffer(this.entityID); + buf.writeVarIntToBuffer(this.entityId); buf.writeShort(this.motionX); buf.writeShort(this.motionY); buf.writeShort(this.motionZ); diff --git a/proxy/src/main/java/proxy/packet/S13PacketDestroyEntities.java b/proxy/src/main/java/proxy/packet/S13PacketDestroyEntities.java index 395938c..5ada6e8 100755 --- a/proxy/src/main/java/proxy/packet/S13PacketDestroyEntities.java +++ b/proxy/src/main/java/proxy/packet/S13PacketDestroyEntities.java @@ -8,18 +8,25 @@ import proxy.network.PacketBuffer; public class S13PacketDestroyEntities implements Packet { - private int[] entityIDs; + private int[] entityIds; + + public void replaceEntityIds(int real, int spoofed) { + for(int z = 0; z < this.entityIds.length; z++) { + if(this.entityIds[z] == real) + this.entityIds[z] = spoofed; + } + } /** * Reads the raw packet data from the data stream. */ public void readPacketData(PacketBuffer buf) throws IOException { - this.entityIDs = new int[buf.readVarIntFromBuffer()]; + this.entityIds = new int[buf.readVarIntFromBuffer()]; - for (int i = 0; i < this.entityIDs.length; ++i) + for (int i = 0; i < this.entityIds.length; ++i) { - this.entityIDs[i] = buf.readVarIntFromBuffer(); + this.entityIds[i] = buf.readVarIntFromBuffer(); } } @@ -28,11 +35,11 @@ public class S13PacketDestroyEntities implements Packet */ public void writePacketData(PacketBuffer buf) throws IOException { - buf.writeVarIntToBuffer(this.entityIDs.length); + buf.writeVarIntToBuffer(this.entityIds.length); - for (int i = 0; i < this.entityIDs.length; ++i) + for (int i = 0; i < this.entityIds.length; ++i) { - buf.writeVarIntToBuffer(this.entityIDs[i]); + buf.writeVarIntToBuffer(this.entityIds[i]); } } diff --git a/proxy/src/main/java/proxy/packet/S14PacketEntity.java b/proxy/src/main/java/proxy/packet/S14PacketEntity.java index 313da24..b61f899 100755 --- a/proxy/src/main/java/proxy/packet/S14PacketEntity.java +++ b/proxy/src/main/java/proxy/packet/S14PacketEntity.java @@ -6,9 +6,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S14PacketEntity implements Packet +public class S14PacketEntity extends EntityIdPacketClient implements Packet { - protected int entityId; protected byte posX; protected byte posY; protected byte posZ; diff --git a/proxy/src/main/java/proxy/packet/S18PacketEntityTeleport.java b/proxy/src/main/java/proxy/packet/S18PacketEntityTeleport.java index b2d1118..3c62b0d 100755 --- a/proxy/src/main/java/proxy/packet/S18PacketEntityTeleport.java +++ b/proxy/src/main/java/proxy/packet/S18PacketEntityTeleport.java @@ -6,9 +6,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S18PacketEntityTeleport implements Packet +public class S18PacketEntityTeleport extends EntityIdPacketClient implements Packet { - private int entityId; private int posX; private int posY; private int posZ; diff --git a/proxy/src/main/java/proxy/packet/S19PacketEntityHeadLook.java b/proxy/src/main/java/proxy/packet/S19PacketEntityHeadLook.java index 34ee13b..16a3ffc 100755 --- a/proxy/src/main/java/proxy/packet/S19PacketEntityHeadLook.java +++ b/proxy/src/main/java/proxy/packet/S19PacketEntityHeadLook.java @@ -6,9 +6,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S19PacketEntityHeadLook implements Packet +public class S19PacketEntityHeadLook extends EntityIdPacketClient implements Packet { - private int entityId; private byte yaw; /** diff --git a/proxy/src/main/java/proxy/packet/S19PacketEntityStatus.java b/proxy/src/main/java/proxy/packet/S19PacketEntityStatus.java index 90750ca..feb1918 100755 --- a/proxy/src/main/java/proxy/packet/S19PacketEntityStatus.java +++ b/proxy/src/main/java/proxy/packet/S19PacketEntityStatus.java @@ -6,9 +6,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S19PacketEntityStatus implements Packet +public class S19PacketEntityStatus extends EntityIdPacketClient implements Packet { - private int entityId; private byte logicOpcode; /** diff --git a/proxy/src/main/java/proxy/packet/S1BPacketEntityAttach.java b/proxy/src/main/java/proxy/packet/S1BPacketEntityAttach.java index fd6c355..72ab48f 100755 --- a/proxy/src/main/java/proxy/packet/S1BPacketEntityAttach.java +++ b/proxy/src/main/java/proxy/packet/S1BPacketEntityAttach.java @@ -6,12 +6,17 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S1BPacketEntityAttach implements Packet +public class S1BPacketEntityAttach extends EntityIdPacketClient implements Packet { private int leash; - private int entityId; private int vehicleEntityId; + public void replaceEntityId(int real, int spoofed) { + super.replaceEntityId(real, spoofed); + if(this.vehicleEntityId == real) + this.vehicleEntityId = spoofed; + } + /** * Reads the raw packet data from the data stream. */ diff --git a/proxy/src/main/java/proxy/packet/S1CPacketEntityMetadata.java b/proxy/src/main/java/proxy/packet/S1CPacketEntityMetadata.java index 86ebc88..17292c1 100755 --- a/proxy/src/main/java/proxy/packet/S1CPacketEntityMetadata.java +++ b/proxy/src/main/java/proxy/packet/S1CPacketEntityMetadata.java @@ -8,9 +8,8 @@ import proxy.network.Packet; import proxy.network.PacketBuffer; import proxy.util.EntityData; -public class S1CPacketEntityMetadata implements Packet +public class S1CPacketEntityMetadata extends EntityIdPacketClient implements Packet { - private int entityId; private List field_149378_b; /** diff --git a/proxy/src/main/java/proxy/packet/S1DPacketEntityEffect.java b/proxy/src/main/java/proxy/packet/S1DPacketEntityEffect.java index 2a42d4f..3c5b648 100755 --- a/proxy/src/main/java/proxy/packet/S1DPacketEntityEffect.java +++ b/proxy/src/main/java/proxy/packet/S1DPacketEntityEffect.java @@ -6,9 +6,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S1DPacketEntityEffect implements Packet +public class S1DPacketEntityEffect extends EntityIdPacketClient implements Packet { - private int entityId; private byte effectId; private byte amplifier; private int duration; diff --git a/proxy/src/main/java/proxy/packet/S1EPacketRemoveEntityEffect.java b/proxy/src/main/java/proxy/packet/S1EPacketRemoveEntityEffect.java index de651dd..e9f5d56 100755 --- a/proxy/src/main/java/proxy/packet/S1EPacketRemoveEntityEffect.java +++ b/proxy/src/main/java/proxy/packet/S1EPacketRemoveEntityEffect.java @@ -6,9 +6,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S1EPacketRemoveEntityEffect implements Packet +public class S1EPacketRemoveEntityEffect extends EntityIdPacketClient implements Packet { - private int entityId; private int effectId; /** diff --git a/proxy/src/main/java/proxy/packet/S20PacketEntityProperties.java b/proxy/src/main/java/proxy/packet/S20PacketEntityProperties.java index eb578be..0581bab 100755 --- a/proxy/src/main/java/proxy/packet/S20PacketEntityProperties.java +++ b/proxy/src/main/java/proxy/packet/S20PacketEntityProperties.java @@ -11,9 +11,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S20PacketEntityProperties implements Packet +public class S20PacketEntityProperties extends EntityIdPacketClient implements Packet { - private int entityId; private final List field_149444_b = Lists.newArrayList(); /** diff --git a/proxy/src/main/java/proxy/packet/S25PacketBlockBreakAnim.java b/proxy/src/main/java/proxy/packet/S25PacketBlockBreakAnim.java index 154321b..76307e3 100755 --- a/proxy/src/main/java/proxy/packet/S25PacketBlockBreakAnim.java +++ b/proxy/src/main/java/proxy/packet/S25PacketBlockBreakAnim.java @@ -7,9 +7,8 @@ import proxy.network.Packet; import proxy.network.PacketBuffer; import proxy.util.Vec3; -public class S25PacketBlockBreakAnim implements Packet +public class S25PacketBlockBreakAnim extends EntityIdPacketClient implements Packet { - private int breakerId; private Vec3 position; private int progress; @@ -18,7 +17,7 @@ public class S25PacketBlockBreakAnim implements Packet */ public void readPacketData(PacketBuffer buf) throws IOException { - this.breakerId = buf.readVarIntFromBuffer(); + this.entityId = buf.readVarIntFromBuffer(); this.position = buf.readVector(); this.progress = buf.readUnsignedByte(); } @@ -28,7 +27,7 @@ public class S25PacketBlockBreakAnim implements Packet */ public void writePacketData(PacketBuffer buf) throws IOException { - buf.writeVarIntToBuffer(this.breakerId); + buf.writeVarIntToBuffer(this.entityId); buf.writeVector(this.position); buf.writeByte(this.progress); } diff --git a/proxy/src/main/java/proxy/packet/S43PacketCamera.java b/proxy/src/main/java/proxy/packet/S43PacketCamera.java index 782d276..9eae330 100755 --- a/proxy/src/main/java/proxy/packet/S43PacketCamera.java +++ b/proxy/src/main/java/proxy/packet/S43PacketCamera.java @@ -6,10 +6,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S43PacketCamera implements Packet +public class S43PacketCamera extends EntityIdPacketClient implements Packet { - private int entityId; - /** * Reads the raw packet data from the data stream. */ diff --git a/proxy/src/main/java/proxy/packet/S49PacketUpdateEntityNBT.java b/proxy/src/main/java/proxy/packet/S49PacketUpdateEntityNBT.java index ed4eefc..703f312 100755 --- a/proxy/src/main/java/proxy/packet/S49PacketUpdateEntityNBT.java +++ b/proxy/src/main/java/proxy/packet/S49PacketUpdateEntityNBT.java @@ -7,9 +7,8 @@ import proxy.network.ProxyHandler; import proxy.network.Packet; import proxy.network.PacketBuffer; -public class S49PacketUpdateEntityNBT implements Packet +public class S49PacketUpdateEntityNBT extends EntityIdPacketClient implements Packet { - private int entityId; private NbtCompound tagCompound; /** diff --git a/proxy/src/main/java/proxy/util/Formatter.java b/proxy/src/main/java/proxy/util/Formatter.java index 8714f72..7219cea 100755 --- a/proxy/src/main/java/proxy/util/Formatter.java +++ b/proxy/src/main/java/proxy/util/Formatter.java @@ -90,6 +90,15 @@ public enum Formatter { return sb.toString(); } + public static boolean isValidUser(String name) { + for(int z = 0; z < name.length(); z++) { + char ch = name.charAt(z); + if((ch < '0' || ch > '9') && (ch < 'a' || ch > 'z') && (ch < 'A' || ch > 'Z') && ch != '_') + return false; + } + return true; + } + private Formatter(char code) { this.value = "\u00a7" + code; } diff --git a/proxy/src/main/java/proxy/util/User.java b/proxy/src/main/java/proxy/util/User.java index dd6fd03..2a82b26 100644 --- a/proxy/src/main/java/proxy/util/User.java +++ b/proxy/src/main/java/proxy/util/User.java @@ -8,19 +8,22 @@ import java.security.SecureRandom; public class User { private static final Charset UTF_8 = Charset.forName("UTF-8"); - private final String username; - private final byte[] hash; - private final byte[] salt; + protected final String username; - private boolean admin; + private byte[] hash; + private byte[] salt; + protected boolean admin; - public User(String username, byte[] hash, byte[] salt) { + public User(String username) { this.username = username; + } + + public void setPassword(byte[] hash, byte[] salt) { this.hash = hash; this.salt = salt; } - public String getName() { + public String getUsername() { return this.username; } @@ -36,6 +39,16 @@ public class User { this.admin = admin; } + public boolean isOnline() { + return false; + } + + public void copyFrom(User user) { + this.hash = user.hash; + this.salt = user.salt; + this.admin = user.admin; + } + private static byte[] hashPassword(String pass, byte[] salt) { try { MessageDigest digest = MessageDigest.getInstance("SHA-512"); @@ -53,6 +66,8 @@ public class User { SecureRandom rand = new SecureRandom(); byte[] salt = new byte[32]; rand.nextBytes(salt); - return new User(user, hashPassword(pass, salt), salt); + User usr = new User(user); + usr.setPassword(hashPassword(pass, salt), salt); + return usr; } }