Skip to content

Commit e693c98

Browse files
feat(middleware-sdk-s3): bucket name validator skips ARN bucket name (#1442)
* feat(middleware-sdk-s3): bucket name validator skips ARN bucket name * feat(middleware-sdk-s3): address feedbacks Co-authored-by: Trivikram Kamat <[email protected]>
1 parent b5da159 commit e693c98

File tree

4 files changed

+24
-3
lines changed

4 files changed

+24
-3
lines changed

packages/middleware-sdk-s3/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
},
1919
"license": "Apache-2.0",
2020
"dependencies": {
21+
"@aws-sdk/util-arn-parser": "1.0.0-gamma.1",
2122
"tslib": "^1.8.0"
2223
},
2324
"devDependencies": {

packages/middleware-sdk-s3/src/validate-bucket-name.spec.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
const mockValidateArn = jest.fn();
2+
jest.mock("@aws-sdk/util-arn-parser", () => ({ validate: mockValidateArn }));
13
import { validateBucketNameMiddleware } from "./validate-bucket-name";
24

35
describe("validateBucketNameMiddleware", () => {
46
const mockNextHandler = jest.fn();
57

68
beforeEach(() => {
79
jest.clearAllMocks();
10+
mockValidateArn.mockReturnValue(false);
811
});
912

1013
it("throws error if Bucket parameter contains '/'", async () => {
@@ -36,4 +39,17 @@ describe("validateBucketNameMiddleware", () => {
3639
expect(mockNextHandler.mock.calls.length).toBe(1);
3740
expect(mockNextHandler.mock.calls[0][0]).toEqual(args);
3841
});
42+
43+
it("should not validate bucket name if the bucket name is an ARN", async () => {
44+
mockValidateArn.mockReturnValue(true);
45+
const handler = validateBucketNameMiddleware()(mockNextHandler, {} as any);
46+
const args = {
47+
input: {
48+
Bucket: "arn:aws:s3:us-east-1:123456789012:accesspoint/myendpoint",
49+
},
50+
};
51+
await handler(args);
52+
expect(mockNextHandler.mock.calls.length).toBe(1);
53+
expect(mockNextHandler.mock.calls[0][0]).toEqual(args);
54+
});
3955
});

packages/middleware-sdk-s3/src/validate-bucket-name.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,19 @@ import {
77
MetadataBearer,
88
Pluggable,
99
} from "@aws-sdk/types";
10+
import { validate as validateArn } from "@aws-sdk/util-arn-parser";
1011

1112
export function validateBucketNameMiddleware(): InitializeMiddleware<any, any> {
1213
return <Output extends MetadataBearer>(
1314
next: InitializeHandler<any, Output>
1415
): InitializeHandler<any, Output> => async (
1516
args: InitializeHandlerArguments<any>
1617
): Promise<InitializeHandlerOutput<Output>> => {
17-
const { input } = args;
18-
if (typeof input.Bucket === "string" && input.Bucket.indexOf("/") >= 0) {
19-
const err = new Error(`Bucket name shouldn't contain '/', received '${input.Bucket}'`);
18+
const {
19+
input: { Bucket },
20+
} = args;
21+
if (typeof Bucket === "string" && !validateArn(Bucket) && Bucket.indexOf("/") >= 0) {
22+
const err = new Error(`Bucket name shouldn't contain '/', received '${Bucket}'`);
2023
err.name = "InvalidBucketName";
2124
throw err;
2225
}

packages/util-arn-parser/src/index.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ describe("validate", () => {
44
it("should validate whether input is a qualified resource ARN", () => {
55
expect(validate("arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint")).toBe(true);
66
expect(validate("arn:aws:s3:us-east-1:123456789012:accesspoint:myendpoint")).toBe(true);
7+
expect(validate("arn:aws:s3:us-east-1:123456789012:accesspoint/myendpoint")).toBe(true);
78
expect(validate("arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint")).toBe(true);
89
expect(validate("arn:aws:sns:us-west-2:123456789012:myTopic")).toBe(true);
910
expect(validate("some:random:string:separated:by:colons")).toBe(false);

0 commit comments

Comments
 (0)