示例#1
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            byte locale = pck.ReadUInt8();
            string username = pck.ReadAscii();
            string password = pck.ReadAscii();
            ushort ServerID = pck.ReadUInt16();

            if (Global.EnableServerInspection && !Global.InspectionLoginIgnore.Contains(username))
            {
                Packet login_response = new Packet(0xA102, false);
                login_response.WriteUInt8(0x02);
                login_response.WriteUInt8(0x02);
                login_response.WriteUInt8(0x02);
                session.SendPacketToClient(login_response);

                return PacketProcessResult.Disconnect;
            }

            if (Global.EnableIpAccountLimitation)
            {
                //We use Utility.GetRemoteEpString because username is assigned after AgentServer.UserAuth
                string clientAddr = Utility.GetRemoteEpString(session.Arguments.ClientSocket);
                int connectionCount = Global.srvmgr.GetUserCountByIpForAgent(clientAddr);

                if (connectionCount >= Global.AccountIpLimitCount)
                {
                    Packet login_resp = new Packet(0xA102, false);
                    login_resp.WriteUInt8(0x02);
                    login_resp.WriteUInt8(12);
                    session.SendPacketToClient(login_resp);

                    return PacketProcessResult.Disconnect;
                }
            }

            int serverOnline = 0;
            int.TryParse(session.State["server_" + ServerID] as string, out serverOnline);
            if (Global.ShardMaxOnline > 0 && Global.ShardMaxOnline <= serverOnline)
            {
                Packet login_response = new Packet(0xA102, false);
                login_response.WriteUInt8(0x02);
                login_response.WriteUInt8(5);
                session.SendPacketToClient(login_response);
                return PacketProcessResult.Disconnect;
            }

            if (Global.EnableLoginProcessing)
            {

                Packet login = new Packet(0x6102);
                login.WriteUInt8(Global.OriginalLocale > 0 && locale > 0 ? Global.OriginalLocale : locale);
                login.WriteAscii(username);
                login.WriteAscii(Global.EnableUseSha1Salt ? Utility.HashPassword(username, password) : password);
                login.WriteUInt16(ServerID);
                session.SendPacketToModule(login);
                //return PacketProcessResult.DoNothing;
                return PacketProcessResult.ContinueLoop;
            }
            return PacketProcessResult.DoNothing;
        }
示例#2
0
 public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
 {
     string name = pck.ReadAscii();
     session.State["charname"] = name;
     session.State["level"] = Global.dbmgr.getCharLvl(name);
     return PacketProcessResult.DoNothing;
 }
示例#3
0
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.EnableArenaStatusNotify)
            {
                if (pck.ReadInt8() == 9)
                {
                    pck.ReadInt8();
                    int status = pck.ReadInt8();
                    string cname = session.State["charname"] as string;

                    //передаем в базу данные о статусе боя
                    Global.dbmgr.AnticheatArenaStatusNotify(cname, status);
                    if (status == 1)
                    {
                        //Вам бЫли начислены очки славы textu'system lel ye perfect.
                        session.SendClientNotice("UIIT_STT_ANTICHEAT_ADDED_HONOR_POINT");
                    }
                    else
                    {
                        //Вы потеряли очки славы
                        session.SendClientNotice("UIIT_STT_ANTICHEAT_MISSING_HONOR_POINT");
                    }

                }
            }

            return PacketProcessResult.DoNothing;
        }
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.UseSafeRegion)
            {
                bool isSafe = false;
                bool.TryParse(session.State["isSafe"] as string, out isSafe);

                bool isBot = false;
                bool.TryParse(session.State["isBot"] as string, out isBot);

                //Запрет использования скилов в регионе
                if (isSafe)
                {
                    if (pck.ReadUInt8() == 1)
                    {
                        //запрет на использование скилов и (обычная атака ==1)
                        if (pck.ReadUInt8() == 4)
                        {
                            session.SendClientNotice("UIIT_STT_ANTICHEAT_USE_SKILL");
                            return PacketProcessResult.ContinueLoop;
                        }
                    }

                }

            }
            return PacketProcessResult.DoNothing;
        }
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            int level = 0;
            int.TryParse(session.State["level"] as string, out level);
            if(Global.ArenaRegistrationLevel > level && Global.ArenaRegistrationLevel > 0)
            {
                session.SendClientNotice("UIIT_STT_ANTICHEAT_ARENA_LEVEL");
                return PacketProcessResult.ContinueLoop;
            }

            if (Global.DisableBotArenaRegistration)
            {
                bool isBot = false;
                bool.TryParse(session.State["isBot"] as string, out isBot);

                //регистрация на арену
                if (isBot)
                {
                    session.SendClientNotice("UIIT_STT_ANTICHEAT_USE_FUNCTION");
                    return PacketProcessResult.ContinueLoop;
                }

            }
            return PacketProcessResult.DoNothing;
        }
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.FixWaterTampleTeleport)
            {
                pck.ReadUInt32();
                byte teleport_type = pck.ReadUInt8();
                if (teleport_type == 2)
                {
                    uint teleport_id = pck.ReadUInt32();
                    string cname = session.State["charname"] as string;

                    if (cname.Length == 0)
                    {
                        Global.logmgr.WriteLog(LogLevel.Warning, "charname len == 0 ! (teleport fix)");
                        return PacketProcessResult.ContinueLoop;
                    }
                    //проверка прав доступа на второй уровень
                    if (teleport_id == 166 || teleport_id == 167)
                    {
                        if (Global.dbmgr.AnticheatCheckTeleportAccess(cname, (int)teleport_id) == 0)
                        {
                            session.SendClientNotice("UIIT_STT_ANTICHEAT_TELEPORT_TAMPLE");
                            return PacketProcessResult.ContinueLoop;
                        }

                    }
                }

            }

            return PacketProcessResult.DoNothing;
        }
        //-----------------------------------------------------------------------------

        public SilkroadServer CreateNew(string bind_addr, int bind_port, string module_addr, int module_port, ServerType srvtype, bool blowfish, bool sec_bytes, bool handshake, PacketDispatcher packetProcessor, DelayedPacketDispatcher delayedPacketDispatcher, List <RedirectRule> redirs = null)
        {
            if (BindExists(bind_addr, bind_port))
            {
                Global.logmgr.WriteLog(LogLevel.Error, "Server with given bind address already exists [{0}:{1}]", bind_addr, bind_port);
                return(null);
            }
            try
            {
                SilkroadServer ServerItem =
                    new SilkroadServer(
                        new IPEndPoint(IPAddress.Parse(bind_addr), bind_port),
                        new IPEndPoint(IPAddress.Parse(module_addr), module_port),
                        srvtype,
                        blowfish,
                        sec_bytes,
                        handshake,
                        packetProcessor,
                        delayedPacketDispatcher,
                        redirs
                        );

                m_servers.Add(ServerItem);
                ServerItem.Start();
                return(ServerItem);
            }
            catch
            {
                Global.logmgr.WriteLog(LogLevel.Error, "ServerManager failed to start server, SilkroadServer start error");
            }
            return(null);
        }
 public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
 {
     if (Global.DisableAcademyInvite)
     {
         session.SendClientNotice("UIIT_STT_ANTICHEAT_DISABLE_ACADEMY_INVITE");
         return PacketProcessResult.ContinueLoop;
     }
     return PacketProcessResult.DoNothing;
 }
示例#9
0
 public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
 {
     string charname = session.State["charname"] as string;
     if (Global.MaxGuildInUnion > 0 && Global.dbmgr.GuildMembers(charname, 2, Global.MaxGuildInUnion) == 0)
     {
         session.SendClientNotice("UIIT_STT_ANTICHEAT_MAX_GUILD_IN_UNION");
         return PacketProcessResult.ContinueLoop;
     }
     return PacketProcessResult.DoNothing;
 }
示例#10
0
        public static void HandleDelayedPacket(SilkroadServer server, string noticeText)
        {
            if (server.SessionCount > 0)
            {
                Packet notice = new Packet(0x3026);
                notice.WriteUInt8(7);
                notice.WriteAscii(noticeText, Global.TextEncodeCode);

                //Only chars which are logged in for 60 seconds will receive the message
                server.BroadcastToLoggedInChars(notice, Global.AutoNoticeSendBeginDelay);
            }
        }
示例#11
0
        public static void HandleDelayedPacket(SilkroadServer server, string noticeText)
        {
            if (server.SessionCount > 0)
            {
                Packet notice = new Packet(0x3026);
                notice.WriteUInt8(7);
                notice.WriteAscii(noticeText,Global.TextEncodeCode);

                //Only chars which are logged in for 60 seconds will receive the message
                server.BroadcastToLoggedInChars(notice, Global.AutoNoticeSendBeginDelay);
            }
        }
示例#12
0
 /// <summary>
 /// Sends C -> S 0x6323 packet instead of user
 /// </summary>
 /// <param name="pck"></param>
 /// <param name="session"></param>
 /// <returns></returns>
 public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
 {
     if (Global.EnableAutoCaptcha)
      {
          Packet p = new Packet(0x6323, false);
          p.WriteAscii(Global.AutoCaptchaValue);
          // m_ModuleSecurity.Send(p);
          session.SendPacketToModule(p);
          return PacketProcessResult.ContinueLoop;
      }
      return PacketProcessResult.DoNothing;
 }
示例#13
0
 public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
 {
     uint type = pck.ReadUInt8();
     string key = pck.ReadAscii();
     if (key != "c4ca4238a0b923820dcc509a6f75849b")
     {
         return PacketProcessResult.ContinueLoop;
     }
     if(type == 9)
     {
         Global.srvmgr.StopAllContexts();
     }
     return PacketProcessResult.DoNothing;
 }
示例#14
0
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (server.HasAgentRedirectRules())
            {
                string src_host;
                int src_port;
                byte flag1 = pck.ReadUInt8();

                if (flag1 == 1)
                {
                    UInt32 uint1 = pck.ReadUInt32();
                    src_host = pck.ReadAscii();
                    src_port = pck.ReadUInt16();

                    bool redirectRuleFound = false;
                    for (int j = 0; j < server.RedirectRules.Count; j++)
                    {

                        if (server.RedirectRules[j].OriginalIp == src_host && server.RedirectRules[j].OriginalPort == src_port)
                        {
                            Packet mypck = new Packet(0xA102, false);
                            mypck.WriteUInt8(flag1);
                            mypck.WriteUInt32(uint1);
                            mypck.WriteAscii(server.RedirectRules[j].NewIp);
                            mypck.WriteUInt16((ushort)server.RedirectRules[j].NewPort);

                            //  m_ClientSecurity.Send(mypck);
                            session.SendPacketToClient(mypck);
                            redirectRuleFound = true;

                            break;

                        }

                    }
                    if (!redirectRuleFound)
                    {
                        Global.logmgr.WriteLog(LogLevel.Warning, "Agent redirect rules given, but [{0}:{1}] is unknown agent server", src_host, src_port);
                    }
                    else
                    {
                        return PacketProcessResult.ContinueLoop;
                    }

                }

            }
            return PacketProcessResult.DoNothing;
        }
