Compare nicks by exact case everywhere (closes #128)
check / check (push) Waiting to run

README.md rules that nicks are case-sensitive, but the IRC listener's
relay and user MODE on both transports compared nicks ignoring case:
an IRC listener user alice never saw a PRIVMSG, NOTICE, JOIN, PART,
NICK or QUIT from Alice, and MODE Alice from alice was taken as her
own nick. These checks now use ==.

Tests cover alice receiving each of these from Alice, MODE Alice from
alice getting 502 on both transports, and Alice registering while
alice exists. README.md drops the text that described the old
behaviour.

Model: opus-5-5
This commit was merged in pull request #141.
This commit is contained in:
2026-10-20 16:31:28 +02:00
parent 3c725a9ca8
commit eceb5f2b2c
8 changed files with 66 additions and 31 deletions
+9 -16
View File
@@ -1031,14 +1031,14 @@ e.g. `+o-v alice bob`.
| `441` | ERR_USERNOTINCHANNEL | The `+o`/`+v` nick is not in the channel |
**User modes:** you can query and change only your own; a nick other than your
own, compared without regard to letter case, gets ERR_USERSDONTMATCH (502). With
no mode string the server sends RPL_UMODEIS (221) with your modes: `+`, `+o`,
`+w` or `+ow`. A change is a mode string, `body[0]` over the HTTP API or the
parameter after the nick on the IRC listener, that starts with `+` or `-`: `w`
(receive `WALLOPS`) can be set or unset, and `o` (server operator) only unset,
since only `OPER` sets it. Any other letter, or a string that names no mode,
gets ERR_UMODEUNKNOWNFLAG (501) and changes nothing. A change that is accepted
is answered with 221 and the new modes; it is not sent to anyone else.
own gets ERR_USERSDONTMATCH (502). With no mode string the server sends
RPL_UMODEIS (221) with your modes: `+`, `+o`, `+w` or `+ow`. A change is a mode
string, `body[0]` over the HTTP API or the parameter after the nick on the IRC
listener, that starts with `+` or `-`: `w` (receive `WALLOPS`) can be set or
unset, and `o` (server operator) only unset, since only `OPER` sets it. Any
other letter, or a string that names no mode, gets ERR_UMODEUNKNOWNFLAG (501)
and changes nothing. A change that is accepted is answered with 221 and the new
modes; it is not sent to anyone else.
```json
{ "command": "RPL_UMODEIS", "code": 221, "to": "alice", "body": ["+w"] }
@@ -2679,8 +2679,7 @@ IRC_LISTEN_ADDR: ""
set only over the HTTP API.
- **User modes**: `+o` (operator, set only via `OPER`), `+w` (receives
`WALLOPS`). `MODE` for any nick other than your own is rejected with
`ERR_USERSDONTMATCH` (502), for both queries and changes. Nick comparison is
case-insensitive.
`ERR_USERSDONTMATCH` (502), for both queries and changes.
- **KILL**: an operator's `KILL` broadcasts the victim's `QUIT` to its channel
peers, deletes its session, and then sends the victim a `KILL` and
`ERROR :Closing Link` before closing its socket. This applies to victims on
@@ -2701,12 +2700,6 @@ API reaches IRC listener members as an IRC `MODE` line with its value as a
separate parameter, e.g. `MODE #general +k secretpass` or
`MODE #general +o bob`.
One gap remains: the IRC listener does not pass on a `PRIVMSG`, `NOTICE`,
`JOIN`, `PART`, `NICK` or `QUIT` whose sender's nick matches the user's own nick
ignoring case, so an IRC listener user `alice` never sees these from `Alice`,
although nicks are case-sensitive. https://git.eeqj.de/sneak/neoirc/issues/128
tracks it.
### Docker Usage
To expose the IRC port in Docker (the listener is enabled by default on