TOPIC command: test for channel admin rights correctly

This enables other servers, services and IRC operators to change
channel topics, even when the client is not joined to this channel.

Now the handler for TOPIC behaves like the one for MODE.
This commit is contained in:
Alexander Barton 2011-01-09 23:08:15 +01:00
parent ba32d594fd
commit 5ed7a4ea57
1 changed files with 10 additions and 4 deletions

View File

@ -407,7 +407,7 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
CHANNEL *chan;
CLIENT *from;
char *topic;
bool r;
bool onchannel, topicok, use_servermode, r;
assert( Client != NULL );
assert( Req != NULL );
@ -430,7 +430,10 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
return IRC_WriteStrClient(from, ERR_NOSUCHCHANNEL_MSG,
Client_ID(from), Req->argv[0]);
if (!Channel_IsMemberOf(chan, from))
Channel_CheckAdminRights(chan, Client, from,
&onchannel, &topicok, &use_servermode);
if (!onchannel && !topicok)
return IRC_WriteStrClient(from, ERR_NOTONCHANNEL_MSG,
Client_ID(from), Req->argv[0]);
@ -457,8 +460,8 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
}
if (strchr(Channel_Modes(chan), 't')) {
/* Topic Lock. Is the user a channel operator? */
if (!strchr(Channel_UserModes(chan, from), 'o'))
/* Topic Lock. Is the user a channel or IRC operator? */
if (!topicok)
return IRC_WriteStrClient(from, ERR_CHANOPRIVSNEEDED_MSG,
Client_ID(from),
Channel_Name(chan));
@ -470,6 +473,9 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
Client_TypeText(from), Client_Mask(from), Channel_Name(chan),
Req->argv[1][0] ? Req->argv[1] : "<none>");
if (use_servermode)
from = Client_ThisServer();
/* Update channel and forward new topic to other servers */
if (!Channel_IsLocal(chan))
IRC_WriteStrServersPrefix(Client, from, "TOPIC %s :%s",