fix(credentials): reflect workspace permission in credential member role#4699
fix(credentials): reflect workspace permission in credential member role#4699minijeong-log wants to merge 7 commits into
Conversation
Workspace admin users were incorrectly assigned 'member' role on credential_member when workspace-scoped secrets were created or synced. Only the workspace owner got 'admin'. Now workspace permissions table is consulted: owner/admin → credential admin, write/read → member. - environment.ts: query workspace permissions in ensureWorkspaceCredentialMemberships - route.ts POST: apply same mapping during credential creation
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
PR SummaryMedium Risk Overview This removes the shared Reviewed by Cursor Bugbot for commit c37e20c. Bugbot is set up for automated code reviews on this repo. Configure here. |
Greptile SummaryThis PR fixes workspace admin users being incorrectly assigned
Confidence Score: 3/5The fix is correct on the two paths it touches but leaves a third membership-insertion path ( Two of the three places that write apps/sim/lib/credentials/environment.ts — the Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Workspace credential created or synced] --> B{Type: env_workspace or service_account?}
B -- No --> C[Insert single credentialMember as admin for creator]
B -- Yes --> D[Fetch workspace member IDs + workspace permissions]
D --> E[For each member user]
E --> F{Is owner OR creator OR wsPermission === 'admin'?}
F -- Yes --> G[role = 'admin']
F -- No --> H[role = 'member']
G --> I[Insert/Update credentialMember row]
H --> I
subgraph "createWorkspaceEnvCredentials (NOT updated)"
J[Fetch workspace member IDs ONLY] --> K[For each member user]
K --> L{Is owner?}
L -- Yes --> M[role = 'admin']
L -- No --> N[role = 'member — workspace admins get wrong role']
end
|
…ntials Address Bugbot review: the parallel credential creation path (createWorkspaceEnvCredentials) still used owner-only admin logic. Now queries workspace permissions table for consistent role mapping.
Address Bugbot review: permissions query was executed N times (once per credential) inside ensureWorkspaceCredentialMemberships loop. Now queried once in the caller and passed as a Map parameter.
Derive memberUserIds from wsPermissionRows + workspace owner instead of calling getWorkspaceMemberUserIds separately. This removes a duplicate query on the permissions table at every call site.
…ency The credential creator (session.user.id) was always granted admin role regardless of their workspace permission. This created inconsistency with environment.ts sync logic which correctly derives role solely from workspace permission. Now both paths use the same mapping.
All callers now derive member IDs from workspace permission rows directly, making this function dead code.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit c37e20c. Configure here.
| memberUserId === workspaceRow.ownerId || memberUserId === session.user.id | ||
| ? 'admin' | ||
| : 'member', | ||
| role: isAdmin ? 'admin' : 'member', |
There was a problem hiding this comment.
Service account roles stay stale
Medium Severity
This change assigns credential admin to workspace owners and workspace admin permission holders for service_account credentials, but nothing later realigns those rows when workspace permission is lowered. Permission updates only run syncWorkspaceEnvCredentials, which adjusts env_workspace memberships. A user demoted from workspace admin can keep credential admin on service accounts and still edit or delete them.
Reviewed by Cursor Bugbot for commit c37e20c. Configure here.


Closes #4698
Summary
Workspace admin users were incorrectly assigned
memberrole oncredential_memberwhen workspace-scoped secrets were created or synced. Only the workspace owner gotadmin. Now the workspacepermissionstable is consulted to determine the correct credential role.Mapping
workspace.ownerId)Changes
environment.ts: Query workspace permissions inensureWorkspaceCredentialMembershipsand mapadminpermission → credentialadminroleroute.tsPOST: Apply same mapping during credential creationTest Plan
credential_memberroles match the mapping above