mirror of
https://github.com/osmarks/ngircd.git
synced 2025-01-19 12:02:52 +00:00
Allow remote servers and IRC Ops to change channel topics
Remote servers are always allowed to change all channel topics,
and IRC Operators are allowed to change all channel topics if the
configuration option "OperCanUseMode" is enabled.
Bug introduced by commit 7b01bb8
and reported by DNS777.
This commit is contained in:
parent
58abd0777b
commit
8d9cfa157a
@ -512,7 +512,7 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
|||||||
CHANNEL *chan;
|
CHANNEL *chan;
|
||||||
CLIENT *from;
|
CLIENT *from;
|
||||||
char *topic;
|
char *topic;
|
||||||
bool r, is_oper;
|
bool r, topic_power;
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
@ -535,11 +535,17 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
|||||||
return IRC_WriteStrClient(from, ERR_NOSUCHCHANNEL_MSG,
|
return IRC_WriteStrClient(from, ERR_NOSUCHCHANNEL_MSG,
|
||||||
Client_ID(from), Req->argv[0]);
|
Client_ID(from), Req->argv[0]);
|
||||||
|
|
||||||
/* Only IRC opers and channel members allowed */
|
/* Only remote servers and channel members are allowed to change the
|
||||||
is_oper = Client_OperByMe(from);
|
* channel topic, and IRC opreators when the Conf_OperCanMode option
|
||||||
if (!Channel_IsMemberOf(chan, from) && !is_oper)
|
* is set in the server configuration. */
|
||||||
return IRC_WriteStrClient(from, ERR_NOTONCHANNEL_MSG,
|
if (Client_Type(Client) != CLIENT_SERVER) {
|
||||||
Client_ID(from), Req->argv[0]);
|
topic_power = Client_HasMode(from, 'o');
|
||||||
|
if (!Channel_IsMemberOf(chan, from)
|
||||||
|
&& !(Conf_OperCanMode && topic_power))
|
||||||
|
return IRC_WriteStrClient(from, ERR_NOTONCHANNEL_MSG,
|
||||||
|
Client_ID(from), Req->argv[0]);
|
||||||
|
} else
|
||||||
|
topic_power = true;
|
||||||
|
|
||||||
if (Req->argc == 1) {
|
if (Req->argc == 1) {
|
||||||
/* Request actual topic */
|
/* Request actual topic */
|
||||||
@ -567,11 +573,11 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
|||||||
|
|
||||||
if (strchr(Channel_Modes(chan), 't')) {
|
if (strchr(Channel_Modes(chan), 't')) {
|
||||||
/* Topic Lock. Is the user a channel op or IRC operator? */
|
/* Topic Lock. Is the user a channel op or IRC operator? */
|
||||||
if(!strchr(Channel_UserModes(chan, from), 'h') &&
|
if(!topic_power &&
|
||||||
|
!strchr(Channel_UserModes(chan, from), 'h') &&
|
||||||
!strchr(Channel_UserModes(chan, from), 'o') &&
|
!strchr(Channel_UserModes(chan, from), 'o') &&
|
||||||
!strchr(Channel_UserModes(chan, from), 'a') &&
|
!strchr(Channel_UserModes(chan, from), 'a') &&
|
||||||
!strchr(Channel_UserModes(chan, from), 'q') &&
|
!strchr(Channel_UserModes(chan, from), 'q'))
|
||||||
!is_oper)
|
|
||||||
return IRC_WriteStrClient(from, ERR_CHANOPRIVSNEEDED_MSG,
|
return IRC_WriteStrClient(from, ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
Client_ID(from),
|
Client_ID(from),
|
||||||
Channel_Name(chan));
|
Channel_Name(chan));
|
||||||
|
Loading…
Reference in New Issue
Block a user