Commit Graph
151 Commits
Author SHA1 Message Date
Latte f86b9b529c docs: record S2 results, mark findings fixed or waived, update the security model 2026-10-14 17:55:59 +02:00
Latte d7cac91175 ci: raise the coverage gate to 90 percent; docs: reconcile OAuth docs with the implementation 2026-10-14 17:53:58 +02:00
Latte 0f5f5cdd95 fix: do not echo setting values in configuration errors; test: stdio and config redaction 2026-10-14 17:52:07 +02:00
Latte 984673e8cf fix: reject a trailing newline in sudo; test: malformed input suite 2026-10-14 17:49:37 +02:00
Latte 421a6507c0 fix: redact a data field in Action secret responses; test: secret echo suite 2026-10-14 17:46:11 +02:00
Latte fef80a5b21 test: security suite for auth, startup, redaction; fix: mask secrets in object keys 2026-10-14 17:44:20 +02:00
Latte 766968fa42 ci: pin actions to commit SHAs, guard Docker jobs from forks, scan the image, gate publish on security (SEC-06, SEC-07, SEC-14, SEC-15, SEC-16) 2026-10-14 17:40:16 +02:00
Latte 6f7a3c0e5b fix: refuse a token store directory owned by another user or left writable (SEC-13) 2026-10-14 17:36:21 +02:00
Latte d96c3ac604 fix: reject whitespace and control characters in base URLs and warn on plain http Gitea (SEC-10) 2026-10-14 17:34:15 +02:00
Latte 87f048cc4d fix: quota pending sign-ins and registrations per address, keep young clients, write the store off the loop (SEC-09) 2026-10-14 17:32:03 +02:00
Latte f57c237bed fix: rate limit /token and /revoke, bucket IPv6 by /64 and warn about untrusted forwarded headers (SEC-08) 2026-10-14 17:29:12 +02:00
Latte 782d416e46 fix: require a matching Origin on consent and name the binding cookie per flow (SEC-17, SEC-19) 2026-10-14 17:26:52 +02:00
Latte 8be859243d fix: add OAUTH_REDIRECT_ALLOWLIST for client registration and waive the open default (SEC-05) 2026-10-14 17:24:41 +02:00
Latte 79aa4f7fc0 fix: load ./.env only when private and owned, add --env-file and AEGIS_ENV_FILE (SEC-04) 2026-10-14 17:22:29 +02:00
Latte 7307214ab6 fix: create the audit log 0600 in a 0700 directory and refuse symlinks (SEC-11) 2026-10-14 17:18:29 +02:00
Latte fd5e4b71f3 fix: record the calling client and only schema-known names in audit entries (SEC-12, SEC-18) 2026-10-14 17:14:13 +02:00
Latte 43eebd3089 fix: write-ahead audit entry so calls stop when the audit log stops accepting writes (SEC-03) 2026-10-14 17:11:53 +02:00
Latte 5b622e64e2 fix: redact stored webhook authorization headers and other secret fields by key name (SEC-02) 2026-10-14 17:08:59 +02:00
Latte d5ca530db3 fix: cap and type-check the unauthenticated consent POST body (SEC-01) 2026-10-14 17:07:06 +02:00
Latte 5baf73f38b docs: security threat model and review findings 2026-10-14 17:04:47 +02:00
Latte ce5ae6caa5 fix: redact identity secrets through a public hook and mask issued agm_ tokens
ci / gitleaks (push) Successful in 8s
ci / docs-check (push) Failing after 30s
ci / lint (push) Successful in 42s
ci / test-integration (push) Successful in 46s
ci / security (push) Failing after 27s
ci / test-mcp (push) Successful in 1m16s
ci / test-unit (push) Successful in 2m17s
ci / build-and-push (push) Successful in 17s
Identity gains a redact field that the executor honours, so the OAuth
resolver no longer needs an executor subclass overriding private
internals. Opaque agm_ tokens issued by our authorization server are now
masked by the secret patterns wherever they appear in content.
2026-10-14 16:45:36 +02:00
Latte e02cede9f2 fix: drop the obsolete OAuth-unavailable startup warning test 2026-10-14 16:44:04 +02:00
Latte 7286440d64 test: cover the per-user OAuth flow, threat cases, store and startup 2026-10-14 16:41:18 +02:00
Latte 566d0b65dd feat: add per-user OAuth mode proxying sign-in to Gitea
Authorization server for MCP clients (SDK provider with dynamic client
registration, PKCE, refresh rotation and revocation) that signs users in
through Gitea and runs tool calls with the user's own Gitea token.

