]> git.netwichtig.de Git - user/henk/code/inspircd.git/commitdiff
Fix being able to see the modes of private/secret channels.
authorSadie Powell <sadie@witchery.services>
Sun, 2 Feb 2020 15:52:41 +0000 (15:52 +0000)
committerSadie Powell <sadie@witchery.services>
Sun, 2 Feb 2020 15:52:41 +0000 (15:52 +0000)
src/coremods/core_mode.cpp

index 8da4a2b22a4c8be0b3a51e9f35896f79540e7772..99dcf86388eed515e5fecdc9a7df01a7481224c5 100644 (file)
 
 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 = "<target> [[(+|-)]<modes> [<mode-parameters>]]";
        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));