continuity/Server/AuthSession.cs

100 lines
3.4 KiB
C#
Raw Normal View History

2023-08-11 08:31:54 +00:00
using System.Reflection;
using System.Text;
2023-08-09 14:23:41 +00:00
using MassTransit.Mediator;
using Microsoft.Extensions.Logging;
using NetCoreServer;
2023-08-10 08:47:35 +00:00
using Server.Packets;
2023-08-09 14:23:41 +00:00
namespace Server;
2023-08-10 08:47:35 +00:00
public class AuthSession : TcpSession
2023-08-09 14:23:41 +00:00
{
private readonly IMediator _mediator;
2023-08-10 08:47:35 +00:00
private readonly ILogger<AuthSession> _logger;
2023-08-09 14:23:41 +00:00
2023-08-10 08:47:35 +00:00
public AuthSession(TcpServer
server, IMediator mediator, ILogger<AuthSession> logger) : base(server)
2023-08-09 14:23:41 +00:00
{
2023-08-11 09:31:30 +00:00
this._mediator = mediator;
this._logger = logger;
2023-08-09 14:23:41 +00:00
}
public override long Send(byte[] buffer)
{
2023-08-11 09:31:30 +00:00
this._logger.LogInformation("Data being sent is: {Data}", BitConverter.ToString(buffer));
return base.Send(buffer);
}
public void Send(IPacket packet)
{
var type = packet.GetType();
2023-08-11 09:31:30 +00:00
this._logger.LogTrace("Packet of type {Type} is being serialized", type.Name);
var packetIdAttribute = type.GetCustomAttribute<PacketId>();
2023-08-11 09:31:30 +00:00
if (packetIdAttribute == null)
{
return;
}
var opcode = packetIdAttribute.Code;
Span<byte> packetData = packet.Serialize();
2023-08-11 09:31:30 +00:00
var length = (ushort)(packetData.Length + 8);
Span<byte> buffer = stackalloc byte[length];
buffer.Clear();
packetData.CopyTo(buffer.Slice(8, length - 8));
var bytesOfLength = BitConverter.GetBytes(length);
var bytesOfOpcode = BitConverter.GetBytes((ushort)opcode);
2023-08-11 09:31:30 +00:00
for (var i = 0; i < bytesOfLength.Length || i < 2; i++)
{
buffer[i] = bytesOfLength[i];
}
2023-08-11 09:31:30 +00:00
for (var i = 0; i < bytesOfOpcode.Length || i < 2; i++)
{
buffer[2 + i] = bytesOfOpcode[i];
}
2023-08-11 09:31:30 +00:00
this._logger.LogTrace("Packet data being parsed is: {Data}", BitConverter.ToString(packetData.ToArray()));
this._logger.LogTrace("Packet being parsed is: {Data}", BitConverter.ToString(buffer.ToArray()));
2023-08-11 09:31:30 +00:00
this.Send(buffer);
}
2023-08-09 14:23:41 +00:00
protected override void OnReceived(byte[] buffer, long offset, long size)
{
2023-08-10 06:45:51 +00:00
Console.WriteLine($"Length: {size} & offset: {offset}");
Span<byte> decryptedBuffer = new byte[size];
2023-08-09 14:23:41 +00:00
2023-08-10 06:45:51 +00:00
// xor every value after the first 8 bytes
2023-08-11 09:31:30 +00:00
var dataBuffer = this.Decrypt(new ArraySegment<byte>(buffer, 8, (int)size - 8).ToArray());
2023-08-10 06:45:51 +00:00
Console.WriteLine("Length " + BitConverter.ToUInt16(buffer, 0));
var opCode = BitConverter.ToUInt16(buffer.ToArray(), 2);
Console.WriteLine("Packet Op Code: " + opCode);
Console.WriteLine("Some Value: " + buffer[4]);
var clientAliveTime = BitConverter.ToUInt16(buffer.ToArray(), 5);
Console.WriteLine("Client Alive time: " + clientAliveTime);
Console.WriteLine("Might be a flag:" + buffer[7]);
Console.WriteLine("Full buffer: " + Encoding.ASCII.GetString(dataBuffer.ToArray()));
2023-08-11 09:31:30 +00:00
var rawPacket = new RawPacket((OperationCode)opCode, dataBuffer, clientAliveTime, buffer[0],
buffer[3], this.Id, this);
Task.Run(() => this._mediator.Send(rawPacket));
this._logger.LogInformation("Connection from: {@RemoteEndpoint}", this.Socket.RemoteEndPoint?.ToString());
2023-08-10 06:45:51 +00:00
base.OnReceived(decryptedBuffer.ToArray(), offset, decryptedBuffer.Length);
2023-08-09 14:23:41 +00:00
}
private byte[] Decrypt(byte[] buffer)
{
2023-08-11 09:31:30 +00:00
for (var i = 0; i < buffer.Length; ++i)
2023-08-09 14:23:41 +00:00
{
buffer[i] = (byte)(buffer[i] ^ i ^ (3 * (0xFE - i)));
}
return buffer;
}
2023-08-11 09:31:30 +00:00
}