summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorF. Jason Park <jp@neverwas.me>2022-12-12 23:58:03 -0800
committerF. Jason Park <jp@neverwas.me>2022-12-14 06:40:55 -0800
commit102a3e3b445d96e5a74a3ec32b2a2b701b80819e (patch)
treeaec20825d617f64062cc9080d9d6c85df2367f0c
parentf0c908887815a9cc668a5a03cbc1b7d6eaf8c91d (diff)
downloademacs-102a3e3b445.tar.gz
Don't send erc-sasl-user as USER command argument
* lisp/erc/erc-sasl.el (erc-sasl--send-cap-ls): Add internal switch for sending an opening "CAP LS". The rationale for not enabling this by default is twofold: one, it more strongly implies that ERC supports IRCv3 client capability negotiation, which is somewhat disingenuous; and, two, We'd still be "faking it" by firing and forgetting, and more balls in the air makes things less predictable. (erc--register-connection): Possibly send a "CAP LS" before anything depending on the value of `erc-sasl--send-cap-ls'. Also, don't attempt to send `erc-session-username' when it holds an SASL username because the latter may contain protocol-defying characters. * test/lisp/erc/resources/base/local-modules/fourth.eld: change user parameter of "USER" command to reflect nick when `erc-sasl-user' is set to `:user'. (Bug#59976.)
-rw-r--r--lisp/erc/erc-sasl.el25
-rw-r--r--test/lisp/erc/resources/base/local-modules/fourth.eld2
2 files changed, 20 insertions, 7 deletions
diff --git a/lisp/erc/erc-sasl.el b/lisp/erc/erc-sasl.el
index 280910111d5..78d02a46381 100644
--- a/lisp/erc/erc-sasl.el
+++ b/lisp/erc/erc-sasl.el
@@ -414,17 +414,30 @@ This doesn't solicit or validate a suite of supported mechanisms."
" "))
(erc-sasl--destroy proc))
+(defvar erc-sasl--send-cap-ls nil
+ "Whether to send an opening \"CAP LS\" command.
+This is an escape hatch for picky servers. If you need it turned
+into a user option, please let ERC know via \\[erc-bug].
+Otherwise, expect it to disappear in subsequent versions.")
+
(cl-defmethod erc--register-connection (&context (erc-sasl-mode (eql t)))
- "Send speculative/pipelined CAP and AUTHENTICATE and hope for the best."
+ "Send speculative CAP and pipelined AUTHENTICATE and hope for the best."
(if-let* ((c (erc-sasl--state-client erc-sasl--state))
(m (sasl-mechanism-name (sasl-client-mechanism c))))
(progn
- (erc-server-send "CAP REQ :sasl")
- (if (and erc-session-password
- (eq :password (alist-get 'password erc-sasl--options)))
- (let (erc-session-password)
- (erc-login))
+ (erc-server-send (if erc-sasl--send-cap-ls "CAP LS" "CAP REQ :sasl"))
+ (let ((erc-session-password
+ (and erc-session-password
+ (not (eq :password (alist-get 'password erc-sasl--options)))
+ erc-session-password))
+ (erc-session-username
+ ;; The username may contain a colon or a space
+ (if (eq :user (alist-get 'user erc-sasl--options))
+ (erc-current-nick)
+ erc-session-username)))
(erc-login))
+ (when erc-sasl--send-cap-ls
+ (erc-server-send "CAP REQ :sasl"))
(erc-server-send (format "AUTHENTICATE %s" m)))
(erc-sasl--destroy erc-server-process)))
diff --git a/test/lisp/erc/resources/base/local-modules/fourth.eld b/test/lisp/erc/resources/base/local-modules/fourth.eld
index fd6d62b6cc2..4ac5dcbd38b 100644
--- a/test/lisp/erc/resources/base/local-modules/fourth.eld
+++ b/test/lisp/erc/resources/base/local-modules/fourth.eld
@@ -1,7 +1,7 @@
;; -*- mode: lisp-data; -*-
((cap 10 "CAP REQ :sasl"))
((nick 10 "NICK tester`"))
-((user 10 "USER tester 0 * :tester"))
+((user 10 "USER tester` 0 * :tester"))
((authenticate 10 "AUTHENTICATE PLAIN")
(0.0 ":irc.foonet.org CAP * ACK sasl")