Skip to content

Commit db6860c

Browse files
authored
ROX-7642: Disallow empty Auth Provider rules (stackrox/rox#8854)
1 parent 16bb606 commit db6860c

3 files changed

Lines changed: 49 additions & 8 deletions

File tree

‎ui/apps/platform/src/Components/SelectSingle/SelectSingle.tsx‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ export type SelectSingleProps = {
1010
direction?: 'up' | 'down';
1111
isCreatable?: boolean;
1212
variant?: 'typeahead' | null;
13+
placeholderText?: string;
1314
};
1415

1516
function SelectSingle({
@@ -21,6 +22,7 @@ function SelectSingle({
2122
direction = 'down',
2223
isCreatable = false,
2324
variant = null,
25+
placeholderText = '',
2426
}: SelectSingleProps): ReactElement {
2527
const [isOpen, setIsOpen] = useState(false);
2628

@@ -43,6 +45,7 @@ function SelectSingle({
4345
selections={value}
4446
direction={direction}
4547
isCreatable={isCreatable}
48+
placeholderText={placeholderText}
4649
>
4750
{children}
4851
</Select>

‎ui/apps/platform/src/Containers/AccessControl/AuthProviders/AuthProviderForm.tsx‎

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import { actions as authActions } from 'reducers/auth';
2929
import { AuthProvider } from 'services/AuthService';
3030

3131
import ConfigurationFormFields from './ConfigurationFormFields';
32-
import RuleGroups from './RuleGroups';
32+
import RuleGroups, { RuleGroupErrors } from './RuleGroups';
3333
import {
3434
getInitialAuthProviderValues,
3535
transformInitialValues,
@@ -89,6 +89,16 @@ function AuthProviderForm({
8989
const authProviderValidationSchema = yup.object().shape({
9090
name: yup.string().required('A name is required.'),
9191
type: yup.string().required(),
92+
defaultRole: yup.string().required(),
93+
groups: yup.array().of(
94+
yup.object().shape({
95+
roleName: yup.string().required('Role is a required field'),
96+
props: yup.object().shape({
97+
key: yup.string().required('Key is a required field'),
98+
value: yup.string().required('Value is a required field'),
99+
}),
100+
})
101+
),
92102
config: yup
93103
.object()
94104
.when('type', {
@@ -437,6 +447,7 @@ function AuthProviderForm({
437447
onChange={onChange}
438448
setFieldValue={setFieldValue}
439449
disabled={isViewing}
450+
errors={errors?.groups as RuleGroupErrors[]}
440451
/>
441452
</FormSection>
442453
</FormSection>

‎ui/apps/platform/src/Containers/AccessControl/AuthProviders/RuleGroups.tsx‎

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ import { Group } from 'services/AuthService';
1010
import { Role } from 'services/RolesService';
1111
import SelectSingle from 'Components/SelectSingle';
1212

13+
export type RuleGroupErrors = {
14+
roleName?: string;
15+
props?: {
16+
key?: string;
17+
value?: string;
18+
};
19+
};
20+
1321
export type RuleGroupsProps = {
1422
authProviderId: string;
1523
onChange: (
@@ -20,17 +28,18 @@ export type RuleGroupsProps = {
2028
groups: Group[];
2129
setFieldValue: (name: string, value: string) => void;
2230
disabled: boolean | undefined;
31+
errors?: RuleGroupErrors[];
2332
};
2433

2534
const ruleKeys = ['userid', 'name', 'email', 'groups'];
2635

27-
function getAugmentedRuleKeys(existingKeys, groups) {
36+
function getAugmentedRuleKeys(groups) {
2837
const newRuleKeys = [...ruleKeys];
2938

3039
groups.forEach((group) => {
3140
const alreadyInList = newRuleKeys.find((key) => key === group?.props?.key);
3241

33-
if (!alreadyInList) {
42+
if (group.props.key && !alreadyInList) {
3443
newRuleKeys.push(group.props.key);
3544
}
3645
});
@@ -45,8 +54,9 @@ function RuleGroups({
4554
groups = [],
4655
roles = [],
4756
disabled = false,
57+
errors = [],
4858
}: RuleGroupsProps): ReactElement {
49-
const augmentedRuleKeys = getAugmentedRuleKeys(ruleKeys, groups);
59+
const augmentedRuleKeys = getAugmentedRuleKeys(groups);
5060

5161
return (
5262
<FieldArray
@@ -58,7 +68,12 @@ function RuleGroups({
5868
groups.map((group, index: number) => (
5969
<Flex key={`${group.props.authProviderId}_custom_rule_${index}`}>
6070
<FlexItem>
61-
<FormGroup label="Key" fieldId={`groups[${index}].props.key`}>
71+
<FormGroup
72+
label="Key"
73+
fieldId={`groups[${index}].props.key`}
74+
helperTextInvalid={errors[index]?.props?.key || ''}
75+
validated={errors[index]?.props?.key ? 'error' : 'default'}
76+
>
6277
<SelectSingle
6378
id={`groups[${index}].props.key`}
6479
value={groups[`${index}`].props.key}
@@ -67,6 +82,7 @@ function RuleGroups({
6782
direction="up"
6883
isCreatable
6984
variant="typeahead"
85+
placeholderText="Select or enter a key"
7086
>
7187
{augmentedRuleKeys.map((ruleKey) => (
7288
<SelectOption key={ruleKey} value={ruleKey} />
@@ -78,6 +94,10 @@ function RuleGroups({
7894
<FormGroup
7995
label="Value"
8096
fieldId={`groups[${index}].props.value`}
97+
helperTextInvalid={errors[index]?.props?.value || ''}
98+
validated={
99+
errors[index]?.props?.value ? 'error' : 'default'
100+
}
81101
>
82102
<TextInput
83103
type="text"
@@ -92,13 +112,19 @@ function RuleGroups({
92112
<ArrowRightIcon style={{ transform: 'translate(0, 42px)' }} />
93113
</FlexItem>
94114
<FlexItem>
95-
<FormGroup label="Role" fieldId={`groups[${index}].roleName`}>
115+
<FormGroup
116+
label="Role"
117+
fieldId={`groups[${index}].roleName`}
118+
helperTextInvalid={errors[index]?.roleName || ''}
119+
validated={errors[index]?.roleName ? 'error' : 'default'}
120+
>
96121
<SelectSingle
97122
id={`groups[${index}].roleName`}
98123
value={groups[`${index}`].roleName}
99124
isDisabled={disabled}
100125
handleSelect={setFieldValue}
101126
direction="up"
127+
placeholderText="Select a role"
102128
>
103129
{roles.map(({ name }) => (
104130
<SelectOption key={name} value={name} />
@@ -126,13 +152,14 @@ function RuleGroups({
126152
<Button
127153
variant="link"
128154
isInline
155+
isDisabled={!!errors?.length}
129156
icon={<PlusCircleIcon className="pf-u-mr-sm" />}
130157
onClick={() =>
131158
arrayHelpers.push({
132-
roleName: roles[0]?.name || '',
159+
roleName: '',
133160
props: {
134161
authProviderId: authProviderId || '',
135-
key: augmentedRuleKeys[0],
162+
key: '',
136163
value: '',
137164
},
138165
})

0 commit comments

Comments
 (0)