public void DeleteCharacter(CharacterDeletePacket characterDeletePacket) { Logger.Debug(characterDeletePacket.ToString(), Session.SessionId); if (Session.HasCurrentMap) { return; } AccountDTO account = DAOFactory.AccountDAO.LoadById(Session.Account.AccountId); if (account == null) { return; } if (account.Password.ToLower() == EncryptionBase.Sha512(characterDeletePacket.Password)) { CharacterDTO character = DAOFactory.CharacterDAO.LoadBySlot(account.AccountId, characterDeletePacket.Slot); if (character == null) { return; } DAOFactory.GeneralLogDAO.SetCharIdNull(Convert.ToInt64(character.CharacterId)); DAOFactory.CharacterDAO.DeleteByPrimaryKey(account.AccountId, characterDeletePacket.Slot); LoadCharacters(string.Empty); } else { Session.SendPacket($"info {Language.Instance.GetMessageFromKey("BAD_PASSWORD")}"); } }
/// <summary> /// Char_DEL packet /// </summary> /// <param name="characterDeletePacket"></param> public void DeleteCharacter(CharacterDeletePacket characterDeletePacket) { if (Session.HasCurrentMapInstance) { return; } AccountDTO account = DAOFactory.AccountDAO.FirstOrDefault(s => s.AccountId.Equals(Session.Account.AccountId)); if (account == null) { return; } if (account.Password.ToLower() == EncryptionBase.Sha512(characterDeletePacket.Password)) { CharacterDTO character = DAOFactory.CharacterDAO.FirstOrDefault(s => s.AccountId == account.AccountId && s.Slot == characterDeletePacket.Slot && s.State == (byte)CharacterState.Active); if (character == null) { return; } character.State = CharacterState.Inactive; DAOFactory.CharacterDAO.InsertOrUpdate(ref character); LoadCharacters(string.Empty); } else { Session.SendPacket($"info {Language.Instance.GetMessageFromKey("BAD_PASSWORD")}"); } }
public void DeleteCharacter(string packet) { Logger.Debug(packet, Session.SessionId); if (Session.HasCurrentMap) { return; } string[] deleteCharacterPacket = packet.Split(' '); AccountDTO account = DAOFactory.AccountDAO.LoadBySessionId(Session.SessionId); if (account == null) { return; } if (deleteCharacterPacket.Length <= 3) { return; } if (account != null && account.Password.ToLower() == EncryptionBase.Sha512(deleteCharacterPacket[3])) { CharacterDTO character = DAOFactory.CharacterDAO.LoadBySlot(account.AccountId, Convert.ToByte(deleteCharacterPacket[2])); if (character == null) { return; } DAOFactory.GeneralLogDAO.SetCharIdNull(Convert.ToInt64(character.CharacterId)); DAOFactory.CharacterDAO.DeleteByPrimaryKey(account.AccountId, Convert.ToByte(deleteCharacterPacket[2])); LoadCharacters(packet); } else { Session.SendPacket($"info {Language.Instance.GetMessageFromKey("BAD_PASSWORD")}"); } }
/// <inheritdoc /> public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) { context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" }); AccountDTO account = DaoFactory.AccountDao.LoadByName(context.UserName); if (account != null && account.Password.ToLower().Equals(EncryptionBase.Sha512(context.Password))) { var identity = new ClaimsIdentity(context.Options.AuthenticationType); identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, context.UserName)); identity.AddClaim(new Claim(ClaimTypes.Role, account.Authority.ToString())); context.Validated(identity); await OnGrantResourceOwnerCredentials(context); } else { context.SetError("invalid_grant", "The user name or password is incorrect."); } }
/// <summary> /// Char_DEL packet /// </summary> /// <param name="characterDeletePacket"></param> public void DeleteCharacter(CharacterDeletePacket characterDeletePacket) { if (Session.HasCurrentMapInstance) { return; } AccountDTO account = DaoFactory.AccountDao.LoadById(Session.Account.AccountId); if (account == null) { return; } if (account.Password.ToLower() == EncryptionBase.Sha512(characterDeletePacket.Password)) { CharacterDTO character = DaoFactory.CharacterDao.LoadBySlot(account.AccountId, characterDeletePacket.Slot); if (character == null) { return; } DaoFactory.GeneralLogDao.SetCharIdNull(Convert.ToInt64(character.CharacterId)); DaoFactory.CharacterDao.DeleteByPrimaryKey(account.AccountId, characterDeletePacket.Slot); FamilyCharacterDTO familyCharacter = DaoFactory.FamilyCharacterDao.LoadByCharacterId(character.CharacterId); if (familyCharacter == null) { LoadCharacters(string.Empty); return; } // REMOVE FROM FAMILY DaoFactory.FamilyCharacterDao.Delete(character.Name); ServerManager.Instance.FamilyRefresh(familyCharacter.FamilyId); } else { Session.SendPacket($"info {Language.Instance.GetMessageFromKey("BAD_PASSWORD")}"); } }
public void LoadCharacters(string packet) { string[] loginPacketParts = packet.Split(' '); // Load account by given SessionId if (Session.Account == null) { bool hasRegisteredAccountLogin = true; try { hasRegisteredAccountLogin = ServerCommunicationClient.Instance.HubProxy.Invoke <bool>("HasRegisteredAccountLogin", loginPacketParts[4], Session.SessionId).Result; } catch (Exception ex) { Logger.Log.Error("WCF Communication Failed.", ex); } if (loginPacketParts.Length > 4 && hasRegisteredAccountLogin) { AccountDTO accountDTO = DAOFactory.AccountDAO.LoadByName(loginPacketParts[4]); if (accountDTO != null) { if (accountDTO.Password.ToLower().Equals(EncryptionBase.Sha512(loginPacketParts[6]))) { var account = new Account() { AccountId = accountDTO.AccountId, Name = accountDTO.Name, Password = accountDTO.Password.ToLower(), Authority = accountDTO.Authority, LastCompliment = accountDTO.LastCompliment, }; account.Initialize(); foreach (PenaltyLogDTO penalty in DAOFactory.PenaltyLogDAO.LoadByAccount(accountDTO.AccountId)) { account.PenaltyLogs.Add(new PenaltyLogDTO() { AccountId = penalty.AccountId, DateEnd = penalty.DateEnd, DateStart = penalty.DateStart, Reason = penalty.Reason, Penalty = penalty.Penalty, PenaltyLogId = penalty.PenaltyLogId }); } foreach (GeneralLogDTO general in DAOFactory.GeneralLogDAO.LoadByAccount(accountDTO.AccountId)) { account.GeneralLogs.Add(new GeneralLogDTO() { AccountId = general.AccountId, LogData = general.LogData, IpAddress = general.IpAddress, LogType = general.LogType, LogId = general.LogId, Timestamp = general.Timestamp, CharacterId = general.CharacterId }); } Session.InitializeAccount(account); } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid Password or SessionId."); Session.Disconnect(); } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid AccountName."); Session.Disconnect(); } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, login has not been registered or Account is already logged in."); Session.Disconnect(); return; } } // TODO: Wrap Database access up to GO IList <CharacterDTO> characters = DAOFactory.CharacterDAO.LoadByAccount(Session.Account.AccountId); Logger.Log.InfoFormat(Language.Instance.GetMessageFromKey("ACCOUNT_ARRIVED"), Session.SessionId); // load characterlist packet for each character in CharacterDTO Session.SendPacket("clist_start 0"); foreach (CharacterDTO character in characters) { IEnumerable <ItemInstanceDTO> inventory = DAOFactory.IteminstanceDao.LoadByType(character.CharacterId, InventoryType.Wear); WearableInstance[] equipment = new WearableInstance[16]; foreach (ItemInstanceDTO equipmentEntry in inventory) { // explicit load of iteminstance WearableInstance currentInstance = equipmentEntry as WearableInstance; equipment[(short)currentInstance.Item.EquipmentSlot] = currentInstance; } // 1 1 before long string of -1.-1 = act completion Session.SendPacket($"clist {character.Slot} {character.Name} 0 {(byte)character.Gender} {(byte)character.HairStyle} {(byte)character.HairColor} 0 {(byte)character.Class} {character.Level} {character.HeroLevel} {equipment[(byte)EquipmentType.Hat]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.Armor]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.WeaponSkin]?.ItemVNum ?? (equipment[(byte)EquipmentType.MainWeapon]?.ItemVNum ?? -1)}.{equipment[(byte)EquipmentType.SecondaryWeapon]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.Mask]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.Fairy]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.CostumeSuit]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.CostumeHat]?.ItemVNum ?? -1} {character.JobLevel} 1 1 -1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1 {(equipment[(byte)EquipmentType.Hat] != null && equipment[(byte)EquipmentType.Hat].Item.IsColored ? equipment[(byte)EquipmentType.Hat].Design : 0)} 0"); } Session.SendPacket("clist_end"); }
public void LoadCharacters(string packet) { string[] loginPacketParts = packet.Split(' '); // Load account by given SessionId if (Session.Account == null) { bool hasRegisteredAccountLogin = true; try { hasRegisteredAccountLogin = ServerCommunicationClient.Instance.HubProxy.Invoke <bool>("HasRegisteredAccountLogin", loginPacketParts[4], Session.SessionId).Result; } catch (Exception ex) { Logger.Log.Error("WCF Communication Failed.", ex); Session.Disconnect(); return; } if (loginPacketParts.Length > 4 && hasRegisteredAccountLogin) { AccountDTO account = DAOFactory.AccountDAO.LoadByName(loginPacketParts[4]); if (account != null) { if (account.Password.ToLower().Equals(EncryptionBase.Sha512(loginPacketParts[6]))) { Account accountobject = new Account { AccountId = account.AccountId, Name = account.Name, Password = account.Password.ToLower(), Authority = account.Authority }; accountobject.Initialize(); Session.InitializeAccount(accountobject); } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid Password or SessionId."); Session.Disconnect(); return; } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid AccountName."); Session.Disconnect(); return; } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, login has not been registered or Account is already logged in."); Session.Disconnect(); return; } } // TODO: Wrap Database access up to GO IEnumerable <CharacterDTO> characters = DAOFactory.CharacterDAO.LoadByAccount(Session.Account.AccountId); Logger.Log.InfoFormat(Language.Instance.GetMessageFromKey("ACCOUNT_ARRIVED"), Session.SessionId); // load characterlist packet for each character in CharacterDTO Session.SendPacket("clist_start 0"); foreach (CharacterDTO character in characters) { IEnumerable <ItemInstanceDTO> inventory = DAOFactory.IteminstanceDAO.LoadByType(character.CharacterId, InventoryType.Wear); WearableInstance[] equipment = new WearableInstance[16]; foreach (ItemInstanceDTO equipmentEntry in inventory) { // explicit load of iteminstance WearableInstance currentInstance = equipmentEntry as WearableInstance; equipment[(short)currentInstance.Item.EquipmentSlot] = currentInstance; } string petlist = string.Empty; List <MateDTO> mates = DAOFactory.MateDAO.LoadByCharacterId(character.CharacterId).ToList(); for (int i = 0; i < 26; i++) { //0.2105.1102.319.0.632.0.333.0.318.0.317.0.9.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1 petlist += $"{(i != 0 ? "." : "")}{(mates.Count > i ? $"{mates.ElementAt(i).Skin}.{mates.ElementAt(i).NpcMonsterVNum}" : "-1")}"; } // 1 1 before long string of -1.-1 = act completion Session.SendPacket($"clist {character.Slot} {character.Name} 0 {(byte)character.Gender} {(byte)character.HairStyle} {(byte)character.HairColor} 0 {(byte)character.Class} {character.Level} {character.HeroLevel} {equipment[(byte)EquipmentType.Hat]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.Armor]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.WeaponSkin]?.ItemVNum ?? (equipment[(byte)EquipmentType.MainWeapon]?.ItemVNum ?? -1)}.{equipment[(byte)EquipmentType.SecondaryWeapon]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.Mask]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.Fairy]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.CostumeSuit]?.ItemVNum ?? -1}.{equipment[(byte)EquipmentType.CostumeHat]?.ItemVNum ?? -1} {character.JobLevel} 1 1 {petlist} {(equipment[(byte)EquipmentType.Hat] != null && equipment[(byte)EquipmentType.Hat].Item.IsColored ? equipment[(byte)EquipmentType.Hat].Design : 0)} 0"); } Session.SendPacket("clist_end"); }
public void LoadCharacters(string packet) { string[] loginPacketParts = packet.Split(' '); // Load account by given SessionId bool isCrossServerLogin = false; if (Session.Account == null) { bool hasRegisteredAccountLogin = true; AccountDTO account = null; if (loginPacketParts.Length > 4) { if (loginPacketParts.Length > 7 && loginPacketParts[4] == "DAC" && loginPacketParts[8] == "CrossServerAuthenticate") { isCrossServerLogin = true; account = DaoFactory.AccountDao.LoadByName(loginPacketParts[5]); } else { account = DaoFactory.AccountDao.LoadByName(loginPacketParts[4]); } } try { if (account != null) { hasRegisteredAccountLogin = isCrossServerLogin ? CommunicationServiceClient.Instance.IsCrossServerLoginPermitted(account.AccountId, Session.SessionId) : CommunicationServiceClient.Instance.IsLoginPermitted(account.AccountId, Session.SessionId); } } catch (Exception ex) { Logger.Log.Error("MS Communication Failed.", ex); Session.Disconnect(); return; } if (loginPacketParts.Length > 4 && hasRegisteredAccountLogin) { if (account != null) { if (account.Password.ToLower().Equals(EncryptionBase.Sha512(loginPacketParts[6])) || isCrossServerLogin) { PenaltyLogDTO penalty = DaoFactory.PenaltyLogDao.LoadByAccount(account.AccountId).FirstOrDefault(s => s.DateEnd > DateTime.Now && s.Penalty == PenaltyType.Banned); if (penalty != null) { Session.SendPacket($"fail {string.Format(Language.Instance.GetMessageFromKey("BANNED"), penalty.Reason, penalty.DateEnd.ToString("yyyy-MM-dd-HH:mm"))}"); Logger.Log.Info($"[LOG] {account.Name} connected from {Session.IpAddress} while being banned"); Session.Disconnect(); return; } // TODO MAINTENANCE MODE if (ServerManager.Instance.Sessions.Count() >= ServerManager.Instance.AccountLimit) { if (account.Authority < AuthorityType.Moderator) { Session.Disconnect(); return; } } Account accountobject = new Account { AccountId = account.AccountId, Name = account.Name, Password = account.Password.ToLower(), Authority = account.Authority, BankMoney = account.BankMoney, Money = account.Money }; accountobject.Initialize(); Session.InitializeAccount(accountobject, isCrossServerLogin); } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid Password or SessionId."); Session.Disconnect(); return; } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, invalid AccountName."); Session.Disconnect(); return; } } else { Logger.Log.ErrorFormat($"Client {Session.ClientId} forced Disconnection, login has not been registered or Account is already logged in."); Session.Disconnect(); return; } } // TODO: Wrap Database access up to GO if (Session.Account == null) { return; } if (isCrossServerLogin) { if (byte.TryParse(loginPacketParts[6], out byte slot)) { SelectCharacter(new SelectPacket { Slot = slot }); } } else { IEnumerable <CharacterDTO> characters = DaoFactory.CharacterDao.LoadByAccount(Session.Account.AccountId); Logger.Log.InfoFormat(Language.Instance.GetMessageFromKey("ACCOUNT_ARRIVED"), Session.Account.Name); // load characterlist packet for each character in CharacterDTO Session.SendPacket("clist_start 0"); foreach (CharacterDTO character in characters) { IEnumerable <ItemInstanceDTO> inventory = DaoFactory.IteminstanceDao.LoadByType(character.CharacterId, InventoryType.Wear); WearableInstance[] equipment = new WearableInstance[16]; foreach (ItemInstanceDTO equipmentEntry in inventory) { // explicit load of iteminstance WearableInstance currentInstance = equipmentEntry as WearableInstance; equipment[(short)currentInstance.Item.EquipmentSlot] = currentInstance; } string petlist = string.Empty; List <MateDTO> mates = DaoFactory.MateDao.LoadByCharacterId(character.CharacterId).ToList(); for (int i = 0; i < 26; i++) { //0.2105.1102.319.0.632.0.333.0.318.0.317.0.9.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1.-1 petlist += $"{(i != 0 ? "." : "")}{(mates.Count > i ? $"{mates.ElementAt(i).Skin}.{mates.ElementAt(i).NpcMonsterVNum}" : "-1")}"; } // 1 1 before long string of -1.-1 = act completion Session.SendPacket($"clist {character.Slot} {character.Name} 0 {(byte) character.Gender} {(byte) character.HairStyle} {(byte) character.HairColor} 0 {(byte) character.Class} {character.Level} {character.HeroLevel} {equipment[(byte) EquipmentType.Hat]?.ItemVNum ?? -1}.{equipment[(byte) EquipmentType.Armor]?.ItemVNum ?? -1}.{equipment[(byte) EquipmentType.WeaponSkin]?.ItemVNum ?? (equipment[(byte) EquipmentType.MainWeapon]?.ItemVNum ?? -1)}.{equipment[(byte) EquipmentType.SecondaryWeapon]?.ItemVNum ?? -1}.{equipment[(byte) EquipmentType.Mask]?.ItemVNum ?? -1}.{equipment[(byte) EquipmentType.Fairy]?.ItemVNum ?? -1}.{equipment[(byte) EquipmentType.CostumeSuit]?.ItemVNum ?? -1}.{equipment[(byte) EquipmentType.CostumeHat]?.ItemVNum ?? -1} {character.JobLevel} 1 1 {petlist} {(equipment[(byte) EquipmentType.Hat] != null && equipment[(byte) EquipmentType.Hat].Item.IsColored ? equipment[(byte) EquipmentType.Hat].Design : 0)} 0"); } Session.SendPacket("clist_end"); } }
public void VerifyLogin(string packet) { // TODO: implement check for maintenances string[] packetsplit = packet.Split(' '); UserDTO user = new UserDTO { Name = packetsplit[2], Password = ConfigurationManager.AppSettings["UseOldCrypto"] == "true" ? EncryptionBase.Sha512(LoginEncryption.GetPassword(packetsplit[3])).ToUpper() : packetsplit[3] }; AccountDTO loadedAccount = DAOFactory.AccountDAO.LoadByName(user.Name); if (loadedAccount != null && loadedAccount.Password.ToUpper().Equals(user.Password)) { DAOFactory.AccountDAO.WriteGeneralLog(loadedAccount.AccountId, _session.IpAddress, null, "Connection", "LoginServer"); //check if the account is connected if (!ServerCommunicationClient.Instance.HubProxy.Invoke <bool>("AccountIsConnected", loadedAccount.Name).Result) { AuthorityType type = loadedAccount.Authority; PenaltyLogDTO penalty = DAOFactory.PenaltyLogDAO.LoadByAccount(loadedAccount.AccountId).FirstOrDefault(s => s.DateEnd > DateTime.Now && s.Penalty == PenaltyType.Banned); if (penalty != null) { _session.SendPacket($"fail {string.Format(Language.Instance.GetMessageFromKey("BANNED"), penalty.Reason, penalty.DateEnd.ToString("yyyy-MM-dd-HH:mm"))}"); } else { switch (type) { case AuthorityType.Unconfirmed: { _session.SendPacket($"fail {Language.Instance.GetMessageFromKey("NOTVALIDATE")}"); } break; default: { int newSessionId = SessionFactory.Instance.GenerateSessionId(); DAOFactory.AccountDAO.UpdateLastSessionAndIp(user.Name, newSessionId, _session.IpAddress); Logger.Log.DebugFormat(Language.Instance.GetMessageFromKey("CONNECTION"), user.Name, newSessionId); // inform communication service about new player from login server try { ServerCommunicationClient.Instance.HubProxy.Invoke("RegisterAccountLogin", user.Name, newSessionId); } catch (Exception ex) { Logger.Log.Error("General Error SessionId: " + newSessionId, ex); } _session.SendPacket(BuildServersPacket(user.Name, newSessionId)); } break; } } } else { _session.SendPacket($"fail {string.Format(Language.Instance.GetMessageFromKey("ALREADY_CONNECTED"))}"); } } else { _session.SendPacket($"fail {string.Format(Language.Instance.GetMessageFromKey("IDERROR"))}"); } }
/// <summary> /// login packet /// </summary> /// <param name="loginPacket"></param> public void VerifyLogin(LoginPacket loginPacket) { if (loginPacket == null) { return; } UserDTO user = new UserDTO { Name = loginPacket.Name, Password = ConfigurationManager.AppSettings["UseOldCrypto"] == "true" ? EncryptionBase.Sha512(LoginEncryption.GetPassword(loginPacket.Password)).ToUpper() : loginPacket.Password }; AccountDTO loadedAccount = DaoFactory.AccountDao.LoadByName(user.Name); if (loadedAccount != null && loadedAccount.Password.ToUpper().Equals(user.Password)) { DaoFactory.AccountDao.WriteGeneralLog(loadedAccount.AccountId, _session.IpAddress, null, GeneralLogType.Connection, "LoginServer"); //check if the account is connected if (!CommunicationServiceClient.Instance.IsAccountConnected(loadedAccount.AccountId)) { AuthorityType type = loadedAccount.Authority; PenaltyLogDTO penalty = DaoFactory.PenaltyLogDao.LoadByAccount(loadedAccount.AccountId).FirstOrDefault(s => s.DateEnd > DateTime.Now && s.Penalty == PenaltyType.Banned); if (penalty != null) { _session.SendPacket($"failc 7"); } else { switch (type) { // TODO TO ENUM case AuthorityType.Unconfirmed: { _session.SendPacket($"failc {(byte)LoginFailType.CantConnect}"); } break; case AuthorityType.Banned: { _session.SendPacket($"failc {(byte)LoginFailType.Banned}"); } break; case AuthorityType.Closed: { _session.SendPacket($"failc {(byte)LoginFailType.CantConnect}"); } break; default: { int newSessionId = SessionFactory.Instance.GenerateSessionId(); Logger.Log.DebugFormat(Language.Instance.GetMessageFromKey("CONNECTION"), user.Name, newSessionId); if (CommunicationServiceClient.Instance.GetMaintenanceState() && _session.Account.Authority <= AuthorityType.GameMaster) { _session.SendPacket("failc 2"); return; } try { CommunicationServiceClient.Instance.RegisterAccountLogin(loadedAccount.AccountId, newSessionId, loadedAccount.Name); } catch (Exception ex) { Logger.Log.Error("General Error SessionId: " + newSessionId, ex); } _session.SendPacket(BuildServersPacket(loadedAccount.AccountId, newSessionId)); } break; } } } else { _session.SendPacket($"failc {(byte)LoginFailType.AlreadyConnected}"); } } else { _session.SendPacket($"failc {(byte)LoginFailType.AccountOrPasswordWrong}"); } }
/// <summary> /// login packet /// </summary> /// <param name="loginPacket"></param> public void VerifyLogin(LoginPacket loginPacket) { if (loginPacket == null) { return; } UserDTO user = new UserDTO { Name = loginPacket.Name, Password = ConfigurationManager.AppSettings["UseOldCrypto"] == "true" ? EncryptionBase.Sha512(LoginEncryption.GetPassword(loginPacket.Password)).ToUpper() : loginPacket.Password }; AccountDTO loadedAccount = DAOFactory.AccountDAO.LoadByName(user.Name); if (loadedAccount != null && loadedAccount.Password.ToUpper().Equals(user.Password)) { DAOFactory.AccountDAO.WriteGeneralLog(loadedAccount.AccountId, _session.IpAddress, null, GeneralLogType.Connection, "LoginServer"); //check if the account is connected if (!CommunicationServiceClient.Instance.IsAccountConnected(loadedAccount.AccountId)) { AuthorityType type = loadedAccount.Authority; PenaltyLogDTO penalty = DAOFactory.PenaltyLogDAO.LoadByAccount(loadedAccount.AccountId).FirstOrDefault(s => s.DateEnd > DateTime.Now && s.Penalty == PenaltyType.Banned); if (penalty != null) { _session.SendPacket($"fail {string.Format(Language.Instance.GetMessageFromKey("BANNED"), penalty.Reason, penalty.DateEnd.ToString("yyyy-MM-dd-HH:mm"))}"); } else { switch (type) { case AuthorityType.Unconfirmed: { _session.SendPacket($"fail {Language.Instance.GetMessageFromKey("NOTVALIDATE")}"); } break; case AuthorityType.Banned: { _session.SendPacket($"fail {Language.Instance.GetMessageFromKey("IDERROR")}"); } break; case AuthorityType.Closed: { _session.SendPacket($"fail {Language.Instance.GetMessageFromKey("IDERROR")}"); } break; default: { int newSessionId = SessionFactory.Instance.GenerateSessionId(); Logger.Log.DebugFormat(Language.Instance.GetMessageFromKey("CONNECTION"), user.Name, newSessionId); // inform communication service about new player from login server try { CommunicationServiceClient.Instance.RegisterAccountLogin(loadedAccount.AccountId, newSessionId); } catch (Exception ex) { Logger.Log.Error("General Error SessionId: " + newSessionId, ex); } _session.SendPacket(BuildServersPacket(loadedAccount.AccountId, newSessionId)); } break; } } } else { _session.SendPacket($"fail {string.Format(Language.Instance.GetMessageFromKey("ALREADY_CONNECTED"))}"); } } else { _session.SendPacket($"fail {string.Format(Language.Instance.GetMessageFromKey("IDERROR"))}"); } }
/// <summary> /// login packet /// </summary> /// <param name="loginPacket"></param> public void VerifyLogin(LoginPacket loginPacket) { if (loginPacket == null) { return; } UserDTO user = new UserDTO { Name = loginPacket.Name, Password = ConfigurationManager.AppSettings["UseOldCrypto"] == "true" ? EncryptionBase.Sha512(LoginEncryption.GetPassword(loginPacket.Password)).ToUpper() : loginPacket.Password }; AccountDTO loadedAccount = DAOFactory.AccountDAO.FirstOrDefault(s => s.Name == user.Name); if (loadedAccount != null && loadedAccount.Password.ToUpper().Equals(user.Password)) { // TODO LOG LOGIN //check if the account is connected if (!CommunicationServiceClient.Instance.IsAccountConnected(loadedAccount.AccountId)) { AuthorityType type = loadedAccount.Authority; PenaltyLogDTO penalty = DAOFactory.PenaltyLogDAO.FirstOrDefault(s => s.AccountId.Equals(loadedAccount.AccountId) && s.DateEnd > DateTime.Now && s.Penalty == PenaltyType.Banned); if (penalty != null) { _session.SendPacket($"failc 7"); } else { switch (type) { // TODO TO ENUM case AuthorityType.Unconfirmed: { _session.SendPacket($"failc {(byte)LoginFailType.CantConnect}"); } break; case AuthorityType.Banned: { _session.SendPacket($"failc {(byte)LoginFailType.Banned}"); } break; case AuthorityType.Closed: { _session.SendPacket($"failc {(byte)LoginFailType.CantConnect}"); } break; default: { int newSessionId = SessionFactory.Instance.GenerateSessionId(); Logger.Log.DebugFormat(Language.Instance.GetMessageFromKey("CONNECTION"), user.Name, newSessionId); // TODO MAINTENANCE MODE (MASTER SERVER) // IF MAINTENANCE // _session.SendPacket($"failc 2"); // inform communication service about new player from login server try { CommunicationServiceClient.Instance.RegisterAccountLogin(loadedAccount.AccountId, newSessionId, loadedAccount.Name); } catch (Exception ex) { Logger.Log.Error("General Error SessionId: " + newSessionId, ex); } _session.SendPacket(BuildServersPacket(loadedAccount.AccountId, newSessionId)); } break; } } } else { _session.SendPacket($"failc {(byte)LoginFailType.AlreadyConnected}"); } } else { _session.SendPacket($"failc {(byte)LoginFailType.AccountOrPasswordWrong}"); } }