New Server Management System

Status
Not open for further replies.
It's not xD.

Program.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Diagnostics;

namespace ManagementSuite
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("################################################################################");
            Console.WriteLine("                  FlyFF Management Server - Blaze Games 2011");
            Console.WriteLine("################################################################################");

            Sockets Server = new Sockets();

            Thread ThreadCounter = new Thread(SetThreadCount);
            ThreadCounter.Start();

            Server.Start();
            Console.ReadLine();
            Environment.Exit(1);
        }

        public static void SetThreadCount()
        {
            while (true)
            {
                int ThreadCount = Process.GetCurrentProcess().Threads.Count;
                Console.Title = Convert.ToString(ThreadCount);
            }
        }
    }
}

Sockets.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using ManagementSuite.Packets;

namespace ManagementSuite
{
    class Sockets
    {
        public TcpListener Listener;
        public Thread ListenThread;
        ConsoleOp CO;
        BaseOperations BO;
        MySQLOperations Account;

        public Sockets()
        {
            Account = new MySQLOperations("server", "user", "pass", "db");
            CO = new ConsoleOp();
            BO = new BaseOperations();
        }

        public void Start() //Start listening for connections
        {
            Listener = new TcpListener(IPAddress.Any, 3000);
            ListenThread = new Thread(new ThreadStart(Listen));
            ListenThread.Start();
        }

        private void Listen()
        {
            Listener.Start();
            while (true)
            {
                TcpClient Client = Listener.AcceptTcpClient();
                string ClientIP = Convert.ToString(IPAddress.Parse(((IPEndPoint)Client.Client.RemoteEndPoint).Address.ToString())); //Get Client's IP

                ConsoleOp.ConsoleInform("Connection from " + ClientIP + " attempted...");

                if(CO.CheckIP(ClientIP)) //Check if IP is on whitelist
	            {
                    Thread ClientThread = new Thread(new ParameterizedThreadStart(Recieve));
                    ClientThread.Start(Client);
                    ConsoleOp.ConsoleInform("Connection accepted.");
	            }
                else
                {
                    CO.EmailFailedConnection(ClientIP);
                    ConsoleOp.ConsoleError("Connection not accepted.");
                    Send(Client, ServerResponse.ERROR);
                    Client.Close();
                }
            }
        }

        public void Recieve(object client)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream ClientStream = tcpClient.GetStream();
            ASCIIEncoding Encoder = new ASCIIEncoding();

            int Response;
            byte[] ByteResponse = new byte[256];

