Exemple #1
0
        private static void CreateSession(MessageData mdata, DWMessage packet)
        {
            Net_TcpDisconnected(mdata);
            var    seed = 0;
            string IP   = mdata.Get <string>("cid");

            string[] IPParts = IP.Split(':');
            seed = BitConverter.ToInt32(IPAddress.Parse(IPParts[0]).GetAddressBytes(), 0);
            TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));

            seed += (int)ts.TotalSeconds;

            var rnd = new Random(seed);
            var sid = new byte[8];

            rnd.NextBytes(sid);

            var titleID            = DWRouter.GetTitleIDForData(mdata);
            bdMatchMakingInfo info = null;

            if (titleID == TitleID.T5)
            {
                info = new MatchMakingInfoT5();
            }
            else if (titleID == TitleID.IW5)
            {
                info = new MatchMakingInfoIW5();
            }

            info.Deserialize(packet);
            info.SessionID = sid;
            info.CID       = mdata.Get <string>("cid");
            info.User      = (DWRouter.CIDToUser.ContainsKey(info.CID)) ? DWRouter.CIDToUser[info.CID] : 0;
            info.Reachable = true;

            lock (_sessions)
            {
                _sessions.Add(BitConverter.ToUInt64(sid, 0), info);
            }

            var reply = packet.MakeReply(1, false);

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)1);
            reply.ByteBuffer.Write((uint)1);
            reply.ByteBuffer.Write((uint)1);
            reply.ByteBuffer.WriteBlob(info.SessionID);
            reply.Send(true);

            if (titleID == TitleID.T5)
            {
                var tInfo = (MatchMakingInfoT5)info;
                Log.Debug(tInfo.OnlineID.ToString("X16") + " registered session (map " + tInfo.MapName + ", gametype " + tInfo.GameTypeName + ")");
            }
            else if (titleID == TitleID.IW5)
            {
                Log.Debug("Registered session.");
            }
        }
Exemple #2
0
        public static void DW_PacketReceived(MessageData data)
        {
            var type  = data.Get <int>("type");
            var crypt = data.Get <bool>("crypt");

            if (type == 6)
            {
                var packet = DWRouter.GetMessage(data);
                var call   = packet.ByteBuffer.ReadByte();

                try
                {
                    switch (call)
                    {
                    case 1:
                        break;

                    case 14:
                        SendGlobalInstantMessage(data, packet);
                        break;

                    default:
                        Log.Debug("unknown packet " + call + " in bdMessaging");
                        //DWRouter.Unknown(data, packet);
                        break;
                    }
                }
                catch (Exception e)
                {
                    Log.Error(e.ToString());
                }
            }
        }
Exemple #3
0
        public static void DW_PacketReceived(MessageData data)
        {
            var type  = data.Get <int>("type");
            var crypt = data.Get <bool>("crypt");

            var packet = DWRouter.GetMessage(data);
            var call   = packet.ByteBuffer.ReadByte();

            switch (call)
            {
            case 2:
                GetUserData(data, packet);
                break;
            }
        }
Exemple #4
0
 public static DWMessage GetMessage(MessageData data)
 {
     return(new DWMessage()
     {
         Data = data, ByteBuffer = new DWByteBuffer(data.Get <byte[]>("data")), BitBuffer = new DWBitBuffer(data.Get <byte[]>("data")), Buffer = data.Get <byte[]>("data")
     });
 }
Exemple #5
0
        private static void DeleteSession(MessageData mdata, DWMessage packet)
        {
            var sidBlob = packet.ByteBuffer.ReadBlob();
            var sid     = BitConverter.ToUInt64(sidBlob, 0);

            lock (_sessions)
            {
                var matchingSessions = (from session in _sessions
                                        where session.Value.CID == mdata.Get <string>("cid")
                                        select session);

                var toRemove = new List <ulong>();

                foreach (var session in matchingSessions)
                {
                    toRemove.Add(session.Key);
                }

                foreach (var key in toRemove)
                {
                    _sessions.Remove(key);
                }
            }

            var reply = packet.MakeReply(1, false);

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)1);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((uint)0);
            reply.Send(true);
        }
