feat(irc): SASL PLAIN login and IRCv3 server-time

Registration now opens with CAP LS 302 (servers without IRCv3 ignore it
and register as before). From the offered capabilities (multi-line LS
lists included) the client requests server-time and, when the profile
enables it, sasl; then AUTHENTICATE PLAIN with the account (defaulting
to the nick) and a stored SASL password (irc-sasl-password), base64 in
400-byte chunks, and CAP END on success or failure — failures are shown
on the Server tab and the connection carries on (NickServ still works).
server-time tags stamp events with the server's clock, so replayed
history shows real times.

Tested against the fake IRC server: multi-line LS, REQ/ACK, the PLAIN
exchange, 903, CAP END, and a tagged message's timestamp.
This commit is contained in:
Andy Dixon
2026-10-12 19:11:16 +01:00
parent 0fc9451583
commit 32890c6415
7 changed files with 159 additions and 6 deletions
+13
View File
@@ -812,6 +812,19 @@ impl ProfileEditor {
}
}
});
section(ui, "SASL", |ui| {
check(ui, "Log In with SASL", &mut c.sasl, "Authenticates during registration (SASL PLAIN), as most networks now expect");
if c.sasl {
text(ui, "SASL Account", &mut c.sasl_account, "Defaults to your nick");
mode(ui, "SASL Password Storage", &mut c.sasl_mode);
if c.sasl_mode == SecretMode::Saved {
secret(ui, "SASL Password", secrets, SecretKind::IrcSaslPassword, "Leave blank to keep the saved password");
}
if !c.use_tls && !c.ssh_tunnel {
widgets::hint(ui, "Without TLS or an SSH tunnel the password crosses the network in the clear.");
}
}
});
section(ui, "NickServ", |ui| {
check(ui, "Identify on Connect", &mut c.nick_serv_identify, "");
if c.nick_serv_identify {