From c1c82a5691905174e15638dfe987037589a82597 Mon Sep 17 00:00:00 2001 From: Lucas Ponce Date: Tue, 26 May 2020 09:43:52 +0200 Subject: [PATCH] Fix jwks and formatOriginalToken issues --- .../IstioConfigNew/RequestAuthenticationForm.tsx | 2 ++ .../RequestAuthorizationForm/JwtRuleBuilder.tsx | 6 +++++- .../RequestAuthorizationForm/JwtRuleList.tsx | 7 ++++++- src/utils/IstioConfigUtils.ts | 9 +++++++++ src/utils/__tests__/IstioConfigUtils.test.ts | 14 +++++++++++++- 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/pages/IstioConfigNew/RequestAuthenticationForm.tsx b/src/pages/IstioConfigNew/RequestAuthenticationForm.tsx index f4165ba75d..c850b05074 100644 --- a/src/pages/IstioConfigNew/RequestAuthenticationForm.tsx +++ b/src/pages/IstioConfigNew/RequestAuthenticationForm.tsx @@ -119,6 +119,8 @@ class RequestAuthenticationForm extends React.Component { + console.log('TODELETE onAddJwtRule'); + console.log(jwtRule); this.setState( (prevState) => { prevState.jwtRules.push(jwtRule); diff --git a/src/pages/IstioConfigNew/RequestAuthorizationForm/JwtRuleBuilder.tsx b/src/pages/IstioConfigNew/RequestAuthorizationForm/JwtRuleBuilder.tsx index 32744a76c1..66ea748413 100644 --- a/src/pages/IstioConfigNew/RequestAuthorizationForm/JwtRuleBuilder.tsx +++ b/src/pages/IstioConfigNew/RequestAuthorizationForm/JwtRuleBuilder.tsx @@ -6,6 +6,7 @@ import { PlusCircleIcon } from '@patternfly/react-icons'; import { TextInputBase as TextInput } from '@patternfly/react-core/dist/js/components/TextInput/TextInput'; import { style } from 'typestyle'; import { PfColors } from '../../../components/Pf/PfColors'; +import { isValidUrl } from '../../../utils/IstioConfigUtils'; type Props = { onAddJwtRule: (rule: JWTRule) => void; @@ -83,7 +84,7 @@ export const formatJwtField = (jwtField: string, jwtRule: JWTRule): string => { case 'outputPayloadToHeader': return jwtRule.outputPayloadToHeader ? jwtRule.outputPayloadToHeader : ''; case 'forwardOriginalToken': - return jwtRule.forwardOriginalToken ? '' + jwtRule.forwardOriginalToken : ''; + return jwtRule.forwardOriginalToken ? '' + jwtRule.forwardOriginalToken : 'false'; default: } return ''; @@ -216,6 +217,9 @@ class JwtRuleBuilder extends React.Component { if (isEmptyValue) { return [false, 'Value cannot be empty']; } + if (this.state.newJwtField === 'jwksUri' && !isValidUrl(this.state.newValues)) { + return [false, 'jwsUri is not a valid Uri']; + } return [true, '']; }; diff --git a/src/pages/IstioConfigNew/RequestAuthorizationForm/JwtRuleList.tsx b/src/pages/IstioConfigNew/RequestAuthorizationForm/JwtRuleList.tsx index d20ce4b779..6cb9a33201 100644 --- a/src/pages/IstioConfigNew/RequestAuthorizationForm/JwtRuleList.tsx +++ b/src/pages/IstioConfigNew/RequestAuthorizationForm/JwtRuleList.tsx @@ -46,6 +46,11 @@ class JwtRuleList extends React.Component { audiences: [{formatJwtField('audiences', jwtRule)}] ) : undefined} + {jwtRule.jwks ? ( +
+ jwks: [{formatJwtField('jwks', jwtRule)}] +
+ ) : undefined} {jwtRule.jwksUri ? (
jwksUri: [{formatJwtField('jwksUri', jwtRule)}] @@ -66,7 +71,7 @@ class JwtRuleList extends React.Component { outputPayloadToHeader: [{formatJwtField('outputPayloadToHeader', jwtRule)}]
) : undefined} - {jwtRule.forwardOriginalToken ? ( + {jwtRule.forwardOriginalToken !== undefined ? (
forwardOriginalToken: [{formatJwtField('forwardOriginalToken', jwtRule)}]
diff --git a/src/utils/IstioConfigUtils.ts b/src/utils/IstioConfigUtils.ts index bc0be85636..0352de9179 100644 --- a/src/utils/IstioConfigUtils.ts +++ b/src/utils/IstioConfigUtils.ts @@ -126,3 +126,12 @@ export const isServerHostValid = (serverHost: string, nsMandatory: boolean): boo export const isValidIp = (ip: string): boolean => { return ipRegexp.test(ip); }; + +export const isValidUrl = (url: string): boolean => { + try { + new URL(url); + } catch (_) { + return false; + } + return true; +}; diff --git a/src/utils/__tests__/IstioConfigUtils.test.ts b/src/utils/__tests__/IstioConfigUtils.test.ts index 51090919e7..17074fea92 100644 --- a/src/utils/__tests__/IstioConfigUtils.test.ts +++ b/src/utils/__tests__/IstioConfigUtils.test.ts @@ -1,4 +1,4 @@ -import { isServerHostValid, mergeJsonPatch } from '../IstioConfigUtils'; +import { isServerHostValid, isValidUrl, mergeJsonPatch } from '../IstioConfigUtils'; describe('Validate JSON Patchs', () => { const gateway: object = { @@ -83,3 +83,15 @@ describe('Validate Gateway/Sidecar Server Host ', () => { expect(isServerHostValid('bookinf*/reviews', true)).toBeFalsy(); }); }); + +describe('Validate bad urls', () => { + it('Good urls', () => { + expect(isValidUrl('http://www.googleapis.com/oauth2/v1/certs')).toBeTruthy(); + expect(isValidUrl('https://www.googleapis.com/oauth2/v1/certs')).toBeTruthy(); + }); + + it('Bad urls', () => { + expect(isValidUrl('ramdom')).toBeFalsy(); + expect(isValidUrl('123test')).toBeFalsy(); + }); +});