X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_check.cpp;h=f4123466e14b3db54db964f711bdde04744752be;hb=3b78613576364c4ac6a4e4af43a2eea056c8dd3f;hp=95e063e4dc12cfe8a9222a08766aebeefeb4082e;hpb=1520f1d71654f45f4faec367ac02f03e27fd8960;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_check.cpp b/src/modules/m_check.cpp index 95e063e4d..f4123466e 100644 --- a/src/modules/m_check.cpp +++ b/src/modules/m_check.cpp @@ -65,6 +65,22 @@ class CheckContext modelist.Flush(); } + void DumpExt(Extensible* ext) + { + CheckContext::List extlist(*this, "metadata"); + for(Extensible::ExtensibleStore::const_iterator i = ext->GetExtList().begin(); i != ext->GetExtList().end(); ++i) + { + ExtensionItem* item = i->first; + std::string value = item->serialize(FORMAT_USER, ext, i->second); + if (!value.empty()) + Write("meta:" + item->name, value); + else if (!item->name.empty()) + extlist.Add(item->name); + } + + extlist.Flush(); + } + class List : public Numeric::GenericBuilder<' ', false, Numeric::WriteRemoteNumericSink> { public: @@ -93,6 +109,19 @@ class CommandCheck : public Command return ret; } + static std::string GetAllowedOperOnlyModes(LocalUser* user, ModeType modetype) + { + std::string ret; + const ModeParser::ModeHandlerMap& modes = ServerInstance->Modes.GetModes(modetype); + for (ModeParser::ModeHandlerMap::const_iterator i = modes.begin(); i != modes.end(); ++i) + { + const ModeHandler* const mh = i->second; + if ((mh->NeedsOper()) && (user->HasModePermission(mh))) + ret.push_back(mh->GetModeChar()); + } + return ret; + } + public: CommandCheck(Module* parent) : Command(parent,"CHECK", 1) @@ -111,22 +140,6 @@ class CommandCheck : public Command return ret; } - void dumpExt(CheckContext& context, Extensible* ext) - { - CheckContext::List extlist(context, "metadata"); - for(Extensible::ExtensibleStore::const_iterator i = ext->GetExtList().begin(); i != ext->GetExtList().end(); i++) - { - ExtensionItem* item = i->first; - std::string value = item->serialize(FORMAT_USER, ext, i->second); - if (!value.empty()) - context.Write("meta:" + item->name, value); - else if (!item->name.empty()) - extlist.Add(item->name); - } - - extlist.Flush(); - } - CmdResult Handle (const std::vector ¶meters, User *user) { if (parameters.size() > 1 && parameters[1] != ServerInstance->Config->ServerName) @@ -179,17 +192,8 @@ class CommandCheck : public Command context.Write("opertype", oper->name); if (loctarg) { - std::string umodes; - std::string cmodes; - for(char c='A'; c <= 'z'; c++) - { - ModeHandler* mh = ServerInstance->Modes->FindMode(c, MODETYPE_USER); - if (mh && mh->NeedsOper() && loctarg->HasModePermission(c, MODETYPE_USER)) - umodes.push_back(c); - mh = ServerInstance->Modes->FindMode(c, MODETYPE_CHANNEL); - if (mh && mh->NeedsOper() && loctarg->HasModePermission(c, MODETYPE_CHANNEL)) - cmodes.push_back(c); - } + std::string umodes = GetAllowedOperOnlyModes(loctarg, MODETYPE_USER); + std::string cmodes = GetAllowedOperOnlyModes(loctarg, MODETYPE_CHANNEL); context.Write("modeperms", "user=" + umodes + " channel=" + cmodes); CheckContext::List opcmdlist(context, "commandperms"); @@ -230,7 +234,7 @@ class CommandCheck : public Command chanlist.Flush(); - dumpExt(context, targuser); + context.DumpExt(targuser); } else if (targchan) { @@ -260,7 +264,7 @@ class CommandCheck : public Command */ const UserManager::CloneCounts& clonecount = ServerInstance->Users->GetCloneCounts(i->first); context.Write("member", InspIRCd::Format("%-3u %s%s (%s@%s) %s ", clonecount.global, - i->second->GetAllPrefixChars(), i->first->nick.c_str(), + i->second->GetAllPrefixChars().c_str(), i->first->nick.c_str(), i->first->ident.c_str(), i->first->dhost.c_str(), i->first->fullname.c_str())); } @@ -268,7 +272,7 @@ class CommandCheck : public Command for (ModeParser::ListModeList::const_iterator i = listmodes.begin(); i != listmodes.end(); ++i) context.DumpListMode((*i)->GetList(targchan)); - dumpExt(context, targchan); + context.DumpExt(targchan); } else { @@ -301,7 +305,7 @@ class CommandCheck : public Command RouteDescriptor GetRouting(User* user, const std::vector& parameters) { - if (parameters.size() > 1) + if ((parameters.size() > 1) && (parameters[1].find('.') != std::string::npos)) return ROUTE_OPT_UCAST(parameters[1]); return ROUTE_LOCALONLY; }