private void Init(int userId, string message, BanMode banMode, int delaySeconds, int durationHours) { this.userId = userId; this.message = message; this.banMode = banMode; delay = delaySeconds; this.durationHours = durationHours; }
static bool HandleUnBanHelper(BanMode mode, StringArguments args, CommandHandler handler) { if (args.Empty()) { return(false); } string nameOrIP = args.NextString(); if (string.IsNullOrEmpty(nameOrIP)) { return(false); } switch (mode) { case BanMode.Character: if (!ObjectManager.NormalizePlayerName(ref nameOrIP)) { handler.SendSysMessage(CypherStrings.PlayerNotFound); return(false); } break; case BanMode.IP: IPAddress address; if (!IPAddress.TryParse(nameOrIP, out address)) { return(false); } break; } if (Global.WorldMgr.RemoveBanAccount(mode, nameOrIP)) { handler.SendSysMessage(CypherStrings.UnbanUnbanned, nameOrIP); } else { handler.SendSysMessage(CypherStrings.UnbanError, nameOrIP); } return(true); }
static bool HandleBanHelper(BanMode mode, StringArguments args, CommandHandler handler) { if (args.Empty()) { return(false); } string nameOrIP = args.NextString(); if (string.IsNullOrEmpty(nameOrIP)) { return(false); } string durationStr = args.NextString(); if (!uint.TryParse(durationStr, out uint duration)) { return(false); } string reasonStr = args.NextString(""); if (string.IsNullOrEmpty(reasonStr)) { return(false); } switch (mode) { case BanMode.Character: if (!ObjectManager.NormalizePlayerName(ref nameOrIP)) { handler.SendSysMessage(CypherStrings.PlayerNotFound); return(false); } break; case BanMode.IP: IPAddress address; if (!IPAddress.TryParse(nameOrIP, out address)) { return(false); } break; } string author = handler.GetSession() ? handler.GetSession().GetPlayerName() : "Server"; switch (Global.WorldMgr.BanAccount(mode, nameOrIP, durationStr, reasonStr, author)) { case BanReturn.Success: if (!uint.TryParse(durationStr, out uint tempValue) || tempValue > 0) { if (WorldConfig.GetBoolValue(WorldCfg.ShowBanInWorld)) { Global.WorldMgr.SendWorldText(CypherStrings.BanAccountYoubannedmessageWorld, author, nameOrIP, Time.secsToTimeString(Time.TimeStringToSecs(durationStr)), reasonStr); } else { handler.SendSysMessage(CypherStrings.BanYoubanned, nameOrIP, Time.secsToTimeString(Time.TimeStringToSecs(durationStr), true), reasonStr); } } else { if (WorldConfig.GetBoolValue(WorldCfg.ShowBanInWorld)) { Global.WorldMgr.SendWorldText(CypherStrings.BanAccountYoupermbannedmessageWorld, author, nameOrIP, reasonStr); } else { handler.SendSysMessage(CypherStrings.BanYoupermbanned, nameOrIP, reasonStr); } } break; case BanReturn.SyntaxError: return(false); case BanReturn.Notfound: switch (mode) { default: handler.SendSysMessage(CypherStrings.BanNotfound, "account", nameOrIP); break; case BanMode.Character: handler.SendSysMessage(CypherStrings.BanNotfound, "character", nameOrIP); break; case BanMode.IP: handler.SendSysMessage(CypherStrings.BanNotfound, "ip", nameOrIP); break; } return(false); case BanReturn.Exists: handler.SendSysMessage(CypherStrings.BanExists); break; } return(true); }
//todo fix me public bool EvaluateOpcode(WorldPacket packet, long time) { uint maxPacketCounterAllowed = 0;// GetMaxPacketCounterAllowed(p.GetOpcode()); // Return true if there no limit for the opcode if (maxPacketCounterAllowed == 0) { return(true); } if (!_PacketThrottlingMap.ContainsKey(packet.GetOpcode())) { _PacketThrottlingMap[packet.GetOpcode()] = new PacketCounter(); } PacketCounter packetCounter = _PacketThrottlingMap[packet.GetOpcode()]; if (packetCounter.lastReceiveTime != time) { packetCounter.lastReceiveTime = time; packetCounter.amountCounter = 0; } // Check if player is flooding some packets if (++packetCounter.amountCounter <= maxPacketCounterAllowed) { return(true); } Log.outWarn(LogFilter.Network, "AntiDOS: Account {0}, IP: {1}, Ping: {2}, Character: {3}, flooding packet (opc: {4} (0x{4}), count: {5})", Session.GetAccountId(), Session.GetRemoteAddress(), Session.GetLatency(), Session.GetPlayerName(), packet.GetOpcode(), packetCounter.amountCounter); switch (_policy) { case Policy.Log: return(true); case Policy.Kick: Log.outInfo(LogFilter.Network, "AntiDOS: Player kicked!"); return(false); case Policy.Ban: BanMode bm = (BanMode)WorldConfig.GetIntValue(WorldCfg.PacketSpoofBanmode); uint duration = WorldConfig.GetUIntValue(WorldCfg.PacketSpoofBanduration); // in seconds string nameOrIp = ""; switch (bm) { case BanMode.Character: // not supported, ban account case BanMode.Account: Global.AccountMgr.GetName(Session.GetAccountId(), out nameOrIp); break; case BanMode.IP: nameOrIp = Session.GetRemoteAddress(); break; } Global.WorldMgr.BanAccount(bm, nameOrIp, duration, "DOS (Packet Flooding/Spoofing", "Server: AutoDOS"); Log.outInfo(LogFilter.Network, "AntiDOS: Player automatically banned for {0} seconds.", duration); return(false); } return(true); }
public void HandleLoginRequest(HttpHeader request) { LogonData loginForm = Json.CreateObject <LogonData>(request.Content); LogonResult loginResult = new LogonResult(); if (loginForm == null) { loginResult.AuthenticationState = "LOGIN"; loginResult.ErrorCode = "UNABLE_TO_DECODE"; loginResult.ErrorMessage = "There was an internal error while connecting to Battle.net. Please try again later."; SendResponse(HttpCode.BadRequest, loginResult); return; } string login = ""; string password = ""; for (int i = 0; i < loginForm.Inputs.Count; ++i) { switch (loginForm.Inputs[i].Id) { case "account_name": login = loginForm.Inputs[i].Value; break; case "password": password = loginForm.Inputs[i].Value; break; } } PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_BNET_AUTHENTICATION); stmt.AddValue(0, login); SQLResult result = DB.Login.Query(stmt); if (!result.IsEmpty()) { uint accountId = result.Read <uint>(0); string pass_hash = result.Read <string>(1); uint failedLogins = result.Read <uint>(2); string loginTicket = result.Read <string>(3); uint loginTicketExpiry = result.Read <uint>(4); bool isBanned = result.Read <ulong>(5) != 0; if (CalculateShaPassHash(login, password) == pass_hash) { if (loginTicket.IsEmpty() || loginTicketExpiry < Time.UnixTime) { byte[] ticket = new byte[0].GenerateRandomKey(20); loginTicket = "TC-" + ticket.ToHexString(); } stmt = DB.Login.GetPreparedStatement(LoginStatements.UPD_BNET_AUTHENTICATION); stmt.AddValue(0, loginTicket); stmt.AddValue(1, Time.UnixTime + 3600); stmt.AddValue(2, accountId); DB.Login.Execute(stmt); loginResult.LoginTicket = loginTicket; } else if (!isBanned) { uint maxWrongPassword = ConfigMgr.GetDefaultValue("WrongPass.MaxCount", 0u); if (ConfigMgr.GetDefaultValue("WrongPass.Logging", false)) { Log.outDebug(LogFilter.Network, "[{0}, Account {1}, Id {2}] Attempted to connect with wrong password!", request.Host, login, accountId); } if (maxWrongPassword != 0) { SQLTransaction trans = new SQLTransaction(); stmt = DB.Login.GetPreparedStatement(LoginStatements.UPD_BNET_FAILED_LOGINS); stmt.AddValue(0, accountId); trans.Append(stmt); ++failedLogins; Log.outDebug(LogFilter.Network, "MaxWrongPass : {0}, failed_login : {1}", maxWrongPassword, accountId); if (failedLogins >= maxWrongPassword) { BanMode banType = ConfigMgr.GetDefaultValue("WrongPass.BanType", BanMode.Ip); int banTime = ConfigMgr.GetDefaultValue("WrongPass.BanTime", 600); if (banType == BanMode.Account) { stmt = DB.Login.GetPreparedStatement(LoginStatements.INS_BNET_ACCOUNT_AUTO_BANNED); stmt.AddValue(0, accountId); } else { stmt = DB.Login.GetPreparedStatement(LoginStatements.INS_IP_AUTO_BANNED); stmt.AddValue(0, request.Host); } stmt.AddValue(1, banTime); trans.Append(stmt); stmt = DB.Login.GetPreparedStatement(LoginStatements.UPD_BNET_RESET_FAILED_LOGINS); stmt.AddValue(0, accountId); trans.Append(stmt); } DB.Login.CommitTransaction(trans); } } loginResult.AuthenticationState = "DONE"; SendResponse(HttpCode.Ok, loginResult); } else { loginResult.AuthenticationState = "LOGIN"; loginResult.ErrorCode = "UNABLE_TO_DECODE"; loginResult.ErrorMessage = "There was an internal error while connecting to Battle.net. Please try again later."; SendResponse(HttpCode.BadRequest, loginResult); } }
public Complexify(Int16 minimumChars = 8, float strengthScaleFactor = 1f, BanMode banMode = BanMode.strict) { this._minimumChars = minimumChars; this._strengthScaleFactor = strengthScaleFactor; this._banMode = banMode; }
public void HandleLoginRequest(HttpHeader request) { LogonData loginForm = Json.CreateObject <LogonData>(request.Content); LogonResult loginResult = new LogonResult(); if (loginForm == null) { loginResult.AuthenticationState = "LOGIN"; loginResult.ErrorCode = "UNABLE_TO_DECODE"; loginResult.ErrorMessage = "There was an internal error while connecting to Battle.net. Please try again later."; SendResponse(HttpCode.BadRequest, loginResult); return; } string login = ""; string password = ""; for (int i = 0; i < loginForm.Inputs.Count; ++i) { switch (loginForm.Inputs[i].Id) { case "account_name": login = loginForm.Inputs[i].Value; break; case "password": password = loginForm.Inputs[i].Value; break; } } PreparedStatement stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_BNET_ACCOUNT_INFO); stmt.AddValue(0, login); SQLResult result = DB.Login.Query(stmt); if (result.IsEmpty()) { loginResult.AuthenticationState = "LOGIN"; loginResult.ErrorCode = "UNABLE_TO_DECODE"; loginResult.ErrorMessage = "There was an internal error while connecting to Battle.net. Please try again later."; SendResponse(HttpCode.BadRequest, loginResult); return; } string pass_hash = result.Read <string>(13); var accountInfo = new AccountInfo(); accountInfo.LoadResult(result); if (CalculateShaPassHash(login, password) == pass_hash) { stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_BNET_CHARACTER_COUNTS_BY_BNET_ID); stmt.AddValue(0, accountInfo.Id); SQLResult characterCountsResult = DB.Login.Query(stmt); if (!characterCountsResult.IsEmpty()) { do { accountInfo.GameAccounts[characterCountsResult.Read <uint>(0)] .CharacterCounts[new RealmHandle(characterCountsResult.Read <byte>(3), characterCountsResult.Read <byte>(4), characterCountsResult.Read <uint>(2)).GetAddress()] = characterCountsResult.Read <byte>(1); } while (characterCountsResult.NextRow()); } stmt = DB.Login.GetPreparedStatement(LoginStatements.SEL_BNET_LAST_PLAYER_CHARACTERS); stmt.AddValue(0, accountInfo.Id); SQLResult lastPlayerCharactersResult = DB.Login.Query(stmt); if (!lastPlayerCharactersResult.IsEmpty()) { RealmHandle realmId = new RealmHandle(lastPlayerCharactersResult.Read <byte>(1), lastPlayerCharactersResult.Read <byte>(2), lastPlayerCharactersResult.Read <uint>(3)); LastPlayedCharacterInfo lastPlayedCharacter = new LastPlayedCharacterInfo(); lastPlayedCharacter.RealmId = realmId; lastPlayedCharacter.CharacterName = lastPlayerCharactersResult.Read <string>(4); lastPlayedCharacter.CharacterGUID = lastPlayerCharactersResult.Read <ulong>(5); lastPlayedCharacter.LastPlayedTime = lastPlayerCharactersResult.Read <uint>(6); accountInfo.GameAccounts[lastPlayerCharactersResult.Read <uint>(0)].LastPlayedCharacters[realmId.GetSubRegionAddress()] = lastPlayedCharacter; } byte[] ticket = new byte[0].GenerateRandomKey(20); loginResult.LoginTicket = "TC-" + ticket.ToHexString(); Global.SessionMgr.AddLoginTicket(loginResult.LoginTicket, accountInfo); } else if (!accountInfo.IsBanned) { uint maxWrongPassword = ConfigMgr.GetDefaultValue("WrongPass.MaxCount", 0u); if (ConfigMgr.GetDefaultValue("WrongPass.Logging", false)) { Log.outDebug(LogFilter.Network, "[{0}, Account {1}, Id {2}] Attempted to connect with wrong password!", request.Host, login, accountInfo.Id); } if (maxWrongPassword != 0) { SQLTransaction trans = new SQLTransaction(); stmt = DB.Login.GetPreparedStatement(LoginStatements.UPD_BNET_FAILED_LOGINS); stmt.AddValue(0, accountInfo.Id); trans.Append(stmt); ++accountInfo.FailedLogins; Log.outDebug(LogFilter.Network, "MaxWrongPass : {0}, failed_login : {1}", maxWrongPassword, accountInfo.Id); if (accountInfo.FailedLogins >= maxWrongPassword) { BanMode banType = ConfigMgr.GetDefaultValue("WrongPass.BanType", BanMode.Ip); int banTime = ConfigMgr.GetDefaultValue("WrongPass.BanTime", 600); if (banType == BanMode.Account) { stmt = DB.Login.GetPreparedStatement(LoginStatements.INS_BNET_ACCOUNT_AUTO_BANNED); stmt.AddValue(0, accountInfo.Id); } else { stmt = DB.Login.GetPreparedStatement(LoginStatements.INS_IP_AUTO_BANNED); stmt.AddValue(0, request.Host); } stmt.AddValue(1, banTime); trans.Append(stmt); stmt = DB.Login.GetPreparedStatement(LoginStatements.UPD_BNET_RESET_FAILED_LOGINS); stmt.AddValue(0, accountInfo.Id); trans.Append(stmt); } DB.Login.CommitTransaction(trans); } } loginResult.AuthenticationState = "DONE"; SendResponse(HttpCode.Ok, loginResult); }
public BanUserRequest(int userId, string message, BanMode banMode, int delaySeconds) : base(RequestType.BanUser) { Init(userId, message, banMode, delaySeconds, 0); }
public BanUserRequest(int userId, string message, BanMode banMode) : base(RequestType.BanUser) { Init(userId, message, banMode, 5, 0); }