From 7d4fa78569b0bf92c6607dc13c7aa1d80eb7c01b Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Sat, 7 Mar 2026 19:02:06 +0000 Subject: [PATCH 1/3] feat: implementar unauthorized_response explicit en listener MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Conectar el campo unauthorized_response de FiltersCfg al shouldHandle() del listener. Cuando está configurado como "explicit", el bot responde con un mensaje de permisos denegados en lugar de ignorar silenciosamente. También se añaden los campos allowed_users y unauthorized_response (comentados como ejemplo) a los configs de assistant-bot y asistente-2. Co-Authored-By: Claude Opus 4.6 --- agents/asistente-2/config.yaml | 2 ++ agents/assistant-bot/config.yaml | 5 +++++ shell/matrix/listener.go | 4 ++++ 3 files changed, 11 insertions(+) diff --git a/agents/asistente-2/config.yaml b/agents/asistente-2/config.yaml index 8666b05..ff2a4dd 100644 --- a/agents/asistente-2/config.yaml +++ b/agents/asistente-2/config.yaml @@ -162,6 +162,8 @@ matrix: dm_respond: true ignore_bots: true ignore_users: [] + allowed_users: [] # vacío = sin restricción (todos pueden hablar) + unauthorized_response: silent # silent | explicit min_power_level: 0 # ============================================ diff --git a/agents/assistant-bot/config.yaml b/agents/assistant-bot/config.yaml index ce0b4d7..e555f12 100644 --- a/agents/assistant-bot/config.yaml +++ b/agents/assistant-bot/config.yaml @@ -162,6 +162,11 @@ matrix: dm_respond: true # responde en DMs (modo principal por ahora) ignore_bots: true ignore_users: [] + allowed_users: [] # vacío = sin restricción (todos pueden hablar) + # allowed_users: # ejemplo con restricción: + # - "@admin:matrix-af2f3d.organic-machine.com" + # - "@enmanuel:matrix-af2f3d.organic-machine.com" + unauthorized_response: silent # silent | explicit min_power_level: 0 # cualquiera puede hablar con el assistant # ============================================ diff --git a/shell/matrix/listener.go b/shell/matrix/listener.go index 9a8e666..5b585cf 100644 --- a/shell/matrix/listener.go +++ b/shell/matrix/listener.go @@ -236,6 +236,10 @@ func (l *Listener) shouldHandle(evt *event.Event) bool { } if !allowed { l.logger.Debug("ignoring unauthorized user", "sender", evt.Sender) + if f.UnauthorizedResponse == "explicit" { + ctx := context.Background() + _ = l.client.SendText(ctx, evt.RoomID.String(), "No tienes permisos para interactuar con este agente.") + } return false } } From 702ebcca265ff7339ffba5e16cb846888d0b7b55 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Sat, 7 Mar 2026 19:02:10 +0000 Subject: [PATCH 2/3] docs: documentar control de acceso en creating-agents.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Añadir sección de control de acceso con los tres niveles: - Nivel 1: allowlist de usuarios (allowed_users) - Nivel 2: invite gating (auto-join restringido) - Nivel 3: RBAC por acción (security.roles) Incluye tabla de acciones disponibles y nota de retrocompatibilidad. Co-Authored-By: Claude Opus 4.6 --- docs/creating-agents.md | 53 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/docs/creating-agents.md b/docs/creating-agents.md index 63f2d47..37ba8a1 100644 --- a/docs/creating-agents.md +++ b/docs/creating-agents.md @@ -345,6 +345,59 @@ openssl rand -hex 32 # → guardar como PICKLE_KEY_ en .env tail -f run/.log ``` +## Control de acceso + +El sistema de control de acceso permite restringir quién puede interactuar con cada agente. Tiene tres niveles independientes: + +### Nivel 1 — Allowlist de usuarios + +Restringe qué usuarios pueden enviar mensajes al bot. Si la lista está vacía, todos pueden hablar (comportamiento por defecto). + +```yaml +matrix: + filters: + allowed_users: + - "@admin:matrix-af2f3d.organic-machine.com" + - "@enmanuel:matrix-af2f3d.organic-machine.com" + unauthorized_response: silent # silent (default) | explicit +``` + +- `silent`: ignora mensajes de usuarios no autorizados (como si el bot no existiera) +- `explicit`: responde con "No tienes permisos para interactuar con este agente" + +### Nivel 2 — Invite gating + +Si `allowed_users` está configurado, el bot solo acepta invites a salas de usuarios en la lista. Invites de usuarios no autorizados se ignoran silenciosamente. + +### Nivel 3 — RBAC por acción + +Conecta los roles de `security.roles` para controlar qué acciones puede ejecutar cada usuario: + +```yaml +security: + roles: + admin: + users: ["@admin:matrix-af2f3d.organic-machine.com"] + actions: ["*"] # acceso total + user: + users: ["*"] # todos los demás + actions: ["ask", "help", "command:help", "command:ping"] +``` + +**Acciones disponibles:** + +| Acción | Qué protege | +|--------|-------------| +| `*` | Todo (wildcard) | +| `ask` | Hablar con el LLM (mensajes de texto libre) | +| `command:*` | Todos los comandos `!xxx` | +| `command:` | Un comando específico (ej: `command:tool`) | +| `tool:*` | Todas las tools vía LLM | +| `tool:` | Una tool específica (ej: `tool:ssh_command`) | +| `help` | Comandos informativos (`!help`, `!info`, `!status`) | + +**Retrocompatibilidad:** si no se configura `allowed_users` ni `security.roles`, el agente funciona en modo abierto (como siempre). + ## Troubleshooting | Problema | Causa | Solución | From 6542e7d51c63ab84e678828737e13f28cf0ce8d7 Mon Sep 17 00:00:00 2001 From: Enmanuel Date: Sat, 7 Mar 2026 19:02:26 +0000 Subject: [PATCH 3/3] =?UTF-8?q?chore:=20cerrar=20issue=200010=20=E2=80=94?= =?UTF-8?q?=20access=20control=20completado?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mover issue a completed/ y actualizar README. Todas las fases implementadas: allowlist, invite gating, RBAC puro, integración en runtime, unauthorized_response explicit, y documentación. Co-Authored-By: Claude Opus 4.6 --- dev/issues/README.md | 2 +- dev/issues/{ => completed}/0010-access-control.md | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename dev/issues/{ => completed}/0010-access-control.md (100%) diff --git a/dev/issues/README.md b/dev/issues/README.md index dd69688..0594bcb 100644 --- a/dev/issues/README.md +++ b/dev/issues/README.md @@ -14,7 +14,7 @@ afectados y notas de implementacion. | 7 | Logs mejorados | [0007-logs-mejorados.md](completed/0007-logs-mejorados.md) | completado | | 8 | Knowledge por agente | [0008-knowledge_por_agente.md](completed/0008-knowledge_por_agente.md) | completado | | 9 | Command system | [0009-command_system.md](completed/0009-command_system.md) | completado | -| 10 | Access control | [0010-access-control.md](0010-access-control.md) | pendiente | +| 10 | Access control | [0010-access-control.md](completed/0010-access-control.md) | completado | | 11 | Markdown rendering | [0011-markdown-rendering.md](completed/0011-markdown-rendering.md) | completado | | 12 | Threads | [0012-threads.md](0012-threads.md) | pendiente | | 13 | Hot reload | [0013-hot-reload.md](0013-hot-reload.md) | pendiente | diff --git a/dev/issues/0010-access-control.md b/dev/issues/completed/0010-access-control.md similarity index 100% rename from dev/issues/0010-access-control.md rename to dev/issues/completed/0010-access-control.md