From 69bd4a8f6f2292dba1018c5df87eff6ba51e03a7 Mon Sep 17 00:00:00 2001 From: LOOHP Date: Fri, 16 Dec 2022 13:43:13 +0000 Subject: [PATCH] Fixed receiving signed chat --- pom.xml | 2 +- .../protocol/packets/PacketPlayInChat.java | 2 +- .../loohp/limbo/utils/ArgumentSignatures.java | 33 ++---- .../loohp/limbo/utils/LastSeenMessages.java | 108 +++++------------- .../loohp/limbo/utils/MessageSignature.java | 74 ++++++++---- 5 files changed, 92 insertions(+), 127 deletions(-) diff --git a/pom.xml b/pom.xml index b606ca3..7205fc8 100644 --- a/pom.xml +++ b/pom.xml @@ -24,7 +24,7 @@ com.loohp Limbo Limbo - 0.7.0-ALPHA + 0.7.1-ALPHA Standalone Limbo Minecraft Server. https://github.com/LOOHP/Limbo diff --git a/src/main/java/com/loohp/limbo/network/protocol/packets/PacketPlayInChat.java b/src/main/java/com/loohp/limbo/network/protocol/packets/PacketPlayInChat.java index a7b3988..9382f10 100644 --- a/src/main/java/com/loohp/limbo/network/protocol/packets/PacketPlayInChat.java +++ b/src/main/java/com/loohp/limbo/network/protocol/packets/PacketPlayInChat.java @@ -45,7 +45,7 @@ public class PacketPlayInChat extends PacketIn { } public PacketPlayInChat(DataInputStream in) throws IOException { - this(DataTypeIO.readString(in, StandardCharsets.UTF_8), Instant.ofEpochMilli(in.readLong()), in.readLong(), in.readBoolean() ? new MessageSignature(in) : null, new LastSeenMessages.b(in)); + this(DataTypeIO.readString(in, StandardCharsets.UTF_8), Instant.ofEpochMilli(in.readLong()), in.readLong(), in.readBoolean() ? MessageSignature.read(in) : null, new LastSeenMessages.b(in)); } public String getMessage() { diff --git a/src/main/java/com/loohp/limbo/utils/ArgumentSignatures.java b/src/main/java/com/loohp/limbo/utils/ArgumentSignatures.java index 0d1121a..c500265 100644 --- a/src/main/java/com/loohp/limbo/utils/ArgumentSignatures.java +++ b/src/main/java/com/loohp/limbo/utils/ArgumentSignatures.java @@ -48,18 +48,14 @@ public class ArgumentSignatures { } } - public List getEntries() { - return entries; - } - public MessageSignature get(String s) { - Iterator iterator = this.entries.iterator(); + Iterator iterator = this.entries.iterator(); ArgumentSignatures.a argumentsignatures_a; do { if (!iterator.hasNext()) { - return MessageSignature.EMPTY; + return null; } argumentsignatures_a = iterator.next(); @@ -69,44 +65,37 @@ public class ArgumentSignatures { } public void write(DataOutputStream out) throws IOException { - DataTypeIO.writeVarInt(out, entries.size()); - for (ArgumentSignatures.a argumentsignatures_a : entries) { + DataTypeIO.writeVarInt(out, this.entries.size()); + for (a argumentsignatures_a : this.entries) { argumentsignatures_a.write(out); } } public static class a { - private String name; - private MessageSignature signature; + private final String name; + private final MessageSignature signature; public a(String name, MessageSignature signature) { this.name = name; this.signature = signature; } - public String getName() { - return name; - } - - public MessageSignature getSignature() { - return signature; - } - public a(DataInputStream in) throws IOException { - this(DataTypeIO.readString(in, StandardCharsets.UTF_8), new MessageSignature(in)); + this(DataTypeIO.readString(in, StandardCharsets.UTF_8), MessageSignature.read(in)); } public void write(DataOutputStream out) throws IOException { - DataTypeIO.writeString(out, name, StandardCharsets.UTF_8); - this.signature.write(out); + DataTypeIO.writeString(out, this.name, StandardCharsets.UTF_8); + MessageSignature.write(out, this.signature); } } @FunctionalInterface public interface b { - MessageSignature sign(String s, String s1); + MessageSignature sign(String s); + } } diff --git a/src/main/java/com/loohp/limbo/utils/LastSeenMessages.java b/src/main/java/com/loohp/limbo/utils/LastSeenMessages.java index 0221705..88232c7 100644 --- a/src/main/java/com/loohp/limbo/utils/LastSeenMessages.java +++ b/src/main/java/com/loohp/limbo/utils/LastSeenMessages.java @@ -23,117 +23,61 @@ import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.BitSet; import java.util.Collections; -import java.util.Iterator; import java.util.List; -import java.util.Optional; -import java.util.UUID; public class LastSeenMessages { - public static LastSeenMessages EMPTY = new LastSeenMessages(Collections.emptyList()); - public static final int LAST_SEEN_MESSAGES_MAX_LENGTH = 5; + public static final ArgumentSignatures EMPTY = new ArgumentSignatures(Collections.emptyList()); + private static final int MAX_ARGUMENT_COUNT = 8; + private static final int MAX_ARGUMENT_NAME_LENGTH = 16; - private List entries; - - public LastSeenMessages(List entries) { - this.entries = entries; - } - - public LastSeenMessages(DataInputStream in) throws IOException { - int size = DataTypeIO.readVarInt(in); - entries = new ArrayList<>(size); - for (int i = 0; i < size; i++) { - entries.add(new LastSeenMessages.a(in)); - } - } - - public void write(DataOutputStream out) throws IOException { - DataTypeIO.writeVarInt(out, entries.size()); - for (LastSeenMessages.a lastseenmessages_a : entries) { - lastseenmessages_a.write(out); - } - } - - public void updateHash(DataOutputStream dataoutput) throws IOException { - Iterator iterator = this.entries.iterator(); - - while (iterator.hasNext()) { - LastSeenMessages.a lastseenmessages_a = iterator.next(); - UUID uuid = lastseenmessages_a.getProfileId(); - MessageSignature messagesignature = lastseenmessages_a.getLastSignature(); - - dataoutput.writeByte(70); - dataoutput.writeLong(uuid.getMostSignificantBits()); - dataoutput.writeLong(uuid.getLeastSignificantBits()); - dataoutput.write(messagesignature.getBytes()); - } - - } + private List entries; public static class a { - private UUID profileId; - private MessageSignature lastSignature; + public static final LastSeenMessages.a EMPTY = new LastSeenMessages.a(Collections.emptyList()); - public UUID getProfileId() { - return profileId; - } + private final List entries; - public MessageSignature getLastSignature() { - return lastSignature; - } - - public a(UUID profileId, MessageSignature lastSignature) { - this.profileId = profileId; - this.lastSignature = lastSignature; + public a(List entries) { + this.entries = entries; } public a(DataInputStream in) throws IOException { - this(DataTypeIO.readUUID(in), new MessageSignature(in)); + int size = DataTypeIO.readVarInt(in); + entries = new ArrayList<>(size); + for (int i = 0; i < size; i++) { + entries.add(MessageSignature.a.read(in)); + } } public void write(DataOutputStream out) throws IOException { - DataTypeIO.writeUUID(out, this.profileId); - this.lastSignature.write(out); + DataTypeIO.writeVarInt(out, this.entries.size()); + for (MessageSignature.a entry : this.entries) { + MessageSignature.a.write(out, entry); + } } } public static class b { - private LastSeenMessages lastSeen; - private Optional lastReceived; + private final int offset; + private final BitSet acknowledged; - public b(LastSeenMessages lastSeen, Optional lastReceived) { - this.lastSeen = lastSeen; - this.lastReceived = lastReceived; + public b(int offset, BitSet acknowledged) { + this.offset = offset; + this.acknowledged = acknowledged; } public b(DataInputStream in) throws IOException { - this.lastSeen = new LastSeenMessages(in); - if (in.readBoolean()) { - this.lastReceived = Optional.of(new LastSeenMessages.a(in)); - } else { - this.lastReceived = Optional.empty(); - } + this(DataTypeIO.readVarInt(in), DataTypeIO.readFixedBitSet(in, 20)); } public void write(DataOutputStream out) throws IOException { - this.lastSeen.write(out); - if (lastReceived.isPresent()) { - out.writeBoolean(true); - lastReceived.get().write(out); - } else { - out.writeBoolean(false); - } - } - - public LastSeenMessages getLastSeen() { - return lastSeen; - } - - public Optional getLastReceived() { - return lastReceived; + DataTypeIO.writeVarInt(out, this.offset); + DataTypeIO.writeFixedBitSet(out, this.acknowledged, 20); } } diff --git a/src/main/java/com/loohp/limbo/utils/MessageSignature.java b/src/main/java/com/loohp/limbo/utils/MessageSignature.java index 522cd81..310be23 100644 --- a/src/main/java/com/loohp/limbo/utils/MessageSignature.java +++ b/src/main/java/com/loohp/limbo/utils/MessageSignature.java @@ -28,34 +28,25 @@ import java.util.Base64; public class MessageSignature { - public static final MessageSignature EMPTY = new MessageSignature(new byte[0]); + public static final int BYTES = 256; - private byte[] bytes; + private final byte[] bytes; - public MessageSignature(byte[] bytes) { - this.bytes = bytes; + public MessageSignature(byte[] abyte) { + this.bytes = abyte; } - public byte[] getBytes() { - return bytes; + public static MessageSignature read(DataInputStream in) throws IOException { + byte[] abyte = new byte[256]; + in.readFully(abyte); + return new MessageSignature(abyte); } - public MessageSignature(DataInputStream in) throws IOException { - this.bytes = new byte[DataTypeIO.readVarInt(in)]; - in.readFully(bytes); + public static void write(DataOutputStream out, MessageSignature messagesignature) throws IOException { + out.write(messagesignature.bytes); } - - public void write(DataOutputStream out) throws IOException { - out.write(this.bytes.length); - out.write(this.bytes); - } - - public boolean isEmpty() { - return this.bytes.length == 0; - } - public ByteBuffer asByteBuffer() { - return !this.isEmpty() ? ByteBuffer.wrap(this.bytes) : null; + return ByteBuffer.wrap(this.bytes); } public boolean equals(Object object) { @@ -86,7 +77,48 @@ public class MessageSignature { } public String toString() { - return !this.isEmpty() ? Base64.getEncoder().encodeToString(this.bytes) : "empty"; + return Base64.getEncoder().encodeToString(this.bytes); } + public static class a { + + public static final int FULL_SIGNATURE = -1; + + private final int id; + private final MessageSignature fullSignature; + + public a(int id, MessageSignature messagesignature) { + this.id = id; + this.fullSignature = messagesignature; + } + + public a(MessageSignature messagesignature) { + this(-1, messagesignature); + } + + public a(int i) { + this(i, null); + } + + public int id() { + return id; + } + + public MessageSignature fullSignature() { + return fullSignature; + } + + public static MessageSignature.a read(DataInputStream in) throws IOException { + int i = DataTypeIO.readVarInt(in) - 1; + return i == -1 ? new MessageSignature.a(MessageSignature.read(in)) : new MessageSignature.a(i); + } + + public static void write(DataOutputStream out, MessageSignature.a messagesignature_a) throws IOException { + DataTypeIO.writeVarInt(out, messagesignature_a.id() + 1); + if (messagesignature_a.fullSignature() != null) { + MessageSignature.write(out, messagesignature_a.fullSignature()); + } + + } + } }