diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/create/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/create/index.tsx
index 99ccbc7af51e4..2686bb47925b6 100644
--- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/create/index.tsx
+++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/create/index.tsx
@@ -24,7 +24,7 @@ import { StepScheduleRule } from '../components/step_schedule_rule';
import { StepRuleActions } from '../components/step_rule_actions';
import { DetectionEngineHeaderPage } from '../../components/detection_engine_header_page';
import * as RuleI18n from '../translations';
-import { redirectToDetections, getActionMessageParams } from '../helpers';
+import { redirectToDetections, getActionMessageParams, userHasNoPermissions } from '../helpers';
import {
AboutStepRule,
DefineStepRule,
@@ -116,7 +116,6 @@ const CreateRulePageComponent: React.FC = () => {
getActionMessageParams((stepsData.current['define-rule'].data as DefineStepRule).ruleType),
[stepsData.current['define-rule'].data]
);
- const userHasNoPermissions = canUserCRUD != null ? !canUserCRUD : false;
const setStepData = useCallback(
(step: RuleStep, data: unknown, isValid: boolean) => {
@@ -272,7 +271,7 @@ const CreateRulePageComponent: React.FC = () => {
if (redirectToDetections(isSignalIndexExists, isAuthenticated, hasEncryptionKey)) {
return ;
- } else if (userHasNoPermissions) {
+ } else if (userHasNoPermissions(canUserCRUD)) {
return ;
}
diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.tsx
index 0c478a55997bc..cb4d88a8bb539 100644
--- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.tsx
+++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/details/index.tsx
@@ -53,7 +53,7 @@ import * as detectionI18n from '../../translations';
import { ReadOnlyCallOut } from '../components/read_only_callout';
import { RuleSwitch } from '../components/rule_switch';
import { StepPanel } from '../components/step_panel';
-import { getStepsData, redirectToDetections } from '../helpers';
+import { getStepsData, redirectToDetections, userHasNoPermissions } from '../helpers';
import * as ruleI18n from '../translations';
import * as i18n from './translations';
import { GlobalTime } from '../../../../containers/global_time';
@@ -114,7 +114,6 @@ const RuleDetailsPageComponent: FC = ({
scheduleRuleData: null,
};
const [lastSignals] = useSignalInfo({ ruleId });
- const userHasNoPermissions = canUserCRUD != null ? !canUserCRUD : false;
const title = isLoading === true || rule === null ? : rule.name;
const subTitle = useMemo(
@@ -225,7 +224,7 @@ const RuleDetailsPageComponent: FC = ({
return (
<>
{hasIndexWrite != null && !hasIndexWrite && }
- {userHasNoPermissions && }
+ {userHasNoPermissions(canUserCRUD) && }
{({ indicesExist, indexPattern }) => {
return indicesExistOrDataTemporarilyUnavailable(indicesExist) ? (
@@ -262,7 +261,7 @@ const RuleDetailsPageComponent: FC = ({
= ({
{ruleI18n.EDIT_RULE_SETTINGS}
@@ -283,7 +282,7 @@ const RuleDetailsPageComponent: FC = ({
diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/edit/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/edit/index.tsx
index 495e9d2f682b8..c42e7b902cd5c 100644
--- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/edit/index.tsx
+++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/edit/index.tsx
@@ -33,7 +33,12 @@ import { StepDefineRule } from '../components/step_define_rule';
import { StepScheduleRule } from '../components/step_schedule_rule';
import { StepRuleActions } from '../components/step_rule_actions';
import { formatRule } from '../create/helpers';
-import { getStepsData, redirectToDetections, getActionMessageParams } from '../helpers';
+import {
+ getStepsData,
+ redirectToDetections,
+ getActionMessageParams,
+ userHasNoPermissions,
+} from '../helpers';
import * as ruleI18n from '../translations';
import {
RuleStep,
@@ -73,8 +78,6 @@ const EditRulePageComponent: FC = () => {
const { detailName: ruleId } = useParams();
const [loading, rule] = useRule(ruleId);
- const userHasNoPermissions = canUserCRUD != null ? !canUserCRUD : false;
-
const [initForm, setInitForm] = useState(false);
const [myAboutRuleForm, setMyAboutRuleForm] = useState({
data: null,
@@ -344,7 +347,7 @@ const EditRulePageComponent: FC = () => {
if (redirectToDetections(isSignalIndexExists, isAuthenticated, hasEncryptionKey)) {
return ;
- } else if (userHasNoPermissions) {
+ } else if (userHasNoPermissions(canUserCRUD)) {
return ;
}
diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/helpers.test.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/helpers.test.tsx
index 522464d585cca..933d233c4d2b7 100644
--- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/helpers.test.tsx
+++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/helpers.test.tsx
@@ -14,6 +14,7 @@ import {
getHumanizedDuration,
getModifiedAboutDetailsData,
determineDetailsValue,
+ userHasNoPermissions,
} from './helpers';
import { mockRuleWithEverything, mockRule } from './all/__mocks__/mock';
import { esFilters } from '../../../../../../../../src/plugins/data/public';
@@ -337,4 +338,27 @@ describe('rule helpers', () => {
expect(result).toEqual(aboutRuleDetailsData);
});
});
+
+ describe('userHasNoPermissions', () => {
+ test("returns false when user's CRUD operations are null", () => {
+ const result: boolean = userHasNoPermissions(null);
+ const userHasNoPermissionsExpectedResult = false;
+
+ expect(result).toEqual(userHasNoPermissionsExpectedResult);
+ });
+
+ test('returns false when user cannot CRUD', () => {
+ const result: boolean = userHasNoPermissions(false);
+ const userHasNoPermissionsExpectedResult = true;
+
+ expect(result).toEqual(userHasNoPermissionsExpectedResult);
+ });
+
+ test('returns false when user can CRUD', () => {
+ const result: boolean = userHasNoPermissions(true);
+ const userHasNoPermissionsExpectedResult = false;
+
+ expect(result).toEqual(userHasNoPermissionsExpectedResult);
+ });
+ });
});
diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/helpers.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/helpers.tsx
index b6afba527ccdc..db1f2298b5ea7 100644
--- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/helpers.tsx
+++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/helpers.tsx
@@ -267,3 +267,7 @@ export const getActionMessageParams = memoizeOne((ruleType: RuleType | undefined
...actionMessageRuleParams.map(param => `context.rule.${param}`),
];
});
+
+// typed as null not undefined as the initial state for this value is null.
+export const userHasNoPermissions = (canUserCRUD: boolean | null): boolean =>
+ canUserCRUD != null ? !canUserCRUD : false;
diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/index.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/index.tsx
index 72f5ac9684635..8831bc77691fa 100644
--- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/index.tsx
+++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/rules/index.tsx
@@ -23,7 +23,7 @@ import { AllRules } from './all';
import { ImportDataModal } from '../../../components/import_data_modal';
import { ReadOnlyCallOut } from './components/read_only_callout';
import { UpdatePrePackagedRulesCallOut } from './components/pre_packaged_rules/update_callout';
-import { getPrePackagedRuleStatus, redirectToDetections } from './helpers';
+import { getPrePackagedRuleStatus, redirectToDetections, userHasNoPermissions } from './helpers';
import * as i18n from './translations';
type Func = (refreshPrePackagedRule?: boolean) => void;
@@ -61,8 +61,6 @@ const RulesPageComponent: React.FC = () => {
rulesNotUpdated
);
- const userHasNoPermissions = canUserCRUD != null ? !canUserCRUD : false;
-
const handleRefreshRules = useCallback(async () => {
if (refreshRulesData.current != null) {
refreshRulesData.current(true);
@@ -92,7 +90,7 @@ const RulesPageComponent: React.FC = () => {
return (
<>
- {userHasNoPermissions && }
+ {userHasNoPermissions(canUserCRUD) && }
setShowImportModal(false)}
@@ -122,7 +120,7 @@ const RulesPageComponent: React.FC = () => {
{i18n.LOAD_PREPACKAGED_RULES}
@@ -135,7 +133,7 @@ const RulesPageComponent: React.FC = () => {
data-test-subj="reloadPrebuiltRulesBtn"
iconType="plusInCircle"
isLoading={loadingCreatePrePackagedRules}
- isDisabled={userHasNoPermissions || loading}
+ isDisabled={userHasNoPermissions(canUserCRUD) || loading}
onClick={handleCreatePrePackagedRules}
>
{i18n.RELOAD_MISSING_PREPACKAGED_RULES(rulesNotInstalled ?? 0)}
@@ -145,7 +143,7 @@ const RulesPageComponent: React.FC = () => {
{
setShowImportModal(true);
}}
@@ -159,7 +157,7 @@ const RulesPageComponent: React.FC = () => {
fill
href={getCreateRuleUrl()}
iconType="plusInCircle"
- isDisabled={userHasNoPermissions || loading}
+ isDisabled={userHasNoPermissions(canUserCRUD) || loading}
>
{i18n.ADD_NEW_RULE}
@@ -177,7 +175,7 @@ const RulesPageComponent: React.FC = () => {
createPrePackagedRules={createPrePackagedRules}
loading={loading || prePackagedRuleLoading}
loadingCreatePrePackagedRules={loadingCreatePrePackagedRules}
- hasNoPermissions={userHasNoPermissions}
+ hasNoPermissions={userHasNoPermissions(canUserCRUD)}
refetchPrePackagedRulesStatus={handleRefetchPrePackagedRulesStatus}
rulesCustomInstalled={rulesCustomInstalled}
rulesInstalled={rulesInstalled}