X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_check.cpp;h=f820f2bd047c68550b285372e29e4083f31a8053;hb=a0f7d012791d79b67b56b62415f7901d5e48870f;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..f820f2bd0 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,23 +140,7 @@ 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) + CmdResult Handle(User* user, const Params& parameters) CXX11_OVERRIDE { if (parameters.size() > 1 && parameters[1] != ServerInstance->Config->ServerName) return CMD_SUCCESS; @@ -155,8 +168,8 @@ class CommandCheck : public Command /* /check on a user */ context.Write("nuh", targuser->GetFullHost()); context.Write("realnuh", targuser->GetFullRealHost()); - context.Write("realname", targuser->fullname); - context.Write("modes", std::string("+") + targuser->FormatModes()); + context.Write("realname", targuser->GetRealName()); + context.Write("modes", targuser->GetModeLetters()); context.Write("snomasks", GetSnomasks(targuser)); context.Write("server", targuser->server->GetName()); context.Write("uid", targuser->uuid); @@ -179,26 +192,15 @@ 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"); - for (OperInfo::PrivSet::const_iterator i = oper->AllowedOperCommands.begin(); i != oper->AllowedOperCommands.end(); ++i) - opcmdlist.Add(*i); + opcmdlist.Add(oper->AllowedOperCommands.ToString()); opcmdlist.Flush(); CheckContext::List privlist(context, "permissions"); - for (OperInfo::PrivSet::const_iterator i = oper->AllowedPrivs.begin(); i != oper->AllowedPrivs.end(); ++i) - privlist.Add(*i); + opcmdlist.Add(oper->AllowedPrivs.ToString()); privlist.Flush(); } } @@ -230,7 +232,7 @@ class CommandCheck : public Command chanlist.Flush(); - dumpExt(context, targuser); + context.DumpExt(targuser); } else if (targchan) { @@ -260,15 +262,15 @@ 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->first->ident.c_str(), i->first->dhost.c_str(), i->first->fullname.c_str())); + i->second->GetAllPrefixChars().c_str(), i->first->nick.c_str(), + i->first->ident.c_str(), i->first->GetDisplayedHost().c_str(), i->first->GetRealName().c_str())); } const ModeParser::ListModeList& listmodes = ServerInstance->Modes->GetListModes(); for (ModeParser::ListModeList::const_iterator i = listmodes.begin(); i != listmodes.end(); ++i) context.DumpListMode((*i)->GetList(targchan)); - dumpExt(context, targchan); + context.DumpExt(targchan); } else { @@ -279,16 +281,16 @@ class CommandCheck : public Command const user_hash& users = ServerInstance->Users->GetUsers(); for (user_hash::const_iterator a = users.begin(); a != users.end(); ++a) { - if (InspIRCd::Match(a->second->host, parameters[0], ascii_case_insensitive_map) || InspIRCd::Match(a->second->dhost, parameters[0], ascii_case_insensitive_map)) + if (InspIRCd::Match(a->second->GetRealHost(), parameters[0], ascii_case_insensitive_map) || InspIRCd::Match(a->second->GetDisplayedHost(), parameters[0], ascii_case_insensitive_map)) { /* host or vhost matches mask */ - context.Write("match", ConvToStr(++x) + " " + a->second->GetFullRealHost() + " " + a->second->GetIPString() + " " + a->second->fullname); + context.Write("match", ConvToStr(++x) + " " + a->second->GetFullRealHost() + " " + a->second->GetIPString() + " " + a->second->GetRealName()); } /* IP address */ else if (InspIRCd::MatchCIDR(a->second->GetIPString(), parameters[0])) { /* same IP. */ - context.Write("match", ConvToStr(++x) + " " + a->second->GetFullRealHost() + " " + a->second->GetIPString() + " " + a->second->fullname); + context.Write("match", ConvToStr(++x) + " " + a->second->GetFullRealHost() + " " + a->second->GetIPString() + " " + a->second->GetRealName()); } } @@ -299,9 +301,9 @@ class CommandCheck : public Command return CMD_SUCCESS; } - RouteDescriptor GetRouting(User* user, const std::vector& parameters) + RouteDescriptor GetRouting(User* user, const Params& parameters) CXX11_OVERRIDE { - if (parameters.size() > 1) + if ((parameters.size() > 1) && (parameters[1].find('.') != std::string::npos)) return ROUTE_OPT_UCAST(parameters[1]); return ROUTE_LOCALONLY; }