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); }
/* * 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); }
/* * 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; }
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(); } } }