public void Dispose() { Global.ExtensionsManager.OnBeforeNewConnection -= ExtensionsManager_OnBeforeNewConnection; Global.ExtensionsManager.OnConnectionValidated -= ExtensionsManager_OnConnectionValidated; Global.ExtensionsManager.OnHandleMessageFailed -= ExtensionsManager_OnHandleMessageFailed; BannedClientsManager.UpdateClients(); BannedClientsManager.Dispose(); }
public void Init(Dictionary <string, string> settings) { ConnectionString = GetExtensionConfigValue <string>(settings, connectionStringPropName); SingleBanPeriod = GetExtensionConfigValue <int>(settings, singleBanPeriodPropName); BoostFactor = GetExtensionConfigValue <int>(settings, boostFactor); BannedClientsManager = new BannedClientsManager(ConnectionString, SingleBanPeriod, BoostFactor); BanCandidatesManager = new BanCandidatesManager(violationsCountThreshold, violationsPeriodThreshold); Global.ExtensionsManager.OnBeforeNewConnection += ExtensionsManager_OnBeforeNewConnection; Global.ExtensionsManager.OnConnectionValidated += ExtensionsManager_OnConnectionValidated; Global.ExtensionsManager.OnHandleMessageFailed += ExtensionsManager_OnHandleMessageFailed; }
private void ExtensionsManager_OnBeforeNewConnection(WebSocket socket, string ip) { DateTime currentDate = DateTime.UtcNow; if (BanCandidatesManager.RegisterViolation(ip)) { BannedClientsManager.RegisterBan(ip, currentDate); throw new ConnectionCloseException(WebSocketCloseStatus.PolicyViolation, "Too many connections."); } else if (BannedClientsManager.IsClientBanned(ip, currentDate)) { throw new ConnectionCloseException(WebSocketCloseStatus.PolicyViolation, "This client is banned."); } }
private void ExtensionsManager_OnConnectionValidated(BaseWebSocketConnection connection) { var currentDate = DateTime.UtcNow; if (BanCandidatesManager.RegisterViolation(connection.ClientPubKey?.ToString())) { BannedClientsManager.RegisterBan(connection.Ip, currentDate); BannedClientsManager.RegisterBan(connection.ClientPubKey?.ToString(), currentDate); throw new ConnectionCloseException(WebSocketCloseStatus.PolicyViolation, "Too many connections."); } else if (BannedClientsManager.IsClientBanned(connection.Ip, currentDate) || BannedClientsManager.IsClientBanned(connection.ClientPubKey?.ToString(), currentDate)) { throw new ConnectionCloseException(WebSocketCloseStatus.PolicyViolation, "This client is banned."); } }
private void ExtensionsManager_OnHandleMessageFailed(BaseWebSocketConnection connection, MessageEnvelope envelope, Exception exception) { var currentDate = DateTime.UtcNow; if (exception is BaseClientException && //bad requests, forbidden, too many requests etc. BanCandidatesManager.RegisterViolation(connection.Ip, connection.ClientPubKey?.ToString())) //riched max allowed violation count { BannedClientsManager.RegisterBan(connection.Ip, currentDate); BannedClientsManager.RegisterBan(connection.ClientPubKey?.ToString(), currentDate); throw new ConnectionCloseException(WebSocketCloseStatus.PolicyViolation, "Too many invalid messages."); } else if (BannedClientsManager.IsClientBanned(connection.Ip, currentDate) || BannedClientsManager.IsClientBanned(connection.ClientPubKey?.ToString(), currentDate)) { throw new ConnectionCloseException(WebSocketCloseStatus.PolicyViolation, "This client is banned."); } }