| Commit message (Expand) | Author | Age | Files | Lines |
| * | Add user_welcome hook•••This hook is executed when the registration burst is being sent to a new
local user, after sending RPL_ISUPPORT but before sending LUSERS output.
Many IRCv3 specifications use this timing as the point to send
additional information during registration bursts, so having an easy
hook point to do that makes implementing such specs possible.
| Ryan Schmidt | 13 days | 1 | -0/+1 |
| * | Add sendto_list_local_* and sendto_monitor_with_capability•••These are needed for METADATA support, and sendto_monitor was refactored
into a common sendto_list_local_internal method used by all of the
newly-added functions as well. Test cases were also added to excercise
the new functions.
| Ryan Schmidt | 13 days | 1 | -1/+9 |
| * | Expand monitor•••- new is_monitoring function that modules can use to determine if a
particular client is monitoring a particular nickname
- new hook that is fired when a user adds a nick to their monitor list
| Ryan Schmidt | 13 days | 1 | -0/+1 |
| * | Make change_isupport useful•••The function now accepts an optional pointer argument to a new struct
that contains all of the data of the previous isupport function (both
callback and data), rather than only returning the previous data
pointer. This in turn allows modules to both call this function to
overwrite an isupport handler in modinit as well as restore the previous
handler in moddeinit (something that was impossible before).
The return value was changed to int, returning 0 if the named isupport
method didn't previously exist and 1 if it did exist, so the caller can
judge whether this function actually accomplished anything.
There were no callers of this function due to it previously being of
questionable use, so no other code needed adjustment.
| Ryan Schmidt | 13 days | 1 | -1/+7 |
| * | Pass block name to conf_start callbacks•••Configuration blocks of the form block "name" { ... } previously were
unsupported in extensions calling add_top_conf because the name portion
was not exposed to anything within the extension. Pass the name along so
callbacks can use that data instead of relying on global state in
newconf.c with static storage duration.
| Ryan Schmidt | 13 days | 1 | -2/+2 |
| * | Move setup.h include above rb_lib.h and fix meson assertion printout•••In autotools, NDEBUG is defined in setup.h, which means we need this included before we include any system headers which depend on it (i.e. assert.h). As such, make this the first include in stdinc.h instead of transitively including it from ircd_defs.h.
Also fix the assertions printout provided to the user as b_ndebug=true disables assertions, rather than enabling them. It also takes an if-release value, so detect that properly too.
| Ryan Schmidt | 2026-07-14 | 2 | -2/+1 |
| * | Update labeled-response code•••The previous API was too error-prone, as evidenced by the large amount
of crash bugs discovered with it. New functions were added to response.h
to more easily manage labeled-response state, and some state tracking
was moved into core (such as CLICAP_RECEIVE_LABEL, which must only ever
be on one client at a time). Because this tracking is now in core,
cap_labeled_response needs to be a core module as having that bit
unloaded will cause issues. m_batch was also moved into being a core
module as more and more core things have depended on batch support
existing (and more will depend on it in the future).
m_list no longer re-uses remote response batches for SAFELIST, instead
making use of new APIs to suspend a labeled-response batch and more
easily resume it.
Batch resumption was made more focused as well, to ensure that we don't
accidentally lose batches due to setting outgoing_response_info to NULL.
The free_response_batch takes a resumption pointer to avoid cases where
we could introduce use-after-free by combining
free+resume_response_batch.
struct ResponseInfo now takes strduped pointers instead of directly
holding the buffers, and some fields were merged into a flags field or
omitted entirely due to new suspension/resumption support. This will
have a minor positive impact on memory usage as we no longer need to
allocate buffers for maximum-sized strings for every labeled-response.
Finally, shorten the dictionary label for pending responses. It was
overflowing its spot in STATS B, making the data after it misaligned.
| Ryan Schmidt | 2026-06-04 | 3 | -13/+40 |
| * | Clean up include/stdinc.h and librb/include/rb_lib.h•••- Unconditionally require stdbool.h in IRCd
We are a C99 project anyway (configure.ac and meson.build both
require a C99 compiler), so this header will always be present
This removes the awful hack defining bool, true, and false in
its absense, which was creating build errors when using meson,
because meson.build did not set the HAVE_STDBOOL_H macro
- Modernise definition of alloca(3) according to GNU guidance
This was in both librb and IRCd, while it only needs to be in
the former
- Fix missing endianness check in librb/meson.build
IRCd and librb both use the WORDS_BIGENDIAN macro, which was
only being set by their configure.ac (with the AC_C_BIGENDIAN
M4 macro)
Since IRCd's stdinc.h includes librb's rb_lib.h, which then
includes librb's librb-config.h, which would have the macro
defined there, we only need to check for it in librb, so we
can remove the endianness check from IRCd's configure.ac and
don't need to add it to IRCd's meson.build
- Use __has_attribute to detect whether compiler attributes are
available
This is supported by gcc (5+), clang (2.9+), and ICC (17+)
- Add a __noreturn macro for __attribute__((__noreturn__)) and
adjust the codebase to use that
- Remove inclusion of headers that are only used by librb
- Remove inclusion of headers that are included in rb_lib.h
because stdinc.h includes rb_lib.h anyway
- Remove the checks for headers and functions from the IRCd
configure.ac and meson.build that are only used by librb
- Alphabetise checks for headers and functions (by the name of
the macro they define) in the meson.build files
- Use check_header() instead of has_header() in meson to see if
it is actually possible to compile code using the header
- Remove dead code using srand48(3) which has never been
compiled because neither build system has ever set the
HAVE_SRAND48 macro and the surrounding code makes no use of
this libc RNG
- Remove the TLS defines from IRCd's meson.build because librb's
meson.build already defines them and IRCd pulls those in
| Aaron Jones | 2026-05-18 | 5 | -125/+22 |
| * | Remove some legacy cruft•••- The hurt extension doesn't work well and is now supplanted by
m_quarantine
- ip_cloaking_old has been broken (causes segfaults) for years now,
remove it
- ip_cloaking_3.0 has hardcoded keys that require .c file edits to be
secure. Anyone using it will probably maintain their fork of this file
anyway, but it's not good for new people to use. Remove that too
- Remove LOCOPS and umode +l entirely; they serve no useful purpose on
unified networks. This also removes the no_locops extension since it
is now useless
| Ryan Schmidt | 2026-05-13 | 2 | -6/+2 |
| * | Fix s2s labeled-response batches•••Previously, batches would end prematurely if they traveled through an
intermediate server before reaching their destination because the
intermediate server would send ENCAP ACK multiple times, causing the
pending server count to go down way too fast. Solve this by introducing
two things:
- Check that the direction of the incoming command matches the direction
we'd be sending the ACK to (avoids sending additional ACKs for replies
from remote servers that we pass along)
- Add a mask parameter to the tracking metadata for remote responses and
only send an ACK if we match the mask. this way things like remote
WHOIS don't generate ACKs from intermediate servers
Additionally, fix our manipulation of outgoing_response_info in m_list
to properly set CLICAP_RECEIVE_LABEL during SAFELIST buffering. The
logic here largely matches that in m_batch.
| Ryan Schmidt | 2026-05-13 | 1 | -2/+6 |
| * | Expand `STATS t` to include batch info•••Two new lines were added at the end of STATS t output to list the number
of pending client-initiated batches (and pending lines in those batches)
as well as the number of pending remote labeled-response batches.
| Ryan Schmidt | 2026-05-13 | 1 | -0/+3 |
| * | Add CLICAP_SERVONLY and CLICAP_FLAGS_NOPROP•••CLICAP_SERVONLY is a client capability that no clients will ever have
(it is not associated with any CAP string), but is included in the
server's client cap mask. Message tags with their capmask set to
CLICAP_SERVONLY will only ever be propagated s2s and will never be sent
or received c2s. This allows for the easy introduction of s2s-only
message tags.
Similarly, a new flag for client capabilities defined by modules was
introduced name CLICAP_FLAGS_NOPROP which indicates that message tags
having a capmask including such a capability MUST NOT be sent s2s.
The CLIENT_CAP_MASK macro in send.c was updated to omit capabilities
marked as CLICAP_FLAGS_NOPROP from what it will send s2s.
| Ryan Schmidt | 2026-05-13 | 1 | -2/+5 |
| * | Add core framework needed by labeled-response•••- new struct ResponseInfo that keeps track of all relevant state for a
labeled-response (whether local or remote)
- event to clean up pending remote labeled-responses that we haven't
gotten responses for (perhaps due to a bad network link with the
remote server, or it doesn't have labeled-response loaded)
- struct Batch grew a new field to track its labeled-response status
- struct Client grew a new linked list to track pending remote
labeled-responses for it, so we can abort them easily if the client
disconnects
- struct ListClient grew a new field to track labeled-response status
for a SAFELIST iteration
- remove arbitrary size limit on batch id generation; it will now
fill the passed-in buffer according to the passed-in buffer size,
leaving room for the null byte at the end.
NULL fields indicate that no responses are being labeled. The actual
population of those fields will happen in future patches; this one
simply provides the core support needed.
| Ryan Schmidt | 2026-05-13 | 3 | -3/+92 |
| * | Change outbound_msgbuf to use its own data struct•••The new struct is ABI-compatible with hook_data for the first 3 fields
so that modules compiled using the old hook definition will continue to
work. The new data enables much richer evaluation during outbound_msgbuf
hook functions by exposing the target or channel the message is being
sent to (if known) as well as whether the message source is a recipient
of the message being sent.
| Ryan Schmidt | 2026-05-13 | 1 | -0/+9 |
| * | Add parse_end hook•••This hook runs after parsing and processing a command, so that any
cleanup that needs to happen after we're finished with parsing can
happen. Some reorganization happened so that we ensure the hook and any
tags processing happens for every event that isn't a parse error.
This will be used by labeled-response in order to automatically send
ACKs or close labeled-response BATCHes after processing client commands.
| Ryan Schmidt | 2026-05-13 | 1 | -0/+1 |
| * | include/serno.h.SH: correct check for git directory•••Commit 6ba61b33f7ec557c02c1 split this logic up from the top
level Makefile.am but then failed to adjust the path to the
directory in the check
The result is that all builds now use a datecode of 0 and a
revision of "unknown"
| Aaron Jones | 2026-05-12 | 1 | -1/+1 |
| * | Automatically rehash when modules change conf•••When loading a module that modifies config (add/remove conf items or top
conf sections), we now queue a rehash operation so that new config can
be immediately applied. A new rb_defer_once() function was added to
deduplicate these rehash requests so that at most one rehash will occur
regardless of how many modules change conf.
| Ryan Schmidt | 2026-04-29 | 1 | -0/+2 |
| * | Unify the preprocessor macro for OpenSSL support•••Commit 9a1ee1b64ed660164197 introduced support for building IRCd
with Meson. It defines the "HAVE_OPENSSL" preprocessor macro
for both IRCd and librb. While librb does use that macro, IRCd
unfortunately uses only the "HAVE_LIBCRYPTO" macro instead, set
implicitly by AC_CHECK_LIB from autotools.
Make the autotools build system define HAVE_OPENSSL (to unify
IRCd with librb) and change IRCd to use that.
| Aaron Jones | 2026-03-22 | 3 | -7/+7 |
| * | Tidy up module loading code•••The existing code had several defects:
- Core module file names were hardcoded, while autoloaded non-
core module filenames were not. Code that loaded core modules
had a different but in some places duplicated structure to the
code that loaded autoloaded modules.
- Module loading for autoloaded modules happened in dentry
order, making it unpredictable from one server to the next, or
even across instances of `make install` on the same server.
- Module loading for autoloaded modules did not verify that the
dentry was a file before trying to load it.
- An IRCd start (or a conftest) only printed lines about loading
modules mentioned in the configuration file.
- The configuration file was parsed before loading core and
autoloaded modules, meaning any modules specified in the
configuration file would be loaded first.
- Once a module was loaded, it was added to the head of the
module list, making MODLIST show them in reverse loaded order
(newest (re)loaded modules at the top of the list).
These are addressed as follows:
- We now scan the core and autoload module directories and use
this to determine which modules to load.
- We now sort the dentries according to their filename before
iterating them to load them, making module load order finally
deterministic.
- We now test if a dentry is actually a file before trying to
load it.
- We now print a message to the console (if running in
foreground or conftest mode) when loading any module,
including core and autoloaded modules.
- The message printed to the console now has the IRCd module
directory prefix stripped from it if it matches.
- The configuration file is now parsed after loading core and
autoload modules.
- The modules are added to the module list in the order that
they are loaded. This now makes MODLIST show the order that
modules were (re)loaded in.
Modifications to two modules are part of this effort:
- The autoload module `m_alias` relied upon the alias dict not
being NULL when loaded, but this is only the case after the
configuration file has been parsed.
The module already had a "rehash" hook to destroy all existing
aliases and create new ones, so we can just make the module do
nothing on load (remove its modinit function) and change it to
use the "conf_read_end" hook instead of the "rehash" hook, and
it will still create aliases after the configuration file is
subsequently parsed.
With this modification, there are now no in-tree consumers of
the "rehash" hook.
- The autoload module `m_services` iterated `service_list` upon
loading it, which will now be empty (a no-op) since the module
is loaded before configuration file is parsed.
This module too handles the configuration file being parsed
with a "conf_read_end" hook and takes the appropriate action,
so we can just remove this code from its modinit function.
All other modules' modinit functions have been audited for
behaviour like this; there was nothing of note.
| Aaron Jones | 2026-03-22 | 2 | -4/+1 |
| * | Add no-implicit-names client capability•••This has been recently ratified and suppresses NAMES output during
channel joins when enabled, providing for a decent chunk of bandwidth
savings.
| Ryan Schmidt | 2026-03-19 | 1 | -0/+1 |
| * | build: add Meson buildsystem | Valentin Lorentz | 2026-03-17 | 1 | -0/+26 |
| * | build: split serno generation out into a script | Valentin Lorentz | 2026-03-17 | 3 | -0/+20 |
| * | Remove channel::kick_on_split_riding•••This feature had numerous pitfalls (such as not checking +beI) and
services does it better than we can. Remove it and alert opers that the
feature no longer exists if they had it configured.
| Ryan Schmidt | 2026-03-17 | 1 | -1/+0 |
| * | Unconditionally include <stdint.h> in stdinc.h•••Previously we relied on an inclusion from librb-config.h which was
generated via the configure script. This seemed unwise, so add it to our
list of standard includes. This replaces a superfluous include of
stdio.h since we included it twice for some reason (check two lines down
from the changed line for the other location)
| Ryan Schmidt | 2026-03-17 | 1 | -1/+1 |
| * | Adjust unsigned int -> uint64_t for all caps•••The previous commit addressed the issue with (most) function signatures,
but forgot to update the caps themselves to be 64-bit. This fixes that,
and finishes the remaining overlooked function signatures.
| Ryan Schmidt | 2026-03-17 | 4 | -36/+36 |
| * | Apply review suggestions•••Also made full use of the Set/Clear macros across the codebase so
there's fewer places to touch in the future if changes are needed.
| Ryan Schmidt | 2026-03-17 | 1 | -6/+8 |
| * | Separate client vs server caps•••Instead of overloading the same field in a LocalUser, have separate
fields for client caps vs server caps. While only one of these will ever
be nonzero, it reduces error by making it explicit which set of caps is
being checked. IsCapable and friends have been split as well, to
IsClientCapable and IsServerCapable. Finally, both fields have been
updated to uint64_t (server caps were approaching the current limit) and
all APIs that reference caps updated to uint64_t as well (no more
signed/unsigned mismatches).
| Ryan Schmidt | 2026-03-17 | 6 | -42/+46 |
| * | Pass msgbuf to PART's privmsg_channel hook and propagate PART tags•••The privmsg_channel hook gained a new msgbuf member which was
uninitialized in m_part. Properly pass the msgbuf to that parameter and
propagate any tags set by the hook to downstream servers.
This requires introducing sendto_server_tags(), and I refactored
sendto_server() to call the same helper internal method as
sendto_server_tags(). I took the opportunity to update the method to use
msgbuf instead of linebuf directly (meaning sendto_server() now calls
outbound_msgbuf).
Fixes #484
| Ryan Schmidt | 2026-01-22 | 1 | -0/+4 |
| * | Add doing_info_conf hook and cleanup unused hooks•••doing_info_conf is called during INFO commands after all conf options
have been sent to opers. Modules can use this hook to expose any conf
options they define by sending relevant RPL_INFO replies to the oper.
This addition removes the final barrier to defining new ircd.conf
options inside of extension modules rather than requiring core changes
for extension configuration.
Additionally, some cleanup has been performed for hook definitions that
are not called anywhere inside of solanum. Three hooks were declared in
hook.h as extern int but were not defined or referenced in any other
file: iosend_id, iorecv_id, and iorecvctrl_id. The doing_admin,
doing_info, doing_motd, and doing_trace "spy" hooks were defined in the
module headers for those modules, however the modules never actually
invoked those hooks. All of the lingering declarations for these hooks
have now been removed as they weren't doing anything anyway.
| Ryan Schmidt | 2026-01-21 | 1 | -4/+0 |
| * | Fix msgid tags with echo-message•••msgid generation has been moved to the privmsg_user and privmsg_channel
hooks, which are called on every normal PRIVMSG/NOTICE/TAGMSG. They are
not called when messaging user@server, opers@server, or mass-messages
and as such none of those things will have msgid attached. This seems
fine as user@server is rejected by solanum and exists solely for
messaging pseudoservers, opers@server is turned into a snote, and
mass-messages are oper-only and thus unlikely to need anything that keys
off msgid in the future.
Moving this solves the interaction with msgid and echo-message. Now, we
ensure that an echoed message always has a msgid, and that msgid is
always the same as the msgid shown to other clients.
This requires expanding the hook_data structures for those two hooks.
While a core restart is not needed, attempting to reload tag_message_id
before reloading m_message may cause crashes. When updating your
servers, please reload m_message first.
| Ryan Schmidt | 2026-01-21 | 1 | -0/+2 |
| * | Batch updates•••The extension example_module was extended to introduce a new
client-initiated batch type named test. This is primarily done to ease
testing of the client-initiated portions of m_batch, but also serves as
a useful sketch for how a module can register its own client-initiated
batch types.
The definition of struct BatchHandler was slightly modified to use a
callback function to determine if nesting is allowed. The callback can
additionally set a custom error message if desired when returning false.
The len and messages list in struct Batch no longer include the start
message, so a len of 0 indicates an empty batch. Because the start
message is still allocated and saved off, adjust anything that impacts a
client's pending_batch_lines by 1 to account for the implicit additional
message.
Empty batches now trigger the relevant batch handler. If a handler wants
to no-op on empty batches, it can do so but this allows additional
flexibility for handlers to still do something upon receiving empty
client-initiated batches.
| Ryan Schmidt | 2026-01-21 | 1 | -9/+10 |
| * | Add batch support•••- Add "batch" client capability
- Support sending netsplit/netjoin batches
- Support receiving BATCH from clients and remote servers
- Support for modules to define supported batch types for incoming
batches
- Add "message_handler" hook to override the handler for a particular
incoming message
- Add technical and user-facing documentation for batches
- Add some more sendto_* overloads that support tags which were missing
from the initial message-tags implementation but turned out to be
needed
| Ryan Schmidt | 2026-01-21 | 6 | -8/+121 |
| * | Revert "msgbuf: duplicate the string during partial parse and constify line" ...•••This reverts commit 5b253939da8f6b0a44ce6787ed12e26450ac6a63 to fix a
memory leak:
```
==825564== 818 bytes in 4 blocks are definitely lost in loss record 616 of 648
==825564== at 0x4844818: malloc (vg_replace_malloc.c:446)
==825564== by 0x49CD7A9: strdup (strdup.c:42)
==825564== by 0x4888A2E: msgbuf_partial_parse (msgbuf.c:143)
==825564== by 0x489DA84: build_msgbuf (send.c:276)
==825564== by 0x489DA84: sendto_one_numeric (send.c:431)
==825564== by 0x48A3CD7: show_isupport (supported.c:181)
==825564== by 0x489A9F2: user_welcome (s_user.c:1433)
==825564== by 0x489B114: register_local_user (s_user.c:718)
==825564== by 0x488FC08: handle_command (parse.c:310)
==825564== by 0x488FC08: parse (parse.c:224)
==825564== by 0x488EEF8: parse_client_queued.part.0 (packet.c:67)
==825564== by 0x488F084: parse_client_queued (packet.c:49)
==825564== by 0x488F084: read_packet (packet.c:306)
==825564== by 0x4B3C47B: rb_select_epoll (epoll.c:199)
==825564== by 0x4B3716F: rb_select (commio.c:2038)
==825564==
[...]
==825564==
==825564== 3,012 bytes in 15 blocks are definitely lost in loss record 627 of 648
==825564== at 0x4844818: malloc (vg_replace_malloc.c:446)
==825564== by 0x49CD7A9: strdup (strdup.c:42)
==825564== by 0x4888A2E: msgbuf_partial_parse (msgbuf.c:143)
==825564== by 0x489D3CE: build_msgbuf (send.c:276)
==825564== by 0x489D3CE: sendto_realops_snomask (send.c:1431)
==825564== by 0x4887C0D: load_a_module (modules.c:712)
==825564== by 0x488801D: load_core_modules (modules.c:257)
==825564== by 0x488124A: solanum_main (ircd.c:664)
==825564== by 0x494DCA7: (below main) (libc_start_call_main.h:58)
``` | Val Lorentz | 2025-10-11 | 1 | -1/+1 |
| * | Fix typing module decl and send 417 in more cases•••The typing module declaration had a copy/paste error that has now been
corrected, and we now send 417 ERR_INPUTTOOLONG in cases where parsing
the line into a MsgBuf fails because it overflowed the 8191+512 byte
buffer while processing tags or the message origin.
| Ryan Schmidt | 2025-10-10 | 1 | -0/+9 |
| * | Address review comments•••Correctly sent ERR_INPUTTOOLONG if the incoming tags portion from a
client is too long. The previous calculation did not take into account
the fact we added null terminators after every tag key and value. Since
msgbuf_parse is used for both server and client input, we expose the
length of the original tags portion of the buffer in the MsgBuf struct
rather than abort msgbuf_parse if it is too long, since the only time
truncation is explicitly not allowed is for incoming tags from client
messages.
Additionally, make join_sep functional in format_client_tags().
| Ryan Schmidt | 2025-10-10 | 1 | -0/+1 |
| * | m_message: Implement message-tags and TAGMSG•••The CAP_STAG server capability and the CAP_TAGS server capability
introduced by m_message are redundant, so get rid of CAP_TAGS and update
the comment for CAP_STAG to indicate what it is for. Additionally,
define the message-tags client capability in m_message.
A lot of new sendto_* functions were introduced that take an explicit
array of tags to attach to the outgoing message. New functions were
preferred over updating existing functions in order to maintain
compatibility with non-tags-aware code in both the API and ABI layers.
The updated definitions of these functions will be provided in a
subsequent patch in this PR; however I felt the declarations would be
useful in reviewing the changes to m_message.
A TAGMSG with zero client-only tags is rejected with 412
ERR_NOTEXTTOSEND. While the precise message of that numeric is a little
bit misleading, it was the closest existing thing and matches what we
send off when a PRIVMSG contains no text. The message-tags spec does not
specify any particular error when a TAGMSG contains no tags (indeed it
has a non-normative example where such a TAGMSG is propgated). The spec
also allows for server-side moderation of tags, however, and not
propagating completely useless messages is a valid use of those
moderation powers.
General cleanup of the file was performed as part of this patch.
| Ryan Schmidt | 2025-10-10 | 2 | -5/+22 |
| * | Refactor message_tag hook•••The original hook was defined in the (now-removed) cap_message_tag
module. This new hook lives deeper down in parse.c so that it fires on
all incoming tags for all incoming messages. The hook was renamed from
client_tag_accept to message_tag to denote that it is used for all tags,
including tags coming from server connections, and not just tags with a
client-only prefix.
The hook data contains two non-const fields for the capmask and approval
status. Since incoming tags lack a capmask entirely, this allows hook
functions that wish to keep the tag around to specify the capmask used
for propagating the tag to other clients and servers. The approval
status can take one of three forms: approve the tag, drop the tag from
the message (but still process other tags and run the command handler),
or drop the entire message (not processing any other tags and not
running any command handlers). It is expected when a hook function drops
the message that they'll send appropriate feedback to the client,
however the nature of that feedback will likely vary by hook function so
no default message is given to a client if their message is dropped.
The incoming_message global defined previously with cap_server_time now
holds the MsgBuf with the updated/sanitized list of tags rather than the
raw values specified by the client. Additionally, cap_server_time makes
use of this new hook to propagate the time tag into function callbacks
that support tag propagation. The implicit propagation still exists
since the majority of function callbacks do not support explicit tag
propagation, and that fact will not change in the course of this
patchset.
| Ryan Schmidt | 2025-10-10 | 1 | -5/+19 |
| * | Update MsgBuf for better tags support•••Note: Future commits within this PR update call sites to leverage these
changes. I opted to keep each individual commit smaller to make them
easier to review in series.
When parsing a line into a MsgBuf, we now keep track of whether the
final parameter had a leading colon or not, so that we can roundtrip
unparse it with said colon even if the final parameter lacks a space or
otherwise doesn't require the leading colon. solanum sends multiple such
messages and clients may be coded to expect colons in various
situations, so adding this roundtrip support maintains backwards
compatibility for when all outbound messages get parsed into MsgBuf and
then unparsed before being sent off.
The MsgBuf cache now keeps track of two messages: one with a "local"
source and one with a "remote" source. Many send functions, e.g. the
sendto_channel family, use ids for the sender when sending remotely but
use the hostmask or server name for local sends. When forcing outbound
messages into a parse/unparse loop we can no longer just ad-hoc assemble
strings together like the current linebuf code does, so instead we cache
both variants to avoid needless string formatting operations in tight
send loops.
Unparsing tags from a MsgBuf now enforces that the server tags and
client tags portions do not exceed 4094 bytes each, and that server tags
always come before client tags. Excess data is truncated.
| Ryan Schmidt | 2025-10-10 | 1 | -4/+8 |
| * | Increase tags to 8191 bytes and max count to 30•••If we receive an incoming message from a client that has over 4094 bytes
of tag data (not including leading '@' or trailing ' '), reject the
message with ERR_INPUTTOOLONG (417) per the message-tags spec.
Similarly, give the same numeric if the client specifies the new maximum
of 30 tags, since we can't distinguish between a client that gives us 30
tags and one that gives us more than 30. The spec says we are not
allowed to truncate tags at all, and having 30 means we could have
potentially truncated the incoming tag data.
| Ryan Schmidt | 2025-10-10 | 4 | -3/+7 |
| * | msgbuf: duplicate the string during partial parse and constify line | Raito Bezarius | 2025-10-10 | 1 | -1/+1 |
| * | message-tags: facility to manipulate client-tags•••It provides for hook facilities to client-only tags:
- messages can be dropped silently ;
- messages can be edited ;
- messages can be stripped from a client-only tag
| Raito Bezarius | 2025-10-10 | 3 | -3/+24 |
| * | m_message: proper tag propagation•••This introduces an handler to accept or not the propagation of a tag.
Basic sketch API is provided for modules to hook for providing their own
policy for specific tag propagation.
| Raito Bezarius | 2025-10-10 | 3 | -0/+42 |
| * | Propagate server-time implicitly (ugh) | Ed Kellett | 2025-10-10 | 1 | -0/+3 |
| * | msgbuf: Add msgbuf_get_tag | Ed Kellett | 2025-10-10 | 1 | -0/+2 |
| * | Add STAG server cap | Ed Kellett | 2025-10-10 | 1 | -0/+1 |
| * | Add dedicated hook data type for can_create_channel•••hook_data_can_create_channel includes the name of the channel being created,
which is necessary for any non-trivial restriction of channel creation
as well as sending correct error messages.
The new hook data matches the layout of the previous hook data,
taking advantage of a disused pointer field in hook_data_client_approval
as used by callers of the hook (m_join).
| daemoness | 2025-05-11 | 1 | -0/+7 |
| * | GitHub CI Workflow: Bump OS and compiler versions (#447)•••* GitHub CI Workflow: Bump OS and compiler versions
* CI: fix for clang 18/19
- Don't enable -Werror during the execution of ./configure and
drop -Wunused-value from --enable-warnings
- librb/src/crypt.c: remove old-style function decls
- rb_dictionary: define type of arguments, fix callees
- rb_radixtree: fix spurious out-of-bounds diagnostic
Co-authored-by: Doug Freed <dwfreed@mtu.edu> | Aaron Jones | 2025-02-25 | 1 | -2/+2 |
| * | Don't set the oper flags on client (#443)•••Remove unused OPER_FLAGS logic in favor new priv system. It had rotted over time and was overlapping with PINGSENT | Eric Mertens | 2025-01-29 | 1 | -2/+0 |
| * | Remove WebSocket support | Aaron Jones | 2024-06-12 | 4 | -50/+2 |
| * | extensions/invite_notify: make the NOTICE optional, configurable•••This adds a configuration option that determines whether the NOTICE is
sent to clients that do not support the IRCv3 invite-notify capability.
Requested by LiberaChat MGM.
| Aaron Jones | 2023-11-08 | 1 | -0/+1 |