예제 #1
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());
                }
            }
        }
예제 #2
0
        private static void HandleIW5ServerAuth(MessageData data, int type)
        {
            var packet = DWRouter.GetMessage(data);

            bool unknownBool;
            uint randomNumber;
            uint gameID;

            byte[] rsaKeyBuf = new byte[1120 / 8];

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

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

            // create state
            var state = new IW5ServerAuthstate()
            {
                GameID  = gameID,
                Packet  = packet,
                Random  = randomNumber,
                OddBool = unknownBool
            };

            if (type == 26)
            {
                packet.BitBuffer.Read(1120, rsaKeyBuf);

                // start thread
                var thread = new Thread(CreateIW5ServerKey);
                thread.Start(state);
            }
        }
예제 #3
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.");
            }
        }
예제 #4
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;
            }
        }
예제 #5
0
        private static void SendGlobalInstantMessage(MessageData mdata, DWMessage packet)
        {
            var bdOnlineID = packet.ByteBuffer.ReadUInt64();
            var data       = packet.ByteBuffer.ReadBlob();

            // route the message to the target user
            if (DWRouter.Connections.ContainsKey(bdOnlineID))
            {
                try
                {
                    //var ourID = (from conn in DWRouter.Connections
                    //             where conn.Value == mdata.Get<string>("cid")
                    //             select conn.Key).FirstOrDefault();
                    var ourID = DWRouter.GetIDForData(mdata);

                    var cid    = DWRouter.Connections[bdOnlineID];
                    var treply = packet.MakeReply(2, false, cid); // 2 is 'push message'
                    treply.ByteBuffer.Write((uint)21);
                    treply.ByteBuffer.Write(ourID);
                    treply.ByteBuffer.Write("someone");
                    treply.ByteBuffer.WriteBlob(data);
                    treply.Send(true);
                    Log.Verbose("sent an instant message to " + bdOnlineID.ToString("X16") + " from " + ourID.ToString("X16"));
                }
                catch
                {
                    var reply2 = packet.MakeReply(1, false);
                    reply2.ByteBuffer.Write(0x8000000000000001);
                    reply2.ByteBuffer.Write((uint)0);
                    reply2.ByteBuffer.Write((byte)14);
                    reply2.ByteBuffer.Write((uint)0);
                    reply2.ByteBuffer.Write((uint)0);
                    reply2.Send(true);
                    return;
                }
            }

            // note: we shouldn't force success, but there's no clear error list yet
            var reply = packet.MakeReply(1, false);

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)14);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((uint)0);
            reply.Send(true);
        }
예제 #6
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);
        }
예제 #7
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);
        }
예제 #8
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);
        }
예제 #9
0
        public static void Net_TcpDisconnected(MessageData data)
        {
            /*ulong userID = 0;
             *
             * lock (DWRouter.Connections)
             * {
             *  userID = (from conn in DWRouter.Connections
             *            where conn.Value == data.Get<string>("cid")
             *            select conn.Key).FirstOrDefault();
             * }*/

            ulong userID = DWRouter.GetIDForData(data);;

            if (userID == 0)
            {
                return;
            }

            RemoveUserGroups(userID);
        }
예제 #10
0
        private static void SetPublicInfo(MessageData data, DWMessage packet)
        {
            var profileInfo = new PublicProfileInfo();

            profileInfo.Deserialize(packet);

            /*ulong user = 0;
             * lock (DWRouter.Connections)
             * {
             *  user = (from conn in DWRouter.Connections
             *          where conn.Value == data.Get<string>("cid")
             *          select conn.Key).FirstOrDefault();
             * }*/
            ulong user = DWRouter.GetIDForData(data);

            var existing = Database.APublicProfile.Find(Query.EQ("user_id", (int)(user & 0xFFFFFFFF)));
            var item     = new PublicProfile();

            if (existing.Count() > 0)
            {
                item = existing.First();
            }

            item.user_id      = (int)(user & 0xFFFFFFFF);
            item.profile_int  = profileInfo.UnknownInt;
            item.profile_blob = profileInfo.ProfileData;
            item.blobsize     = profileInfo.ProfileData.Length;

            Database.APublicProfile.Save(item);


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

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)8);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((uint)0);
            reply.Send(true);
        }