Exemple #6
0
        public static void Net_TcpSend(MessageData data)
        {
            // TODO: optimize this
            try
            {
                var buffer = data.Get <byte[]>("data");

                // get the cid
                var cid = data.Get <string>("cid");
                var ci  = _instance._clients[cid];
                ci.socket.SendBufferSize = 8192;
                // and BeginSend it
                ci.socket.ReceiveTimeout = 10000;
                ci.socket.SendTimeout    = 10000;
                ci.socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(_instance.Socket_Send), ci);
            }
            catch { }
        }
Exemple #7
0
        public static void SetGlobalKey(MessageData data, byte[] key)
        {
            if (key[0] == 0 && key[4] == 0 && key[8] == 0)
            {
                //Debugger.Break();
            }

            _keys[data.Get <string>("cid")] = key;
        }
Exemple #8
0
        public static byte[] GetGlobalKey(MessageData data)
        {
            var cid = data.Get <string>("cid");

            if (_keys.ContainsKey(cid))
            {
                return(_keys[cid]);
            }

            return(new byte[24]);
        }
Exemple #9
0
        public static ulong GetIDForData(MessageData data)
        {
            var cid = data.Get <string>("cid");

            if (!ConnectionsReverse.ContainsKey(cid))
            {
                return(0);
            }

            return(ConnectionsReverse[cid]);
        }
Exemple #10
0
        public static TitleID GetTitleIDForData(MessageData data)
        {
            var cid = data.Get <string>("cid");

            if (!CIDToTitle.ContainsKey(cid))
            {
                return(TitleID.T5);
            }

            return(CIDToTitle[cid]);
        }
Exemple #11
0
        public static void DW_PacketReceived(MessageData data)
        {
            var type  = data.Get <int>("type");
            var crypt = data.Get <bool>("crypt");

            if (!crypt)
            {
                if (type == 28)
                {
                    HandleClientAuth(data);
                }
                else if (type == 12)
                {
                    HandleServerAuth(data);
                }
                else if (type == 26)
                {
                    HandleIW5ServerAuth(data, type);
                }
            }
        }
Exemple #12
0
        public static void DW_PacketReceived(MessageData data)
        {
            var type  = data.Get <int>("type");
            var crypt = data.Get <bool>("crypt");

            if (type == 12 && crypt)
            {
                var packet = DWRouter.GetMessage(data);
                var call   = packet.ByteBuffer.ReadByte();

                switch (call)
                {
                case 6:
                    GetServerTime(data, packet);
                    break;

                default:
                    //DWRouter.Unknown(data, packet);
                    Log.Info("unknown packet " + call + " in bdTitleUtilities");
                    break;
                }
            }
        }
Exemple #13
0
        public static void Net_TcpDisconnected(MessageData data)
        {
            var cid = data.Get <string>("cid");

            _keys.Remove(cid);
            CIDToUser.Remove(cid);
            CIDToName.Remove(cid);
            CIDToTitle.Remove(cid);

            if (ConnectionsReverse.ContainsKey(cid))
            {
                Connections.Remove(ConnectionsReverse[cid]);
            }

            ConnectionsReverse.Remove(cid);
        }
