From 109419c10471143da22fe196557b8fdd87940bb2 Mon Sep 17 00:00:00 2001 From: Jonne Kaunisto Date: Thu, 4 Mar 2021 06:45:56 +0000 Subject: [PATCH 1/3] fix(aws-stepfunctions): Validate StateMachine name closes #13289 --- .../aws-stepfunctions/lib/state-machine.ts | 15 +++++++++++- .../test/state-machine.test.ts | 23 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts b/packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts index cced1d4519660..aa98501327e6b 100644 --- a/packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts +++ b/packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts @@ -46,7 +46,7 @@ export enum LogLevel { /** * Log all errors */ - ERROR= 'ERROR', + ERROR = 'ERROR', /** * Log fatal errors */ @@ -379,6 +379,10 @@ export class StateMachine extends StateMachineBase { physicalName: props.stateMachineName, }); + if (props.stateMachineName != undefined) { + this.validateStateMachineName(props.stateMachineName); + } + this.role = props.role || new iam.Role(this, 'Role', { assumedBy: new iam.ServicePrincipal('states.amazonaws.com'), }); @@ -426,6 +430,15 @@ export class StateMachine extends StateMachineBase { this.role.addToPrincipalPolicy(statement); } + private validateStateMachineName(stateMachineName: string) { + if (stateMachineName.length < 1 || stateMachineName.length > 80) { + throw new Error('StateMachine name length must be between 1 and 80 characters'); + } + if (stateMachineName.match('[0-9a-zA-Z\_\-]+')?.length != 1) { + throw new Error('StateMachine name must match [0-9a-zA-Z\_\-]+'); + } + } + private buildLoggingConfiguration(logOptions: LogOptions): CfnStateMachine.LoggingConfigurationProperty { // https://docs.aws.amazon.com/step-functions/latest/dg/cw-logs.html#cloudwatch-iam-policy this.addToRolePolicy(new iam.PolicyStatement({ diff --git a/packages/@aws-cdk/aws-stepfunctions/test/state-machine.test.ts b/packages/@aws-cdk/aws-stepfunctions/test/state-machine.test.ts index e721b460a5358..39ba3b6c12e45 100644 --- a/packages/@aws-cdk/aws-stepfunctions/test/state-machine.test.ts +++ b/packages/@aws-cdk/aws-stepfunctions/test/state-machine.test.ts @@ -62,6 +62,29 @@ describe('State Machine', () => { }), + test('State Machine with invalid name', () => { + // GIVEN + const stack = new cdk.Stack(); + + // WHEN + const createStateMachine = (name: string) => { + new stepfunctions.StateMachine(stack, name + 'StateMachine', { + stateMachineName: name, + definition: stepfunctions.Chain.start(new stepfunctions.Pass(stack, name + 'Pass')), + stateMachineType: stepfunctions.StateMachineType.EXPRESS, + }); + }; + + // THEN + expect(() => { + createStateMachine('M'.repeat(81)); + }).toThrow('StateMachine name length must be between 1 and 80 characters'); + + expect(() => { + createStateMachine('*'); + }).toThrow('StateMachine name must match [0-9a-zA-Z\_\-]+'); + }); + test('log configuration', () => { // GIVEN const stack = new cdk.Stack(); From f56c8c73d5dcfe3ecc170b17d4b4e54a7c9e7521 Mon Sep 17 00:00:00 2001 From: Jonne Kaunisto Date: Fri, 5 Mar 2021 04:39:21 +0000 Subject: [PATCH 2/3] Fix error messages --- .../@aws-cdk/aws-stepfunctions/lib/state-machine.ts | 6 +++--- .../aws-stepfunctions/test/state-machine.test.ts | 10 ++++++---- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts b/packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts index aa98501327e6b..6ac859b755fe7 100644 --- a/packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts +++ b/packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts @@ -432,10 +432,10 @@ export class StateMachine extends StateMachineBase { private validateStateMachineName(stateMachineName: string) { if (stateMachineName.length < 1 || stateMachineName.length > 80) { - throw new Error('StateMachine name length must be between 1 and 80 characters'); + throw new Error(`State Machine name must be between 1 and 80 characters. Received: ${stateMachineName}`); } - if (stateMachineName.match('[0-9a-zA-Z\_\-]+')?.length != 1) { - throw new Error('StateMachine name must match [0-9a-zA-Z\_\-]+'); + if (!stateMachineName.match('^[0-9a-zA-Z\_\-]+$')) { + throw new Error(`State Machine name must match "^[0-9a-zA-Z\_\-]+$". Received: ${stateMachineName}`); } } diff --git a/packages/@aws-cdk/aws-stepfunctions/test/state-machine.test.ts b/packages/@aws-cdk/aws-stepfunctions/test/state-machine.test.ts index 39ba3b6c12e45..be3b2edb5a346 100644 --- a/packages/@aws-cdk/aws-stepfunctions/test/state-machine.test.ts +++ b/packages/@aws-cdk/aws-stepfunctions/test/state-machine.test.ts @@ -74,15 +74,17 @@ describe('State Machine', () => { stateMachineType: stepfunctions.StateMachineType.EXPRESS, }); }; + const tooLongName = 'M'.repeat(81); + const invalidCharactersName = '*'; // THEN expect(() => { - createStateMachine('M'.repeat(81)); - }).toThrow('StateMachine name length must be between 1 and 80 characters'); + createStateMachine(tooLongName); + }).toThrow(`State Machine name must be between 1 and 80 characters. Received: ${tooLongName}`); expect(() => { - createStateMachine('*'); - }).toThrow('StateMachine name must match [0-9a-zA-Z\_\-]+'); + createStateMachine(invalidCharactersName); + }).toThrow(`State Machine name must match "^[0-9a-zA-Z\_\-]+$". Received: ${invalidCharactersName}`); }); test('log configuration', () => { From af9e7312a47759de12e0cdd8264a31273bb7f217 Mon Sep 17 00:00:00 2001 From: Jonne Kaunisto Date: Sat, 6 Mar 2021 23:47:45 +0000 Subject: [PATCH 3/3] Add test case for short name --- packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts | 4 ++-- .../@aws-cdk/aws-stepfunctions/test/state-machine.test.ts | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts b/packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts index 6ac859b755fe7..fa97eccad71f4 100644 --- a/packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts +++ b/packages/@aws-cdk/aws-stepfunctions/lib/state-machine.ts @@ -434,8 +434,8 @@ export class StateMachine extends StateMachineBase { if (stateMachineName.length < 1 || stateMachineName.length > 80) { throw new Error(`State Machine name must be between 1 and 80 characters. Received: ${stateMachineName}`); } - if (!stateMachineName.match('^[0-9a-zA-Z\_\-]+$')) { - throw new Error(`State Machine name must match "^[0-9a-zA-Z\_\-]+$". Received: ${stateMachineName}`); + if (!stateMachineName.match('^[0-9a-zA-Z+!@._-]+$')) { + throw new Error(`State Machine name must match "^[0-9a-zA-Z+!@._-]+$". Received: ${stateMachineName}`); } } diff --git a/packages/@aws-cdk/aws-stepfunctions/test/state-machine.test.ts b/packages/@aws-cdk/aws-stepfunctions/test/state-machine.test.ts index be3b2edb5a346..1c26947659a54 100644 --- a/packages/@aws-cdk/aws-stepfunctions/test/state-machine.test.ts +++ b/packages/@aws-cdk/aws-stepfunctions/test/state-machine.test.ts @@ -74,17 +74,22 @@ describe('State Machine', () => { stateMachineType: stepfunctions.StateMachineType.EXPRESS, }); }; + const tooShortName = ''; const tooLongName = 'M'.repeat(81); const invalidCharactersName = '*'; // THEN + expect(() => { + createStateMachine(tooShortName); + }).toThrow(`State Machine name must be between 1 and 80 characters. Received: ${tooShortName}`); + expect(() => { createStateMachine(tooLongName); }).toThrow(`State Machine name must be between 1 and 80 characters. Received: ${tooLongName}`); expect(() => { createStateMachine(invalidCharactersName); - }).toThrow(`State Machine name must match "^[0-9a-zA-Z\_\-]+$". Received: ${invalidCharactersName}`); + }).toThrow(`State Machine name must match "^[0-9a-zA-Z+!@._-]+$". Received: ${invalidCharactersName}`); }); test('log configuration', () => {