protected static PacketRule[] InitRules(params PacketRule[] rules) { PacketRule[] final = new PacketRule[Constants.InternalPacketCount]; foreach (PacketRule rule in rules) { final[rule.Packet.PacketId] = rule; } return(final); }
/// <summary> /// Handles an internal VSL packet. Ensure using the correct <see cref="CryptoAlgorithm"/>. /// </summary> internal Task <bool> HandleInternalPacketAsync(PacketRule rule, byte[] content) { IPacket packet = rule.Packet.New(); try { using (PacketBuffer buf = PacketBuffer.CreateStatic(content)) packet.ReadPacket(buf); } catch (ArgumentException ex) { parent.ExceptionHandler.CloseConnection(ex); return(Task.FromResult(false)); } return(packet.HandlePacketAsync(this)); }
/// <summary> /// Validates an internal packet and returns the matching <see cref="PacketRule"/>. /// </summary> internal bool ValidatePacket(byte id, CryptoAlgorithm alg, out PacketRule rule) { rule = RegisteredPackets[id]; if (!rule.Available) { parent.ExceptionHandler.CloseConnection("InvalidPacket", $"Packet id {id} is no valid internal packet for this instance.", nameof(PacketHandler), nameof(ValidatePacket)); return(false); } if (!rule.VerifyAlgorithm(alg)) { parent.ExceptionHandler.CloseConnection("WrongAlgorithm", $"{rule.Packet} with {alg} is not allowed.", nameof(PacketHandler), nameof(ValidatePacket)); return(false); } return(true); }