feat(runtime): bind remote and owned resources to authority

This commit is contained in:
Alexandre Teixeira
2026-10-02 03:00:46 +01:00
parent ba3e631d58
commit 571f685ad5
23 changed files with 2491 additions and 74 deletions
+4
View File
@@ -814,10 +814,13 @@ def _external_execution_bridge(
raise ValueError("external execution bridge returned an invalid payload")
return str(payload.get("description") or tool), payload["result"]
from src.agent_runtime.remote_resources import configuration_incarnation
return AgentExecutionBridge(
route_tool=route_tool,
supported_tools=supported,
name="request_local_http",
endpoint_id=url,
configuration_id=configuration_incarnation((url, token, tuple(sorted(supported)))),
)
@@ -3418,6 +3421,7 @@ def setup_chat_routes(
_request_authority = request_authority_for_http(
request, message, owner=_user, session_id=session, workspace=workspace,
history=_turn_history, policy=tool_policy,
client_runtime_context=client_runtime_context,
active_document=bool(active_doc),
image_attachment=any(str(a.get('mime') or '').startswith('image/')
for a in (ctx.preprocessed.attachment_meta or [])),
+15
View File
@@ -13,6 +13,7 @@ import asyncio
from pathlib import Path
from datetime import datetime
from fastapi import APIRouter, Request
from fastapi import HTTPException
from pydantic import BaseModel
from core.middleware import require_admin
@@ -77,6 +78,19 @@ def _save_config(cfg: dict):
safe_chmod(str(VAULT_FILE), 0o600)
def _bind_config_owner(cfg: dict, request: Request):
from src.auth_helpers import effective_user
from src.owner_identity import effective_storage_owner
owner = effective_storage_owner(effective_user(request))
if not owner or (cfg.get("owner") and cfg["owner"] != owner):
raise HTTPException(403, "Vault configuration requires its explicit owner")
if not cfg.get("owner"):
# Legacy credentials cannot silently acquire a new ownership binding.
cfg.pop("session", None)
cfg.pop("unlocked_at", None)
cfg["owner"] = owner
async def _run_bw(args: list, session: str = None, input_text: str = None,
bw_password: str = None) -> tuple:
env = {}
@@ -144,6 +158,7 @@ def setup_vault_routes():
"""Save vault URL + email. Runs 'bw config server' to point at Vaultwarden."""
require_admin(request)
cfg = _load_config()
_bind_config_owner(cfg, request)
cfg["server_url"] = req.server_url.strip().rstrip("/")
cfg["email"] = req.email.strip()