MS Exchange, Emacs, IMAP y NTLM: una combinación explosiva

Aviso: !Este mensaje contiene tecno-jerga a raudales!

Si has seguido este blog desde hace tiempo, sabrás que me gusta usar Gnus (un complemento del editor Emacs) para leer el correo electrónico. Para los estándares actuales la mayoría de la gente diría que es antediluviano y poco vistoso (es en modo caracter) y amigable (básicamente se hace todo a base de combinaciones de teclas, aunque la versión gráfica de Emacs permite usar el ratón). Tiene además la gran ventaja (estoy seguro de que una inmensa mayoría de gente dirá que es una desventaja) de que los mensajes de correo en html se ven como puro texto, sin colorines, negritas, imagenes ni otras distracciones visuales (que en el 99% de los casos no aportan absolutamente nada).

Sin embargo, tiene para mí múltiples ventajas: un buen editor (y no lo que traen la mayoría de los gestores de correo, que con todos mis respectos, son una castaña), gestión ágil y eficiente de volúmenes de correo importantes (especialmente la clasificación) y lo que más me interesaba en estos momentos y que no conseguía con mi lector de correo actual en el trabajo (Thunderbird): que las “carpetas” de correo que no contienen mensajes no leidos no se muestren en absoluto.

Esto último es algo que Gnus hace por defecto, y cuando uno tiene muchas carpetas es especialmente agradecido. Primero porque no ocupa espacio de pantalla (algo interesante en si mismo), y segundo porque para saber si tienes correo nuevo en alguna de esas carpetas tienes que recorrer toda la lista (y en mi caso usar el ratón para desplazar la barra de deslizamiento, lo cual es un incordio adicional).

La única razón que impedía dar el salto es (mejor dicho era) que el servidor de correo del trabajo (MS Exchange) está configurado de forma que en el acceso via IMAP hay que autenticarse por medio de NTLM (en concreto por medio de NTLMSSP). Y en el caso de la versión de Gnus que viene en las distribuciones Linux que uso (Debian Lenny y Ubuntu 8.10) no hay soporte para este tipo de autenticación.

Por suerte la siguiente versión de Gnus traerá de serie soporte para IMAP con NTLM (a través del autenticador sasl), así que me he bajado la versión, la he compilado e instalado. He puesto la configuración que supuestamente hace falta (la documentación no es que se escasa, es que a día de hoy es inexistente) y he probado. Por supuesto no ha funcionado :-).

Pero como tengo la cabeza un poco dura para estas cosas, he gastado un rato leyendo en San Google todo lo que he encontrado (que me ha servido para poco al final) y por último he acabado entrando al código. Como mi lisp no es tan bueno como me gustaría, me he ayudado del depurador interno de Emacs para ejecutar paso a paso el código y ver dónde fallaba el asunto. Y al final ha sido donde menos me esperaba, la verdad: al intentar codificar en base64 la cadena de la solicitud de autenticación via NTLM.

Parece ser que el código construye la cadena como un string (en lugar de una secuencia de bytes) y ésta se le pasa a la función base64-encode-string. Ésta última es un poco señorita y si le pasamos caracteres que no son puramente ASCII o de un par de subconjuntos determinados de caracteres de 8 bits, nos da un bonito error y se termina el asunto. Y pura casualidad, la solicitud de autenticación tiene caracteres de fuera de esos subconjuntos (concretamente caracteres multibyte, según reza el mensaje de error). Así que he leido en San Google que usando encode-coding-string podía convertir una cadena de caracters multibyte en una que le gustara a base64-encode-string y allí me he lanzado. En un par de intentos para acertar con la sintaxis ya estaba la cosa funcionando :-)

Por si algún loco quiere usarlo, ahí van los datos más importantes:

  • Bajarse la versión ‘ngnus’ de Gnus (o posterior) de http://ww.gnus.org/dist/. Hay que parchear el fichero lisp/ntlm.el antes de compilarlo, con el parche que puedes descargar aquí (ntlm.el.diff.zip, lo he tenido que subir zipeado porque WordPress no me dejaba subir ficheros con extensión .diff :-( ) Luego simplemente sigue las instrucciones de instalación de Gnus que hay en el fichero README.
  • La configuración para el fichero ~/.gnus (suponiendo que lo configuramos como una fuente de mensajes secundaria, no la principal):
    (setq gnus-secondary-select-methods
          '((nnimap "Exchange"
             (nnimap-address "ip.del.servidor.exchange")
             (nnimap-authenticator sasl)))
  • Las credenciales para la validación automática (esta parte es opcional). Por defecto van en el fichero ~/.authinfo
    machine ip.de.servidor.exchange login usuario@dominio password contraseña

    donde ‘usuario’ es el nombre de usuario de MS Windows, y ‘dominio’ el nombre de dominio corto (NETBIOS) de MS Window. Es importante usar la forma ‘usuario@dominio’ a la hora de especificar el nombre de usuario. Sino la validación puede fallar.

Creo que eso es todo. Si algún otro “loco” lo intenta y no le funciona que lo comente por aquí. Igual me he dejado algún detallito.

Iñaki.

Leave a Reply

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

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">