summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/channels.cpp5
-rw-r--r--src/modules/m_cloaking.cpp55
2 files changed, 57 insertions, 3 deletions
diff --git a/src/channels.cpp b/src/channels.cpp
index 5f0f545ae..838013c4c 100644
--- a/src/channels.cpp
+++ b/src/channels.cpp
@@ -433,7 +433,10 @@ bool Channel::IsBanned(User* user)
char mask[MAXBUF];
int MOD_RESULT = 0;
FOREACH_RESULT(I_OnCheckBan,OnCheckBan(user, this));
- if (!MOD_RESULT)
+
+ if (MOD_RESULT == -1)
+ return true;
+ else if (MOD_RESULT == 0)
{
snprintf(mask, MAXBUF, "%s!%s@%s", user->nick, user->ident, user->GetIPString());
for (BanList::iterator i = this->bans.begin(); i != this->bans.end(); i++)
diff --git a/src/modules/m_cloaking.cpp b/src/modules/m_cloaking.cpp
index 8a3a4e482..a0853b78b 100644
--- a/src/modules/m_cloaking.cpp
+++ b/src/modules/m_cloaking.cpp
@@ -12,6 +12,7 @@
*/
#include "inspircd.h"
+#include "wildcard.h"
#include "m_hash.h"
/* $ModDesc: Provides masking of user hostnames */
@@ -77,7 +78,10 @@ class CloakUser : public ModeHandler
* This is fine, as we will recieve it later.
*/
if (!IS_LOCAL(dest))
+ {
+ dest->SetMode('x',adding);
return MODEACTION_ALLOW;
+ }
/* don't allow this user to spam modechanges */
dest->IncreasePenalty(5);
@@ -95,6 +99,16 @@ class CloakUser : public ModeHandler
* are connecting via localhost) -- this doesnt matter much.
*/
+ std::string* cloak;
+
+ if (dest->GetExt("cloaked_host", cloak))
+ {
+ /* Cloaked host has been set before on this user, don't bother to recalculate and waste cpu */
+ dest->ChangeDisplayedHost(cloak->c_str());
+ dest->SetMode('x',true);
+ return MODEACTION_ALLOW;
+ }
+
char* n1 = strchr(dest->host,'.');
char* n2 = strchr(dest->host,':');
@@ -161,6 +175,7 @@ class CloakUser : public ModeHandler
}
dest->ChangeDisplayedHost(b.c_str());
+ dest->Extend("cloaked_host", new std::string(b));
}
dest->SetMode('x',true);
@@ -346,8 +361,44 @@ class ModuleCloaking : public Module
ServerInstance->Modules->UseInterface("HashRequest");
- Implementation eventlist[] = { I_OnRehash };
- ServerInstance->Modules->Attach(eventlist, this, 1);
+ Implementation eventlist[] = { I_OnRehash, I_OnUserDisconnect, I_OnCleanup, I_OnCheckBan };
+ ServerInstance->Modules->Attach(eventlist, this, 4);
+ }
+
+ virtual int OnCheckBan(User* user, Channel* chan)
+ {
+ char mask[MAXBUF];
+ std::string* tofree;
+ /* Check if they have a cloaked host, but are not using it */
+ if (user->GetExt("cloaked_host", tofree) && *tofree != user->dhost)
+ {
+ snprintf(mask, MAXBUF, "%s!%s@%s", user->nick, user->ident, tofree->c_str());
+ for (BanList::iterator i = chan->bans.begin(); i != chan->bans.end(); i++)
+ {
+ if (match(mask,i->data))
+ return -1;
+ }
+ }
+ return 0;
+ }
+
+ void Prioritize()
+ {
+ /* Needs to be after m_banexception etc. */
+ ServerInstance->Modules->SetPriority(this, I_OnCheckBan, PRIO_LAST);
+ }
+
+ virtual void OnUserDisconnect(User* user)
+ {
+ std::string* tofree;
+ if (user->GetExt("cloaked_host", tofree))
+ delete tofree;
+ }
+
+ virtual void OnCleanup(int target_type, void* item)
+ {
+ if (target_type == TYPE_USER)
+ OnUserDisconnect((User*)item);
}
virtual ~ModuleCloaking()