X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Firc-channel.c;h=4a157d67e5fca76d8461f421644da3d00e7b7dd0;hb=c319fb8eaa859e1c5b4e0333abf4dabf6023708d;hp=2d520b314798b7364f7d90f664c64f5917f5ba23;hpb=f2fa1045e24f81e5c844dd50d6e299cb1ad9acb2;p=ngircd-alex.git diff --git a/src/ngircd/irc-channel.c b/src/ngircd/irc-channel.c index 2d520b31..4a157d67 100644 --- a/src/ngircd/irc-channel.c +++ b/src/ngircd/irc-channel.c @@ -82,7 +82,7 @@ static bool join_allowed(CLIENT *Client, CHANNEL *chan, const char *channame, const char *key) { - bool is_invited, is_banned, is_exception;; + bool is_invited, is_banned, is_exception; const char *channel_modes; /* Allow IRC operators to overwrite channel limits */ @@ -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 onchannel, topicok, use_servermode, r; + bool r, is_oper; assert( Client != NULL ); assert( Req != NULL ); @@ -533,10 +535,9 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req ) return IRC_WriteStrClient(from, ERR_NOSUCHCHANNEL_MSG, Client_ID(from), Req->argv[0]); - Channel_CheckAdminRights(chan, Client, from, - &onchannel, &topicok, &use_servermode); - - if (!onchannel && !topicok) + /* 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]); @@ -565,8 +566,12 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req ) } if (strchr(Channel_Modes(chan), 't')) { - /* Topic Lock. Is the user a channel or IRC operator? */ - if (!topicok) + /* Topic Lock. Is the user a channel op or IRC operator? */ + if(!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) return IRC_WriteStrClient(from, ERR_CHANOPRIVSNEEDED_MSG, Client_ID(from), Channel_Name(chan)); @@ -578,7 +583,7 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req ) Client_TypeText(from), Client_Mask(from), Channel_Name(chan), Req->argv[1][0] ? Req->argv[1] : ""); - if (use_servermode) + if (Conf_OperServerMode) from = Client_ThisServer(); /* Update channel and forward new topic to other servers */ @@ -651,7 +656,7 @@ IRC_LIST( CLIENT *Client, REQUEST *Req ) /* Target is indeed an other server, forward it! */ return IRC_WriteStrClientPrefix(target, from, "LIST %s :%s", - Client_ID(from), + Req->argv[0], Req->argv[1]); } } @@ -666,7 +671,8 @@ IRC_LIST( CLIENT *Client, REQUEST *Req ) if (MatchCaseInsensitive(pattern, Channel_Name(chan))) { /* Gotcha! */ if (!strchr(Channel_Modes(chan), 's') - || Channel_IsMemberOf(chan, from)) { + || Channel_IsMemberOf(chan, from) + || (!Conf_MorePrivacy && Client_OperByMe(Client))) { if (IRC_CheckListTooBig(from, count, MAX_RPL_LIST, "LIST"))