X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Firc-channel.c;h=ed4839afdcef63782be0510b876915d3522c8e10;hp=9e88e1bd0031de480a33d3ddfb5b447fed81d013;hb=32f63abb59b5c9f47b4d517e0bbf9cc73fd044dc;hpb=e3e181f4b3eae0e552632bce19bdff990196938f diff --git a/src/ngircd/irc-channel.c b/src/ngircd/irc-channel.c index 9e88e1bd..ed4839af 100644 --- a/src/ngircd/irc-channel.c +++ b/src/ngircd/irc-channel.c @@ -167,8 +167,10 @@ join_set_channelmodes(CHANNEL *chan, CLIENT *target, const char *flags) } } - /* If channel persistent and client is ircop: make client chanop */ - if (strchr(Channel_Modes(chan), 'P') && strchr(Client_Modes(target), 'o')) + /* If the channel is persistent (+P) and client is an IRC op: + * make client chanop, if not disabled in configuration. */ + if (strchr(Channel_Modes(chan), 'P') && Conf_OperChanPAutoOp + && strchr(Client_Modes(target), 'o')) Channel_UserModeAdd(chan, target, 'o'); } /* join_set_channelmodes */ @@ -510,7 +512,7 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req ) CHANNEL *chan; CLIENT *from; char *topic; - bool r, is_oper; + bool r, topic_power; assert( Client != NULL ); assert( Req != NULL ); @@ -533,11 +535,17 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req ) return IRC_WriteStrClient(from, ERR_NOSUCHCHANNEL_MSG, Client_ID(from), Req->argv[0]); - /* Only IRC opers and channel members allowed */ - is_oper = Client_OperByMe(from); - if (!Channel_IsMemberOf(chan, from) && !is_oper) - return IRC_WriteStrClient(from, ERR_NOTONCHANNEL_MSG, - Client_ID(from), Req->argv[0]); + /* Only remote servers and channel members are allowed to change the + * channel topic, and IRC opreators when the Conf_OperCanMode option + * is set in the server configuration. */ + if (Client_Type(Client) != CLIENT_SERVER) { + 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) { /* Request actual topic */ @@ -565,11 +573,11 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req ) if (strchr(Channel_Modes(chan), 't')) { /* 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), 'a') && - !strchr(Channel_UserModes(chan, from), 'q') && - !is_oper) + !strchr(Channel_UserModes(chan, from), 'q')) return IRC_WriteStrClient(from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(from), Channel_Name(chan)); @@ -669,10 +677,12 @@ IRC_LIST( CLIENT *Client, REQUEST *Req ) if (MatchCaseInsensitive(pattern, Channel_Name(chan))) { /* Gotcha! */ if (!strchr(Channel_Modes(chan), 's') - || Channel_IsMemberOf(chan, from)) { - if (IRC_CheckListTooBig(from, count, - MAX_RPL_LIST, - "LIST")) + || Channel_IsMemberOf(chan, from) + || (!Conf_MorePrivacy && Client_OperByMe(Client))) { + if ((Conf_MaxListSize > 0) + && IRC_CheckListTooBig(from, count, + Conf_MaxListSize, + "LIST")) break; if (!IRC_WriteStrClient(from, RPL_LIST_MSG, Client_ID(from),