]> 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 b96ebcfe73647d0b9c0477c7564cd2b3823177e8..e8c555e90637021f5713bee99f8c70675a991c41 100644 (file)
@@ -48,9 +48,7 @@ class CommandTopic : public Command
 
 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());
@@ -79,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;
 }