X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fu_listmode.h;h=358ccbf8312346117ac15935afc95f9b9abe387c;hb=0d3ecb964292600ec1ce6ee1cef83f72185a8bcc;hp=cad52fc12c4c578a6deda9806afe91428a158dcd;hpb=58f4306bb6e1f91076fccf30a3b43a40b3d1915a;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/u_listmode.h b/include/u_listmode.h index cad52fc12..358ccbf83 100644 --- a/include/u_listmode.h +++ b/include/u_listmode.h @@ -6,7 +6,7 @@ * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see - * the file COPYING for details. + * the file COPYING for details. * * --------------------------------------------------- */ @@ -14,8 +14,6 @@ #ifndef INSPIRCD_LISTMODE_PROVIDER #define INSPIRCD_LISTMODE_PROVIDER -#include "wildcard.h" - /** Get the time as a string */ inline std::string stringtime() @@ -57,16 +55,43 @@ class ListModeRequest : public Request { public: User* user; + std::string literal; + const char extban; Channel* chan; /** Check if a user is on a channel's list. - * The Event::Send() event returns true if the user is on the channel's list. + * The Event::Send() event returns the ban string if the user is on the channel's list, + * or NULL if the user is not on the list. * @param sender Sending module * @param target Target module * @param u User to check against * @param c Channel to check against */ - ListModeRequest(Module* sender, Module* target, User* u, Channel* c) : Request(sender, target, "LM_CHECKLIST"), user(u), chan(c) + ListModeRequest(Module* sender, Module* target, User* u, Channel* c) : Request(sender, target, "LM_CHECKLIST"), user(u), literal(""), extban(0), chan(c) + { + } + + /** Check if a literal string is on a channel's list, optionally using an extban char. + * The Event::Send() event returns the ban string if the user is on the channel's list, + * or NULL if the user is not on the list. + * @param sender Sending module + * @param target Target module + * @param literalstr String to check against, e.g. "Bob!Bobbertson@weeblshouse" + * @param extbanchar Extended ban character to use for the match, or a null char if not using extban + */ + ListModeRequest(Module* sender, Module* target, std::string literalstr, char extbanchar, Channel* channel) : Request(sender, target, "LM_CHECKLIST_EX"), user(NULL), literal(literalstr), extban(extbanchar), chan(channel) + { + } + + /** Check if a literal string is on a channel's list, optionally using an extban char. + * The Event::Send() event returns the ban string if the user is on the channel's list, + * or NULL if the user is not on the list. + * @param sender Sending module + * @param target Target module + * @param User to check against, e.g. "Bob!Bobbertson@weeblshouse" + * @param extbanchar Extended ban character to use for the match, or a null char if not using extban + */ + ListModeRequest(Module* sender, Module* target, User* u, char extbanchar, Channel* channel) : Request(sender, target, "LM_CHECKLIST_EX"), user(u), literal(""), extban(extbanchar), chan(channel) { } @@ -153,7 +178,7 @@ class ListModeBase : public ModeHandler { for (modelist::reverse_iterator it = el->rbegin(); it != el->rend(); ++it) { - user->WriteNumeric(listnumeric, "%s %s %s %s %s", user->nick.c_str(), channel->name.c_str(), it->mask.c_str(), it->nick.c_str(), it->time.c_str()); + user->WriteNumeric(listnumeric, "%s %s %s %s %s", user->nick.c_str(), channel->name.c_str(), it->mask.c_str(), (it->nick.length() ? it->nick.c_str() : ServerInstance->Config->ServerName), it->time.c_str()); } } user->WriteNumeric(endoflistnumeric, "%s %s :%s", user->nick.c_str(), channel->name.c_str(), endofliststring.c_str()); @@ -240,8 +265,8 @@ class ListModeBase : public ModeHandler */ virtual void DoImplements(Module* m) { - Implementation eventlist[] = { I_OnChannelDelete, I_OnSyncChannel, I_OnCleanup, I_OnRehash }; - ServerInstance->Modules->Attach(eventlist, m, 4); + Implementation eventlist[] = { I_OnChannelDelete, I_OnSyncChannel, I_OnCleanup, I_OnRehash, I_OnRequest }; + ServerInstance->Modules->Attach(eventlist, m, 5); } /** Handle the list mode. @@ -284,7 +309,7 @@ class ListModeBase : public ModeHandler for (limitlist::iterator it = chanlimits.begin(); it != chanlimits.end(); it++) { - if (match(channel->name, it->mask)) + if (InspIRCd::Match(channel->name, it->mask)) { // We have a pattern matching the channel... maxsize = el->size(); @@ -464,6 +489,63 @@ class ListModeBase : public ModeHandler virtual void TellNotSet(User*, Channel*, std::string&) { } + + virtual const char* DoOnRequest(Request* request) + { + ListModeRequest* LM = (ListModeRequest*)request; + if (strcmp("LM_CHECKLIST", request->GetId()) == 0) + { + modelist* mlist; + LM->chan->GetExt(GetInfoKey(), mlist); + if (mlist) + { + std::string mask = LM->user->nick + "!" + LM->user->ident + "@" + LM->user->GetIPString(); + for (modelist::iterator it = mlist->begin(); it != mlist->end(); ++it) + { + if (InspIRCd::Match(LM->user->GetFullRealHost(), it->mask) || InspIRCd::Match(LM->user->GetFullHost(), it->mask) || (InspIRCd::MatchCIDR(mask, it->mask))) + return it->mask.c_str(); + } + return NULL; + } + } + else if (strcmp("LM_CHECKLIST_EX", request->GetId()) == 0) + { + modelist* mlist; + LM->chan->GetExt(GetInfoKey(), mlist); + if (mlist) + { + if (LM->user) + LM->literal = LM->user->nick + "!" + LM->user->ident + "@" + LM->user->GetIPString(); + + for (modelist::iterator it = mlist->begin(); it != mlist->end(); it++) + { + if (LM->extban && it->mask.length() > 1 && it->mask[0] == LM->extban && it->mask[1] == ':') + { + static std::string ext = it->mask.substr(2); + if (LM->user) + { + if (InspIRCd::Match(LM->user->GetFullRealHost(), ext) || InspIRCd::Match(LM->user->GetFullHost(), ext) || (InspIRCd::MatchCIDR(LM->literal, ext))) + return it->mask.c_str(); + } + else if (InspIRCd::Match(LM->literal, ext)) + return it->mask.c_str(); + } + else + { + if (LM->user) + { + if (InspIRCd::Match(LM->user->GetFullRealHost(), it->mask) || InspIRCd::Match(LM->user->GetFullHost(), it->mask) || (InspIRCd::MatchCIDR(LM->literal, it->mask))) + return it->mask.c_str(); + } + else if (InspIRCd::Match(LM->literal, it->mask)) + return it->mask.c_str(); + } + } + } + } + return NULL; + } + }; #endif