Skip to content

Commit

Permalink
finally decoding/encoding packets in plugins manner
Browse files Browse the repository at this point in the history
  • Loading branch information
caunt committed Jul 28, 2024
1 parent 436c08d commit 59a0d6f
Show file tree
Hide file tree
Showing 89 changed files with 1,316 additions and 741 deletions.
36 changes: 20 additions & 16 deletions src/Void.Proxy-before/Configuration/Settings.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,17 +62,18 @@ public async Task SaveAsync(string fileName = "settings.ini", CancellationToken
private static async ValueTask GenerateDefaultAsync(string fileName, CancellationToken cancellationToken = default)
{
var defaults = RandomStringRegex()
.Replace(Resources.DefaultSettings, match =>
{
const string allowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" + "abcdefghijklmnopqrstuvxyz";
.Replace(Resources.DefaultSettings,
match =>
{
const string allowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "0123456789" + "abcdefghijklmnopqrstuvxyz";

var suffix = match.Groups[1].Value;
var suffix = match.Groups[1].Value;

if (!int.TryParse(suffix, out var size))
throw new Exception($"Invalid random string length specified: {suffix}");
if (!int.TryParse(suffix, out var size))
throw new Exception($"Invalid random string length specified: {suffix}");

return new string(Random.Shared.GetItems<char>(allowedChars, size));
});
return new string(Random.Shared.GetItems<char>(allowedChars, size));
});

await File.WriteAllTextAsync(fileName, defaults, cancellationToken);
}
Expand Down Expand Up @@ -203,14 +204,17 @@ private void Load()
if (colonIdx < 0 || !int.TryParse(serverAddress[++colonIdx..], out var serverPort))
serverPort = 25565;

Servers.Add(new ServerInfo(serverName, serverHostname, serverPort, ForwardingMode switch
{
ForwardingMode.None => DefaultNoneForwarding,
ForwardingMode.Auto => DefaultAutoForwarding,
ForwardingMode.Legacy => DefaultLegacyForwarding,
ForwardingMode.Modern => DefaultModernForwarding,
_ => throw new ArgumentOutOfRangeException($"Invalid forwarding mode specified: {ForwardingMode}")
}));
Servers.Add(new ServerInfo(serverName,
serverHostname,
serverPort,
ForwardingMode switch
{
ForwardingMode.None => DefaultNoneForwarding,
ForwardingMode.Auto => DefaultAutoForwarding,
ForwardingMode.Legacy => DefaultLegacyForwarding,
ForwardingMode.Modern => DefaultModernForwarding,
_ => throw new ArgumentOutOfRangeException($"Invalid forwarding mode specified: {ForwardingMode}")
}));
}
}

Expand Down
9 changes: 6 additions & 3 deletions src/Void.Proxy-before/Network/IO/MinecraftBuffer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -293,9 +293,12 @@ public void WriteLong(long value)

public IdentifiedKey ReadIdentifiedKey(ProtocolVersion protocolVersion)
{
return new IdentifiedKey(protocolVersion == ProtocolVersion.MINECRAFT_1_19 ? IdentifiedKeyRevision.GENERIC_V1 : IdentifiedKeyRevision.LINKED_V2, ReadLong(), Read(ReadVarInt())
.ToArray(), Read(ReadVarInt())
.ToArray());
return new IdentifiedKey(protocolVersion == ProtocolVersion.MINECRAFT_1_19 ? IdentifiedKeyRevision.GENERIC_V1 : IdentifiedKeyRevision.LINKED_V2,
ReadLong(),
Read(ReadVarInt())
.ToArray(),
Read(ReadVarInt())
.ToArray());
}

