# Change Log # All notable changes to this project will be documented in this file. ## [Unreleased] ## - **Added** usage of `emplace_back()` when dealing with vector insertions. (Performance). Whole tree completed. - **Added** usage of `nullptr`. Whole tree completed. - **Added** usage of type aliases. - **Deleted** unused includes. - **Fixed** C-style headers in C++ files. - **Fixed** hardcoded function names (in error messages). - **Fixed** unchecked function return values. - **Improved** the C++ exception handling. Namely handle all exceptions thrown before `main()` begins executing. - **Made** move assignment operators and move constructors `noexcept`. (Performance). - **Reduced** the scope of variables. - **Replaced** `atoi()` with `strtol()`. Multiple occurrences. - **Usage** of `auto` in order to avoid duplicating the type name. ## [3.5.8] - 2026-01-17 ## - **Added** command `/log` (management of log files). ## [3.5.7] - 2026-01-01 ## - **Added** micro optimizations. Multiple occurrences. - **Added** option `save_backlogs_to_disk` (string). Can be `no`, `both`, `channels` or `private`. Defaults to `both`. - **Added** usage of `__restrict`. - **Changed** the program to during the make phase perform basic checks on functions which accept buffers and sizes. - **Changed** the program to, additionally, display the Curses and TLS library versions when called by the `-v` flag. - For classes that declares a destructor, also declare a: 1. copy assignment operator 2. copy constructor 3. move assignment operator 4. move constructor - **Improved** the C++ exception handling. - **Replaced** `memcmp()` with `timingsafe_memcmp()` - one occurrence. - **Replaced** preprocessor defines with regular variables. - **Switched** memory allocation/deallocation method to new/delete for C++ files. A few occurrences only. ### Windows ### - **Upgraded** to [Curl](https://curl.se/) 8.17.0 - **Upgraded** to [LibreSSL](https://www.libressl.org/) 4.2.1 ## [3.5.6] - 2025-10-11 ## - **Added** command `/nsid` (NickServ identify). - **Added** command `/utctime`. - **Added** command-line option `-h`. (Sets the bind host) - **Added** small tab completion improvements. - During file creation, took care to give it the most restrictive permissions possible. Multiple occurrences. - **Fixed** segmentation fault on OpenBSD 7.8 and greater due to a type change of the global variable `malloc_options` which is now an immutable char pointer. Better to not set it at all, not even at file scope. It had been good if the declaration of `malloc_options` had been provided within a system header, the segmentation fault had instead resulted in a compilation error. - **Improved** the thread safety. Fixed potential data races found by TSan. ### Windows ### - **Upgraded** to [LibreSSL](https://www.libressl.org/) 4.1.1 ## [3.5.5] - 2025-05-17 ## - **Added** a few micro-optimizations. - **Added** usage of `textBuf_emplace_back()` in _multiple_ places thus reduced duplication. - **Changed** `squeeze_text_deco_wide()` in order to make it more accurate for its task. - **Changed** the output of `/set`. When called without any arguments it lists all settings by columns. - **Changed** the program to kill the IRC server connection if event welcome is received more than once. Which for example can happen if ZNC loses its IRC server connection, and that causes troubles. - **Changed** the program to replace less than/greater than signs with `<` and `>` respectively, this in notifications. - **Fixed** a few Clang Tidy warnings. - **Fixed** building with `GNUMAKEFLAGS=--shuffle=reverse`. Reported by Lucas Nussbaum. Thanks! - **Fixed** conversion from type `A` -> `B`, possible loss of data. Multiple occurrences. - **Replaced** calls to `getenv()` with `getenv_s()`. - **Replaced** calls to `sscanf()` with `sscanf_s()`. ### Windows ### - **Added** a help file with documentation. - **Changed** to static linking of the exe. - **Replaced** calls to: - `wcsncpy()` with `wcsncpy_s()`. - `wcstombs()` with `wcstombs_s()`. - `Swirc.wxs`: converted v3 source to v4 source. - **Upgraded** to [LibreSSL](https://www.libressl.org/) 4.1.0 ## [3.5.4] - 2025-02-22 ## - **Added** lowercase `/znc` subcommands used for auto complete. - **Added** translations. - **Changed** the program set the DCC and FTP download dirs differently. - **Did** code improvements: - Atomic vars. - Null checks. - Refactoring. - Usage of `auto` for iterators. - Usage of `nullptr`. - `...` ### Windows ### - **Fixed** `/znc JumpNetwork`. ## [3.5.3] - 2025-02-08 ## - **Added** tab completion for: - `/dcc` - `/ftp` - **Changed** the program to squeeze text decoration in notification messages. - **Fixed** option `notifications`. (Did not take effect on private messages). - **Fixed** so that `/znc JumpNetwork` works. (It didn't until now due to the lack of reinitialization of the IRC module). ## [3.5.2] - 2025-02-01 ## - **Added** command `/ctcp` - **Added** command `/ftp` - **Added** subcommand `ls` to `/dcc` which can be used to list the contents of the upload/download directories. - **Added** the following options: - `ctcp_userinfo` (string) - `ftp_host` (string) - `ftp_port` (integer, defaults to 21) - `ftp_user` (string) - `ftp_pass` (string) - `ftp_upload_dir` (string) - **Added** the key combination `CTRL+w` (List all windows) - **Added** the possibility to switch between windows by just entering the reference number, i.e. `/1`, `/2`, `/3`... - **Added** usage of `emplace_back()`. Performance. Multiple occurrences. - **Changed** `is_valid_filename()` to disallow `..` - **Changed** the program to beep on certain window activity. - **Fixed** `-Wshadow` warnings - **Fixed** a resource leak found by Coverity. - **Fixed** uncontrolled data used in path expressions. ## [3.5.1] - 2024-11-09 ## - **Added** command `/announce`. - **Added** command-line option `-X` (Disable all IRCv3 extensions) - **Added** event `CHGHOST` (IRCv3.) - **Added** option `account_tag` (bool). - **Added** option `chghost` (bool). Send a notification when clients change their username or host. Defaults to **yes**. - **Added** option `extended_join` (bool). - **Added** the `NEW` and `DEL` CAP subcommands. And implicitly enabled the `cap-notify` extension. - **Added** the following SASL auth mechanisms: - `SCRAM-SHA-1` - `SCRAM-SHA-512` - **Changed** the program to: - Init/deinit Windows sockets once. - Not terminate the DCC server on IRC disconnect. It is Client-to-Client which means file transfers can continue. IRC is only used for the negotiation. - Output a reason if `SSL_connect()` fails. - Output a reason if `tls_server::get_accept_bio()` fails. - **Did** code improvements: - Added default constructors - Reduced duplication - Reduced scope of variables - Removed redundant checks - Replaced macros for constants - Usage of initializer lists - `...` - **Enabled** `account_notify` by default. - **Enabled** more colors for BSD and macOS. - **Fixed** cases of uncontrolled allocation sizes. - **Fixed** potential signed integer overflows. ### Windows ### - **Upgraded** to [LibreSSL](https://www.libressl.org/) 4.0.0 ## [3.5.0] - 2024-09-30 ## - **Added** command `/wholeft` (alias `/wl`.) - **Added** option `notifications` (bool). Turns notifications on/off. - **Added** new translations. - **Added** support for netjoin/netsplit. Few IRC server software support the batches which were added in 3.4.7. This release comes with its own implementation. - **Improved** `xwcwidth()`. I.e. added more full width character ranges, and switched to a better search algorithm. ## [3.4.9] - 2024-07-28 ## - **Added** event 468 (`ERR_INVALIDUSERNAME`) - **Added** usage of `nullptr`. - **Changed** the program to not start reconnecting on event 433 (`ERR_NICKNAMEINUSE`) if a connection is in progress. - **Fixed** [CWE-190](https://cwe.mitre.org/data/definitions/190.html) bugs found by Coverity. - **Fixed** a few potential data races found by TSan. - **Fixed** a null pointer dereference. - **Improved** the thread safety. ## [3.4.8] - 2024-06-04 ## - **Added** the following commands: - `/voice` - `/devoice` - **Added** tab completion for: - `/deop` - `/kick` - `/kickban` - `/op` - **Added** translations. - **Changed** the program to: - Output the number of messages in a batch. - Output the number of nicks in a netjoin/netsplit plus the server hostnames. - **Did code improvements**: - Explicitly specified the size of multiple arrays (MISRA rule, found by PVS-Studio). - Fixed octal constants (MISRA rule, found by PVS-Studio). - Fixed redundant checks and expressions. - Harnessed the power of templates and defined `ARRAY_SIZE()` differently for C++. - Marked variables with `const` and `immutable_cp_t` respectively. - Reduced the scope of variables. - Variable initializations. - ... - **Fixed** the begin/end messages of a batch to not end up in the status window. - **List** all commands dynamically in the output of `/help`, i.e. calculate the cols/rows with respect to the current window size. ### Windows ### - **Fixed** a case of truncation from `int` to `wchar_t`. - **Upgraded to**: - [Curl](https://curl.se/) 8.8.0 - [LibreSSL](https://www.libressl.org/) 3.9.2 ## [3.4.7] - 2024-03-12 ## - **Added** command `/dcc` - **Added** event `BATCH` (IRCv3). The following types were added: - `chathistory` - `netjoin` - `netsplit` - `znc.in/playback` - **Added** tab completion for: - `/mode` - **Added** the following config options: - `batch` (bool) - `dcc` (bool) - `dcc_cipher_suite` (string) - `dcc_own_ip` (string) - `dcc_port` (int) - `dcc_upload_dir` (string) - `multi_prefix` (bool) - Did code optimizations: - Measure string length once, found by [PVS-Studio](https://pvs-studio.com/en/pvs-studio/). - ... - Enabled `iconv_conversion` by default. - **Fixed** an off-by-one error in the IRC module. The previous program versions weren't really affected however. - **Fixed** building on any setup where Ncurses is built with opaque types. - **Fixed** new [Coverity](https://scan.coverity.com/) defects - **Fixed** the precision of the error log size in KB. - Improved C++ exception handling. Among other things, handle if 'new' throws. - Renamed option `ircv3_server_time` to `server_time` and enabled it by default. ## [3.4.6] - 2023-11-05 ## - **Added** adoption of SPDX-tags for the distributed manual pages - **Added** better detection of server Wallops - **Added** command-line option `-S` (Force TLS) - **Added** event 249 (`RPL_STATSDEBUG`) - **Added** extensive use of the `CPPFLAGS` make macro - **Added** handling of empty user@host combinations in Wallops messages - **Added** handling of znc messages. (Made them look like notices and appear in the active window.) - **Added** protection for bad filenames for IRC logs - **Added** translations - **Changed** the way of recognizing a user mode versus channel mode - **Did** code improvements - **Fixed** occurrences of hardcoded function names in messages - **Fixed** typos in manual pages - **Improved** C++ exception handling - **Limited** notification messages in length ### Windows ### - **Upgraded to**... - [Curl](https://curl.se/) 8.4.0 - [LibreSSL](https://www.libressl.org/) 3.8.2 ## [3.4.5] - 2023-09-14 ## - **Added** command-line option `-W` - **Added** tab completion for: - `/cs`, `/chanserv` - `/ns`, `/nickserv` - `/squery` - **Added** the following commands: - `/admin` - `/die` - `/gline` - `/info` - `/ison` - `/kline` - `/rehash` - `/restart` - `/servstats` - `/wallops` - **Added** the following events: - 211 (`RPL_STATSLINKINFO`) - 212 (`RPL_STATSCOMMANDS`) - 216 (`RPL_STATSKLINE`) - 219 (`RPL_ENDOFSTATS`) - 242 (`RPL_STATSUPTIME`) - 256 (`RPL_ADMINME`) - 257 (`RPL_ADMINLOC1`) - 258 (`RPL_ADMINLOC2`) - 259 (`RPL_ADMINEMAIL`) - 303 (`RPL_ISON`) - 371 (`RPL_INFO`) - 374 (`RPL_ENDOFINFO`) - **Added** translations - **Did** code improvements ### Windows ### - **Fixed** a bug which caused the program to exit silently without any message. This when turning logging on for a window. The solution was to replace `fprintf()` with `fprintf_s()`. ## [3.4.4] - 2023-07-29 ## - **Added** a man page that describes how to write themes. - **Added** and made use of a pointer validation function. - **Added** improved unicode support in the **printtext** and **readline** modules. - **Added** usage of a binary search algorithm. - **Added** validation of nicknames before they go into the names hash table. - **Allowed** the names htbl modify API to alter names even if the list is incomplete. (But only in ICB mode.) - **Changed** the file suffix for theme files from `.the` to `.thm`. (`.the` looks too much like the English word "the".) - **Closed** an open stream before exit - **Defined** noreturn for C++ in `fallbackattrs.h` - **Fixed** hardcoded function names in error messages - **Fixed** unchecked return values - And more... ## [3.4.3] - 2023-03-10 ## - **Added** code improvements: - **Added** constructors/destructors - **Added** improved algorithms - **Added** usage of initializer lists - **Added** usage of new/delete - **Deleted** unused includes - ... - **Added** event `320` (the same as `275` and `671`, whois ssl) - **Added** MULTIPLE new translations ## [3.4.2] - 2023-02-22 ## - **Added** usage of typedefs (`STRING`, `CSTRING`, `errno_t`, ...) - **Fixed** printtext() bugs due to not checking if the wide character passed to `wcrtomb_s()` or `wcrtomb()` is a null character. ## [3.4.1] - 2023-02-18 ## - **Changed** the requirements for checking if a connection is lost. (The change avoids flooding the server with PING commands better.) - **Improved** algorithms. - **Optimized** commonly used functions for speed. - **Replaced** C-style casts in C++. ### Windows ### - **Fixed** missing DLLs. Unfortunately some DLLs were missing after adding the dependency on Hunspell. Since I am running a dev environment I had them my PATH and therefore didn't notice it. ## [3.4.0] - 2023-02-10 ## - **Added** a SOCKS proxy client - **Added** command `/fetchdic` - **Added** destruction of null bytes on receive where appropriate - **Added** spelling support with Hunspell - **Added** the following config options: - `socks` (bool) - `socks_atyp` (int) - `socks_host` (string) - `socks_port` (string) - `spell` (bool) - `spell_lang` (string) - `spell_syswide` (bool) - **Added** usage of `emplace_back()` - **Fixed** possible crashes ### Windows ### - **Fixed** launch by toast. (COM appends the `-Embedding` flag to the args passed, which caused troubles.) - It is no longer necessary to enable the option "Use Unicode UTF-8 for worldwide language support", because this is now done in the exe-manifest, only for Swirc. - **Upgraded to**... - [Curl](https://curl.se/) 7.87.0 - [LibreSSL](https://www.libressl.org/) 3.6.2 ## [3.3.9] - 2023-01-07 ## - **Added** micro optimizations - **Added** rules for nickname highlighting - **Added** SASL auth mechanism: **external** - **Added** support for the **GNU Hurd OS** - **Added** tab completion for: - `/connect` - `/time` - `/version` - **Added** the following commands: - `/qbot` - `/stats` - **Added** the following config options: - `cmd_type_prot` (bool) - `ctcp_reply` (bool) - `qbot_host` (string) - `sasl_x509` (string) - **Improved** tab completion for: - `/msg` - `/notice` - `/whois` ### Linux ### - **Fixed** building on riscv64. Contributed by [Eric Long](https://github.com/hack3ric) - thanks! ## [3.3.8] - 2022-11-27 ## - **Added** an ident protocol daemon (which is OFF by default) - **Added** and made use of `printf_and_free()` - **Added** exception handling - **Added** tab completion for `/theme` - **Added** the following config options: - `awaymsgs_in_privconv` (bool) - `identd` (bool) - `identd_fakenames` (bool) - `identd_port` (int) - **Added** the following events: - 413 (`ERR_NOTOPLEVEL`) - 414 (`ERR_WILDTOPLEVEL`) - 415 (`ERR_BADMASK`) - **Added** usage of `__func__` - **Added** usage of `printtext_print()` - **Deleted** commented-out code - **Deleted** unused includes - **Did code refactoring** - **Fixed** display of IPv6 addresses in event 338 - **Fixed** verification of the X509 certificate presented by the peer - **Made** const arrays static const - **Made** improvements to the following files: - `commands/theme.c` - `network.cpp` - `printtext.cpp` - **Moved** `squeeze_text_deco()` to a separate file - Reduced VA args in printtext calls ### Windows ### - Upgraded to [LibreSSL](https://www.libressl.org/) 3.6.1 ## [3.3.7] - 2022-10-22 ## - **Added** code to the following scripts: - `posixshell/link_with_gnu_libidn.sh` - `posixshell/link_with_libnotify.sh` - **Added** preprogrammed IRC network [OFTC](https://www.oftc.net/) - **Added** usage of `swircpaths.h`, a header which is automatically generated during the build process. - **Fixed** a case of a possibly negative array subscript ### Windows ### - **Fixed** a bug that made Swirc fail to start with error `renamed executable`. This was due to that `_get_pgmptr()` signaled success but stored an empty string, which only occurred on some Windows setups. (Reported by [cpkio](https://github.com/cpkio) - thanks!) ## [3.3.6] - 2022-10-05 ## - **Added** cryptographic functions - **Added** subcommand `passwd_s` to `/sasl` which can be used to securely store encrypted SASL passwords in `swirc.conf`. The encryption technique practice the use of **AES** and **SHA**. - **Added** tab completion for - `/msg` - `/notice` - `/sasl` - **Changed** the program behavior to - jump between ICB and IRC mode depending on the port number - **not** create core dump files if `NDEBUG` is defined at compile time - **not** echo the server password on input (command line flag `-p`) - **Fixed** a bug so if a connection attempt fails it's possible to reconnect again after `/disconnect`. - **Fixed** code duplication - **Fixed** insufficient out of range check, off-by-one, in command `/unignore`. - Made small improvements - **Added** usage of C++17 fallthrough attr - **Added** usage of `PATH_MAX` - **Added** usage of `__func__` instead of hardcoding it (for example in error messages) - **Fixed** redundant checks - Reduced scope of variables - Switched to usage of 'sizeof' in `BZERO()` calls - ... - Prevented the config hash table from being paged to the swap area. - **Rewrote** `commands/sasl.c` in C++ - **Updated** preprogrammed IRC servers - **Added** port numbers and server descriptions - **Added** the [IRCNow](https://ircnow.org/) network - **Deleted** the [Blitzed](http://blitzed.org/) network ## [3.3.5] - 2022-07-28 ## - **Added** command `/cap` - **Added** config option `iconv_conversion` (bool) - **Added** config option `mouse_events` - **Added** new translations - **Added** usage of `noexcept` and installed a terminate handler - **Changed** the startup screen to show the current language - **Fixed** C style casts in C++ - **Fixed** SASLprep by switching to usage of `stringprep_profile()`. Prep now works on Windows too! - **Fixed** memory leaks - **Fixed** unhandled exceptions - Improved memory handling - Improved the contents of `/help` - Completed translating everything to Swedish - **Made** config option `mouse` change take affect at once - **Made** improvements to `events/cap.c` - **Made** small optimizations - **Made** the dot mo files available for read operations with `unveil()` - Updated the TODO :-) ### Windows ### - Added a GNU bundle containing: 1. [gettext runtime](https://www.gnu.org/software/gettext/) 0.21 2. [libiconv](https://www.gnu.org/software/libiconv/) 1.17 3. [libidn](https://www.gnu.org/software/libidn/) 1.38 - Fixed missing DLL file `libiconv-2.dll`. I had it in my PATH so I didn't notice it. ## [3.3.4] - 2022-05-04 ## - **Added** a TLS server (to be used in a future version) - **Added** config option `mouse` (defaults to **no**) - **Added** config option `server_cipher_suite` - **Added** creation of OpenSSL scripts - **Added** event 335 (`RPL_WHOISBOT`) - **Added** global hashfunctions - **Added** preprogrammed IRC network [AlphaChat](https://www.alphachat.net/) - **Added** scrolling using the mouse - **Added** theme item: - `nicklist_my_nick_color` - `whois_bot` - **Added** translations - **Changed** the statusbar to display readline stats - **Converted** - `commands/services.c` -> `commands/services.cpp` - `config.c` -> `config.cpp` - **Defined** `SLASH` once - **Defined** and made use of: - `UNUSED_PARAM()` - `UNUSED_VAR()` - `colorarray_t` - `g_beginthread_failed` - `g_received_welcome` - `usage_t` - **Fixed** bugs discovered with protocol fuzzing - Handle PRIVMSGs from "my" server - Handle truncation of ICB messages, i.e. allow longer messages than `ICB_MESSAGE_MAX`. - Improved scrolling - Made refactoring to multiple files - Moved the names hash table modify API - Print PRIVMSGs to irc channels from users that aren't in them. (No lookup error.) - Reduced code duplication - Reformatted and reindented files ### Windows ### - **Added** GNU LibIntl 0.19.8.1 which is part of [gettext](https://www.gnu.org/software/gettext/) - [Curl](https://curl.se/) 7.83.0 - [LibreSSL](https://www.libressl.org/) 3.5.2 ## [3.3.3] - 2021-11-27 ## - **Added** event `531`. Undocumented in the RFC. (You cannot send CTCPs to this user whilst they have the +T `u_noctcp` mode set.) - **Added** event `728` and `729`. Undocumented in the RFC. Channel Quiet List. - **Added** function `xstrnlen()` and made use of it - **Added** new [Libera Chat](https://libera.chat/) servers - **Added** null checks - **Deleted** unused includes - **Fixed** macro redefinitions - **Fixed** unchecked return values - Made improvements to the following files: - `commands/invite.c` - `commands/notice.cpp` - `commands/services.c` - `events/invite.cpp` - `events/wallops.cpp` - `assertAPI.c` - `errHand.c` - `icb.c` - Added status message `Idle-Mod`. - Added status message `Timeout`. - `readlineTabCompletion.c` - Refactoring - ... - Reformatted and reindented files: - `commands/me.c` - `commands/msg.c` - `commands/squery.cpp` - `commands/znc.cpp` - `events/account.cpp` - `events/banlist.cpp` - `events/servlist.cpp` - `statusbar.cpp` - `titlebar.c` - ... ### Debian ### - Added patches ### Windows ### - Upgraded to [LibreSSL](https://www.libressl.org/) 3.4.2 ## [3.3.2] - 2021-10-17 ## - **Added** command line option `-j` - **Added** function `getuser()` and made use of it - **Added** null checks - **Added** the following command aliases: - `/j` (`/join`) - `/p` (`/part`) - **Added** the following commands: - `/ignore` - `/unignore` - **Fixed** unchecked return values - Made improvements to the following files: - `commands/connect.c` - `events/channel.cpp` - `events/misc.cpp` - `events/notice.cpp` - `events/privmsg.cpp` - `events/welcome.cpp` - `events/whois.cpp` - `dataClassify.c` - `log.c` - `nestHome.c` - Reformatted and reindented files - **Rewrote** the `/join` and `/part` commands in C++ - **Updated** the translations ### Windows ### - **Fixed** terminal resizing. (Increasing the size is ok.) - The [PDC](https://pdcurses.org/) library has been rebuilt with the option `UTF8=Y` which makes PDCurses ignore the system locale. So for Windows computers running Swirc UTF-8 is now forced. This means you should enable the option **Use Unicode UTF-8 for worldwide language support**. In order to do so under Windows 10: 1. Language preferences 2. Administrative language settings 3. Change system locale 4. Check the option and click OK ## [3.3.1] - 2021-09-03 ## - **Added** command line option `-R` (Disable TLS/SSL peer verification) - **Added** configuration flag `--without-libintl` - **Added** key F1 (Output help) - Configuration option `joins_parts_quits` now defaults to **NO** - Documented F5 - F10 in command `/colormap` - **Fixed** "no text to send" bug - Made improvements to the following files: - `events/auth.c` - Translated parts to **German**, **Finnish**, **French** and **Swedish**. ## [3.3.0] - 2021-06-27 ## - **Added** function `errdesc_by_last_err()` and made use of it - **Added** key F3 (scroll nicklist up) and F4 (scroll nicklist down) - **Added** new modes and options for TLS/SSL connections - **Added** nicklist - **Added** null checks - **Added** preprogrammed network name [libera](https://libera.chat/) - **Added** support for partial writes in `net_ssl_send()` - **Added** theme item `nicklist_nick_color` - **Added** theme item `nicklist_privilege_color` - **Added** theme item `nicklist_vline_color` - Asserted that the program is terminated correctly - **Defined** and made use of `addrof()` - **Defined** and made use of `g_textdeco_chars` - Deleted `ToastActivator_i.c` - Deleted `ToastActivator_p.c` - Deleted `dlldata.c` - Deleted command `/n` - Explicitly set client mode for TLS/SSL connections - **Fixed** "use after free" bug in `/cycle` - **Fixed** a bug in `/quit` that resulted in SIGPIPE due to calling `SSL_shutdown()` on an already shutdown socket. - **Fixed** the behavior of `net_ssl_recv()` by checking the condition of `SSL_pending()`. - **Fixed** unchecked return values - Made improvements to the following files: - `io-loop.c` - `irc.c` - `network-openssl.c` - `network.cpp` - `pthrMutex.c` - `readline.c` - `readlineAPI.c` - `sig-unix.c` - `sig-w32.c` - `vcMutex.c` - `window.c` - Modified the scrolling behavior - Moved defines - Reformatted and reindented files - Renamed functions and patterns - **Rewrote the printtext module in C++ and made multiple improvements**! - Upgraded to: - [Curl](https://curl.se/) 7.77.0 - [LibreSSL](https://www.libressl.org/) 3.3.3 ## [3.2.7] - 2021-03-13 ## - Added checking of `term_is_too_small()` - Added null checks - Defined `g_conversion_failed` and made use of it - Defined `g_time_error` and made use of it - Fixed a bug that could lead to null pointer comparison - Fixed limited prompt length - Fixed stricter checking of channel names - Fixed unchecked return values and made code improvements - Improved automatic resizing - Reduced code duplication - Rewrote `event_invite()` and thus fixed a vulnerability that imply that a malicious IRC server message could cause a crash. (Reported by Michael Ortmann.) - Rewrote `events/names.c` using C++ and made various improvements ## [3.2.6] - 2021-02-17 ## - Added logging of program name and PID for debug/error messages - Added tab completion for: - `/help` - `/znc` - Fixed multiple non-ANSI function declarations - Fixed multiple sign-compare warnings - Fixed unchecked return values - Improved the configure script - Splitted the configure script into smaller parts - Made functions that yet weren't declared at file scope to be - WIN32: fixed behavior in `/quit` - WIN32: upgraded to [LibreSSL](https://www.libressl.org/) 3.2.4 ## [3.2.5] - 2020-10-09 ## ### Added ### - Command - `/servlist`: used to list services currently connected to the network. - `/squery`: used for communication with irc network services. - `/znc` (for communication with [znc](https://www.znc.in/)) - Event - 234 (`RPL_SERVLIST`) - 235 (`RPL_SERVLISTEND`) - 493\. Undocumented in the RFC. ngIRCd: `You must share a common channel with [...]`. ### Changed ### - `network-openssl.c`: `suite_secure`: `TLSv1.3:TLSv1.2+AEAD+ECDHE:TLSv1.2+AEAD+DHE` - From obsolete `ctime()` calls to instead use `strftime()` - To seed the random number generator using a new approach. (The deterministic RNG isn't used in a security context anyway.) ### Fixed ### - Command-line option `-P`. (It disabled SASL authentication but didn't end IRCv3 capability negotiation.) ### News ### - [LibreSSL](https://www.libressl.org/) 3.1.4 ## [3.2.4] - 2020-04-08 ## ### Added ### - Improved documentation - More colors for Windows and a synchronized colormap - Make target (`check`) for running unittests - Command-line option - `-C` (Do not change color definitions) - `-P` (Permanently disable SASL authentication) - Tab completion for - `/query` - `/whois` ### Changed ### - Display logging in statusbar ### Fixed ### - A possible out-of-bounds read/write array operation ## [3.2.3] - 2020-03-22 ## ### Added ### - Code improvements ### Changed ### - Multiple events to use try-catch blocks - Stopped using `free_not_null()` as `free()` handles null ### Fixed ### - Color 11 ## [3.2.2] - 2020-03-17 ## ### Added ### - **Multicolor support**. For terminals supporting minimum 256 colors. - Command - `/colormap` - `/echo` - Tab completion for `/set` ### Fixed ### - Color (Note: For terminals supporting minimum 16 colors) - Grey - Light Grey - Multiple occurrences where: - Pointer parameters could be declared as pointing to const - Tab completion bugs ## [3.2.1] - 2020-03-01 ## ### Added ### - **Code improvements** - Fetching of the Mozilla CA certificate store (in PEM format) for Windows builds - Improved help and documentation - Updated setver script :-) ### Fixed ### - Multiple occurrences where: - Pointer parameters could be declared as pointing to const - Previously assigned value to a variable hasn't been used ## [3.2.0] - 2020-02-13 ## ### Added ### - **Logging**. Which can be toggled on/off with CTRL+L per window and works while IRC connected. The default is off for all windows. - **Tab completion** - Better detection for connection loss ### Changed ### - For C++, prefer `const_cast` and `static_cast` respectively, instead of C style casts. ### Fixed ### - Possibly lossy type conversions - Readline bugs ## [3.1.1] - 2019-12-22 ## ### Fixed ### - Possible readline deadlock ### News ### - [Curl](https://curl.haxx.se/) 7.67.0 - [LibreSSL](https://www.libressl.org/) 3.0.2 ## [3.1.0] - 2019-12-06 ## ### Added ### - Command-line option - `-4` (Use IPv4 addresses) - `-6` (Use IPv6 addresses) - `-d` Debug logging - Event - 464 (`ERR_PASSWDMISMATCH`) - Preprogrammed network name: - [afternet](https://www.afternet.org/) - [blitzed](http://blitzed.org/) - SASL auth mechanism [SCRAM-SHA-256](https://tools.ietf.org/html/rfc7677) ### Changed ### - Made command `/say` available for ICB ### Fixed ### - Command-line option `-p` (which queries the user for a connection password). It has been broken for some time but I haven't noticed it until now. - Connection to a IPv6-only host. (Reported by Ross Richardson). - Reconnection with connection password ### Updated ### - Help for command - `/connect` - `/sasl` ## [3.0.0] - 2019-10-31 ## ### Added ### - **SUPPORT FOR THE ICB PROTOCOL** - Command - `/beep` - `/boot` - `/group` - `/kill` - `/passmod` ### Changed ### - Error messages (in order to improve them) ### Fixed ### - Better reconnection - Improved functions - Multiple occurrences of `Conditional expression should have essentially Boolean type` - Spelling errors ## [2.9.0] - 2019-09-10 ## ### Added ### - **Code improvements** - Cleaner auto-generation of configs and themes - More color pairs ### Changed ### - Tell if a command is unknown - Tell if away from keyboard ### Deleted ### - `say()` ### Fixed ### - Colorized statusbar ### News ### - [PDCurses](https://pdcurses.org/) 3.9 ## [2.8.0] - 2019-07-16 ## ### Added ### - Command - `/ban` + `/unban` - `/kickban` - `/op` + `/deop` - Event - 696\. Undocumented in the RFC. (You must specify a parameter for the key mode). - 698\. Undocumented in the RFC. (Channel ban list does not contain `...`). - Preprogrammed network name [anonops](https://www.anonops.com/). ### Changed ### - `RPL_BOUNCE`->`RPL_ISUPPORT` - `SW_NORET`->`NORETURN` - Don't shutdown irc connection on runtime error in: - `event_join()` - `event_kick()` - `event_part()` ### Deleted ### - `swirc_wprintw()` due to deprecation ### Fixed ### - Reported by [MAGA](https://github.com/MakeItGreatAgain): - Issues with protocol colon escaping - Reproducible crash from protocol fuzzing - `/cycle` fails when a channel key is in use - Reproducible crashes from protocol fuzzing ## [2.7.2] - 2019-05-26 ## ### Added ### - **A rewritten interpreter** - **Linux**: hardened builds - Code improvements - Event - 416\. Officially undocumented. (output too large, truncated) - Improved help for command - `/mode` - `/theme` - `/who` ### Changed ### - Install-destination of the manual pages ### Fixed ### - Missing null checks ## [2.7.1] - 2019-04-26 ## ### Added ### - A banner in WiX ### Changed ### - Names module to use DJB2 hashing (for more efficient results) ### Fixed ### - Impact of a possibly uninitialized variable - Possible resource leaks - Unchecked return values ### News ### - [LibreSSL](https://www.libressl.org/) 2.9.1 ## [2.7.0] - 2019-04-20 ## ### Added ### - Command - `/cleartoasts` - Improved help for command - `/join` - `/set` - Option - `beeps` ### Changed ### - Configure script messages - Default values for the following options: - `nickname` - `real_name` - `username` - UNIX: Produce a stripped executable - WIN32: Compile with O2 ### Deleted ### - Option - `disable_beeps` ### News ### - [Curl](https://curl.haxx.se/) 7.64.1 - [LibreSSL](https://www.libressl.org/) 2.8.3 ## [2.6.1] - 2019-03-30 ## ### Added ### - Algorithm improvements - The possibility of desktop notifications with the help of configure flag `--with-libnotify` ## [2.6] - 2019-03-21 ## ### Added ### - Code improvements - Event - **PONG** - 451 (`ERR_NOTREGISTERED`) - Option - `joins_parts_quits` (Show JOIN/PART/QUIT events?) - `reconnect_backoff_delay`: The number of seconds that should be added to each reconnect attempt (0-99) - `reconnect_delay`: Seconds to consume before the first reconnect attempt (0-999) - `reconnect_delay_max`: Maximum reconnect delay in seconds (0-999). Regardless of the other related reconnect settings. - `reconnect_retries`: If the IRC connection is lost, how many attempts should be performed to get the connection working again before giving up? ### Changed ### - **Lowered recv/send timeouts during connection establishment for faster processing** - Don't require irc connection for command `/disconnect` - Scrolling behavior with the help of `arc4random()` ### Fixed ### - Bugs in command - /kick - /part - Typos ### News ### - [PDCurses](https://pdcurses.sourceforge.io/) 3.8 ## [2.5] - 2018-12-21 ## ### Added ### - Extended help for ALL commands ### Changed ### - Toast activated launch argument ### Deleted ### - Windows: `SpawnMessageLoop()` happened to be a *mistake* and was therefore deleted! ### Fixed ### - **Cases of missing deinitializations regarding names in a channel!** - **Thread termination!** ### News ### - Readline is now non-blocking during connection to a server! - Reorganized changelog :-) - Windows: **Improved installer** ## [2.4] - 2018-11-11 ## ### Added ### - Event AWAY - Option - `away_notify` - `invite_notify` ### Changed ### - Rewrote - `event_cap()` - `event_privmsg()` - ... - **MULTIPLE** functions to use try-catch blocks ### Fixed ### - **A dependency on uninitialized memory!** - Memory leaks - Off-by-one error ### News ### - Curl 7.62.0 - LibreSSL 2.8.2 ## [2.3] - 2018-10-24 ## ### Added ### - A `swirc.conf` manual page - Command /oper - Event - `ACCOUNT` - `WALLOPS` - 381 (`RPL_YOUREOPER`) - 491 (`ERR_NOOPERHOST`) - 908 (`RPL_SASLMECHS`) - Option - `account_notify` - `auto_op_yourself` ### Changed ### - **Option `ircv3_server_time` is now working** ### Deleted ### - Option - `encoding` - `recode` ### News ### - **OpenBSD**: Uses `unveil()` if available - **Windows**: Passes tests of Windows App Certification Kit ## [2.2] - 2018-09-30 ## ### Added ### - Option - `ircv3_server_time` **currently a no-op** - `nickname_aliases`. A space separated list of nickname aliases which are used, in addition to the default nickname, to highlight a message if it matches any of the aliases given by this setting. - Several code improvements - Unit tests for - `is_alphabetic()` - `is_numeric()` - Windows 10 toast notifications ### Changed ### - Certain error messages - Output Swirc homepage on CTCP version reply ### Fixed ### - Possibly lossy conversions - Some functions that should be static, but weren't... ### News ### - **Windows**: MSI installer ## [2.1] - 2018-05-21 ## ### Added ### - Command /set - New build system for - UNIX - Windows - Unit tests for - `int_diff()` - `int_sum()` - `size_product()` - `squeeze_text_deco()` - `sw_strcat()` - `sw_strcpy()` - Use of `size_product()` in multiple places ### Changed ### - **Linux**: fix cflags with pkg-config - Name of function - `Strcolor` to `strColor` - `Strdup_printf` to `strdup_printf` - `Strdup_vprintf` to `strdup_vprintf` - `Strfeed` to `strFeed` - `Strings_match_ignore_case` to `strings_match_ignore_case` - `Strings_match` to `strings_match` - Send `/whois` on `spawn_chat_window()` when on air and the window isn't an irc channel. - The printtext color map ### Fixed ### - Building for NetBSD ### News ### - Curl 7.60.0 - LibreSSL 2.7.3 - PDCurses 3.6 ## [2.0] - 2018-02-24 ## ### Added ### - Command alias - /cs (for chanserv) - /ns (for nickserv) - Event - 465 (`ERR_YOUREBANNEDCREEP`) - 466 (`ERR_YOUWILLBEBANNED`) - `size_to_int()` which asserts given conversion isn't lossy - `xfopen()` which is a wrapper for `fopen` and `fopen_s` - `xmbstowcs()` which is a wrapper for `mbstowcs` and `mbstowcs_s` - `xstrerror()` which is a wrapper for `strerror_s` and `strerror_r` ### Changed ### - **Windows**: always produce UTF-8 output ### Fixed ### - Errors in the license (more specifically in the disclaimer) ## [1.9] - 2017-11-12 ## ### Added ### - Key - CTRL+a (move to beginning of line) - CTRL+e (move to end of line) ### Changed ### - **Windows**: Machine type from x86 to x64 which means that a **64-bit executable** will be built next time ### Fixed ### - **Windows**: Library issues causing the newly introduced command /sasl to work improperly ## [1.8] - 2017-10-27 ## ### Added ### - Command /sasl - Event - 462 (`ERR_ALREADYREGISTRED`) - 486 (You must log in with services to message this user) - 901 (`RPL_LOGGEDOUT`) - 902 (`ERR_NICKLOCKED`) - 903 (`RPL_SASLSUCCESS`) - 904 (`ERR_SASLFAIL`) - 905 (`ERR_SASLTOOLONG`) - 906 (`ERR_SASLABORTED`) - 907 (`ERR_SASLALREADY`) - Key - F11 (close window) - F12 (close all private conversations) - Many small improvements - Option - `sasl` - `sasl_mechanism` - `sasl_password` - `sasl_username` - Support for SASL authentication during registration process - Tor hidden service to freenode servers ### Fixed ### - **Browsing the command history caused the program to freeze if the next/prev command exceeded a certain count!** ## [1.7] - 2017-08-12 ## ### Added ### - Command /theme for management of themes on-the-fly - Enhancements to the printtext module - Event 442 `ERR_NOTONCHANNEL` - Theme item `slogan` - WIN32: use of function `MessageBox()` in the errHand module ### Changed ### - Theme item `sw_ascLogotype_color` to `logo_color` - Turned `nodelay()` OFF which reduces CPU usage - WIN32: theme item `term_use_default_colors` will always be set to NO ### Fixed ### - **Buggy behavior of `squeeze_text_deco()`!** ## [1.6] - 2017-05-24 ## ### Added ### - Event - 479 (Illegal channel name) - 716 and 717 (Error responses for CTCP requests) ### Changed ### - The statusbar to display channel modes ### Fixed ### - Occurrences of - possible dereferences of null pointers - usage plain integers as null pointers - **Handle if server sends names for a particular channel twice or more** - `net_ssl_check_hostname`: memory leak. ## [1.5] - 2017-03-05 ## ### Added ### - Config option `cipher_suite`. Valid values are - **secure** - **compat** - **legacy** - **insecure** - Config option `hostname_checking` - Event 461 (`ERR_NEEDMOREPARAMS`) - Function `X509_check_host` for implementations that lacks support for it - Via /connect it's now possible to connect, only by specifying a particular IRC network, preprogrammed networks are: - [efnet](http://www.efnet.org/) - [freenode](https://freenode.net/) - [ircnet](http://www.ircnet.org/) - [quakenet](https://www.quakenet.org/) - [undernet](http://www.undernet.org/) ### Changed ### - ASCII logo - Connection timeout to 45 seconds - Set `ssl_verify_peer` to **YES** even on WIN32 - Statusbar to display user modes - Title for status window (to Swirc homepage) ### Fixed ### - A command history feature bug - Improved TLS/SSL security - Key enter for Windows - Usage for /who. (Parameter mask is mandatory.) ## [1.4] - 2017-02-03 ## ### Added ### - Broadcasting of channel activity if our nickname matches certain patterns - Capability of reading a... - CTCP TIME reply (requested by /time) - CTCP VERSION reply (requested by /version) - Command - /close - /time - /version - Event - 492\. **Official name**: `ERR_NOSERVICEHOST`. **On InspIRCd**: User does not accept CTCPs. - 500\. Undocumented in the RFC. (Only a server may modify the +r user mode) - WIN32: A resource script ### Changed ### - If server port is 6697 automatically set TLS/SSL on ### Deleted ### - Code duplication ### Fixed ### - A bogus behavior in /connect - Better performance - CTCP VERSION reply bug - Save nickname, username and real name automatically to the config if customized by the command-line. - `event_notice`: handle an empty *user@host* combination ## [1.3] - 2017-01-14 ## ### Added ### - Broadcasting of window activity for private messages - Command - /cycle - /rules - /who - Command line option `-i` for ICB mode (Internet Citizen's Band). Plans are to support the protocol but it's **not implemented yet**! - Event - 232, 308 and 309 (numeric replies for /rules -- undocumented in the RFC) - 315 (`RPL_ENDOFWHO`) - 352 (`RPL_WHOREPLY`) - 421 (`ERR_UNKNOWNCOMMAND`) - 435\. Undocumented in the RFC. (Cannot change nickname while banned on channel). - 437 (`ERR_UNAVAILRESOURCE`) - 444 (`ERR_NOLOGIN`) - 477 (`ERR_NOCHANMODES`) - 484 (`ERR_RESTRICTED`) ### Changed ### - **Attention**: Don't verify peer per default on WIN32 on SSL connections due to unable to get local issuer certificate. - Connection timeout to 15 seconds - The prompt for the status window to nothing... - `NAMES_HASH_TABLE_SIZE` to 4500 - `event_notice`: output IRC prefix + params on error. ### Fixed ### - **Instead of using slots for chunks of names** use a linked list! - **Printtext**: switch off all terminal attributes during indentation. - Handle empty *user@host* combination for - `event_join()` - `event_kick()` - `event_part()` - `event_privmsg()` - `event_quit()` - `event_topic_chg()` - Signal 11 when connecting to [Slack](https://slack.com/). ## [1.2] - 2016-09-22 ## ### Added ### - A function to show error log size on startup - Checks for printflike functions - Checks in order to prohibit the program from running with superuser privileges (aka root) - Command history feature - Logging to the error log for settings that are detected with invalid values ### Changed ### - **GNU/Linux and OS X**: compile using optimization level 2. - Command line option `-p`. Instead of taking an argument it will now query the user for a password during connection to an IRC server. - The name of function `PrintAndFree()` to `print_and_free()` and its behavior. Plus multiple commands to use it. - `event_names_print_all()`: adjust the column-width with respect to the longest name in each column. ### Fixed ### - **Printtext**: A problem with converting a wide character to a multibyte sequence due to EILSEQ - A bug regarding that mode +q has different meanings on different server software (IRCd's) - Possible crash due to resizing the terminal while connection is in progress ## [1.1+] - 2016-08-31 ## ### Changed ### - `NAMES_HASH_TABLE_SIZE` to 6500 ### Deleted ### - Duplicated code ### Fixed ### - Absence of *An* macro in the man page - Readline: `session_destroy`: Get rid of possibly issued warning regarding: discards qualifiers from pointer target type. - `src/unix.mk`: provide a standard default target **all** - io-loop: Get rid of zero-length printf format string warnings. (They weren't harmful in the first place.) ## [1.1] - 2016-08-27 ## ### Added ### - Command - /banlist - /chanserv - /exlist - /ilist - /nickserv - Additional data to the manual page - Event - 324 (`RPL_CHANNELMODEIS`) - 329\. Undocumented. Channel date of creation. - 346-349 (numeric replies to /exlist and /ilist) - 367 (`RPL_BANLIST`) - 368 (`RPL_ENDOFBANLIST`) - 487\. Undocumented in the RFC. An error meaning that /msg target *ChanServ* or *NickServ* is no longer supported (in favor of **/chanserv** and **/nickserv**). - On OpenBSD: restrict system operations by using pledge() if it's available. - Window scrolling capabilities! ### Changed ### - **/msg**: fail if recipient is *ChanServ* or *NickServ*. (Use of the commands **/chanserv** and **/nickserv** should be considered instead.) - Interpreter: handle string truncation when copying an identifier or argument - Look of the output produced by /list - Only call `unget_wch(MY_KEY_RESIZE)` after sleeping for a requested interval. This possibly prevents the program from crashing or the terminal from being hung up due to a "resize attack". - Printtext: replaced unbounded `sw_sprintf` calls with `sw_snprintf` - `textbuffer_size_absolute` now defaults to 1500 ### Fixed ### - An issue - ...regarding the maintenance of channel statistics - ...where the cursor was left at the statusbar (after updating it) - Visible usage of /list - `net_ssl_send`: signed-unsigned mix with relational ## [1.0] - 2016-08-13 ## ### Added ### - Support for multiple encodings: - UTF-8 - ISO-8859-1 - ISO-8859-15 - Command /list - Event - 321-323 (numeric replies for /list) - 334\. Undocumented. At Undernet, it prints out usage describing parameters for the LIST command. - 341 (`RPL_INVITING`) - 412 (`ERR_NOTEXTTOSEND`) - 467 (`ERR_KEYSET`) - 471-474 - 481 (`ERR_NOPRIVILEGES`) - 742 (MODE cannot be set due to channel having an active MLOCK restriction policy). ATM not documented in the RFC. ### Changed ### - The default theme. Color codes that consisted of only one digit were changed to use two digits in some cases. For example: ^C3 changed to ^C03, ^C5 changed to ^C05, etc. Why? Consider a function call like printtext(..., "%s`one or more digits`", Theme(`primary_color`)). If the primary color, in this case, consists of only one digit and is directly followed by `one or more digits` the result is: one digit is lost and a random color will be displayed. ### Fixed ### - As a fallback, instead of printing out "Printtext Internal Error", continue to convert characters even if some are lost due to an invalid multibyte sequence. - Interpretation of color codes in the printtext module. For example: ^C123 didn't display '3' before as it should. ## [1.0b] - 2016-07-30 ## - FIRST OFFICIAL VERSION OF SWIRC!