TgWitness / Documentación

Referencia / Seguridad y proyecto

Arquitectura

Componentes del colector, el panel, el registro, los trabajadores y el testigo, y cómo se transfieren los datos entre ellos.

Un proceso de Python aloja el panel de FastAPI y un número ilimitado de espacios de trabajo aislados, cada uno con un cliente de cuenta de usuario de Telegram. SQLite almacena un registro de eventos firmado de solo adición y una configuración operativa modificable. Una bóveda cifrada almacena las credenciales de la API, la StringSession y la clave de firma. La interfaz de usuario es un paquete sencillo de HTML/CSS/JavaScript: no se requiere compilación con Node, CDN ni descargas de la interfaz de usuario en tiempo de ejecución.

Módulo Responsabilidad
collector.py Autorización, selección de diálogos, actualizaciones, instantáneas, cola de archivos multimedia, supervisión de la conexión
interactions.py / telegram_client.py Acciones explícitas de los paneles, recibos firmados, identificadores de solicitud persistentes y política de reintentos de llamada de retorno o reincorporación a la tarea a nivel local.
message_content.py Comparación observable de mensajes, excluyendo los metadatos de acceso de transporte
workers.py Espere a que finalicen los procesos de exportación de archivos antes de proceder a la limpieza tras la cancelación
store.py Transacciones WAL, cadena de eventos ordenada, filtros de consulta, ajustes operativos
security.py Creación de archivos privados, almacén cifrado, firma Ed25519, bloqueo de un único proceso
evidence.py Exportación del registro completo, derivados, puntos de control y verificación de archivos adjuntos
verify.py Verificador independiente y de solo lectura (biblioteca estándar + criptografía): archivos, cobertura, registros de testigos y publicaciones en canales, archivos de perfil
app.py API autenticada, ciclo de vida, validación de solicitudes, panel estático
profiles.py Recopiladores de cuentas múltiples, controlador de acceso compartido, ciclo de vida por espacio de trabajo
access.py Concesiones de acceso, comprobaciones de permisos, restricciones de IP, límites de sesión y consola de administrador
proxy_catalog.py Instantáneas de los canales públicos, comprobaciones de transporte, conjunto de proxies compartidos y selección basada en el estado de funcionamiento
provenance.py Mediciones firmadas de identidad, código y dependencias en el ciclo de adquisición
network.py Rutas validadas por espacio de trabajo; estado y pruebas censurados; opciones de transporte de Telethon
sessions.py Conversión sin conexión y de solo lectura de los esquemas SQLite revisados de Telethon
account_import.py Detección y normalización en memoria de los archivos de cuentas compatibles y de los archivos JSON
tdata.py Lector ZIP TData moderno y limitado, validación de sumas de comprobación y descifrado, sin extracción.
doctor.py Comprobaciones de disponibilidad local sin recopilación de datos, inicio de sesión ni instalación de paquetes
download.py Descarga de exportación en tiempo real autenticada, con lecturas limitadas y sin sobrescrituras.
monitoring.py Política de eventos validada por espacio de trabajo y reglas de archivos adjuntos por tipo, compartidas por los gestores, el estado y los recibos firmados.
scope.py Ámbito de observación (chats seleccionados, carpeta de Telegram, cuenta completa), tipos de fuentes, exclusiones y niveles de revisión
dossier.py Perfiles de usuarios por chat elaborados a partir de registros guardados: datos con referencias de registro, SHA-256/pHash del avatar y extracción de menciones.
witness_api.py Tokens de testigo de solo lectura y el encabezado firmado del registro que pueden obtener
witness.py Proceso de testimonio independiente: clave y registro propios, comprobaciones de autenticidad, publicaciones firmadas en el canal, exportación
alerts.py Notificaciones de Apprise y la lista de notificaciones del panel
logging_config.py Registro en consola y diagnóstico rotativo del servidor para ejecuciones sin ventana.
static/ Interfaz adaptativa, puerta de acceso local, filtros, detalles, exportaciones y configuración de la cuenta.
demo.py Registro sintético claramente identificado, aislado de la recopilación real.

