unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / Atom feed
* bug#45340: erc-services.el: Auth-source support for passwords
@ 2020-12-20 10:54 Leon Vack
  2020-12-21  4:46 ` Lars Ingebrigtsen
                   ` (2 more replies)
  0 siblings, 3 replies; 16+ messages in thread
From: Leon Vack @ 2020-12-20 10:54 UTC (permalink / raw)
  To: 45340

[-- Attachment #1: Type: text/plain, Size: 236 bytes --]


Adds an option to erc-services.el to query auth-source for NickServ
passwords.

This is my first patch to emacs, so please let me know if I missed any
standards.  I am about to start the process of assigning the copyright
to the FSF.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-erc-services.el-Auth-source-support-for-passwords.patch --]
[-- Type: text/x-patch, Size: 5912 bytes --]

From 367593cc4cbfdfbdac778fd15ceb79fd61d7f64c Mon Sep 17 00:00:00 2001
From: Leon Vack <dev@lgcl.de>
Date: Sun, 20 Dec 2020 10:53:33 +0100
Subject: [PATCH] erc-services.el: Auth-source support for passwords

* lisp/etc/erc-services.el (erc-nickserv-passwords): Document that
the passwords are only used when erc-prompt-for-nickserv-password is
nil.
* lisp/etc/erc-services.el
(erc-use-auth-source-for-nickserv-password): New customizable
variable to enable checking auth-source for NickServ passwords.
* lisp/etc/erc-services.el (etc-nickserv-get-password): New function
to handle the lookup of the NickServ password from both auth-source
and the erc-nickserv-passwords variable.
* lisp/etc/erc-services.el (erc-nickserv-call-identify-function):
Use new erc-nickserv-get-password function to lookup NickServ
passwords.
* lisp/etc/erc-services.el (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                 |  4 ++++
 lisp/erc/erc-services.el | 50 ++++++++++++++++++++++++++++++++--------
 2 files changed, 45 insertions(+), 9 deletions(-)

diff --git a/etc/NEWS b/etc/NEWS
index 4a8e70e6a6..c9e0fa7459 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1283,6 +1283,10 @@ 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.
+
 ---
 *** 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..0710813e9d 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 `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\")
@@ -199,7 +213,7 @@ erc-nickserv-passwords
 			(cons :tag "Identity"
 			      (string :tag "Nick")
 			      (string :tag "Password"
-                                      :secret ?*))))))
+				      :secret ?*))))))
 
 ;; Variables:
 
@@ -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,7 +409,8 @@ 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))
+		   (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)))
@@ -402,22 +418,38 @@ erc-nickserv-identify-on-connect
 (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-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))))))))
+    (when password (erc-nickserv-identify (erc-nickserv-get-password nickname)))))
 
 (defvar erc-auto-discard-away)
 
-- 
2.28.0


^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2020-12-20 10:54 bug#45340: erc-services.el: Auth-source support for passwords Leon Vack
@ 2020-12-21  4:46 ` Lars Ingebrigtsen
  2020-12-21  5:44   ` Leon Vack
  2020-12-29  0:12 ` Amin Bandali
  2021-01-13  8:27 ` bug#45340: foo Richard Copley
  2 siblings, 1 reply; 16+ messages in thread
From: Lars Ingebrigtsen @ 2020-12-21  4:46 UTC (permalink / raw)
  To: Leon Vack; +Cc: 45340, Amin Bandali

Leon Vack <dev@lgcl.de> writes:

> Adds an option to erc-services.el to query auth-source for NickServ
> passwords.
>
> This is my first patch to emacs, so please let me know if I missed any
> standards.  I am about to start the process of assigning the copyright
> to the FSF.

Looks good to me; perhaps Amin (added to the Ccs) will have some
comments.

Have you already started the assignment process, or do you need the
assignment form to get started?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2020-12-21  4:46 ` Lars Ingebrigtsen
@ 2020-12-21  5:44   ` Leon Vack
  0 siblings, 0 replies; 16+ messages in thread
From: Leon Vack @ 2020-12-21  5:44 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 45340, Amin Bandali, Leon Vack


> Have you already started the assignment process, or do you need the
> assignment form to get started?

Yes, I have the form and started the assignment process with it. Thanks
for asking.






^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2020-12-20 10:54 bug#45340: erc-services.el: Auth-source support for passwords Leon Vack
  2020-12-21  4:46 ` Lars Ingebrigtsen
@ 2020-12-29  0:12 ` Amin Bandali
  2020-12-29  8:24   ` Leon Vack
  2021-01-13  8:27 ` bug#45340: foo Richard Copley
  2 siblings, 1 reply; 16+ messages in thread
From: Amin Bandali @ 2020-12-29  0:12 UTC (permalink / raw)
  To: Leon Vack, Lars Ingebrigtsen; +Cc: 45340

[-- Attachment #1: Type: text/plain, Size: 8865 bytes --]

Hello Leon, Lars,

Thanks for your patch, Leon.  I've left some stylistic comments below,
until I get a chance to have a closer look at your patch and take it for
a test run in the next week or so. :-)

                                 * * *

Leon Vack writes:

>> Have you already started the assignment process, or do you need the
>> assignment form to get started?
>
> Yes, I have the form and started the assignment process with it. Thanks
> for asking.

Great.  Please let me know when you hear from the copyright clerk about
the completion of the process.

                                 * * *

Leon Vack writes:

> Adds an option to erc-services.el to query auth-source for NickServ
> passwords.
>
> This is my first patch to emacs, so please let me know if I missed any
> standards.  I am about to start the process of assigning the copyright
> to the FSF.

Thanks!

To begin with, please use spaces for indenting on the lines you change
or the new lines you add throughout your patch.

>>From 367593cc4cbfdfbdac778fd15ceb79fd61d7f64c Mon Sep 17 00:00:00 2001
> From: Leon Vack <dev@lgcl.de>
> Date: Sun, 20 Dec 2020 10:53:33 +0100
> Subject: [PATCH] erc-services.el: Auth-source support for passwords

Please rewrite the subject to conform to the conventions laid out in
emacs.git's CONTRIBUTE file.  Perhaps something like this:

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.
> * lisp/etc/erc-services.el
> (erc-use-auth-source-for-nickserv-password): New customizable
> variable to enable checking auth-source for NickServ passwords.
> * lisp/etc/erc-services.el (etc-nickserv-get-password): New function
> to handle the lookup of the NickServ password from both auth-source
> and the erc-nickserv-passwords variable.
> * lisp/etc/erc-services.el (erc-nickserv-call-identify-function):
> Use new erc-nickserv-get-password function to lookup NickServ
> passwords.
> * lisp/etc/erc-services.el (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.

You don't have to repeat the "* lisp/etc/erc-services.el" at the
beginning of each of those subsequent lines.  You can simply start those
lines with parenthesized name of the modified function/variable,
followed by a colon, followed by the change description.

Also, for the last entry, you can merge the multiple parenthesized names
into one, like so:

  (erc-nickserv-identify-autodetect, erc-nickserv-identify-on-connect,
  erc-nickserv-identify-on-nick-change): Call ......

Lastly, please add a simple line like "* etc/NEWS: Document change."
about the etc/NEWS update also.

> ---
>  etc/NEWS                 |  4 ++++
>  lisp/erc/erc-services.el | 50 ++++++++++++++++++++++++++++++++--------
>  2 files changed, 45 insertions(+), 9 deletions(-)
>
> diff --git a/etc/NEWS b/etc/NEWS
> index 4a8e70e6a6..c9e0fa7459 100644
> --- a/etc/NEWS
> +++ b/etc/NEWS
> @@ -1283,6 +1283,10 @@ 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.
> +
>  ---
>  *** 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".

Please consider adding example(s) of use to the NEWS entry.

> diff --git a/lisp/erc/erc-services.el b/lisp/erc/erc-services.el
> index c0011f9808..0710813e9d 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 `erc-prompt-for-nickserv-password'
                               ^
                               add missing 'if'
> +is not nil and passwords from `erc-nickserv-passwords' take
             ^
             add missing comma ','
> +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\")
> @@ -199,7 +213,7 @@ erc-nickserv-passwords
>  			(cons :tag "Identity"
>  			      (string :tag "Nick")
>  			      (string :tag "Password"
> -                                      :secret ?*))))))
> +				      :secret ?*))))))
>  
>  ;; Variables:
>  
> @@ -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,7 +409,8 @@ 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))
> +		   (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)))
> @@ -402,22 +418,38 @@ erc-nickserv-identify-on-connect
>  (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-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

Strange formatting/indentation.  I would prefer it if
"(when erc-nickserv-passwords" started on its own line, and
"(cdr (assoc nickname" on the line below it, and the region
indented using spaces and properly, in a way that the lines
fit the 70-character line length convention.

> +		    (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))))))))
> +    (when password (erc-nickserv-identify (erc-nickserv-get-password nickname)))))

This line is too long; please reformat.

>  
>  (defvar erc-auto-discard-away)

                                 * * *

Thanks!

-- 
https://bndl.org
Free Software activist | GNU maintainer & webmaster
GPG: BE62 7373 8E61 6D6D 1B3A  08E8 A21A 0202 4881 6103

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 857 bytes --]

^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2020-12-29  0:12 ` Amin Bandali
@ 2020-12-29  8:24   ` Leon Vack
  2021-01-09  7:22     ` Leon Vack
  2021-01-10 11:49     ` Lars Ingebrigtsen
  0 siblings, 2 replies; 16+ messages in thread
From: Leon Vack @ 2020-12-29  8:24 UTC (permalink / raw)
  To: Amin Bandali; +Cc: Lars Ingebrigtsen, 45340

[-- Attachment #1: Type: text/plain, Size: 285 bytes --]


Hello Amin,

>
> Thanks for your patch, Leon.  I've left some stylistic comments below,
> until I get a chance to have a closer look at your patch and take it for
> a test run in the next week or so. :-)
>

Thanks for the pointers. I attached a new patch with all of them addressed.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Support-using-auth-source-for-NickServ-passwords-in-.patch --]
[-- Type: text/x-patch, Size: 6226 bytes --]

From 45544bbf6b197e545297430f511bf7ca75962673 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..a367873090 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,50 @@ 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))))))))
+    (when password (erc-nickserv-identify
+                    (erc-nickserv-get-password nickname)))))
 
 (defvar erc-auto-discard-away)
 
-- 
2.28.0


[-- Attachment #3: Type: text/plain, Size: 417 bytes --]


>>> Have you already started the assignment process, or do you need the
>>> assignment form to get started?
>>
>> Yes, I have the form and started the assignment process with it. Thanks
>> for asking.
>
> Great.  Please let me know when you hear from the copyright clerk about
> the completion of the process.
>

I have already sent the singed paperwork and will let you know once I
have the copy singed by the FSF.

^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2020-12-29  8:24   ` Leon Vack
@ 2021-01-09  7:22     ` Leon Vack
  2021-01-10 11:49     ` Lars Ingebrigtsen
  1 sibling, 0 replies; 16+ messages in thread
From: Leon Vack @ 2021-01-09  7:22 UTC (permalink / raw)
  To: Leon Vack; +Cc: Lars Ingebrigtsen, 45340, Amin Bandali


>>>> Have you already started the assignment process, or do you need the
>>>> assignment form to get started?
>>>
>>> Yes, I have the form and started the assignment process with it. Thanks
>>> for asking.
>>
>> Great.  Please let me know when you hear from the copyright clerk about
>> the completion of the process.
>>
>
> I have already sent the singed paperwork and will let you know once I
> have the copy singed by the FSF.

I have now received the paperwork countersigned by the FSF.





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2020-12-29  8:24   ` Leon Vack
  2021-01-09  7:22     ` Leon Vack
@ 2021-01-10 11:49     ` Lars Ingebrigtsen
  2021-01-11 14:38       ` Leon Vack
  1 sibling, 1 reply; 16+ messages in thread
From: Lars Ingebrigtsen @ 2021-01-10 11:49 UTC (permalink / raw)
  To: Leon Vack; +Cc: 45340, Amin Bandali

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...

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2021-01-10 11:49     ` Lars Ingebrigtsen
@ 2021-01-11 14:38       ` Leon Vack
  2021-01-11 14:51         ` Lars Ingebrigtsen
  0 siblings, 1 reply; 16+ messages in thread
From: Leon Vack @ 2021-01-11 14:38 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 45340, Amin Bandali

[-- Attachment #1: Type: text/plain, Size: 630 bytes --]


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).


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Support-using-auth-source-for-NickServ-passwords-in-.patch --]
[-- Type: text/x-patch, Size: 6315 bytes --]

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


^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2021-01-11 14:38       ` Leon Vack
@ 2021-01-11 14:51         ` Lars Ingebrigtsen
  2021-01-11 16:04           ` Leon Vack
  0 siblings, 1 reply; 16+ messages in thread
From: Lars Ingebrigtsen @ 2021-01-11 14:51 UTC (permalink / raw)
  To: Leon Vack; +Cc: 45340, Amin Bandali

Leon Vack <dev@lgcl.de> writes:

> 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).

