]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/commands/cmd_topic.cpp
Always set the topic in Channel::SetTopic(), move access checks into cmd_topic
[user/henk/code/inspircd.git] / src / commands / cmd_topic.cpp
index 412ca1c06a5e9e3f233de3aad8dd1e2b286add6f..e8c555e90637021f5713bee99f8c70675a991c41 100644 (file)
@@ -40,13 +40,15 @@ class CommandTopic : public Command
         * @return A value from CmdResult to indicate command success or failure.
         */
        CmdResult Handle(const std::vector<std::string>& parameters, User *user);
+       RouteDescriptor GetRouting(User* user, const std::vector<std::string>& parameters)
+       {
+               return (IS_LOCAL(user) ? ROUTE_LOCALONLY : ROUTE_BROADCAST);
+       }
 };
 
 CmdResult CommandTopic::Handle (const std::vector<std::string>& parameters, User *user)
 {
-       Channel* c;
-
-       c = ServerInstance->FindChan(parameters[0]);
+       Channel* c = ServerInstance->FindChan(parameters[0]);
        if (!c)
        {
                user->WriteNumeric(401, "%s %s :No such nick/channel",user->nick.c_str(), parameters[0].c_str());
@@ -75,12 +77,35 @@ CmdResult CommandTopic::Handle (const std::vector<std::string>& parameters, User
                }
                return CMD_SUCCESS;
        }
-       else if (parameters.size()>1)
+
+       // Access checks are skipped for non-local users
+       if (!IS_LOCAL(user))
+       {
+               c->SetTopic(user, parameters[1]);
+               return CMD_SUCCESS;
+       }
+
+       std::string t = parameters[1]; // needed, in case a module wants to change it
+       ModResult res;
+       FIRST_MOD_RESULT(OnPreTopicChange, res, (user,c,t));
+
+       if (res == MOD_RES_DENY)
+               return CMD_FAILURE;
+       if (res != MOD_RES_ALLOW)
        {
-               std::string t = parameters[1]; // needed, in case a module wants to change it
-               c->SetTopic(user, t);
+               if (!c->HasUser(user))
+               {
+                       user->WriteNumeric(442, "%s %s :You're not on that channel!", user->nick.c_str(), c->name.c_str());
+                       return CMD_FAILURE;
+               }
+               if (c->IsModeSet('t') && !ServerInstance->OnCheckExemption(user, c, "topiclock").check(c->GetPrefixValue(user) >= HALFOP_VALUE))
+               {
+                       user->WriteNumeric(482, "%s %s :You do not have access to change the topic on this channel", user->nick.c_str(), c->name.c_str());
+                       return CMD_FAILURE;
+               }
        }
 
+       c->SetTopic(user, t);
        return CMD_SUCCESS;
 }