public void WriteIdentifiedKey(IdentifiedKey identifiedKey)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,9 +53,10 @@ public byte[] GenerateForwardingData(byte[] data, Player player)
// TODO: https://github.com/PaperMC/Velocity/blob/07a525be7f90f1f3ccd515f7c196824d12ed0fff/proxy/src/main/java/com/velocitypowered/proxy/connection/backend/LoginSessionHandler.java#L199
private Version FindForwardingVersion(Version requested, Player player)
{
requested = (Version)Math.Min((int)requested, Enum.GetValues(typeof(Version))
.Cast<int>()
.Max());
requested = (Version)Math.Min((int)requested,
Enum.GetValues(typeof(Version))
.Cast<int>()
.Max());

if (requested.CompareTo(Version.Default) > 0)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,9 @@ public void Decode(ref MinecraftBuffer buffer, ProtocolVersion protocolVersion)
Arguments = new Dictionary<string, byte[]>(size);

for (var i = 0; i < size; i++)
Arguments.Add(buffer.ReadString(16), buffer.Read(Signed ? 65536 : 0)
.ToArray());
Arguments.Add(buffer.ReadString(16),
buffer.Read(Signed ? 65536 : 0)
.ToArray());

SignedPreview = buffer.ReadBoolean();

Expand All @@ -101,12 +102,14 @@ public void Decode(ref MinecraftBuffer buffer, ProtocolVersion protocolVersion)
PreviousMessages = new KeyValuePair<Guid, byte[]>[size];

for (var i = 0; i < size; i++)
PreviousMessages[i] = new KeyValuePair<Guid, byte[]>(buffer.ReadGuid(), buffer.Read(buffer.ReadVarInt())
.ToArray());
PreviousMessages[i] = new KeyValuePair<Guid, byte[]>(buffer.ReadGuid(),
buffer.Read(buffer.ReadVarInt())
.ToArray());

if (buffer.ReadBoolean())
LastMessage = new KeyValuePair<Guid, byte[]>(buffer.ReadGuid(), buffer.Read(buffer.ReadVarInt())
.ToArray());
LastMessage = new KeyValuePair<Guid, byte[]>(buffer.ReadGuid(),
buffer.Read(buffer.ReadVarInt())
.ToArray());
}

if (Salt != 0L || PreviousMessages.Length != 0)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,14 +97,16 @@ public void Decode(ref MinecraftBuffer buffer, ProtocolVersion protocolVersion)
var lastSignatures = new KeyValuePair<Guid, byte[]>[size];

for (var i = 0; i < size; i++)
lastSignatures[i] = new KeyValuePair<Guid, byte[]>(buffer.ReadGuid(), buffer.Read(buffer.ReadVarInt())
.ToArray());
lastSignatures[i] = new KeyValuePair<Guid, byte[]>(buffer.ReadGuid(),
buffer.Read(buffer.ReadVarInt())
.ToArray());

PreviousMessages = lastSignatures;

if (buffer.ReadBoolean())
LastMessage = new KeyValuePair<Guid, byte[]>(buffer.ReadGuid(), buffer.Read(buffer.ReadVarInt())
.ToArray());
LastMessage = new KeyValuePair<Guid, byte[]>(buffer.ReadGuid(),
buffer.Read(buffer.ReadVarInt())
.ToArray());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,9 @@ public void Decode(ref MinecraftBuffer buffer, ProtocolVersion protocolVersion)

Arguments = new Dictionary<string, byte[]>(size);
for (var i = 0; i < size; i++)
Arguments.Add(buffer.ReadString(), buffer.Read(256)
.ToArray());
Arguments.Add(buffer.ReadString(),
buffer.Read(256)
.ToArray());

SessionLastSeenMessages = new SessionLastSeenMessages(ref buffer);
}
Expand Down
49 changes: 42 additions & 7 deletions src/Void.Proxy-before/Network/Protocol/States/Common/LoginState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,12 @@ public async Task<bool> HandleAsync(LoginPluginRequest packet)
return false;

var data = forwarding.GenerateForwardingData(packet.Data, link.Player);
await link.Server.SendPacketAsync(new LoginPluginResponse { MessageId = packet.MessageId, Successful = true, Data = data });
await link.Server.SendPacketAsync(new LoginPluginResponse
{
MessageId = packet.MessageId,
Successful = true,
Data = data
});

return true;
}
Expand Down Expand Up @@ -225,28 +230,53 @@ byte[] Reply(byte[] modlist)
.ToArray();
}

