Пример #1
0
        public bool SendToClient(ref LoginSocketState state, byte[] data)
        {
            if (data == null || state == null || state.Socket == null)
                return false;

            try {
                if (state.SendCallback == null)
                    state.SendCallback = OnSent;

                state.Socket.BeginSend(data, 0, data.Length, SocketFlags.None, state.SendCallback, state);
                return true;
            } catch (NullReferenceException) {
                if (state != null)
                    state.Dispose();
                state = null;
                return false;
            } catch (SocketException e) {
                if (e.SocketErrorCode != SocketError.ConnectionAborted &&
                    e.SocketErrorCode != SocketError.ConnectionReset) {
                    LogError(Category, "Error sending data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                }
                if (state != null)
                    state.Dispose();
                state = null;
                return false;
            }
        }
 public static void Logout(ref LoginSocketState state, Dictionary<string, string> keyValues)
 {
     // we're not doing anything about session, so no need to reset it back to 0...
     // maybe one day though...
     /*Dictionary<string, object> clientData = new Dictionary<string, object>() {
         { "session", (Int64)0 }
     };
     LoginDatabase.Instance.SetData(state.Name, clientData);*/
     state.Dispose();
 }
        public static byte[] NewUser(ref LoginSocketState state, Dictionary <string, string> keyValues)
        {
            string message = String.Empty;

            if (keyValues.ContainsKey("nick"))
            {
                state.Name = keyValues["nick"];
            }
            else
            {
                return(DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\"));
            }

            if (keyValues.ContainsKey("email"))
            {
                state.Email = keyValues["email"];
            }
            else
            {
                return(DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\"));
            }

            if (keyValues.ContainsKey("passwordenc"))
            {
                state.PasswordEncrypted = keyValues["passwordenc"];
            }
            else
            {
                return(DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\"));
            }

            if (LoginDatabase.Instance.UserExists(state.Name))
            {
                return(DataFunctions.StringToBytes(@"\error\\err\516\fatal\\errmsg\This account name is already in use!\id\1\final\"));
            }
            else
            {
                string password = DecryptPassword(state.PasswordEncrypted);

                LoginDatabase.Instance.CreateUser(state.Name, password.ToMD5(), state.Email, "??", ((IPEndPoint)state.Socket.RemoteEndPoint).Address);

                var clientData = LoginDatabase.Instance.GetData(state.Name);

                if (clientData == null)
                {
                    return(DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Error creating account!\id\1\final\"));
                }

                message = String.Format(@"\nur\\userid\{0}\profileid\{1}\id\1\final\", clientData["userid"], clientData["profileid"]);
            }

            return(DataFunctions.StringToBytes(message));
        }
Пример #4
0
        private static string GenerateResponseValue(ref LoginSocketState state)
        {
            string value = state.PasswordEncrypted;

            value += new String(' ', 48);
            value += state.Name;
            value += state.ClientChallenge;
            value += state.ServerChallenge;
            value += state.PasswordEncrypted;

            return(value.ToMD5());
        }
Пример #5
0
        private void HandleClientManager(ref LoginSocketState state, string query, Dictionary <string, string> keyValues)
        {
            if (state == null || String.IsNullOrWhiteSpace(query) || keyValues == null)
            {
                return;
            }

            if (state.State == 1)
            {
                if (query.Equals("login", StringComparison.InvariantCultureIgnoreCase))
                {
                    SendToClient(ref state, LoginServerMessages.SendProof(ref state, keyValues));
                    state.StartKeepAlive(this);
                }
                else if (query.Equals("newuser", StringComparison.InvariantCultureIgnoreCase))
                {
                    SendToClient(ref state, LoginServerMessages.NewUser(ref state, keyValues));
                }
            }
            else if (state.State == 2)
            {
                if (query.Equals("status", StringComparison.InvariantCultureIgnoreCase))
                {
                    //LogError("STATUS NOT RESPONDED","1");
                    //SendToClient(ref state, LoginServerMessages.StatusResponse(ref state, keyValues));
                }
                else if (query.Equals("getprofile", StringComparison.InvariantCultureIgnoreCase))
                {
                    SendToClient(ref state, LoginServerMessages.SendProfile(ref state, keyValues, false));
                }
                else if (query.Equals("updatepro", StringComparison.InvariantCultureIgnoreCase))
                {
                    LoginServerMessages.UpdateProfile(ref state, keyValues);
                }
            }
            else if (state.State == 3)
            {
                if (query.Equals("logout", StringComparison.InvariantCultureIgnoreCase))
                {
                    LoginServerMessages.Logout(ref state, keyValues);
                }
                else if (query.Equals("getprofile", StringComparison.InvariantCultureIgnoreCase))
                {
                    SendToClient(ref state, LoginServerMessages.SendProfile(ref state, keyValues, true));
                }
            }
            else if (state.State >= 4)
            {
                state.Dispose();
            }
        }
Пример #6
0
        private void WaitForData(ref LoginSocketState state)
        {
            Thread.Sleep(10);

            try {
                if (state.DataReceivedCallback == null)
                {
                    state.DataReceivedCallback = OnDataReceived;
                }

                state.Socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, state.DataReceivedCallback, state);
            } catch (NullReferenceException) {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
            } catch (ObjectDisposedException) {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
            } catch (SocketException e) {
                if (e.SocketErrorCode == SocketError.NotConnected)
                {
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;
                }

                if (e.SocketErrorCode != SocketError.ConnectionAborted &&
                    e.SocketErrorCode != SocketError.ConnectionReset)
                {
                    LogError(Category, "Error receiving data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                }
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return;
            }
        }
Пример #7
0
        internal static byte[] SendCheck(ref LoginSocketState state, Dictionary <string, string> keyValues)
        {
            string name = String.Empty;

            if (String.IsNullOrWhiteSpace(name))
            {
                if (keyValues.ContainsKey("uniquenick"))
                {
                    name = keyValues["uniquenick"];
                }
            }
            if (String.IsNullOrWhiteSpace(name))
            {
                if (keyValues.ContainsKey("nick"))
                {
                    name = keyValues["nick"];
                }
            }
            if (String.IsNullOrWhiteSpace(name))
            {
                return(DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\"));
            }

            var clientData = LoginDatabase.Instance.GetData(name);

            //GP_CHECK_BAD_EMAIL = 3585, // 0xE01, No account exists with the provided e-mail address.
            //GP_CHECK_BAD_NICK = 3586,	// 0xE02, No such profile exists for the provided e-mail address.
            //GP_CHECK_BAD_PASSWORD = 3587, // 0xE03, The password is incorrect.

            if (clientData == null)
            {
                return(DataFunctions.StringToBytes(String.Format(@"\error\\err\265\fatal\\errmsg\Username [{0}] doesn't exist!\id\1\final\", name)));
            }

            string message;
            string password = PasswordFromKeyValues(keyValues);

            if (LoginDatabase.Instance.CheckPasswordIsCorrect((Int64)clientData["id"], password))
            {
                message = String.Format(@"\cur\0\pid\{0}\final\", clientData["profileid"]);
            }
            else
            {
                message = String.Format(@"\cur\3587\pid\{0}\final\", clientData["profileid"]);
            }

            return(DataFunctions.StringToBytes(message));
        }
Пример #8
0
        public static void UpdateProfile(ref LoginSocketState state, Dictionary <string, string> keyValues)
        {
            string country = "??";

            if (keyValues.ContainsKey("countrycode"))
            {
                country = keyValues["countrycode"].ToUpperInvariant();
            }

            Dictionary <string, object> clientData = new Dictionary <string, object>()
            {
                { "country", country }
            };

            LoginDatabase.Instance.SetData(state.Name, clientData);
            state.State++;
        }
Пример #9
0
        private void StartServerClientManager(object parameter)
        {
            AddressInfo info = (AddressInfo)parameter;

            Log(Category, "Starting Login Server ClientManager");

            try {
                _clientManagerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
                {
                    SendTimeout       = 6000, //was 30000 originally
                    ReceiveTimeout    = 6000, //was 30000 originally
                    SendBufferSize    = 8192,
                    ReceiveBufferSize = 8192,
                    Blocking          = false
                };

                _clientManagerSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ExclusiveAddressUse, true);
                _clientManagerSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
                _clientManagerSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, false);
                _clientManagerSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);

                _clientManagerSocket.Bind(new IPEndPoint(info.Address, info.Port));
                _clientManagerSocket.Listen(10);
            } catch (Exception e) {
                LogError(Category, String.Format("Unable to bind Login Server ClientManager to {0}:{1}", info.Address, info.Port));
                LogError(Category, e.ToString());
                return;
            }

            while (true)
            {
                _clientManagerReset.Reset();

                LoginSocketState state = new LoginSocketState()
                {
                    Type   = LoginSocketState.SocketType.Client,
                    Socket = _clientManagerSocket
                };

                _clientManagerSocket.BeginAccept(AcceptCallback, state);
                _clientManagerReset.WaitOne();
            }
        }
        public static byte[] StatusResponse(ref LoginSocketState state, Dictionary <string, string> keyValues)
        {
            //string cat ="\xff\xff\xff\xff\x67\x65\x74\x73\x65\x72\x76\x65\x72\x73\x52\x65\x73\x70\x6f\x6e\x73\x65\x5c\x45\x4f\x54";//"\x63\x61\x74";
            //string dog = "\xff\xff\xff\xff"+@"getserversResponse\tttttt\t5!.m8\EOT";//@"\status\1\\final\";
            //string god = @"\getprofile\\sesskey\" + keyValues["sesskey"].ToUpperInvariant()  + @"\profileid\81246737\id\2\\final\";

            /*string pot = @"\gamename\civ4\gamever\3.19\location\1\hostname\GameMaster Arena Server\hostpo
             * rt\25000\mapname\gmtmap1\gametype\arena\numplayers\12\maxplayers\32\gamemode\ope
             * nplaying\timelimit\40\fraglimit\0\teamplay\1\rankedserver\1\player_0\Joe Player\
             * score_0\22\deaths_0\21\skill_0\339\ping_0\23\team_0\\player_1\L33t 0n3\score_1\1
             * 5\deaths_1\7\skill_1\762\ping_1\0\team_1\\player_2\Raptor\score_2\26\deaths_2\11
             * \skill_2\564\ping_2\372\team_2\Red\final\\queryid\1.1";*/
            string pot = "";

            //IS WRONG SHIT
            // PROPPER STATUS RESPONSE NEEDED
            //should ther even be response to that?
            return(DataFunctions.StringToBytes(pot));//@"\ka\\final\");
        }
Пример #11
0
        internal static byte[] SendNicks(ref LoginSocketState state, Dictionary <string, string> keyValues)
        {
            if (!keyValues.ContainsKey("email") || (!keyValues.ContainsKey("passenc") && !keyValues.ContainsKey("pass")))
            {
                return(DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\"));
            }

            string password = String.Empty;

            if (keyValues.ContainsKey("passenc"))
            {
                password = DecryptPassword(keyValues["passenc"]);
            }
            else if (keyValues.ContainsKey("pass"))
            {
                password = keyValues["pass"];
            }

            password = password.ToMD5();

            var clientData = LoginDatabase.Instance.GetData(keyValues["email"], password);

            if (clientData == null)
            {
                return(DataFunctions.StringToBytes(@"\error\\err\551\fatal\\errmsg\Unable to get any associated profiles.\id\1\final\"));
            }

            List <string> nicks = new List <string>();

            foreach (var client in clientData)
            {
                nicks.Add((string)client["name"]);
            }

            if (nicks.Count == 0)
            {
                return(DataFunctions.StringToBytes(@"\nr\0\ndone\\final\"));
            }

            state.State++;
            return(DataFunctions.StringToBytes(GenerateNicks(nicks.ToArray())));
        }
Пример #12
0
        private void OnSent(IAsyncResult async)
        {
            LoginSocketState state = (LoginSocketState)async.AsyncState;

            if (state == null || state.Socket == null)
            {
                return;
            }

            try {
                int sent = state.Socket.EndSend(async);
                Log(Category, String.Format("[{0}] Sent {1} byte response to: {2}:{3}", state.Type, sent, ((IPEndPoint)state.Socket.RemoteEndPoint).Address, ((IPEndPoint)state.Socket.RemoteEndPoint).Port));
            } catch (NullReferenceException) {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
            } catch (SocketException e) {
                switch (e.SocketErrorCode)
                {
                case SocketError.ConnectionReset:
                case SocketError.Disconnecting:
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;

                default:
                    LogError(Category, "Error sending data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;
                }
            }
        }
        public static byte[] NewUser(ref LoginSocketState state, Dictionary<string, string> keyValues)
        {
            string message = String.Empty;

            if (keyValues.ContainsKey("nick")) {
                state.Name = keyValues["nick"];
            } else {
                return DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\");
            }

            if (keyValues.ContainsKey("email")) {
                state.Email = keyValues["email"];
            } else {
                return DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\");
            }

            if (keyValues.ContainsKey("passwordenc")) {
                state.PasswordEncrypted = keyValues["passwordenc"];
            } else {
                return DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\");
            }

            if (LoginDatabase.Instance.UserExists(state.Name)) {
                return DataFunctions.StringToBytes(@"\error\\err\516\fatal\\errmsg\This account name is already in use!\id\1\final\");
            } else {
                string password = DecryptPassword(state.PasswordEncrypted);

                LoginDatabase.Instance.CreateUser(state.Name, password.ToMD5(), state.Email, "??", ((IPEndPoint)state.Socket.RemoteEndPoint).Address);

                var clientData = LoginDatabase.Instance.GetData(state.Name);

                if (clientData == null) {
                    return DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Error creating account!\id\1\final\");
                }

                message = String.Format(@"\nur\\userid\{0}\profileid\{1}\id\1\final\", clientData["userid"], clientData["profileid"]);
            }

            return DataFunctions.StringToBytes(message);
        }
Пример #14
0
 private void HandleSearchManager(ref LoginSocketState state, string query, Dictionary <string, string> keyValues)
 {
     if (state.State == 0)
     {
         if (query.Equals("nicks", StringComparison.InvariantCultureIgnoreCase))
         {
             SendToClient(ref state, LoginServerMessages.SendNicks(ref state, keyValues));
         }
         else if (query.Equals("check", StringComparison.InvariantCultureIgnoreCase))
         {
             SendToClient(ref state, LoginServerMessages.SendCheck(ref state, keyValues));
         }
     }
     else if (state.State == 1)
     {
         state.State++;
     }
     else if (state.State >= 2)
     {
         state.Dispose();
     }
 }
Пример #15
0
        public bool SendToClient(ref LoginSocketState state, byte[] data)
        {
            if (data == null || state == null || state.Socket == null)
            {
                return(false);
            }

            try {
                if (state.SendCallback == null)
                {
                    state.SendCallback = OnSent;
                }

                state.Socket.BeginSend(data, 0, data.Length, SocketFlags.None, state.SendCallback, state);
                //LogError("data sent:", System.Text.Encoding.Default.GetString(data));
                return(true);
            } catch (NullReferenceException) {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return(false);
            } catch (SocketException e) {
                if (e.SocketErrorCode != SocketError.ConnectionAborted &&
                    e.SocketErrorCode != SocketError.ConnectionReset)
                {
                    LogError(Category, "Error sending data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                }
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return(false);
            }
        }
Пример #16
0
        private void KeepAliveCallback(object s)
        {
            LoginServer server = (LoginServer)s;

            try {
                if (_keepAliveTimer == null)
                {
                    Dispose();
                    return;
                }

                LoginSocketState state = this;
                HeartbeatState++;

                Console.WriteLine("keep alive callback");
                if (!server.SendToClient(ref state, LoginServerMessages.SendKeepAlive()))
                {
                    Dispose();
                    return;
                }


                // every 2nd keep alive request, we send an additional heartbeat
                if (HeartbeatState % 2 == 0)
                {
                    //Console.WriteLine("sending heartbeat");
                    if (!server.SendToClient(ref state, LoginServerMessages.SendHeartbeat()))
                    {
                        Dispose();
                        return;
                    }
                }
                // ServerListRetrieve.
            } catch (Exception e) {
                server.LogError(LoginServer.Category, "Error running keep alive: " + e);
                Dispose();
            }
        }
Пример #17
0
        internal static byte[] SendSearch(ref LoginSocketState state, Dictionary <string, string> keyValues)
        {
            string message = "";

            if (keyValues.ContainsKey("uniquenick"))
            {
                Console.WriteLine("Search for uniquenick: {0}", keyValues["uniquenick"]);
                message = GenerateSearchResultsNick(LoginDatabase.Instance.GetData(keyValues["uniquenick"]));
            }
            else if (keyValues.ContainsKey("email"))
            {
                Console.WriteLine("Search for email: {0}", keyValues["email"]);
                List <Dictionary <string, object> > matchedUsers;
                matchedUsers = LoginDatabase.Instance.GetUserByEmail(keyValues["email"]);
                message      = GenerateSearchResultsEmail(matchedUsers);
            }
            else
            {
                return(DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\"));
            }

            return(DataFunctions.StringToBytes(message));
        }
        private static string GenerateResponseValue(ref LoginSocketState state)
        {
            string value = state.PasswordEncrypted;
            value += new String(' ', 48);
            value += state.Name;
            value += state.ClientChallenge;
            value += state.ServerChallenge;
            value += state.PasswordEncrypted;

            return value.ToMD5();
        }
        internal static byte[] SendNicks(ref LoginSocketState state, Dictionary<string, string> keyValues)
        {
            if (!keyValues.ContainsKey("email") || (!keyValues.ContainsKey("passenc") && !keyValues.ContainsKey("pass"))) {
                return DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\");
            }

            string password = String.Empty;
            if (keyValues.ContainsKey("passenc")) {
                password = DecryptPassword(keyValues["passenc"]);
            } else if (keyValues.ContainsKey("pass")) {
                password = keyValues["pass"];
            }

            password = password.ToMD5();

            var clientData = LoginDatabase.Instance.GetData(keyValues["email"], password);

            if (clientData == null) {
                return DataFunctions.StringToBytes(@"\error\\err\551\fatal\\errmsg\Unable to get any associated profiles.\id\1\final\");
            }

            List<string> nicks = new List<string>();
            foreach (var client in clientData) {
                nicks.Add((string)client["name"]);
            }

            if (nicks.Count == 0) {
                return DataFunctions.StringToBytes(@"\nr\0\ndone\\final\");
            }

            state.State++;
            return DataFunctions.StringToBytes(GenerateNicks(nicks.ToArray()));
        }
        internal static byte[] SendCheck(ref LoginSocketState state, Dictionary<string, string> keyValues)
        {
            string name = String.Empty;

            if (String.IsNullOrWhiteSpace(name)) {
                if (keyValues.ContainsKey("uniquenick")) {
                    name = keyValues["uniquenick"];
                }
            }
            if (String.IsNullOrWhiteSpace(name)) {
                if (keyValues.ContainsKey("nick")) {
                    name = keyValues["nick"];
                }
            }
            if (String.IsNullOrWhiteSpace(name)) {
                return DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\");
            }

            var clientData = LoginDatabase.Instance.GetData(name);

            if (clientData == null) {
                return DataFunctions.StringToBytes(String.Format(@"\error\\err\265\fatal\\errmsg\Username [{0}] doesn't exist!\id\1\final\", name));
            }

            string message = String.Format(@"\cur\0\pid\{0}\final\", clientData["profileid"]);

            return DataFunctions.StringToBytes(message);
        }
 public static byte[] GenerateServerChallenge(ref LoginSocketState state)
 {
     state.ServerChallenge = _random.GetString(10);
     string message = String.Format(@"\lc\1\challenge\{0}\id\1\final\", state.ServerChallenge);
     return DataFunctions.StringToBytes(message);
 }
        public static void UpdateProfile(ref LoginSocketState state, Dictionary<string, string> keyValues)
        {
            string country = "??";
            if (keyValues.ContainsKey("countrycode")) {
                country = keyValues["countrycode"].ToUpperInvariant();
            }

            Dictionary<string, object> clientData = new Dictionary<string, object>() {
                { "country", country }
            };

            LoginDatabase.Instance.SetData(state.Name, clientData);
            state.State++;
        }
        public static byte[] SendProof(ref LoginSocketState state, Dictionary<string, string> keyValues)
        {
            string response = String.Empty;

            int requiredValues = 0;

            state.Name = String.Empty;

            if (keyValues.ContainsKey("uniquenick")) {
                state.Name = keyValues["uniquenick"];
                requiredValues++;
            }

            if (keyValues.ContainsKey("challenge")) {
                state.ClientChallenge = keyValues["challenge"];
                requiredValues++;
            }

            if (keyValues.ContainsKey("response")) {
                response = keyValues["response"];
                requiredValues++;
            }

            if (requiredValues != 3)
                return DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\");

            var clientData = LoginDatabase.Instance.GetData(state.Name);

            if (clientData != null) {
                state.PasswordEncrypted = (string)clientData["passwordenc"];

                if (response == GenerateResponseValue(ref state)) {
                    ushort session = GenerateSession(state.Name);

                    string proof = String.Format(@"\lc\2\sesskey\{0}\proof\{1}\userid\{2}\profileid\{3}\uniquenick\{4}\lt\{5}\id\1\final\",
                        session,
                        GenerateProofValue(state),
                        clientData["userid"],
                        clientData["profileid"],
                        state.Name,
                        _random.GetString(22, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][") + "__");

                    /*state.Session = session.ToString();
                    Dictionary<string, object> updateClientData = new Dictionary<string, object>() {
                        { "session", session }
                    };
                    LoginDatabase.Instance.SetData(state.Name, updateClientData);*/

                    LoginDatabase.Instance.LogLogin(state.Name, ((IPEndPoint)state.Socket.RemoteEndPoint).Address);

                    state.State++;
                    return DataFunctions.StringToBytes(proof);
                } else {
                    return DataFunctions.StringToBytes(@"\error\\err\260\fatal\\errmsg\The password provided is incorrect.\id\1\final\");
                }
            } else {
                return DataFunctions.StringToBytes(String.Format(@"\error\\err\265\fatal\\errmsg\Username [{0}] doesn't exist!\id\1\final\", state.Name));
            }
        }
        public static byte[] SendProfile(ref LoginSocketState state, Dictionary<string, string> keyValues, bool retrieve)
        {
            var clientData = LoginDatabase.Instance.GetData(state.Name);

            if (clientData == null) {
                return DataFunctions.StringToBytes(String.Format(@"\error\\err\265\fatal\\errmsg\Username [{0}] doesn't exist!\id\1\final\", state.Name));
            }

            string message = String.Format(
                @"\pi\\profileid\{0}\nick\{1}\userid\{2}\email\{3}\sig\{4}\uniquenick\{5}\pid\{6}" +
                @"\firstname\lastname\countrycode\{7}\birthday\{8}\lon\{9}\lat\{10}\loc\id\{11}\final\",
                clientData["profileid"],
                state.Name,
                clientData["userid"],
                clientData["email"],
                _random.GetString(32, "0123456789abcdef"),
                state.Name,
                0,
                clientData["country"],
                16844722,
                "0.000000",
                "0.000000",
                retrieve ? 5 : 2
            );

            if (!retrieve)
                state.State++;

            return DataFunctions.StringToBytes(message);
        }
Пример #25
0
        private void WaitForData(ref LoginSocketState state)
        {
            Thread.Sleep(10);

            try {
                if (state.DataReceivedCallback == null)
                    state.DataReceivedCallback = OnDataReceived;

                state.Socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, state.DataReceivedCallback, state);
            } catch (NullReferenceException) {
                if (state != null)
                    state.Dispose();
                state = null;
            } catch (ObjectDisposedException) {
                if (state != null)
                    state.Dispose();
                state = null;
            } catch (SocketException e) {
                if (e.SocketErrorCode == SocketError.NotConnected) {
                    if (state != null)
                        state.Dispose();
                    state = null;
                    return;
                }

                if (e.SocketErrorCode != SocketError.ConnectionAborted &&
                    e.SocketErrorCode != SocketError.ConnectionReset) {
                    LogError(Category, "Error receiving data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                }
                if (state != null)
                    state.Dispose();
                state = null;
                return;
            }
        }
Пример #26
0
        private void ParseMessage(ref LoginSocketState state, string message)
        {
            string query;
            var keyValues = GetKeyValue(message, out query);

            if (keyValues == null || String.IsNullOrWhiteSpace(query)) {
                return;
            }

            Log(Category, String.Format("[{0}] Received {1} query from: {2}:{3}", state.Type, query, ((IPEndPoint)state.Socket.RemoteEndPoint).Address, ((IPEndPoint)state.Socket.RemoteEndPoint).Port));

            if (keyValues.ContainsKey("gamename") && !keyValues["gamename"].Equals("battlefield2", StringComparison.InvariantCultureIgnoreCase)) {
                // say no to those not using bf2... Begone evil demon, bf2 for life!
                return;
            }

            switch (state.Type) {
                case LoginSocketState.SocketType.Client:
                    HandleClientManager(ref state, query, keyValues);
                    break;
                case LoginSocketState.SocketType.Search:
                    HandleSearchManager(ref state, query, keyValues);
                    break;
            }
        }
Пример #27
0
        public static byte[] SendProof(ref LoginSocketState state, Dictionary <string, string> keyValues)
        {
            string response = String.Empty;

            int requiredValues = 0;

            state.Name = String.Empty;

            if (keyValues.ContainsKey("uniquenick"))
            {
                state.Name = keyValues["uniquenick"];
                requiredValues++;
            }

            if (keyValues.ContainsKey("challenge"))
            {
                state.ClientChallenge = keyValues["challenge"];
                requiredValues++;
            }

            if (keyValues.ContainsKey("response"))
            {
                response = keyValues["response"];
                requiredValues++;
            }

            if (requiredValues != 3)
            {
                return(DataFunctions.StringToBytes(@"\error\\err\0\fatal\\errmsg\Invalid Query!\id\1\final\"));
            }

            var clientData = LoginDatabase.Instance.GetData(state.Name);

            if (clientData != null)
            {
                state.PasswordEncrypted = (string)clientData["passwordenc"];

                if (response == GenerateResponseValue(ref state))
                {
                    ushort session = GenerateSession(state.Name);

                    string proof = String.Format(@"\lc\2\sesskey\{0}\proof\{1}\userid\{2}\profileid\{3}\uniquenick\{4}\lt\{5}\id\1\final\",
                                                 session,
                                                 GenerateProofValue(state),
                                                 clientData["userid"],
                                                 clientData["profileid"],
                                                 state.Name,
                                                 _random.GetString(22, "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][") + "__");

                    /*state.Session = session.ToString();
                     * Dictionary<string, object> updateClientData = new Dictionary<string, object>() {
                     *      { "session", session }
                     * };
                     * LoginDatabase.Instance.SetData(state.Name, updateClientData);*/

                    LoginDatabase.Instance.LogLogin(state.Name, ((IPEndPoint)state.Socket.RemoteEndPoint).Address);

                    state.State++;
                    return(DataFunctions.StringToBytes(proof));
                }
                else
                {
                    return(DataFunctions.StringToBytes(@"\error\\err\260\fatal\\errmsg\The password provided is incorrect.\id\1\final\"));
                }
            }
            else
            {
                return(DataFunctions.StringToBytes(String.Format(@"\error\\err\265\fatal\\errmsg\Username [{0}] doesn't exist!\id\1\final\", state.Name)));
            }
        }
Пример #28
0
        private void OnDataReceived(IAsyncResult async)
        {
            LoginSocketState state = (LoginSocketState)async.AsyncState;

            if (state == null || state.Socket == null)
            {
                return;
            }

            try {
                // receive data from the socket
                int received = state.Socket.EndReceive(async);
                if (received == 0)
                {
                    // when EndReceive returns 0, it means the socket on the other end has been shut down.
                    return;
                }

                // take what we received, and append it to the received data buffer
                state.ReceivedData.Append(Encoding.UTF8.GetString(state.Buffer, 0, received));
                string receivedData = state.ReceivedData.ToString();

                // does what we received contain the \final\ delimiter?
                if (receivedData.LastIndexOf(@"\final\") > -1)
                {
                    state.ReceivedData.Clear();
                    //Log("data received:", receivedData);
                    int lame = state.State;
                    //Log("state.state:", lame.ToString() );//
                    // lets split up the message based on the delimiter
                    string[] messages = receivedData.Split(new string[] { @"\final\" }, StringSplitOptions.RemoveEmptyEntries);

                    for (int i = 0; i < messages.Length; i++)
                    {
                        ParseMessage(ref state, messages[i]);
                    }
                }
            } catch (ObjectDisposedException) {
                if (state != null)
                {
                    state.Dispose();
                }
                state = null;
                return;
            } catch (SocketException e) {
                switch (e.SocketErrorCode)
                {
                case SocketError.ConnectionReset:
                case SocketError.Disconnecting:
                case SocketError.NotConnected:
                case SocketError.TimedOut:
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;

                default:
                    LogError(Category, "Error receiving data");
                    LogError(Category, String.Format("{0} {1}", e.SocketErrorCode, e));
                    if (state != null)
                    {
                        state.Dispose();
                    }
                    state = null;
                    return;
                }
            } catch (Exception e) {
                LogError(Category, "Error receiving data");
                LogError(Category, e.ToString());
            }

            // and we wait for more data...
            WaitForData(ref state);
        }
Пример #29
0
        private void HandleClientManager(ref LoginSocketState state, string query, Dictionary<string, string> keyValues)
        {
            if (state == null || String.IsNullOrWhiteSpace(query) || keyValues == null) {
                return;
            }

            if (state.State == 1) {
                if (query.Equals("login", StringComparison.InvariantCultureIgnoreCase)) {
                    SendToClient(ref state, LoginServerMessages.SendProof(ref state, keyValues));
                    state.StartKeepAlive(this);
                } else if (query.Equals("newuser", StringComparison.InvariantCultureIgnoreCase)) {
                    SendToClient(ref state, LoginServerMessages.NewUser(ref state, keyValues));
                }
            } else if (state.State == 2) {
                if (query.Equals("getprofile", StringComparison.InvariantCultureIgnoreCase)) {
                    SendToClient(ref state, LoginServerMessages.SendProfile(ref state, keyValues, false));
                } else if (query.Equals("updatepro", StringComparison.InvariantCultureIgnoreCase)) {
                    LoginServerMessages.UpdateProfile(ref state, keyValues);
                }
            } else if (state.State == 3) {
                if (query.Equals("logout", StringComparison.InvariantCultureIgnoreCase)) {
                    LoginServerMessages.Logout(ref state, keyValues);
                } else if (query.Equals("getprofile", StringComparison.InvariantCultureIgnoreCase)) {
                    SendToClient(ref state, LoginServerMessages.SendProfile(ref state, keyValues, true));
                }
            } else if (state.State >= 4) {
                state.Dispose();
            }
        }
Пример #30
0
 private void HandleSearchManager(ref LoginSocketState state, string query, Dictionary<string, string> keyValues)
 {
     if (state.State == 0) {
         if (query.Equals("nicks", StringComparison.InvariantCultureIgnoreCase)) {
             SendToClient(ref state, LoginServerMessages.SendNicks(ref state, keyValues));
         } else if (query.Equals("check", StringComparison.InvariantCultureIgnoreCase)) {
             SendToClient(ref state, LoginServerMessages.SendCheck(ref state, keyValues));
         }
     } else if (state.State == 1) {
         state.State++;
     } else if (state.State >= 2) {
         state.Dispose();
     }
 }
Пример #31
0
        private void ParseMessage(ref LoginSocketState state, string message)
        {
            string query;
            var keyValues = GetKeyValue(message, out query);

            if (keyValues == null || String.IsNullOrWhiteSpace(query)) {
                return;
            }

            Log(Category, String.Format("[{0}] Received {1} query from: {2}:{3}", state.Type, query, ((IPEndPoint)state.Socket.RemoteEndPoint).Address, ((IPEndPoint)state.Socket.RemoteEndPoint).Port));

            switch (state.Type) {
                case LoginSocketState.SocketType.Client:
                    HandleClientManager(ref state, query, keyValues);
                    break;
                case LoginSocketState.SocketType.Search:
                    HandleSearchManager(ref state, query, keyValues);
                    break;
            }
        }
Пример #32
0
        private void StartServerSearchManager(object parameter)
        {
            AddressInfo info = (AddressInfo)parameter;

            Log(Category, "Starting Login Server SearchManager");

            try {
                _searchManagerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) {
                    SendTimeout = 5000,
                    ReceiveTimeout = 5000,
                    SendBufferSize = 8192,
                    ReceiveBufferSize = 8192,
                    Blocking = false
                };

                _searchManagerSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ExclusiveAddressUse, true);
                _searchManagerSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
                _searchManagerSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Linger, false);
                _searchManagerSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);

                _searchManagerSocket.Bind(new IPEndPoint(info.Address, info.Port));
                _searchManagerSocket.Listen(10);
            } catch (Exception e) {
                LogError(Category, String.Format("Unable to bind Login Server SearchManager to {0}:{1}", info.Address, info.Port));
                LogError(Category, e.ToString());
                return;
            }

            while (true) {
                _searchManagerReset.Reset();

                LoginSocketState state = new LoginSocketState() {
                    Type = LoginSocketState.SocketType.Search,
                    Socket = _searchManagerSocket
                };

                _searchManagerSocket.BeginAccept(AcceptCallback, state);
                _searchManagerReset.WaitOne();
            }
        }