14 Commits

Author SHA1 Message Date
The DT
688bc580b5 feat: Enhance extractBearer to support x-api-key for anthropic api style auth (#2436)
Integrated into release/v3.8.1
2026-05-20 16:35:11 -03:00
diegosouzapw
72afecffeb fix(migrations): resolve version collisions and add batch deletion API (#2294)
- Rename 056_provider_connection_quota_window_thresholds.sql to 057
- Add LEGACY_VERSION_SLOT_MIGRATIONS entries for backward compatibility
- Add deleteBatch/deleteCompletedBatches to batches.ts
- Add DELETE routes for batches (single + bulk)
- Add batch deletion buttons to dashboard
- Broaden dashboard session auth to all client API routes
- Add quota_window_thresholds_json column repair

Authored-by: Markus Hartung <hartmark@users.noreply.github.com>
2026-05-16 00:27:20 -03:00
diegosouzapw
5e949276d4 fix(authz/clientApi): fall through to anonymous on invalid bearer when REQUIRE_API_KEY=false (#2257)
There was an asymmetry in the CLIENT_API policy: with REQUIRE_API_KEY
off, a request with no bearer was allowed as anonymous, but a request
with an *invalid* bearer was rejected with 401 "Invalid API key". That
surprises CLI integrations (Codex Desktop auto-config, Hermes Agent)
that ship a stale Bearer in their saved config — they'd see a 401 even
though the operator explicitly opted out of auth.

Fix: when validateApiKey fails and REQUIRE_API_KEY != "true", log a
single warning carrying the masked key id (last-4) and fall through to
anonymous. When REQUIRE_API_KEY is "true", the strict 401 path is
preserved.

The warning preserves observability:
  [clientApiPolicy] invalid bearer presented to /api/v1/responses
    but REQUIRE_API_KEY=false — falling through to anonymous
    (key_id=key_XYZW)

Tests are added in a standalone file because the existing
client-api-policy.test.ts shares a DB-backed setup with a pre-existing
SQLite migration race (5/7 of its tests already failed on baseline).
The new file mocks validateApiKey via a require-resolve interceptor so
the policy's invalid-bearer branch is exercised without touching SQLite.

Reported by @k00shi on the Codex Desktop auto-config path.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-15 10:15:57 -03:00
diegosouzapw
151528735b Merge remote-tracking branch 'origin/feat/v3.8.0-features' into release/v3.8.0
# Conflicts:
#	CHANGELOG.md
#	bin/omniroute.mjs
#	docs/reference/ENVIRONMENT.md
#	src/server/authz/policies/management.ts
2026-05-15 03:44:51 -03:00
diegosouzapw
55659d92be fix(security): address code-review findings — timing-safe token, OMNIROUTE_CLI_SALT, tray PNG, preservePatterns defaults, missing docs
- management.ts: replace === with timingSafeEqual for CLI token comparison
- machineToken.ts: salt upgraded to omniroute-cli-auth-v1; OMNIROUTE_CLI_SALT env
  var honoured for rotation; full 64-char SHA-256 hex token
- tray.ps1: accept .png via GDI+ Bitmap->Icon handle; Windows tray works without .ico
- tray.ts: getIconPath() tries icon.ico then icon.png on Windows
- compression/types.ts: DEFAULT_CAVEMAN_CONFIG.preservePatterns filled with
  six defaults (fenced code, inline code, URLs, paths, error lines, stack traces)
- CLAUDE.md: Hard Rule #15 — spawn-capable routes must use isLocalOnlyPath()
- .env.example + docs/reference/ENVIRONMENT.md: document OMNIROUTE_CLI_SALT
- docs/security/CLI_TOKEN.md: new (was referenced in changelog but missing)
- docs/security/ROUTE_GUARD_TIERS.md: new (was referenced in changelog but missing)
- tests/unit/lib/machineToken.test.ts: updated for 64-char token; added
  OMNIROUTE_CLI_SALT env-var rotation test
2026-05-15 01:54:09 -03:00
diegosouzapw
8dcc21476b feat(authz): add 3-tier route guard (local-only + always-protected)
Tier 1 — LOCAL_ONLY: /api/mcp/ and /api/cli-tools/runtime/ are
restricted to loopback regardless of auth (prevents CVE-class exposure
of process-spawning endpoints via tunnels or LAN access).

Tier 2 — ALWAYS_PROTECTED: /api/shutdown and /api/settings/database
always require auth, even when requireLogin=false.

Tier 3 — MANAGEMENT: existing behaviour (auth bypassed when
requireLogin=false). IPv6 loopback [::1] correctly parsed.
2026-05-14 23:08:40 -03:00
diegosouzapw
1887483c0f feat(cli): add HMAC-SHA256 machine token for localhost CLI auth
Generates a deterministic HMAC-SHA256(key=rawMachineId, msg=salt) token
in src/lib/machineToken.ts. The management authz policy now accepts this
token via x-omniroute-cli-token when Host is loopback, letting the local
CLI process call management APIs without requiring a user login session.
`omniroute config token` prints the token for manual use.
2026-05-14 23:00:00 -03:00
Gleb Peregud
24b2e77aae feat(authz): managementPolicy accepts API keys with manage scope (#2265)
feat(authz): managementPolicy accepts API keys with manage scope (#2265 — thanks @gleber)
2026-05-14 20:18:09 -03:00
diegosouzapw
46e5aa5522 refactor(api): consolidate auth routing and provider config handling
Centralize optional API key capability checks so dashboard forms and
provider schemas share the same rules, including keyless Pollinations
support and cloud-agent batch testing mode.

Also align auto-combo config on `routerStrategy`, keep legacy combo
reads compatible, preserve MCP routes as management APIs, narrow
`require-login` public access to readonly/bootstrap flows, and make
cloud-agent CORS reflect the request origin for credentialed requests.
2026-05-13 03:47:40 -03:00
HomerOff
4ea2a96e13 fix(authz): classify /dashboard/onboarding as PUBLIC to unblock setup wizard (#2127)
- Add exact-match guard for /dashboard/onboarding before the broad /dashboard prefix
- Add setup_wizard and client_api_mcp to ClassificationReason union type
- Update test to verify PUBLIC classification

Co-authored-by: HomerOff <homeroff76@gmail.com>
2026-05-10 13:33:20 -03:00
diegosouzapw
c63c5d5008 fix: resolve MCP endpoint auth bypass (#1970) and finalize DB settings 2026-05-05 09:59:43 -03:00
Sergey Morozov
8077e9b62b feat(settings): add request body limit setting (#1968)
Integrated into release/v3.7.9
2026-05-05 09:12:35 -03:00
diegosouzapw
4b9c129e1c fix: harden security scan findings 2026-05-02 04:51:38 -03:00
backryun
a16e47c593 fix(providers): refresh web client user agents (#1699)
Integrated release/v3.7.2 changes — refreshed web client user agents, env docs, Gemini OAuth fix
2026-04-28 02:41:19 -03:00