Ejemplo n.º 1
0
        private void AddOutgoingPacket(OutgoingPacket packet, PacketFlags flags = PacketFlags.None)
        {
            lock (sendLoopLock)
            {
                var ids = GetPacketCounter(packet.PacketType);
                if (ts3Crypt.CryptoInitComplete)
                {
                    IncPacketCounter(packet.PacketType);
                }

                packet.PacketId     = ids.Id;
                packet.GenerationId = ids.Generation;
                packet.ClientId     = ClientId;
                packet.PacketFlags |= flags;

                switch (packet.PacketType)
                {
                case PacketType.Voice:
                case PacketType.VoiceWhisper:
                    packet.PacketFlags |= PacketFlags.Unencrypted;
                    NetUtil.H2N(packet.PacketId, packet.Data, 0);
                    break;

                case PacketType.Command:
                case PacketType.CommandLow:
                    packet.PacketFlags |= PacketFlags.Newprotocol;
                    packetAckManager.Add(packet.PacketId, packet);
                    break;

                case PacketType.Ping:
                    lastSentPingId      = packet.PacketId;
                    packet.PacketFlags |= PacketFlags.Unencrypted;

                    break;

                case PacketType.Pong:
                    packet.PacketFlags |= PacketFlags.Unencrypted;
                    break;

                case PacketType.Ack:
                case PacketType.AckLow:
                    break;                     // Nothing to do

                case PacketType.Init1:
                    packet.PacketFlags |= PacketFlags.Unencrypted;
                    packetAckManager.Add(packet.PacketId, packet);
                    break;

                default: throw Util.UnhandledDefault(packet.PacketType);
                }

                ColorDbg.WritePkgOut(packet);

                ts3Crypt.Encrypt(packet);

                packet.FirstSendTime = Util.Now;

                SendRaw(packet);
            }
        }
Ejemplo n.º 2
0
        private void AddOutgoingPacket(OutgoingPacket packet, PacketFlags flags = PacketFlags.None)
        {
            lock (sendLoopLock)
            {
                if (packet.PacketType == PacketType.Init1)
                {
                    packet.PacketFlags |= flags | PacketFlags.Unencrypted;
                    packet.PacketId     = 101;
                    packet.ClientId     = 0;
                }
                else
                {
                    if (packet.PacketType == PacketType.Ping ||
                        packet.PacketType == PacketType.Pong ||
                        packet.PacketType == PacketType.Voice ||
                        packet.PacketType == PacketType.VoiceWhisper)
                    {
                        packet.PacketFlags |= flags | PacketFlags.Unencrypted;
                    }
                    else if (packet.PacketType == PacketType.Ack)
                    {
                        packet.PacketFlags |= flags;
                    }
                    else
                    {
                        packet.PacketFlags |= flags | PacketFlags.Newprotocol;
                    }
                    var ids = GetPacketCounter(packet.PacketType);
                    packet.PacketId     = ids.Item1;
                    packet.GenerationId = ids.Item2;
                    if (packet.PacketType == PacketType.Voice || packet.PacketType == PacketType.VoiceWhisper)
                    {
                        NetUtil.H2N(packet.PacketId, packet.Data, 0);
                    }
                    if (ts3Crypt.CryptoInitComplete)
                    {
                        IncPacketCounter(packet.PacketType);
                    }
                    packet.ClientId = ClientId;
                }

                ts3Crypt.Encrypt(packet);

                if (packet.PacketType == PacketType.Command ||
                    packet.PacketType == PacketType.CommandLow ||
                    packet.PacketType == PacketType.Init1)
                {
                    packetAckManager.Add(packet.PacketId, packet);
                }
                else if (packet.PacketType == PacketType.Ping)
                {
                    packetPingManager.Add(packet.PacketId, packet);
                }

                SendRaw(packet);
            }
        }
Ejemplo n.º 3
0
        private void AddOutgoingPacket(OutgoingPacket packet, PacketFlags flags = PacketFlags.None)
        {
            lock (sendLoopLock)
            {
                if (packet.PacketType == PacketType.Init1)
                {
                    packet.PacketFlags |= flags | PacketFlags.Unencrypted;
                    packet.PacketId     = 101;
                    packet.ClientId     = 0;
                }
                else
                {
                    if (packet.PacketType == PacketType.Ping ||
                        packet.PacketType == PacketType.Pong ||
                        packet.PacketType == PacketType.Voice ||
                        packet.PacketType == PacketType.VoiceWhisper)
                    {
                        packet.PacketFlags |= flags | PacketFlags.Unencrypted;
                    }
                    else if (packet.PacketType == PacketType.Ack)
                    {
                        packet.PacketFlags |= flags;
                    }
                    else
                    {
                        packet.PacketFlags |= flags | PacketFlags.Newprotocol;
                    }
                    packet.PacketId = GetPacketCounter(packet.PacketType);
                    if (packet.PacketType == PacketType.Voice || packet.PacketType == PacketType.VoiceWhisper)
                    {
                        NetUtil.H2N(packet.PacketId, packet.Data, 0);
                    }
                    if (ts3Crypt.CryptoInitComplete)
                    {
                        IncPacketCounter(packet.PacketType);
                    }
                    packet.ClientId = ClientId;
                }

                ts3Crypt.Encrypt(packet);


                if (packet.PacketType == PacketType.Command ||
                    packet.PacketType == PacketType.CommandLow ||
                    packet.PacketType == PacketType.Init1)
                {
                    packetAckManager.Add(packet.PacketId, packet);
                }
                else if (packet.PacketType == PacketType.Ping)
                {
                    try { packetPingManager.Add(packet.PacketId, packet); } catch { Console.WriteLine("Error with ping packet"); }
                }

                SendRaw(packet);
            }
        }