예제 #11
0
        public void Send(bool encrypted)
        {
            var buffer = (BitBuffer != null) ? BitBuffer.Bytes : ByteBuffer.Bytes;

            byte[] array = null;

            if (!encrypted)
            {
                array = new byte[buffer.Length + 6];
                Array.Copy(BitConverter.GetBytes(buffer.Length + 2), 0, array, 0, 4);
                array[4] = 0;
                array[5] = (byte)Data.Get <int>("type");
                Array.Copy(buffer, 0, array, 6, buffer.Length);
            }
            else
            {
                array = new byte[buffer.Length + 4 + 4 + 1];
                Array.Copy(BitConverter.GetBytes(buffer.Length + 5), 0, array, 0, 4);
                array[4] = 1;
                Array.Copy(BitConverter.GetBytes(0x13371337), 0, array, 5, 4);

                var iv  = DWCrypto.CalculateInitialVector(0x13371337);
                var key = DWRouter.GetGlobalKey(Data);

                var crypted = DWCrypto.Encrypt(iv, key, buffer);
                Array.Resize(ref array, crypted.Length + 4 + 4 + 1);

                Array.Copy(BitConverter.GetBytes(array.Length - 4), 0, array, 0, 4);
                Array.Copy(crypted, 0, array, 9, crypted.Length);
            }

            //Log.Debug("sending a reply");
            Data.Arguments["handled"] = true;

            MessageData message = new MessageData("none");

            message["data"] = array;
            message["cid"]  = Data["cid"];
            TCPHandler.Net_TcpSend(message);
        }
예제 #12
0
        private static void HandleServerAuth(MessageData data)
        {
            var packet = DWRouter.GetMessage(data);

            bool unknownBool;
            uint randomNumber;
            uint gameID;

            byte[] keyDataBuf = new byte[8];

            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.Read(64, keyDataBuf);

            // create state
            var state = new ServerAuthstate()
            {
                GameID  = gameID,
                KeyData = BitConverter.ToUInt64(keyDataBuf, 0),
                Packet  = packet,
                Random  = randomNumber,
                OddBool = unknownBool
            };

            // start thread
            if (Program.Game == TitleID.T5)
            {
                var thread = new Thread(DoServerAuth);
                thread.Start(state);
            }
            else if (Program.Game == TitleID.IW5)
            {
                var thread = new Thread(DoIW5ServerAuth);
                thread.Start(state);
            }
        }
예제 #13
0
        private static void SetGroups(MessageData data, DWMessage packet)
        {
            ulong userID = DWRouter.GetIDForData(data);

            /*lock (DWRouter.Connections)
             * {
             *  userID = (from conn in DWRouter.Connections
             *            where conn.Value == data.Get<string>("cid")
             *            select conn.Key).FirstOrDefault();
             * }*/

            RemoveUserGroups(userID);

            packet.ByteBuffer.DataTypePackingEnabled = true;
            var a     = packet.ByteBuffer.ReadByte();   // 108
            var b     = packet.ByteBuffer.ReadUInt32(); // count * 4
            var count = packet.ByteBuffer.ReadUInt32();

            var groups = new List <GroupUser>();

            for (int i = 0; i < count; i++)
            {
                groups.Add(new GroupUser()
                {
                    groupID = (int)packet.ByteBuffer.ReadUInt32(), userID = (long)userID
                });
            }

            Database.AGroupUser.InsertBatch(groups);

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

            reply.ByteBuffer.Write(0x8000000000000001);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((byte)28);
            reply.ByteBuffer.Write((uint)0);
            reply.ByteBuffer.Write((uint)0);
            reply.Send(true);
        }