- consent page with CSRF protection and a browser-binding cookie on the
  Gitea callback (confused-deputy protection for the shared Gitea app)
- encrypted token store (Fernet, HKDF-derived key, 0600, atomic writes,
  symlink and corrupt-file refusal); our tokens stored only as hashes
- tokens bound to the MCP endpoint resource and the gitea scope; the
  static bearer keeps working next to OAuth
- code replay and refresh token reuse revoke the grant
- automatic upstream refresh with per-session locking; invalid_grant
  ends the session and never falls back to the admin token
- OAuth-only deployments (no GITEA_TOKEN, no bearer) may start
- rate limit on the OAuth endpoints, query strings dropped from access logs
2026-10-14 16:41:18 +02:00
Latte 5e144772b2 test: add MCP smoke tests over stdio and streamable HTTP, from source and from the built image
ci / lint (push) Successful in 41s
ci / security (push) Failing after 28s
ci / build-and-push (push) Successful in 17s
ci / gitleaks (push) Successful in 9s
ci / docs-check (push) Failing after 30s
ci / test-integration (push) Successful in 46s
ci / test-mcp (push) Successful in 1m16s
ci / test-unit (push) Successful in 1m52s
2026-10-14 16:26:16 +02:00
Latte cfbf1fb893 fix: keep the embedded env template in sync with .env.example 2026-10-14 16:25:37 +02:00
Latte cf3d2e17d3 fix: fail closed on an unwritable audit log, bound the rate limiter and harden startup
The audit logger is opened at startup (exit 2 on failure) and obtained before
every call, which is refused with audit_unavailable otherwise. Audit records only
take validated path and sudo values and use the request id as correlation id. The
rate limiter evicts idle keys, caps tracked keys, audits the first excess per key
and window and uses the settings passed to the app. FORWARDED_ALLOW_IPS is now a
setting, and startup warns about a missing host allow-list and unavailable OAuth.
2026-10-14 16:24:51 +02:00
Latte a3222d5ebe fix: report an invalid --port with a short message instead of listing every choice 2026-10-14 16:24:51 +02:00
Latte c73a7cc3ce fix: serialize the admin login lookup so concurrent first calls send one request 2026-10-14 16:24:51 +02:00
Latte e139ae826f docs: regenerate tool inventory after annotation overrides
ci / gitleaks (push) Successful in 8s
ci / docs-check (push) Failing after 35s
ci / lint (push) Successful in 47s
ci / test-mcp (push) Failing after 48s
ci / test-integration (push) Successful in 52s
ci / security (push) Failing after 29s
ci / test-unit (push) Successful in 1m57s
ci / build-and-push (push) Successful in 18s
2026-10-14 16:13:57 +02:00
Latte 7c7cfc05ff docs: rewrite README and docs for the full-access design, generate tool inventory 2026-10-14 16:13:11 +02:00
Latte 68bd8700dc feat: add docs drift check 2026-10-14 16:13:11 +02:00
Latte c9e2c481e7 feat: add MCP server core, stdio and streamable HTTP transports and serve command
Low-level SDK server built from the catalog plus gitea_api_request, with TOOLSETS/READ_ONLY/DISABLED_TOOLS filters, schema validation without value echo, one audit event per call, static bearer verifier, identity resolver hook, /health, DNS-rebinding protection, rate limiting and fail-closed startup checks.
2026-10-14 16:13:11 +02:00
Latte 581ca67bf8 docs: correct the module lists in AGENTS.md and CLAUDE.md 2026-10-14 16:12:51 +02:00
Latte 10c8b21cf5 docs: document result redaction, credential-issuing operations and path encoding 2026-10-14 16:12:51 +02:00
Latte 72462105f5 fix: keep the harness admin password out of the docker exec argv 2026-10-14 16:11:46 +02:00
Latte 517c675048 fix: harden setup against plain http, untrusted output and unsafe values
Require consent before sending the token over plain http to a non-loopback
host, strip control characters from server-supplied text, restrict env values
and tokens to printable ASCII, validate the URLs like other env values and
fsync the directory after the atomic replace.
2026-10-14 16:11:01 +02:00
Latte 6c9b2b74ca test: satisfy lint in catalog override test 2026-10-14 16:10:04 +02:00
Latte 6b11d29919 fix: annotate POST render endpoints read-only and irreversible POSTs destructive 2026-10-14 16:09:59 +02:00
Latte 156e963e21 fix: key slash encoding on route, redact more request secrets, bound JSON depth and uploads
Slash safety is decided per (path template, parameter) so single-segment
routes such as releases/tags/{tag} and editorconfig/{filepath} keep %2F.
Adds authorization_header, remote_password, mirror_password, mirror_token and
the AWS key fields to the redacted request fields. Deeply nested JSON from
Gitea is treated as text instead of raising RecursionError, and base64
uploads are capped before decoding.
2026-10-14 16:08:42 +02:00
Latte 1a039e32ab ci: single Gitea Actions pipeline, uv-based image, scoped docker cleanup
Replace lint/test/docker workflows with ci.yml (gitleaks, lint, test-unit, test-integration, test-mcp, build-and-push, docs-check, security). Rebuild the Dockerfile as a digest-pinned multi-stage uv build running as uid 1000, add .dockerignore, a hardened compose file and a gitleaks config. The integration harness now falls back to /etc/hostname and /proc/self to find its own container.
2026-10-14 15:59:19 +02:00
Latte 9e50859133 feat: add Gitea request executor with result envelope, pagination and redaction 2026-10-14 15:55:56 +02:00
Latte 041b3ea7ff feat: generate the tool catalog from the pinned swagger
Adds scripts/generate_catalog.py (with --check), the naming rules, schema conversion, the committed tools.json for all 537 operations and the load_catalog() loader.
2026-10-14 15:51:01 +02:00
Latte a807a70556 test: fix integration harness lint findings 2026-10-14 15:50:43 +02:00
Latte 1d223e6799 feat: add the aegis-gitea-mcp setup command
Verifies the Gitea instance, token and scopes, registers or reuses the aegis-gitea-mcp OAuth app, generates missing secrets and writes a 0600 env file from the template. Prints client configs and deployment snippets without any secret value.
2026-10-14 15:50:02 +02:00
Latte 465a365d89 test: add live-Gitea integration harness (opt-in, Docker) 2026-10-14 15:49:11 +02:00
Latte c246f5c267 docs: rewrite contributor contract for the full-access model 2026-10-14 15:40:37 +02:00
Latte b82e2866cb feat: new settings, CLI skeleton and interface skeletons
Adds the pydantic-settings Settings with validated GITEA_URL, OAuth scopes
and toolsets, the argparse CLI skeleton, catalog.model, identity and
GiteaAPIError. Test fixtures now isolate env, cwd and state paths in tmp.
2026-10-14 15:40:37 +02:00
Latte 4ac9626eb5 refactor!: remove legacy adapters, policy engine and API-key auth
Removes the FastAPI server, hand-rolled MCP protocol, tool registry and
tools, YAML policy, resource-type authz, API-key and OAuth proxy modules,
automation, observability, cache, the old Gitea client and stdio adapter,
the key-management scripts and their tests (ADR 0006).
2026-10-14 15:40:37 +02:00
Latte c0b22c531e build: switch to uv, hatchling and ruff-only tooling 2026-10-14 15:40:30 +02:00