Exemplo n.º 1
0
        public override void OnReceiveFirstMessage(Message message)
        {
            message.GetUShort(); //OS
            var version = message.GetUShort();

            Rsa.Decrypt(message);

            uint[] key = new uint[4];
            key[0] = message.GetUInt();
            key[1] = message.GetUInt();
            key[2] = message.GetUInt();
            key[3] = message.GetUInt();

            XteaKey = key;
            HasXteaEncryption = true;

            var isGm = message.GetBool();
            var accountName = message.GetString();
            var playerName = message.GetString();
            var password = message.GetString();

            message.ReaderIndex += 6;

            if (version != Constants.ClientVersionNumber)
            {
                Disconnect(0x0A, "This server requires client version " + Constants.ClientVersion + ".");
                return;
            }

            Disconnect(0x14, "Under construction.");
        }
Exemplo n.º 2
0
        public void TestMessagePutGet()
        {
            Message message = new Message();
            Assert.AreEqual(0, message.ReadableBytes);

            message.PutByte(byte.MaxValue);
            message.PutByte(byte.MinValue);

            message.PutUShort(ushort.MaxValue);
            message.PutUShort(ushort.MinValue);
            message.PutShort(short.MaxValue);
            message.PutShort(short.MinValue);

            message.PutUInt(uint.MaxValue);
            message.PutUInt(uint.MinValue);
            message.PutInt(int.MaxValue);
            message.PutInt(int.MinValue);

            message.PutULong(ulong.MaxValue);
            message.PutULong(ulong.MinValue);
            message.PutLong(long.MaxValue);
            message.PutLong(long.MinValue);

            message.PutString(string.Empty);
            message.PutString("123");

            Assert.AreEqual(65, message.ReadableBytes);

            Assert.AreEqual(byte.MaxValue, message.GetByte());
            Assert.AreEqual(byte.MinValue, message.GetByte());

            Assert.AreEqual(ushort.MaxValue, message.GetUShort());
            Assert.AreEqual(ushort.MinValue, message.GetUShort());
            Assert.AreEqual(short.MaxValue, message.GetShort());
            Assert.AreEqual(short.MinValue, message.GetShort());

            Assert.AreEqual(uint.MaxValue, message.GetUInt());
            Assert.AreEqual(uint.MinValue, message.GetUInt());
            Assert.AreEqual(int.MaxValue, message.GetInt());
            Assert.AreEqual(int.MinValue, message.GetInt());

            Assert.AreEqual(ulong.MaxValue, message.GetULong());
            Assert.AreEqual(ulong.MinValue, message.GetULong());
            Assert.AreEqual(long.MaxValue, message.GetLong());
            Assert.AreEqual(long.MinValue, message.GetLong());

            Assert.AreEqual(string.Empty, message.GetString());
            Assert.AreEqual("123", message.GetString());

            Assert.AreEqual(0, message.ReadableBytes);
        }
Exemplo n.º 3
0
        public virtual void OnReceiveMessage(Message message)
        {
            if (_hasChecksum && message.GetUInt() != Adler.Generate(message))
                throw new Exception("Invalid message checksum.");

            if (_hasXteaEncryption)
            {
                Xtea.Decrypt(message, _xteaKey);
                var length = message.GetUShort();
                message.WriterIndex = message.ReaderIndex + length;
            }
        }
Exemplo n.º 4
0
        public void TestXteaEncryptDecrypt()
        {
            Message message = new Message();

            message.PutUInt(uint.MaxValue);
            message.PutShort(short.MinValue);

            Xtea.Encrypt(message, _key);

            Assert.AreEqual(8, message.ReadableBytes);

            message.MarkReaderIndex();

            Assert.AreNotEqual(uint.MaxValue, message.GetUInt());
            Assert.AreNotEqual(short.MinValue, message.GetShort());

            message.ResetReaderIndex();

            Xtea.Decrypt(message, _key);

            Assert.AreEqual(uint.MaxValue, message.GetUInt());
            Assert.AreEqual(short.MinValue, message.GetShort());
        }
Exemplo n.º 5
0
        public override void OnReceiveFirstMessage(Message message)
        {
            message.GetUShort();
            var version = message.GetUShort();
            message.ReaderIndex += 12;

            Rsa.Decrypt(message);

            uint[] key = new uint[4];
            key[0] = message.GetUInt();
            key[1] = message.GetUInt();
            key[2] = message.GetUInt();
            key[3] = message.GetUInt();

            XteaKey = key;
            HasXteaEncryption = true;

            if (version != Constants.ClientVersionNumber)
            {
                Disconnect(0x0A, "This server requires client version " + Constants.ClientVersion + ".");
                return;
            }

            var login = message.GetString();
            var password = message.GetString();

            if (login.Length < 5)
            {
                Disconnect(0x0A, "Invalid Account Name.");
                return;
            }

            var account = Server.Instance.AccountRepository.Load(login);

            if (account == null)
            {
                Disconnect(0x0A, "Account name or password is not correct.");
                return;
            }

            var output = Server.OutputMessagePool.Get(Connection, false);

            if (output != null)
            {
                var serverIp = Server.ServiceManager.IpAddresses.First().Key;
                foreach (var keyPair in Server.ServiceManager.IpAddresses)
                {
                    if ((keyPair.Key & keyPair.Value) == (Connection.IpAddress & keyPair.Value))
                    {
                        serverIp = keyPair.Key;
                        break;
                    }
                }

                output.PutByte(0x64);
                output.PutByte((byte)account.Characters.Count);

                foreach (var character in account.Characters)
                {
                    output.PutString(character);
                    output.PutString(Server.ConfigManager.WorldName);
                    output.PutUInt(serverIp);
                    output.PutUShort((ushort)Server.ConfigManager.GamePort);
                }

                output.PutUShort(account.PremiumDaysLeft);

                Connection.Write(output);
            }

            Connection.Close();
        }