From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: "J.P." Newsgroups: gmane.emacs.bugs,gmane.emacs.erc.general Subject: bug#46777: 28.0.50; ERC: NickServ identification: Prompt for password after other sources, overall simplifications Date: Tue, 14 Sep 2021 02:20:55 -0700 Message-ID: <87ee9r4io8.fsf@neverwas.me> References: <5495728.XOh7uYVVfo@ravel> <4764688.dQ8sKJKaaQ@ravel> <87sg01jzgk.fsf_-_@neverwas.me> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="38718"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/28.0.50 (gnu/linux) Cc: 46777@debbugs.gnu.org, emacs-erc@gnu.org, Amin Bandali To: Olivier Certner Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Tue Sep 14 11:23:21 2021 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mQ4eu-0009qr-BQ for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 14 Sep 2021 11:23:20 +0200 Original-Received: from localhost ([::1]:36416 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1mQ4et-0000oU-7N for geb-bug-gnu-emacs@m.gmane-mx.org; Tue, 14 Sep 2021 05:23:19 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:38342) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1mQ4df-0008GB-Cq for bug-gnu-emacs@gnu.org; Tue, 14 Sep 2021 05:22:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:35989) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1mQ4de-0007UN-7H for bug-gnu-emacs@gnu.org; Tue, 14 Sep 2021 05:22:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1mQ4de-0006yS-2n for bug-gnu-emacs@gnu.org; Tue, 14 Sep 2021 05:22:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: "J.P." Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Tue, 14 Sep 2021 09:22:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 46777 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 46777-submit@debbugs.gnu.org id=B46777.163161127226712 (code B ref 46777); Tue, 14 Sep 2021 09:22:02 +0000 Original-Received: (at 46777) by debbugs.gnu.org; 14 Sep 2021 09:21:12 +0000 Original-Received: from localhost ([127.0.0.1]:47526 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mQ4cp-0006wl-SK for submit@debbugs.gnu.org; Tue, 14 Sep 2021 05:21:12 -0400 Original-Received: from mail-108-mta107.mxroute.com ([136.175.108.107]:43933) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1mQ4cl-0006wH-5n for 46777@debbugs.gnu.org; Tue, 14 Sep 2021 05:21:10 -0400 Original-Received: from filter004.mxroute.com ([149.28.56.236] filter004.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta107.mxroute.com (ZoneMTA) with ESMTPSA id 17be39c100600074ba.002 for <46777@debbugs.gnu.org> (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256); Tue, 14 Sep 2021 09:21:00 +0000 X-Zone-Loop: c38ccf63718163f4956517023374ce29997ed54b452b X-Originating-IP: [149.28.56.236] In-Reply-To: <87sg01jzgk.fsf_-_@neverwas.me> (J. P.'s message of "Mon, 26 Jul 2021 00:39:39 -0700") X-AuthUser: masked@neverwas.me X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:214288 gmane.emacs.erc.general:1586 Archived-At: --=-=-= Content-Type: text/plain "J.P." writes: > If that's a realistic concern, perhaps you should consider keeping the > password param in its original position for the sake of compatibility. Recent discussions have left me with the impression that at least one consequential voice may be harboring reservations about the proposed interface change to `erc-nickserv-identify'. I'd like to offer some thoughts towards salvaging (at a minimum) the "prompting as a fallback" portion of this patch, which I feel may be helpful to new users. As a side note, the few changes that appear motivated mostly by promoting a separation of concerns seem at worst benign and otherwise potentially beneficial beyond maintenance matters (IMO). For example, adding a helper, like the proposed `erc-nickserv-send-identify', to encapsulate the actual request-making may improve this module's utility as a traditional library. (A few bots may even appreciate that.) Regarding the perceived minor bone of contention, my instincts favor the bold move, as usual. But that's contingent on all things being equal, which they likely aren't here (because passwords), meaning progressive attitudes may have to take a back seat. So as a compromise, how about an ugly chimera like the one in the attached example? --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0000-NOT-A-PATCH-discussion-example.diff >From 8ede558f8b7885e97bced96f5d06206ecb23a719 Mon Sep 17 00:00:00 2001 From: "F. Jason Park" Date: Mon, 13 Sep 2021 22:24:57 -0700 Subject: NOT A PATCH Rebased atop commit 25ebb9374bdadf66153727831fc7ff131c8cf299 Author: Stefan Kangas Date: Tue Sep 14 07:55:56 2021 +0200 ; More minor docfixes found by checkdoc for easier am-ing, should anyone want to inspect the changes in-tree. Also, one tweak to the commit message isn't shown in the diff below but has to do with no longer removing erc-nickserv-call-identity-function. In general, I'm pretty much indifferent about preserving a revised rendition of that function as a disembodied wrapper for erc-nickserv-identify. On the one hand, anyone desperate/resourceful enough to have sought out the original (way back whenever) should be capable of taking a little churn in stride. That said, if I were enumerating things to delete from ERC, I'm not sure that'd make the top ten. Olivier Certner (1): ERC: NickServ: Prompt for password last, overall simplifications (bug#46777) etc/NEWS | 13 ++- lisp/erc/erc-services.el | 168 +++++++++++++++++++++++---------------- 2 files changed, 108 insertions(+), 73 deletions(-) Interdiff: diff --git a/lisp/erc/erc-services.el b/lisp/erc/erc-services.el index 4233b4a322..adb3f521cd 100644 --- a/lisp/erc/erc-services.el +++ b/lisp/erc/erc-services.el @@ -404,20 +404,20 @@ erc-nickserv-identify-autodetect identify-regex (string-match identify-regex msg)) (erc-log "NickServ IDENTIFY request detected") - (erc-nickserv-identify nick) + (erc-nickserv-identify nil nick) nil)))) (defun erc-nickserv-identify-on-connect (_server nick) "Identify to Nickserv after the connection to the server is established." (unless (and (eq erc-nickserv-identify-mode 'both) (erc-nickserv-alist-regexp (erc-network))) - (erc-nickserv-identify nick))) + (erc-nickserv-identify nil nick))) (defun erc-nickserv-identify-on-nick-change (nick _old-nick) "Identify to Nickserv whenever your nick changes." (unless (and (eq erc-nickserv-identify-mode 'both) (erc-nickserv-alist-regexp (erc-network))) - (erc-nickserv-identify nick))) + (erc-nickserv-identify nil nick))) (defun erc-nickserv-get-password (nick) "Return the password for NICK from configured sources. @@ -481,8 +481,13 @@ erc-nickserv-send-identify (erc-message msgtype (concat nickserv " " identify-word " " nick password)))) +(defun erc-nickserv-call-identify-function (nickname) + "Call `erc-nickserv-identify' with NICKNAME." + (declare (obsolete erc-nickserv-identify "28.1")) + (erc-nickserv-identify nil nickname)) + ;;;###autoload -(defun erc-nickserv-identify (&optional nick) +(defun erc-nickserv-identify (&optional password nick) "Identify to NickServ immediately. Identification will either use NICK or the current nick if not provided, and some password obtained through @@ -495,16 +500,18 @@ erc-nickserv-identify Returns t if the identify message could be sent, nil otherwise." (interactive (list + nil (read-from-minibuffer "Nickname: " nil nil nil 'erc-nick-history-list (erc-current-nick)))) (unless (and nick (not (string= nick ""))) (setq nick (erc-current-nick))) - (let ((password (erc-nickserv-get-password nick))) - (if password - (erc-nickserv-send-identify nick password) - (erc-error "Cannot find a password for nickname %s" - nick) - nil))) + (unless password + (setq password (erc-nickserv-get-password nick))) + (if password + (erc-nickserv-send-identify nick password) + (erc-error "Cannot find a password for nickname %s" + nick) + nil)) (provide 'erc-services) -- 2.31.1 --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-ERC-NickServ-Prompt-for-password-last-overall-simpli.patch >From 99a110fa6d2f2be7b86bbf7a0c84089f19a1f584 Mon Sep 17 00:00:00 2001 From: Olivier Certner Date: Fri, 5 Feb 2021 15:34:50 +0100 Subject: [PATCH 1/1] ERC: NickServ: Prompt for password last, overall simplifications (bug#46777) When `erc-prompt-for-nickserv-password' is true, don't ignore the other forms of identification. Instead, process them first, and prompt for the password last. Separate concerns (determination of the nick to use, of the password to use, and actual message sending). Note that the user can be interactively prompted for a password on reception of a Nickserv request, as before (on `erc-prompt-for-nickserv-password'). * lisp/erc/erc-services.el (erc-nickserv-identify): Don't take the password anymore as an argument (and don't prompt for it interactively). On the contrary, now take the nick to use for identification (interactively, ask for it, defaulting to the current one). Move actual message sending into the new `erc-nickserv-send-identify', and password prompting into `erc-nickserv-get-password'. (erc-nickserv-send-identify): New function containing the sending code, given the nick and password. (erc-nickserv-get-password): Try each password source in turn, in this order: `erc-nickserv-passwords', auth-source (if `erc-use-auth-source-for-nickserv-password' is true), and in the end prompt the user interactively (if `erc-prompt-for-nickserv-password' is true). If one source returns a string, the function returns it, or nil if the string is empty. (erc-nickserv-call-identify-function): Retained for compatibility but deprecated for simplicity. Prefer invoking erc-nickserv-identify directly instead. (erc-nickserv-identify-autodetect, erc-nickserv-identify-on-connect) (erc-nickserv-identify-on-nick-change): Call `erc-nickserv-identify' directly (`erc-nickserv-call-identify-function' was removed). For the last two functions, remove the redundant checks on the Nickserv identification flags (additionally, it is doubtful they have any measurable impact on performance). --- etc/NEWS | 13 ++- lisp/erc/erc-services.el | 168 +++++++++++++++++++++++---------------- 2 files changed, 108 insertions(+), 73 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index d4f4c81f89..f9f14ea68f 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -2618,13 +2618,20 @@ Interactively, 'C-u C-c C-o' triggers this new optional behavior. ** ERC --- -*** erc-services.el now supports NickServ passwords from auth-source. +*** NickServ passwords can now be retrieved from auth-source The 'erc-use-auth-source-for-nickserv-password' user option enables querying auth-source for NickServ passwords. To enable this, add the following to your init file: - (setq erc-prompt-for-nickserv-password nil - erc-use-auth-source-for-nickserv-password t) + (setq erc-use-auth-source-for-nickserv-password t) + +*** NickServ identification now prompts for password last +When 'erc-prompt-for-nickserv-password' is true, the user used to be +unconditionally prompted interactively for a password, regardless of +the content of `erc-nickserv-passwords', which was effectively ignored +(same for the new 'erc-use-auth-source-for-nickserv-password'). This +limitation is now removed, and the user is interactively prompted +last, after the other identification methods have run. --- *** The '/ignore' command will now ask for a timeout to stop ignoring the user. diff --git a/lisp/erc/erc-services.el b/lisp/erc/erc-services.el index 61006e0c02..adb3f521cd 100644 --- a/lisp/erc/erc-services.el +++ b/lisp/erc/erc-services.el @@ -169,9 +169,8 @@ erc-prompt-for-nickserv-password (defcustom erc-use-auth-source-for-nickserv-password nil "Query auth-source for a password when identifiying to NickServ. -This option has an no effect if `erc-prompt-for-nickserv-password' -is non-nil, and passwords from `erc-nickserv-passwords' take -precedence." +Passwords from `erc-nickserv-passwords' take precedence. See +function `erc-nickserv-get-password'." :version "28.1" :type 'boolean) @@ -405,85 +404,114 @@ erc-nickserv-identify-autodetect identify-regex (string-match identify-regex msg)) (erc-log "NickServ IDENTIFY request detected") - (erc-nickserv-call-identify-function nick) + (erc-nickserv-identify nil nick) nil)))) (defun erc-nickserv-identify-on-connect (_server nick) "Identify to Nickserv after the connection to the server is established." - (unless (or (and (null erc-nickserv-passwords) - (null erc-prompt-for-nickserv-password) - (null erc-use-auth-source-for-nickserv-password)) - (and (eq erc-nickserv-identify-mode 'both) - (erc-nickserv-alist-regexp (erc-network)))) - (erc-nickserv-call-identify-function nick))) + (unless (and (eq erc-nickserv-identify-mode 'both) + (erc-nickserv-alist-regexp (erc-network))) + (erc-nickserv-identify nil nick))) (defun erc-nickserv-identify-on-nick-change (nick _old-nick) "Identify to Nickserv whenever your nick changes." - (unless (or (and (null erc-nickserv-passwords) - (null erc-prompt-for-nickserv-password) - (null erc-use-auth-source-for-nickserv-password)) - (and (eq erc-nickserv-identify-mode 'both) - (erc-nickserv-alist-regexp (erc-network)))) - (erc-nickserv-call-identify-function nick))) - -(defun erc-nickserv-get-password (nickname) - "Return the password for NICKNAME from configured sources. - -It uses `erc-nickserv-passwords' and additionally auth-source -when `erc-use-auth-source-for-nickserv-password' is not nil." - (or - (when erc-nickserv-passwords - (cdr (assoc nickname - (nth 1 (assoc (erc-network) - erc-nickserv-passwords))))) - (when erc-use-auth-source-for-nickserv-password - (let* ((secret (nth 0 (auth-source-search - :max 1 :require '(:secret) - :host (erc-with-server-buffer erc-session-server) - :port (format ; ensure we have a string - "%s" (erc-with-server-buffer erc-session-port)) - :user nickname)))) - (when secret - (let ((passwd (plist-get secret :secret))) - (if (functionp passwd) (funcall passwd) passwd))))))) - -(defun erc-nickserv-call-identify-function (nickname) - "Call `erc-nickserv-identify'. -Either call it interactively or run it with NICKNAME's password, -depending on the value of `erc-prompt-for-nickserv-password'." - (if erc-prompt-for-nickserv-password - (call-interactively 'erc-nickserv-identify) - (erc-nickserv-identify (erc-nickserv-get-password nickname)))) + (unless (and (eq erc-nickserv-identify-mode 'both) + (erc-nickserv-alist-regexp (erc-network))) + (erc-nickserv-identify nil nick))) + +(defun erc-nickserv-get-password (nick) + "Return the password for NICK from configured sources. +First, a password for NICK is looked up in +`erc-nickserv-passwords'. Then, it is looked up in auth-source +if `erc-use-auth-source-for-nickserv-password' is not nil. +Finally, interactively prompt the user, if +`erc-prompt-for-nickserv-password' is true. + +As soon as some source returns a password, the sequence of +lookups stops and this function returns it (or returns nil if it +is empty). Otherwise, no corresponding password was found, and +it returns nil." + (let (network server port) + ;; Fill in local vars, switching to the server buffer once only + (erc-with-server-buffer + (setq network erc-network + server erc-session-server + port erc-session-port)) + (let ((ret + (or + (when erc-nickserv-passwords + (cdr (assoc nick + (cl-second (assoc network + erc-nickserv-passwords))))) + (when erc-use-auth-source-for-nickserv-password + (let ((secret (cl-first (auth-source-search + :max 1 :require '(:secret) + :host server + ;; Ensure a string for :port + :port (format "%s" port) + :user nick)))) + (when secret + (let ((passwd (plist-get secret :secret))) + (if (functionp passwd) (funcall passwd) passwd))))) + (when erc-prompt-for-nickserv-password + (read-passwd + (format "NickServ password for %s on %s (RET to cancel): " + nick network)))))) + (when (and ret (not (string= ret ""))) + ret)))) (defvar erc-auto-discard-away) -;;;###autoload -(defun erc-nickserv-identify (password) +(defun erc-nickserv-send-identify (nick password) "Send an \"identify \" message to NickServ. -When called interactively, read the password using `read-passwd'." +Returns t if the message could be sent, nil otherwise." + (let* ((erc-auto-discard-away nil) + (network (erc-network)) + (nickserv-info (assoc network erc-nickserv-alist)) + (nickserv (or (erc-nickserv-alist-nickserv nil nickserv-info) + "NickServ")) + (identify-word (or (erc-nickserv-alist-ident-keyword + nil nickserv-info) + "IDENTIFY")) + (nick (if (erc-nickserv-alist-use-nick-p nil nickserv-info) + (concat nick " ") + "")) + (msgtype (or (erc-nickserv-alist-ident-command nil nickserv-info) + "PRIVMSG"))) + (erc-message msgtype + (concat nickserv " " identify-word " " nick password)))) + +(defun erc-nickserv-call-identify-function (nickname) + "Call `erc-nickserv-identify' with NICKNAME." + (declare (obsolete erc-nickserv-identify "28.1")) + (erc-nickserv-identify nil nickname)) + +;;;###autoload +(defun erc-nickserv-identify (&optional password nick) + "Identify to NickServ immediately. +Identification will either use NICK or the current nick if not +provided, and some password obtained through +`erc-nickserv-get-password' (which see). If no password can be +found, an error is reported trough `erc-error'. + +Interactively, the user will be prompted for NICK, an empty +string meaning to default to the current nick. + +Returns t if the identify message could be sent, nil otherwise." (interactive - (list (read-passwd - (format "NickServ password for %s on %s (RET to cancel): " - (erc-current-nick) - (or (and (erc-network) - (symbol-name (erc-network))) - "Unknown network"))))) - (when (and password (not (string= "" password))) - (let* ((erc-auto-discard-away nil) - (network (erc-network)) - (nickserv-info (assoc network erc-nickserv-alist)) - (nickserv (or (erc-nickserv-alist-nickserv nil nickserv-info) - "NickServ")) - (identify-word (or (erc-nickserv-alist-ident-keyword - nil nickserv-info) - "IDENTIFY")) - (nick (if (erc-nickserv-alist-use-nick-p nil nickserv-info) - (concat (erc-current-nick) " ") - "")) - (msgtype (or (erc-nickserv-alist-ident-command nil nickserv-info) - "PRIVMSG"))) - (erc-message msgtype - (concat nickserv " " identify-word " " nick password))))) + (list + nil + (read-from-minibuffer "Nickname: " nil nil nil + 'erc-nick-history-list (erc-current-nick)))) + (unless (and nick (not (string= nick ""))) + (setq nick (erc-current-nick))) + (unless password + (setq password (erc-nickserv-get-password nick))) + (if password + (erc-nickserv-send-identify nick password) + (erc-error "Cannot find a password for nickname %s" + nick) + nil)) (provide 'erc-services) -- 2.31.1 --=-=-=--