From 3cdaca51a615f469b11e8f0c0bf5675daaa75a21 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Mon, 13 Jul 2015 12:15:00 +0200 Subject: [PATCH] fail2ban: make timeout & attempts configurable (#534) --- modules/fail2ban.cpp | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/modules/fail2ban.cpp b/modules/fail2ban.cpp index 2cffee80..37ae1e63 100644 --- a/modules/fail2ban.cpp +++ b/modules/fail2ban.cpp @@ -18,7 +18,11 @@ class CFailToBanMod : public CModule { public: - MODCONSTRUCTOR(CFailToBanMod) {} + MODCONSTRUCTOR(CFailToBanMod) { + AddHelpCommand(); + AddCommand("Timeout", static_cast(&CFailToBanMod::OnTimeoutCommand), "()", "The number of minutes IPs are blocked after a failed login."); + AddCommand("Attempts", static_cast(&CFailToBanMod::OnAttemptsCommand), "()", "The number of allowed failed login attempts."); + } virtual ~CFailToBanMod() {} bool OnLoad(const CString& sArgs, CString& sMessage) override { @@ -54,10 +58,36 @@ public: m_Cache.AddItem(sHost, count, m_Cache.GetTTL()); } - void OnModCommand(const CString& sCommand) override { - PutModule("This module can only be configured through its arguments."); - PutModule("The module argument is the number of minutes an IP"); - PutModule("is blocked after a failed login."); + void OnTimeoutCommand(const CString& sCommand) { + CString sArg = sCommand.Token(1); + + if (!sArg.empty()) { + unsigned int uTimeout = sArg.ToUInt(); + if (uTimeout == 0) { + PutModule("Usage: Timeout ()"); + } else { + m_Cache.SetTTL(uTimeout * 60 * 1000); + PutModule("Timeout: " + CString(uTimeout) + " min"); + } + } else { + PutModule("Timeout: " + CString(m_Cache.GetTTL() / 60 / 1000) + " min"); + } + } + + void OnAttemptsCommand(const CString& sCommand) { + CString sArg = sCommand.Token(1); + + if (!sArg.empty()) { + unsigned int uiAttempts = sArg.ToUInt(); + if (uiAttempts == 0) { + PutModule("Usage: Attempts ()"); + } else { + m_uiAllowedFailed = uiAttempts; + PutModule("Attempts: " + CString(uiAttempts)); + } + } else { + PutModule("Attempts: " + CString(m_uiAllowedFailed)); + } } void OnClientConnect(CZNCSock* pClient, const CString& sHost, unsigned short uPort) override {