add +k servprotect umode (server-set-only, advertised in 004/umodes): blocks KILL, KICK and SA* on a network service; tracked for remote services too

This commit is contained in:
Jean Chevronnet 2026-08-16 03:00:25 +00:00
parent 91022cffe8
commit b7600ee5aa
5 changed files with 69 additions and 1 deletions

View file

@ -1165,6 +1165,7 @@ static USER_MODES: &[&(dyn UserMode + Sync)] = &[
&HIDEOPER,
&REGDEAF,
&REGISTERED,
&SERVPROTECT,
&SSLPM,
&SNOMASK,
&CALLERID,
@ -1406,6 +1407,26 @@ impl UserMode for RegisteredMode {
}
}
/// `+k` — servprotect. Set only by a linked server / services (under `mode_sudo`);
/// a client can never toggle it. Marks the user as protected from KILL/KICK/SA*.
struct ServProtect;
static SERVPROTECT: ServProtect = ServProtect;
impl UserMode for ServProtect {
fn letter(&self) -> char {
'k'
}
fn apply(&self, s: &mut Server, uid: Uid, adding: bool) -> bool {
if !s.mode_sudo {
return false; // server/services-only
}
if let Some(u) = s.users.get_mut(&uid) {
u.flags.servprotect = adding;
return true;
}
false
}
}
/// `+s` — server-notice (snomask) receiver. Oper-only to set; anyone may drop it.
static SNOMASK: OperFlag = OperFlag {
ch: 's',