mirror of
https://github.com/chylex/Minecraft-Phantom-Panel.git
synced 2025-09-06 07:53:11 +02:00
35 lines
1.3 KiB
C#
35 lines
1.3 KiB
C#
using Phantom.Common.Data;
|
|
using Phantom.Common.Data.Agent;
|
|
using Phantom.Common.Messages.Agent.Handshake;
|
|
using Phantom.Utils.Logging;
|
|
using Phantom.Utils.Rpc.New;
|
|
using Serilog;
|
|
|
|
namespace Phantom.Controller.Services.Rpc;
|
|
|
|
public sealed class RpcServerAgentHandshake(AuthToken authToken) : RpcServerHandshake {
|
|
private static readonly ILogger Logger = PhantomLogger.Create<RpcServerAgentHandshake>();
|
|
|
|
protected override async Task<bool> AcceptClient(string remoteAddress, Stream stream, CancellationToken cancellationToken) {
|
|
Memory<byte> buffer = new Memory<byte>(new byte[AuthToken.Length]);
|
|
await stream.ReadExactlyAsync(buffer, cancellationToken: cancellationToken);
|
|
|
|
if (!authToken.FixedTimeEquals(buffer.Span)) {
|
|
Logger.Warning("Rejected client {}, invalid authorization token.", remoteAddress);
|
|
await Respond(remoteAddress, stream, new InvalidAuthToken(), cancellationToken);
|
|
return false;
|
|
}
|
|
|
|
AgentInfo agentInfo = await Serialization.Deserialize<AgentInfo>(stream, cancellationToken);
|
|
return true;
|
|
}
|
|
|
|
private async ValueTask Respond(string remoteAddress, Stream stream, IAgentHandshakeResult result, CancellationToken cancellationToken) {
|
|
try {
|
|
await Serialization.Serialize(result, stream, cancellationToken);
|
|
} catch (Exception e) {
|
|
Logger.Error(e, "Could not send handshake result to client {}.", remoteAddress);
|
|
}
|
|
}
|
|
}
|