/// <summary>
        /// Handles incoming packet.
        /// </summary>
        /// <param name="packet">Incoming packet.</param>
        protected override void Handle( Packet packet )
        {
            Logger.WriteLine(Source.OuterNetwork, "Received: {0}", packet.ToString());

            if ( !CacheServiceConnection.Active ) // validate if login service is active
            {
                Send(LoginFailed.ToPacket(UserAuthenticationResponseType.ServerMaintenance));
                UserConnectionsListener.CloseActiveConnection(this);
                return;
            }

            if ( QueuedRequestsPool.HasRequest(this, true) ) // validate if user is awaiting response from cache service
                return;

            switch ( packet.FirstOpcode )
            {
                case 0x07:
                    {
                        Send(ResponseAuthGameGuard.Static);
                        return;
                    }
                case 0x00:
                    {
                        m_RSADecryptor = new RSAManaged();
                        m_RSADecryptor.ImportParameters(UserConnectionsListener.PrivateKey);

                        // get login and password
                        unsafe
                        {
                            byte[] bytes = new byte[0x80];

                            fixed ( byte* buf = bytes, src = packet.GetBuffer() )
                                L2Buffer.Copy(src, 0x01, buf, 0x00, 0x80);

                            fixed ( byte* buf = m_RSADecryptor.DecryptValue(bytes) )
                            {
                                L2Buffer.GetTrimmedString(buf, 0x03, ref Login, 0x0e);
                                L2Buffer.GetTrimmedString(buf, 0x11, ref Password, 0x10);
                            }
                        }

                        // validate user login
                        if ( !Utils.IsValidUserLogin(Login) )
                        {
                            Send(LoginFailed.ToPacket(UserAuthenticationResponseType.UserOrPasswordWrong));
                            return;
                        }

                        //Password = Utils.HashPassword(Password);

                        Session.AccountName = Login;

                        Logger.WriteLine(Session.ToString());

                        long requestId = long.MinValue;

                        // request cache to auth user
                        if ( QueuedRequestsPool.Enqueue(this, ref requestId) )
                            CacheServiceConnection.Send(new UserAuthenticationRequest(requestId, Login, Password, Session.ID).ToPacket());
                        else
                        {
                            Logger.WriteLine(Source.InnerNetwork, "Failed to send UserAuthenticationRequest to cache service, request was not enqueued by QueuedRequestsPool ?...");
                            Send(LoginFailed.ToPacket(UserAuthenticationResponseType.SystemError));
                            UserConnectionsListener.CloseActiveConnection(this);
                        }

                        return;
                    }
                case 0x05:
                    {
                        int login1 = packet.ReadInt();
                        int login2 = packet.ReadInt();

                        if ( login1 != Session.Login1 || login2 != Session.Login2 )
                        {
                            Logger.WriteLine(Source.OuterNetwork, "Invalid UserSession data: {0}. BAN!", Session.ToString());
                            CacheServiceConnection.Send(new UnCacheUser(Session.ID).ToPacket());
                            UserConnectionsListener.CloseActiveConnection(this);
                        }
                        else
                        {
                            long requestID = long.MinValue;

                            if ( QueuedRequestsPool.Enqueue(this, ref requestID) )
                                CacheServiceConnection.Send(new WorldsListRequest(requestID).ToPacket());
                            else
                            {
                                Logger.WriteLine(Source.InnerNetwork, "Failed to send WorldsListRequest to cache service, request was not enqueued by QueuedRequestsPool ?...");
                                UserConnectionsListener.CloseActiveConnection(this);
                            }
                        }

                        return;
                    }
                case 0x02:
                    {
                        // skip not needed data
                        packet.MoveOffset(8);

                        long requestID = long.MinValue;

                        if ( QueuedRequestsPool.Enqueue(this, ref requestID) )
                            CacheServiceConnection.Send(new JoinWorldRequest(requestID, Session.ID, packet.ReadByte()).ToPacket());
                        else
                        {
                            Logger.WriteLine(Source.InnerNetwork, "Failed to send JionWorldRequest to cache service, request was not enqueued by QueuedRequestsPool ?...");
                            UserConnectionsListener.CloseActiveConnection(this);
                        }

                        return;
                    }
            }

            Logger.WriteLine(Source.OuterNetwork, "Unknown packet received: {0}", packet.ToString());
            UserConnectionsListener.CloseActiveConnection(this);
        }
Beispiel #2
0
 public ScrambledKeyPair( ref RSAParameters pivateKey, ref RSAParameters publicKey )
 {
     m_RSAManaged = new RSAManaged(1024);
     pivateKey = m_RSAManaged.ExportParameters(true);
     publicKey = m_RSAManaged.ExportParameters(false);
     m_ScrambledModulus = ScrambleModulus(publicKey.Modulus);
 }
        /// <summary>
        /// Initializes user connections listener.
        /// </summary>
        /// <param name="localEndPoint">Local ip endpoint.</param>
        /// <param name="backlog">Backlog.</param>
        /// <param name="enableFirewall">True, if firewall must be enabled, otherwise false.</param>
        internal static void Initialize( IPEndPoint localEndPoint, int backlog, bool enableFirewall )
        {
            m_LocalEndPoint = localEndPoint;
            m_Backlog = backlog;
            m_EnableFirewall = enableFirewall;

            RSAManaged rsa = new RSAManaged(1024);

            PrivateKey = rsa.ExportParameters(true);
            PublicKey = rsa.ExportParameters(false);

            ScrambledKeysPair = new ScrambledKeyPair(ref PrivateKey, ref PublicKey);

            rsa = null;

            Enable();
        }