]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-channel.c
Allow opers to see secret (+s) channels in LIST command
[ngircd-alex.git] / src / ngircd / irc-channel.c
index 5ea108ad8712d142814d5cac603e13f1d1186149..72fbdc242f6069cc4758dbda43cb666d2426feca 100644 (file)
@@ -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 */
@@ -510,7 +510,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 +533,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 +564,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 +581,7 @@ 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)
+       if (Conf_OperServerMode)
                from = Client_ThisServer();
 
        /* Update channel and forward new topic to other servers */
@@ -666,7 +669,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"))