emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 42e72f4 1/3: Support using auth-source for NickServ passwords in


From: Lars Ingebrigtsen
Subject: master 42e72f4 1/3: Support using auth-source for NickServ passwords in ERC
Date: Mon, 11 Jan 2021 10:42:42 -0500 (EST)

branch: master
commit 42e72f4adee8809ed754a14e11e058f40b337f78
Author: Leon Vack <dev@lgcl.de>
Commit: Lars Ingebrigtsen <larsi@gnus.org>

    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 (bug#45340).
---
 etc/NEWS                 |  8 +++++++
 lisp/erc/erc-services.el | 56 +++++++++++++++++++++++++++++++++++++-----------
 lisp/window.el           |  1 +
 3 files changed, 53 insertions(+), 12 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 7e84d69..a6419d6 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1371,6 +1371,14 @@ 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' variable 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 4f9b0b1..9ef8b7f 100644
--- a/lisp/erc/erc-services.el
+++ b/lisp/erc/erc-services.el
@@ -168,8 +168,19 @@ You can also use \\[erc-nickserv-identify-mode] to change 
modes."
   :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 non-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
@@ -375,7 +386,8 @@ Make sure it is the real NickServ for this network.
 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 +406,49 @@ password for this nickname, otherwise try to send it 
automatically."
 (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 +482,7 @@ When called interactively, read the password using 
`read-passwd'."
 
 (provide 'erc-services)
 
+
 ;;; erc-services.el ends here
 ;;
 ;; Local Variables:
diff --git a/lisp/window.el b/lisp/window.el
index a6cdd4d..5bb7d57 100644
--- a/lisp/window.el
+++ b/lisp/window.el
@@ -8314,6 +8314,7 @@ indirectly called by the latter."
       (when (and (listp quad)
                 (integerp (nth 3 quad))
                 (> (nth 3 quad) (window-total-height window)))
+        (message "foo")
        (condition-case nil
            (window-resize window (- (nth 3 quad) (window-total-height window)))
          (error nil)))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]