            while (true)
            {
                Response = 0;

                try
                {
                    Response = ClientStream.Read(ByteResponse, 0, ByteResponse.Length);
                }
                catch
                {
                    break;
                }

                if (Response == 0)
                {
                    break;
                }

                string Packet = Encoder.GetString(ByteResponse, 0, Response);
                string[] PacketArray = Packet.Split('~');

                string PacketHeader = PacketArray[0];
                string PacketBody = null;

                if (PacketArray.Length == 2)
                {
                    PacketBody = PacketArray[1];
                }

                Console.WriteLine("Packet Header:  {0}\nPacket Body:  {1}", PacketHeader, PacketBody);

                switch (PacketHeader)
                {
                    case ClientResponse.STARTIS: BO.StartProcess("FlyffISCProgram.exe"); break;
                    case ClientResponse.STARTLG: BO.StartProcess("FlyffLoginServer.exe"); break;
                    case ClientResponse.STARTCL: BO.StartProcess("FlyffClusterServer.exe"); break;
                    case ClientResponse.STARTWD: BO.StartProcess("FlyffWorldServer.exe"); break;

                    case ClientResponse.STOPIS: BO.StopProcess("FlyffISCProgram.exe"); break;
                    case ClientResponse.STOPLG: BO.StopProcess("FlyffLoginServer.exe"); break;
                    case ClientResponse.STOPCL: BO.StopProcess("FlyffClusterServer.exe"); break;
                    case ClientResponse.STOPWD: BO.StopProcess("FlyffWorldServer.exe"); break;

                    case ClientResponse.CHECKIS: BO.CheckProcess("FlyffISCProgram.exe"); break;
                    case ClientResponse.CHECKLG: BO.CheckProcess("FlyffLoginServer.exe"); break;
                    case ClientResponse.CHECKCL: BO.CheckProcess("FlyffClusterServer.exe"); break;
                    case ClientResponse.CHECKWD: BO.CheckProcess("FlyffWorldServer.exe"); break;

                    case ClientResponse.ADMINLOGIN: if (Account.AdminLogin(PacketBody)) { Send(tcpClient, Packets.ServerResponse.SUCCESS + "~" + Packets.ServerResponse.PASSEDADMINLOGIN); } else { Send(tcpClient, Packets.ServerResponse.ERROR + "~" + Packets.ServerResponse.FAILEDADMINLOGIN); } break;
                    case ClientResponse.LOGIN: Account.Login(PacketBody); break;
                    case ClientResponse.REGISTER: Account.Register(PacketBody); break;
                    case ClientResponse.FETCHACCDATA: break;
                    case ClientResponse.FETCHCHRDATA: break;
                    case ClientResponse.FETCHGLDDATA: break;
                    case ClientResponse.FETCHRANKING: break;
                    case ClientResponse.ONLINEUSERS: break;
                    case ClientResponse.MAKEADMIN: Account.MakeGM(PacketBody); break;
                    case ClientResponse.MAKEUSER: Account.MakePlayer(PacketBody); break;
                    case ClientResponse.BANACC: Account.BanAcc(PacketBody); break;
                    case ClientResponse.UNBANACC: Account.UnBanAcc(PacketBody); break;
                    case ClientResponse.ADDPOINTS: break;
                    case ClientResponse.TAKEPOINTS: break;
                    case ClientResponse.GETPOINTS: break;
                    case ClientResponse.CHANGEPASS: Account.ChangePassword(PacketBody); break;
                    case ClientResponse.CHANGEMAIL: Account.ChangeEmail(PacketBody); break;

                    default: ConsoleOp.ConsoleError("Unknown packet recieved: " + PacketHeader); break;
                }
            }
            tcpClient.Close();
        }

        public void Send(object client, string Message)
        {
            TcpClient tcpClient = (TcpClient)client;
            NetworkStream ClientStream = null;

            try { ClientStream = tcpClient.GetStream(); }
            catch { ConsoleOp.ConsoleError("Could not send packets."); }

            ASCIIEncoding Encoder = new ASCIIEncoding();
            byte[] Packet = Encoder.GetBytes(Message);
            if (ClientStream != null) { ClientStream.Write(Packet, 0, Packet.Length); }
        }
    }
}

Packets.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ManagementSuite
{
    namespace Packets
    {
        public struct ServerResponse
        {
            public const string SUCCESS = "0x00";
            public const string ERROR = "0x01";

            public const string FAILEDADMINLOGIN = "1x00";
            public const string FAILEDUSERLOGIN = "1x01";

            public const string PASSEDADMINLOGIN = "2x00";
            public const string PASSEDUSERLOGIN = "2x01";
        }

        public struct ClientResponse
        {
            //Start Flyff Programs
            public const string STARTIS = "0x02";
            public const string STARTLG = "0x03";
            public const string STARTCL = "0x04";
            public const string STARTWD = "0x05";

            //Stop Flyff Programs
            public const string STOPIS = "0x06";
            public const string STOPLG = "0x07";
            public const string STOPCL = "0x08";
            public const string STOPWD = "0x09";

            //Check Flyff Processes
            public const string CHECKIS = "0x10";
            public const string CHECKLG = "0x11";
            public const string CHECKCL = "0x12";
            public const string CHECKWD = "0x13";

            //Flyff Website
            public const string ADMINLOGIN = "0x14";
            public const string LOGIN = "0x15";
            public const string REGISTER = "0x16";
            public const string FETCHACCDATA = "0x17";
            public const string FETCHCHRDATA = "0x18";
            public const string FETCHGLDDATA = "0x19";
            public const string FETCHRANKING = "0x20";
            public const string ONLINEUSERS = "0x21";
            public const string MAKEADMIN = "0x22";
            public const string MAKEUSER = "0x23";
            public const string BANACC = "0x24";
            public const string UNBANACC = "0x25";
            public const string CHANGEPASS = "0x29";
            public const string CHANGEMAIL = "0x30";
            /*  Donation  */
            public const string ADDPOINTS = "0x26";
            public const string TAKEPOINTS = "0x27";
            public const string GETPOINTS = "0x28";
        }
    }
}

