Example #1
0
        private PacketResult CertificationAck(Session arg1, Packet arg2)
        {
            var result = new PacketResult(PacketResultAction.Replace);

            _certificationManager.ReadAck(arg2);

            foreach (var redirect in this.Service.Settings.Redirections)
            {
                if (_certificationManager.NodeLinks.ContainsKey(redirect.CoordID))
                {
                    var link = _certificationManager.NodeLinks[redirect.CoordID];

                    var parentNode = _certificationManager.NodeData[link.ParentNodeID];

                    //SPOOF
                    //parentNode.NodeType = redirect.MachineID;
                    parentNode.Port = redirect.Port;

                    _certificationManager.NodeData[link.ParentNodeID] = parentNode;
                }
                else
                {
                    StaticLogger.Logger[this.Name].Fatal($"Coord({redirect.CoordID}) not found. Redirect impossible, please check Filter.xml!");
                }
            }

            var packet = new Packet(arg2.Opcode, arg2.Encrypted, arg2.Massive);
            _certificationManager.WriteAck(packet, true, true);

            result.Add(packet);

            return result;
        }
        private void Handle()
        {
            var channel = Server.Channels.FirstOrDefault(c => c.Id == PacketResult.ChannelId);

            Packet_PLAYER_SELECT_LOBBY.ChannelResult result;

            if (channel == null)
            {
                result = Packet_PLAYER_SELECT_LOBBY.ChannelResult.CannotFind;
            }
            else if (channel.IsFull())
            {
                result = Packet_PLAYER_SELECT_LOBBY.ChannelResult.IsFull;
            }
            else
            {
                //Se o player já está em um canal
                if (Player.Channel != null)
                {
                    //Remove Player do canal
                    Player.Channel.Players.Model.Remove(Player);
                }

                channel.PlayerJoin(Player);

                result = Packet_PLAYER_SELECT_LOBBY.ChannelResult.AllowAcess;
            }

            Player.SendResponse(PacketResult.GetChannelResult(result));
        }
Example #3
0
        public PacketResult Process(byte[] payload, Blowfish blowfish)
        {
            if (payload.Length < Header.Length)
            {
                return(PacketResult.Malformed);
            }

            PacketHeader = payload.Copy(0, Header.Length).UnMarshal <Header>();

            // missing data, need to wait for remaining data and combine
            if (PacketHeader.Size > payload.Length)
            {
                return(PacketResult.Fragmented);
            }

            if (PacketHeader.SubPackets == 0)
            {
                return(PacketResult.Malformed);
            }

            var payloadData = new byte[PacketHeader.Size - Header.Length];

            Buffer.BlockCopy(payload, Header.Length, payloadData, 0, payloadData.Length);

            if (PacketHeader.Compressed == 1)
            {
                if (!ZlibProvider.Deflate(payloadData, out payloadData))
                {
                    return(PacketResult.Malformed);
                }
            }

            using (var stream = new MemoryStream(payloadData))
            {
                using (var reader = new BinaryReader(stream))
                {
                    for (uint i = 0u; i < PacketHeader.SubPackets; i++)
                    {
                        SubPacket    subPacket;
                        PacketResult result = SubPacket.Process(reader, blowfish, out subPacket);
                        if (result != PacketResult.Ok)
                        {
                            return(result);
                        }

                        SubPackets.Add(subPacket);
                    }
                }
            }

            return(PacketResult.Ok);
        }
Example #4
0
        private void OnRecvFromClient(IAsyncResult iar)
        {
            lock (this.LOCK) {
                if (!this.m_isDisconnecting && this.m_canPacketProcess)
                {
                    try {
                        int recvCount = this.m_clientSocket.EndReceive(iar);

                        if (recvCount == 0)
                        {
                            this.Stop(ClientDisconnectType.ONRECV_FROM_CLIENT_SIZE_ZERO);
                            return;
                        }

                        this.m_clientSecurity.Recv(m_clientBuffer, 0, recvCount);

                        List <Packet> clientRecevivePackets = this.m_clientSecurity.TransferIncoming();

                        if (clientRecevivePackets != null)
                        {
                            for (int i = 0; i < clientRecevivePackets.Count; i++)
                            {
                                Packet packet = clientRecevivePackets[i];
                                if (this.ServiceComponent.OnPacketReceived != null)
                                {
                                    PacketResult result = this.ServiceComponent.OnPacketReceived(this.Client, PacketDatabase.GetPacketFrom(packet, PacketSocketType.CLIENT), PacketSocketType.CLIENT);
                                    if (packet.Opcode != 0x9000 && packet.Opcode != 0x5000 && packet.Opcode != 0x2001)
                                    {
                                        DOPacketTransfer(packet, PacketSocketType.SERVER, result);
                                    }
                                }
                            }
                        }

                        this.TransferToService();
                        this.DoRecvFromClient();
                    } catch (SocketException) {
                        this.Stop(ClientDisconnectType.CLIENT_DISCONNECTED);
                    } catch {
                        this.Stop(ClientDisconnectType.ONRECV_FROM_CLIENT);
                    }
                }
            }
        }
