Skip to content

Commit 4601fde

Browse files
authored
fix: forward authFilter in RDS index query to prevent cross-tenant data exposure (#3504)
2 parents 5765805 + 7fc9d20 commit 4601fde

2 files changed

Lines changed: 36 additions & 7 deletions

File tree

packages/amplify-graphql-index-transformer/src/__tests__/amplify-graphql-index-transformer.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1479,6 +1479,8 @@ describe('Index query resolver creation', () => {
14791479
},
14801480
output: {
14811481
getQueryTypeName: jest.fn().mockReturnValue('Query'),
1482+
getObject: jest.fn().mockReturnValue(undefined),
1483+
getTypeDefinitionsOfKind: jest.fn().mockReturnValue([]),
14821484
},
14831485
resolvers: {
14841486
generateQueryResolver: jest.fn().mockReturnValue(mockResolver),
@@ -1502,6 +1504,30 @@ describe('Index query resolver creation', () => {
15021504
};
15031505
});
15041506

1507+
describe('RDS index query template includes authFilter', () => {
1508+
it('generates VTL that forwards ctx.stash.authFilter to the SQL Lambda payload', () => {
1509+
const { RDSIndexVTLGenerator } = require('../resolvers/generators/rds-vtl-generator');
1510+
const generator = new RDSIndexVTLGenerator();
1511+
const mockCtx: any = {
1512+
resourceHelper: {
1513+
getModelNameMapping: jest.fn().mockReturnValue('customer'),
1514+
},
1515+
output: {
1516+
getObject: jest.fn().mockReturnValue(undefined),
1517+
getTypeDefinitionsOfKind: jest.fn().mockReturnValue([]),
1518+
},
1519+
};
1520+
const vtl = generator.generateIndexQueryRequestTemplate(
1521+
{ name: 'byRep', queryField: 'listByRep' } as any,
1522+
mockCtx,
1523+
'Customer',
1524+
'listByRep',
1525+
);
1526+
expect(vtl).toContain('$ctx.stash.authFilter');
1527+
expect(vtl).toContain('lambdaInput.args.metadata.authFilter');
1528+
});
1529+
});
1530+
15051531
describe('auth', () => {
15061532
const API_KEY = 'API Key Authorization';
15071533
const IAM_AUTH_TYPE = 'IAM Authorization';

packages/amplify-graphql-index-transformer/src/resolvers/generators/rds-vtl-generator.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
11
import { TransformerContextProvider, TransformerResolverProvider } from '@aws-amplify/graphql-transformer-interfaces';
2+
import {
3+
constructAuthFilterStatement,
4+
constructNonScalarFieldsStatement,
5+
constructArrayFieldsStatement,
6+
constructFieldMappingInput,
7+
} from '@aws-amplify/graphql-transformer-core';
28
import { Expression, printBlock, compoundExpression, set, ref, list, qref, methodCall, str, obj } from 'graphql-mapping-template';
39
import _ from 'lodash';
410
import { IndexDirectiveConfiguration, PrimaryKeyDirectiveConfiguration } from '../../types';
@@ -22,13 +28,10 @@ export class RDSIndexVTLGenerator implements IndexVTLGenerator {
2228
set(ref('lambdaInput.operationName'), str(operationName)),
2329
set(ref('lambdaInput.args.metadata'), obj({})),
2430
set(ref('lambdaInput.args.metadata.keys'), list([])),
25-
set(ref('lambdaInput.args.metadata.fieldMap'), obj({})),
26-
qref(
27-
methodCall(
28-
ref('lambdaInput.args.metadata.fieldMap.putAll'),
29-
methodCall(ref('util.defaultIfNull'), ref('context.stash.fieldMap'), obj({})),
30-
),
31-
),
31+
constructAuthFilterStatement('lambdaInput.args.metadata.authFilter'),
32+
constructNonScalarFieldsStatement(tableName, ctx),
33+
constructArrayFieldsStatement(tableName, ctx),
34+
constructFieldMappingInput(),
3235
qref(
3336
methodCall(ref('lambdaInput.args.metadata.keys.addAll'), methodCall(ref('util.defaultIfNull'), ref('ctx.stash.keys'), list([]))),
3437
),

0 commit comments

Comments
 (0)