Exemple #14
0
        private static void InviteToSession(MessageData mdata, DWMessage packet)
        {
            var sidBlob = packet.ByteBuffer.ReadBlob();
            var sid     = BitConverter.ToUInt64(sidBlob, 0);

            var attachment = packet.ByteBuffer.ReadBlob();

            var onlineIDs = new List <ulong>();

            while (packet.ByteBuffer.PeekByte() == 10)
            {
                onlineIDs.Add(packet.ByteBuffer.ReadUInt64());
            }

            foreach (var onlineID in onlineIDs)
            {
                try
                {
                    var ourID   = DWRouter.GetIDForData(mdata);
                    var ourName = DWRouter.CIDToName[mdata.Get <string>("cid")];
                    var theirID = DWRouter.Connections[onlineID];
                    var treply  = packet.MakeReply(2, false, theirID); // 2 is 'push message'
                    treply.ByteBuffer.Write((uint)6);
                    treply.ByteBuffer.Write(ourID);
                    treply.ByteBuffer.Write(ourName);
                    treply.ByteBuffer.WriteBlob(sidBlob);
                    treply.ByteBuffer.WriteBlob(attachment);
                    treply.Send(true);

                    Log.Debug("sent an invite to " + onlineID.ToString("X16") + " from " + ourID.ToString("X16"));
                }
                catch (Exception)
                {
                }
            }

            var reply = packet.MakeReply(1, false);

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)21);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((uint)0);
            reply.Send(true);
        }
Exemple #15
0
        private static void UpdateSession(MessageData mdata, DWMessage packet)
        {
            var sidBlob = packet.ByteBuffer.ReadBlob();
            var sid     = BitConverter.ToUInt64(sidBlob, 0);

            var titleID            = DWRouter.GetTitleIDForData(mdata);
            MatchMakingInfoT5 info = null;

            if (titleID == TitleID.T5)
            {
                info = new MatchMakingInfoT5();
            }
            else if (titleID == TitleID.IW5)
            {
                //info = new MatchMakingInfoIW5();
            }

            info.Deserialize(packet);
            info.SessionID   = sidBlob;
            info.CID         = mdata.Get <string>("cid");
            info.User        = (DWRouter.CIDToUser.ContainsKey(info.CID)) ? DWRouter.CIDToUser[info.CID] : 0;
            info.Reachable   = true;
            info.LastTouched = DateTime.Now;

            _sessions[sid] = info;

            if (titleID == TitleID.T5)
            {
                var tInfo = (MatchMakingInfoT5)info;
                Log.Debug(tInfo.OnlineID.ToString("X16") + " updated session (map " + tInfo.MapName + ", gametype " + tInfo.GameTypeName + ")");
            }
            else if (titleID == TitleID.IW5)
            {
                Log.Debug("Updated session.");
            }

            var reply = packet.MakeReply(1, false);

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)1);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((uint)0);
            reply.Send(true);
        }
Exemple #16
0
        private static void HandleClientAuth(MessageData data)
        {
            var packet = DWRouter.GetMessage(data);

            bool unknownBool;
            uint randomNumber;
            uint gameID;
            uint ticketLength;

            byte[] ticket;

            packet.BitBuffer.UseDataTypes = false;
            packet.BitBuffer.ReadBoolean(out unknownBool);
            packet.BitBuffer.UseDataTypes = true;

            packet.BitBuffer.ReadUInt32(out randomNumber);
            packet.BitBuffer.ReadUInt32(out gameID);
            packet.BitBuffer.ReadUInt32(out ticketLength);

            ticket = new byte[ticketLength];
            packet.BitBuffer.ReadBytes((int)ticketLength, out ticket);

            var cid = data.Get <string>("cid");

            // and the connection
            //var ci = TCPHandler.Connections.Find(c => c.ConnectionID == cid);

            var SourceSocket = cid.Split(':');
            // create state
            var state = new ClientAuthstate()
            {
                GameID  = gameID,
                Ticket  = ticket,
                Packet  = packet,
                Random  = randomNumber,
                OddBool = unknownBool,
                Source  = SourceSocket[0]
            };

            // start thread
            var thread = new Thread(DoClientAuth);

            thread.Start(state);
        }
