Exemplo n.º 1
0
        private static void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                var state     = (StateObject)ar.AsyncState;
                var client    = state.WorkSocket;
                var bytesRead = client.EndReceive(ar);

                if (bytesRead > 0)
                {
                    var       msg    = new CCMessage(state.Buffer, bytesRead);
                    short     magic  = 0;
                    ByteArray packet = new CCMessage();
                    if (msg.Read(ref magic) &&
                        magic == Magic &&
                        msg.Read(ref packet))
                    {
                        CCMessage.MessageType coreId = 0;
                        var message = new CCMessage(packet);
                        message.Read(ref coreId);
                        switch (coreId)
                        {
                        case CCMessage.MessageType.Notify:
                        {
                            var info = "";
                            message.Read(ref info);
                            if (info.Contains("<region>") && info.Contains("</region>"))
                            {
                                info = info.Replace("<region>", "");
                                info = info.Replace("</region>", "");
                                if (info == "S4Violet362")
                                {
                                    var sendmsg = new CCMessage();
                                    sendmsg.Write(Constants.LoginWindow.GetUsername());
                                    sendmsg.Write(Constants.LoginWindow.GetPassword());
                                    sendmsg.Write(FingerPrint.Value());
                                    sendmsg.Write("test");

                                    RmiSend(client, 15, sendmsg);
                                    Constants.LoginWindow.UpdateLabel("Connecting...");
                                }
                                else
                                {
                                    Constants.LoginWindow.UpdateLabel("Error");
                                }
                            }

                            break;
                        }

                        case CCMessage.MessageType.Rmi:
                        {
                            short rmiId = 0;
                            if (!message.Read(ref rmiId))
                            {
                                Constants.LoginWindow.UpdateLabel("Received corrupted Rmi message.");
                            }
                            else
                            {
                                switch (rmiId)
                                {
                                case 16:
                                {
                                    var success = false;
                                    if (message.Read(ref success) && success)
                                    {
                                        ReceiveDone.Set();
                                        var code = "";
                                        message.Read(ref code);
                                        Constants.LoginWindow.UpdateLabel(
                                            $"");
                                        Constants.LoginWindow.Ready(code);
                                        _connected = true;
                                        var sendmsg = new CCMessage();
                                        RmiSend(client, 17, sendmsg);
                                        client.Disconnect(false);
                                        client.Close();

                                        Process.Start("S4client.exe", string.Format("-rc:eu -lac:eng -auth_server_ip:{0} -aeria_acc_code:{1}", Constants.ConnectEndPoint.Address, Constants.LoginWindow.AuthCode));
                                        Environment.Exit(0);
                                    }
                                    else
                                    {
                                        ReceiveDone.Set();
                                        var errcode = "";
                                        message.Read(ref errcode);
                                        Constants.LoginWindow.UpdateLabel($"Failed: {errcode}");
                                        Constants.LoginWindow.Reset();
                                        _connected = true;
                                        client.Disconnect(false);
                                        client.Close();
                                    }
                                }
                                break;

                                default:
                                    Constants.LoginWindow.UpdateLabel($"Received unknown rmiId. {rmiId}");
                                    break;
                                }
                            }
                            break;
                        }

                        case CCMessage.MessageType.Encrypted:
                        {
                            break;
                        }
                        }

                        if (!_connected)
                        {
                            client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0,
                                                ReceiveCallback, state);
                        }
                    }
                    else
                    {
                        ReceiveDone.Set();
                        client.Disconnect(true);
                    }
                }
            }
            catch (Exception e)
            {
                // ignored
#if DEBUG
                Constants.LoginWindow.UpdateLabel($"Error -> {e.ToString()}");
#endif
            }
        }