Operations.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ManagementSuite
{
    class MSSQLOperations : MSSQL
    {
        public MSSQLOperations(string server, string username, string password, string database)
        : base(server, username, password, database)
        {
            
        }
    }

    class MySQLOperations : MySQL
    {
        public MySQLOperations(string server, string username, string password, string database)
        : base(server, username, password, database)
        {

        }

        //Get MD% Hash for passwords
        public string GetMD5Hash(string input)
        {
            System.Security.Cryptography.MD5CryptoServiceProvider x = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] bs = System.Text.Encoding.UTF8.GetBytes(input);
            bs = x.ComputeHash(bs);
            System.Text.StringBuilder s = new System.Text.StringBuilder();
            foreach (byte b in bs)
            {
                s.Append(b.ToString("x2").ToLower());
            }

            string password = s.ToString();
            return password;
        }

        //Take bad words out of string
        public string Sanatize(string Input)
        {
            string[] BadCharacters = { "'", "\"", "%", "*", "#", "(", ")", ";", "--", "/", "NULL", "TRUNCATE", "DROP", "UPDATE", "SELECT", "LOAD FILE", "LOAD INFILE", "group_concat", "extractvalue", "0x27" };

            foreach (string Character in BadCharacters)
            {
                Input = Input.Replace(Character, "");
            }

            return Input;
        }

        public bool AdminLogin(string PacketData)
        {
            string[] Data = PacketData.Split('&');
            string User = Data[0];
            string password = Data[1];
            string Salt = "kikugalanet";
            User = Sanatize(User);

            Console.WriteLine("Username:  {0}\nPassword: {1}", User, password);

            string[] Password = ReturnQuery("SELECT flyff_passwordhash FROM flyff_accounts WHERE flyff_accountname='" + User + "'");
            string[] Auth = ReturnQuery("SELECT flyff_authoritylevel FROM flyff_accounts WHERE flyff_accountname='" + User + "'");

            if (Password[0] == GetMD5Hash(Salt + password) && Auth[0] == "120")
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public bool Login(string PacketData)
        {
            string[] Data = PacketData.Split('\t');
            string User = Data[0];
            string password = Data[1];
            string Salt = "kikugalanet";
            User = Sanatize(User);
            string[] Password = ReturnQuery("SELECT flyff_passwordhash FROM flyff_accounts WHERE flyff_accountname='" + User + "'");

            if (Password[0] == GetMD5Hash(Salt + password))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public void Register(string PacketData)
        {
            string[] Data = PacketData.Split('\t');

            string Salt = "kikugalanet";
            string Account = Data[0];
            string Password = Data[1];
            string Email = Data[2];

            Account = Sanatize(Account);
            Password = GetMD5Hash(Salt + Password);
            Email = Sanatize(Email);

            NonReturnQuery("INSERT INTO flyff_accounts ('flyff_username', 'flyff_passwordhash', 'flyff_email') VALUES ('" + Account + "', '" + Password + "', '" + Email + "')");

            ConsoleOp.Email("Welcome!", "Welcome to our server " + Account + ". Your password is " + Password, Email);
        }

        public void MakeGM(string PacketData)
        {
            string accName = Sanatize(PacketData);
            NonReturnQuery("UPDATE flyff_accounts SET flyff_authoritylevel = '80' WHERE flyff_accountname = '" + accName + "'");
        }

        public void ChangePassword(string PacketData)
        {
            string[] Data = PacketData.Split('\t');

            string Salt = "kikugalanet";
            string Account = Data[0];
            string Password = Data[1];
            Account = Sanatize(Account);
            string PasswordHash = GetMD5Hash(Salt + Password);

            NonReturnQuery("UPDATE flyff_accounts SET flyff_passwordhash = '" + PasswordHash + "' WHERE flyff_accountname = '" + Account + "'");

            string[] Email = ReturnQuery("SELECT flyff_email FROM flyff_accounts WHERE flyff_accountname='" + Account + "'");

            ConsoleOp.Email("Password update", "Your new password is " + Password + " . Have a great day!", Email[0]);
        }

        public void ChangeEmail(string PacketData)
        {
            string[] Data = PacketData.Split('\t');

            string Account = Data[0];
            string Email = Data[1];

            Account = Sanatize(Account);
            Email = Sanatize(Email);

            NonReturnQuery("UPDATE flyff_accounts SET flyff_email = '" + Email + "' WHERE flyff_accountname = '" + Account + "'");

            ConsoleOp.Email("E-Mail update", "Thanks for letting us know about your new e-mail! Have a great day!", Email);
        }

        public void MakePlayer(string PacketData)
        {
            string accName = Sanatize(PacketData);
            NonReturnQuery("UPDATE flyff_accounts SET flyff_authoritylevel = '70' WHERE flyff_accountname = '" + accName + "'");
        }

        public void BanAcc(string PacketData)
        {
            string accName = Sanatize(PacketData);
            NonReturnQuery("UPDATE flyff_accounts SET flyff_authoritylevel = '0' WHERE flyff_accountname = '" + accName + "'");
            string[] Email = ReturnQuery("SELECT flyff_email FROM flyff_accounts WHERE flyff_accountname='" + accName + "'");
            //Email
            ConsoleOp.Email("Account status", "Your account has been temporarily banned while our team carries about an investigation. Please respond to this e-mail with character name and cluster so we may resolve this faster!", Email[0]);
        }

        public void UnBanAcc(string PacketData)
        {
            string accName = Sanatize(PacketData);
            NonReturnQuery("UPDATE flyff_accounts SET flyff_authoritylevel = '70' WHERE flyff_accountname = '" + accName + "'");
            string[] Email = ReturnQuery("SELECT flyff_email FROM flyff_accounts WHERE flyff_accountname='" + accName + "'");
            //Email
            ConsoleOp.Email("Account status", "Your account has been unbanned. Enjoy the game! Please don't respond to this e-mail unless you have further issues.", Email[0]);
        }
    }
}

ConsoleOp.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Net;
using System.Net.Mail;
using System.Net.Security;
using System.IO;
using System.Net.Sockets;

namespace ManagementSuite
{
    class ConsoleOp
    {
        public static void ConsoleError(string Error)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write("[Error] ");

            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine(Error);
        }

        public static void ConsoleInform(string Inform)
        {
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.Write("[Inform] ");

            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine(Inform);
        }

        public static void ConsoleCommand(string Command)
        {
            Console.ForegroundColor = ConsoleColor.Green;
            Console.Write("[Error] ");

            Console.ForegroundColor = ConsoleColor.White;
            Console.WriteLine(Command);
        }

        public bool CheckIP(string IP)
        {
            if (IP == "72.198.45.175" || IP == "24.117.97.52")
                return true;
            else
                return false;
        }

        public void LogConnection(string IP)
        {
            //write ip to log file
        }

        public void EmailFailedConnection(string IP)
        {
            DateTime Date = DateTime.Now;
            Email("Unauthorized access attempt", "The IP " + IP + "attempted to access backend server at " + Date, "ashtonj1@***********.com");
            Email("Unauthorized access attempt", "The IP " + IP + "attempted to access backend server at " + Date, "gage@***********.com");
        }

        public static void Email(string Subject, string Body, string Email)
        {
            SmtpClient mailClient = new SmtpClient("smtp.live.com", 587);
            mailClient.UseDefaultCredentials = false;
            mailClient.Credentials = new NetworkCredential("support@***********.com", "password");
            mailClient.EnableSsl = true;
            MailMessage message = new MailMessage("support@***********.com", Email);
            message.Subject = Subject;
            message.Body = Body;
            message.BodyEncoding = System.Text.Encoding.UTF8;
            message.SubjectEncoding = System.Text.Encoding.UTF8;
            mailClient.Send(message);
        }
    }

    class BaseOperations
    {
        private Process Handle;

        public BaseOperations()
        {
            Handle = new Process();
        }

        public void StartProcess(string prog)
        {
            Handle.StartInfo.FileName = prog + ".exe";
            try
            {
                Handle.Start();
            }
            catch
            {
                ConsoleOp.ConsoleError("Could not find program.");
            }
        }

        public void StopProcess(string prog)
        {
            Process[] list = Process.GetProcesses();
            foreach (Process p in list)
            {
                if (string.Compare(p.ProcessName, prog, true) == 0)
                {
                    p.Kill();
                }
            }
        }

        public bool CheckProcess(string prog)
        {
            bool isRunning = false;
            Process[] list = Process.GetProcesses();

            foreach (Process p in list)
            {
                if (string.Compare(p.ProcessName, prog, true) == 0)
                    isRunning = true;
            }

            return isRunning;
        }
    }
}

