Source channel mode changes from ChanServ

Channel modes (+r, mode lock, auto-op, enforcement) are sent from the
ChanServ pseudoclient instead of the services server, so users see
ChanServ as the setter. The engine locates the channel-managing service;
the FMODE filter now ignores anything under our SID prefix (server and
pseudoclients) so enforcement can't loop on our own changes.
This commit is contained in:
Jean Chevronnet 2026-07-12 10:18:07 +00:00
parent e785c9d8ac
commit f15c9998be
No known key found for this signature in database
5 changed files with 47 additions and 22 deletions

View file

@ -46,9 +46,10 @@ pub enum NetAction {
// Force a user's nick (SVSNICK), e.g. renaming to a guest nick on logout.
// The protocol stamps the new nick's timestamp.
ForceNick { uid: String, nick: String },
// Set channel modes from services, e.g. +r on a registered channel. The
// Set channel modes from services, e.g. +r on a registered channel. `from` is
// the pseudoclient uid to source it from (empty = the services server). The
// protocol stamps a timestamp the ircd will accept.
ChannelMode { channel: String, modes: String },
ChannelMode { from: String, channel: String, modes: String },
Raw(String),
// Internal only, never serialized to the wire: a registration whose password
// still needs its (expensive) key derivation. The link layer runs the