LinBPQPages: una web alternativa para la mensajería de LinBPQ
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.

Características
- Inicio de sesión con callsign y contraseña de
BBSUsersenlinmail.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: cabecerasR:, 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 deMail/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.

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.cfgyHTML/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
httpOnlyconSameSite=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.cfgyHTML/7plus/. - Escritura sobre
Mail/Import/para crear o agregar amail.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_Excludedno pueden entrar. - Los usuarios comunes ven boletines/NTS salvo los de estado
KoH, y mensajes privados sólo si son remitente o destinatario. Los sysops ven todos los registros válidos; los mensajes ocultos devuelven404. Mail/Import,Mail/Export,Mail/Restarty 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.cfgpuede 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.