Ejemplo n.º 4
0
        private void SendOutgoingData(ReadOnlySpan <byte> data, PacketType packetType, PacketFlags flags = PacketFlags.None)
        {
            var packet = new C2SPacket(data.ToArray(), packetType);

            lock (sendLoopLock)
            {
                var ids = GetPacketCounter(packet.PacketType);
                if (ts3Crypt.CryptoInitComplete)
                {
                    IncPacketCounter(packet.PacketType);
                }

                packet.PacketId     = ids.Id;
                packet.GenerationId = ids.Generation;
                packet.ClientId     = ClientId;
                packet.PacketFlags |= flags;

                switch (packet.PacketType)
                {
                case PacketType.Voice:
                case PacketType.VoiceWhisper:
                    packet.PacketFlags |= PacketFlags.Unencrypted;
                    BinaryPrimitives.WriteUInt16BigEndian(packet.Data.AsSpan(), packet.PacketId);
                    LoggerRawVoice.Trace("[O] {0}", packet);
                    break;

                case PacketType.Command:
                case PacketType.CommandLow:
                    packet.PacketFlags |= PacketFlags.Newprotocol;
                    packetAckManager.Add(packet.PacketId, packet);
                    LoggerRaw.Debug("[O] {0}", packet);
                    break;

                case PacketType.Ping:
                    lastSentPingId      = packet.PacketId;
                    packet.PacketFlags |= PacketFlags.Unencrypted;
                    LoggerRaw.Trace("[O] Ping {0}", packet.PacketId);
                    break;

                case PacketType.Pong:
                    packet.PacketFlags |= PacketFlags.Unencrypted;
                    LoggerRaw.Trace("[O] Pong {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data));
                    break;

                case PacketType.Ack:
                case PacketType.AckLow:
                    LoggerRaw.Debug("[O] Acking {1}: {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data), packet.PacketType);
                    break;

                case PacketType.Init1:
                    packet.PacketFlags |= PacketFlags.Unencrypted;
                    initPacketCheck     = packet;
                    LoggerRaw.Debug("[O] InitID: {0}", packet.Data[4]);
                    LoggerRaw.Trace("[O] {0}", packet);
                    break;

                default: throw Util.UnhandledDefault(packet.PacketType);
                }

                ts3Crypt.Encrypt(packet);

                packet.FirstSendTime = Util.Now;
                SendRaw(packet);
            }
        }
Ejemplo n.º 5
0
        // is always locked on 'sendLoopLock' from a higher call
        private E <string> SendOutgoingData(ReadOnlySpan <byte> data, PacketType packetType, PacketFlags flags = PacketFlags.None)
        {
            var ids = GetPacketCounter(packetType);

            IncPacketCounter(packetType);

            var packet = new Packet <TOut>(data, packetType, ids.Id, ids.Generation)
            {
                PacketType = packetType
            };

            if (typeof(TOut) == typeof(C2S))             // TODO: XXX
            {
                var meta = (C2S)(object)packet.HeaderExt;
                meta.ClientId    = ClientId;
                packet.HeaderExt = (TOut)(object)meta;
            }
            packet.PacketFlags |= flags;

            switch (packet.PacketType)
            {
            case PacketType.Voice:
            case PacketType.VoiceWhisper:
                packet.PacketFlags |= PacketFlags.Unencrypted;
                BinaryPrimitives.WriteUInt16BigEndian(packet.Data, packet.PacketId);
                LoggerRawVoice.Trace("[O] {0}", packet);
                break;

            case PacketType.Command:
            case PacketType.CommandLow:
                packet.PacketFlags |= PacketFlags.Newprotocol;
                var resendPacket = new ResendPacket <TOut>(packet);
                packetAckManager.Add(packet.PacketId, resendPacket);
                LoggerRaw.Debug("[O] {0}", packet);
                break;

            case PacketType.Ping:
                lastSentPingId      = packet.PacketId;
                packet.PacketFlags |= PacketFlags.Unencrypted;
                LoggerRaw.Trace("[O] Ping {0}", packet.PacketId);
                break;

            case PacketType.Pong:
                packet.PacketFlags |= PacketFlags.Unencrypted;
                LoggerRaw.Trace("[O] Pong {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data));
                break;

            case PacketType.Ack:
                LoggerRaw.Debug("[O] Acking Ack: {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data));
                break;

            case PacketType.AckLow:
                packet.PacketFlags |= PacketFlags.Unencrypted;
                LoggerRaw.Debug("[O] Acking AckLow: {0}", BinaryPrimitives.ReadUInt16BigEndian(packet.Data));
                break;

            case PacketType.Init1:
                packet.PacketFlags |= PacketFlags.Unencrypted;
                initPacketCheck     = new ResendPacket <TOut>(packet);
                LoggerRaw.Debug("[O] InitID: {0}", packet.Data[4]);
                LoggerRaw.Trace("[O] {0}", packet);
                break;

            default: throw Util.UnhandledDefault(packet.PacketType);
            }

            ts3Crypt.Encrypt(ref packet);

            return(SendRaw(ref packet));
        }