예제 #14
0
        private static void GetFile(MessageData mdata, DWMessage packet)
        {
            var filename = packet.ByteBuffer.ReadString();
            var user     = packet.ByteBuffer.ReadUInt64();

            if (user == 0)
            {
                user = DWRouter.GetIDForData(mdata);
            }

            var path = filename + "_" + user.ToString("x16");
            var e    = r.Next(1, 164);

            Log.Debug("Trying to send " + path + "... (originID " + e + ")");

            var query = Query.EQ("filename", path);
            var files = Database.AFiles.Find(query);

            if (files.Count() > 0)
            {
                var file  = files.First();
                var reply = packet.MakeReply(1, false);
                reply.ByteBuffer.Write(0x8000000000000001);
                reply.ByteBuffer.Write((uint)0);
                reply.ByteBuffer.Write((byte)7);
                reply.ByteBuffer.Write((uint)1);
                reply.ByteBuffer.Write((uint)1);
                reply.ByteBuffer.WriteBlob(file.data);
                reply.Send(true);
            }
            else
            {
                var reply = packet.MakeReply(1, false);
                reply.ByteBuffer.Write(0x8000000000000001);
                reply.ByteBuffer.Write((uint)0x3E8);
                reply.Send(true);
            }
        }
예제 #15
0
        void CloseSocket(SocketAsyncEventArgs e)
        {
            try
            {
                var client = (TCPClient)e.UserToken;
                lock (_clients)
                {
                    _clients.Remove(client.ConnectionID);
                }

                MessageData message = new MessageData("none");
                message["source"] = client.socket.RemoteEndPoint;
                message["cid"]    = client.ConnectionID;

                try
                {
                    DWMatch.Net_TcpDisconnected(message);
                    DWGroups.Net_TcpDisconnected(message);
                    DWRouter.Net_TcpDisconnected(message);
                }
                catch (Exception ex)
                {
                    Log.Error(ex.ToString());
                }

                try
                {
                    client.socket.Shutdown(SocketShutdown.Both);
                }
                catch { }

                client.socket.Close();
            }
            catch (Exception ex)
            {
                Log.Error(ex.ToString());
            }
        }
예제 #16
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;
                }
            }
        }
예제 #17
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());
                }
            }
        }
예제 #18
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);
            }
        }
예제 #19
0
        private static void UploadFile(MessageData mdata, DWMessage packet)
        {
            var filename = packet.ByteBuffer.ReadString();
            var test     = packet.ByteBuffer.ReadBool();
            var data     = packet.ByteBuffer.ReadBlob();
            // NOTE: AN UINT64 MIGHT FOLLOW HERE. THIS COULD BE USED BY DEDICATED SERVER-STYLE LICENSES FOR WRITING USER STATS.
            var user = (ulong)0;

            try
            {
                user = packet.ByteBuffer.ReadUInt64();
            }
            catch { }

            if (user == 0)
            {
                /*lock (DWRouter.Connections)
                 * {
                 *  user = (from conn in DWRouter.Connections
                 *          where conn.Value == mdata.Get<string>("cid")
                 *          select conn.Key).FirstOrDefault();
                 * }*/
                user = DWRouter.GetIDForData(mdata);
            }
            //var user = 0x1100001ded1ca7e;//packet.ByteBuffer.ReadUInt64();
            var path = filename + "_" + user.ToString("x16");

            /*MySqlDataReader query = Database.Query("SELECT * FROM files WHERE filename='" + path + "'");
             * if (query.HasRows)
             * {
             *  query.Close();
             *  Log.Debug("Trying to update " + path + "... for user ");
             *  Database.UploadQuery("UPDATE files SET data = ?filedata, filesize = '" + data.Length + "', userid='" + Convert.ToString((int)user) + "' WHERE filename='" + path + "'", data);
             * }
             * else
             * {
             *  query.Close();
             *  Log.Debug("Trying to write " + path + "... for user ");
             *  Database.UploadQuery("INSERT INTO files(userid, filename, data, filesize) VALUES('" + Convert.ToString((int)user) + "', '" + path + "', ?filedata, '" + data.Length + "')", data);
             * }*/

            Log.Debug("Trying to write " + path + "...");

            var file = new File()
            {
                filename = path,
                userid   = (int)user,
                filesize = data.Length,
                data     = data
            };

            var query = Query.EQ("filename", path);
            var files = Database.AFiles.Find(query);

            if (files.Count() > 0)
            {
                file.id = files.First().id;
            }

            Database.AFiles.Save(file);


            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);
        }
예제 #20
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);
            }
        }
