refactor(api): require resource in CheckResourcePermission - #1886
refactor(api): require resource in CheckResourcePermission#1886AmanGIT07 wants to merge 4 commits into
Conversation
CheckResourcePermission reads the object only from the resource field
("namespace:id") and returns InvalidArgument when it is missing or
malformed. The deprecated object_id/object_namespace request fields are
no longer read. E2E tests send the resource form.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
Included review availability: Your plan provides up to 2 included reviews per hour; 1 remains after this review. 📝 WalkthroughSummary by CodeRabbit
WalkthroughPermission handlers now require namespace-qualified values in ChangesPermission resource identifier migration
Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to The API now requires the documented resource format and updates affected callers and tests; no actionable merge-blocking risk remains after normal checks and review. Suggested reviewers: 🚥 Pre-merge checks | ✅ 2✅ Passed checks (2 passed)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 5a381cba-390a-4d76-b8c0-f350fcbc32c1
📒 Files selected for processing (5)
internal/api/v1beta1connect/permission_check.gointernal/api/v1beta1connect/permission_check_test.gotest/e2e/regression/api_test.gotest/e2e/regression/onboarding_test.gotest/e2e/regression/serviceusers_test.go
Coverage Report for CI Build 32704499925Warning Build has drifted: This PR's base is out of sync with its target branch, so coverage data may include unrelated changes. Coverage increased (+0.2%) to 48.897%Details
Uncovered Changes
Coverage Regressions225 previously-covered lines in 10 files lost coverage.
Coverage Stats
💛 - Coveralls |
BatchCheckPermission rejects a resource with an empty namespace or id as InvalidArgument instead of failing at SpiceDB as internal. All three resource guards in the file, and the federated subject guard, return the namespace-notation error so callers see the expected format. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 49074c84-636d-440d-a48b-0457f5e47b3a
📒 Files selected for processing (2)
internal/api/v1beta1connect/permission_check.gointernal/api/v1beta1connect/permission_check_test.go
Included review availability: Your plan includes up to 2 reviews per rolling hour; 0 remain after this review.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
rohilsurana
left a comment
There was a problem hiding this comment.
Review against main. The change itself is a clean tightening. A couple of behavior and test notes below.
| objectNamespace, objectID, err := schema.SplitNamespaceAndResourceID(body.GetResource()) | ||
| if len(body.GetResource()) == 0 || err != nil { | ||
| return nil, connect.NewError(connect.CodeInvalidArgument, ErrBadRequest) | ||
| if err != nil || objectNamespace == "" || objectID == "" { |
There was a problem hiding this comment.
One malformed or empty-part resource in any body now makes the whole batch return InvalidArgument with zero results. For a batch endpoint that is surprising: 49 valid checks are dropped because of 1 bad body. Consider failing just that item, or returning a per-item error, rather than the whole call.
There was a problem hiding this comment.
Keeping whole-batch rejection in this PR: that's the pre-existing contract for a malformed body here — before this change a malformed resource already failed the whole call, and an empty-part one reached SpiceDB and failed the whole call as internal. This PR only turns that into a clean InvalidArgument. Failing just the bad item needs a response-shape change (BatchCheckPermissionResponsePair has no per-item error field), so it's a proto addition rather than a handler tweak. Happy to take that as a follow-up if we want the per-item contract.
| } | ||
| if objectNamespace == "" || objectID == "" { | ||
| return nil, connect.NewError(connect.CodeInvalidArgument, ErrBadRequest) | ||
| if err != nil || objectNamespace == "" || objectID == "" { |
There was a problem hiding this comment.
This drops the fallback to object_id / object_namespace, so a client sending only those (with no resource) now gets InvalidArgument. That is the intended tightening, but those fields are still in the .proto, so the schema still advertises support the server no longer provides. A clear deprecation note in the proto, or a planned removal, would keep integrations from being surprised at runtime.
There was a problem hiding this comment.
Proto will be cleaned up later
There was a problem hiding this comment.
Adding to that: the fields already carry deprecated = true in the proto, so the schema does flag it — the generated getters are marked deprecated too. The removal itself rides a later proton sync.
| ObjectNamespace: testRelationV2.Object.Namespace, | ||
| Permission: schema.UpdatePermission, | ||
| Permission: schema.UpdatePermission, | ||
| Resource: schema.JoinNamespaceAndResourceID(testRelationV2.Object.Namespace, testRelationV2.Object.ID), |
There was a problem hiding this comment.
The success cases use canonical namespaces via JoinNamespaceAndResourceID, and none pass a real alias in the resource field. The PR says aliases still work there, so a case with resource set to an alias (e.g. "org:") would lock that promise in and catch any regression in ParseNamespaceAliasIfRequired for this path.
There was a problem hiding this comment.
Added in f00e7d3 — a unit case now sends org:<id> and asserts the check runs against app/organization.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Summary
CheckResourcePermission accepts the object only via the
resourcefield (namespace:id). The deprecatedobject_id/object_namespacerequest fields are no longer read; requests sending only those fields now receive InvalidArgument. Namespace aliases keep working insideresource. Part of #1782.Changes
internal/api/v1beta1connect/permission_check.go: remove the split-field fallback; reject a missing or malformedresourcetest/e2e/regression/onboarding_test.go,serviceusers_test.go,api_test.go: check requests sendresourceinternal/api/v1beta1connect/permission_check_test.go: success cases sendresource; add missing-resource caseTest Plan
go test ./internal/api/v1beta1connect/passesmake lintpasses (0 issues)🤖 Generated with Claude Code