Thanks; looks good to me, so I've pushed it to Emacs 28.  Should there
be something in the erc manual, though?

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2021-01-11 14:51         ` Lars Ingebrigtsen
@ 2021-01-11 16:04           ` Leon Vack
  2021-01-11 16:06             ` Lars Ingebrigtsen
  0 siblings, 1 reply; 16+ messages in thread
From: Leon Vack @ 2021-01-11 16:04 UTC (permalink / raw)
  To: Lars Ingebrigtsen; +Cc: 45340, Amin Bandali


Lars Ingebrigtsen <larsi@gnus.org> writes:

> Thanks; looks good to me, so I've pushed it to Emacs 28.  Should there
> be something in the erc manual, though?

I am happy to have my first contribution pushed!

About documentation, I would have added to the manual, if there was
anything substantial about erc-services or ERC's NickServ
capabilities. It is only mentioned in the list of modules with a one
sentence explanation of what it does and no options are documented.





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2021-01-11 16:04           ` Leon Vack
@ 2021-01-11 16:06             ` Lars Ingebrigtsen
  2021-01-15  9:46               ` Olivier Certner
  0 siblings, 1 reply; 16+ messages in thread
From: Lars Ingebrigtsen @ 2021-01-11 16:06 UTC (permalink / raw)
  To: Leon Vack; +Cc: 45340, Amin Bandali

