X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fcoremods%2Fcore_mode.cpp;h=32dc269103a52f695333c9969355bd88500f490a;hb=HEAD;hp=8da4a2b22a4c8be0b3a51e9f35896f79540e7772;hpb=aa692dc1039b63deef7886e914ec499abe7facaf;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/coremods/core_mode.cpp b/src/coremods/core_mode.cpp index 8da4a2b22..32dc26910 100644 --- a/src/coremods/core_mode.cpp +++ b/src/coremods/core_mode.cpp @@ -3,7 +3,7 @@ * * Copyright (C) 2019 linuxdaemon * Copyright (C) 2019 Robby - * Copyright (C) 2018-2019 Sadie Powell + * Copyright (C) 2018-2020 Sadie Powell * Copyright (C) 2017 B00mX0r * Copyright (C) 2014-2016 Attila Molnar * @@ -25,8 +25,11 @@ class CommandMode : public Command { + private: unsigned int sent[256]; unsigned int seq; + ChanModeReference secretmode; + ChanModeReference privatemode; /** Show the list of one or more list modes to a user. * @param user User to send to. @@ -42,6 +45,18 @@ class CommandMode : public Command */ void DisplayCurrentModes(User* user, User* targetuser, Channel* targetchannel); + bool CanSeeChan(User* user, Channel* chan) + { + // A user can always see the channel modes if they are: + // (1) In the channel. + // (2) An oper with the channels/auspex privilege. + if (chan->HasUser(user) || user->HasPrivPermission("channels/auspex")) + return true; + + // Otherwise, they can only see the modes when the channel is not +p or +s. + return !chan->IsModeSet(secretmode) && !chan->IsModeSet(privatemode); + } + public: /** Constructor for mode. */ @@ -60,6 +75,8 @@ class CommandMode : public Command CommandMode::CommandMode(Module* parent) : Command(parent, "MODE", 1) , seq(0) + , secretmode(creator, "secret") + , privatemode(creator, "private") { syntax = " [[(+|-)] []]"; memset(&sent, 0, sizeof(sent)); @@ -78,7 +95,7 @@ CmdResult CommandMode::Handle(User* user, const Params& parameters) targetuser = ServerInstance->FindNick(target); } - if ((!targetchannel) && (!targetuser)) + if ((!targetchannel || !CanSeeChan(user, targetchannel)) && (!targetuser)) { if (target[0] == '#') user->WriteNumeric(Numerics::NoSuchChannel(target)); @@ -268,6 +285,12 @@ class CoreModMode : public Module { } + void On005Numeric(std::map& tokens) CXX11_OVERRIDE + { + tokens["CHANMODES"] = ServerInstance->Modes->GiveModeList(MODETYPE_CHANNEL); + tokens["USERMODES"] = ServerInstance->Modes->GiveModeList(MODETYPE_USER); + } + Version GetVersion() CXX11_OVERRIDE { return Version("Provides the MODE command", VF_VENDOR|VF_CORE);