Example #1
0
        public static void Login(LoginClient pClient, Packet pPacket)
        {
            // Initialize DB
            DatabaseClient dbClient = Program.DatabaseManager.GetClient();

            // Define packet lengths, as these may change with client updates
            int packetLength = 316;
            int loginLength = 17 + 1;
            int passwordLength = 32 + 1;

            string md5 = pPacket.ReadStringForLogin(packetLength);
            char[] md5Char = md5.ToCharArray();
            string username = "";
            string clientPassword = "";

            // Read from 0 --> 17
            for (int i = 0; i < loginLength; i++)
                username += md5Char[i].ToString().Replace("\0", "");

            // Read from 260 --> 292
            for (int i = 260; i < 260 + passwordLength; i++)
                clientPassword += md5Char[i].ToString().Replace("\0", "");

            Log.WriteLine(LogLevel.Debug, "{0} tries to login.", username);

            DataTable loginData = null;

            using (dbClient)
                loginData = dbClient.ReadDataTable("SELECT * FROM accounts WHERE Username= '******'");

            // Auto account creation if no username found
            if (loginData.Rows.Count == 0)
            {
                dbClient.ExecuteQuery("INSERT INTO accounts (username, password) VALUES ('" + username + "','" + clientPassword + "')");

                using (dbClient)
                    loginData = dbClient.ReadDataTable("SELECT * FROM accounts WHERE Username= '******'");
            }

            if (loginData != null)
            {
                if (loginData.Rows.Count > 0)
                {
                    foreach (DataRow row in loginData.Rows)
                    {
                        string uIsername = (string)row["username"];
                        string password = (string)row["password"];
                        bool banned = Database.DataStore.ReadMethods.EnumToBool(row["banned"].ToString());

                        if (clientPassword == password)
                        {
                            if (banned)
                            {
                                SendFailedLogin(pClient, ServerError.Blocked);
                                Log.WriteLine(LogLevel.Debug, "Banned user - {0} tries to login.", username);
                            }

                            else if (ClientManager.Instance.IsLoggedIn(uIsername))
                            {
                                Log.WriteLine(LogLevel.Warn, "{0} is trying dual login. Disconnecting.", uIsername);
                                pClient.Disconnect();

                                break;
                            }
                            else
                            {
                                pClient.Username = uIsername;
                                pClient.IsAuthenticated = true;
                                pClient.Admin = 0; /*(byte)row["Admin"];*/
                                pClient.AccountID = int.Parse(row["id"].ToString());
                                WorldList(pClient, false);
                            }
                        }
                        else
                            SendFailedLogin(pClient, ServerError.InvalidCredentials);
                    }
                }
            }
        }