Respect a nil erc-session-password when reconnecting

* lisp/erc/erc.el (erc-open): Simplify `old-vars' expression.
(erc--compute-server-password): Only compute a server password when
first connecting.  For compatibility, this respects third-party code
that expects session passwords in target buffers when initially
non-nil.
* test/lisp/erc/erc-scenarios-services-misc.el
(erc-scenarios-services-auth-source-reconnect): Add new test.
* test/lisp/erc/resources/services/auth-source/recon.eld: Add new test
data file.  (Bug#59858.)
This commit is contained in:
F. Jason Park 2022-12-02 23:11:24 -08:00
parent 9ac80e8a6e
commit 0155fc67be
3 changed files with 110 additions and 1 deletions

View file

@ -1970,7 +1970,7 @@ Returns the buffer for the given server or channel."
(let* ((target (and channel (erc--target-from-string channel))) (let* ((target (and channel (erc--target-from-string channel)))
(buffer (erc-get-buffer-create server port nil target id)) (buffer (erc-get-buffer-create server port nil target id))
(old-buffer (current-buffer)) (old-buffer (current-buffer))
(old-vars (and (not connect) (buffer-local-variables))) (old-vars (and target (buffer-local-variables)))
(old-recon-count erc-server-reconnect-count) (old-recon-count erc-server-reconnect-count)
(old-point nil) (old-point nil)
(delayed-modules nil) (delayed-modules nil)
@ -6451,6 +6451,8 @@ non-nil value is found.
When `erc-auth-source-server-function' is non-nil, call it with NICK for When `erc-auth-source-server-function' is non-nil, call it with NICK for
the user field and use whatever it returns as the server password." the user field and use whatever it returns as the server password."
(or password (and erc-auth-source-server-function (or password (and erc-auth-source-server-function
(not erc--server-reconnecting)
(not erc--target)
(funcall erc-auth-source-server-function :user nick)))) (funcall erc-auth-source-server-function :user nick))))
(defun erc-compute-full-name (&optional full-name) (defun erc-compute-full-name (&optional full-name)

View file

@ -84,4 +84,63 @@
(should-not (memq 'services erc-modules)))) (should-not (memq 'services erc-modules))))
;; A user with `services' enabled connects, quits, and reconnects. An
;; entry in their netrc matches the network ID, which isn't known when
;; `erc-auth-source-server-function' runs -- initially *or* on
;; reconnect. It's only seen by `erc-auth-source-services-function'.
(ert-deftest erc-scenarios-services-auth-source-reconnect ()
:tags '(:expensive-test)
(erc-scenarios-common-with-cleanup
((erc-scenarios-common-dialog "services/auth-source")
(erc-server-flood-penalty 0.1)
(dumb-server (erc-d-run "localhost" t 'recon 'recon))
(port (process-contact dumb-server :service))
(netrc-file (make-temp-file
"auth-source-test" nil nil
"machine FooNet login tester password changeme\n"))
(auth-sources (list netrc-file))
(auth-source-do-cache nil)
(erc-modules (cons 'services erc-modules))
(erc-use-auth-source-for-nickserv-password t) ; do consult
(erc-prompt-for-nickserv-password nil) ; don't prompt
(erc-nickserv-alist
(cons '(FooNet
"NickServ!NickServ@services.int"
"This nickname is registered. Please choose"
"NickServ" "IDENTIFY" nil nil "You are now identified for ")
erc-nickserv-alist))
(expect (erc-d-t-make-expecter))
(erc-scenarios-common-extra-teardown (lambda ()
(delete-file netrc-file))))
(ert-info ("Server password omitted from initial connection")
(with-current-buffer (erc :server "127.0.0.1"
:port port
:nick "tester"
:user "tester"
:full-name "tester")
(should (string= (buffer-name) (format "127.0.0.1:%d" port)))
(ert-info ("Services module authenticates")
(funcall expect 10 "This nickname is registered.")
(funcall expect 3 "You are now identified"))
(erc-cmd-JOIN "#chan")
(with-current-buffer (erc-d-t-wait-for 10 (get-buffer "#chan"))
(funcall expect 10 "the gallants desire it"))
(erc-cmd-QUIT "")
(funcall expect 3 "finished")))
(ert-info ("Server password withheld on reconnect")
(with-current-buffer "#chan"
(erc-cmd-RECONNECT))
(with-current-buffer "FooNet"
(funcall expect 10 "This nickname is registered.")
(funcall expect 3 "You are now identified")
(with-current-buffer "#chan" ; autojoined
(funcall expect 10 "the gallants desire it"))
(erc-cmd-QUIT "")
(funcall expect 3 "finished")))
(erc-services-mode -1)))
;;; erc-scenarios-services-misc.el ends here ;;; erc-scenarios-services-misc.el ends here

View file

@ -0,0 +1,48 @@
;; -*- mode: lisp-data; -*-
((nick 10 "NICK tester"))
((user 5 "USER tester 0 * :tester")
(0.00 ":irc.foonet.net NOTICE * :*** Looking up your hostname...")
(0.04 ":irc.foonet.net NOTICE tester :*** Could not resolve your hostname: Domain not found; using your IP address (10.0.2.100) instead.")
(0.06 ":irc.foonet.net 001 tester :Welcome to the FooNet IRC Network tester!tester@10.0.2.100")
(0.01 ":irc.foonet.net 002 tester :Your host is irc.foonet.net, running version InspIRCd-3")
(0.01 ":irc.foonet.net 003 tester :This server was created 08:32:24 Dec 05 2022")
(0.01 ":irc.foonet.net 004 tester irc.foonet.net InspIRCd-3 BIRcgikorsw ACHIKMORTXabcefghijklmnopqrstvz :HIXabefghjkloqv")
(0.01 ":irc.foonet.net 005 tester ACCEPT=30 AWAYLEN=200 BOT=B CALLERID=g CASEMAPPING=ascii CHANLIMIT=#:20 CHANMODES=IXbeg,k,Hfjl,ACKMORTcimnprstz CHANNELLEN=64 CHANTYPES=# ELIST=CMNTU ESILENCE=CcdiNnPpTtx EXCEPTS=e :are supported by this server")
(0.01 ":irc.foonet.net 005 tester EXTBAN=,ACORTUacjrwz HOSTLEN=64 INVEX=I KEYLEN=32 KICKLEN=255 LINELEN=512 MAXLIST=I:100,X:100,b:100,e:100,g:100 MAXTARGETS=20 MODES=20 MONITOR=30 NAMELEN=128 NAMESX NETWORK=FooNet :are supported by this server")
(0.01 ":irc.foonet.net 005 tester NICKLEN=30 PREFIX=(qaohv)~&@%+ SAFELIST SILENCE=32 STATUSMSG=~&@%+ TOPICLEN=307 UHNAMES USERIP USERLEN=10 USERMODES=,,s,BIRcgikorw WHOX :are supported by this server")
(0.01 ":irc.foonet.net 251 tester :There are 2 users and 0 invisible on 2 servers")
(0.00 ":irc.foonet.net 253 tester 1 :unknown connections")
(0.00 ":irc.foonet.net 254 tester 1 :channels formed")
(0.00 ":irc.foonet.net 255 tester :I have 2 clients and 1 servers")
(0.00 ":irc.foonet.net 265 tester :Current local users: 2 Max: 3")
(0.00 ":irc.foonet.net 266 tester :Current global users: 2 Max: 3")
(0.00 ":irc.foonet.net 375 tester :irc.foonet.net message of the day")
(0.00 ":irc.foonet.net 372 tester :Have fun!")
(0.00 ":irc.foonet.net 376 tester :End of message of the day."))
((mode-a 10 "MODE tester +i")
(0.00 ":irc.foonet.net 501 tester x :is not a recognised user mode.")
(0.04 ":tester!tester@10.0.2.100 MODE tester :+i")
(0.00 ":NickServ!NickServ@services.int NOTICE tester :This nickname is registered. Please choose a different nickname, or identify via \2/msg NickServ identify <password>\2."))
((~privmsg 10 "PRIVMSG NickServ :IDENTIFY changeme")
(0.00 ":NickServ!NickServ@services.int NOTICE tester :You are now identified for \2tester\2.")
(0.01 ":irc.foonet.net 900 tester tester!tester@10.0.2.100 tester :You are now logged in as tester"))
((~join 10 "JOIN #chan")
(0.00 ":tester!tester@10.0.2.100 JOIN :#chan")
(0.04 ":irc.foonet.net 353 tester = #chan :@alice bob tester")
(0.00 ":irc.foonet.net 366 tester #chan :End of /NAMES list."))
((mode-b 10 "MODE #chan")
(0.03 ":irc.foonet.net 324 tester #chan :+nt")
(0.01 ":irc.foonet.net 329 tester #chan :1670229160")
(0.00 ":alice!alice@0::1 PRIVMSG #chan :tester, welcome!")
(0.00 ":bob!bob@0::1 PRIVMSG #chan :tester, welcome!")
(0.05 ":alice!alice@0::1 PRIVMSG #chan :bob: Thou art the cap of all the fools alive.")
(0.06 ":bob!bob@0::1 PRIVMSG #chan :alice: What, man! 'tis a night of revels; the gallants desire it."))
((quit 10 "QUIT :\2ERC\2")
(0.1 ":tester!tester@10.0.2.100 QUIT :Client Quit"))
((drop 1 DROP))