PluginConfig — Modelo base

PluginConfig — Base Model

PluginConfig es el modelo Django central que registra cada conector. Todos los plugins (Telegram, Gitea, Inbox) comparten este mismo modelo y se distinguen por el campo servicio.

Campos del modelo

Campo Tipo Descripción
usuario ForeignKey → User Propietario del plugin. Puede ser null en configuraciones de sistema.
servicio CharField (choices) Tipo de conector: telegram, gitea, inbox.
identificador CharField (120) Nombre único del bot o endpoint. Ej: @joe_bot, pogit.pedroospino.net.
token_cifrado BinaryField Token o credenciales cifradas con Fernet. Nunca se almacena en texto plano.
metadatos JSONField Configuración específica del plugin (ej. webhook_secret). Varía por servicio.
activo BooleanField Borrado lógico (Regla GUARDIAN). Siempre usar activo=True al filtrar en producción.
creado_en DateTimeField Fecha de creación (auto).
modificado_en DateTimeField Última modificación (auto).
Restricción única: El par (servicio, identificador) es único en la base de datos. No se pueden tener dos configs del mismo tipo con el mismo identificador.

Métodos

set_token(plaintext: str)

Cifra el token en texto plano usando Fernet y lo guarda en token_cifrado. Llamar siempre antes de save() cuando se configure un nuevo token.

get_token() → str

Descifra y devuelve el token en texto plano. Usado internamente por los clientes de cada plugin.

Crear un PluginConfig desde Django Admin o shell

from apps.common.models import PluginConfig
from django.contrib.auth import get_user_model

User = get_user_model()
user = User.objects.get(username="pedro")

config = PluginConfig(
    usuario=user,
    servicio="telegram",
    identificador="@joe_bot",
    metadatos={"webhook_secret": "mi_secret_seguro"},
)
config.set_token("1234567890:ABCDefghIJKlmnOPQrsTUVwxyz")  # Bot token de Telegram
config.save()

Servicios soportados

Valor Etiqueta Mecanismo Token esperado
telegram Telegram Webhook HTTP Bot token de BotFather
gitea Gitea Webhook HTTP No aplica (usa webhook_secret en metadatos)
inbox Buzón IMAP Polling (Celery Beat) JSON cifrado: {"user": "...", "pass": "...", "host": "..."}

Seguridad

  • El campo token_cifrado usa cifrado simétrico Fernet (AES-128-CBC + HMAC-SHA256).
  • La clave Fernet se almacena en la variable de entorno FERNET_KEY, nunca en el código.
  • Los webhooks validan la autenticidad via header secreto antes de acceder al PluginConfig.
  • El método delete() está sobreescrito para realizar borrado lógico (Regla GUARDIAN): establece activo=False en lugar de eliminar el registro.