Merge pull request #197 from LucentW/master

Implement user mode "I": Hide channels on WHOIS

User mode +I prevents ngIRCd from showing channels on WHOIS.
IRC Operators can always see those.

Closes #197.
This commit is contained in:
Alexander Barton 2015-04-30 09:28:15 +02:00
commit d9a97f2857
4 changed files with 38 additions and 34 deletions

View File

@ -2,7 +2,7 @@
ngIRCd - Next Generation IRC Server ngIRCd - Next Generation IRC Server
http://ngircd.barton.de/ http://ngircd.barton.de/
(c)2001-2014 Alexander Barton and Contributors. (c)2001-2015 Alexander Barton and Contributors.
ngIRCd is free software and published under the ngIRCd is free software and published under the
terms of the GNU General Public License. terms of the GNU General Public License.
@ -28,6 +28,7 @@ channels he is using at the moment.
C 19 Only users that share a channel are allowed to send messages. C 19 Only users that share a channel are allowed to send messages.
F 22 Relaxed flood protection (only settable by IRC Operators). F 22 Relaxed flood protection (only settable by IRC Operators).
i 0.0.1 User is "invisible". i 0.0.1 User is "invisible".
I 23 No channels are shown on WHOIS (IRC Operators can always see those).
o 0.0.1 User is IRC operator. o 0.0.1 User is IRC operator.
q 20 User is protected, can not be kicked from a channel. q 20 User is protected, can not be kicked from a channel.
r 0.0.1 User is restricted. r 0.0.1 User is restricted.

View File

@ -177,7 +177,7 @@
#endif #endif
/** Supported user modes. */ /** Supported user modes. */
#define USERMODES "abBcCFioqrRswx" #define USERMODES "abBcCFiIoqrRswx"
/** Supported channel modes. */ /** Supported channel modes. */
#define CHANMODES "abehiIklmMnoOPqQrRstvVz" #define CHANMODES "abehiIklmMnoOPqQrRstvVz"

View File

@ -313,48 +313,50 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c)
Client_Info(Client_Introducer(c)))) Client_Info(Client_Introducer(c))))
return DISCONNECTED; return DISCONNECTED;
/* Channels */ /* Channels, show only if client has no +I or if from is oper */
snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG, if(!(Client_HasMode(c, 'I')) || Client_HasMode(from, 'o')) {
Client_ID(from), Client_ID(c)); snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
cl2chan = Channel_FirstChannelOf(c); Client_ID(from), Client_ID(c));
while (cl2chan) { cl2chan = Channel_FirstChannelOf(c);
chan = Channel_GetChannel(cl2chan); while (cl2chan) {
assert(chan != NULL); chan = Channel_GetChannel(cl2chan);
assert(chan != NULL);
/* next */ /* next */
cl2chan = Channel_NextChannelOf(c, cl2chan); cl2chan = Channel_NextChannelOf(c, cl2chan);
/* Secret channel? */ /* Secret channel? */
if (Channel_HasMode(chan, 's') if (Channel_HasMode(chan, 's')
&& !Channel_IsMemberOf(chan, Client)) && !Channel_IsMemberOf(chan, Client))
continue; continue;
/* Local channel and request is not from a user? */ /* Local channel and request is not from a user? */
if (Client_Type(Client) == CLIENT_SERVER if (Client_Type(Client) == CLIENT_SERVER
&& Channel_IsLocal(chan)) && Channel_IsLocal(chan))
continue; continue;
/* Concatenate channel names */ /* Concatenate channel names */
if (str[strlen(str) - 1] != ':') if (str[strlen(str) - 1] != ':')
strlcat(str, " ", sizeof(str)); strlcat(str, " ", sizeof(str));
who_flags_qualifier(Client, Channel_UserModes(chan, c), who_flags_qualifier(Client, Channel_UserModes(chan, c),
str, sizeof(str)); str, sizeof(str));
strlcat(str, Channel_Name(chan), sizeof(str)); strlcat(str, Channel_Name(chan), sizeof(str));
if (strlen(str) > (COMMAND_LEN - CHANNEL_NAME_LEN - 4)) { if (strlen(str) > (COMMAND_LEN - CHANNEL_NAME_LEN - 4)) {
/* Line becomes too long: send it! */ /* Line becomes too long: send it! */
if (!IRC_WriteStrClient(Client, "%s", str))
return DISCONNECTED;
snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
Client_ID(from), Client_ID(c));
}
}
if(str[strlen(str) - 1] != ':') {
/* There is data left to send: */
if (!IRC_WriteStrClient(Client, "%s", str)) if (!IRC_WriteStrClient(Client, "%s", str))
return DISCONNECTED; return DISCONNECTED;
snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
Client_ID(from), Client_ID(c));
} }
} }
if(str[strlen(str) - 1] != ':') {
/* There is data left to send: */
if (!IRC_WriteStrClient(Client, "%s", str))
return DISCONNECTED;
}
/* IRC-Services? */ /* IRC-Services? */
if (Client_Type(c) == CLIENT_SERVICE && if (Client_Type(c) == CLIENT_SERVICE &&

View File

@ -206,6 +206,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
case 'b': /* Block private msgs */ case 'b': /* Block private msgs */
case 'C': /* Only messages from clients sharing a channel */ case 'C': /* Only messages from clients sharing a channel */
case 'i': /* Invisible */ case 'i': /* Invisible */
case 'I': /* Hide channel list from WHOIS */
case 's': /* Server messages */ case 's': /* Server messages */
case 'w': /* Wallops messages */ case 'w': /* Wallops messages */
x[0] = *mode_ptr; x[0] = *mode_ptr;