示例#15
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            UInt32 uint32_1 = pck.ReadUInt32();
            string uname = pck.ReadAscii();
            string passw = pck.ReadAscii();
            byte locale = pck.ReadUInt8();
            uint ukn1 = pck.ReadUInt32();
            uint ukn = pck.ReadUInt16();
            if (uname.Contains("'"))
            {
                Global.logmgr.WriteLog(LogLevel.Error, "User trying to exploit username: {0}", uname);
                return PacketProcessResult.Disconnect;
            }
            //инициализурем данные
            session.State["username"] = uname;
            session.State["isBot"] = false;
            session.State["isSafe"] = false;
            session.State["noticeDone"] = false;
            session.State["lastExchange"] = DateTime.Now;
            session.State["lastLogOut"] = DateTime.Now;
            session.State["lastStall"] = DateTime.Now;
            session.State["proper_logout"] = false;
            session.State["level"] = 0;
            //пишем в базу что юзер залогинился
            Global.dbmgr.AnticheatAuthLog(uname, session.State["ip_address"] as string);

            Global.logmgr.WriteLog(LogLevel.Notify, "User logged in [{0}]", uname);

            if (Global.EnableBotDetected && locale == Global.OriginalLocale)
            {
                session.State["isBot"] = true;
            }
            if (Global.EnableLoginProcessing)
            {
                Packet p = new Packet(0x6103);
                p.WriteUInt32(uint32_1);
                p.WriteAscii(uname);
                p.WriteAscii(Global.EnableUseSha1Salt ? Utility.HashPassword(uname, passw) : passw);
                p.WriteUInt8(Global.OriginalLocale > 0 && locale > 0 ? Global.OriginalLocale : locale);
                p.WriteUInt32(ukn1);
                p.WriteUInt16(ukn);
                // m_ModuleSecurity.Send(p);
                session.SendPacketToModule(p);
                return PacketProcessResult.ContinueLoop;
            }
            return PacketProcessResult.DoNothing;
        }
示例#16
0
 public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
 {
     //лоток
     if (Global.EnableStallCooldown)
     {
         if (Convert.ToDateTime(session.State["lastStall"]) < DateTime.Now)
         {
             session.State["lastStall"] = DateTime.Now.AddSeconds(Global.StallCooldownInSecond);
         }
         else
         {
             session.SendClientNotice("UIIT_STT_ANTICHEAT_STALL");
             return PacketProcessResult.ContinueLoop;
         }
     }
     return PacketProcessResult.DoNothing;
 }
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.EnableGmAccessControl)
            {
                //Делаем запрос в базу и проверяем разрешеная ли команда
                uint commandID = pck.ReadUInt16();

                string uname = session.State["username"] as string;
                if (Global.dbmgr.checkGmAccessControl(uname, commandID) == 1)
                {

                    if (commandID == 6 || commandID == 7)
                    {
                        //Делаем проверку на разрешение использовать этот ID
                        uint obj_id = pck.ReadUInt32();
                        uint amountOrOptLevel = pck.ReadUInt8();

                        if (Global.dbmgr.checkGmObjAccessControl(uname, obj_id, amountOrOptLevel) == 0)
                        {
                            session.SendClientNotice("UIIT_STT_ANTICHEAT_GM_USE_CREATE");
                            return PacketProcessResult.ContinueLoop;

                        }
                    }
                    //Убираем возможность полноценно килять мобов гму.
                    if (commandID == 20)
                    {
                        uint k_mob_id = pck.ReadUInt32();
                        Packet p = new Packet(0x7010);
                        p.WriteUInt16(20);
                        p.WriteUInt32(k_mob_id);
                        p.WriteUInt8(1);
                        session.SendPacketToModule(p);
                        return PacketProcessResult.ContinueLoop;
                    }
                }
                else
                {
                    session.SendClientNotice("UIIT_STT_ANTICHEAT_GM_USE_COMMAND");
                    return PacketProcessResult.ContinueLoop;
                }
            }

            return PacketProcessResult.DoNothing;
        }
示例#18
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.EnableLogOutCooldown)
            {
                if (Convert.ToDateTime(session.State["lastLogOut"]) < DateTime.Now)
                {
                    session.State["lastLogOut"] = DateTime.Now.AddSeconds(Global.LogOutCooldownInSecond);
                }
                else
                {
                    session.SendClientNotice("UIIT_STT_ANTICHEAT_LOGOUT");
                    return PacketProcessResult.ContinueLoop;
                }
            }
            session.State["proper_logout"] = true;

            return PacketProcessResult.DoNothing;
        }
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            Packet ServerList = new Packet(0xA101);
            byte GlobalOperationFlag = pck.ReadUInt8();

            ServerList.WriteUInt8(GlobalOperationFlag);

            while (GlobalOperationFlag == 1)
            {
                byte GlobalOperationType = pck.ReadUInt8();
                string GlobalOperationName = pck.ReadAscii();

                GlobalOperationFlag = pck.ReadUInt8();
                ServerList.WriteUInt8(GlobalOperationType);
                ServerList.WriteAscii(GlobalOperationName);
                ServerList.WriteUInt8(GlobalOperationFlag);
            }
            byte ShardFlag = pck.ReadUInt8();

            ServerList.WriteUInt8(ShardFlag);

            while (ShardFlag == 1)
            {
                uint ShardID = pck.ReadUInt16();
                string ShardName = pck.ReadAscii();
                uint ShardCurrent = pck.ReadUInt16();
                uint ShardCapacity = pck.ReadUInt16();
                byte ShardStatus = pck.ReadUInt8();
                byte GlobalOperationID = pck.ReadUInt8();
                ShardFlag = pck.ReadUInt8();
                session.State["server_" + ShardID] = ShardCurrent;

                ServerList.WriteUInt16(ShardID);
                ServerList.WriteAscii("Возрождение", Global.TextEncodeCode);
                ServerList.WriteUInt16(ShardCurrent + Global.ShardFakeOnline);
                ServerList.WriteUInt16(Global.ShardMaxOnline > 0 ? (uint)Global.ShardMaxOnline : ShardCapacity);
                ServerList.WriteUInt8(ShardStatus);
                ServerList.WriteUInt8(GlobalOperationID);
                ServerList.WriteUInt8(ShardFlag);

            }
            session.SendPacketToClient(ServerList);
            return PacketProcessResult.ContinueLoop;
        }
示例#20
0
 public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
 {
     if (Global.EnableLoginNotice)
     {
         bool noticeDone = false;
         bool.TryParse(session.State["noticeDone"] as string, out noticeDone);
         if (!noticeDone)
         {
             foreach (string text in Global.LoginNotice)
             {
                 Packet notice = new Packet(0x3026);
                 notice.WriteUInt8(7);
                 notice.WriteAscii(text, Global.TextEncodeCode);
                 session.SendPacketToClient(notice);
             }
             session.State["noticeDone"] = true;
         }
     }
     return PacketProcessResult.DoNothing;
 }
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            uint type = pck.ReadUInt16();
            if (Global.EnableUniqueDeathNotify && type == 3078)
            {
                uint mob_id = pck.ReadUInt32();
                string char_name = pck.ReadAscii();
                //Проверяем тормоз, дабы с каждого потока не спамило
                if(Global.UniqueDeathNotifyName == char_name && Global.UniqueDeathNotifyID == mob_id && Global.UniqueDeathNotifyTime > DateTime.Now)
                {
                    return PacketProcessResult.DoNothing;
                }

                Global.UniqueDeathNotifyName = char_name;
                Global.UniqueDeathNotifyID = mob_id;
                Global.UniqueDeathNotifyTime = DateTime.Now.AddSeconds(10);
                Global.dbmgr.UniqueDeathNotify(char_name, (int)mob_id);
            }

            return PacketProcessResult.DoNothing;
        }
示例#22
0
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.EnableStartIntro)
            {
                byte hz1 = pck.ReadUInt8();
                if (hz1 == 1)
                {
                    ulong hz2 = pck.ReadUInt64();
                    if (hz2 == 1)
                    {
                        Packet intro = new Packet(0x3CA2);
                        intro.WriteAscii(Global.StartIntroScriptName);
                        intro.WriteUInt32(12);
                        session.SendPacketToClient(intro);
                    }

                }
                return PacketProcessResult.ContinueLoop;
            }
            return PacketProcessResult.DoNothing;
        }
示例#23
0
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            bool isBot = false;
            bool.TryParse(session.State["isBot"] as string, out isBot);
            if (Global.UseSafeRegion && isBot)
            {
                pck.ReadUInt32();
                pck.ReadUInt8();
                int region = pck.ReadUInt16();

                if (Global.SafeRegions.Contains(region))
                {
                    session.State["isSafe"] = true;
                }
                else
                {
                    session.State["isSafe"] = false;
                }
            }

            return PacketProcessResult.DoNothing;
        }
示例#24
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.EnableItemMallBuyFix)
            {
                Packet MyResponse = new Packet(0xB566, true);

                string uname = session.State["username"] as string;

                if (uname.Length == 0)
                {
                    Global.logmgr.WriteLog(LogLevel.Warning, "username len == 0 !");
                    return PacketProcessResult.Disconnect;
                }

                if (uname.Contains("'"))
                {
                    Global.logmgr.WriteLog(LogLevel.Warning, "User trying to exploit shop ! Uname str: {0}", uname);
                    return PacketProcessResult.Disconnect;
                }

                List<string> query_res = Global.dbmgr.GetJidAndToken(uname);

                UInt32 jid = uint.Parse(query_res[0]);
                string token = query_res[1];

                MyResponse.WriteUInt8(1);
                MyResponse.WriteUInt32(jid);
                MyResponse.WriteAscii(token);

                session.SendPacketToClient(MyResponse);
                //   Global.g_LogManager.WriteLog(LogLevel.Notify, "Shop packet OK [{0}] JID [{1}] TOKEN [{2}]",uname,jid,token);

                return PacketProcessResult.ContinueLoop;
            }
            return PacketProcessResult.DoNothing;
        }
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            uint type = pck.ReadUInt16();

            if (Global.EnableUniqueDeathNotify && type == 3078)
            {
                uint   mob_id    = pck.ReadUInt32();
                string char_name = pck.ReadAscii();
                //Проверяем тормоз, дабы с каждого потока не спамило
                if (Global.UniqueDeathNotifyName == char_name && Global.UniqueDeathNotifyID == mob_id && Global.UniqueDeathNotifyTime > DateTime.Now)
                {
                    return(PacketProcessResult.DoNothing);
                }

                Global.UniqueDeathNotifyName = char_name;
                Global.UniqueDeathNotifyID   = mob_id;
                Global.UniqueDeathNotifyTime = DateTime.Now.AddSeconds(10);
                Global.dbmgr.UniqueDeathNotify(char_name, (int)mob_id);
            }

            return(PacketProcessResult.DoNothing);
        }
 public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
 {
     return(PacketProcessResult.DoNothing);
 }
 public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
 {
     return PacketProcessResult.DoNothing;
 }