Leon Vack <dev@lgcl.de> writes:

> About documentation, I would have added to the manual, if there was
> anything substantial about erc-services or ERC's NickServ
> capabilities. It is only mentioned in the list of modules with a one
> sentence explanation of what it does and no options are documented.

Ah, right, so I guess there's nothing more here to be done.  Thanks for
checking.

-- 
(domestic pets only, the antidote for overdose, milk.)
   bloggy blog: http://lars.ingebrigtsen.no





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: foo
  2020-12-20 10:54 bug#45340: erc-services.el: Auth-source support for passwords Leon Vack
  2020-12-21  4:46 ` Lars Ingebrigtsen
  2020-12-29  0:12 ` Amin Bandali
@ 2021-01-13  8:27 ` Richard Copley
  2021-01-15 21:48   ` Basil L. Contovounesios
  2 siblings, 1 reply; 16+ messages in thread
From: Richard Copley @ 2021-01-13  8:27 UTC (permalink / raw)
  To: 45340, Leon Vack

https://git.savannah.gnu.org/cgit/emacs.git/diff/lisp/window.el?id=42e72f4adee8809ed754a14e11e058f40b337f78





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2021-01-11 16:06             ` Lars Ingebrigtsen
@ 2021-01-15  9:46               ` Olivier Certner
  2021-01-15 11:10                 ` Leon Vack
  0 siblings, 1 reply; 16+ messages in thread
From: Olivier Certner @ 2021-01-15  9:46 UTC (permalink / raw)
  To: dev, 45340; +Cc: larsi, bandali

Hi,

Sorry to be late to the party, but what is exactly this bug (and the patch) 
about? I'm asking this because I've been using auth source for NickServ 
passwords for a while now, without any patch. And I just want to make sure 
that this is going to continue to work (of course, I don't mind possibly 
changing some configuration variables if required). I've skimmed through the 
bug report and the patch, and while I see no particular problem there, I 
wonder if some existing things have not been overlooked.

I have `erc-prompt-for-password' set to nil (not `erc-prompt-for-nickserv-
password'), and indeed I get prompted for a NickServ password. At this point, 
I just hit ENTER without entering anything, and my password from auth source 
is automatically picked up. So there seems to be an already existing mechanism 
for getting the password used for NickServ from auth source.