Exemple #17
0
        private static void GetUserData(MessageData mdata, DWMessage packet)
        {
            var ip       = mdata.Get <string>("cid").Split(':')[0];
            var location = _geoIP.getLocation(ip);

            var reply = packet.MakeReply(1, false);

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)8);
            reply.ByteBuffer.Write(1);
            reply.ByteBuffer.Write(1);

            reply.ByteBuffer.Write(location.countryCode ?? "");
            reply.ByteBuffer.Write(location.countryName ?? "");
            reply.ByteBuffer.Write(location.regionName ?? "");
            reply.ByteBuffer.Write(location.city ?? "");
            reply.ByteBuffer.Write((float)location.latitude);
            reply.ByteBuffer.Write((float)location.longitude);

            reply.Send(true);
        }
Exemple #18
0
        public static void Net_TcpDisconnected(MessageData data)
        {
            try
            {
                var toRemove = new List <ulong>();

                lock (_sessions)
                {
                    foreach (var session in _sessions)
                    {
                        if (session.Value.CID == data.Get <string>("cid"))
                        {
                            toRemove.Add(session.Key);
                        }
                    }

                    foreach (var id in toRemove)
                    {
                        _sessions.Remove(id);
                    }
                }
            }
            catch { }
        }
Exemple #19
0
        public static void DW_PacketReceived(MessageData data)
        {
            var type  = data.Get <int>("type");
            var crypt = data.Get <bool>("crypt");

            var weHandle = ((type == 10) || (type == 18) || (type == 8 || (crypt && type == 28) || type == 50 || type == 4 || type == 58) || (type == 23));

            try
            {
                if (type == 10)
                {
                    var packet   = DWRouter.GetMessage(data);
                    var call     = packet.ByteBuffer.ReadByte();
                    var initTime = DateTime.Now;

                    switch (call)
                    {
                    case 1:
                        UploadFile(data, packet);
                        break;

                    case 3:
                        GetFile(data, packet);
                        break;

                    case 7:
                        GetPublisherFile(data, packet);
                        break;

                    default:
                        Log.Debug("unknown packet " + call + " in bdStorage");
                        DWRouter.Unknown(data, packet);
                        break;
                    }
                }
                else if (type == 18)
                {
                    try
                    {
                        var packet = DWRouter.GetMessage(data);
                        var reply  = packet.MakeReply(5, false);
                        reply.ByteBuffer.Write(new byte[] { 0x2d, 0xb3, 0xa2, 0x4f, 0x1a, 0x36, 0xd0, 0xd2, 0x00, 0x00, 0x04, 0x00, 0x00, 0xee, 0x02, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0xd0, 0x07, 0x00, 0x00, 0x10, 0x27, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0xf4, 0x01, 0x00, 0x00, 0x02, 0x0c, 0xd1, 0xaa, 0x7a, 0xb1, 0x31, 0xb1, 0xaa, 0x6b, 0x83, 0x51, 0x00, 0x00 });
                        reply.Send(true);
                    }
                    catch { }
                }
                else if (type == 8 || (crypt && type == 28) || type == 50 || type == 4 || type == 58)
                {
                    try
                    {
                        var packet = DWRouter.GetMessage(data);

                        try
                        {
                            var call = packet.ByteBuffer.ReadByte();
                            //Log.Debug("Service call identifier is " + call + ".");
                        }
                        catch { }

                        //DWRouter.Unknown(data, packet);
                    }
                    catch { }
                }
                else if (type == 23)
                {
                    try
                    {
                        var packet = DWRouter.GetMessage(data);
                        var call   = packet.ByteBuffer.ReadByte();

                        switch (call)
                        {
                        case 2:
                            GetCounterTotals(data, packet);
                            break;

                        default:
                            Log.Debug("unknown packet " + call + " in bdCounter");
                            //DWRouter.Unknown(data, packet);
                            break;
                        }
                    }
                    catch { }
                }

                /*else if (type != 12 && crypt)
                 * {
                 *  var packet = DWRouter.GetMessage(data);
                 *  DWRouter.Unknown(data, packet);
                 * }*/
            }
            catch (Exception e)
            {
                Log.Error(e.ToString());
            }

            if (weHandle)
            {
                var upacket = DWRouter.GetMessage(data);
            }
        }