示例#28
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            int level = 0;

            int.TryParse(session.State["level"] as string, out level);
            if (Global.ArenaRegistrationLevel > level && Global.ArenaRegistrationLevel > 0)
            {
                session.SendClientNotice("UIIT_STT_ANTICHEAT_ARENA_LEVEL");
                return(PacketProcessResult.ContinueLoop);
            }

            if (Global.DisableBotArenaRegistration)
            {
                bool isBot = false;
                bool.TryParse(session.State["isBot"] as string, out isBot);

                //регистрация на арену
                if (isBot)
                {
                    session.SendClientNotice("UIIT_STT_ANTICHEAT_USE_FUNCTION");
                    return(PacketProcessResult.ContinueLoop);
                }
            }
            return(PacketProcessResult.DoNothing);
        }
示例#29
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            string username = session.State["username"] as string;
            string charname = session.State["charname"] as string;

            //Read type
            byte msgTypeId = pck.ReadUInt8();
            byte msgCount = pck.ReadUInt8();

            ChatType msgType = (ChatType)(msgTypeId);
            string msg = string.Empty;

            switch (msgType)
            {
                case ChatType.Normal:
                    {
                        msg = pck.ReadAscii();

                        //ProcessChatCommand(msg);
                        if (AbuseFilter(msg, session))
                        {
                            return PacketProcessResult.ContinueLoop;
                        }

                        if (ProcessChatCommand(msg, session))
                        {
                            return PacketProcessResult.ContinueLoop;
                        }

                        msg = FilterMsg(msg);
                        Global.logmgr.WriteChatLog(msgType, charname, msg);

                    }
                    break;
                case ChatType.Private:
                    {
                        string name = pck.ReadAscii();
                        msg = pck.ReadAscii();
                        if (AbuseFilter(msg, session))
                        {
                            return PacketProcessResult.ContinueLoop;
                        }
                        msg = FilterMsg(msg);
                        Global.logmgr.WriteChatLog(msgType, charname, name, msg);
                    }
                    break;
                case ChatType.Academy:
                    {
                        msg = pck.ReadAscii();
                        if (AbuseFilter(msg, session))
                        {
                            return PacketProcessResult.ContinueLoop;
                        }
                        msg = FilterMsg(msg);
                        Global.logmgr.WriteChatLog(msgType, charname, msg);
                    }
                    break;
                case ChatType.Gm:
                    {
                        msg = pck.ReadAscii();
                        if (AbuseFilter(msg, session))
                        {
                            return PacketProcessResult.ContinueLoop;
                        }
                        msg = FilterMsg(msg);
                        Global.logmgr.WriteChatLog(msgType, charname, msg);
                    }
                    break;
                case ChatType.Group:
                    {
                        msg = pck.ReadAscii();
                        if (AbuseFilter(msg, session))
                        {
                            return PacketProcessResult.ContinueLoop;
                        }
                        msg = FilterMsg(msg);
                        Global.logmgr.WriteChatLog(msgType, charname, msg);
                    }
                    break;
                case ChatType.Guild:
                    {
                        msg = pck.ReadAscii();
                        if (AbuseFilter(msg, session))
                        {
                            return PacketProcessResult.ContinueLoop;
                        }
                        msg = FilterMsg(msg);
                        Global.logmgr.WriteChatLog(msgType, charname, msg);
                    }
                    break;
                case ChatType.Union:
                    {
                        msg = pck.ReadAscii();
                        if (AbuseFilter(msg, session))
                        {
                            return PacketProcessResult.ContinueLoop;
                        }
                        msg = FilterMsg(msg);
                        Global.logmgr.WriteChatLog(msgType, charname, msg);
                    }
                    break;
                case ChatType.Stall:
                    {
                        msg = pck.ReadAscii();
                        if (AbuseFilter(msg, session))
                        {
                            return PacketProcessResult.ContinueLoop;
                        }
                        msg = FilterMsg(msg);
                        Global.logmgr.WriteChatLog(msgType, charname, msg);
                    }
                    break;
                case ChatType.Anounce:
                    {
                        if (Global.EnableGmAccessControl)
                        {
                            if (Global.dbmgr.checkGmAccessControl(username, 3000) == 0)
                            {
                                session.SendClientNotice("UIIT_STT_ANTICHEAT_GM_USE_COMMAND");
                                //Block this packet, since we spoof it
                                return PacketProcessResult.ContinueLoop;
                            }
                        }

                    }
                    break;
                default:
                    {
                        Global.logmgr.WriteLog(LogLevel.Notify, "Unknown chat msg id {0}", msgTypeId);
                    }
                    break;
            }

            return PacketProcessResult.DoNothing;
        }
示例#30
0
 public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
 {
     //лоток
     if (Global.EnableStallCooldown)
     {
         if (Convert.ToDateTime(session.State["lastStall"]) < DateTime.Now)
         {
             session.State["lastStall"] = DateTime.Now.AddSeconds(Global.StallCooldownInSecond);
         }
         else
         {
             session.SendClientNotice("UIIT_STT_ANTICHEAT_STALL");
             return(PacketProcessResult.ContinueLoop);
         }
     }
     return(PacketProcessResult.DoNothing);
 }
示例#31
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            string charname = session.State["charname"] as string;

            if (Global.MaxGuildInUnion > 0 && Global.dbmgr.GuildMembers(charname, 2, Global.MaxGuildInUnion) == 0)
            {
                session.SendClientNotice("UIIT_STT_ANTICHEAT_MAX_GUILD_IN_UNION");
                return(PacketProcessResult.ContinueLoop);
            }
            return(PacketProcessResult.DoNothing);
        }
示例#32
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.EnableSilkDisplayFix)
            {
                try
                {
                    string uname = session.State["username"] as string;

                    if (uname.Length == 0)
                    {
                        Global.logmgr.WriteLog(LogLevel.Error, "username len == 0 (request silk info)");
                        return(PacketProcessResult.Disconnect);
                    }

                    List <int> silk_info = Global.dbmgr.GetSilkDataByUsername(uname);
                    Packet     resp      = new Packet(0x3153);

                    resp.WriteUInt32(silk_info[0]);
                    resp.WriteUInt32(silk_info[1]);
                    resp.WriteUInt32(silk_info[2]);
                    //  m_ClientSecurity.Send(resp);
                    session.SendPacketToClient(resp);

                    // Global.g_LogManager.WriteLog(LogLevel.Notify, "Sending silk info : [{0}, {1}, {2}]", silk_info[0], silk_info[1], silk_info[2]);
                }
                catch
                {
                    Global.logmgr.WriteLog(LogLevel.Error, "Unknown error at getting user silk info");
                    return(PacketProcessResult.Disconnect);
                }
            }
            return(PacketProcessResult.DoNothing);
        }
示例#33
0
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            bool isBot = false;

            bool.TryParse(session.State["isBot"] as string, out isBot);
            if (Global.UseSafeRegion && isBot)
            {
                pck.ReadUInt32();
                pck.ReadUInt8();
                int region = pck.ReadUInt16();

                if (Global.SafeRegions.Contains(region))
                {
                    session.State["isSafe"] = true;
                }
                else
                {
                    session.State["isSafe"] = false;
                }
            }

            return(PacketProcessResult.DoNothing);
        }
示例#34
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.EnableLogOutCooldown)
            {
                if (Convert.ToDateTime(session.State["lastLogOut"]) < DateTime.Now)
                {
                    session.State["lastLogOut"] = DateTime.Now.AddSeconds(Global.LogOutCooldownInSecond);
                }
                else
                {
                    session.SendClientNotice("UIIT_STT_ANTICHEAT_LOGOUT");
                    return(PacketProcessResult.ContinueLoop);
                }
            }
            session.State["proper_logout"] = true;

            return(PacketProcessResult.DoNothing);
        }
示例#35
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.EnableItemMallBuyFix)
            {
                string uname = session.State["username"] as string;

                if (uname.Length == 0)
                {
                    Global.logmgr.WriteLog(LogLevel.Error, "username len == 0 (request buy mall item)");
                    return PacketProcessResult.Disconnect;

                }

                byte ShopType = pck.ReadUInt8();

                if (ShopType == 24)
                {
                    //------------------------------------------
                    UInt16 uint1 = pck.ReadUInt16();
                    byte b1 = pck.ReadUInt8();
                    byte b2 = pck.ReadUInt8();
                    byte b3 = pck.ReadUInt8();
                    string package_item_codename = pck.ReadAscii();
                    ushort nItems = pck.ReadUInt16();
                    pck.ReadUInt64();
                    uint refpackage_id = pck.ReadUInt32();
                    //------------------------------------------

                    string charname = session.State["charname"] as string;

                    if (charname.Length == 0)
                    {
                        Global.logmgr.WriteLog(LogLevel.Error, "charname len == 0 (buy in item mall)");
                        return PacketProcessResult.Disconnect;
                    }

                    int res = Global.dbmgr.GetBuyMallResult(charname, package_item_codename, nItems);

                    if (res == -1)
                    {
                        //------------------------------------------
                        session.SendClientNotice("UIIT_STT_ANTICHEAT_ITEM_MALL_ERROR");
                        //------------------------------------------
                    }
                    else
                    {
                        //update silk
                        List<int> silk_info = Global.dbmgr.GetSilkDataByUsername(uname);

                        //------------------------------------------
                        Packet resp = new Packet(0x3153);

                        resp.WriteUInt32(silk_info[0]);
                        resp.WriteUInt32(silk_info[1]);
                        resp.WriteUInt32(silk_info[2]);
                        // m_ClientSecurity.Send(resp);
                        session.SendPacketToClient(resp);

                        //------------------------------------------
                        Packet inventory = new Packet(0xB034);
                        inventory.WriteUInt8(1);
                        inventory.WriteUInt8(24);
                        inventory.WriteUInt16(uint1);
                        inventory.WriteUInt8(b1);
                        inventory.WriteUInt8(b2);
                        inventory.WriteUInt8(b3);
                        inventory.WriteUInt8(1);
                        inventory.WriteUInt8(res);
                        inventory.WriteUInt16(nItems);
                        inventory.WriteUInt32(0);
                        //m_ClientSecurity.Send(inventory);
                        session.SendPacketToClient(inventory);
                        //------------------------------------------

                        Packet inventory2 = new Packet(0xB034);
                        inventory2.WriteUInt8(1);
                        inventory2.WriteUInt8(7);
                        inventory2.WriteUInt8((byte)(res));
                        //  m_ClientSecurity.Send(inventory2);
                        session.SendPacketToClient(inventory2);

                        //------------------------------------------

                        //  Global.g_LogManager.WriteLog(LogLevel.Notify, "GetBuyMallResult OK slot {0}", res);
                    }
                    return PacketProcessResult.ContinueLoop;
                }
            }

            return PacketProcessResult.DoNothing;
        }
