Example #1
0
        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();
            }
        }
Example #2
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #7
0
        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;
        }
Example #9
0
        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);
        }
Example #10
0
        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)
 {
 }
Example #15
0
        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)
 {
 }
Example #17
0
        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)
 {
 }
Example #20
0
 public static void OnCharDelete(Packet packet, RealmSession session)
 {
 }
Example #21
0
 public static void HandleCreateChar(RealmSession session)
 {
 }
Example #22
0
 public static void OnCreateCharacter(Packet packet, RealmSession session)
 {
 }
 public static void OnGenerateRandomCharacterName(Packet packet, RealmSession session)
 {
 }
 public static void HandleCreateChar(RealmSession session)
 {
 }
Example #25
0
 public static void HandleDeleteChar(RealmSession session)
 {
 }
Example #26
0
 public static void OnEnumCharacters(Packet packet, RealmSession session)
 {
     HandleEnumCharactersResult(session);
 }
Example #27
0
 public static void HandleAddonInfo(RealmSession session, byte[] addonData)
 {
 }
Example #28
0
 public static void OnGenerateRandomCharacterName(Packet packet, RealmSession session)
 {
 }
Example #29
0
        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);
        }
Example #30
0
 public static void HandleGenerateRandomCharacterNameResult(RealmSession session)
 {
 }
Example #31
0
        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.
        }
Example #32
0
 public static void HandleAddonInfo(RealmSession session, byte[] addonData)
 {
 }