Los gestores de observación se registran antes de la conexión. La recopilación en tiempo real está condicionada por la identidad del cliente activo, el estado de ejecución explícito, las fuentes habilitadas o el ámbito de observación (los modos de carpeta o de cuenta completa añaden un nuevo chat como fuente en su primera actualización), y la política de eventos. Los clientes rechazados o sustituidos no pueden aportar actualizaciones en tiempo real. Las reacciones sin procesar y las actualizaciones de membresía mantienen los límites de visibilidad. El contenido del mensaje entrante y su tarea de soporte duradero se registran conjuntamente. Las tareas conservan el descriptor TL original y vinculan su hash a la observación del mensaje firmado. Se separan las semánticas de remitente, editor y eliminador.

Cada espacio de trabajo admite una cuenta y cuenta con su propio directorio e identidad de firma. El espacio de trabajo principal permanece en la raíz por motivos de compatibilidad; los espacios de trabajo adicionales se encuentran en profiles/<id>/. Un único token de portador controla toda la instalación; los espacios de trabajo no son entidades de autorización independientes. Los bloqueos de procesos protegen los directorios; los bloqueos de la base de datos serializan la inserción de eventos. Cada adición se confirma de forma sincrónica en el WAL de SQLite con el modo sincrónico FULL. Los controladores de actualización/eliminación de eventos impiden las modificaciones habituales de la aplicación; los administradores del sistema de archivos permanecen dentro del límite de confianza.

La autorización de la API se realiza mediante un token de portador. Las operaciones de inicio de sesión se serializan y están limitadas en el tiempo. Las cargas de cuentas utilizan un límite específico de 12 MiB para el cuerpo codificado y un límite de 8 MiB para el archivo descodificado; las solicitudes normales de la API mantienen el límite de 16 KiB. La conversión se ejecuta en un hilo de trabajo, mantiene las subidas en memoria y devuelve la entrada normalizada al navegador autenticado. El inicio de sesión mediante código QR cuenta con un candidato por espacio de trabajo, un identificador de corta duración, una tarea de espera y una cancelación explícita. Solo la autorización aceptada se convierte en el cliente activo. Telegram FloodWait se devuelve con un valor Retry-After; las credenciales y los mensajes de error RPC sin procesar no se exponen en los errores de la API. Las exportaciones se ejecutan fuera del bucle de eventos asíncrono y se serializan por espacio de trabajo. Transmiten una instantánea de lectura estable y pueden coexistir con escrituras WAL continuas. Los recopiladores de espacios de trabajo comparten el proceso y el bucle de eventos.

Las instantáneas del historial actual y las actualizaciones en tiempo real pueden solaparse. Ambas constituyen observaciones independientes, identificadas por su fuente; los duplicados no se ocultan de forma silenciosa. No se implementa ninguna inferencia a partir de identificadores que falten, texto eliminado inventado, enumeración forzada de miembros o incorporación automática a grupos. No se implementa.

Para obtener una explicación dirigida a los operadores, consulte cómo funciona la recopilación y los formatos de cuentas y sesiones.

La configuración de red se almacena en la bóveda cifrada. Al aplicar una ruta, se cierran los clientes antiguos y se cancelan los inicios de sesión pendientes; las conexiones posteriores utilizan esa ruta sin recurso alternativo directo. Una nueva instalación con clave externa deriva la clave Fernet de cada espacio de trabajo mediante HKDF-SHA256 a partir de un archivo de clave maestra y una sal aleatoria almacenada. Esto protege los secretos de forma independiente del directorio de datos, y no el contenido del registro o de los archivos multimedia en texto plano.

La entrada de demostración local utiliza una capacidad de proceso generada por separado, nunca el token del panel configurado. La emisión y la aceptación requieren el modo de demostración explícito, una raíz sintética sin espacios de trabajo adicionales ni una sesión autorizada, un par/host de bucle cerrado, sin encabezados de reenvío de proxy y sin solicitudes del navegador de origen cruzado. Las API en tiempo real mantienen la autenticación de portador y rechazan los cambios en la recopilación de datos en modo de demostración.