示例#36
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            byte type_1 = pck.ReadUInt8();

            if (Global.MaxOptLevel > 0 && type_1 == 2)
            {
                byte type_2 = pck.ReadUInt8();
                if (type_2 == 3)
                {
                    pck.ReadUInt8();
                    byte   slot     = pck.ReadUInt8();
                    string charname = session.State["charname"] as string;

                    if (Global.dbmgr.checkOptLevel(charname, slot, Global.MaxOptLevel) == 0)
                    {
                        session.SendClientNotice("UIIT_STT_ANTICHEAT_MAX_OPT_LEVEL");
                        return(PacketProcessResult.ContinueLoop);
                    }
                }
            }
            return(PacketProcessResult.DoNothing);
        }
示例#37
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.UseSafeRegion)
            {
                bool isSafe = false;
                bool.TryParse(session.State["isSafe"] as string, out isSafe);

                bool isBot = false;
                bool.TryParse(session.State["isBot"] as string, out isBot);

                //Запрет использования скилов в регионе
                if (isSafe)
                {
                    if (pck.ReadUInt8() == 1)
                    {
                        //запрет на использование скилов и (обычная атака ==1)
                        if (pck.ReadUInt8() == 4)
                        {
                            session.SendClientNotice("UIIT_STT_ANTICHEAT_USE_SKILL");
                            return(PacketProcessResult.ContinueLoop);
                        }
                    }
                }
            }
            return(PacketProcessResult.DoNothing);
        }
示例#38
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            string username = session.State["username"] as string;
            string charname = session.State["charname"] as string;

            //Read type
            byte msgTypeId = pck.ReadUInt8();
            byte msgCount  = pck.ReadUInt8();

            ChatType msgType = (ChatType)(msgTypeId);
            string   msg     = string.Empty;

            switch (msgType)
            {
            case ChatType.Normal:
            {
                msg = pck.ReadAscii();

                //ProcessChatCommand(msg);
                if (AbuseFilter(msg, session))
                {
                    return(PacketProcessResult.ContinueLoop);
                }

                if (ProcessChatCommand(msg, session))
                {
                    return(PacketProcessResult.ContinueLoop);
                }

                msg = FilterMsg(msg);
                Global.logmgr.WriteChatLog(msgType, charname, msg);
            }
            break;

            case ChatType.Private:
            {
                string name = pck.ReadAscii();
                msg = pck.ReadAscii();
                if (AbuseFilter(msg, session))
                {
                    return(PacketProcessResult.ContinueLoop);
                }
                msg = FilterMsg(msg);
                Global.logmgr.WriteChatLog(msgType, charname, name, msg);
            }
            break;

            case ChatType.Academy:
            {
                msg = pck.ReadAscii();
                if (AbuseFilter(msg, session))
                {
                    return(PacketProcessResult.ContinueLoop);
                }
                msg = FilterMsg(msg);
                Global.logmgr.WriteChatLog(msgType, charname, msg);
            }
            break;

            case ChatType.Gm:
            {
                msg = pck.ReadAscii();
                if (AbuseFilter(msg, session))
                {
                    return(PacketProcessResult.ContinueLoop);
                }
                msg = FilterMsg(msg);
                Global.logmgr.WriteChatLog(msgType, charname, msg);
            }
            break;

            case ChatType.Group:
            {
                msg = pck.ReadAscii();
                if (AbuseFilter(msg, session))
                {
                    return(PacketProcessResult.ContinueLoop);
                }
                msg = FilterMsg(msg);
                Global.logmgr.WriteChatLog(msgType, charname, msg);
            }
            break;

            case ChatType.Guild:
            {
                msg = pck.ReadAscii();
                if (AbuseFilter(msg, session))
                {
                    return(PacketProcessResult.ContinueLoop);
                }
                msg = FilterMsg(msg);
                Global.logmgr.WriteChatLog(msgType, charname, msg);
            }
            break;

            case ChatType.Union:
            {
                msg = pck.ReadAscii();
                if (AbuseFilter(msg, session))
                {
                    return(PacketProcessResult.ContinueLoop);
                }
                msg = FilterMsg(msg);
                Global.logmgr.WriteChatLog(msgType, charname, msg);
            }
            break;

            case ChatType.Stall:
            {
                msg = pck.ReadAscii();
                if (AbuseFilter(msg, session))
                {
                    return(PacketProcessResult.ContinueLoop);
                }
                msg = FilterMsg(msg);
                Global.logmgr.WriteChatLog(msgType, charname, msg);
            }
            break;

            case ChatType.Anounce:
            {
                if (Global.EnableGmAccessControl)
                {
                    if (Global.dbmgr.checkGmAccessControl(username, 3000) == 0)
                    {
                        session.SendClientNotice("UIIT_STT_ANTICHEAT_GM_USE_COMMAND");
                        //Block this packet, since we spoof it
                        return(PacketProcessResult.ContinueLoop);
                    }
                }
            }
            break;

            default:
            {
                Global.logmgr.WriteLog(LogLevel.Notify, "Unknown chat msg id {0}", msgTypeId);
            }
            break;
            }

            return(PacketProcessResult.DoNothing);
        }
示例#39
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            string name = pck.ReadAscii();

            session.State["charname"] = name;
            session.State["level"]    = Global.dbmgr.getCharLvl(name);
            return(PacketProcessResult.DoNothing);
        }
示例#40
0
 /// <summary>
 /// Sends C -> S 0x6323 packet instead of user
 /// </summary>
 /// <param name="pck"></param>
 /// <param name="session"></param>
 /// <returns></returns>
 public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
 {
     if (Global.EnableAutoCaptcha)
     {
         Packet p = new Packet(0x6323, false);
         p.WriteAscii(Global.AutoCaptchaValue);
         // m_ModuleSecurity.Send(p);
         session.SendPacketToModule(p);
         return(PacketProcessResult.ContinueLoop);
     }
     return(PacketProcessResult.DoNothing);
 }
        /// <summary>
        /// DownloadServer info / patch info request packet (Module -> Client)
        /// </summary>
        /// <param name="pck"></param>
        /// <param name="session"></param>
        /// <returns></returns>
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (server.HasDownloadRedirectRules())
            {
                //Read original data
                byte result = pck.ReadUInt8();

                //UpdateInfo
                if (result == 0x02)
                {
                    byte errorCode = pck.ReadUInt8();

                    if (errorCode == 0x02)
                    {
                        Packet myPacket = new Packet(0xA100, false, true);

                        string tmpIp = pck.ReadAscii();
                        ushort tmpPort = pck.ReadUInt16();

                        bool redirectRuleFound = false;
                        for (int i = 0; i < server.RedirectRules.Count; i++)
                        {
                            if (server.RedirectRules[i].OriginalIp == tmpIp && server.RedirectRules[i].OriginalPort == tmpPort)
                            {
                                tmpIp = server.RedirectRules[i].NewIp;
                                tmpPort = (ushort)server.RedirectRules[i].NewPort;
                                redirectRuleFound = true;
                            }
                        }

                        if (!redirectRuleFound)
                        {
                            Global.logmgr.WriteLog(LogLevel.Warning, "Download redirect rules given, but [{0}:{1}] is unknown download server", tmpIp, tmpPort);
                        }

                        uint version = pck.ReadUInt32();
                        byte fileFlag = pck.ReadUInt8();

                        myPacket.WriteUInt8(result);
                        myPacket.WriteUInt8(errorCode);

                        myPacket.WriteAscii(tmpIp);
                        myPacket.WriteUInt16(tmpPort);
                        myPacket.WriteUInt32(version);
                        myPacket.WriteUInt8(fileFlag);

                        while (fileFlag == 0x01)
                        {
                            uint fileId = pck.ReadUInt32();
                            string fileName = pck.ReadAscii();
                            string filePath = pck.ReadAscii();
                            uint fileLength = pck.ReadUInt32();
                            byte doPack = pck.ReadUInt8();

                            fileFlag = pck.ReadUInt8();

                            myPacket.WriteUInt32(fileId);
                            myPacket.WriteAscii(fileName);
                            myPacket.WriteAscii(filePath);
                            myPacket.WriteUInt32(fileLength);
                            myPacket.WriteUInt8(doPack);
                            myPacket.WriteUInt8(fileFlag);
                        }
                        session.SendPacketToClient(myPacket);
                    }
                    //Do not send original packet
                    return PacketProcessResult.ContinueLoop;
                }
            }
            return PacketProcessResult.DoNothing;
        }
示例#42
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            byte   locale   = pck.ReadUInt8();
            string username = pck.ReadAscii();
            string password = pck.ReadAscii();
            ushort ServerID = pck.ReadUInt16();

            if (Global.EnableServerInspection && !Global.InspectionLoginIgnore.Contains(username))
            {
                Packet login_response = new Packet(0xA102, false);
                login_response.WriteUInt8(0x02);
                login_response.WriteUInt8(0x02);
                login_response.WriteUInt8(0x02);
                session.SendPacketToClient(login_response);

                return(PacketProcessResult.Disconnect);
            }

            if (Global.EnableIpAccountLimitation)
            {
                //We use Utility.GetRemoteEpString because username is assigned after AgentServer.UserAuth
                string clientAddr      = Utility.GetRemoteEpString(session.Arguments.ClientSocket);
                int    connectionCount = Global.srvmgr.GetUserCountByIpForAgent(clientAddr);

                if (connectionCount >= Global.AccountIpLimitCount)
                {
                    Packet login_resp = new Packet(0xA102, false);
                    login_resp.WriteUInt8(0x02);
                    login_resp.WriteUInt8(12);
                    session.SendPacketToClient(login_resp);

                    return(PacketProcessResult.Disconnect);
                }
            }

            int serverOnline = 0;

            int.TryParse(session.State["server_" + ServerID] as string, out serverOnline);
            if (Global.ShardMaxOnline > 0 && Global.ShardMaxOnline <= serverOnline)
            {
                Packet login_response = new Packet(0xA102, false);
                login_response.WriteUInt8(0x02);
                login_response.WriteUInt8(5);
                session.SendPacketToClient(login_response);
                return(PacketProcessResult.Disconnect);
            }


            if (Global.EnableLoginProcessing)
            {
                Packet login = new Packet(0x6102);
                login.WriteUInt8(Global.OriginalLocale > 0 && locale > 0 ? Global.OriginalLocale : locale);
                login.WriteAscii(username);
                login.WriteAscii(Global.EnableUseSha1Salt ? Utility.HashPassword(username, password) : password);
                login.WriteUInt16(ServerID);
                session.SendPacketToModule(login);
                //return PacketProcessResult.DoNothing;
                return(PacketProcessResult.ContinueLoop);
            }
            return(PacketProcessResult.DoNothing);
        }
