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" ENDIF ?> />
+
+
+
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());