Conectandose al IRC con GNU Emacs y ERC.

By | May 12, 2020

GNU Emacs viene de base con el paquete ERC para poder conectarnos al IRC.

En este breve artículo publicamos como automatizar el proceso de conectarnos a las redes de Freenode y OFTC, autenticación de nuestro nick con NickServ, y entrar en los canales que definamos.

A su vez, para más seguridad, las claves van a ser encriptadas con GPG.

Se asume que previamente se ha configurado GPG en el sistema.
También se asume que previamente los usuarios han sido registrados en los respectivos NickServ de cada servidor de IRC.

Comenzamos:

1. Crear el fichero .authinfo

machine irc.freenode.net login **** password ****
machine irc.oftc.net login **** password ****

Nota: omitimos los valores reales del nick y el password.

2. Encriptar el fichero .authinfo

Desde Emacs

M-x epa-encrypt-file
Seleccionamos .authinfo

Esto creará el fichero .authinfo.gpg

Nota 1: El módulo que hace posible esto se llama EasyPG.
Nota 2: A partir de ahora, podemos borrar .authinfo, cada vez Emacs abra el fichero .authinfo.gpg lo desencriptará automaticamente para poder editarlo y lo encriptará al guardar.

3. Automatizar la conexión a los servidores de ERC.

Ejemplo:


;; Lectura de las claves encriptadas en .authinfo.gpg
(setq auth-sources
'((:source "~/.authinfo.gpg"
auth-source-debug t)))


(setq erc-autojoin-timing 'ident)
(setq erc-prompt-for-nickserv-password nil)

;; Entrada automática a los canales de cada servidor IRC
(setq erc-autojoin-channels-alist
'(("freenode.net" "#emacs-es" "#debian" "#nethack")
("oftc.net" "#debian-next" "#oftc")

))


;; Identificación con cada servidor. Cambiar el valor del nick apropiadamente en cada caso.
(erc-tls :server "irc.freenode.net" :port 6697 :nick "****")
(erc-tls :server "irc.oftc.net" :port 6697 :nick "****")

4. Con oftc en lugar de usar NickServ, usaremos un certificado personal

Como alternativa a la validación por clave o password, existe la posibilidad de usar certificados para conectarse al servidor, por ejemplo, si usamos un certificado para conectarse con OFTC: https://www.oftc.net/NickServ/CertFP/

Las instrucciones para versiones Emacs 27 o 28 están aquí: https://www.emacswiki.org/emacs/ErcSSL

En concreto nosotros creamos el certificado tal como se indica en la página de oftc.net y a continuación añadimos esto a nuestros ficheros init de emacs.

  (with-eval-after-load 'erc
  
    ;; erc hack for gnutls for client cert.
    (defvar *uconf/erc-certs* nil
      "erc client certs used by gnutls package for :keylist.")
  
    ;; copied from the gnutls lib but set :keylist to client certs.
    ;; this function is called from `open-network-stream' with :type tls.
    (defun uconf/open-gnutls-stream (name buffer host service &optional nowait)
      (let ((process (open-network-stream
                      name buffer host service
                      :nowait nowait
                      :tls-parameters
                      (and nowait
                           (cons 'gnutls-x509pki
                                 (gnutls-boot-parameters
                                  :type 'gnutls-x509pki
                                  :keylist *uconf/erc-certs* ;;added parameter to pass the cert.
                                  :hostname (puny-encode-domain host)))))))
        (if nowait
            process
          (gnutls-negotiate :process process
                            :type 'gnutls-x509pki
                            :keylist *uconf/erc-certs* ;;added parameter to pass the cert.
                            :hostname (puny-encode-domain host)))))
  
    ;; only set the global variable when used from `erc-tls'.
    (defun uconf/erc-open-tls-stream (name buffer host port)
      (unwind-protect
          (progn
            (setq *uconf/erc-certs*
                  '(("/path/to/your/keyfile" "/path/to/ your/certfile")))
            (open-network-stream name buffer host port
                                 :nowait t
                                 :type 'tls))
        (setq *uconf/erc-certs* nil)))
  
    (advice-add 'open-gnutls-stream :override #'uconf/open-gnutls-stream)
    (advice-add 'erc-open-tls-stream :override #'uconf/erc-open-tls-stream)
    )


Leave a Reply

Your email address will not be published. Required fields are marked *