Exemple #20
0
        public void handlePacket(MessageData data)
        {
            var buffer = data.Get <byte[]>("data");
            var source = data.Get <EndPoint>("source");

            var stream = new MemoryStream(buffer);
            var reader = new BinaryReader(stream);

            var time   = data.Get <DateTime>("time");
            var delay  = (DateTime.Now - time).TotalMilliseconds;
            var delay2 = DateTime.Now;

            try
            {
                while (stream.Position < stream.Length)
                {
                    var origin = 0;
                    var len    = 0;

                    if (_bytesRead == 0)
                    {
                        _totalBytes = 0;
                        try
                        {
                            _totalBytes = reader.ReadInt32();
                        }
                        catch
                        {
                            _totalBytes = 0;
                        }

                        //Log.Info("GOT A PACKET OF SIZE " + _totalBytes.ToString("X"));

                        if (_totalBytes == 0xC8)
                        {
                            _totalBytes = 0;
                            break;
                        }

                        if (_totalBytes > (256 * 1024))
                        {
                            Log.Error("LENGTH IS XBOX");
                            break;
                        }

                        if (_totalBytes == 0 || _totalBytes < 0)
                        {
                            //TCPHandler.sendPacket(message, client);
                            MessageData packet = new MessageData("none");
                            packet["data"] = new byte[4];
                            packet["cid"]  = data.Get <string>("cid");
                            TCPHandler.Net_TcpSend(packet);
                            continue;
                        }

                        _messageBuffer = new MemoryStream();

                        origin += 4;
                        len    -= 4;
                    }

                    len += Math.Min((buffer.Length - (int)stream.Position), (_totalBytes - _bytesRead));

                    var newBytes = reader.ReadBytes(len);
                    _messageBuffer.Write(newBytes, 0, len);
                    _bytesRead += len;

                    if (_bytesRead > _totalBytes)
                    {
                        //Debugger.Break();
                    }

                    if (_bytesRead >= _totalBytes)
                    {
                        _bytesRead = 0;
                        _messageBuffer.Position = 0;

                        var breader = new BinaryReader(_messageBuffer);

                        _totalBytes--;
                        var    pdtype    = breader.ReadByte();
                        var    encrypted = (pdtype == 1); // can be 0, 1 and 0xFF
                        var    ptype     = 0xFF;
                        byte[] pdata     = null;

                        if (pdtype == 0xFF)
                        {
                            // TODO: handle this one
                            Log.Debug("Got a 0xFF pdtype!");
                            //return;
                            continue;
                        }
                        var initTime = DateTime.Now;

                        if (!encrypted)
                        {
                            ptype        = breader.ReadByte();
                            _totalBytes -= 1;

                            pdata = breader.ReadBytes(_totalBytes);
                        }
                        else
                        {
                            try
                            {
                                var key   = GetGlobalKey(data);
                                var iv    = DWCrypto.CalculateInitialVector(breader.ReadUInt32());
                                var edata = breader.ReadBytes(_totalBytes - 4);
                                var ddata = DWCrypto.Decrypt(iv, key, edata);

                                var dstream = new MemoryStream(ddata);
                                var dreader = new BinaryReader(dstream);

                                // TODO: find out why this hash isn't just truncated SHA-1
                                var hash = dreader.ReadUInt32();

                                ptype = dreader.ReadByte();
                                pdata = dreader.ReadBytes((int)(dstream.Length - 5));

                                dreader.Close();
                                dstream.Close();
                            }
                            catch { }
                        }
                        var initTime2 = DateTime.Now;
                        var delay3    = (DateTime.Now - delay2).TotalMilliseconds;
                        //Log.Debug("Received a " + _totalBytes + " byte packet (type " + ptype + ") from DemonWare - delay " + delay + "ms. delay after reading " + delay3 + "ms.");

                        /*
                         * var message = Messages.NewMessage("dw.packet-received");
                         * message["data"] = pdata;
                         * message["type"] = ptype;
                         * message["crypt"] = encrypted;
                         * message["source"] = source;
                         * message["cid"] = data["cid"];
                         * message["delay"] = delay;
                         * message["time"] = DateTime.Now;
                         * message.SendNow();
                         */
                        MessageData message = new MessageData("none");
                        message["data"]   = pdata;
                        message["type"]   = ptype;
                        message["crypt"]  = encrypted;
                        message["source"] = source;
                        message["cid"]    = data["cid"];
                        message["ci"]     = data["ci"];
                        message["delay"]  = delay;
                        message["time"]   = DateTime.Now;
                        redirectPacket(message);

                        /*var msec = (int)((DateTime.Now - initTime).TotalMilliseconds);
                         * var state = GetPerfState(ptype);
                         * state.Add(msec);
                         *
                         * msec = (int)((DateTime.Now - initTime2).TotalMilliseconds);
                         * var state2 = GetPerfState(ptype + 1000);
                         * state2.Add(msec);
                         *
                         * Log.Debug("service " + ptype + " min " + state.Min + "/" + state2.Min + " max " + state.Max + "/" + state2.Max);*/
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex.ToString());

                // disconnect to prevent further pollution of system
                TCPHandler.ForceDisconnect(data);
            }

            reader.Close();
        }
Exemple #21
0
        public static void DW_PacketReceived(MessageData data)
        {
            var type = data.Get <int>("type");

            if (type == 7)
            {
                var packet = DWRouter.GetMessage(data);

                bool   initialBool;
                uint   gameID, randomNumber;
                byte[] ticket;

                packet.BitBuffer.UseDataTypes = false;
                packet.BitBuffer.ReadBoolean(out initialBool);
                packet.BitBuffer.UseDataTypes = true;

                packet.BitBuffer.ReadUInt32(out gameID);
                packet.BitBuffer.ReadUInt32(out randomNumber);

                packet.BitBuffer.ReadBytes(128, out ticket);

                // parse LSG ticket
                var key = DWTickets.GetKeyFromLSGTicket(ticket);
                DWRouter.SetGlobalKey(packet.Data, key);

                lock (DWRouter.Connections)
                {
                    var id = DWTickets.GetIDFromLSGTicket(ticket);
                    DWRouter.Connections[id] = packet.Data.Get <string>("cid");
                }

                lock (DWRouter.CIDToUser)
                {
                    var id = DWTickets.GetUserFromLSGTicket(ticket);
                    DWRouter.CIDToUser[packet.Data.Get <string>("cid")] = id;
                }

                lock (DWRouter.ConnectionsReverse)
                {
                    var id = DWTickets.GetIDFromLSGTicket(ticket);
                    DWRouter.ConnectionsReverse[packet.Data.Get <string>("cid")] = id;
                }

                lock (DWRouter.CIDToName)
                {
                    var name = DWTickets.GetNameFromLSGTicket(ticket);
                    DWRouter.CIDToName[packet.Data.Get <string>("cid")] = name;
                }

                lock (DWRouter.CIDToTitle)
                {
                    var title = (TitleID)gameID;
                    DWRouter.CIDToTitle[packet.Data.Get <string>("cid")] = title;
                }

                // now make a reply.

                /*
                 * var reply = packet.MakeReply(1, false);
                 * reply.ByteBuffer.Write(0x8000000000000000);
                 * reply.ByteBuffer.Write(0);
                 * reply.ByteBuffer.Write((byte)6);
                 * reply.ByteBuffer.Write(1);
                 * reply.ByteBuffer.Write(1);
                 * reply.ByteBuffer.Write(0x12345678);
                 * reply.Send(true);*/
            }
        }
Exemple #22
0
        /*void DoReceive(SocketAsyncEventArgs args)
         * {
         *  var client = (TCPClient)args.UserToken;
         *
         *  while (!client.socket.ReceiveAsync(args))
         *  {
         *      Log.Debug("Handling stuff - " + client.ConnectionID);
         *      HandleReceive(args);
         *  }
         * }*/

        public static void ForceDisconnect(MessageData message)
        {
            _instance.CloseSocket(message.Get <TCPClient>("ci").readEventArgs);
        }
Exemple #23
0
        private void redirectPacket(MessageData data)
        {
            data.Arguments["handled"] = false;

            var  type   = data.Get <int>("type");
            var  crypt  = data.Get <bool>("crypt");
            bool routed = false;

            try
            {
                if (!crypt && (type == 28 || type == 12 || type == 26))
                {
                    DWAuther.DW_PacketReceived(data);
                    routed = true;
                    //Log.Debug("got auth packet");
                }
                if (crypt && type == 28)
                {
                    DWGroups.DW_PacketReceived(data);
                    routed = true;
                }
                if (type == 7)
                {
                    DWLobby.DW_PacketReceived(data);
                    routed = true;
                    //Log.Debug("got lobby packet");
                }
                if (type == 6)
                {
                    DWMessaging.DW_PacketReceived(data);
                    routed = true;
                    //Log.Debug("got service packet");
                }
                if (type == 21)
                {
                    DWMatch.DW_PacketReceived(data);
                    routed = true;
                    //Log.Debug("got match packet");
                }
                if ((type == 10) || (type == 18) || (type == 23) || (type == 8 || type == 50 || type == 4 || type == 58))
                {
                    DWStorage.DW_PacketReceived(data);
                    routed = true;
                    //Log.Debug("got storage packet");
                }
                if (type == 12 && crypt)
                {
                    DWTitles.DW_PacketReceived(data);
                    routed = true;
                    //Log.Debug("got Title packet");
                }
                if (type == 8)
                {
                    DWProfiles.DW_PacketReceived(data);
                    routed = true;
                }
                if (type == 27)
                {
                    DWDML.DW_PacketReceived(data);
                }
                if (type == 67)
                {
                    DWEventLog.DW_PacketReceived(data);
                }
            }
            catch (Exception e)
            {
                Log.Error("Exception: " + e.ToString());
            }

            /*if(routed == false)
             * {
             *  Log.Debug("UNHANDLED PACKET: " + type);
             * }*/

            try
            {
                if (crypt && !data.Get <bool>("handled"))
                {
                    DWRouter.Unknown(data, DWRouter.GetMessage(data));
                }
            }
            catch
            {
                Log.Error("UNKNOWN FAILED, THIS CONNECTION CAN BE CONSIDERED DEAD.");

                // disconnect to prevent pollution of system
                TCPHandler.ForceDisconnect(data);
            }
        }
Exemple #24
0
        private static void CreateSession(MessageData mdata, DWMessage packet)
        {
            Net_TcpDisconnected(mdata);
            var    seed = 0;
            string IP   = mdata.Get <string>("cid");

            string[] IPParts = IP.Split(':');
            seed = BitConverter.ToInt32(IPAddress.Parse(IPParts[0]).GetAddressBytes(), 0);
            TimeSpan ts = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0));

            seed += (int)ts.TotalSeconds;

            var rnd = new Random(seed);
            var sid = new byte[8];

            rnd.NextBytes(sid);

            var titleID            = DWRouter.GetTitleIDForData(mdata);
            MatchMakingInfoT5 info = null;

            if (titleID == TitleID.T5)
            {
                info = new MatchMakingInfoT5();
            }
            else if (titleID == TitleID.IW5)
            {
                //info = new MatchMakingInfoIW5();
            }

            info.Deserialize(packet);
            info.SessionID = sid;
            info.CID       = mdata.Get <string>("cid");
            info.User      = (DWRouter.CIDToUser.ContainsKey(info.CID)) ? DWRouter.CIDToUser[info.CID] : 0;
            info.Reachable = true;

            lock (_sessions)
            {
                //Delete old sessions
                int deleted = 0;
                foreach (var session in _sessions)
                {
                    if (session.Value.User == info.User)
                    {
                        _sessions.Remove(session.Key);
                        deleted++;
                    }
                }

                /*
                 * var duplicateValues = _sessions.GroupBy(x => x.Value).Where(x => x.Count() > 1);
                 *
                 * foreach (var dupSession in _sessions)
                 * {
                 *  _sessions.Remove(dupSession.Key);
                 *  deleted++;
                 * }
                 */

                Console.WriteLine("Deleted {0} old sessions whilst making a new one...", deleted);

                _sessions.Add(BitConverter.ToUInt64(sid, 0), info);
            }

            var reply = packet.MakeReply(1, false);

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)1);
            reply.ByteBuffer.Write((uint)1);
            reply.ByteBuffer.Write((uint)1);
            reply.ByteBuffer.WriteBlob(info.SessionID);
            reply.Send(true);

            if (titleID == TitleID.T5)
            {
                var tInfo = (MatchMakingInfoT5)info;
                Log.Debug(tInfo.OnlineID.ToString("X16") + " registered session (map " + tInfo.MapName + ", gametype " + tInfo.GameTypeName + ")");
            }
            else if (titleID == TitleID.IW5)
            {
                Log.Debug("Registered session.");
            }
        }
