first commit
Build AsminVoicechat / prepare-release (push) Successful in 14s
Build AsminVoicechat / build-and-test (17) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (18) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (19) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (20) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (21) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (22) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (23) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (24) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (25) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (26) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (27-ea) (push) Canceled after 0s
Build AsminVoicechat / build-and-test (16) (push) Canceled after 38s

This commit is contained in:
asminme committed 2026-10-24 15:18:03 +02:00
commit bbccd4a815
454 files changed
+45050

No files matched your search

@@ -0,0 +1,175 @@
/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* io.netty.buffer.Unpooled
* io.netty.handler.codec.DecoderException
* javax.annotation.Nonnull
* javax.annotation.Nullable
*/
package de.maxhenkel.voicechat.voice.common;
import de.maxhenkel.voicechat.Voicechat;
import de.maxhenkel.voicechat.api.RawUdpPacket;
import de.maxhenkel.voicechat.debug.PingHandler;
import de.maxhenkel.voicechat.util.FriendlyByteBuf;
import de.maxhenkel.voicechat.voice.common.AuthenticateAckPacket;
import de.maxhenkel.voicechat.voice.common.AuthenticatePacket;
import de.maxhenkel.voicechat.voice.common.ConnectionCheckAckPacket;
import de.maxhenkel.voicechat.voice.common.ConnectionCheckPacket;
import de.maxhenkel.voicechat.voice.common.GroupSoundPacket;
import de.maxhenkel.voicechat.voice.common.KeepAlivePacket;
import de.maxhenkel.voicechat.voice.common.LocationSoundPacket;
import de.maxhenkel.voicechat.voice.common.MicPacket;
import de.maxhenkel.voicechat.voice.common.Packet;
import de.maxhenkel.voicechat.voice.common.PingPacket;
import de.maxhenkel.voicechat.voice.common.PlayerSoundPacket;
import de.maxhenkel.voicechat.voice.common.Secret;
import de.maxhenkel.voicechat.voice.server.ClientConnection;
import de.maxhenkel.voicechat.voice.server.Server;
import io.netty.buffer.Unpooled;
import io.netty.handler.codec.DecoderException;
import java.lang.reflect.InvocationTargetException;
import java.net.SocketAddress;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
public class NetworkMessage {
public static final byte MAGIC_BYTE = -1;
private final long timestamp;
private Packet<? extends Packet> packet;
private SocketAddress address;
private static final Map<Byte, Class<? extends Packet>> packetRegistry = new HashMap<Byte, Class<? extends Packet>>();
public NetworkMessage(long timestamp, Packet<?> packet) {
this(timestamp);
this.packet = packet;
}
public NetworkMessage(Packet<?> packet) {
this(System.currentTimeMillis());
this.packet = packet;
}
private NetworkMessage(long timestamp) {
this.timestamp = timestamp;
}
@Nonnull
public Packet<? extends Packet> getPacket() {
return this.packet;
}
public long getTimestamp() {
return this.timestamp;
}
public long getTTL() {
return this.packet.getTTL();
}
public SocketAddress getAddress() {
return this.address;
}
@Nullable
public static NetworkMessage readPacketServer(RawUdpPacket packet, Server server) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException {
try {
byte[] data = packet.getData();
FriendlyByteBuf b = new FriendlyByteBuf(Unpooled.wrappedBuffer((byte[])data));
if (b.readByte() != -1) {
Voicechat.LOGGER.debug("Received invalid packet from {}", packet.getSocketAddress());
return null;
}
UUID playerID = b.readUUID();
if (!server.hasSecret(playerID)) {
if (PingHandler.onPacket(server, packet.getSocketAddress(), playerID, b)) {
return null;
}
Voicechat.LOGGER.debug("Player {} does not have a secret", playerID);
return null;
}
return NetworkMessage.readFromBytes(packet.getSocketAddress(), server.getSecret(playerID), b.readByteArray(2048), packet.getTimestamp());
}
catch (DecoderException | IndexOutOfBoundsException e) {
Voicechat.LOGGER.debug("Received invalid packet from {}", packet.getSocketAddress());
return null;
}
}
@Nullable
private static NetworkMessage readFromBytes(SocketAddress socketAddress, Secret secret, byte[] encryptedPayload, long timestamp) throws InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
byte[] decrypt;
try {
decrypt = secret.decrypt(encryptedPayload);
}
catch (Exception e) {
Voicechat.LOGGER.debug("Failed to decrypt packet from {}", socketAddress);
return null;
}
FriendlyByteBuf buffer = new FriendlyByteBuf(Unpooled.wrappedBuffer((byte[])decrypt));
byte packetType = buffer.readByte();
Class<? extends Packet> packetClass = packetRegistry.get(packetType);
if (packetClass == null) {
Voicechat.LOGGER.debug("Got invalid packet ID {}", packetType);
return null;
}
Packet p = packetClass.getDeclaredConstructor(new Class[0]).newInstance(new Object[0]);
NetworkMessage message = new NetworkMessage(timestamp);
message.address = socketAddress;
message.packet = p.fromBytes(buffer);
return message;
}
private static byte getPacketType(Packet<? extends Packet> packet) {
for (Map.Entry<Byte, Class<? extends Packet>> entry : packetRegistry.entrySet()) {
if (!packet.getClass().equals(entry.getValue())) continue;
return entry.getKey();
}
return -1;
}
public byte[] writeServer(Server server, ClientConnection connection) throws InvalidAlgorithmParameterException, NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, BadPaddingException, InvalidKeyException {
byte[] payload = this.write(server.getSecret(connection.getPlayerUUID()));
FriendlyByteBuf buffer = new FriendlyByteBuf(Unpooled.buffer((int)(1 + payload.length)));
buffer.writeByte(-1);
buffer.writeByteArray(payload);
byte[] bytes = new byte[buffer.readableBytes()];
buffer.readBytes(bytes);
return bytes;
}
public byte[] write(Secret secret) throws InvalidAlgorithmParameterException, NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, BadPaddingException, InvalidKeyException {
FriendlyByteBuf buffer = new FriendlyByteBuf(Unpooled.buffer());
byte type = NetworkMessage.getPacketType(this.packet);
if (type < 0) {
throw new IllegalArgumentException("Packet type not found");
}
buffer.writeByte(type);
this.packet.toBytes(buffer);
return secret.encrypt(buffer.array());
}
static {
packetRegistry.put((byte)1, MicPacket.class);
packetRegistry.put((byte)2, PlayerSoundPacket.class);
packetRegistry.put((byte)3, GroupSoundPacket.class);
packetRegistry.put((byte)4, LocationSoundPacket.class);
packetRegistry.put((byte)5, AuthenticatePacket.class);
packetRegistry.put((byte)6, AuthenticateAckPacket.class);
packetRegistry.put((byte)7, PingPacket.class);
packetRegistry.put((byte)8, KeepAlivePacket.class);
packetRegistry.put((byte)9, ConnectionCheckPacket.class);
packetRegistry.put((byte)10, ConnectionCheckAckPacket.class);
}
}