await link.Server.SendPacketAsync(new LoginPluginResponse { Data = Reply(data), MessageId = packet.MessageId, Successful = true });
await link.Server.SendPacketAsync(new LoginPluginResponse
{
Data = Reply(data),
MessageId = packet.MessageId,
Successful = true
});
break;
case 3 or 4:
await link.Server.SendPacketAsync(new LoginPluginResponse { Data = Convert.FromHexString("0D666D6C3A68616E647368616B650163"), MessageId = packet.MessageId, Successful = true });
await link.Server.SendPacketAsync(new LoginPluginResponse
{
Data = Convert.FromHexString("0D666D6C3A68616E647368616B650163"),
MessageId = packet.MessageId,
Successful = true
});
break;
case 5:
break;
default:
Proxy.Logger.Debug($"2 Don't know what to do with forge channel {channel} packet id {id}, answering as succesful");
await link.Server.SendPacketAsync(new LoginPluginResponse { Data = [], MessageId = packet.MessageId, Successful = true });
await link.Server.SendPacketAsync(new LoginPluginResponse
{
Data = [],
MessageId = packet.MessageId,
Successful = true
});
break;
}

break;
case "silentgear:network":
break;
case "exnihilosequentia:handshake":
await link.Server.SendPacketAsync(new LoginPluginResponse { Data = Convert.FromHexString("1B65786E6968696C6F73657175656E7469613A68616E647368616B650163"), MessageId = packet.MessageId, Successful = true });
await link.Server.SendPacketAsync(new LoginPluginResponse
{
Data = Convert.FromHexString("1B65786E6968696C6F73657175656E7469613A68616E647368616B650163"),
MessageId = packet.MessageId,
Successful = true
});
break;
default:
Proxy.Logger.Debug($"1 Don't know what to do with forge channel {channel} packet id {id}, answering as succesful");
await link.Server.SendPacketAsync(new LoginPluginResponse { Data = [], MessageId = packet.MessageId, Successful = true });
await link.Server.SendPacketAsync(new LoginPluginResponse
{
Data = [],
MessageId = packet.MessageId,
Successful = true
});
break;
}
}
Expand Down Expand Up @@ -278,6 +308,11 @@ public LoginStartPacket GenerateLoginStartPacket()
if (link.Player.GameProfile is null)
throw new Exception("Can't proceed login as we do not have online GameProfile");

return new LoginStartPacket { Guid = link.Player.GameProfile.Id, Username = link.Player.GameProfile.Name, IdentifiedKey = link.Player.IdentifiedKey };
return new LoginStartPacket
{
Guid = link.Player.GameProfile.Id,
Username = link.Player.GameProfile.Name,
IdentifiedKey = link.Player.IdentifiedKey
};
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
using System.Net.Sockets;
using Void.Proxy.API.Network.IO.Channels;
using Void.Proxy.API.Network.Protocol.Services;
using Void.Proxy.API.Players;

namespace Void.Proxy.API.Events.Handshake;

public class SearchChannelBuilderEvent : IEventWithResult<Func<NetworkStream, Task<IMinecraftChannel>>>
public class SearchChannelBuilderEvent : IEventWithResult<ChannelBuilder>
{
public required Memory<byte> Buffer { get; init; }
public Func<NetworkStream, Task<IMinecraftChannel>>? Result { get; set; }
public required IPlayer Player { get; init; }
public ChannelBuilder? Result { get; set; }
}
23 changes: 23 additions & 0 deletions src/Void.Proxy.API/Events/Network/MessageReceivedEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using Void.Proxy.API.Network;
using Void.Proxy.API.Network.IO.Channels;
using Void.Proxy.API.Network.IO.Messages;
using Void.Proxy.API.Players;
using Void.Proxy.API.Servers;

namespace Void.Proxy.API.Events.Network;

