예제 #1
0
        private Task OnConnecting(NetConnectingArgs args)
        {
            if (PlayerCount >= _baseServer.MaxPlayers)
            {
                args.Deny("The server is full.");
            }

            return(Task.CompletedTask);
        }
        /*
         * private async Task<NetApproval> HandleApproval(NetApprovalEventArgs eventArgs)
         * {
         *  var ban = await _db.GetServerBanByIpAsync(eventArgs.Connection.RemoteEndPoint.Address);
         *  if (ban != null)
         *  {
         *      var expires = "This is a permanent ban.";
         *      if (ban.ExpirationTime is { } expireTime)
         *      {
         *          var duration = expireTime - ban.BanTime;
         *          var utc = expireTime.ToUniversalTime();
         *          expires = $"This ban is for {duration.TotalMinutes} minutes and will expire at {utc:f} UTC.";
         *      }
         *      var reason = $@"You, or another user of this computer or connection is banned from playing here.
         * The ban reason is: ""{ban.Reason}""
         * {expires}";
         *      return NetApproval.Deny(reason);
         *  }
         *
         *  return NetApproval.Allow();
         * }
         */

        private async Task NetMgrOnConnecting(NetConnectingArgs e)
        {
            var deny = await ShouldDeny(e);

            var addr   = e.IP.Address;
            var userId = e.UserId;

            if (deny != null)
            {
                var(reason, msg, banHits) = deny.Value;

                var id = await _db.AddConnectionLogAsync(userId, e.UserName, addr, e.UserData.HWId, reason);

                if (banHits is { Count : > 0 })
            private async Task <NetConnectingArgs> OnConnecting(
                IPEndPoint ip,
                NetUserId userId,
                string userName,
                LoginType loginType)
            {
                var args = new NetConnectingArgs(userId, ip, userName, loginType);

                foreach (var conn in _connectingEvent)
                {
                    await conn(args);
                }
                return(args);
            }
        /*
         * private async Task<NetApproval> HandleApproval(NetApprovalEventArgs eventArgs)
         * {
         *  var ban = await _db.GetServerBanByIpAsync(eventArgs.Connection.RemoteEndPoint.Address);
         *  if (ban != null)
         *  {
         *      var expires = "This is a permanent ban.";
         *      if (ban.ExpirationTime is { } expireTime)
         *      {
         *          var duration = expireTime - ban.BanTime;
         *          var utc = expireTime.ToUniversalTime();
         *          expires = $"This ban is for {duration.TotalMinutes} minutes and will expire at {utc:f} UTC.";
         *      }
         *      var reason = $@"You, or another user of this computer or connection is banned from playing here.
         * The ban reason is: ""{ban.Reason}""
         * {expires}";
         *      return NetApproval.Deny(reason);
         *  }
         *
         *  return NetApproval.Allow();
         * }
         */

        private async Task NetMgrOnConnecting(NetConnectingArgs e)
        {
            // Check if banned.
            var addr   = e.IP.Address;
            var userId = e.UserId;
            ImmutableArray <byte>?hwId = e.UserData.HWId;

            if (hwId.Value.Length == 0 || !_cfg.GetCVar(CCVars.BanHardwareIds))
            {
                // HWId not available for user's platform, don't look it up.
                // Or hardware ID checks disabled.
                hwId = null;
            }

            var adminData = await _dbManager.GetAdminDataForAsync(e.UserId);

            var wasInGame = EntitySystem.TryGet <GameTicker>(out var ticker) && ticker.PlayersInGame.Contains(userId);

            if ((_plyMgr.PlayerCount >= _cfg.GetCVar(CCVars.SoftMaxPlayers) && adminData is null) && !wasInGame)
            {
                e.Deny(Loc.GetString("soft-player-cap-full"));
                return;
            }

            var ban = await _db.GetServerBanAsync(addr, userId, hwId);

            if (ban != null)
            {
                e.Deny(ban.DisconnectMessage);
                return;
            }

            if (_cfg.GetCVar(CCVars.WhitelistEnabled) &&
                await _db.GetWhitelistStatusAsync(userId) == false &&
                adminData is null)
            {
                e.Deny(Loc.GetString("whitelist-not-whitelisted"));
                return;
            }

            if (!ServerPreferencesManager.ShouldStorePrefs(e.AuthType))
            {
                return;
            }

            await _db.UpdatePlayerRecordAsync(userId, e.UserName, addr, e.UserData.HWId);

            await _db.AddConnectionLogAsync(userId, e.UserName, addr, e.UserData.HWId);
        }
예제 #5
0
        /*
         * private async Task<NetApproval> HandleApproval(NetApprovalEventArgs eventArgs)
         * {
         *  var ban = await _db.GetServerBanByIpAsync(eventArgs.Connection.RemoteEndPoint.Address);
         *  if (ban != null)
         *  {
         *      var expires = "This is a permanent ban.";
         *      if (ban.ExpirationTime is { } expireTime)
         *      {
         *          var duration = expireTime - ban.BanTime;
         *          var utc = expireTime.ToUniversalTime();
         *          expires = $"This ban is for {duration.TotalMinutes} minutes and will expire at {utc:f} UTC.";
         *      }
         *      var reason = $@"You, or another user of this computer or connection is banned from playing here.
         * The ban reason is: ""{ban.Reason}""
         * {expires}";
         *      return NetApproval.Deny(reason);
         *  }
         *
         *  return NetApproval.Allow();
         * }
         */

        private async Task NetMgrOnConnecting(NetConnectingArgs e)
        {
            // Check if banned.
            var addr   = e.IP.Address;
            var userId = e.UserId;
            ImmutableArray <byte>?hwId = e.UserData.HWId;

            if (hwId.Value.Length == 0 || !_cfg.GetCVar(CCVars.BanHardwareIds))
            {
                // HWId not available for user's platform, don't look it up.
                // Or hardware ID checks disabled.
                hwId = null;
            }

            var ban = await _db.GetServerBanAsync(addr, userId, hwId);

            if (ban != null)
            {
                var expires = "This is a permanent ban.";
                if (ban.ExpirationTime is { } expireTime)
                {
                    var duration = expireTime - ban.BanTime;
                    var utc      = expireTime.ToUniversalTime();
                    expires = $"This ban is for {duration.TotalMinutes:N0} minutes and will expire at {utc:f} UTC.";
                }
                var reason = $@"You, or another user of this computer or connection, are banned from playing here.
The ban reason is: ""{ban.Reason}""
{expires}";
                e.Deny(reason);
                return;
            }

            if (!ServerPreferencesManager.ShouldStorePrefs(e.AuthType))
            {
                return;
            }

            await _db.UpdatePlayerRecordAsync(userId, e.UserName, addr, e.UserData.HWId);

            await _db.AddConnectionLogAsync(userId, e.UserName, addr, e.UserData.HWId);
        }
예제 #6
0
        /*
         * private async Task<NetApproval> HandleApproval(NetApprovalEventArgs eventArgs)
         * {
         *  var ban = await _db.GetServerBanByIpAsync(eventArgs.Connection.RemoteEndPoint.Address);
         *  if (ban != null)
         *  {
         *      var expires = "This is a permanent ban.";
         *      if (ban.ExpirationTime is { } expireTime)
         *      {
         *          var duration = expireTime - ban.BanTime;
         *          var utc = expireTime.ToUniversalTime();
         *          expires = $"This ban is for {duration.TotalMinutes} minutes and will expire at {utc:f} UTC.";
         *      }
         *      var reason = $@"You, or another user of this computer or connection is banned from playing here.
         * The ban reason is: ""{ban.Reason}""
         * {expires}";
         *      return NetApproval.Deny(reason);
         *  }
         *
         *  return NetApproval.Allow();
         * }
         */

        private async Task NetMgrOnConnecting(NetConnectingArgs e)
        {
            // Check if banned.
            var addr   = e.IP.Address;
            var userId = e.UserId;
            ImmutableArray <byte>?hwId = e.UserData.HWId;

            if (hwId.Value.Length == 0 || !_cfg.GetCVar(CCVars.BanHardwareIds))
            {
                // HWId not available for user's platform, don't look it up.
                // Or hardware ID checks disabled.
                hwId = null;
            }

            if (_plyMgr.PlayerCount >= _cfg.GetCVar(CCVars.SoftMaxPlayers) && await _dbManager.GetAdminDataForAsync(e.UserId) is null)
            {
                e.Deny("The server is full!");
                return;
            }

            var ban = await _db.GetServerBanAsync(addr, userId, hwId);

            if (ban != null)
            {
                e.Deny(ban.DisconnectMessage);
                return;
            }

            if (!ServerPreferencesManager.ShouldStorePrefs(e.AuthType))
            {
                return;
            }

            await _db.UpdatePlayerRecordAsync(userId, e.UserName, addr, e.UserData.HWId);

            await _db.AddConnectionLogAsync(userId, e.UserName, addr, e.UserData.HWId);
        }
 private async Task NetMgrOnConnecting(NetConnectingArgs e)
 {
     return;
 }
예제 #8
0
            public void ProcessPackets()
            {
                while (_messageChannel.Reader.TryRead(out var item))
                {
                    switch (item)
                    {
                    case ConnectMessage connect:
                    {
                        DebugTools.Assert(IsServer);

                        var writer = connect.ChannelWriter;

                        var uid       = _genConnectionUid();
                        var sessionId = new NetSessionId($"integration_{uid}");

                        var connectArgs =
                            new NetConnectingArgs(sessionId, new IPEndPoint(IPAddress.IPv6Loopback, 0));
                        Connecting?.Invoke(this, connectArgs);
                        if (connectArgs.Deny)
                        {
                            writer.TryWrite(new DeniedConnectMessage());
                            continue;
                        }

                        writer.TryWrite(new ConfirmConnectMessage(uid, sessionId));
                        var channel = new IntegrationNetChannel(this, connect.ChannelWriter, uid, sessionId, connect.Uid);
                        _channels.Add(uid, channel);
                        Connected?.Invoke(this, new NetChannelArgs(channel));
                        break;
                    }

                    case DataMessage data:
                    {
                        IntegrationNetChannel?channel;
                        if (IsServer)
                        {
                            if (!_channels.TryGetValue(data.Connection, out channel))
                            {
                                continue;
                            }
                        }
                        else
                        {
                            if (ServerChannel == null || data.Connection != ServerChannel.ConnectionUid)
                            {
                                continue;
                            }

                            channel = ServerChannel;
                        }

                        var message = data.Message;
                        message.MsgChannel = channel;
                        if (_callbacks.TryGetValue(message.GetType(), out var callback))
                        {
                            callback(message);
                        }

                        break;
                    }

                    case DisconnectMessage disconnect:
                    {
                        if (IsServer)
                        {
                            if (_channels.TryGetValue(disconnect.Connection, out var channel))
                            {
                                Disconnect?.Invoke(this, new NetDisconnectedArgs(channel, string.Empty));

                                _channels.Remove(disconnect.Connection);
                            }
                        }
                        else
                        {
                            _channels.Clear();
                        }

                        break;
                    }

                    case DeniedConnectMessage _:
                    {
                        DebugTools.Assert(IsClient);

                        ConnectFailed?.Invoke(this, new NetConnectFailArgs("I didn't implement a deny reason!"));
                        break;
                    }

                    case ConfirmConnectMessage confirm:
                    {
                        DebugTools.Assert(IsClient);

                        var channel = new IntegrationNetChannel(this, NextConnectChannel !, _clientConnectingUid,
                                                                confirm.SessionId, confirm.AssignedUid);

                        _channels.Add(channel.ConnectionUid, channel);

                        Connected?.Invoke(this, new NetChannelArgs(channel));
                        break;
                    }

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
            }