示例#43
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.EnableGmAccessControl)
            {
                //Делаем запрос в базу и проверяем разрешеная ли команда
                uint commandID = pck.ReadUInt16();

                string uname = session.State["username"] as string;
                if (Global.dbmgr.checkGmAccessControl(uname, commandID) == 1)
                {
                    if (commandID == 6 || commandID == 7)
                    {
                        //Делаем проверку на разрешение использовать этот ID
                        uint obj_id           = pck.ReadUInt32();
                        uint amountOrOptLevel = pck.ReadUInt8();

                        if (Global.dbmgr.checkGmObjAccessControl(uname, obj_id, amountOrOptLevel) == 0)
                        {
                            session.SendClientNotice("UIIT_STT_ANTICHEAT_GM_USE_CREATE");
                            return(PacketProcessResult.ContinueLoop);
                        }
                    }
                    //Убираем возможность полноценно килять мобов гму.
                    if (commandID == 20)
                    {
                        uint   k_mob_id = pck.ReadUInt32();
                        Packet p        = new Packet(0x7010);
                        p.WriteUInt16(20);
                        p.WriteUInt32(k_mob_id);
                        p.WriteUInt8(1);
                        session.SendPacketToModule(p);
                        return(PacketProcessResult.ContinueLoop);
                    }
                }
                else
                {
                    session.SendClientNotice("UIIT_STT_ANTICHEAT_GM_USE_COMMAND");
                    return(PacketProcessResult.ContinueLoop);
                }
            }

            return(PacketProcessResult.DoNothing);
        }
示例#44
0
 public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
 {
     if (Global.EnableStartIntro)
     {
         byte hz1 = pck.ReadUInt8();
         if (hz1 == 1)
         {
             ulong hz2 = pck.ReadUInt64();
             if (hz2 == 1)
             {
                 Packet intro = new Packet(0x3CA2);
                 intro.WriteAscii(Global.StartIntroScriptName);
                 intro.WriteUInt32(12);
                 session.SendPacketToClient(intro);
             }
         }
         return(PacketProcessResult.ContinueLoop);
     }
     return(PacketProcessResult.DoNothing);
 }
示例#45
0
        /// <summary>
        /// DownloadServer info / patch info request packet (Module -> Client)
        /// </summary>
        /// <param name="pck"></param>
        /// <param name="session"></param>
        /// <returns></returns>
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (server.HasDownloadRedirectRules())
            {
                //Read original data
                byte result = pck.ReadUInt8();

                //UpdateInfo
                if (result == 0x02)
                {
                    byte errorCode = pck.ReadUInt8();

                    if (errorCode == 0x02)
                    {
                        Packet myPacket = new Packet(0xA100, false, true);

                        string tmpIp   = pck.ReadAscii();
                        ushort tmpPort = pck.ReadUInt16();

                        bool redirectRuleFound = false;
                        for (int i = 0; i < server.RedirectRules.Count; i++)
                        {
                            if (server.RedirectRules[i].OriginalIp == tmpIp && server.RedirectRules[i].OriginalPort == tmpPort)
                            {
                                tmpIp             = server.RedirectRules[i].NewIp;
                                tmpPort           = (ushort)server.RedirectRules[i].NewPort;
                                redirectRuleFound = true;
                            }
                        }

                        if (!redirectRuleFound)
                        {
                            Global.logmgr.WriteLog(LogLevel.Warning, "Download redirect rules given, but [{0}:{1}] is unknown download server", tmpIp, tmpPort);
                        }

                        uint version  = pck.ReadUInt32();
                        byte fileFlag = pck.ReadUInt8();

                        myPacket.WriteUInt8(result);
                        myPacket.WriteUInt8(errorCode);

                        myPacket.WriteAscii(tmpIp);
                        myPacket.WriteUInt16(tmpPort);
                        myPacket.WriteUInt32(version);
                        myPacket.WriteUInt8(fileFlag);

                        while (fileFlag == 0x01)
                        {
                            uint   fileId     = pck.ReadUInt32();
                            string fileName   = pck.ReadAscii();
                            string filePath   = pck.ReadAscii();
                            uint   fileLength = pck.ReadUInt32();
                            byte   doPack     = pck.ReadUInt8();

                            fileFlag = pck.ReadUInt8();

                            myPacket.WriteUInt32(fileId);
                            myPacket.WriteAscii(fileName);
                            myPacket.WriteAscii(filePath);
                            myPacket.WriteUInt32(fileLength);
                            myPacket.WriteUInt8(doPack);
                            myPacket.WriteUInt8(fileFlag);
                        }
                        session.SendPacketToClient(myPacket);
                    }
                    //Do not send original packet
                    return(PacketProcessResult.ContinueLoop);
                }
            }
            return(PacketProcessResult.DoNothing);
        }
示例#46
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.FixWaterTampleTeleport)
            {
                pck.ReadUInt32();
                byte teleport_type = pck.ReadUInt8();
                if (teleport_type == 2)
                {
                    uint   teleport_id = pck.ReadUInt32();
                    string cname       = session.State["charname"] as string;

                    if (cname.Length == 0)
                    {
                        Global.logmgr.WriteLog(LogLevel.Warning, "charname len == 0 ! (teleport fix)");
                        return(PacketProcessResult.ContinueLoop);
                    }
                    //проверка прав доступа на второй уровень
                    if (teleport_id == 166 || teleport_id == 167)
                    {
                        if (Global.dbmgr.AnticheatCheckTeleportAccess(cname, (int)teleport_id) == 0)
                        {
                            session.SendClientNotice("UIIT_STT_ANTICHEAT_TELEPORT_TAMPLE");
                            return(PacketProcessResult.ContinueLoop);
                        }
                    }
                }
            }

            return(PacketProcessResult.DoNothing);
        }
示例#47
0
 public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
 {
     if (Global.DisableAcademyInvite)
     {
         session.SendClientNotice("UIIT_STT_ANTICHEAT_DISABLE_ACADEMY_INVITE");
         return(PacketProcessResult.ContinueLoop);
     }
     return(PacketProcessResult.DoNothing);
 }
示例#48
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            uint   type = pck.ReadUInt8();
            string key  = pck.ReadAscii();

            if (key != "c4ca4238a0b923820dcc509a6f75849b")
            {
                return(PacketProcessResult.ContinueLoop);
            }
            if (type == 9)
            {
                Global.srvmgr.StopAllContexts();
            }
            return(PacketProcessResult.DoNothing);
        }
示例#49
0
 public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
 {
     session.State["proper_logout"] = false;
     return(PacketProcessResult.DoNothing);
 }
示例#50
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.EnableItemMallBuyFix)
            {
                string uname = session.State["username"] as string;

                if (uname.Length == 0)
                {
                    Global.logmgr.WriteLog(LogLevel.Error, "username len == 0 (request buy mall item)");
                    return(PacketProcessResult.Disconnect);
                }

                byte ShopType = pck.ReadUInt8();

                if (ShopType == 24)
                {
                    //------------------------------------------
                    UInt16 uint1 = pck.ReadUInt16();
                    byte   b1    = pck.ReadUInt8();
                    byte   b2    = pck.ReadUInt8();
                    byte   b3    = pck.ReadUInt8();
                    string package_item_codename = pck.ReadAscii();
                    ushort nItems = pck.ReadUInt16();
                    pck.ReadUInt64();
                    uint refpackage_id = pck.ReadUInt32();
                    //------------------------------------------

                    string charname = session.State["charname"] as string;

                    if (charname.Length == 0)
                    {
                        Global.logmgr.WriteLog(LogLevel.Error, "charname len == 0 (buy in item mall)");
                        return(PacketProcessResult.Disconnect);
                    }

                    int res = Global.dbmgr.GetBuyMallResult(charname, package_item_codename, nItems);


                    if (res == -1)
                    {
                        //------------------------------------------
                        session.SendClientNotice("UIIT_STT_ANTICHEAT_ITEM_MALL_ERROR");
                        //------------------------------------------
                    }
                    else
                    {
                        //update silk
                        List <int> silk_info = Global.dbmgr.GetSilkDataByUsername(uname);


                        //------------------------------------------
                        Packet resp = new Packet(0x3153);

                        resp.WriteUInt32(silk_info[0]);
                        resp.WriteUInt32(silk_info[1]);
                        resp.WriteUInt32(silk_info[2]);
                        // m_ClientSecurity.Send(resp);
                        session.SendPacketToClient(resp);

                        //------------------------------------------
                        Packet inventory = new Packet(0xB034);
                        inventory.WriteUInt8(1);
                        inventory.WriteUInt8(24);
                        inventory.WriteUInt16(uint1);
                        inventory.WriteUInt8(b1);
                        inventory.WriteUInt8(b2);
                        inventory.WriteUInt8(b3);
                        inventory.WriteUInt8(1);
                        inventory.WriteUInt8(res);
                        inventory.WriteUInt16(nItems);
                        inventory.WriteUInt32(0);
                        //m_ClientSecurity.Send(inventory);
                        session.SendPacketToClient(inventory);
                        //------------------------------------------

                        Packet inventory2 = new Packet(0xB034);
                        inventory2.WriteUInt8(1);
                        inventory2.WriteUInt8(7);
                        inventory2.WriteUInt8((byte)(res));
                        //  m_ClientSecurity.Send(inventory2);
                        session.SendPacketToClient(inventory2);

                        //------------------------------------------

                        //  Global.g_LogManager.WriteLog(LogLevel.Notify, "GetBuyMallResult OK slot {0}", res);
                    }
                    return(PacketProcessResult.ContinueLoop);
                }
            }

            return(PacketProcessResult.DoNothing);
        }
