Exemplo n.º 1
0
 public static void SendSelectedServerDataMessage(LoginClient client, short serverId)
 {
     client.Account.Ticket = client.Ticket;
     client.Account.Update();
     client.Send(new SelectedServerDataMessage(serverId, "127.0.0.1", 5555, true, client.Ticket));
     client.Disconnect();
 }
        public void AuthRequest(LoginClient pServer, byte[] pBuffer)
        {
            var pMsg = new MsgLoginSvAuthRequest(pBuffer);

            if (pMsg.Message != ServerKernel.HelloReplyString)
            {
                pServer.Disconnect();
                return;
            }

            pServer.ConnectionState = InterServerState.MEETING_OK;
            pServer.Send(new MsgLoginSvAuthentication(ServerKernel.Username, ServerKernel.Password, ServerKernel.ServerName, ServerKernel.MaxOnlinePlayer));
            ServerKernel.Log.SaveLog("Connected to the Account Server, waiting for authentication...", true, LogType.MESSAGE);
        }
Exemplo n.º 3
0
        public static void Login(LoginClient pClient, Packet pPacket)
        {
            string hash;
            string username;

            if (!pPacket.TryReadString(out hash, 32) ||
                !pPacket.TryReadString(out username, 32))
            {
                Log.WriteLine(LogLevel.Warn, "Could not read user token.");
                SendFailedLogin(pClient, ServerError.EXCEPTION);
                return;
            }

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

            User user;

            if (Program.Entity.Users.Count() > 0 && (user = Program.Entity.Users.First(u => u.Username == username)) != null)
            {
                if (user.Password.ToLower() == hash.ToLower())
                {
                    if (ClientManager.Instance.IsLoggedIn(user.Username))
                    {
                        Log.WriteLine(LogLevel.Warn, "{0} is trying dual login. Disconnecting.", user.Username);
                        pClient.Disconnect();
                    }
                    else if (user.Banned)
                    {
                        SendFailedLogin(pClient, ServerError.BLOCKED);
                    }
                    else
                    {
                        pClient.IsAuthenticated = true;
                        pClient.Username        = user.Username;
                        pClient.AccountID       = user.ID;
                        pClient.Admin           = user.Admin;
                        AllowFiles(pClient, true);
                        WorldList(pClient, false);
                    }
                }
                else
                {
                    SendFailedLogin(pClient, ServerError.INVALID_CREDENTIALS);
                }
            }
            else
            {
                SendFailedLogin(pClient, ServerError.INVALID_CREDENTIALS);
            }
        }
        public void CompleteAuthentication(LoginClient pClient, byte[] pBuffer)
        {
            var pMsg = new LoginSvResponsePacket(pBuffer);

            switch (pMsg.Response)
            {
            case LoginServerResponse.LOGIN_SUCCESSFUL:
                // send server information packet
                pClient.Send(new MsgServerInformation(ServerKernel.MaxOnlinePlayer,
                                                      (ushort)ServerKernel.Players.Count, ServerKernel.ServerName, ServerKernel.GamePort));
                ServerKernel.Log.SaveLog("Authentication completed! Server is ready to go...", true, LogType.MESSAGE);

                return;

            case LoginServerResponse.LOGIN_DENIED_DISCONNECTED:
                ServerKernel.Log.SaveLog("Disconnected of the account server...", true, LogType.WARNING);
                break;

            case LoginServerResponse.LOGIN_DENIED_SERVER_NOT_EXIST:
                ServerKernel.Log.SaveLog("Access denied to the account server due to invalid server name...", true,
                                         LogType.WARNING);
                break;

            case LoginServerResponse.LOGIN_DENIED_IPADDRESS:
                ServerKernel.Log.SaveLog("Access denied to the account server due to invalid ip address...", true,
                                         LogType.WARNING);
                break;

            case LoginServerResponse.LOGIN_DENIED_LOGIN:
                ServerKernel.Log.SaveLog(
                    "Attempted to use an invalid username or password when connecting to the account server...",
                    true, LogType.WARNING);
                break;

            default:
                ServerKernel.Log.SaveLog("Invalid LOGIN_COMPLETE_AUTHENTICATION response " + pMsg.Response, true,
                                         LogType.DEBUG);
                break;
            }

            try
            {
                pClient.Disconnect();
            }
            catch (Exception ex)
            {
            }
        }
Exemplo n.º 5
0
        public static void VersionInfo(LoginClient pClient, Packet pPacket)
        {
            if (!pPacket.TryReadUShort(out var year) ||
                !pPacket.TryReadUShort(out var version))
            {
                Log.WriteLine(LogLevel.Warn, "Invalid client version.");
                pClient.Disconnect();
                return;
            }

            Log.WriteLine(LogLevel.Debug, "Client version authenticated - Year: {0} Version: {1}.", year, version);
            using (var response = new Packet(SH3Type.VersionAllowed))
            {
                response.WriteShort(1);
                pClient.SendPacket(response);
            }
        }