Or is it a confusion on my part, and the introduced functionality is in fact 
different?

Regards.

-- 
Olivier Certner







^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2021-01-15  9:46               ` Olivier Certner
@ 2021-01-15 11:10                 ` Leon Vack
  2021-01-15 12:41                   ` Olivier Certner
  0 siblings, 1 reply; 16+ messages in thread
From: Leon Vack @ 2021-01-15 11:10 UTC (permalink / raw)
  To: Olivier Certner; +Cc: larsi, 45340, bandali, dev


Olivier Certner <ocert.dev@free.fr> writes:

> Hi,
>

Hello,

> Sorry to be late to the party, but what is exactly this bug (and the patch) 
> about? I'm asking this because I've been using auth source for NickServ 
> passwords for a while now, without any patch. And I just want to make sure 
> that this is going to continue to work (of course, I don't mind possibly 
> changing some configuration variables if required). I've skimmed through the 
> bug report and the patch, and while I see no particular problem there, I 
> wonder if some existing things have not been overlooked.
>
> I have `erc-prompt-for-password' set to nil (not `erc-prompt-for-nickserv-
> password'), and indeed I get prompted for a NickServ password. At this point, 
> I just hit ENTER without entering anything, and my password from auth source 
> is automatically picked up. So there seems to be an already existing mechanism 
> for getting the password used for NickServ from auth source.

