summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/modules.h10
-rw-r--r--src/channels.cpp43
-rw-r--r--src/modules.cpp1
3 files changed, 26 insertions, 28 deletions
diff --git a/include/modules.h b/include/modules.h
index 168bc6c06..7945a33ad 100644
--- a/include/modules.h
+++ b/include/modules.h
@@ -392,8 +392,8 @@ enum Implementation
I_OnDecodeMetaData, I_ProtoSendMode, I_ProtoSendMetaData, I_OnWallops, I_OnChangeHost, I_OnChangeName, I_OnAddLine,
I_OnDelLine, I_OnExpireLine, I_OnCleanup, I_OnUserPostNick, I_OnAccessCheck, I_On005Numeric, I_OnKill, I_OnRemoteKill, I_OnLoadModule, I_OnUnloadModule,
I_OnBackgroundTimer, I_OnPreCommand, I_OnCheckReady, I_OnCheckInvite, I_OnRawMode,
- I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckExtBan, I_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos, I_OnLocalTopicChange,
- I_OnPostLocalTopicChange, I_OnEvent, I_OnRequest, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, I_OnDelBan,
+ I_OnCheckKey, I_OnCheckLimit, I_OnCheckBan, I_OnCheckExtBan, I_OnCheckStringExtBan, I_OnStats, I_OnChangeLocalUserHost, I_OnChangeLocalUserGecos,
+ I_OnLocalTopicChange, I_OnPostLocalTopicChange, I_OnEvent, I_OnRequest, I_OnGlobalOper, I_OnPostConnect, I_OnAddBan, I_OnDelBan,
I_OnRawSocketAccept, I_OnRawSocketClose, I_OnRawSocketWrite, I_OnRawSocketRead, I_OnChangeLocalUserGECOS, I_OnUserRegister,
I_OnChannelPreDelete, I_OnChannelDelete, I_OnPostOper, I_OnSyncOtherMetaData, I_OnSetAway, I_OnUserList,
I_OnPostCommand, I_OnPostJoin, I_OnWhoisLine, I_OnBuildExemptList, I_OnRawSocketConnect, I_OnGarbageCollect, I_OnBufferFlushed,
@@ -1134,12 +1134,18 @@ class CoreExport Module : public Extensible
virtual int OnCheckBan(User* user, Channel* chan);
/* Called whenever checking whether or not a user is matched by an applicable extended bantype.
+ * NOTE: may also trigger extra OnCheckStringExtBan events!
* @param u The user to check
* @param c The channel the user is on
* @param type The type of extended ban to check for.
*/
virtual int OnCheckExtBan(User *u, Channel *c, char type);
+ /** Called whenever checking whether or not a string is extbanned. NOTE: one OnCheckExtBan will also trigger a number of
+ * OnCheckStringExtBan events for seperate host/IP comnbinations.
+ */
+ virtual int OnCheckStringExtBan(const std::string &s, Channel *c, char type);
+
/** Called on all /STATS commands
* This method is triggered for all /STATS use, including stats symbols handled by the core.
* @param symbol the symbol provided to /STATS
diff --git a/src/channels.cpp b/src/channels.cpp
index 7fd1036d2..e9d7f4a27 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -453,14 +453,13 @@ bool Channel::IsBanned(User* user)
bool Channel::IsExtBanned(const std::string &str, char type)
{
-// XXX XXX XXX need to figure out how to get this to work with string types...
-// int MOD_RESULT = 0;
-// FOREACH_RESULT(I_OnCheckExtBan,OnCheckExtBan(user, this, type));
-
-// if (MOD_RESULT == -1)
-// return true;
-// else if (MOD_RESULT == 0)
-// {
+ int MOD_RESULT = 0;
+ FOREACH_RESULT(I_OnCheckStringExtBan, OnCheckStringExtBan(str, this, type));
+
+ if (MOD_RESULT == -1)
+ return true;
+ else if (MOD_RESULT == 0)
+ {
for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++)
{
if (i->data[0] != type || i->data[1] != ':')
@@ -472,40 +471,32 @@ bool Channel::IsExtBanned(const std::string &str, char type)
if (match(str, maskptr))
return true;
}
-// }
+ }
return false;
}
bool Channel::IsExtBanned(User *user, char type)
{
- char mask[MAXBUF];
int MOD_RESULT = 0;
- FOREACH_RESULT(I_OnCheckExtBan,OnCheckExtBan(user, this, type));
+ FOREACH_RESULT(I_OnCheckExtBan, OnCheckExtBan(user, this, type));
if (MOD_RESULT == -1)
return true;
else if (MOD_RESULT == 0)
{
+ char mask[MAXBUF];
snprintf(mask, MAXBUF, "%s!%s@%s", user->nick.c_str(), user->ident.c_str(), user->GetIPString());
- for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++)
- {
- if (i->data[0] != type || i->data[1] != ':')
- continue;
+ // XXX: we should probably hook cloaked hosts in here somehow too..
+ if (this->IsExtBanned(mask, type))
+ return true;
- // Iterate past char and : to get to the mask without doing a data copy(!)
- std::string maskptr = i->data.substr(2);
+ if (this->IsExtBanned(user->GetFullHost(), type))
+ return true;
- /* This allows CIDR ban matching
- *
- * Full masked host Full unmasked host IP with/without CIDR
- */
- if ((match(user->GetFullHost(), maskptr)) || (match(user->GetFullRealHost(), maskptr)) || (match(mask, maskptr, true)))
- {
- return true;
- }
- }
+ if (this->IsExtBanned(user->GetFullRealHost(), type))
+ return true;
}
return false;
diff --git a/src/modules.cpp b/src/modules.cpp
index d3de60f6a..8d6f3f9a1 100644
--- a/src/modules.cpp
+++ b/src/modules.cpp
@@ -144,6 +144,7 @@ int Module::OnCheckKey(User*, Channel*, const std::string&) { return 0; }
int Module::OnCheckLimit(User*, Channel*) { return 0; }
int Module::OnCheckBan(User*, Channel*) { return 0; }
int Module::OnCheckExtBan(User *, Channel *, char) { return 0; }
+int Module::OnCheckStringExtBan(const std::string &s, Channel *c, char type) { return 0; }
int Module::OnStats(char, User*, string_list&) { return 0; }
int Module::OnChangeLocalUserHost(User*, const std::string&) { return 0; }
int Module::OnChangeLocalUserGECOS(User*, const std::string&) { return 0; }