Commit graph

381 commits

Author SHA1 Message Date
369e06ec2b
io: bound the blocking TLS handshake write side + the wss TLS handshake
The thread-per-connection TLS path bounded only the handshake read, so a peer
advertising a zero TCP receive window could stall our certificate write and pin
the thread forever; add a write deadline (cleared once the handshake completes).
The wss listener ran backend.accept() with no deadline at all — bound its TLS
handshake both ways too. Both reset via the same-socket shutdown handle.
2026-08-30 02:27:09 +00:00
2d42fbd2ca
opers: add users/ignore-privdeaf — reach +D deaf users
A holder's channel messages reach +D (deaf) members: gate the deaf-skip in
to_channel_tagged and the TAGMSG fanout on the sender's users/ignore-privdeaf
(relayed/service messages, which have no local sender, are unaffected). Granted
by the auspex class; verified live (netadmin reaches a deaf user, a restricted
oper does not).
2026-08-29 13:46:25 +00:00
5dfedb5091
opers: wire eight more privileges over their raw is_oper gates
Convert the remaining oper bypass/visibility gates to named privileges:
channels/restricted-create, channels/ignore-nonicks, users/ignore-callerid,
users/secret-whois, users/ignore-restrictmsg, servers/use-disabled-commands,
servers/ignore-securelist, servers/ignore-blockamsg. The override class gains
the channel/message/anti-spam bypasses, auspex gains secret-whois +
ignore-callerid, server gains use-disabled-commands; netadmin keeps all via
privs=*. Docs updated; verified restricted-create + ignore-nonicks live.
2026-08-29 13:11:08 +00:00
bbe2682478
docs: document the oper privilege model (types/classes, privileges, mode allowlist)
README + operators.md now cover the three permission axes (commands, named
privileges, usermode/chanmode allowlists) with the *,-token syntax, the standard
privileges table (users/auspex, channels/auspex, servers/auspex, channels/override,
users/flood, users/ignore-commonchans), and the connect-notice auspex redaction.
2026-08-29 12:00:21 +00:00
57c4cb0c26
opers: apply the usermode allowlist to +s (snomask) too
+s has its own dispatch in apply_user_modes, so it bypassed the per-oper-type
usermode allowlist. Gate it on can_use_mode('s') like the generic oper modes;
non-opers are still rejected by apply_snomask, services under sudo pass through.
2026-08-29 03:08:47 +00:00
4e72ef790c
opers: gate NAMES secret-channel visibility on channels/auspex too
Completes the auspex coverage — NAMES now matches WHO/WHOIS/LIST (secret/
private channel members shown to channels/auspex holders, not any oper).
2026-08-29 02:43:35 +00:00
55863e9cfe
opers: TokenList -deny exclusion for commands/privs + auspex-gate hidden chans
commands=/privs= now honour a -token removal (e.g. *,-DIE), threaded through
resolve as deny sets and applied in the command gate + has_priv. WHOIS of a
+I (hidechans) user's channel list now needs users/auspex, not any oper.
2026-08-29 02:36:56 +00:00
e2a64b7806
opers: enforce the per-type usermode/chanmode allowlist
The usermodes=/chanmodes= class/type keys were parsed then ignored. Add a
ModeAllow allowlist to the resolved oper type + can_use_mode(), checked in
the oper-only mode handlers (services under mode_sudo pass through).
Unspecified stays permissive so built-in types are unrestricted; a type
opts into restriction with an explicit letter list (or * = all).
2026-08-29 02:17:32 +00:00
bc412c218e
opers: organize privileges and enforce them at flood/join/visibility gates
Add a central privs registry and convert raw is_oper gates to named
privileges: users/flood (message + join flood exempt), channels/override
(the +k/+b/+i/+l/+z/+R/+J / CBAN / max-channels join bypasses),
servers/auspex (hidden services in LINKS/MAP), users/ignore-commonchans
(+c PM gate). The override class now grants channels/override + users/flood;
the auspex class adds servers/auspex. netadmin keeps all via privs=*.
2026-08-29 02:05:23 +00:00
ff380d601d
opertypes: enforced oper privilege system (users/auspex, channels/auspex)
Add has_priv/user_has_priv and wire the auspex privileges into their gates:
WHOIS real host+IP + geo, WHO secret-channel members + hidden +i users,
LIST secret/private channels, and the connect-notice IP/geo redaction.
Only netadmin holds every privilege by default; the reusable auspex class
grants the pair to any other oper type. Replaces the ad-hoc snoop type gate.
2026-08-29 01:24:42 +00:00
d73f68f278
snoop: redact connect-notice IP + geo/ASN to non-netadmin opers
Per-viewer rendering via new snotice_c_gated: only opers whose type is in
snoop_sensitive_opertype (default netadmin) see the raw IP and geo/ASN;
lower opers see a 🔒 restricted redaction. Logs keep the full line.
2026-08-29 00:32:11 +00:00
0af2ab7d21
snoop: show the +x cloaked host in the connect notice, not the raw host 2026-08-29 00:11:43 +00:00
6a8999a1bb
snoop: show connecting IP in the connect snote, tagged ipv4/ipv6 2026-08-28 22:56:38 +00:00
bf1446a51b
asn: A:<asn> matching extban (ban/exempt by origin AS); advertise A in EXTBAN 2026-08-28 18:53:04 +00:00
068924de86
asn: core ASN lookup module (native MMDB); match connect classes + security groups on origin AS 2026-08-28 11:53:55 +00:00
cc13ce02c7
geoip: read city + ASN from MaxMind dbs; add geo (country/city + ASN) to connect snote, WHOIS and GEOIP 2026-08-28 09:49:18 +00:00
f0c4a1cc87
snoop: show transport (websocket) + TLS version/cipher in the client-connecting snote 2026-08-28 00:40:54 +00:00
106bda2e8b
watchdog: name the slow event/command in the slow-event snote and [watchdog] warning 2026-08-27 16:32:48 +00:00
533666dba0
link: announce a member's IJOIN status modes to local channel members so a rejoining services bot shows opped 2026-08-26 17:46:37 +00:00
8df756b038
docs/ircv3: document draft/event-playback, draft/webpush (WEBPUSH + VAPID ISUPPORT) 2026-08-26 11:46:15 +00:00
f7ff5c3f86
readme: list draft/event-playback + draft/webpush under IRCv3 features 2026-08-26 11:43:59 +00:00
6ecb6f3d84
modules: draft/webpush — RFC 8291 (aes128gcm) + RFC 8292 (VAPID ES256) Web Push; WEBPUSH REGISTER/UNREGISTER, VAPID ISUPPORT, off-core delivery, HKDF/round-trip tested 2026-08-25 22:31:11 +00:00
6bb8ccd8ee
modules: draft/event-playback — record JOIN/PART/QUIT/NICK/MODE/TOPIC/KICK into CHATHISTORY, replayed only for cap clients (event_playback config, default on) 2026-08-25 22:17:26 +00:00
9dcc269f45
readme: document server-wide message localization (locale/lang catalogs, fr+es) 2026-08-25 14:47:02 +00:00
04671733d2
i18n: localize the client-facing Closing-link ERROR wrapper via trf (fr, es); QUIT-broadcast reasons stay canonical for S2S 2026-08-25 14:35:13 +00:00
9b51db07f5
i18n: sweep all remaining dynamic prose (oper commands, XLINE/FILTER/DNSBL notices, whois/vhost/knock/dcc/title/reputation/tline/rmode, hash, rename) through trf; +\xNN catalog escape; fr+es now 236 entries each 2026-08-25 14:30:29 +00:00
ef96bcbd06
i18n: localize the snotice/announce path — translate at deliver_server_notice chokepoint; rehash, connect/exit, oper-up, login, channel & ojoin notices via trf (fr, es) 2026-08-25 13:04:31 +00:00
6f8ff39f99
i18n: localize the welcome burst (001-003/251) via trf() dynamic templates (fr, es) 2026-08-25 12:18:17 +00:00
560c860f1d
i18n: server-wide locale via lang/<code>.conf catalogs (fr, es); numeric prose auto-translated at the chokepoint, en = zero-cost passthrough 2026-08-25 12:14:35 +00:00
5914a6d993
websocket: collapse v4-mapped proxy peer so ws_proxyranges matches and X-Real-IP is honored 2026-08-25 03:15:28 +00:00
935f22f2f2
accounts: oper snotice on post-connect login ('Client X is now logged in as Y') 2026-08-25 02:21:58 +00:00
37436d0306
snoop: drop needless clones in the connect notice (hold the &User borrow) 2026-08-25 00:12:23 +00:00
6e8d6c31fb
snoop: connect notice includes port, sni and account (present fields only) 2026-08-25 00:06:22 +00:00
a587d25873
docs: document the brand block (per-SNI server/network identity) in the example config 2026-08-24 23:29:45 +00:00
b6ada854cc
brand: per-SNI server/network identity (welcome, ISUPPORT NETWORK, numeric source prefix) 2026-08-24 23:29:15 +00:00
f36f803d42
whois: show client-cert fingerprint (276) to everyone, not just opers/self 2026-08-24 22:25:08 +00:00
009bea734a
whois: show negotiated TLS version/group/cipher in 671; sslgroup crate reads the KEX group 2026-08-24 21:45:46 +00:00
85eb8218f0
tls: openssl backend offers TLS 1.3 via mozilla_intermediate_v5 (was capped at 1.2) 2026-08-24 20:38:58 +00:00
51602737e2
tls: rustls backend offers TLS 1.3 (was TLS 1.2 only), preferred over 1.2 2026-08-24 20:30:54 +00:00
d0fdb2e8be
docs: add Community section (irc.devtronic.pro #echoiRCd support channel) to README 2026-08-24 19:47:06 +00:00
f066fa0b5a
docs: document the block config format + mkpasswd/checkconfig/rehash CLIs in README and configuration.md 2026-08-24 19:13:45 +00:00
8d48900ae3
config: derive Eq on the block-parser token enum 2026-08-23 13:01:05 +00:00
1166c49443
config: checkconfig CLI + Config::dump; tls block carries sni/handshake_timeout 2026-08-23 12:42:30 +00:00
b11382bc1e
config: block-format example documenting every option; cloak/uline block fields + example parse guard 2026-08-23 12:28:19 +00:00
2f6ce36af0
config: add brace/block format (translated to flat, both formats supported) 2026-08-23 12:18:10 +00:00
e8d16a1f96
config: accept oper password=<hash> named token; keep positional password back-compat 2026-08-23 03:11:32 +00:00
c2e0a9eeb4
mkpasswd: 'echoircd mkpasswd [cost]' CLI hashes a stdin password with bcrypt for oper blocks 2026-08-23 02:55:14 +00:00
12a4ddb749
rehash: fall back to a /proc scan for the running server when the pidfile is stale, and self-heal it 2026-08-23 02:40:53 +00:00
3052e47212
docs: document the pidfile option in the example config 2026-08-23 02:35:32 +00:00
34342e110f
rehash: write the pidfile only when configured + CLI verifies a live echoircd, so a stale/clobbered pid can't misfire 2026-08-23 02:17:44 +00:00