I was not aware of this, but I have done some debugging and the NickServ
authentication you use mostly likely does not go through erc-services,
but the core erc functionality to connect, which sends a PASS command
with a password from auth source. At least freenode accepts this as a way
to do NickServ authentication and the patch does not effect this
functionality at all. To check if that is indeed the case, maybe try
connecting without having the erc-services module loaded.

>
> Or is it a confusion on my part, and the introduced functionality is in fact 
> different?
>

This patch introduces a different functionality as described above, as
erc-services, which only handles authentication with actual /nickserv
identify commands (not handled by the core connect functionality), did
not query auth source before this patch.

> Regards.

Regards,
Leon Vack





^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: erc-services.el: Auth-source support for passwords
  2021-01-15 11:10                 ` Leon Vack
@ 2021-01-15 12:41                   ` Olivier Certner
  0 siblings, 0 replies; 16+ messages in thread
From: Olivier Certner @ 2021-01-15 12:41 UTC (permalink / raw)
  To: dev, 45340; +Cc: larsi, bandali

Hi Leon,

> I was not aware of this, but I have done some debugging and the NickServ
> authentication you use mostly likely does not go through erc-services,
> but the core erc functionality to connect, which sends a PASS command
> with a password from auth source. At least freenode accepts this as a way
> to do NickServ authentication and the patch does not effect this
> functionality at all. To check if that is indeed the case, maybe try
> connecting without having the erc-services module loaded.

