HERMES-GIELIE/api
nesquena-hermes 58ba991c0d feat(extensions): opt-in CSP frame-src allowlist (HERMES_WEBUI_CSP_FRAME_EXTRA)
Adds a configurable frame-src directive so an extension can embed a
self-hosted web app in an iframe (e.g. an 'external app tab' pinning
Grafana / Vaultwarden / a dashboard). Mirrors the existing
HERMES_WEBUI_CSP_CONNECT_EXTRA knob: space-separated http(s) origins with
optional *.subdomain wildcard + port, validated, ignored if malformed
(directive-injection / paths / ws scheme / bad ports all rejected).

- Default frame-src is 'self' only, so existing same-origin iframes are
  unchanged; default-off when the env var is unset.
- frame-ancestors stays 'none' -- this only governs what THIS page may embed,
  never who may embed the WebUI.
- Threaded through both the enforced and report-only CSP builders + the
  server.py Handler wrapper, so both headers stay identical.

Docs in docs/EXTENSIONS.md. 8 new regression tests
(tests/test_csp_frame_src_extra.py) cover default, valid widening, enforced
parity, directive-injection rejection, path/ws/port rejection, and
connect/frame independence. Existing CSP test suite still green.

Note: full suite shows 2 pre-existing order-dependent flakes
(test_issue1574 spawn-context, test_issue3283 import-order) that pass in
isolation and are untouched by this CSP-only diff.
2026-06-28 04:08:04 +00:00
..
__init__.py
agent_health.py fix(agent_health): read cross-container gateway runtime status from gateway_state.json (#5065) 2026-06-27 19:54:50 +00:00
agent_sessions.py fix(sidebar): restrict cron pre-aggregation to missing-index scans 2026-06-26 03:06:40 +00:00
auth.py fix(#5022): keep corrupt auth state from bricking startup 2026-06-27 01:58:40 +00:00
background.py
background_process.py fix(#4912): deliver async_delegation completions to the parent chat 2026-06-25 11:38:02 +00:00
clarify.py stage #4524: clarify 409-terminal (id-guarded, loading-cleared) + SSE-notify on expiry (#4504) + v0.51.534 CHANGELOG 2026-06-20 05:36:56 +00:00
commands.py feat(moa): route /moa through WebUI via server-resolved MoA config (#5070, #5057) 2026-06-28 00:23:51 +00:00
compression_anchor.py Address compaction marker and redaction review 2026-06-26 00:12:09 +00:00
config.py feat(settings): expose max_tokens override in Settings (#5010) 2026-06-27 20:27:18 +00:00
dashboard_probe.py
extensions.py fix(#4933): one-click extension install works with no env (bootstrap managed default root) 2026-06-25 18:45:09 +00:00
gateway_chat.py fix(streaming): strip consumed OOB steer blocks from model-facing history (#4978) 2026-06-27 19:13:36 +00:00
gateway_watcher.py
goals.py
helpers.py feat(extensions): opt-in CSP frame-src allowlist (HERMES_WEBUI_CSP_FRAME_EXTRA) 2026-06-28 04:08:04 +00:00
kanban_bridge.py rebase(#2814): resolve i18n onto current master + add kanban_view_* keys to all 13 locales 2026-06-23 23:40:45 +00:00
metering.py
models.py fix(webui): hold per-session lock for state.db sidecar self-heal (TOCTOU + clobber) 2026-06-27 15:24:15 +00:00
oauth.py
onboarding.py
passkeys.py
paths.py
plugin_providers.py
plugins.py
profiles.py fix(#4783): prune dependency trees in mtime probe to match compute path (gate finding 4) 2026-06-24 21:27:22 +00:00
providers.py fix(#3961): complete credential scrub with non-registry agent creds (CUSTOM_API_KEY, AWS/Bedrock) 2026-06-22 19:19:56 +00:00
request_diagnostics.py fix(#4973): replace per-request diagnostics Timer with a process-global watchdog thread 2026-06-26 07:58:13 +00:00
rollback.py
route_approvals.py fix(#5000): relay mirrored gateway approvals after stream loss 2026-06-27 06:03:24 +00:00
route_session_list_cache.py Keep session cache invalidation signals live across the routes extraction 2026-06-26 18:36:07 +00:00
routes.py feat(moa): route /moa through WebUI via server-resolved MoA config (#5070, #5057) 2026-06-28 00:23:51 +00:00
run_journal.py
runner_client.py fix(gateway): correct approval URL and thread session history into runs API (#4479) 2026-06-19 13:16:39 -04:00
runtime_adapter.py
session_discoverability.py
session_events.py
session_lifecycle.py
session_ops.py fix(#4767): review fixes - more edge cases 2026-06-24 18:08:50 +00:00
session_recovery.py fix(anchor): preserve settled mixed content order (#4958) 2026-06-27 22:54:29 +00:00
skill_usage.py
sse_chunked.py stage #4447: opt-in chunked SSE for buffering proxies (#4447) + v0.51.524 CHANGELOG 2026-06-19 22:09:17 +00:00
startup.py
state_sync.py
streaming.py feat(moa): route /moa through WebUI via server-resolved MoA config (#5070, #5057) 2026-06-28 00:23:51 +00:00
system_health.py fix: keep psutil optional for system health 2026-06-26 20:49:13 +00:00
terminal.py
todo_state.py
turn_journal.py
updates.py fix(#4914): don't abort force update when git clean -fd fails 2026-06-25 11:13:57 +00:00
upload.py
usage.py
webui_session_db.py fix(#4767): review fixes - more edge cases 2026-06-24 18:08:50 +00:00
workspace.py Prevent stale escape errors from collapsing live browse grants 2026-06-23 02:53:12 -04:00
workspace_git.py release: v0.51.506 — harden destructive workspace Git paths vs repo-local execution (#3879, #3777) 2026-06-19 02:14:13 +00:00
worktrees.py