LinBPQPages: una web alternativa para la mensajería de LinBPQ

Software 14 de oct. de 2026

LinBPQPages es una aplicación web para leer y redactar mensajes en una instancia de LinBPQ. Es un proyecto hermano de LinFBBPages y nació de un par de necesidades concretas: poner a disposición la mensajería de mi BBS en la web sin exponer las herramientas administrativas y contar con una API REST para integración de servicios / agentes.

En lugar de apoyarse en la API JSON de LinBPQ —que hoy no expone ni los cuerpos de los mensajes ni un endpoint de envío suficiente— LinBPQPages accede directamente al sistema de archivos del BBS: DIRMES.SYS, Mail/, linmail.cfg y HTML/7plus/. Está escrita en Go usando sólo la biblioteca estándar, con el frontend embebido (go:embed) y disponible en inglés y español.

¿Por qué no usar la web embebida de LinBPQ?

  • Más moderna y enfocada: una interfaz responsive pensada sólo para mensajería, sin menús de administración de por medio.
  • Simplicidad: leer y redactar boletines, y ver o descargar los 7+ decodificados, nada más.
  • Aislación: la administración del BBS queda aparte; la web de mensajería no la expone.
  • API JSON: cada vista es un endpoint, así que se puede integrar con servicios externos o agentes.
Lista de mensajes de LinBPQPages

Características

  • Inicio de sesión con callsign y contraseña de BBSUsers en linmail.cfg.
  • Lista de mensajes paginada y con búsqueda, leída de DIRMES.SYS, respetando las reglas de privacidad de LinBPQ.
  • Lectura de Mail/m_%06d.mes: cabeceras R:, contenido RFC822/MIME y adjuntos B2 descargables (con previsualización segura de imágenes raster).
  • Redacción de mensajes privados (SP) o boletines (SB) a través de Mail/Import/mail.in, indicando el intervalo de import configurado.
  • Navegación de los archivos 7+ decodificados (requiere instalación de scripts para búsqueda y decodificado).
  • Interfaz responsive con traducciones en inglés y español.
Archivos 7+ en LinBPQPages

Cómo funciona

  • Backend en Go usando sólo la biblioteca estándar, con frontend HTML/CSS/JS embebido vía go:embed.
  • Lee DIRMES.SYS, Mail/*.mes, linmail.cfg y HTML/7plus/.
  • La única escritura es un append a Mail/Import/mail.in. La aplicación no modifica mensajes, ni el índice, ni la configuración, ni los 7+.
  • Las sesiones viven en memoria y usan una cookie httpOnly con SameSite=Lax.
  • No usa la API JSON de LinBPQ: hoy no expone ni los cuerpos de los mensajes ni un endpoint de envío suficiente.
  • Los formatos en disco, el parseo de mensajes, los campos de usuario y el comportamiento de la cola están documentados en ARCHITECTURE.md.

Requisitos y puesta en marcha

  • Go 1.22+ para compilar.
  • Lectura sobre DIRMES.SYS, Mail/, linmail.cfg y HTML/7plus/.
  • Escritura sobre Mail/Import/ para crear o agregar a mail.in.
  • El servicio HTTP de LinBPQ en este entorno usa el puerto 8080; LinBPQPages usa 8081 por defecto.
CGO_ENABLED=0 go build -trimpath -ldflags='-s -w' -o linbpqpages ./cmd/linbpqpages
./linbpqpages --bpq-dir /home/luis/linbpq --listen :8081

Se configura con --help o variables de entorno:

Flag Variable de entorno Default Descripción
--bpq-dir LINBPQPAGES_BPQ_DIR /home/luis/linbpq Directorio de datos de LinBPQ.
--listen LINBPQPAGES_LISTEN :8081 Dirección HTTP de escucha.
--mail-cfg LINBPQPAGES_MAIL_CFG <bpq-dir>/linmail.cfg Configuración del BBS.
--sevenplus-dir LINBPQPAGES_SEVENPLUS_DIR <bpq-dir>/HTML/7plus Archivos 7+ decodificados.
--session-ttl LINBPQPAGES_SESSION_TTL 8h Vida de las sesiones en memoria.

API

Todas las respuestas son JSON. Todos los endpoints requieren sesión, excepto POST /api/login:

Método Ruta Descripción
POST /api/login {callsign,password} → cookie de sesión.
POST /api/logout Cerrar sesión.
GET /api/me Usuario autenticado.
GET /api/status BBS, intervalo/estado de import, tamaño de cola y contadores del índice.
GET /api/messages Lista filtrada; type, q, page, page_size (máx. 200).
GET /api/messages/{num} Metadatos, rutas, texto y adjuntos.
GET /api/messages/{num}/attachments/{index} Descarga un adjunto tras verificar la visibilidad.
POST /api/messages {type: P o B, to, via, title, body} → encola un mensaje.
GET /api/files Lista los archivos 7+.
GET /api/files/{name} Descarga un 7+ (sólo basenames regulares; se rechazan symlinks).

Seguridad

  • Los callsigns no distinguen mayúsculas/minúsculas; las contraseñas sí. Usuarios sin contraseña o con F_Excluded no pueden entrar.
  • Los usuarios comunes ven boletines/NTS salvo los de estado K o H, y mensajes privados sólo si son remitente o destinatario. Los sysops ven todos los registros válidos; los mensajes ocultos devuelven 404.
  • Mail/Import, Mail/Export, Mail/Restart y las partes 7+ crudas no se sirven.
  • Los nombres de archivo se validan y no se siguen symlinks. El contenido y los nombres de adjuntos se renderizan como texto; el HTML MIME nunca se ejecuta.
  • linmail.cfg puede contener contraseñas en texto plano: no copiarlo a los fixtures ni al repositorio.
  • Está pensada para redes de confianza (LAN/VPN). Para exponerla fuera, usar TLS y autenticación perimetral o un proxy inverso.

Roadmap

Actual:

  • Información de la aplicación: referencias al proyecto BPQ, versión, licencia y repositorio.
  • Información del BBS.
  • Lista de mensajes: orden por columna y scroll infinito.
  • Mensajería: envío de archivos (conversión a 7+) y fuente CP437 (?).
  • Historial de leídos y filtro por "no leídos".
  • Login sin contraseña (sólo lectura) con formulario de solicitud de usuario.
  • Terminal: web ↔ backend ↔ Telnet ↔ LinBPQ.
  • API: documentación y ejemplos.

Futuro:

  • Administración de la instancia de LinBPQ (sysop): configuración, administración de usuarios, logs.

Referencias

Etiquetas