LUSERS reply: only count "visible" channels
authorAlexander Barton <alex@barton.de>
Wed, 28 Dec 2011 14:07:24 +0000 (15:07 +0100)
committerAlexander Barton <alex@barton.de>
Wed, 28 Dec 2011 14:11:01 +0000 (15:11 +0100)
Rename Channel_Count() to Channel_CountVisible() and only count channels
that are visible to the requesting client, so the existence of secret
channels is no longer revealed by using LUSERS.

Reported by Cahata -- thanks!

src/ngircd/channel.c
src/ngircd/channel.h
src/ngircd/irc-info.c

index 2dbf53a2173012a88de0c817f07be8c699a50934..4d323f274c46b10d7917c7cab5e347f6a85bc8fd 100644 (file)
@@ -352,20 +352,31 @@ Channel_Quit( CLIENT *Client, const char *Reason )
 } /* Channel_Quit */
 
 
+/**
+ * Get number of channels this server knows and that are "visible" to
+ * the given client. If no client is given, all channels will be counted.
+ *
+ * @param Client The client to check or NULL.
+ * @return Number of channels visible to the client.
+ */
 GLOBAL unsigned long
-Channel_Count( void )
+Channel_CountVisible (CLIENT *Client)
 {
        CHANNEL *c;
        unsigned long count = 0;
 
        c = My_Channels;
-       while( c )
-       {
-               count++;
+       while(c) {
+               if (Client) {
+                       if (!strchr(Channel_Modes(c), 's')
+                           || Channel_IsMemberOf(c, Client))
+                               count++;
+               } else
+                       count++;
                c = c->next;
        }
        return count;
-} /* Channel_Count */
+}
 
 
 GLOBAL unsigned long
index f44e19468014663ef0f50cfb22725f391aed60f8..ba3f2ca6480bc3841c70a30bec34a2012b88cda1 100644 (file)
@@ -72,7 +72,7 @@ GLOBAL void Channel_Quit PARAMS(( CLIENT *Client, const char *Reason ));
 GLOBAL void Channel_Kick PARAMS((CLIENT *Peer, CLIENT *Target, CLIENT *Origin,
                                 const char *Name, const char *Reason));
 
-GLOBAL unsigned long Channel_Count PARAMS(( void ));
+GLOBAL unsigned long Channel_CountVisible PARAMS((CLIENT *Client));
 GLOBAL unsigned long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
 GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client ));
 
index cdd03bb1d3a24290bca78f8ec8f864f925185134..01192570f53c988bbe1d464304ddc31214f3e526 100644 (file)
@@ -1317,7 +1317,8 @@ IRC_Send_LUSERS(CLIENT *Client)
 
        /* Number of created channels */
        if (!IRC_WriteStrClient(Client, RPL_LUSERCHANNELS_MSG,
-                               Client_ID(Client), Channel_Count()))
+                               Client_ID(Client),
+                               Channel_CountVisible(Client)))
                return DISCONNECTED;
 
        /* Number of local users, services and servers */