Skip to content

fix(auth): validate OPENCODE_AUTH_CONTENT against Auth.Info schema - #34654

Closed
lexlian wants to merge 1 commit into
anomalyco:devfrom
lexlian:fix/34075-auth-schema-validation
Closed

lexlian wants to merge 1 commit into
anomalyco:devfrom
lexlian:fix/34075-auth-schema-validation

Conversation

@lexlian

@lexlian lexlian commented Jun 30, 2026

Copy link
Copy Markdown

Issue for this PR

Closes #34075

Type of change

  • Bug fix

What does this PR do?

In packages/opencode/src/auth/index.ts Auth.all(), the env-var path of OPENCODE_AUTH_CONTENT returned JSON.parse(...) directly, bypassing the Record.filterMap(decode) schema validation that the file-based path applies. The empty catch block silently swallowed JSON parse errors, so a malformed env var fell through to file-based auth even though the user had explicitly set it.

Two consequences:

  1. Invalid entries (unknown type, missing type, non-object values) reached downstream provider code that switches on info.type (e.g. provider/auth.ts:167).
  2. A typo in the env var silently inverted precedence — file auth overrode the user's explicit env var.

The fix:

  • Replaces the bare try/catch with Effect.try({ try, catch }) to surface parse errors as AuthError.
  • Rejects non-object top-level JSON (arrays, primitives, null) with AuthError.
  • Applies the same Record.filterMap(decode) validation that the file path already uses, so invalid entries are silently filtered (matching existing file-path behavior) but parse/type errors surface loudly.

The file-path branch is untouched.

How did you verify your code works?

cd packages/opencode
bun typecheck                              # 29 successful, 0 failed
bun test ./test/auth/                      # 10 pass, 0 fail, 24 expect()
bun test ./test/auth/ ./test/provider/header-timeout.test.ts \
         ./test/provider/digitalocean.test.ts \
         ./test/control-plane/ \
         ./test/cli/acp/initialize-auth.test.ts \
         ./test/server/auth.test.ts \
         ./test/mcp/auth.test.ts
                                          # 66 pass, 0 fail, 199 expect()

The 6 new regression tests in test/auth/auth.test.ts reproduce both bugs against the unmodified code (3 of 6 fail before the fix), and verify that empty/unset env vars still fall through to the file path. The cross-cluster run covers every other consumer of Auth (provider, control-plane, server, MCP, CLI/ACP) and confirms no regressions.

Screenshots / recordings

N/A — not a UI change.

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

The env-var path of Auth.all() returned JSON.parse() directly without
applying Record.filterMap(decode), letting invalid entries (wrong type,
non-object, missing fields) reach downstream provider code that switches
on info.type. The empty catch block silently swallowed JSON parse
errors, so malformed OPENCODE_AUTH_CONTENT fell through to file-based
auth despite the user explicitly setting the env var.

Apply the same Record.filterMap(decode) validation the file path
already uses, surface parse and type errors as AuthError, and reject
non-object top-level JSON (arrays, primitives, null).

Six new regression tests in test/auth/auth.test.ts cover both bugs
plus the no-regression cases (empty/unset env var still falls through
to file path).

Closes anomalyco#34075
@github-actions

Copy link
Copy Markdown
Contributor

Automated PR Cleanup

Thank you for contributing to opencode.

Due to the high volume of PRs from users and AI agents, we periodically close older PRs using automated criteria so maintainers can focus review time on the most active and community-supported contributions.

This PR was closed because it matched the following cleanup criteria:

  • The PR was created more than 1 month ago
  • The PR had fewer than 2 positive reactions
  • Positive reactions are counted as thumbs-up, heart, celebration, or rocket reactions on the PR

PRs created within the last month are not affected by this cleanup.

If you believe this PR was closed incorrectly, or if you are still actively working on it, please leave a comment explaining why it should be reopened. A maintainer can review and reopen it if appropriate.

Thanks again for taking the time to contribute.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Auth.all() bypasses schema validation for OPENCODE_AUTH_CONTENT and silently swallows JSON parse errors

1 participant