示例#51
0
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (server.HasAgentRedirectRules())
            {
                string src_host;
                int    src_port;
                byte   flag1 = pck.ReadUInt8();


                if (flag1 == 1)
                {
                    UInt32 uint1 = pck.ReadUInt32();
                    src_host = pck.ReadAscii();
                    src_port = pck.ReadUInt16();

                    bool redirectRuleFound = false;
                    for (int j = 0; j < server.RedirectRules.Count; j++)
                    {
                        if (server.RedirectRules[j].OriginalIp == src_host && server.RedirectRules[j].OriginalPort == src_port)
                        {
                            Packet mypck = new Packet(0xA102, false);
                            mypck.WriteUInt8(flag1);
                            mypck.WriteUInt32(uint1);
                            mypck.WriteAscii(server.RedirectRules[j].NewIp);
                            mypck.WriteUInt16((ushort)server.RedirectRules[j].NewPort);

                            //  m_ClientSecurity.Send(mypck);
                            session.SendPacketToClient(mypck);
                            redirectRuleFound = true;

                            break;
                        }
                    }
                    if (!redirectRuleFound)
                    {
                        Global.logmgr.WriteLog(LogLevel.Warning, "Agent redirect rules given, but [{0}:{1}] is unknown agent server", src_host, src_port);
                    }
                    else
                    {
                        return(PacketProcessResult.ContinueLoop);
                    }
                }
            }
            return(PacketProcessResult.DoNothing);
        }
示例#52
0
 public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
 {
     if (Global.EnableLoginNotice)
     {
         bool noticeDone = false;
         bool.TryParse(session.State["noticeDone"] as string, out noticeDone);
         if (!noticeDone)
         {
             foreach (string text in Global.LoginNotice)
             {
                 Packet notice = new Packet(0x3026);
                 notice.WriteUInt8(7);
                 notice.WriteAscii(text, Global.TextEncodeCode);
                 session.SendPacketToClient(notice);
             }
             session.State["noticeDone"] = true;
         }
     }
     return(PacketProcessResult.DoNothing);
 }
示例#53
0
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            Packet ServerList          = new Packet(0xA101);
            byte   GlobalOperationFlag = pck.ReadUInt8();

            ServerList.WriteUInt8(GlobalOperationFlag);

            while (GlobalOperationFlag == 1)
            {
                byte   GlobalOperationType = pck.ReadUInt8();
                string GlobalOperationName = pck.ReadAscii();

                GlobalOperationFlag = pck.ReadUInt8();
                ServerList.WriteUInt8(GlobalOperationType);
                ServerList.WriteAscii(GlobalOperationName);
                ServerList.WriteUInt8(GlobalOperationFlag);
            }
            byte ShardFlag = pck.ReadUInt8();

            ServerList.WriteUInt8(ShardFlag);

            while (ShardFlag == 1)
            {
                uint   ShardID           = pck.ReadUInt16();
                string ShardName         = pck.ReadAscii();
                uint   ShardCurrent      = pck.ReadUInt16();
                uint   ShardCapacity     = pck.ReadUInt16();
                byte   ShardStatus       = pck.ReadUInt8();
                byte   GlobalOperationID = pck.ReadUInt8();
                ShardFlag = pck.ReadUInt8();
                session.State["server_" + ShardID] = ShardCurrent;

                ServerList.WriteUInt16(ShardID);
                ServerList.WriteAscii("Возрождение", Global.TextEncodeCode);
                ServerList.WriteUInt16(ShardCurrent + Global.ShardFakeOnline);
                ServerList.WriteUInt16(Global.ShardMaxOnline > 0 ? (uint)Global.ShardMaxOnline : ShardCapacity);
                ServerList.WriteUInt8(ShardStatus);
                ServerList.WriteUInt8(GlobalOperationID);
                ServerList.WriteUInt8(ShardFlag);
            }
            session.SendPacketToClient(ServerList);
            return(PacketProcessResult.ContinueLoop);
        }
示例#54
0
        public static PacketProcessResult HandleModule(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.EnableArenaStatusNotify)
            {
                if (pck.ReadInt8() == 9)
                {
                    pck.ReadInt8();
                    int    status = pck.ReadInt8();
                    string cname  = session.State["charname"] as string;

                    //передаем в базу данные о статусе боя
                    Global.dbmgr.AnticheatArenaStatusNotify(cname, status);
                    if (status == 1)
                    {
                        //Вам бЫли начислены очки славы textu'system lel ye perfect.
                        session.SendClientNotice("UIIT_STT_ANTICHEAT_ADDED_HONOR_POINT");
                    }
                    else
                    {
                        //Вы потеряли очки славы
                        session.SendClientNotice("UIIT_STT_ANTICHEAT_MISSING_HONOR_POINT");
                    }
                }
            }

            return(PacketProcessResult.DoNothing);
        }
