]> arthur.barton.de Git - ngircd-alex.git/commitdiff
Fix channel symbol returned by RPL_NAMREPLY for secret channels
authorVal Lorentz <progval+git@progval.net>
Fri, 19 Apr 2024 21:00:20 +0000 (23:00 +0200)
committerGitHub <noreply@github.com>
Fri, 19 Apr 2024 21:00:20 +0000 (23:00 +0200)
References:

- https://modern.ircdocs.horse/#rplnamreply-353
- https://datatracker.ietf.org/doc/html/rfc2812#page-47
- (RFC 1459 is irrelevant here, as
  https://datatracker.ietf.org/doc/html/rfc1459#page-51 uses a different
  format)

Closes #313.

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

index 9a531bb06663c2acf653c26b9ea3944c1efbf07b..7287f3cad31735d9e2896d93a8c6647f79c93fe8 100644 (file)
@@ -818,7 +818,7 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
 
        /* Now print all clients which are not in any channel */
        c = Client_First();
-       snprintf(rpl, sizeof(rpl), RPL_NAMREPLY_MSG, Client_ID(from), "*", "*");
+       snprintf(rpl, sizeof(rpl), RPL_NAMREPLY_MSG, Client_ID(from), '*', "*");
        while (c) {
                if (Client_Type(c) == CLIENT_USER
                    && Channel_FirstChannelOf(c) == NULL
@@ -830,11 +830,11 @@ IRC_NAMES( CLIENT *Client, REQUEST *Req )
                        strlcat(rpl, Client_ID(c), sizeof(rpl));
 
                        if (strlen(rpl) > COMMAND_LEN - CLIENT_NICK_LEN - 4) {
-                               /* Line is gwoing too long, send now */
+                               /* Line is going too long, send now */
                                if (!IRC_WriteStrClient(from, "%s", rpl))
                                        return DISCONNECTED;
                                snprintf(rpl, sizeof(rpl), RPL_NAMREPLY_MSG,
-                                        Client_ID(from), "*", "*");
+                                        Client_ID(from), '*', "*");
                        }
                }
                c = Client_Next(c);
@@ -1500,6 +1500,8 @@ IRC_Send_NAMES(CLIENT * Client, CHANNEL * Chan)
        char str[COMMAND_LEN];
        CL2CHAN *cl2chan;
        CLIENT *cl;
+       bool secret_channel;
+       char chan_symbol;
 
        assert(Client != NULL);
        assert(Chan != NULL);
@@ -1514,10 +1516,13 @@ IRC_Send_NAMES(CLIENT * Client, CHANNEL * Chan)
                return CONNECTED;
 
        /* Secret channel? */
-       if (!is_member && Channel_HasMode(Chan, 's'))
+       secret_channel = Channel_HasMode(Chan, 's');
+       if (!is_member && secret_channel)
                return CONNECTED;
 
-       snprintf(str, sizeof(str), RPL_NAMREPLY_MSG, Client_ID(Client), "=",
+       chan_symbol = secret_channel ? '@' : '=';
+
+       snprintf(str, sizeof(str), RPL_NAMREPLY_MSG, Client_ID(Client), chan_symbol,
                 Channel_Name(Chan));
        cl2chan = Channel_FirstMember(Chan);
        while (cl2chan) {
@@ -1540,7 +1545,7 @@ IRC_Send_NAMES(CLIENT * Client, CHANNEL * Chan)
                                if (!IRC_WriteStrClient(Client, "%s", str))
                                        return DISCONNECTED;
                                snprintf(str, sizeof(str), RPL_NAMREPLY_MSG,
-                                        Client_ID(Client), "=",
+                                        Client_ID(Client), chan_symbol,
                                         Channel_Name(Chan));
                        }
                }
index 1bbfa69971de4d30f569c08c13900387c93d96b7..5c33b35d5f47ca78fa5dbc0c6e17919e0da9d2d9 100644 (file)
@@ -84,7 +84,7 @@
 #define RPL_ENDOFEXCEPTLIST_MSG                "349 %s %s :End of channel exception list"
 #define RPL_VERSION_MSG                        "351 %s %s-%s.%s %s :%s"
 #define RPL_WHOREPLY_MSG               "352 %s %s %s %s %s %s %s :%d %s"
-#define RPL_NAMREPLY_MSG               "353 %s %s %s :"
+#define RPL_NAMREPLY_MSG               "353 %s %c %s :"
 #define RPL_LINKS_MSG                  "364 %s %s %s :%d %s"
 #define RPL_ENDOFLINKS_MSG             "365 %s %s :End of LINKS list"
 #define RPL_ENDOFNAMES_MSG             "366 %s %s :End of NAMES list"