commit 5b30aca674fcba8d97a4da8fabbc55413eb6220e from: Omar Polo date: Wed Feb 14 15:53:51 2024 UTC better handling of CAPs after a CAP LS or CAP REQ we should pause the registration (i.e. the icb login) until a CAP END. commit - ec34878030f89c79a18054c9f008a5f12cd53c2f commit + 5b30aca674fcba8d97a4da8fabbc55413eb6220e blob - 4a12ec5e428acf72ca569eae5b02f9c7dc53d634 blob + cb520b93e981d42e809768609ced4ec673ac9009 --- irc.c +++ irc.c @@ -51,6 +51,7 @@ char irc_ident[256]; char irc_nick[256]; char irc_channel[256]; int in_irc_channel; +int in_cap; /* * irc_recv() receives read(2) chunks and assembles complete lines, which are @@ -91,6 +92,16 @@ irc_recv(const char *buf, unsigned len, int client_fd, } static void +irc_complete_registration(int server_fd) +{ + if (icb_logged_in || *irc_nick == '\0' || *irc_ident == '\0') + return; + if (in_cap) + return; + icb_send_login(server_fd, irc_nick, irc_ident, irc_pass); +} + +static void irc_cmd(char *cmd, int client_fd, int server_fd) { char *argv[10], *p; @@ -118,9 +129,7 @@ irc_cmd(char *cmd, int client_fd, int server_fd) strlcpy(irc_pass, argv[1], sizeof(irc_pass)); } else if (!strcasecmp(argv[0], "USER")) { strlcpy(irc_ident, argv[1], sizeof(irc_ident)); - if (!icb_logged_in && irc_nick[0] && irc_ident[0]) - icb_send_login(server_fd, irc_nick, - irc_ident, irc_pass); + irc_complete_registration(server_fd); } else if (!strcasecmp(argv[0], "NICK")) { strlcpy(irc_nick, argv[1], sizeof(irc_nick)); if (icb_logged_in) @@ -195,14 +204,17 @@ irc_cmd(char *cmd, int client_fd, int server_fd) icbirc_quit(); } else if (!strcasecmp(argv[0], "CAP")) { if (!strcasecmp(argv[1], "LS")) { + in_cap = 1; printf("CAP * LS :\n"); fflush(stdout); } else if (!strcasecmp(argv[1], "REQ")) { + in_cap = 1; printf("CAP * NAK :%s\n", argv[2]); fflush(stdout); - } else if (!strcasecmp(argv[1], "END")) - ; - else + } else if (!strcasecmp(argv[1], "END")) { + in_cap = 0; + irc_complete_registration(server_fd); + } else warnx("irc_cmd: unknown command 'CAP %s'", argv[1]); } else warnx("irc_cmd: unknown command '%s'", argv[0]);