Actualizador automatizado RoundCube -- MailAdmin -- Administrador de correo


#1

1. Introducción

Core-Admin incluye un sistema para desplegar y mantener actualizado de manera automática una instancia RoundCube asociada al Administrador de Correo (#MailAdmin).

Este artículo explica elementos que soporta, versiones y cómo reparar/reconstruir la instalación.

2. Versiones soportadas

Versión RoundCube Activa Soportada desde Info
1.6.20 :white_check_mark: 20/10/2026 Actualización de seguridad (1.6.17 a 1.6.20: XSS, SSRF, inyección de cabeceras y comandos IMAP, RCE en markasjunk/cmd_learn, vulnerabilidades del plugin password). Reparación automática del esquema de base de datos, plugin de cambio de contraseña restaurado en actualizaciones y driver de contraseña endurecido
1.6.16 - 26/05/2026 Actualización de seguridad y migración incremental de base de datos vía bin/updatedb.sh (método oficial recomendado por Roundcube)
1.6.11 - 09/06/2025 Actualización para corregir CVE-2025-49113
1.6.9 - 27/09/2024 Actualización de seguridad y características
1.6.5 - 14/12/2023 Actualización de seguridad y características
1.6.0 - 22/12/2022 Actualización de seguridad y características
1.4.11 - 08/10/2021 Actualización de seguridad y características
1.3.15 - 04/12/2020 Actualización de seguridad y características
1.1.5 - 09/05/2016 Actualización de seguridad y características
1.1.1 - 13/05/2015 Actualización de seguridad y características
1.1.0 - 18/03/2015 Actualización de seguridad y características
0.9.5 - 15/03/2014 Primera versión soportada por Core-Admin RoundCube Installer

3. Instalación de RoundCube

Roundcube se instala y actualiza automáticamente con cada instalación de Core-Admin si fue seleccionado como WebMail para el servidor de correo.

Para comprobar si hay una instalación disponible:

# crad-mail-roundcube-install.pyc --upgrade

4. Reparar una instalación RoundCube

En algunos casos la instalación puede quedar dañada o ser necesario repararla para incorporar las últimas correcciones incluso dentro de la misma versión. Para ello, simplemente usar el flag --force:

# crad-mail-roundcube-install.pyc --upgrade --force

5. Migración de base de datos (bin/updatedb.sh)

A partir de la versión 1.6.16, el instalador aplica los cambios de esquema entre versiones usando la herramienta oficial de Roundcube bin/updatedb.sh. Esta herramienta:

  • Aplica de forma incremental los deltas SQL bajo SQL/<driver>/202X.sql para llevar la base de datos desde la versión instalada hasta la versión objetivo.
  • Lee las credenciales directamente de config.inc.php ($config['db_dsnw']), por lo que no requiere intervención manual.
  • Es idempotente: no hace nada si el esquema ya está al día.
  • No toca datos de usuario (contactos, identidades, preferencias).

Si por alguna razón bin/updatedb.sh no está disponible o falla (por ejemplo, falta de PHP CLI en distribuciones antiguas), el instalador hace fallback al método legacy de migración aditiva (CREATE TABLE IF NOT EXISTS), que es seguro pero más limitado.

5.1 Reparación automática del esquema (desde 1.6.20)

bin/updatedb.sh decide qué cambios aplicar según la versión de esquema guardada en la tabla system (roundcube-version). En servidores actualizados en el pasado solo con el método legacy, esa versión se quedaba anclada (por ejemplo en 2016112200) aunque las tablas nuevas ya existieran. Como consecuencia:

  • bin/updatedb.sh fallaba en cada actualización con Table 'filestore' already exists.
  • Los cambios de columnas (ALTER TABLE) nunca se aplicaban.
  • En MySQL 5.5/5.6 y MariaDB < 10.2, la tabla collected_addresses no llegaba a crearse: su índice en utf8mb4 supera el límite de 767 bytes (ERROR 1071) y el error no se mostraba.

A partir de la versión 1.6.20, cuando bin/updatedb.sh falla, el instalador:

  1. Ejecuta la migración legacy y, si el motor rechaza los índices utf8mb4 (ERROR 1071), reintenta las tablas que faltan en utf8 avisando con un WARNING.
  2. Revisa la base de datos real y aplica solo los cambios de columnas que faltan.
  3. Comprueba que estén todas las tablas y columnas y, solo entonces, actualiza roundcube-version a la última versión de esquema de la rama 1.6 (2022081200). Si algo falla, avisa y deja la versión como estaba.
  4. Vuelve a lanzar bin/updatedb.sh, que a partir de ahí funciona con normalidad en las siguientes actualizaciones.

La conversión completa a utf8mb4 (2020020101) no se aplica a propósito: en motores antiguos falla por el mismo límite de índices y reescribe todas las tablas. Roundcube funciona correctamente en utf8 (solo se pierden caracteres de 4 bytes, como emojis, en contactos e identidades).

Ejemplo de salida en un servidor afectado:

WARNING: database engine rejected utf8mb4 indexes (ERROR 1071) running […], retrying the missing tables in utf8
INFO: reconcile_roundcube_schema: applying missing schema delta 2019092900
INFO: reconcile_roundcube_schema: applying missing schema delta 2020020100
INFO: reconcile_roundcube_schema: roundcube-version marker moved from 2016112200 to 2022081200

Además, las credenciales de MySQL ya no se pasan en la línea de comandos: el instalador usa un fichero temporal de opciones (--defaults-extra-file, permisos 0600), y la salida muestra --password=***.

6. Cambio de contraseña desde el WebMail (plugin password)

El instalador configura el plugin password de Roundcube con un driver propio (plugins/password/drivers/coreadmin.php) que cambia la contraseña a través de crad-mediator y crad-mail-admin-mgr.pyc. Desde la versión 1.6.20:

  • Se restaura en cada actualización: si la configuración restaurada no tiene el plugin activado, el instalador lo vuelve a activar (WARNING: password plugin was NOT enabled in the restored configuration, re-enabling it). Antes solo se activaba en instalaciones nuevas, así que si se perdía, ninguna actualización lo recuperaba.
  • Se revisa el mediator: si el comando de cambio de contraseña está registrado sin --b64 (instalaciones antiguas), se corrige en el sitio, y si el usuario del WebMail no está autorizado, se autoriza.
  • Driver endurecido: usa el nombre de usuario que le proporciona Roundcube (ya filtrado) en lugar de leerlo de la sesión, pasa todos los argumentos por escapeshellarg() y, si falla, ya no escribe las contraseñas (en base64) en errors.log.

7. Plugin Managesieve (filtros de correo)

El instalador activa automáticamente el plugin managesieve tanto en instalaciones nuevas como en cada --upgrade. Esto garantiza que la opción de “Filtros” en la interfaz de Roundcube esté siempre disponible:

  • Crea plugins/managesieve/config.inc.php desde el template .dist si no existe.
  • Añade la configuración de Core-Admin (host localhost, puerto 4190, sin TLS interno, vacation habilitado) protegida por un beacon idempotente.
  • Habilita el plugin en config/config.inc.php añadiendo array_push($config['plugins'], 'managesieve');.
  • Asegura la parte del servidor IMAP (Dovecot) mediante mail_admin.ensure_managesieve_enabled(): instala el paquete necesario, añade sieve a protocols y reinicia Dovecot.

Si el módulo #MailAdmin no expone ensure_managesieve_enabled() (instalación antigua) el instalador avisa con un WARNING y recomienda reconstruir #MailAdmin para incorporar el helper.

8. Opción de vista Ancha para Escritorio // Stretched Elastic

El nuevo tema (Elastic) limita el modo en el que se ven los mensajes. El instalador de core-admin también despliega el plugin stretched-elastic que permite habilitar una vista “ancha” para el listado de correos. Para activarla:

  1. Activamos el tema en configuración -> preferencias -> Interfaz de usuario -> Stretched Elastic -> Guadar:

  2. Tras darle a guardar, pinchamos en “Vista de buzón” -> Disposición -> Escritorio -> Guardar

  3. Tras esto, en la vista de mensajes, se verá el listado “estirado” / “ancho”:

9. Errores conocidos

  1. [11/09/2025] Si al acceder a la gestión de filtros (managesieve) aparece el siguiente error en la interfaz web:

    ARCHIVO NO ENCONTRADO
    ¡No se ha encontrado el recurso solicitado!
    Por favor, póngase en contacto con el administrador de su servidor.
    Ha fallado la petición: mailserver.aspl.es/roundcube/?_task=settings&_action=plugin.managesieve&_token=jS4aSbA65COcr3m1A61wU3OauRFnR6Hv

    …y dentro de los logs del roundcube, aparece el siguiente error:

    ==> /var/log/roundcube/logs/errors.log <==
    [11-Sep-2025 09:31:42 +0200]: PHP Error: Error loading template for managesieve.managesieve in /usr/share/webmail/roundcube/program/include/rcmail_output_html.php on line 804 (GET /roundcube/?_task=settings&_action=plugin.managesieve&_token=jS4aSbA65COcr3m1A61wU3OauRFnR6Hv)

    Causa: el fichero de configuración config.inc.php incluye una declaración de skin antigua que ya no está soportada por las nuevas versiones de roundcube:

    $config['skin'] = 'larry';

    Al actualizarlo al siguiente valor, se resuelve el problema:

    $config['skin'] = 'elastic';

    Solución recomendada: ejecutar el reparador de instalación, que a partir de la versión 1.6.16 detecta automáticamente esta declaración obsoleta, la reemplaza por elastic y elimina cualquier enlace residual skins/larry:

    >> crad-mail-roundcube-install.pyc --upgrade --force

  2. [20/10/2026] En /var/log/roundcube/logs/errors.log aparecen errores como el siguiente, incluso al simplemente abrir mensajes:

    DB Error: [1146] Table ‘rdcub_db_XXXXXX.collected_addresses’ doesn’t exist (SQL Query: SELECT * FROM `collected_addresses` WHERE …)

    Causa: el esquema de la base de datos quedó a medias en actualizaciones anteriores (ver sección 5.1). Los usuarios no ven ningún error, pero las libretas “Destinatarios recopilados” y “Remitentes de confianza” no funcionan.

    Solución recomendada: a partir de la versión 1.6.20 el reparador lo corrige automáticamente. Antes, hacer una copia de la base de datos de Roundcube:

    >> crad-mail-roundcube-install.pyc --upgrade --force

    Para comprobarlo:

    >> mysql --defaults-file=/etc/mysql/debian.cnf rdcub_db_XXXXXX -e “SELECT * FROM system; SHOW TABLES LIKE ‘collected_addresses’;”

    Debe mostrar roundcube-version = 2022081200 y la tabla collected_addresses.

  3. [20/10/2026] No aparece la opción Configuración → Contraseña en el WebMail, o al cambiar la contraseña falla y en errors.log aparece:

    Password plugin: Unable to execute crad-mail-admin-mgr.pyc -z for usuario@dominio.com

    Causa: el plugin password se había perdido de la configuración (las actualizaciones no lo restauraban) o el comando registrado en crad-mediator no incluía --b64, por lo que la contraseña actual no se validaba.

    Solución recomendada: a partir de la versión 1.6.20 el reparador activa el plugin y corrige el mediator automáticamente:

    >> crad-mail-roundcube-install.pyc --upgrade --force

    Para comprobar el mediator, el comando debe terminar en --b64 y el usuario del WebMail (por ejemplo www-data) debe figurar como autorizado:

    >> crad-mediator.pyc -l | head -3