diff --git a/include/znc/IRCSock.h b/include/znc/IRCSock.h index 873b171a..265c5612 100644 --- a/include/znc/IRCSock.h +++ b/include/znc/IRCSock.h @@ -100,6 +100,9 @@ public: // This handles NAMESX and UHNAMES in a raw 353 reply void ForwardRaw353(const CString& sLine) const; void ForwardRaw353(const CString& sLine, CClient* pClient) const; + + // TODO move this function to CIRCNetwork and make it non-static? + static bool IsFloodProtected(double fRate); private: void SetNick(const CString& sNick); void ParseISupport(const CString& sLine); diff --git a/modules/data/webadmin/tmpl/add_edit_network.tmpl b/modules/data/webadmin/tmpl/add_edit_network.tmpl index 22c98196..88d054b6 100644 --- a/modules/data/webadmin/tmpl/add_edit_network.tmpl +++ b/modules/data/webadmin/tmpl/add_edit_network.tmpl @@ -58,14 +58,39 @@
One server per line, host [[+]port] [password] + +
+
Flood protection:
+
+ checked="checked" /> + +
+
Flood protection rate:
-
Set to -1 to disable flood protection
+
value="" value="1.00" disabled="disabled" /> seconds per line
Flood protection burst:
-
+
value="" value="4" disabled="disabled" /> lines can be send immediately
diff --git a/modules/webadmin.cpp b/modules/webadmin.cpp index fb2fce2b..8ea25449 100644 --- a/modules/webadmin.cpp +++ b/modules/webadmin.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -677,6 +678,7 @@ public: Tmpl["Ident"] = pNetwork->GetIdent(); Tmpl["RealName"] = pNetwork->GetRealName(); + Tmpl["FloodProtection"] = CString(CIRCSock::IsFloodProtected(pNetwork->GetFloodRate())); Tmpl["FloodRate"] = CString(pNetwork->GetFloodRate()); Tmpl["FloodBurst"] = CString(pNetwork->GetFloodBurst()); @@ -717,6 +719,7 @@ public: Tmpl["Action"] = "addnetwork"; Tmpl["Title"] = "Add Network for User [" + pUser->GetUserName() + "]"; Tmpl["IRCConnectEnabled"] = "true"; + Tmpl["FloodProtection"] = "true"; Tmpl["FloodRate"] = "1.0"; Tmpl["FloodBurst"] = "4"; } @@ -747,8 +750,12 @@ public: pNetwork->SetIRCConnectEnabled(WebSock.GetParam("doconnect").ToBool()); - pNetwork->SetFloodRate(WebSock.GetParam("floodrate").ToDouble()); - pNetwork->SetFloodBurst(WebSock.GetParam("floodburst").ToUInt()); + if (WebSock.GetParam("floodprotection").ToBool()) { + pNetwork->SetFloodRate(WebSock.GetParam("floodrate").ToDouble()); + pNetwork->SetFloodBurst(WebSock.GetParam("floodburst").ToUInt()); + } else { + pNetwork->SetFloodRate(-1); + } VCString vsArgs; diff --git a/src/IRCSock.cpp b/src/IRCSock.cpp index b9624676..7d6b2f41 100644 --- a/src/IRCSock.cpp +++ b/src/IRCSock.cpp @@ -21,6 +21,7 @@ const unsigned int CIRCSock::m_uCTCPFloodCount = 5; // It will be bad if user sets it to 0.00000000000001 // If you want no flood protection, set network's flood rate to -1 +// TODO move this constant to CIRCNetwork? static const double FLOOD_MINIMAL_RATE = 0.3; class CIRCFloodTimer : public CCron { @@ -38,6 +39,9 @@ class CIRCFloodTimer : public CCron { } }; +bool CIRCSock::IsFloodProtected(double fRate) { + return fRate > FLOOD_MINIMAL_RATE; +} CIRCSock::CIRCSock(CIRCNetwork* pNetwork) : CZNCSock() { m_pNetwork = pNetwork; @@ -46,7 +50,7 @@ CIRCSock::CIRCSock(CIRCNetwork* pNetwork) : CZNCSock() { m_bUHNames = false; m_fFloodRate = m_pNetwork->GetFloodRate(); m_uFloodBurst = m_pNetwork->GetFloodBurst(); - m_bFloodProtection = m_fFloodRate > FLOOD_MINIMAL_RATE; + m_bFloodProtection = IsFloodProtected(m_fFloodRate); m_iSendsAllowed = m_uFloodBurst; EnableReadLine(); m_Nick.SetIdent(m_pNetwork->GetIdent());