Exemple #25
0
        private static void FindSessionByIP(MessageData mdata, DWMessage packet, uint address, ushort port)
        {
            IEnumerable <KeyValuePair <ulong, bdMatchMakingInfo> > matchingSessions = null;

            var reply = packet.MakeReply(1, false);

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)13);

            lock (_sessions)
            {
                matchingSessions = (from session in _sessions
                                    where (session.Value.TitleID == TitleID.T5 && session.Value.IPAddress == address && session.Value.Port == port) || (mdata.Get <IPEndPoint>("source").Address.Address == session.Value.IPAddress && session.Value.InternalIPAddress == address && session.Value.InternalPort == port)
                                    select session).Take(1);
                reply.ByteBuffer.Write((uint)matchingSessions.Count());
                reply.ByteBuffer.Write((uint)matchingSessions.Count());
                foreach (var session in matchingSessions)
                {
                    session.Value.Serialize(reply);
                }
            }
            reply.Send(true);

            Console.WriteLine("get ip {0} returned {1} sessions", address, matchingSessions.Count());
        }
Exemple #26
0
        public static void DW_PacketReceived(MessageData data)
        {
            var type  = data.Get <int>("type");
            var crypt = data.Get <bool>("crypt");

            if (type == 21)
            {
                var packet = DWRouter.GetMessage(data);
                var call   = packet.ByteBuffer.ReadByte();

                try
                {
                    switch (call)
                    {
                    case 1:
                        CreateSession(data, packet);
                        break;

                    case 2:
                        UpdateSession(data, packet);
                        break;

                    case 3:
                        DeleteSession(data, packet);
                        break;

                    case 4:
                        FindSessionFromID(data, packet);
                        break;

                    case 5:
                        FindSessions(data, packet);
                        break;

                    case 8:
                        InviteToSession(data, packet);
                        break;

                    case 9:
                        SubmitPerformance(data, packet);
                        break;

                    case 10:
                        GetPerformanceValues(data, packet);
                        break;

                    case 12:
                        UpdateSessionPlayers(data, packet);
                        break;

                    case 13:
                        FindSessionsPaged(data, packet);
                        break;

                    case 14:
                        FindSessionsByEntityIDs(data, packet);
                        break;

                    default:
                        Log.Debug("unknown packet " + call + " in bdMatchMaking");
                        //DWRouter.Unknown(data, packet);
                        break;
                    }
                }
                catch (Exception e)
                {
                    Log.Error(e.ToString());
                }
            }
        }