]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/irc-info.c
Allow ircops to use WHO on any channel.
[ngircd-alex.git] / src / ngircd / irc-info.c
index 1bbaf57b3b53a35e905be647c5f075690ade38ac..03127b229f4008d203ce0fd700d9ca4173250043 100644 (file)
@@ -138,7 +138,7 @@ who_flags_qualifier(CLIENT *Client, const char *chan_user_modes,
 static bool
 IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
 {
-       bool is_visible, is_member, is_ircop;
+       bool is_visible, is_member, is_ircop, is_oper;
        CL2CHAN *cl2chan;
        char flags[10];
        CLIENT *c;
@@ -148,9 +148,10 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
        assert( Chan != NULL );
 
        is_member = Channel_IsMemberOf(Chan, Client);
+       is_oper = Client_HasMode(Client, 'o');
 
        /* Secret channel? */
-       if (!is_member && Channel_HasMode(Chan, 's'))
+       if (!is_member && !is_oper && Channel_HasMode(Chan, 's'))
                return IRC_WriteStrClient(Client, RPL_ENDOFWHO_MSG,
                                          Client_ID(Client), Channel_Name(Chan));
 
@@ -163,7 +164,7 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
                        continue;
 
                is_visible = !Client_HasMode(c, 'i');
-               if (is_member || is_visible) {
+               if (is_member || is_visible || is_oper) {
                        memset(flags, 0, sizeof(flags));
 
                        if (Client_HasMode(c, 'a'))
@@ -558,7 +559,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;
@@ -886,16 +895,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))