Skip to content

Commit 29b8a6d

Browse files
fix(credential-groups): list all managed credentials
1 parent 5aba920 commit 29b8a6d

4 files changed

Lines changed: 19 additions & 46 deletions

File tree

apps/sim/lib/credential-groups/application/list-credentials.test.ts

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -153,48 +153,40 @@ describe('listCredentialGroupCredentials', () => {
153153
expect(mocks.listCredentials).not.toHaveBeenCalled()
154154
})
155155

156-
it('rejects workflows whose original principal has no human subject', async () => {
156+
it('lists credentials when the original principal has no human subject', async () => {
157157
const principal = executorPrincipal()
158+
principal.subjectUserId = undefined
158159
principal.delegationContext.principal = {
159160
kind: 'workspace_api_key',
160161
workspaceId: 'workspace-1',
161162
keyId: 'workspace-key-1',
162163
}
163164

164-
await expect(
165-
listCredentialGroupCredentials.execute({ principal, input })
166-
).rejects.toMatchObject({
167-
code: 'forbidden',
168-
message: 'Credential Group enrollment access required',
169-
})
165+
await listCredentialGroupCredentials.execute({ principal, input })
166+
170167
expect(mocks.loadEnrollmentAccess).not.toHaveBeenCalled()
171-
expect(mocks.listCredentials).not.toHaveBeenCalled()
168+
expect(mocks.listCredentials).toHaveBeenCalledWith(
169+
expect.not.objectContaining({ credentialGroupEnrollmentId: expect.anything() })
170+
)
172171
})
173172

174-
it('rejects a user who is not enrolled in the group', async () => {
173+
it('lists credentials without requiring the actor to be enrolled', async () => {
175174
mocks.loadEnrollmentAccess.mockResolvedValueOnce(null)
176175

177-
await expect(
178-
listCredentialGroupCredentials.execute({ principal: executorPrincipal(), input })
179-
).rejects.toMatchObject({
180-
code: 'forbidden',
181-
message: 'Credential Group enrollment access required',
182-
})
183-
expect(mocks.listCredentials).not.toHaveBeenCalled()
176+
await listCredentialGroupCredentials.execute({ principal: executorPrincipal(), input })
177+
178+
expect(mocks.loadEnrollmentAccess).not.toHaveBeenCalled()
179+
expect(mocks.listCredentials).toHaveBeenCalled()
184180
})
185181

186-
it('rejects an executor subject that does not match the original workflow principal', async () => {
182+
it('does not use the executor subject to filter credential references', async () => {
187183
const principal = executorPrincipal()
188184
principal.subjectUserId = 'different-user'
189185

190-
await expect(
191-
listCredentialGroupCredentials.execute({ principal, input })
192-
).rejects.toMatchObject({
193-
code: 'forbidden',
194-
message: 'Credential Group enrollment access required',
195-
})
186+
await listCredentialGroupCredentials.execute({ principal, input })
187+
196188
expect(mocks.loadEnrollmentAccess).not.toHaveBeenCalled()
197-
expect(mocks.listCredentials).not.toHaveBeenCalled()
189+
expect(mocks.listCredentials).toHaveBeenCalled()
198190
})
199191

200192
it('returns a bounded page after current workspace and entitlement checks', async () => {
@@ -211,7 +203,6 @@ describe('listCredentialGroupCredentials', () => {
211203
credentialGroupId: 'group-1',
212204
limit: 50,
213205
cursor: undefined,
214-
credentialGroupEnrollmentId: 'enrollment-1',
215206
credentialProviderIds: undefined,
216207
credentialGroupOptionIds: ['option-1'],
217208
})
@@ -243,14 +234,14 @@ describe('listCredentialGroupCredentials', () => {
243234
)
244235
})
245236

246-
it('ignores caller-supplied email and uses the principal enrollment', async () => {
237+
it('does not use caller-supplied identity fields to filter credential references', async () => {
247238
await listCredentialGroupCredentials.execute({
248239
principal: executorPrincipal(),
249240
input: { ...input, email: ' Person@Example.COM ' },
250241
})
251242

252243
expect(mocks.listCredentials).toHaveBeenCalledWith(
253-
expect.objectContaining({ credentialGroupEnrollmentId: 'enrollment-1' })
244+
expect.not.objectContaining({ credentialGroupEnrollmentId: expect.anything() })
254245
)
255246
})
256247

apps/sim/lib/credential-groups/application/list-credentials.ts

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
import { defineAuthorizedWorkspaceUseCase } from '@/lib/core/application'
22
import { OrchestrationError } from '@/lib/core/orchestration/types'
3-
import {
4-
credentialGroupDelegationPolicy,
5-
requireCredentialGroupEnrollmentAccess,
6-
} from '@/lib/credential-groups/application/authorization'
3+
import { credentialGroupDelegationPolicy } from '@/lib/credential-groups/application/authorization'
74
import {
85
requireCredentialGroupsAvailable,
96
resolveCredentialGroupContext,
@@ -39,12 +36,6 @@ export const listCredentialGroupCredentials = defineAuthorizedWorkspaceUseCase({
3936
resolveContext: ({ input }: { input: ListCredentialGroupCredentialsInput }) =>
4037
resolveCredentialGroupContext(input.credentialGroupId),
4138
authorizationOptions: { delegation: credentialGroupDelegationPolicy },
42-
async authorizeResource({ principal, context }) {
43-
context.enrollmentAccess = await requireCredentialGroupEnrollmentAccess(
44-
principal,
45-
context.credentialGroupId
46-
)
47-
},
4839
execute: async ({ input, context }): Promise<ListCredentialGroupCredentialsResult> => {
4940
if (
5041
!Number.isInteger(input.limit) ||
@@ -84,9 +75,6 @@ export const listCredentialGroupCredentials = defineAuthorizedWorkspaceUseCase({
8475
}
8576

8677
await requireCredentialGroupsAvailable(context.workspaceId)
87-
if (!context.enrollmentAccess) {
88-
throw new Error('Credential Group credential listing executed without enrollment access')
89-
}
9078

9179
let page
9280
try {
@@ -96,7 +84,6 @@ export const listCredentialGroupCredentials = defineAuthorizedWorkspaceUseCase({
9684
credentialGroupOptionIds: activeOptions.map((option) => option.id),
9785
limit: input.limit,
9886
cursor: input.cursor,
99-
credentialGroupEnrollmentId: context.enrollmentAccess.enrollmentId,
10087
credentialProviderIds: credentialProviderIds.length > 0 ? credentialProviderIds : undefined,
10188
})
10289
} catch (error) {

apps/sim/lib/credential-groups/credentials.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ describe('listCredentialGroupCredentialReferences', () => {
2727
const result = await listCredentialGroupCredentialReferences({
2828
workspaceId: 'workspace-1',
2929
credentialGroupId: 'group-1',
30-
credentialGroupEnrollmentId: 'enrollment-1',
3130
credentialGroupOptionIds: ['option-1'],
3231
limit: 50,
3332
})

apps/sim/lib/credential-groups/credentials.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ interface ListCredentialGroupCredentialReferencesInput {
4444
credentialGroupId: string
4545
limit: number
4646
cursor?: string
47-
credentialGroupEnrollmentId: string
4847
credentialProviderIds?: string[]
4948
credentialGroupOptionIds: string[]
5049
}
@@ -97,7 +96,6 @@ export async function listCredentialGroupCredentialReferences({
9796
credentialGroupId,
9897
limit,
9998
cursor,
100-
credentialGroupEnrollmentId,
10199
credentialProviderIds,
102100
credentialGroupOptionIds,
103101
}: ListCredentialGroupCredentialReferencesInput): Promise<{
@@ -125,7 +123,6 @@ export async function listCredentialGroupCredentialReferences({
125123
eq(credential.type, 'managed_oauth'),
126124
eq(credential.managedOauthStatus, 'active'),
127125
eq(credentialGroupEnrollment.credentialGroupId, credentialGroupId),
128-
eq(credentialGroupEnrollment.id, credentialGroupEnrollmentId),
129126
inArray(credential.credentialGroupOptionId, credentialGroupOptionIds),
130127
credentialProviderIds?.length
131128
? inArray(credential.providerId, credentialProviderIds)
@@ -159,7 +156,6 @@ export async function listCredentialGroupCredentialReferences({
159156
eq(credential.type, 'managed_oauth'),
160157
eq(credential.managedOauthStatus, 'active'),
161158
eq(credentialGroupEnrollment.credentialGroupId, credentialGroupId),
162-
eq(credentialGroupEnrollment.id, credentialGroupEnrollmentId),
163159
inArray(credential.credentialGroupOptionId, credentialGroupOptionIds),
164160
credentialProviderIds?.length
165161
? inArray(credential.providerId, credentialProviderIds)

0 commit comments

Comments
 (0)