repo: ngircd action: commit revision: path_from: revision_from: 21767c968d5799ce153f860db6c119eb4b7f9518: path_to: revision_to:
commit 21767c968d5799ce153f860db6c119eb4b7f9518 Author: LucentWDate: Mon Apr 27 23:20:32 2015 +0200 Implement +I (private channel list on whois) Implements enhancement requested in issue #179 diff --git a/src/ngircd/defines.h b/src/ngircd/defines.h
--- a/src/ngircd/defines.h +++ b/src/ngircd/defines.h @@ -177,7 +177,7 @@ #endif /** Supported user modes. */ -#define USERMODES "abBcCFioqrRswx" +#define USERMODES "abBcCFiIoqrRswx" /** Supported channel modes. */ #define CHANMODES "abehiIklmMnoOPqQrRstvVz" diff --git a/src/ngircd/irc-info.c b/src/ngircd/irc-info.c
--- a/src/ngircd/irc-info.c
+++ b/src/ngircd/irc-info.c
@@ -313,48 +313,50 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c)
Client_Info(Client_Introducer(c))))
return DISCONNECTED;
- /* Channels */
- snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
- Client_ID(from), Client_ID(c));
- cl2chan = Channel_FirstChannelOf(c);
- while (cl2chan) {
- chan = Channel_GetChannel(cl2chan);
- assert(chan != NULL);
-
- /* next */
- cl2chan = Channel_NextChannelOf(c, cl2chan);
-
- /* Secret channel? */
- if (Channel_HasMode(chan, 's')
- && !Channel_IsMemberOf(chan, Client))
- continue;
+ /* Channels, show only if client has no +I or if from is oper */
+ if(!(Client_HasMode(c, 'I')) || Client_HasMode(from, 'o')) {
+ snprintf(str, sizeof(str), RPL_WHOISCHANNELS_MSG,
+ Client_ID(from), Client_ID(c));
+ cl2chan = Channel_FirstChannelOf(c);
+ while (cl2chan) {
+ chan = Channel_GetChannel(cl2chan);
+ assert(chan != NULL);
+
+ /* next */
+ cl2chan = Channel_NextChannelOf(c, cl2chan);
+
+ /* Secret channel? */
+ if (Channel_HasMode(chan, 's')
+ && !Channel_IsMemberOf(chan, Client))
+ continue;
- /* Local channel and request is not from a user? */
- if (Client_Type(Client) == CLIENT_SERVER
- && Channel_IsLocal(chan))
- continue;
+ /* Local channel and request is not from a user? */
+ if (Client_Type(Client) == CLIENT_SERVER
+ && Channel_IsLocal(chan))
+ continue;
- /* Concatenate channel names */
- if (str[strlen(str) - 1] != ':')
- strlcat(str, " ", sizeof(str));
+ /* Concatenate channel names */
+ if (str[strlen(str) - 1] != ':')
+ strlcat(str, " ", sizeof(str));
- who_flags_qualifier(Client, Channel_UserModes(chan, c),
- str, sizeof(str));
- strlcat(str, Channel_Name(chan), sizeof(str));
+ who_flags_qualifier(Client, Channel_UserModes(chan, c),
+ str, sizeof(str));
+ strlcat(str, Channel_Name(chan), sizeof(str));
- if (strlen(str) > (COMMAND_LEN - CHANNEL_NAME_LEN - 4)) {
- /* Line becomes too long: send it! */
+ if (strlen(str) > (COMMAND_LEN - CHANNEL_NAME_LEN - 4)) {
+ /* 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))
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? */
if (Client_Type(c) == CLIENT_SERVICE &&
diff --git a/src/ngircd/irc-mode.c b/src/ngircd/irc-mode.c
--- a/src/ngircd/irc-mode.c +++ b/src/ngircd/irc-mode.c @@ -206,6 +206,7 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target ) case 'b': /* Block private msgs */ case 'C': /* Only messages from clients sharing a channel */ case 'i': /* Invisible */ + case 'I': /* Hide channel list from WHOIS */ case 's': /* Server messages */ case 'w': /* Wallops messages */ x[0] = *mode_ptr;
-----END OF PAGE-----