Database.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using MySql.Data.MySqlClient;

namespace ManagementSuite
{
    class MSSQL
    {
        private string UserName;
        private string Password;
        private string Database;
        private string Server;

        public MSSQL(string server, string username, string password, string database)
        {
            Server = server;
            UserName = username;
            Password = password;
            Database = database;
        }

        private SqlConnection Connection()
        {
            SqlConnection Con = new SqlConnection("Server=" + Server + ";" + "User Id=" + UserName + ";" + "password=" + Password + ";" + "database=" + Database + ";");

            try
            {
                Con.Open();
            }
            catch
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write("[Error] ");

                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("Could not connect to MSSQL.");
            }

            return Con;
        }

        protected SqlCommand NonReturnQuery(string Query)
        {
            SqlCommand Command = new SqlCommand(Query, Connection());
            try
            {
                Command.ExecuteScalar();
            }
            catch
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write("[Error] ");

                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("Query failed to execute.");
            }
            return Command;
        }

        //Clean up
        ~MSSQL()
        {
            Connection().Close();
        }
    }

    class MySQL
    {
        private string UserName;
        private string Password;
        private string Database;
        private string Server;

        public MySQL(string server, string username, string password, string database)
        {
            Server = server;
            UserName = username;
            Password = password;
            Database = database;
        }

        //Connection
        private MySqlConnection Connection()
        {
            MySqlConnection Con = new MySqlConnection("Server=" + Server + ";" + "User Id=" + UserName + ";" + "password=" + Password + ";" + "database=" + Database + ";");

            try
            {
                Con.Open();
            }
            catch
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write("[Error] ");

                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("Could not connect to MySQL.");
            }

            return Con;
        }

        //Query
        protected MySqlCommand NonReturnQuery(string Query)
        {
            MySqlCommand Command = new MySqlCommand(Query, Connection());
            try
            {
                Command.ExecuteScalar();
            }
            catch
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write("[Error] ");

                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("Query failed to execute.");
            }
            return Command;
        }

        protected string[] ReturnQuery(string Query)
        {
            string[] Data = null;
            MySqlDataReader Reader;
            MySqlCommand Command = new MySqlCommand(Query, Connection());
            try
            {
                Reader = Command.ExecuteReader();
                Data = new string[Reader.FieldCount];
                while (Reader.Read())
                {
                    for (int x = 0; x < Reader.FieldCount; x++)
                    {
                        Data[x] = Convert.ToString(Reader[x]);
                    }
                }
            }
            catch
            {
                Console.ForegroundColor = ConsoleColor.Red;
                Console.Write("[Error] ");

                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine("Query failed to execute.");
            }
            return Data;
        }

        //Clean up
        ~MySQL()
        {
            Connection().Close();
        }
    }
}
 
Status
Not open for further replies.
Back