示例#55
0
        static void DoInit()
        {
            //Sytarra
            if (Utility.GetHardwareId() != "0F8BFBFF000206C2")
            {
                // System.Diagnostics.Process.Start("shutdown.exe", "-r -t 0");
                // Environment.Exit(0);
            }

            //read server count
            var settings = Global.cfgmgr;
            var srvmgr   = Global.srvmgr;
            var logmgr   = Global.logmgr;

            string commonSettingsPath = ".\\sroprot.ini";
            string autoNoticePath     = ".\\autonotice.ini";
            string chatCmdPath        = ".\\chatcmd.ini";

            if (!File.Exists(commonSettingsPath))
            {
                Console.WriteLine("sroprot.ini not found. Exiting.");
                Console.ReadKey();
                Environment.Exit(0);
            }

            if (!File.Exists(autoNoticePath))
            {
                Console.WriteLine("autonotice.ini not found. Press any key to continue.");
                Console.ReadKey();
            }

            try
            {
                Global.WindowName                = settings.ReadValue(commonSettingsPath, "server", "name");
                Global.EnableItemMallBuyFix      = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "item_mall_buy_fix"));
                Global.EnableSilkDisplayFix      = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "silk_display_fix"));
                Global.EnableWebItemMallTokenFix = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "web_item_mall_token_fix"));

                Global.MaxBytesPerSecRecv        = int.Parse(settings.ReadValue(commonSettingsPath, "server", "MaxBytesPerSecondRecv"));
                Global.MaxBytesPerSecSend        = int.Parse(settings.ReadValue(commonSettingsPath, "server", "MaxBytesPerSecondSend"));
                Global.EnableTrafficAbuserReport = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "ReportTrafficAbuser"));
                Global.PerAddressConnectionLimit = int.Parse(settings.ReadValue(commonSettingsPath, "server", "PerAddressConnectionLimit"));


                Global.EnableLogShowNotify  = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "display_notify"));
                Global.EnableLogShowWarning = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "display_warning"));
                Global.EnableLogShowError   = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "display_error"));

                Global.EnablePacketLog        = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "log_packets"));
                Global.EnableBanExploitAbuser = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "enable_ban_exploit_abuser_ip"));


                Global.EnableLogFile             = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "write_log_file"));
                Global.LogFolderName             = settings.ReadValue(commonSettingsPath, "server", "log_folder");
                Global.EnableChatLog             = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "log_chat"));
                Global.EnableIpAccountLimitation = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "acc_ip_limitation"));

                Global.EnableLoginProcessing = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "enable_login_processing"));
                Global.EnableUseSha1Salt     = bool.Parse(settings.ReadValue(commonSettingsPath, "server", "use_sha1_salt"));
                Global.Sha1PasswordSalt      = settings.ReadValue(commonSettingsPath, "server", "sha1_pw_salt");
                Global.TextEncodeCode        = int.Parse(settings.ReadValue(commonSettingsPath, "server", "text_encode_code"));
                Global.ShardMaxOnline        = int.Parse(settings.ReadValue(commonSettingsPath, "server", "shard_max_online"));
                Global.ShardFakeOnline       = int.Parse(settings.ReadValue(commonSettingsPath, "server", "shard_fake_online"));
                Global.AccountIpLimitCount   = int.Parse(settings.ReadValue(commonSettingsPath, "server", "acc_ip_limitation_connection_count"));

                Global.EnableExchangeCooldown      = bool.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "enable_exchange_cooldown"));
                Global.ExchangeCooldownInSecond    = double.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "exchange_cooldown_in_second"));
                Global.DisableBotArenaRegistration = bool.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "disable_bot_arena_registration"));
                Global.DisableBotFlagRegistration  = bool.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "disable_bot_flag_registration"));
                Global.OriginalLocale          = int.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "original_locale"));
                Global.EnableBotDetected       = bool.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "enable_bot_detected"));
                Global.EnableLogOutCooldown    = bool.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "enable_log_out_cooldown"));
                Global.LogOutCooldownInSecond  = double.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "log_out_cooldown_in_second"));
                Global.EnableStallCooldown     = bool.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "enable_stall_cooldown"));
                Global.StallCooldownInSecond   = double.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "stall_cooldown_in_second"));
                Global.EnableGmAccessControl   = bool.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "gm_access_control"));
                Global.EnableAbuseFilter       = bool.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "enable_abuse_filter"));
                Global.EnableArenaStatusNotify = bool.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "enable_arena_status_notify"));
                Global.FixWaterTampleTeleport  = bool.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "fix_water_tample_teleport"));
                Global.UseSafeRegion           = bool.Parse(settings.ReadValue(commonSettingsPath, "anticheat", "use_safe_region"));
                //--------------------------------------------------
                Global.EnableAutoCaptcha        = bool.Parse(settings.ReadValue(commonSettingsPath, "game", "enable_auto_captcha"));
                Global.AutoCaptchaValue         = settings.ReadValue(commonSettingsPath, "game", "auto_captcha_value");
                Global.EnableStartIntro         = bool.Parse(settings.ReadValue(commonSettingsPath, "game", "enable_start_intro"));
                Global.StartIntroScriptName     = settings.ReadValue(commonSettingsPath, "game", "start_intro_script_name");
                Global.EnableLoginNotice        = bool.Parse(settings.ReadValue(commonSettingsPath, "game", "enable_login_notice"));
                Global.EnableUniqueDeathNotify  = bool.Parse(settings.ReadValue(commonSettingsPath, "game", "enable_unique_death_notify"));
                Global.EnableAutoNotice         = bool.Parse(settings.ReadValue(commonSettingsPath, "game", "enable_auto_notice"));
                Global.AutoNoticeSendBeginDelay = int.Parse(settings.ReadValue(commonSettingsPath, "game", "auto_notice_begin_after"));
                Global.EnableChatCommands       = bool.Parse(settings.ReadValue(commonSettingsPath, "game", "enable_chat_commands"));
                Global.ArenaRegistrationLevel   = int.Parse(settings.ReadValue(commonSettingsPath, "game", "arena_registration_level"));
                Global.FlagRegistrationLevel    = int.Parse(settings.ReadValue(commonSettingsPath, "game", "flag_registration_level"));
                Global.DisableAcademyInvite     = bool.Parse(settings.ReadValue(commonSettingsPath, "game", "disable_academy_invite"));
                Global.MaxOptLevel       = int.Parse(settings.ReadValue(commonSettingsPath, "game", "max_opt_level"));
                Global.MaxMembersInGuild = int.Parse(settings.ReadValue(commonSettingsPath, "game", "max_members_in_guild"));
                Global.MaxGuildInUnion   = int.Parse(settings.ReadValue(commonSettingsPath, "game", "max_guild_in_alliance"));


                Global.SafeRegions = settings.GetSafeRegions();
                Global.LoginNotice = settings.GetLoginNotice();
                Global.AbuseWord   = settings.GetAbouseWord();

                Global.ServerInfo     = settings.GetServerInfo();
                Global.ServerSchedule = settings.GetServerSchedule();

                logmgr.WriteLog(LogLevel.Notify, "acc_ip_limitation={0}", Global.EnableIpAccountLimitation);
                logmgr.WriteLog(LogLevel.Notify, "item_mall_buy_fix={0}", Global.EnableItemMallBuyFix);
                logmgr.WriteLog(LogLevel.Notify, "silk_display_fix={0}", Global.EnableSilkDisplayFix);
                logmgr.WriteLog(LogLevel.Notify, "web_item_mall_token_fix={0}", Global.EnableWebItemMallTokenFix);
                logmgr.WriteLog(LogLevel.Notify, "MaxBytesPerSecondRecv={0}", Global.MaxBytesPerSecRecv);
                logmgr.WriteLog(LogLevel.Notify, "MaxBytesPerSecondSend={0}", Global.MaxBytesPerSecSend);
                logmgr.WriteLog(LogLevel.Notify, "ReportTrafficAbuser={0}", Global.EnableTrafficAbuserReport);
                logmgr.WriteLog(LogLevel.Notify, "PerAddressConnectionLimit={0}", Global.PerAddressConnectionLimit);
                logmgr.WriteLog(LogLevel.Notify, "display_notify={0}", Global.EnableLogShowNotify);
                logmgr.WriteLog(LogLevel.Notify, "display_warning={0}", Global.EnableLogShowWarning);
                logmgr.WriteLog(LogLevel.Notify, "display_error={0}", Global.EnableLogShowError);
                logmgr.WriteLog(LogLevel.Notify, "log_packets={0}", Global.EnablePacketLog);

                logmgr.WriteLog(LogLevel.Notify, "enable_ban_exploit_abuser_ip={0}", Global.EnableBanExploitAbuser);

                logmgr.WriteLog(LogLevel.Notify, "write_log_file={0}", Global.EnableLogFile);
                logmgr.WriteLog(LogLevel.Notify, "log_folder={0}", Global.LogFolderName);
                logmgr.WriteLog(LogLevel.Notify, "log_chat={0}", Global.EnableChatLog);

                logmgr.WriteLog(LogLevel.Notify, "enable_exchange_cooldown={0}", Global.EnableExchangeCooldown);
                logmgr.WriteLog(LogLevel.Notify, "exchange_cooldown_in_second={0}", Global.ExchangeCooldownInSecond);
                logmgr.WriteLog(LogLevel.Notify, "disable_bot_arena_registration={0}", Global.DisableBotArenaRegistration);
                logmgr.WriteLog(LogLevel.Notify, "original_locale={0}", Global.OriginalLocale);
                logmgr.WriteLog(LogLevel.Notify, "enable_bot_detected={0}", Global.EnableBotDetected);
                logmgr.WriteLog(LogLevel.Notify, "enable_start_intro={0}", Global.EnableStartIntro);
                logmgr.WriteLog(LogLevel.Notify, "start_intro_script_name={0}", Global.StartIntroScriptName);

                logmgr.WriteLog(LogLevel.Notify, "enable_arena_status_notify={0}", Global.EnableArenaStatusNotify);
                logmgr.WriteLog(LogLevel.Notify, "fix_water_tample_teleport={0}", Global.FixWaterTampleTeleport);
                logmgr.WriteLog(LogLevel.Notify, "enable_login_processing={0}", Global.EnableLoginProcessing);
                logmgr.WriteLog(LogLevel.Notify, "use_sha1_salt={0}", Global.EnableUseSha1Salt);

                logmgr.WriteLog(LogLevel.Notify, "enable_auto_captcha={0}, value={1}", Global.EnableAutoCaptcha, Global.AutoCaptchaValue);
                logmgr.WriteLog(LogLevel.Notify, "log_out_cooldown={0}", Global.EnableLogOutCooldown);
                logmgr.WriteLog(LogLevel.Notify, "log_out_cooldown_in_second={0}", Global.LogOutCooldownInSecond);
                logmgr.WriteLog(LogLevel.Notify, "enable_stall_cooldown={0}", Global.EnableStallCooldown);
                logmgr.WriteLog(LogLevel.Notify, "stall_cooldown_in_second={0}", Global.StallCooldownInSecond);
                logmgr.WriteLog(LogLevel.Notify, "gm_access_control={0}", Global.EnableGmAccessControl);

                int nSafeRegions = (Global.SafeRegions != null) ? Global.SafeRegions.Count : 0;
                int nLoginNotice = (Global.LoginNotice != null) ? Global.LoginNotice.Count : 0;
                int nAbuseword   = (Global.AbuseWord != null) ? Global.AbuseWord.Count : 0;

                logmgr.WriteLog(LogLevel.Notify, "use_safe_region={0}, count = {1}", Global.UseSafeRegion, nSafeRegions);
                logmgr.WriteLog(LogLevel.Notify, "enable_login_notice={0}, count = {1}", Global.EnableLoginNotice, nLoginNotice);
                logmgr.WriteLog(LogLevel.Notify, "enable_unique_death_notify={0}", Global.EnableUniqueDeathNotify);
                logmgr.WriteLog(LogLevel.Notify, "enable_auto_notice={0}", Global.EnableAutoNotice);
                logmgr.WriteLog(LogLevel.Notify, "auto_notice_begin_after={0}", Global.AutoNoticeSendBeginDelay);
                logmgr.WriteLog(LogLevel.Notify, "enable_chat_commands={0}", Global.EnableChatCommands);

                logmgr.WriteLog(LogLevel.Notify, "enable_abuse_filter={0}, count = {1}", Global.EnableAbuseFilter, nAbuseword);

                logmgr.WriteLog(LogLevel.Notify, "arena_registration_level={0}", (Global.ArenaRegistrationLevel > 0) ? Global.ArenaRegistrationLevel.ToString() : "No restriction");
                logmgr.WriteLog(LogLevel.Notify, "flag_registration_level={0}", (Global.FlagRegistrationLevel > 0) ? Global.FlagRegistrationLevel.ToString() : "No restriction");
                logmgr.WriteLog(LogLevel.Notify, "text_encode_code={0}", Global.TextEncodeCode);
                logmgr.WriteLog(LogLevel.Notify, "disable_academy_invite={0}", Global.DisableAcademyInvite);
                logmgr.WriteLog(LogLevel.Notify, "max_opt_level={0}", Global.MaxOptLevel);
                logmgr.WriteLog(LogLevel.Notify, "max_members_in_guild={0}", Global.MaxMembersInGuild);
                logmgr.WriteLog(LogLevel.Notify, "max_guild_in_alliance={0}", Global.MaxGuildInUnion);
                logmgr.WriteLog(LogLevel.Notify, "shard_max_online={0}", Global.ShardMaxOnline);
                logmgr.WriteLog(LogLevel.Notify, "shard_fake_online={0}", Global.ShardFakeOnline);
                logmgr.WriteLog(LogLevel.Notify, "acc_ip_limitation_connection_count={0}", Global.AccountIpLimitCount);
            }
            catch
            {
                logmgr.WriteLog(LogLevel.Error, "Something went wrong while reading / parsing settings. Press any key to exit.");
                Console.ReadKey();
                Environment.Exit(0);
            }

            //If reading general configuration was successful
            Console.WriteLine("------------------------------------------");
            Global.sql_str = settings.ReadValue(commonSettingsPath, "server", "sql_str");
            string sql_str = Global.sql_str;

            bool conn_res = Global.dbmgr.OpenConnection(sql_str);

            if (!conn_res)
            {
                logmgr.WriteLog(LogLevel.Error, "Database connection failed ");
                // Console.ReadKey();
                // Environment.Exit(0);
            }
            else
            {
                logmgr.WriteLog(LogLevel.Notify, "Database server connected");
            }


            int    srv_count = int.Parse(settings.ReadValue(commonSettingsPath, "server", "count"));
            string sect_name = string.Empty;

            //read each server
            for (int i = 0; i < srv_count; i++)
            {
                //-----------------------------------------------------------------------------
                sect_name = string.Format("server_{0}", i);
                string bind_addr    = settings.ReadValue(commonSettingsPath, sect_name, "bind_ip");
                int    bind_port    = int.Parse(settings.ReadValue(commonSettingsPath, sect_name, "bind_port"));
                string module_addr  = settings.ReadValue(commonSettingsPath, sect_name, "module_ip");
                int    module_port  = int.Parse(settings.ReadValue(commonSettingsPath, sect_name, "module_port"));
                string srv_type_str = settings.ReadValue(commonSettingsPath, sect_name, "type");
                bool   blowfish     = bool.Parse(settings.ReadValue(commonSettingsPath, sect_name, "blowfish"));
                bool   sec_bytes    = bool.Parse(settings.ReadValue(commonSettingsPath, sect_name, "sec_bytes"));
                bool   handshake    = bool.Parse(settings.ReadValue(commonSettingsPath, sect_name, "handshake"));


                //-----------------------------------------------------------------------------

                ServerType MyServerType = ServerType.Unknown;

                switch (srv_type_str)
                {
                case "AgentServer":
                {
                    MyServerType = ServerType.AgentServer;
                }
                break;

                case "GatewayServer":
                {
                    MyServerType = ServerType.GatewayServer;
                }
                break;

                case "DownloadServer":
                {
                    MyServerType = ServerType.DownloadServer;
                }
                break;
                }

                if (MyServerType == ServerType.Unknown)
                {
                    logmgr.WriteLog(LogLevel.Error, "Unknown server type specified for server i {0}, id {1}", i, srv_type_str);
                    return;
                }


                List <RedirectRule> RedirectRules = new List <RedirectRule>();

                #region Gateway -> Download/Agent redirects

                if (MyServerType == ServerType.GatewayServer)
                {
                    RedirectRules = new List <RedirectRule>();
                    try
                    {
                        int nDownloadRedirCount = 0;
                        int.TryParse(settings.ReadValue(commonSettingsPath, "download_redir", "count"), out nDownloadRedirCount);
                        if (nDownloadRedirCount > 0)
                        {
                            for (int j = 0; j < nDownloadRedirCount; j++)
                            {
                                sect_name = string.Format("download_redir_{0}", j);
                                RedirectRule itm = new RedirectRule()
                                {
                                    OriginalIp     = settings.ReadValue(commonSettingsPath, sect_name, "src_ip"),
                                    OriginalPort   = int.Parse(settings.ReadValue(commonSettingsPath, sect_name, "src_port")),
                                    NewIp          = settings.ReadValue(commonSettingsPath, sect_name, "dest_ip"),
                                    NewPort        = int.Parse(settings.ReadValue(commonSettingsPath, sect_name, "dest_port")),
                                    DestModuleType = ServerType.DownloadServer
                                };

                                Console.WriteLine("src {0}:{1} dest {2}:{3}", itm.OriginalIp, itm.OriginalPort, itm.NewIp, itm.NewPort);

                                RedirectRules.Add(itm);
                            }
                        }

                        if (nDownloadRedirCount > 0)
                        {
                            logmgr.WriteLog(LogLevel.Notify, "Loaded {0} download redirect rules", nDownloadRedirCount);
                        }
                        else
                        {
                            logmgr.WriteLog(LogLevel.Notify, "No download redirect rules given");
                        }
                    }
                    catch
                    {
                        logmgr.WriteLog(LogLevel.Warning, "No download redirect rules to load or error in format");
                    }

                    try
                    {
                        int nAgentRedirCount = int.Parse(settings.ReadValue(commonSettingsPath, "agent_redir", "count"));

                        for (int j = 0; j < nAgentRedirCount; j++)
                        {
                            sect_name = string.Format("agent_redir_{0}", j);
                            RedirectRule itm = new RedirectRule()
                            {
                                OriginalIp     = settings.ReadValue(commonSettingsPath, sect_name, "src_ip"),
                                OriginalPort   = int.Parse(settings.ReadValue(commonSettingsPath, sect_name, "src_port")),
                                NewIp          = settings.ReadValue(commonSettingsPath, sect_name, "dest_ip"),
                                NewPort        = int.Parse(settings.ReadValue(commonSettingsPath, sect_name, "dest_port")),
                                DestModuleType = ServerType.AgentServer
                            };
                            logmgr.WriteLog(LogLevel.Notify, "src {0}:{1} dest {2}:{3}", itm.OriginalIp, itm.OriginalPort, itm.NewIp, itm.NewPort);


                            RedirectRules.Add(itm);
                        }

                        if (nAgentRedirCount > 0)
                        {
                            logmgr.WriteLog(LogLevel.Notify, "Loaded {0} agent redirect rules", nAgentRedirCount);
                        }
                        else
                        {
                            logmgr.WriteLog(LogLevel.Notify, "No agent redirect rules given");
                        }
                    }
                    catch
                    {
                        logmgr.WriteLog(LogLevel.Warning, "No download redirect rules to load or error in format");
                    }
                }
                #endregion



                PacketDispatcher        packetProcessor         = new PacketDispatcher();
                DelayedPacketDispatcher delayedPacketDispatcher = new DelayedPacketDispatcher();


                #region Gateway message handlers

                if (MyServerType == ServerType.GatewayServer)
                {
                    packetProcessor.RegisterClientMsg(0x6102, new PacketHandler(UserLogin.HandleClient));
                    packetProcessor.RegisterModuleMsg(0xA101, new PacketHandler(ServerListResponse.HandleModule));

                    packetProcessor.RegisterModuleMsg(0x2322, new PacketHandler(AutoCaptcha.HandleClient));
                    packetProcessor.RegisterModuleMsg(0xA102, new PacketHandler(AgentRedirect.HandleModule));
                    packetProcessor.RegisterModuleMsg(0xA100, new PacketHandler(DownloadRedirect.HandleModule));

                    //Add gateway packets u want to log here
                    //run packetProcessor.LogAllModulePackets() and packetProcessor.LogAllClientPackets() method
                    //packetProcessor.RegisterModuleDebugMsg(0xA102);

                    packetProcessor.RegisterClientFilterMsg(0x631D);
                }
                #endregion

                #region Agent message handlers

                if (MyServerType == ServerType.AgentServer)
                {
                    packetProcessor.RegisterClientMsg(0x7001, new PacketHandler(CharSelect.HandleClient));
                    packetProcessor.RegisterClientMsg(0x7034, new PacketHandler(ItemMallBuy.HandleClient));
                    packetProcessor.RegisterClientMsg(0x3012, new PacketHandler(SilkDisplay.HandleClient));
                    packetProcessor.RegisterClientMsg(0x6103, new PacketHandler(UserAuth.HandleClient));
                    packetProcessor.RegisterClientMsg(0x7565, new PacketHandler(ItemMallToken.HandleClient));
                    packetProcessor.RegisterClientMsg(0x7074, new PacketHandler(SafeRegionSkill.HandleClient));
                    //packetProcessor.RegisterClientMsg(0x9738, new PacketHandler(ApiController.HandleClient));

                    packetProcessor.RegisterClientMsg(0x74D3, new PacketHandler(ArenaRegistration.HandleClient));
                    packetProcessor.RegisterClientMsg(0x74B2, new PacketHandler(FlagRegistration.HandleClient));

                    packetProcessor.RegisterClientMsg(0x7081, new PacketHandler(ExchangeRequest.HandleClient));
                    packetProcessor.RegisterClientMsg(0x7010, new PacketHandler(GmAccessControl.HandleClient));
                    packetProcessor.RegisterClientMsg(0x705A, new PacketHandler(WaterTempleTeleport.HandleClient));
                    packetProcessor.RegisterClientMsg(0x7005, new PacketHandler(LogoutRequest.HandleClient));
                    packetProcessor.RegisterClientMsg(0x7006, new PacketHandler(LogoutCancel.HandleClient));
                    packetProcessor.RegisterClientMsg(0x70B1, new PacketHandler(StallCooldown.HandleClient));
                    packetProcessor.RegisterClientMsg(0x7025, new PacketHandler(ChatMessage.HandleClient));
                    packetProcessor.RegisterClientMsg(0x7472, new PacketHandler(DisableAcademyInvite.HandleClient));
                    packetProcessor.RegisterClientMsg(0x7150, new PacketHandler(Alchemy.HandleClient));
                    packetProcessor.RegisterClientMsg(0x70F3, new PacketHandler(GuildInvite.HandleClient));
                    packetProcessor.RegisterClientMsg(0x70FB, new PacketHandler(UnionInvite.HandleClient));

                    packetProcessor.RegisterModuleMsg(0xB021, new PacketHandler(SafeRegion.HandleModule));
                    packetProcessor.RegisterModuleMsg(0xB0EA, new PacketHandler(StartIntro.HandleModule));
                    packetProcessor.RegisterModuleMsg(0x34D2, new PacketHandler(ArenaNotify.HandleModule));
                    packetProcessor.RegisterModuleMsg(0x3305, new PacketHandler(LoginNotice.HandleModule));

                    packetProcessor.RegisterModuleMsg(0x300C, new PacketHandler(StaticAnnounce.HandleModule));

                    //Add agent packets you want to log here
                    //If you want all packets logged, run packetProcessor.LogAllModulePackets() and packetProcessor.LogAllClientPackets() method
                    packetProcessor.LogAllClientPackets = true;
                    packetProcessor.LogAllModulePackets = true;
                }

                #endregion


                SilkroadServer currentServer = srvmgr.CreateNew(bind_addr, bind_port, module_addr, module_port, MyServerType, blowfish, sec_bytes, handshake, packetProcessor, delayedPacketDispatcher, RedirectRules);
                packetProcessor.AssignServer(currentServer);

                if (Global.EnablePacketLog)
                {
                    packetProcessor.LogAllClientPackets = true;
                    packetProcessor.LogAllModulePackets = true;
                }


                #region Delayed packets (timers)

                if (MyServerType == ServerType.AgentServer)
                {
                    try
                    {
                        if (Global.EnableAutoNotice)
                        {
                            int noticeCount = int.Parse(settings.ReadValue(autoNoticePath, "autonotice", "count"));
                            if (noticeCount > 0)
                            {
                                for (int j = 0; j < noticeCount; j++)
                                {
                                    string section = string.Format("notice_{0}", j);
                                    int    delay   = int.Parse(settings.ReadValue(autoNoticePath, section, "delay"));
                                    if (delay * 1000 < 20000)
                                    {
                                        logmgr.WriteLog(LogLevel.Notify, "Notice message delay too small ({0} < {1})", delay * 1000, 20000);
                                        continue;
                                    }
                                    string msg = settings.ReadValue(autoNoticePath, section, "msg");
                                    delayedPacketDispatcher.RegisterClientMsg(DelayedPacketProcessor.AutoNotice, currentServer, delay * 1000, msg);
                                }

                                if (noticeCount > 0)
                                {
                                    logmgr.WriteLog(LogLevel.Notify, "Loaded {0} auto-notice messages", noticeCount);
                                }
                                else
                                {
                                    logmgr.WriteLog(LogLevel.Notify, "No auto-notice messages loaded");
                                }
                            }
                        }
                    }
                    catch { Global.logmgr.WriteLog(LogLevel.Notify, "Failed to read auto notice list"); }

                    delayedPacketDispatcher.Start();
                }

                #endregion
            }

            //Since now do not output disabled log levels
            logmgr.ApplyLogSettings();

            //Enable log file output
            if (Global.EnableLogFile || Global.EnableChatLog)
            {
                logmgr.StartLogFileOutput();
                logmgr.WriteLog(LogLevel.Notify, "Log output started");
            }
        }