Yes, seems to me that you are right, after activating IRC protocol debug 
(`erc-toggle-debug-irc-protocol'), reconnecting to Freenode and looking at the 
logs.

> This patch introduces a different functionality as described above, as
> erc-services, which only handles authentication with actual /nickserv
> identify commands (not handled by the core connect functionality), did
> not query auth source before this patch.

Fine, I thought this may have been already implemented somehow because of 
Freenode's special behavior.

Thanks for looking at this, and for this patch!

After reviewing the code more in details, I think it is great that `erc-
nickserv-get-password' first tries to find a password in `erc-nickserv-
passwords' before proceeding with auth source. `erc-nickserv-passwords' is the 
easiest to customize, and I suspect it is mostly used for interactive override 
or common presets in the init file.

I also have some further suggestion, beyond this enhancement. I think it would 
be even more useful that `erc-prompt-for-nickserv-password' is not required to 
be nil for auth source (or `erc-nickserv-passwords', for that purpose) to be 
used, but rather that, if search in `erc-nickserv-passwords' and auth source 
(if enabled) fails, then prompting should be used as a last resort (if 
enabled). I think this would cover all the use cases I can think of (with 
proper settings of `erc-prompt-for-nickserv-password' and `erc-use-auth-
source-for-nickserv-password'). If more customizations are required, or just 
for the sake of 'simplicity' (YMMV), than maybe replacing these booleans with 
a single list indicating the means to get the password and their order could 
be nice.

What do people think?

Regards.
 
-- 
Olivier Certner







^ permalink raw reply	[flat|nested] 16+ messages in thread

* bug#45340: foo
  2021-01-13  8:27 ` bug#45340: foo Richard Copley
@ 2021-01-15 21:48   ` Basil L. Contovounesios
  0 siblings, 0 replies; 16+ messages in thread
From: Basil L. Contovounesios @ 2021-01-15 21:48 UTC (permalink / raw)
  To: Richard Copley; +Cc: 45340, Leon Vack

Richard Copley <rcopley@gmail.com> writes:

> https://git.savannah.gnu.org/cgit/emacs.git/diff/lisp/window.el?id=42e72f4adee8809ed754a14e11e058f40b337f78

Thanks for catching that; fixed.

; Remove recent spurious addition in window.el
f45be48ddb 2021-01-15 21:46:54 +0000
https://git.savannah.gnu.org/cgit/emacs.git/commit/?id=f45be48ddbde00610e1e08fca6590dcf24a4e1b5

-- 
Basil





^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2021-01-15 21:48 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-20 10:54 bug#45340: erc-services.el: Auth-source support for passwords Leon Vack
2020-12-21  4:46 ` Lars Ingebrigtsen
2020-12-21  5:44   ` Leon Vack
2020-12-29  0:12 ` Amin Bandali
2020-12-29  8:24   ` Leon Vack
2021-01-09  7:22     ` Leon Vack
2021-01-10 11:49     ` Lars Ingebrigtsen
2021-01-11 14:38       ` Leon Vack
2021-01-11 14:51         ` Lars Ingebrigtsen
2021-01-11 16:04           ` Leon Vack
2021-01-11 16:06             ` Lars Ingebrigtsen
2021-01-15  9:46               ` Olivier Certner
2021-01-15 11:10                 ` Leon Vack
2021-01-15 12:41                   ` Olivier Certner
2021-01-13  8:27 ` bug#45340: foo Richard Copley
2021-01-15 21:48   ` Basil L. Contovounesios

unofficial mirror of bug-gnu-emacs@gnu.org 

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://yhetil.org/emacs-bugs/0 emacs-bugs/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 emacs-bugs emacs-bugs/ https://yhetil.org/emacs-bugs \
		bug-gnu-emacs@gnu.org
	public-inbox-index emacs-bugs

Example config snippet for mirrors.
Newsgroups are available over NNTP:
	nntp://news.yhetil.org/yhetil.emacs.bugs
	nntp://news.gmane.io/gmane.emacs.bugs


AGPL code for this site: git clone http://ou63pmih66umazou.onion/public-inbox.git