Example #5
0
        protected override PacketResult ProcessPacket(BinaryReader br)
        {
            var position = br.BaseStream.Position;

            br.BaseStream.Seek(4, SeekOrigin.Current);
            var single  = br.ReadSingle();
            var single1 = br.ReadSingle();
            var single2 = br.ReadSingle();

            br.BaseStream.Seek(68, SeekOrigin.Current);
            var num = br.ReadInt32();

            br.BaseStream.Seek(num, SeekOrigin.Current);
            var packetResult = new PacketResult
            {
                Read            = br.BaseStream.Position - position,
                CurrentPosition = new Point3D(single, single1, single2)
            };

            return(packetResult);
        }
        protected override PacketResult ProcessPacket(BinaryReader br)
        {
            int num;
            var position = br.BaseStream.Position;

            br.BaseStream.Seek(4, SeekOrigin.Current);
            var single  = br.ReadSingle();
            var single1 = br.ReadSingle();
            var single2 = br.ReadSingle();

            if (NetworkProtocol != 2001)
            {
                if (NetworkProtocol != 7108 && NetworkProtocol != 1028)
                {
                    num = 144;
                }
                else
                {
                    num = 296;
                }
            }
            else
            {
                num = 144;
            }

            br.BaseStream.Seek(num, SeekOrigin.Current);
            var num1 = br.ReadInt32();

            br.BaseStream.Seek(num1, SeekOrigin.Current);
            var packetResult = new PacketResult
            {
                Read            = br.BaseStream.Position - position,
                CurrentPosition = new Result.Point3D(single, single1, single2)
            };

            return(packetResult);
        }
Example #7
0
 public Tlv Add(TlvType type, PacketResult value)
 {
     return(this.Add(new Tlv(type, (UInt32)value)));
 }
Example #8
0
        private PacketResult CertificationReq(Session arg1, Packet arg2)
        {
            var result = new PacketResult(PacketResultAction.Replace);
            var response = new Packet(arg2.Opcode, arg2.Encrypted, arg2.Massive);

            _certificationManager.ReadReq(arg2);

            //_certificationManager.RequestIP = "192.168.178.10";

            _certificationManager.WriteReq(response);

            result.Add(response);
            return result;
        }
Example #9
0
        private void DOPacketTransfer(Packet packet, PacketSocketType direction, PacketResult result)
        {
            Security security = (direction == PacketSocketType.CLIENT) ? this.m_clientSecurity : this.m_serviceSecurity;

            PacketOperationType operation = result.ResultType;

            PacketResult.PacketResultInfo resultInfo = result.ResultInfo;

            switch (operation)
            {
            case PacketOperationType.DISCONNECT:
                if (resultInfo != null)
                {
                    if (resultInfo is PacketResult.PacketDisconnectResultInfo disconnect)
                    {
                        if (!string.IsNullOrEmpty(disconnect.Notice))
                        {
                            this.SendMessage(MessageType.NOTICE, disconnect.Notice.Trim());
                        }
                        if (disconnect.DisconnectReason != null)
                        {
                            int id = Convert.ToInt32(disconnect.DisconnectReason);
                            //TODO: Complete
                        }

                        if (ServiceComponent.IsDebugMode)
                        {
                            Logger.PACKET.Print(LogLevel.Warning, "Packet Operation (DISCONNECT) received : " + packet.HexOpcode);
                        }

                        this.Stop(ClientDisconnectType.PACKET_OPERATION_DISCONNECT);
                    }
                }
                break;

            case PacketOperationType.REPLACE:
                if (resultInfo != null)
                {
                    if (resultInfo is PacketResult.PacketReplaceResultInfo replace)
                    {
                        if (replace.Packet == packet)
                        {
                            if (ServiceComponent.IsDebugMode)
                            {
                                Logger.PACKET.Print(LogLevel.Warning, "Packet Operation (REPLACE) received : " + packet.HexOpcode);
                            }

                            replace.ReplaceWith.ForEach(packets => {
                                security.Send(packets);
                            });
                        }
                    }
                }
                break;

            case PacketOperationType.INJECT:
                if (resultInfo != null)
                {
                    if (resultInfo is PacketResult.PacketInjectResultInfo inject)
                    {
                        if (ServiceComponent.IsDebugMode)
                        {
                            Logger.PACKET.Print(LogLevel.Warning, "Packet Operation (INJECT) received : " + packet.HexOpcode);
                        }

                        if (!inject.AfterPacket)
                        {
                            security.Send(packet);
                        }

                        if (inject.Packet == packet)
                        {
                            inject.InjectWith.ForEach(packets => {
                                security.Send(packets);
                            });
                        }

                        if (inject.AfterPacket)
                        {
                            security.Send(packet);
                        }
                    }
                }
                break;

            case PacketOperationType.IGNORE:
                if (ServiceComponent.IsDebugMode)
                {
                    Logger.PACKET.Print(LogLevel.Warning, "Packet Operation (IGNORE) received : " + packet.HexOpcode);
                }
                break;

            case PacketOperationType.RESPONSE:
                if (resultInfo != null)
                {
                    if (resultInfo is PacketResult.PacketResponseResultInfo response)
                    {
                        if (ServiceComponent.IsDebugMode)
                        {
                            Logger.PACKET.Print(LogLevel.Warning, "Packet Operation (SEND) received : " + packet.HexOpcode);
                        }

                        response.Packets.ForEach(packets => {
                            security.Send(packets);
                        });
                    }
                }
                security.Send(packet);
                break;

            case PacketOperationType.NOTHING:
                security.Send(packet);
                break;

            default:
                security.Send(packet);
                break;
            }

            if (direction == PacketSocketType.CLIENT)
            {
                TransferToClient();
            }
            else if (direction == PacketSocketType.SERVER)
            {
                TransferToService();
            }
        }