Skip to content

Fix claude-code-review.yml trust gate: check PR author, not head repo owner - #38

Closed
jnasbyupgrade wants to merge 1 commit into
masterfrom
fix-claude-review-trust-gate
Closed

Fix claude-code-review.yml trust gate: check PR author, not head repo owner#38
jnasbyupgrade wants to merge 1 commit into
masterfrom
fix-claude-review-trust-gate

Conversation

@jnasbyupgrade

Copy link
Copy Markdown
Collaborator

The `claude-review` job's trust gate checked:

```yaml
github.event.pull_request.head.repo.owner.login == 'jnasbyupgrade'
```

`head.repo.owner.login` only distinguishes "who owns the fork" for fork-headed PRs. For an upstream-branch-headed PR (base and head both live in this repo -- required by `gh stack`, and also just what you get from `gh pr create` without a fork), `head.repo.owner.login` is always this repo's own org, never the actual PR author. The gate silently skipped review on every such PR regardless of who opened it.

Confirmed via a real case where `claude-review` showed `conclusion: "skipped"` on a whole PR stack that was legitimately jnasbyupgrade's own work, opened as upstream-branch PRs (needed for `gh stack` to link them).

Fix: check PR author instead:

```yaml
github.event.pull_request.user.login == 'jnasbyupgrade'
```

PR author can't be spoofed by a third party any more than head repo owner can, and it's the more direct question for this gate's purpose (trusting the person asking for review, not the repository their branch happens to live in). Works for both fork-headed and upstream-branch-headed PRs.

Postgres-Extensions/pg_count_nulls already uses this correct pattern.

… owner

head.repo.owner.login only identifies the fork owner for fork-headed PRs.
For an upstream-branch-headed PR (base and head both in this repo, as
required by gh stack or produced by a plain gh pr create without a fork),
it's always this repo's own org, never the actual PR author -- so the gate
silently skipped review on every such PR regardless of who opened it.

Switch to github.event.pull_request.user.login, which is the PR's actual
author and can't be spoofed any more than head repo owner can, and covers
both fork-headed and upstream-branch-headed PRs correctly.
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 3865721f-c881-4c45-8262-1aa8c6899969

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

jnasbyupgrade added a commit that referenced this pull request Aug 7, 2026
PR #38 (Postgres-Extensions/test_factory, part of a 7-repo sweep for this
same trust-gate bug) independently landed the identical user.login fix
targeting master directly. Closing #38 in favor of this stack's copy since
it'll reach master when the stack merges anyway -- but its phrasing on why
user.login can't be spoofed ("by PR content" specifically) is worth folding
in here, since PR content is untrusted input in this exact threat model.
@jnasbyupgrade

Copy link
Copy Markdown
Collaborator Author

Closing in favor of the identical fix already carried in the open advanced-testing/ci branch (PR #35, part of the #32#33#34#35 stack), which will reach master when that stack merges. Folded in this PR's phrasing on why user.login can't be spoofed by PR content — thanks for the sweep.

jnasbyupgrade added a commit that referenced this pull request Aug 7, 2026
PR #38 (Postgres-Extensions/test_factory, part of a 7-repo sweep for this
same trust-gate bug) independently landed the identical user.login fix
targeting master directly. Closing #38 in favor of this stack's copy since
it'll reach master when the stack merges anyway -- but its phrasing on why
user.login can't be spoofed ("by PR content" specifically) is worth folding
in here, since PR content is untrusted input in this exact threat model.
jnasbyupgrade added a commit that referenced this pull request Aug 7, 2026
PR #38 (Postgres-Extensions/test_factory, part of a 7-repo sweep for this
same trust-gate bug) independently landed the identical user.login fix
targeting master directly. Closing #38 in favor of this stack's copy since
it'll reach master when the stack merges anyway -- but its phrasing on why
user.login can't be spoofed ("by PR content" specifically) is worth folding
in here, since PR content is untrusted input in this exact threat model.
jnasbyupgrade added a commit that referenced this pull request Aug 7, 2026
PR #38 (Postgres-Extensions/test_factory, part of a 7-repo sweep for this
same trust-gate bug) independently landed the identical user.login fix
targeting master directly. Closing #38 in favor of this stack's copy since
it'll reach master when the stack merges anyway -- but its phrasing on why
user.login can't be spoofed ("by PR content" specifically) is worth folding
in here, since PR content is untrusted input in this exact threat model.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant