Skip to content

Commit bb30635

Browse files
committed
support migrating from reserved feature privileges
1 parent 38b9a8d commit bb30635

File tree

3 files changed

+118
-24
lines changed

3 files changed

+118
-24
lines changed

x-pack/plugins/security/public/management/roles/__fixtures__/kibana_features.ts

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,35 +7,41 @@
77
import { Feature, FeatureConfig } from '../../../../../features/public';
88

99
export const createFeature = (
10-
config: Pick<FeatureConfig, 'id' | 'name' | 'subFeatures' | 'reserved' | 'privilegesTooltip'> & {
10+
config: Pick<
11+
FeatureConfig,
12+
'id' | 'name' | 'privileges' | 'subFeatures' | 'reserved' | 'privilegesTooltip'
13+
> & {
1114
excludeFromBaseAll?: boolean;
1215
excludeFromBaseRead?: boolean;
1316
}
1417
) => {
15-
const { excludeFromBaseAll, excludeFromBaseRead, ...rest } = config;
18+
const { excludeFromBaseAll, excludeFromBaseRead, privileges, ...rest } = config;
1619
return new Feature({
1720
icon: 'discoverApp',
1821
navLinkId: 'discover',
1922
app: [],
2023
catalogue: [],
21-
privileges: {
22-
all: {
23-
excludeFromBasePrivileges: excludeFromBaseAll,
24-
savedObject: {
25-
all: ['all-type'],
26-
read: ['read-type'],
27-
},
28-
ui: ['read-ui', 'all-ui', `read-${config.id}`, `all-${config.id}`],
29-
},
30-
read: {
31-
excludeFromBasePrivileges: excludeFromBaseRead,
32-
savedObject: {
33-
all: [],
34-
read: ['read-type'],
35-
},
36-
ui: ['read-ui', `read-${config.id}`],
37-
},
38-
},
24+
privileges:
25+
privileges === null
26+
? null
27+
: {
28+
all: {
29+
excludeFromBasePrivileges: excludeFromBaseAll,
30+
savedObject: {
31+
all: ['all-type'],
32+
read: ['read-type'],
33+
},
34+
ui: ['read-ui', 'all-ui', `read-${config.id}`, `all-${config.id}`],
35+
},
36+
read: {
37+
excludeFromBasePrivileges: excludeFromBaseRead,
38+
savedObject: {
39+
all: [],
40+
read: ['read-type'],
41+
},
42+
ui: ['read-ui', `read-${config.id}`],
43+
},
44+
},
3945
...rest,
4046
});
4147
};

x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/feature_table/feature_table.test.tsx

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -762,4 +762,88 @@ describe('FeatureTable', () => {
762762
},
763763
});
764764
});
765+
766+
it('renders a description for features with only reserved privileges (omitting the primary feature controls)', () => {
767+
const role = createRole([
768+
{
769+
spaces: ['foo'],
770+
base: [],
771+
feature: {},
772+
},
773+
]);
774+
const reservedFeature = createFeature({
775+
id: 'reserved_feature',
776+
name: 'Reserved Feature',
777+
privileges: null,
778+
reserved: {
779+
description: 'this is my reserved feature description',
780+
privileges: [
781+
{
782+
id: 'priv_1',
783+
privilege: {
784+
api: [],
785+
savedObject: { all: [], read: [] },
786+
ui: [],
787+
},
788+
},
789+
],
790+
},
791+
});
792+
793+
const { wrapper } = setup({
794+
role,
795+
features: [reservedFeature],
796+
privilegeIndex: 0,
797+
calculateDisplayedPrivileges: false,
798+
canCustomizeSubFeaturePrivileges: false,
799+
});
800+
801+
expect(findTestSubject(wrapper, 'reservedFeatureDescription').text()).toMatchInlineSnapshot(
802+
`"this is my reserved feature description"`
803+
);
804+
805+
expect(findTestSubject(wrapper, 'primaryFeaturePrivilegeControl')).toHaveLength(0);
806+
});
807+
808+
it('renders renders the primary feature controls when both primary and reserved privileges are specified', () => {
809+
const role = createRole([
810+
{
811+
spaces: ['foo'],
812+
base: [],
813+
feature: {},
814+
},
815+
]);
816+
const reservedFeature = createFeature({
817+
id: 'reserved_feature',
818+
name: 'Reserved Feature with primary feature privileges',
819+
reserved: {
820+
description: 'this is my reserved feature description',
821+
privileges: [
822+
{
823+
id: 'priv_1',
824+
privilege: {
825+
api: [],
826+
savedObject: { all: [], read: [] },
827+
ui: [],
828+
},
829+
},
830+
],
831+
},
832+
});
833+
834+
const { displayedPrivileges, wrapper } = setup({
835+
role,
836+
features: [reservedFeature],
837+
privilegeIndex: 0,
838+
calculateDisplayedPrivileges: true,
839+
canCustomizeSubFeaturePrivileges: false,
840+
});
841+
842+
expect(findTestSubject(wrapper, 'reservedFeatureDescription')).toHaveLength(0);
843+
expect(displayedPrivileges).toEqual({
844+
reserved_feature: {
845+
primaryFeaturePrivilege: 'none',
846+
},
847+
});
848+
});
765849
});

x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/feature_table/feature_table.tsx

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,12 +193,16 @@ export class FeatureTable extends Component<Props, State> {
193193
render: (roleEntry: Role, record: TableRow) => {
194194
const { feature } = record;
195195

196-
if (feature.reserved) {
197-
return <EuiText size={'s'}>{feature.reserved.description}</EuiText>;
198-
}
199-
200196
const primaryFeaturePrivileges = feature.getPrimaryFeaturePrivileges();
201197

198+
if (feature.reserved && primaryFeaturePrivileges.length === 0) {
199+
return (
200+
<EuiText size={'s'} data-test-subj="reservedFeatureDescription">
201+
{feature.reserved.description}
202+
</EuiText>
203+
);
204+
}
205+
202206
if (primaryFeaturePrivileges.length === 0) {
203207
return null;
204208
}

0 commit comments

Comments
 (0)