[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#45340: erc-services.el: Auth-source support for passwords
From: |
Leon Vack |
Subject: |
bug#45340: erc-services.el: Auth-source support for passwords |
Date: |
Mon, 11 Jan 2021 14:38:02 GMT |
Lars Ingebrigtsen <larsi@gnus.org> writes:
> Leon Vack <dev@lgcl.de> writes:
>
>> Thanks for the pointers. I attached a new patch with all of them addressed.
>
> This leads to the following warning:
>
> In erc-nickserv-call-identify-function:
> erc/erc-services.el:454:11: Warning: reference to free variable `password'
>
> And the code in that function doesn't look correct to me...
Yes, that is a mistake on my part, it must have slipped through from an
earlier implementation I wrote and used. Sorry about that.
I have fixed that in the attached patch and done some testing (without
changing anything after it this time).
>From 02d6ddfe3b07a793855dd87ea0d9ba4daee8af3f Mon Sep 17 00:00:00 2001
From: Leon Vack <dev@lgcl.de>
Date: Sun, 20 Dec 2020 10:53:33 +0100
Subject: [PATCH] Support using auth-source for NickServ passwords in ERC
* lisp/etc/erc-services.el (erc-nickserv-passwords): Document that
the passwords are only used when erc-prompt-for-nickserv-password
is nil.
* (erc-use-auth-source-for-nickserv-password): New customizable
variable to enable checking auth-source for NickServ passwords.
* (etc-nickserv-get-password): New function to handle the lookup
of the NickServ password from both auth-source and the
erc-nickserv-passwords variable.
* (erc-nickserv-call-identify-function): Use new
erc-nickserv-get-password function to lookup NickServ passwords.
* (erc-nickserv-identify-autodetect, erc-nickserv-identify-on-connect,
erc-nickserv-identify-on-nick-change): Call
erc-nickserv-call-identify-function when
erc-use-auth-source-for-nickserv-password is set.
* etc/NEWS: Document change.
---
etc/NEWS | 9 ++++++
lisp/erc/erc-services.el | 59 ++++++++++++++++++++++++++++++++--------
2 files changed, 56 insertions(+), 12 deletions(-)
diff --git a/etc/NEWS b/etc/NEWS
index 4a8e70e6a6..d722592fd3 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1283,6 +1283,15 @@ https://www.w3.org/TR/xml/#charsets). Now it rejects
such strings.
** erc
+*** erc-services.el now supports NickServ passwords from auth-source.
+The 'erc-use-auth-source-for-nickserv-password' 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)
+
+
---
*** The '/ignore' command will now ask for a timeout to stop ignoring the user.
Allowed inputs are seconds or ISO8601-like periods like "1h" or "4h30m".
diff --git a/lisp/erc/erc-services.el b/lisp/erc/erc-services.el
index c0011f9808..60c7852edf 100644
--- a/lisp/erc/erc-services.el
+++ b/lisp/erc/erc-services.el
@@ -168,9 +168,23 @@ erc-prompt-for-nickserv-password
:group 'erc-services
:type 'boolean)
+(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 not nil, and passwords from `erc-nickserv-passwords' take
+precedence."
+ :version "28.1"
+ :group 'erc-services
+ :type 'boolean)
+
(defcustom erc-nickserv-passwords nil
"Passwords used when identifying to NickServ automatically.
+`erc-prompt-for-nickserv-password' must be nil for these
+passwords to be used.
+
Example of use:
(setq erc-nickserv-passwords
\\='((freenode ((\"nick-one\" . \"password\")
@@ -375,7 +389,8 @@ erc-nickserv-identify-autodetect
If `erc-prompt-for-nickserv-password' is non-nil, prompt the user for the
password for this nickname, otherwise try to send it automatically."
(unless (and (null erc-nickserv-passwords)
- (null erc-prompt-for-nickserv-password))
+ (null erc-prompt-for-nickserv-password)
+ (null erc-use-auth-source-for-nickserv-password))
(let* ((network (erc-network))
(sender (erc-nickserv-alist-sender network))
(identify-regex (erc-nickserv-alist-regexp network))
@@ -394,30 +409,49 @@ erc-nickserv-identify-autodetect
(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))
- (and (eq erc-nickserv-identify-mode 'both)
- (erc-nickserv-alist-regexp (erc-network))))
+ (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-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))
- (and (eq erc-nickserv-identify-mode 'both)
- (erc-nickserv-alist-regexp (erc-network))))
+ (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)
- (when erc-nickserv-passwords
- (erc-nickserv-identify
- (cdr (assoc nickname
- (nth 1 (assoc (erc-network)
- erc-nickserv-passwords))))))))
+ (erc-nickserv-identify (erc-nickserv-get-password nickname))))
(defvar erc-auto-discard-away)
@@ -451,6 +485,7 @@ erc-nickserv-identify
(provide 'erc-services)
+
;;; erc-services.el ends here
;;
;; Local Variables:
--
2.28.0
- bug#45340: erc-services.el: Auth-source support for passwords, Leon Vack, 2021/01/09
- bug#45340: erc-services.el: Auth-source support for passwords, Lars Ingebrigtsen, 2021/01/10
- bug#45340: erc-services.el: Auth-source support for passwords,
Leon Vack <=
- bug#45340: erc-services.el: Auth-source support for passwords, Lars Ingebrigtsen, 2021/01/11
- bug#45340: erc-services.el: Auth-source support for passwords, Leon Vack, 2021/01/11
- bug#45340: erc-services.el: Auth-source support for passwords, Lars Ingebrigtsen, 2021/01/11
- bug#45340: erc-services.el: Auth-source support for passwords, Olivier Certner, 2021/01/15
- bug#45340: erc-services.el: Auth-source support for passwords, Leon Vack, 2021/01/15
- bug#45340: erc-services.el: Auth-source support for passwords, Olivier Certner, 2021/01/15
- bug#45340: erc-services.el: Auth-source support for passwords, Leon Vack, 2021/01/20