X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Fu_listmode.h;h=eb3cf18b7e2694c4c9d3ecae59792a2735fad226;hb=fa3e1d5d4d803840b6bf06d9116353fab55fc686;hp=2fb55a337f39c125aa99e8b993a0e1c36c68ad48;hpb=e853ec6473b874506b2036de2f76d6ae7cd34325;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/u_listmode.h b/include/u_listmode.h index 2fb55a337..eb3cf18b7 100644 --- a/include/u_listmode.h +++ b/include/u_listmode.h @@ -2,8 +2,8 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team - * See: http://www.inspircd.org/wiki/index.php/Credits + * InspIRCd: (C) 2002-2009 InspIRCd Development Team + * See: http://wiki.inspircd.org/Credits * * This program is free but copyrighted software; see * the file COPYING for details. @@ -16,10 +16,10 @@ /** Get the time as a string */ -inline std::string stringtime() +inline std::string stringtime(InspIRCd* Instance) { std::ostringstream TIME; - TIME << time(NULL); + TIME << Instance->Time(); return TIME.str(); } @@ -44,10 +44,10 @@ public: /** Items stored in the channel's list */ -typedef std::vector modelist; +typedef std::list modelist; /** Max items per channel by name */ -typedef std::vector limitlist; +typedef std::list limitlist; /** A request used to check if a user is on a channel's list or not */ @@ -55,7 +55,7 @@ class ListModeRequest : public Request { public: User* user; - const std::string literal; + std::string literal; const char extban; Channel* chan; @@ -79,7 +79,19 @@ class ListModeRequest : public Request * @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) : Request(sender, target, "LM_CHECKLIST_EX"), literal(literalstr), extban(extbanchar) + 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) { } @@ -117,7 +129,7 @@ class ListModeBase : public ModeHandler * specified in ListModeBase::configtag */ limitlist chanlimits; - + public: /** Constructor. * @param Instance The creator of this class @@ -135,7 +147,7 @@ class ListModeBase : public ModeHandler infokey = "listbase_mode_" + std::string(1, mode) + "_list"; } - /** See mode.h + /** See mode.h */ std::pair ModeSet(User*, User*, Channel* channel, const std::string ¶meter) { @@ -166,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()); @@ -205,12 +217,9 @@ class ListModeBase : public ModeHandler while (modestack.GetStackedLine(stackresult)) { - for (size_t j = 0; j < stackresult.size(); j++) - { - mode_junk.push_back(stackresult[j]); - } - - ServerInstance->SendMode(mode_junk, ServerInstance->FakeClient); + mode_junk.insert(mode_junk.end(), stackresult.begin(), stackresult.end()); + ServerInstance->SendMode(mode_junk, ServerInstance->FakeClient); + mode_junk.erase(mode_junk.begin() + 1, mode_junk.end()); } } } @@ -287,7 +296,7 @@ class ListModeBase : public ModeHandler { /* Give a subclass a chance to error about this */ TellAlreadyOnList(source, channel, parameter); - + // it does, deny the change return MODEACTION_DENY; } @@ -319,7 +328,7 @@ class ListModeBase : public ModeHandler ListItem e; e.mask = parameter; e.nick = servermode ? ServerInstance->Config->ServerName : source->nick; - e.time = stringtime(); + e.time = stringtime(ServerInstance); el->push_back(e); return MODEACTION_ALLOW; @@ -338,9 +347,9 @@ class ListModeBase : public ModeHandler { source->WriteNumeric(478, "%s %s %s :Channel ban/ignore list is full", source->nick.c_str(), channel->name.c_str(), parameter.c_str()); } - + parameter = ""; - return MODEACTION_DENY; + return MODEACTION_DENY; } else { @@ -411,6 +420,8 @@ class ListModeBase : public ModeHandler chan->GetExt(infokey, mlist); irc::modestacker modestack(ServerInstance, true); std::deque stackresult; + std::deque types; + types.push_back(TR_TEXT); if (mlist) { for (modelist::iterator it = mlist->begin(); it != mlist->end(); it++) @@ -420,9 +431,8 @@ class ListModeBase : public ModeHandler } while (modestack.GetStackedLine(stackresult)) { - irc::stringjoiner mode_join(" ", stackresult, 0, stackresult.size() - 1); - std::string line = mode_join.GetJoined(); - proto->ProtoSendMode(opaque, TYPE_CHANNEL, chan, line); + types.assign(stackresult.size(), this->GetTranslateType()); + proto->ProtoSendMode(opaque, TYPE_CHANNEL, chan, stackresult, types); } } @@ -433,7 +443,7 @@ class ListModeBase : public ModeHandler virtual void DoCleanup(int, void*) { } - + /** Validate parameters. * Overridden by implementing module. * @param source Source user adding the parameter @@ -445,7 +455,7 @@ class ListModeBase : public ModeHandler { return true; } - + /** Tell the user the list is too long. * Overridden by implementing module. * @param source Source user adding the parameter @@ -457,7 +467,7 @@ class ListModeBase : public ModeHandler { return false; } - + /** Tell the user an item is already on the list. * Overridden by implementing module. * @param source Source user adding the parameter @@ -467,7 +477,7 @@ class ListModeBase : public ModeHandler virtual void TellAlreadyOnList(User*, Channel*, std::string&) { } - + /** Tell the user that the parameter is not in the list. * Overridden by implementing module. * @param source Source user removing the parameter @@ -487,7 +497,7 @@ class ListModeBase : public ModeHandler LM->chan->GetExt(GetInfoKey(), mlist); if (mlist) { - std::string mask = std::string(LM->user->nick) + "!" + LM->user->ident + "@" + LM->user->GetIPString(); + 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))) @@ -500,19 +510,44 @@ class ListModeBase : public ModeHandler { 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] == ':') { - if (InspIRCd::Match(LM->literal.substr(2), it->mask)) + 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 (InspIRCd::Match(LM->literal, it->mask)) + 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(); + } } } } @@ -523,4 +558,3 @@ class ListModeBase : public ModeHandler }; #endif -