]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-info.c
Show allowed channel types in ISUPPORT(005) numeric only
[ngircd-alex.git] / src / ngircd / irc-info.c
index 763c9302341bf18e6fb6f961e0a8d8b32ff9a4ea..e38d5bb6f3338629f35cc2e22b7ef46bb08f6e15 100644 (file)
@@ -162,7 +162,7 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
                if (OnlyOps && !is_ircop)
                        continue;
 
-               is_visible = Client_HasMode(c, 'i');
+               is_visible = !Client_HasMode(c, 'i');
                if (is_member || is_visible) {
                        memset(flags, 0, sizeof(flags));
 
@@ -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 &&
@@ -405,7 +407,7 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c)
 
        /* Local client and requester is the user itself or an IRC Op? */
        if (Client_Conn(c) > NONE &&
-           (from == c || (!Conf_MorePrivacy && Client_HasMode(from, 'o')))) {
+           (from == c || Client_HasMode(from, 'o'))) {
                /* Client hostname */
                if (!IRC_WriteStrClient(from, RPL_WHOISHOST_MSG,
                                        Client_ID(from), Client_ID(c),
@@ -556,7 +558,15 @@ IRC_INFO(CLIENT * Client, REQUEST * Req)
                                NGIRCd_Version))
                return DISCONNECTED;
 
-#if defined(__DATE__) && defined(__TIME__)
+#if defined(BIRTHDATE)
+       char t_str[60];
+       time_t t = BIRTHDATE;
+       (void)strftime(t_str, sizeof(t_str), "%a %b %d %Y at %H:%M:%S (%Z)",
+                       localtime(&t));
+       snprintf(msg, sizeof(msg), "Birth Date: %s", t_str);
+       if (!IRC_WriteStrClient(Client, RPL_INFO_MSG, Client_ID(prefix), msg))
+               return DISCONNECTED;
+#elif defined(__DATE__) && defined(__TIME__)
        snprintf(msg, sizeof(msg), "Birth Date: %s at %s", __DATE__, __TIME__);
        if (!IRC_WriteStrClient(Client, RPL_INFO_MSG, Client_ID(prefix), msg))
                return DISCONNECTED;
@@ -884,16 +894,16 @@ IRC_STATS( CLIENT *Client, REQUEST *Req )
                        list = Class_GetList(CLASS_GLINE);
                else
                        list = Class_GetList(CLASS_KLINE);
-                       list_item = Lists_GetFirst(list);
-                       while (list_item) {
-                               if (!IRC_WriteStrClient(from, RPL_STATSXLINE_MSG,
+               list_item = Lists_GetFirst(list);
+               while (list_item) {
+                       if (!IRC_WriteStrClient(from, RPL_STATSXLINE_MSG,
                                                Client_ID(from), query,
                                                Lists_GetMask(list_item),
                                                Lists_GetValidity(list_item),
                                                Lists_GetReason(list_item)))
-                                       return DISCONNECTED;
-                               list_item = Lists_GetNext(list_item);
-                       }
+                               return DISCONNECTED;
+                       list_item = Lists_GetNext(list_item);
+               }
                break;
        case 'L':       /* Link status (servers and user links) */
                if (!Op_Check(from, Req))
@@ -1555,7 +1565,8 @@ IRC_Send_ISUPPORT(CLIENT * Client)
                                                   Conf_Network))
                return DISCONNECTED;
        if (!IRC_WriteStrClient(Client, RPL_ISUPPORT1_MSG, Client_ID(Client),
-                               CHANTYPES, CHANTYPES, Conf_MaxJoins))
+                               Conf_AllowedChannelTypes, Conf_AllowedChannelTypes,
+                               Conf_MaxJoins))
                return DISCONNECTED;
        return IRC_WriteStrClient(Client, RPL_ISUPPORT2_MSG, Client_ID(Client),
                                  CHANNEL_NAME_LEN - 1, Conf_MaxNickLength - 1,