public static void LoadAddonInfoData(RealmSession session, byte[] packedData, int packedSize, int unpackedSize) { // Check ZLib header (normal mode) if (packedData[0] == 0x78 && packedData[1] == 0x9C) { var unpackedAddonData = new byte[unpackedSize]; if (packedSize > 0) { using (var inflate = new DeflateStream(new MemoryStream(packedData, 2, packedSize - 6), CompressionMode.Decompress)) { var decompressed = new MemoryStream(); inflate.CopyTo(decompressed); decompressed.Seek(0, SeekOrigin.Begin); for (int i = 0; i < unpackedSize; i++) unpackedAddonData[i] = (byte)decompressed.ReadByte(); } } HandleAddonInfo(session, unpackedAddonData); } else { Log.Message(LogType.Error, "Wrong AddonInfo for Client '{0}'.", session.GetClientIP()); session.Dispose(); } }
public static void LoadAddonInfoData(RealmSession session, byte[] packedData, int packedSize, int unpackedSize) { // Check ZLib header (normal mode) if (packedData[0] == 0x78 && packedData[1] == 0x9C) { var unpackedAddonData = new byte[unpackedSize]; if (packedSize > 0) { using (var inflate = new DeflateStream(new MemoryStream(packedData, 2, packedSize - 6), CompressionMode.Decompress)) { var decompressed = new MemoryStream(); inflate.CopyTo(decompressed); decompressed.Seek(0, SeekOrigin.Begin); for (int i = 0; i < unpackedSize; i++) { unpackedAddonData[i] = (byte)decompressed.ReadByte(); } } } HandleAddonInfo(session, unpackedAddonData); } else { Log.Message(LogType.Error, "Wrong AddonInfo for Client '{0}'.", session.GetClientIP()); session.Dispose(); } }
public static void HandleEnumCharactersResult(RealmSession session) { var enumCharactersResult = new Packet(ServerMessages.EnumCharactersResult); enumCharactersResult.PutBit(1); enumCharactersResult.PutBit(0); enumCharactersResult.Flush(); enumCharactersResult.Write(0); enumCharactersResult.Write(0); session.Send(enumCharactersResult); }
public static bool InvokeHandler(Packet reader, RealmSession session) { var message = (ClientMessages)reader.Header.Message; Log.Message(LogType.Packet, "Received Opcode: {0} (0x{0:X}), Length: {1}", message, reader.Data.Length); if (MessageHandlers.TryGetValue(message, out HandlePacket packet)) { packet.Invoke(reader, session); return true; } return false; }
public static bool InvokeHandler(Packet reader, RealmSession session) { var message = (ClientMessages)reader.Header.Message; Log.Message(LogType.Packet, "Received Opcode: {0} (0x{0:X}), Length: {1}", message, reader.Data.Length); if (MessageHandlers.TryGetValue(message, out HandlePacket packet)) { packet.Invoke(reader, session); return(true); } return(false); }
public static void HandleAuthChallenge(RealmSession session) { var authChallenge = new Packet(ServerMessages.AuthChallenge); // Part of the header authChallenge.Write<ushort>(0); authChallenge.Write(session.Challenge); for (int i = 0; i < 8; i++) authChallenge.Write<uint>(0); // DosChallenge authChallenge.Write<byte>(1); // DosZeroBits session.Send(authChallenge); }
public static bool Invoke(Packet reader, RealmSession session) { var message = (ClientMessage)reader.Header.Message; Console.WriteLine($"Received Realm packet: {message} (0x{message:X}), Length: {reader.Data.Length}"); HandlePacket packet; if (ClientMessageHandlers.TryGetValue(message, out packet)) { packet.Invoke(reader, session); return true; } return false; }
public static void HandleAuthChallenge(RealmSession session) { var authChallenge = new Packet(ServerMessage.AuthChallenge); // Part of the header authChallenge.Write <ushort>(0); authChallenge.Write(session.Challenge); for (int i = 0; i < 8; i++) { authChallenge.Write <uint>(0); } authChallenge.Write <byte>(1); session.Send(authChallenge); }
public static void HandleAuthResponse(AuthResults result, RealmSession session) { var authResponse = new Packet(ServerMessages.AuthResponse); var hasSuccessInfo = result == AuthResults.Ok; var hasWaitInfo = result == AuthResults.WaitQueue; authResponse.Write(result); authResponse.PutBit(hasSuccessInfo); authResponse.PutBit(hasWaitInfo); if (hasSuccessInfo) { } if (hasWaitInfo) { } session.Send(authResponse); }
public static void OnEnumCharacters(Packet packet, RealmSession session) { HandleEnumCharactersResult(session); }
public static void OnCreateCharacter(Packet packet, RealmSession session) { }
public static void OnCharDelete(Packet packet, RealmSession session) { }
public static void HandleGenerateRandomCharacterNameResult(RealmSession session) { }
public static void HandleAuthResponse(AuthResults result, RealmSession session) { var gameAccount = session.GameAccount; var realm = session.Realm; var authResponse = new Packet(ServerMessages.AuthResponse); var hasSuccessInfo = result == AuthResults.Ok; var hasWaitInfo = result == AuthResults.WaitQueue; authResponse.Write(result); authResponse.PutBit(hasSuccessInfo); authResponse.PutBit(hasWaitInfo); authResponse.Flush(); if (hasSuccessInfo) { var allowedRaces = Manager.GameAccountMgr.GetAvailableRaces(gameAccount, realm); var allowedClasses = Manager.GameAccountMgr.GetAvailableClasses(gameAccount, realm); var charTemplates = Manager.GameAccountMgr.GetAvailableCharacterTemplates(gameAccount, realm); authResponse.Write<uint>(0); authResponse.Write<uint>(0); authResponse.Write<uint>(0); authResponse.Write<uint>(0); authResponse.Write<uint>(0); authResponse.Write(gameAccount.BoxLevel); authResponse.Write(gameAccount.BoxLevel); authResponse.Write<uint>(0); authResponse.Write(allowedRaces.Count); authResponse.Write(allowedClasses.Count); authResponse.Write(charTemplates.Count); authResponse.Write<uint>(0); foreach (var r in allowedRaces) { authResponse.Write(r.Key); authResponse.Write(r.Value); } foreach (var c in allowedClasses) { authResponse.Write(c.Key); authResponse.Write(c.Value); } foreach (var set in charTemplates) { authResponse.Write(set.Id); authResponse.Write(set.CharacterTemplateClasses.Count); foreach (var c in set.CharacterTemplateClasses) { authResponse.Write((byte)c.ClassId); authResponse.Write(c.FactionGroup); } authResponse.PutBits(set.Name.Length, 7); authResponse.PutBits(set.Description.Length, 10); authResponse.Flush(); authResponse.Write(set.Name); authResponse.Write(set.Description); } authResponse.PutBit(0); authResponse.PutBit(0); authResponse.PutBit(0); authResponse.PutBit(0); authResponse.PutBit(0); authResponse.Flush(); } session.Send(authResponse); }
public static void HandleDeleteChar(RealmSession session) { }
public static void OnAuthSession(Packet packet, RealmSession session) { // Part of the header packet.Read<ushort>(); var loginServerId = packet.Read<uint>(); var build = packet.Read<short>(); var localChallenge = packet.Read<uint>(); var siteId = packet.Read<uint>(); var realmId = packet.Read<uint>(); var loginServerType = packet.Read<LoginServerTypes>(); var buildType = packet.Read<sbyte>(); var regionId = packet.Read<uint>(); var dosResponse = packet.Read<ulong>(); var digest = packet.ReadBytes(20); var accountName = packet.ReadString(11); var useIPv6 = packet.GetBit(); // AddonInfo stuff var compressedAddonInfoSize = packet.Read<int>(); var uncompressedAddonInfoSize = packet.Read<int>(); var compressedAddonData = packet.ReadBytes(compressedAddonInfoSize - 4); var accountParts = accountName.Split(new[] { '#' }); var authResult = AuthResults.Ok; if (loginServerType != LoginServerTypes.Battlenet) authResult = AuthResults.Reject; if (authResult == AuthResults.Ok) { if (accountParts.Length == 2) { var accountId = int.Parse(accountParts[0]); var gameIndex = byte.Parse(accountParts[1]); var gameAccount = DB.Auth.GameAccounts.SingleOrDefault(ga => ga.AccountId == accountId && ga.Index == gameIndex); if (gameAccount != null) { var sha1 = new Sha1(); sha1.Process(accountName); sha1.Process(0u); sha1.Process(localChallenge); sha1.Process(session.Challenge); sha1.Finish(gameAccount.SessionKey.ToByteArray(), 40); // Check the password digest. if (sha1.Digest.Compare(digest)) { session.GameAccount = gameAccount; AddonHandler.LoadAddonInfoData(session, compressedAddonData, compressedAddonInfoSize, uncompressedAddonInfoSize); } else authResult = AuthResults.IncorrectPassword; } else authResult = AuthResults.UnknownAccount; } else authResult = AuthResults.UnknownAccount; } HandleAuthResponse(authResult, session); //TODO [partially done] Implement security checks & field handling. //TODO Implement AuthResponse. }
public static void HandleEnumCharactersResult(RealmSession session) { }
public static void OnEnumCharacters(Packet packet, RealmSession session) { }
public static void HandleCreateChar(RealmSession session) { }
public static void OnGenerateRandomCharacterName(Packet packet, RealmSession session) { }
public static void HandleAddonInfo(RealmSession session, byte[] addonData) { }
public static void HandleAuthResponse(AuthResults result, RealmSession session) { var gameAccount = session.GameAccount; var realm = session.Realm; var authResponse = new Packet(ServerMessages.AuthResponse); var hasSuccessInfo = result == AuthResults.Ok; var hasWaitInfo = result == AuthResults.WaitQueue; authResponse.Write(result); authResponse.PutBit(hasSuccessInfo); authResponse.PutBit(hasWaitInfo); authResponse.Flush(); if (hasSuccessInfo) { var allowedRaces = Manager.GameAccountMgr.GetAvailableRaces(gameAccount, realm); var allowedClasses = Manager.GameAccountMgr.GetAvailableClasses(gameAccount, realm); var charTemplates = Manager.GameAccountMgr.GetAvailableCharacterTemplates(gameAccount, realm); authResponse.Write <uint>(0); authResponse.Write <uint>(0); authResponse.Write <uint>(0); authResponse.Write <uint>(0); authResponse.Write <uint>(0); authResponse.Write(gameAccount.BoxLevel); authResponse.Write(gameAccount.BoxLevel); authResponse.Write <uint>(0); authResponse.Write(allowedRaces.Count); authResponse.Write(allowedClasses.Count); authResponse.Write(charTemplates.Count); authResponse.Write <uint>(0); foreach (var r in allowedRaces) { authResponse.Write(r.Key); authResponse.Write(r.Value); } foreach (var c in allowedClasses) { authResponse.Write(c.Key); authResponse.Write(c.Value); } foreach (var set in charTemplates) { authResponse.Write(set.Id); authResponse.Write(set.CharacterTemplateClasses.Count); foreach (var c in set.CharacterTemplateClasses) { authResponse.Write((byte)c.ClassId); authResponse.Write(c.FactionGroup); } authResponse.PutBits(set.Name.Length, 7); authResponse.PutBits(set.Description.Length, 10); authResponse.Flush(); authResponse.Write(set.Name); authResponse.Write(set.Description); } authResponse.PutBit(0); authResponse.PutBit(0); authResponse.PutBit(0); authResponse.PutBit(0); authResponse.PutBit(0); authResponse.Flush(); } session.Send(authResponse); }
public static void OnAuthSession(Packet packet, RealmSession session) { // Part of the header packet.Read <ushort>(); var loginServerId = packet.Read <int>(); var build = packet.Read <short>(); var regionId = packet.Read <uint>(); var siteId = packet.Read <uint>(); var realmId = packet.Read <uint>(); var loginServerType = packet.Read <LoginServerTypes>(); var buildType = packet.Read <sbyte>(); var localChallenge = packet.Read <uint>(); var dosResponse = packet.Read <ulong>(); var digest = packet.ReadBytes(20); var accountName = packet.ReadString(11); var useIPv6 = packet.GetBit(); // AddonInfo stuff var compressedAddonInfoSize = packet.Read <int>(); var uncompressedAddonInfoSize = packet.Read <int>(); var compressedAddonData = packet.ReadBytes(compressedAddonInfoSize - 4); var accountParts = accountName.Split(new[] { '#' }); var authResult = AuthResults.Ok; session.Realm = DB.Auth.Single <Realm>(r => r.Id == realmId); if (loginServerType != LoginServerTypes.Battlenet || session.Realm == null) { authResult = AuthResults.Reject; } if (authResult == AuthResults.Ok) { if (accountParts.Length == 2) { var accountId = int.Parse(accountParts[0]); var gameIndex = byte.Parse(accountParts[1]); var account = DB.Auth.Single <Account>(a => a.Id == accountId); if (account != null) { var gameAccount = account.GameAccounts.SingleOrDefault(ga => ga.Index == gameIndex); if (gameAccount != null) { var sha1 = new Sha1(); sha1.Process(accountName); sha1.Process(0u); sha1.Process(localChallenge); sha1.Process(session.Challenge); sha1.Finish(gameAccount.SessionKey.ToByteArray(), 40); // Check the password digest. if (sha1.Digest.Compare(digest)) { session.Crypt = new WoWCrypt(gameAccount.SessionKey.ToByteArray()); session.GameAccount = gameAccount; AddonHandler.LoadAddonInfoData(session, compressedAddonData, compressedAddonInfoSize, uncompressedAddonInfoSize); } else { authResult = AuthResults.Failed; } } else { authResult = AuthResults.UnknownAccount; } } else { authResult = AuthResults.UnknownAccount; } } else { authResult = AuthResults.UnknownAccount; } } HandleAuthResponse(authResult, session); //TODO [partially done] Implement security checks & field handling. //TODO [partially done] Implement AuthResponse. }