Exemplo n.º 2
0
        private static void ReceiveCallback(IAsyncResult ar)
        {
            try
            {
                var state     = (StateObject)ar.AsyncState;
                var client    = state.WorkSocket;
                var bytesRead = client.EndReceive(ar);

                if (bytesRead > 0)
                {
                    var       msg    = new CCMessage(state.Buffer, bytesRead);
                    short     magic  = 0;
                    ByteArray packet = new CCMessage();
                    if (msg.Read(ref magic) &&
                        magic == Magic &&
                        msg.Read(ref packet))
                    {
                        CCMessage.MessageType coreId = 0;
                        var message = new CCMessage(packet);
                        message.Read(ref coreId);
                        switch (coreId)
                        {
                        case CCMessage.MessageType.Notify:
                        {
                            var info = "";
                            message.Read(ref info);
                            if (info.Contains("<region>") && info.Contains("</region>"))
                            {
                                info = info.Replace("<region>", "");
                                info = info.Replace("</region>", "");
                                if (info == "EU-S4MAX")
                                {
                                    var sendmsg = new CCMessage();
                                    sendmsg.Write(Constants.LoginWindow.GetUsername());
                                    sendmsg.Write(Constants.LoginWindow.GetPassword());
                                    sendmsg.Write(false);

                                    RmiSend(client, 15, sendmsg);
                                    Constants.LoginWindow.UpdateLabel("Authenticating..");
                                }
                                else
                                {
                                    Constants.LoginWindow.UpdateLabel("Error");
                                    Constants.LoginWindow.UpdateErrorLabel("Wrong region/server");
                                }
                            }

                            break;
                        }

                        case CCMessage.MessageType.Rmi:
                        {
                            short rmiId = 0;
                            if (!message.Read(ref rmiId))
                            {
                                Constants.LoginWindow.UpdateLabel("Received corrupted Rmi message.");
                            }
                            else
                            {
                                switch (rmiId)
                                {
                                case 16:
                                {
                                    var success = false;
                                    if (message.Read(ref success) && success)
                                    {
                                        ReceiveDone.Set();
                                        var code = "";
                                        message.Read(ref code);
                                        Constants.LoginWindow.UpdateLabel(
                                            $"Authentication succeeded. code={code}");
                                        Constants.LoginWindow.Ready(code);
                                        _connected = true;
                                        var sendmsg = new CCMessage();
                                        RmiSend(client, 17, sendmsg);
                                        client.Disconnect(false);
                                        client.Close();
                                    }
                                    else
                                    {
                                        ReceiveDone.Set();
                                        var errcode = "";
                                        message.Read(ref errcode);
                                        Constants.LoginWindow.Reset();
                                        Constants.LoginWindow.UpdateErrorLabel($"Failed: {errcode}");
                                        _connected = true;
                                        client.Disconnect(false);
                                        client.Close();
                                    }
                                }
                                break;

                                default:
                                    Constants.LoginWindow.UpdateLabel($"Received unknown rmiId. {rmiId}");
                                    break;
                                }
                            }
                            break;
                        }

                        case CCMessage.MessageType.Encrypted:
                        {
                            break;
                        }
                        }

                        if (!_connected)
                        {
                            client.BeginReceive(state.Buffer, 0, StateObject.BufferSize, 0,
                                                ReceiveCallback, state);
                        }
                    }
                    else
                    {
                        ReceiveDone.Set();
                        client.Disconnect(true);
                    }
                }
            }
            catch (Exception e)
            {
                // ignored
#if DEBUG
                Constants.LoginWindow.UpdateLabel($"Error -> {e.ToString()}");
#endif
            }
        }
        public override void ChannelRead(IChannelHandlerContext context, object messageData)
        {
            var buffer = messageData as IByteBuffer;
            var data   = new byte[0];

            if (buffer != null)
            {
                data = buffer.ToArray();
            }

            var   msg     = new CCMessage(data, data.Length);
            short magic   = 0;
            var   message = new ByteArray();

            if (msg.Read(ref magic) &&
                magic == Magic &&
                msg.Read(ref message))
            {
                var receivedMessage          = new CCMessage(message);
                CCMessage.MessageType coreId = 0;
                if (!receivedMessage.Read(ref coreId))
                {
                    return;
                }

                switch (coreId)
                {
                case CCMessage.MessageType.Rmi:
                    short rmiId = 0;
                    if (receivedMessage.Read(ref rmiId))
                    {
                        switch (rmiId)
                        {
                        case 15:
                        {
                            var username   = "";
                            var password   = "";
                            var register   = false;
                            var korealogin = false;

                            if (receivedMessage.Read(ref username) &&
                                receivedMessage.Read(ref password) &&
                                receivedMessage.Read(ref register))
                            {
                                //receivedMessage.Read(ref korealogin);

                                using (var db = AuthDatabase.Open())
                                {
                                    Logger.Information("Authentication login from {endpoint}",
                                                       context.Channel.RemoteAddress.ToString());

                                    if (username.Length > 5 && password.Length > 5)
                                    {
                                        var result = db.Find <AccountDto>(statement => statement
                                                                          .Where($"{nameof(AccountDto.Username):C} = @{nameof(username)}")
                                                                          .Include <BanDto>(join => @join.LeftOuterJoin())
                                                                          .WithParameters(new { Username = username }));

                                        var account = result.FirstOrDefault();

                                        if (account == null &&
                                            (Config.Instance.NoobMode || Config.Instance.AutoRegister))
                                        {
                                            account = new AccountDto {
                                                Username = username
                                            };

                                            var newSalt = new byte[24];
                                            using (var csprng = new RNGCryptoServiceProvider())
                                            {
                                                csprng.GetBytes(newSalt);
                                            }

                                            var hash = new Rfc2898DeriveBytes(password, newSalt, 24000).GetBytes(24);

                                            account.Password = Convert.ToBase64String(hash);
                                            account.Salt     = Convert.ToBase64String(newSalt);
                                            db.InsertAsync(account);
                                        }

                                        var salt = Convert.FromBase64String(account?.Salt ?? "");

                                        var passwordGuess  = new Rfc2898DeriveBytes(password, salt, 24000).GetBytes(24);
                                        var actualPassword = Convert.FromBase64String(account?.Password ?? "");

                                        var difference =
                                            (uint)passwordGuess.Length ^ (uint)actualPassword.Length;

                                        for (var i = 0;
                                             i < passwordGuess.Length && i < actualPassword.Length;
                                             i++)
                                        {
                                            difference |= (uint)(passwordGuess[i] ^ actualPassword[i]);
                                        }

                                        if ((difference != 0 ||
                                             string.IsNullOrWhiteSpace(account?.Password ?? "")) &&
                                            !Config.Instance.NoobMode)
                                        {
                                            Logger.Error(
                                                "Wrong authentication credentials for {username} / {endpoint}",
                                                username, context.Channel.RemoteAddress.ToString());
                                            var ack = new CCMessage();
                                            ack.Write(false);
                                            ack.Write("Login failed");
                                            RmiSend(context, 16, ack);
                                        }
                                        else
                                        {
                                            if (account != null)
                                            {
                                                account.LoginToken = AuthHash
                                                                     .GetHash256(
                                                    $"{context.Channel.RemoteAddress}-{account.Username}-{account.Password}")
                                                                     .ToLower();
                                                account.LastLogin = $"{DateTimeOffset.Now}";
                                                account.AuthToken = "";
                                                account.newToken  = "";
                                                db.UpdateAsync(account);

                                                var ack = new CCMessage();
                                                ack.Write(true);
                                                ack.Write(account.LoginToken);
                                                //ack.Write(korealogin);
                                                RmiSend(context, 16, ack);
                                            }
                                            Logger.Information("Authentication success for {username}",
                                                               username);
                                        }
                                    }
                                    else
                                    {
                                        Logger.Error(
                                            "Wrong authentication credentials for {username} / {endpoint}",
                                            username, context.Channel.RemoteAddress.ToString());
                                        var ack = new CCMessage();
                                        ack.Write(false);
                                        ack.Write("Invalid length of username/password");
                                        RmiSend(context, 16, ack);
                                    }
                                }
                            }
                            else
                            {
                                Logger.Error("Wrong login for {endpoint}",
                                             context.Channel.RemoteAddress.ToString());
                                var ack = new CCMessage();
                                ack.Write(false);
                                ack.Write("Invalid loginpacket");
                                RmiSend(context, 16, ack);
                            }
                            break;
                        }

                        case 17:
                            context.CloseAsync();
                            break;

                        default:
                            Logger.Error("Received unknown rmiId{rmi} from {endpoint}", rmiId,
                                         context.Channel.RemoteAddress.ToString());
                            break;
                        }
                    }
                    break;

                case CCMessage.MessageType.Notify:
                    context.CloseAsync();
                    //var info = "";
                    //receivedMessage.Read(ref info);
                    //Logger.Information("Received info! -> {received}", info);
                    break;

                default:
                    Logger.Error("Received unknown coreID{coreid} from {endpoint}", coreId,
                                 context.Channel.RemoteAddress.ToString());
                    break;
                }
            }
            else
            {
                Logger.Error("Received invalid packetstruct from {endpoint}", context.Channel.RemoteAddress.ToString());
                context.CloseAsync();
            }
        }
        public override void ChannelRead(IChannelHandlerContext context, object messageData)
        {
            var buffer = messageData as IByteBuffer;
            var data   = new byte[0];

            if (buffer != null)
            {
                data = buffer.GetIoBuffer().ToArray();
            }

            var   msg     = new CCMessage(data, data.Length);
            short magic   = 0;
            var   message = new ByteArray();

            if (msg.Read(ref magic) &&
                magic == Magic &&
                msg.Read(ref message))
            {
                var receivedMessage          = new CCMessage(message);
                CCMessage.MessageType coreId = 0;
                if (!receivedMessage.Read(ref coreId))
                {
                    return;
                }

                switch (coreId)
                {
                case CCMessage.MessageType.Rmi:
                    short rmiId = 0;
                    if (receivedMessage.Read(ref rmiId))
                    {
                        switch (rmiId)
                        {
                        case 15:

                            var username  = string.Empty;
                            var password  = string.Empty;
                            var hwid      = string.Empty;
                            var secretkey = string.Empty;

                            if (receivedMessage.Read(ref secretkey) &&
                                receivedMessage.Read(ref hwid) &&
                                receivedMessage.Read(ref username) &&
                                receivedMessage.Read(ref password))
                            {
                                LoginAsync(context, username, password, hwid, secretkey);
                            }
                            else
                            {
                                var error = new CCMessage();
                                error.Write(false);
                                error.Write("Login error");
                                RmiSend(context, 16, error);
                            }

                            break;

                        case 17:
                            context.CloseAsync();
                            break;

                        default:
                            Logger.Error("Received unknown rmiId{rmi} from {endpoint}", rmiId,
                                         context.Channel.RemoteAddress.ToString());
                            break;
                        }
                    }
                    break;

                case CCMessage.MessageType.Notify:
                    context.CloseAsync();
                    break;

                default:
                    Logger.Error("Received unknown coreID{coreid} from {endpoint}", coreId,
                                 context.Channel.RemoteAddress.ToString());
                    break;
                }
            }
            else
            {
                Logger.Error("Received invalid packetstruct from {endpoint}", context.Channel.RemoteAddress.ToString());
                context.CloseAsync();
            }
        }