diff options
Diffstat (limited to 'src/commands/cmd_topic.cpp')
-rw-r--r-- | src/commands/cmd_topic.cpp | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/src/commands/cmd_topic.cpp b/src/commands/cmd_topic.cpp index b96ebcfe7..e8c555e90 100644 --- a/src/commands/cmd_topic.cpp +++ b/src/commands/cmd_topic.cpp @@ -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; } |