예제 #21
0
        static void Main(string[] args)
        {
            Log.Initialize("DWServer.log", LogLevel.Data | LogLevel.Info | LogLevel.Error | LogLevel.Debug | LogLevel.Verbose, true);
            Log.Info("Starting DW server");

            var game = (args.Length == 1) ? args[0] : "t5";

            if (game == "t5")
            {
                Game = TitleID.T5;
            }
            else if (game == "iw5")
            {
                Game = TitleID.IW5;
            }

            /*
             * TCPHandler ipServer = new TCPHandler(3074);
             * ipServer.Start();
             * TCPHandler ipServer3 = new TCPHandler(3077);
             * ipServer3.Start();
             */
            Database.Initialize();
            DWRouter.OnStart();
            //TCPHandler.OnStart();

            var handler = new TCPHandler();

            //default: 3074, deviain
            handler.Start((game == "t5") ? 3074 : 3078);

            Heatmap.StartThread();

            HttpHandler.Start();

            /*MessageData server2 = new MessageData("none");
             * server2.Arguments["name"] = "demonware2";
             * server2.Arguments["port"] = (int)3077;
             * TCPHandler.Net_TcpListen("none", server2);*/

            new Thread(() =>
            {
                while (true)
                {
                    Thread.Sleep(30000);

                    try
                    {
                        DWMatch.CleanSessions();
                    }
                    catch (Exception e)
                    {
                        Log.Error(e.ToString());
                    }
                }
            }).Start();

            new Thread(() =>
            {
                while (true)
                {
                    Thread.Sleep(30000);//30000

                    try
                    {
                        DWGroups.updateCache();
                    }
                    catch (Exception e)
                    {
                        Log.Error(e.ToString());
                    }
                }
            }).Start();

            while (true)
            {
                try
                {
                    Log.WriteAway();
                }
                catch (Exception e) { Log.Error(e.ToString()); }

                Thread.Sleep(1000);
            }
        }
예제 #22
0
        private static void FindSessions(MessageData mdata, DWMessage packet)
        {
            var queryType = packet.ByteBuffer.ReadUInt32(); // query type
            var vb        = packet.ByteBuffer.ReadUInt32(); // seems to be 0
            var count     = packet.ByteBuffer.ReadUInt32();

            var titleID = DWRouter.GetTitleIDForData(mdata);

            if (titleID == TitleID.T5)
            {
                if (queryType == 2)
                {
                    FindZombieSessions(mdata, packet);
                }
                else if (queryType == 4)
                {
                    // technically a UInt64, but we don't seem to like bit shifting :)
                    packet.ByteBuffer.ReadDataType(10);
                    var portbytes = packet.ByteBuffer.Read(2);
                    var ipbytes   = packet.ByteBuffer.Read(4);
                    var port      = BitConverter.ToUInt16(portbytes, 0);
                    var address   = BitConverter.ToUInt32(ipbytes, 0);
                    packet.ByteBuffer.Read(2);

                    FindSessionByIP(mdata, packet, address, port);
                }
            }
            else if (titleID == TitleID.IW5)
            {
                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);

                Func <MatchMakingInfoIW5, bool> condition = null;

                /*switch (queryType)
                 * {
                 *  case 1:
                 *
                 *      break;
                 * }*/
                var a = packet.ByteBuffer.ReadInt32();
                var e = packet.ByteBuffer.ReadInt32();

                condition = info =>
                {
                    return(info.Playlist == e);
                };

                var rand = new Random();

                lock (_sessions)
                {
                    matchingSessions = (from session in _sessions
                                        where (session.Value.TitleID == TitleID.IW5 &&
                                               condition((MatchMakingInfoIW5)session.Value))
                                        orderby rand.Next()
                                        select session).Take((int)count);
                    reply.ByteBuffer.Write((uint)matchingSessions.Count());
                    reply.ByteBuffer.Write((uint)matchingSessions.Count());
                    foreach (var session in matchingSessions)
                    {
                        session.Value.Serialize(reply);
                    }
                }

                reply.Send(true);
            }
        }
예제 #23
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.");
            }
        }
예제 #24
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);*/
            }
        }