|
|
6c5f330746
|
add SIGNORE: personal mutual server-side ignore across channels and PMs
|
2026-08-20 14:48:17 +00:00 |
|
|
|
2c9ce18cd7
|
whois: render the oper-type title line in bold + colour (per-type color=<name|0-15|none>, default red) so it stands out
|
2026-08-20 14:26:17 +00:00 |
|
|
|
bc520d59a5
|
whois: a typed oper gets its own 320 special line with the type title (e.g. 'is a Network Administrator'), separate from the generic 313 operator line
|
2026-08-20 14:17:15 +00:00 |
|
|
|
8f9e60c8e2
|
whois: 313 shows the generic 'is an IRC Operator' again — the oper type gates capabilities, and a custom title comes from the SWHOIS line (320)
|
2026-08-20 14:05:46 +00:00 |
|
|
|
5a9825ee61
|
comments: strip stray reference-implementation names from a handful of module/inline comments
|
2026-08-20 10:11:07 +00:00 |
|
|
|
01516d5fdc
|
opertypes: oper classes + types — reusable capability classes and named roles (WHOIS title, auto usermodes/snomasks/vhost + level on oper-up, per-type command enforcement via on_pre_command); ships 5 built-in (helpop/globop/admin/servadmin/netadmin); oper blocks gain type=<id>; a typeless oper keeps full access
|
2026-08-20 10:05:11 +00:00 |
|
|
|
16fae5b23c
|
watch: notify WATCH/MONITOR via nick->watchers reverse indexes (watch_by/monitor_by) instead of scanning every user on each online/offline/nick-change flip — O(watchers) not O(users); maintained through centralized watch_index_*/monitor_index_* helpers + quit cleanup
|
2026-08-19 02:34:22 +00:00 |
|
|
|
16ea4b5a23
|
core_message: compute the sender's channel rank once per message (mrank) instead of recomputing s.rank(uid,&key) up to 7x in the channel PRIVMSG/NOTICE gate and once more in TAGMSG — rank is fixed for a single message
|
2026-08-19 02:29:59 +00:00 |
|
|
|
fb1a9f3d70
|
server: skip the O(users) callerid ACCEPT scrub on quit unless the departing nick is actually accepted by someone — a reverse count (accepted_nicks) maintained through centralized accept_add/accept_remove helpers avoids scanning every user's accept list on each quit (O(users*quits) on a netsplit); the full scrub still runs when the count is nonzero, so the nick-reuse protection is unchanged
|
2026-08-19 02:21:38 +00:00 |
|
|
|
ab0ccae71f
|
server: scrub a departed user's pending invites via a User.invited reverse index instead of scanning every channel on the network per quit — the old O(channels)-per-quit path was O(channels*quits) on a netsplit; the index is maintained at the 4 invite add/remove sites (INVITE cmd, S2S INVITE, join-consume, UNINVITE)
|
2026-08-19 02:09:36 +00:00 |
|
|
|
5101b1361d
|
whois: build the target snapshot as a named WhoisInfo struct instead of a 17-field positional tuple — field-named construction can't silently transpose two same-typed fields; destructured into the same locals so the reply code is unchanged
|
2026-08-19 01:58:01 +00:00 |
|
|
|
d495fd0f30
|
channel: cap the per-channel invite set (maxinvites, default 100) — it only shrank when the invitee joined, so an op could grow it unboundedly; re-inviting an already-listed nick still works
|
2026-08-19 01:22:32 +00:00 |
|
|
|
4248cc0479
|
oper: gate the client-facing SVSLOGIN/SVSLOGOUT behind oper_svslogin (default off) — they were a pre-S2S stopgap that let any oper forge an arbitrary account login (set_login) and thus +r/account-gated access; the live path is S2S link_svslogin (source_is_service-gated), so services are unaffected — only the obsolete oper backdoor is closed
|
2026-08-19 01:01:33 +00:00 |
|
|
|
a09dfc74df
|
auth: constant-time compare for VHOST and WEBIRC secrets — both used plain == on the config password, unlike oper/RPC/JWT secrets which already route through ct_eq; expose password_hash::ct_eq as the shared comparator and use it (usernames stay plain == — not secret)
|
2026-08-19 00:41:47 +00:00 |
|
|
|
c72b966e0a
|
mode: cap mode changes per MODE command (modes=, default 20) and advertise it as the MODES= ISUPPORT token — an uncapped modestring like MODE #c +bbbb… dispatched a handler per letter, each fanning out to the whole channel and every S2S link (amplification DoS); matches InspIRCd's MODES limit
|
2026-08-19 00:40:58 +00:00 |
|
|
|
c99f16f3e0
|
webirc: require a non-empty source-IP mask on a webirc block — an empty ipmask meant "any IP", so a maskless webirc=<password> block turned one shared secret into a full host/IP spoof (bypassing z-lines, DNSBL, GeoIP, cloak) for anyone who learned it; now the gateway's connecting IP must match the block's ipmask
|
2026-08-19 00:34:25 +00:00 |
|
|
|
235c747c03
|
refactor: WEBIRC gateways and +G censor rules are named structs (WebircGateway/CensorRule) instead of positional tuples — self-documenting field access, no (_, g, _) index guessing; extends the OperBlock pattern
|
2026-08-18 23:31:21 +00:00 |
|
|
|
c4456cf002
|
oper: TLS client-cert fingerprint login — oper block gains an optional fp=<sha256>; password=* means cert-only. Named OperBlock struct replaces the (name,pass,level) tuple. (Password login was never broken — verified live.)
|
2026-08-18 22:55:07 +00:00 |
|
|
|
853be58d18
|
perf: channel PRIVMSG/NOTICE fanout builds at most one line per capability profile (server-time/account-tag/message-tags) and shares it by Arc, instead of formatting a String per member — a big channel now allocates <=8 lines, not N
|
2026-08-18 22:37:50 +00:00 |
|
|
|
a3dc7b521f
|
test: deterministic two-node S2S convergence simulator — real handshake + join/part/rejoin/FJOIN-TS-arbitration driven through actual code paths, proptest-randomised churn asserts both sides always converge; extract Server::part so the sim and the PART command share one path
|
2026-08-18 22:24:19 +00:00 |
|
|
|
20b49add0b
|
perf: mimalloc global allocator + aHash maps + memchr line framer + LTO/codegen-units=1 — ~29% faster channel fanout; and drop the bogus openssl+mio dependency whitelist from the guard (any perf crate is welcome now)
|
2026-08-18 19:45:33 +00:00 |
|
|
|
c9bd8e7492
|
channel-rename: implement IRCv3 draft/channel-rename — RENAME command + cap, in-place rename (RENAME for cap clients, PART/JOIN fallback for the rest), and S2S propagation
|
2026-08-17 23:45:02 +00:00 |
|
|
|
e28efb03e6
|
callerid: cap the auto-accept list like the explicit ACCEPT command
|
2026-08-17 21:37:19 +00:00 |
|
|
|
73f8ff58ed
|
s2s: enforce servprotect on a remote KILL and rank-vs-victim on a remote KICK (matching the local paths)
|
2026-08-17 19:38:58 +00:00 |
|
|
|
58d5a0e5a5
|
message: keep +U opmoderated messages out of CHATHISTORY/+H replay, and subject TAGMSG to the same PM gates (+c/+R/+z/+g/SILENCE)
|
2026-08-17 15:05:13 +00:00 |
|
|
|
480b5faea0
|
sanick/svsnick: allow a case-only rename (in-use check matched the target itself)
|
2026-08-17 14:52:38 +00:00 |
|
|
|
713406870b
|
who: hide +u auditorium and +D delayjoin members on WHO #chan, matching NAMES
|
2026-08-17 14:52:38 +00:00 |
|
|
|
3f9aa8c6eb
|
channel: cull an empty channel when a mode change (-P/-r) removes its last reason to persist
|
2026-08-17 01:50:11 +00:00 |
|
|
|
262699bf30
|
kick: route KICK of a remote channel member to its server and drop the local view
|
2026-08-16 19:31:49 +00:00 |
|
|
|
ef84846267
|
invite: route INVITE for a remote target to its server and deliver inbound INVITE
|
2026-08-16 19:11:57 +00:00 |
|
|
|
559a102e48
|
add oper SQUIT command to disconnect a linked server by name
|
2026-08-16 19:10:29 +00:00 |
|
|
|
767ecb3471
|
whois: fold the channel list across multiple 319 lines to stay under 512 bytes
|
2026-08-16 18:46:07 +00:00 |
|
|
|
94f57608f7
|
mode: require half-op to view the autoop/exemptchanops/filter lists
|
2026-08-16 18:44:08 +00:00 |
|
|
|
dadbff91d8
|
xline: accept the durationless KLINE/GLINE form (mask :reason) instead of eating the reason
|
2026-08-16 18:21:32 +00:00 |
|
|
|
5046083608
|
add HELP command with a built-in index and per-topic help (704/705/706)
|
2026-08-16 18:20:57 +00:00 |
|
|
|
ba9d62b172
|
cap: advertise IRCv3 sts policy (sts_duration/sts_port/sts_preload) for TLS upgrade
|
2026-08-16 18:19:04 +00:00 |
|
|
|
4ce500e525
|
cap: fold CAP LS 302 into multiple continuation lines to stay under 512 bytes
|
2026-08-16 18:17:29 +00:00 |
|
|
|
7908fe50b0
|
s2s: propagate x-lines (ADDLINE/DELLINE) — apply from peers, announce local ones, burst on link
|
2026-08-16 18:01:52 +00:00 |
|
|
|
98fb848b8c
|
s2s: route and apply KILL across the link (inbound handler + remote-target routing)
|
2026-08-16 17:57:50 +00:00 |
|
|
|
579c321670
|
channels/whois: validate +k/+l, cap and case-fold ban lists, honour -n for externals, hide +s/+p/+i from whois/who/names, 301 in whois, conf-key the join/nickflood lockout
|
2026-08-16 17:56:24 +00:00 |
|
|
|
04423388d5
|
services: reword uline/service code comments, drop external daemon references
|
2026-08-16 14:12:18 +00:00 |
|
|
|
d012623dff
|
services: add server-level uline/is_service flag and gate the service WHOIS line, echo/services tag, MAP/LINKS hide and SVS* on it
|
2026-08-16 13:43:17 +00:00 |
|
|
|
b7600ee5aa
|
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
|
2026-08-16 03:00:25 +00:00 |
|
|
|
91022cffe8
|
whois: track remote users' umodes from UID; show 335 (is a bot) for remote +B services/bots and 379 modes to opers
|
2026-08-15 23:50:07 +00:00 |
|
|
|
59b0439b79
|
whois: append the snomask to the 379 modes line for opers (is using modes <umodes> +<snomask>), matching the standard format
|
2026-08-15 17:17:12 +00:00 |
|
|
|
546f6279e7
|
snomasks: make +s a parametric snomask mode with the standard category letters (acdfgjklnoqrtuvwx), route each server notice by category, RPL_SNOMASKIS 008; opers default to all and narrow with +s -c etc.
|
2026-08-15 17:06:14 +00:00 |
|
|
|
309201d7fb
|
whois: add 307 (is a registered nick) for identified users and 379 (is using modes) for opers/self
|
2026-08-15 16:46:10 +00:00 |
|
|
|
3fa9737ccb
|
link: stop services re-locking +r on every join — track the registered channel mode, keep +r channels alive when empty, use ijoin not fjoin for incremental joins, and consume s2s channel-mode params through the registry
|
2026-08-15 13:20:04 +00:00 |
|
|
|
62f901bdc8
|
sasl: wrap the s2s sasl relay in encap (client/agent/mode/data) so services drive authenticate, account via metadata
|
2026-08-15 12:04:09 +00:00 |
|
|
|
1c8799d785
|
link: rework s2s wire format to the standard v4 server protocol (10-field uid, letters-comma fjoin, ijoin, timestamped fmode, ftopic, uuid kick) so external services link
|
2026-08-15 11:51:18 +00:00 |
|