public class MessageReceivedEvent : IEventWithResult<bool>
{
public required Side From { get; init; }
public required Direction To { get; init; }
public required IMinecraftMessage Message { get; init; }
public required IPlayer Player { get; init; }
public required IServer Server { get; init; }
public required IMinecraftChannel PlayerChannel { get; init; }
public required IMinecraftChannel ServerChannel { get; init; }

/// <summary>
/// <see langword="true" /> if packet should not be sent
/// </summary>
public bool Result { get; set; }
}
18 changes: 18 additions & 0 deletions src/Void.Proxy.API/Events/Network/MessageSentEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using Void.Proxy.API.Network;
using Void.Proxy.API.Network.IO.Channels;
using Void.Proxy.API.Network.IO.Messages;
using Void.Proxy.API.Players;
using Void.Proxy.API.Servers;

namespace Void.Proxy.API.Events.Network;

public class MessageSentEvent : IEvent
{
public required Side From { get; init; }
public required Direction To { get; init; }
public required IMinecraftMessage Message { get; init; }
public required IPlayer Player { get; init; }
public required IServer Server { get; init; }
public required IMinecraftChannel PlayerChannel { get; init; }
public required IMinecraftChannel ServerChannel { get; init; }
}
8 changes: 8 additions & 0 deletions src/Void.Proxy.API/Events/Player/PlayerConnectedEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using Void.Proxy.API.Players;

namespace Void.Proxy.API.Events.Player;

public class PlayerConnectedEvent : IEvent
{
public required IPlayer Player { get; init; }
}
8 changes: 8 additions & 0 deletions src/Void.Proxy.API/Events/Player/PlayerDisconnectedEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using Void.Proxy.API.Players;

namespace Void.Proxy.API.Events.Player;

public class PlayerDisconnectedEvent : IEvent
{
public required IPlayer Player { get; init; }
}
10 changes: 10 additions & 0 deletions src/Void.Proxy.API/Events/Player/PlayerSearchServerEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Void.Proxy.API.Players;
using Void.Proxy.API.Servers;

namespace Void.Proxy.API.Events.Player;

public class PlayerSearchServerEvent : IEventWithResult<IServer>
{
public required IPlayer Player { get; init; }
public IServer? Result { get; set; }
}
8 changes: 8 additions & 0 deletions src/Void.Proxy.API/Events/Plugins/PluginLoadEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using Void.Proxy.API.Plugins;

namespace Void.Proxy.API.Events.Plugins;

public class PluginLoadEvent : IEvent
{
public required IPlugin Plugin { get; init; }
}
8 changes: 8 additions & 0 deletions src/Void.Proxy.API/Events/Plugins/PluginUnloadEvent.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using Void.Proxy.API.Plugins;

namespace Void.Proxy.API.Events.Plugins;

public class PluginUnloadEvent : IEvent
{
public required IPlugin Plugin { get; init; }
}
20 changes: 20 additions & 0 deletions src/Void.Proxy.API/Extensions/TaskExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
namespace Void.Proxy.API.Extensions;

public static class TaskExtensions
{
public static Task CatchExceptions(this Task task)
{
return task.ContinueWith(completedTask =>
{
if (completedTask.Exception != null)
Console.WriteLine("Unhandled task Exception:\n" + completedTask.Exception.InnerException);
},
TaskContinuationOptions.OnlyOnFaulted);
}

public static Task CatchExceptions(this ValueTask task)
{
return task.AsTask()
.CatchExceptions();
}
}
6 changes: 6 additions & 0 deletions src/Void.Proxy.API/Forwarding/IForwarding.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Void.Proxy.API.Forwarding;

public interface IForwarding
{
public string Name { get; }
}
9 changes: 9 additions & 0 deletions src/Void.Proxy.API/Forwarding/IForwardingService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace Void.Proxy.API.Forwarding;

public interface IForwardingService
{
IReadOnlyList<IForwarding> All { get; }

void Register(IForwarding forwarding);
void RegisterDefault();
}
2 changes: 1 addition & 1 deletion src/Void.Proxy.API/Links/ILinkService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ namespace Void.Proxy.API.Links;

public interface ILinkService
{
public ValueTask ConnectPlayerAnywhereAsync(IPlayer player);
public ValueTask ConnectPlayerAnywhereAsync(IPlayer player, CancellationToken cancellationToken = default);
}
Loading

0 comments on commit 59a0d6f

Please sign in to comment.