Exemplo n.º 6
0
        public static void VersionInfo(LoginClient pClient, Packet pPacket)
        {
            string year;
            ushort version;

            if (!pPacket.TryReadString(out year, 20) ||
                !pPacket.TryReadUShort(out version))
            {
                Log.WriteLine(LogLevel.Warn, "Invalid client version.");
                pClient.Disconnect();
                return;
            }
            Log.WriteLine(LogLevel.Debug, "Client version {0}:{1}.", year, version);
            using (Packet response = new Packet(SH3Type.VersionAllowed))
            {
                response.WriteShort(1);
                pClient.SendPacket(response);
            }
        }
Exemplo n.º 7
0
        public static void Login(LoginClient pClient, Packet pPacket)
        {
            // Initialize DB
            var dbClient = Program.DatabaseManager.GetClient();

            // XX XX XX XX XX XX XX XX XX XX XX - login length
            // 00 00 00 00 00 00 00 - space
            // XX XX XX XX XX XX XX - password
            // 00 00 00 00 00 00 00 00 00 4F 72 69 67 69 6E 61 6C 00 00 00 00 00 00 00 00 00 00 00

            // Define packet lengths, as these may change with client updates
            const int packetLength  = 54,
                      loginBlock    = 11,
                      spaceLength   = 7,
                      passwordBlock = 7;

            var md5            = pPacket.ReadStringForLogin(packetLength);
            var md5Char        = md5.ToCharArray();
            var clientUsername = "";
            var clientPassword = "";

            // TODO - Escape these before query processing

            // Read from 0 --> 11
            for (var i = 0; i <= loginBlock; i++)
            {
                clientUsername += md5Char[i].ToString().Replace("\0", "");
            }

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

            // Read from 18 --> onwards
            for (var i = loginBlock + spaceLength; i <= loginBlock + spaceLength + passwordBlock; i++)
            {
                clientPassword += md5Char[i].ToString().Replace("\0", "");
            }

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

            DataTable loginData;

            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 ('" + clientUsername + "','" +
                                      clientPassword + "')");

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

            if (loginData == null)
            {
                return;
            }
            if (loginData.Rows.Count <= 0)
            {
                return;
            }

            foreach (DataRow row in loginData.Rows)
            {
                var username = (string)row["username"];
                var password = (string)row["password"];
                var banned   = ReadMethods.EnumToBool(row["banned"].ToString());

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

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

                        break;
                    }
                    else
                    {
                        pClient.Username        = username;
                        pClient.IsAuthenticated = true;
                        pClient.Admin           = 0; /*(byte)row["Admin"];*/
                        pClient.AccountID       = int.Parse(row["id"].ToString());
                        WorldList(pClient, false);
                    }
                }
                else
                {
                    SendFailedLogin(pClient, ServerError.InvalidCredentials);
                }
            }
        }
Exemplo n.º 8
0
        public static void Login(LoginClient pClient, Packet pPacket)
        {
            // Initialize DB
            DatabaseClient dbClient = Program.DatabaseManager.GetClient();

            // XX XX XX XX XX XX XX XX XX XX XX - login length
            // 00 00 00 00 00 00 00 - space
            // XX XX XX XX XX XX XX - password
            // 00 00 00 00 00 00 00 00 00 4F 72 69 67 69 6E 61 6C 00 00 00 00 00 00 00 00 00 00 00

            // Define packet lengths, as these may change with client updates
            int packetLength = 54;

            int loginBlock = 11;
            int spaceLength = 7;
            int passwordBlock = 7;

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

            // TODO - Escape these before query processing

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

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

            // Read from 18 --> onwards
            for (int i = loginBlock + spaceLength; i <= loginBlock + spaceLength + passwordBlock; i++)
            clientPassword += md5Char[i].ToString().Replace("\0", "");

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

            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);
                }
            }
            }
        }
Exemplo n.º 9
0
 public static void VersionInfo(LoginClient pClient, Packet pPacket)
 {
     ushort year;
     ushort version;
     if (!pPacket.TryReadUShort(out year) ||
         !pPacket.TryReadUShort(out version)) {
     Log.WriteLine(LogLevel.Warn, "Invalid client version.");
     pClient.Disconnect();
     return;
     }
     Log.WriteLine(LogLevel.Debug, "Client version authenticated - Year: {0} Version: {1}.", year, version);
     using (Packet response = new Packet(SH3Type.VersionAllowed)) {
     response.WriteShort(1);
     pClient.SendPacket(response);
     }
 }
Exemplo n.º 10
0
 public void DisConnect()
 {
     _client.Disconnect();
 }