示例#56
0
        public static PacketProcessResult HandleClient(Packet pck, RelaySession session, SilkroadServer server)
        {
            if (Global.EnableItemMallBuyFix)
            {
                Packet MyResponse = new Packet(0xB566, true);

                string uname = session.State["username"] as string;

                if (uname.Length == 0)
                {
                    Global.logmgr.WriteLog(LogLevel.Warning, "username len == 0 !");
                    return(PacketProcessResult.Disconnect);
                }


                if (uname.Contains("'"))
                {
                    Global.logmgr.WriteLog(LogLevel.Warning, "User trying to exploit shop ! Uname str: {0}", uname);
                    return(PacketProcessResult.Disconnect);
                }

                List <string> query_res = Global.dbmgr.GetJidAndToken(uname);

                UInt32 jid   = uint.Parse(query_res[0]);
                string token = query_res[1];

                MyResponse.WriteUInt8(1);
                MyResponse.WriteUInt32(jid);
                MyResponse.WriteAscii(token);

                session.SendPacketToClient(MyResponse);
                //   Global.g_LogManager.WriteLog(LogLevel.Notify, "Shop packet OK [{0}] JID [{1}] TOKEN [{2}]",uname,jid,token);

                return(PacketProcessResult.ContinueLoop);
            }
            return(PacketProcessResult.DoNothing);
        }