Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 9 additions & 23 deletions src/components/shared/modals/ResourceDetailsAccessPolicyTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -454,32 +454,20 @@ export const AccessPolicyTable = <T extends AccessPolicyTabFormikProps>({

// If config exists, set defaults according to config
if (aclDefaults) {
if (aclDefaults["read_enabled"] && aclDefaults["read_enabled"] === "true") {
newRole.read = true;
} else if (aclDefaults["read_enabled"] && aclDefaults["read_enabled"] === "false") {
newRole.read = false;
}
if (aclDefaults["write_enabled"] && aclDefaults["write_enabled"] === "true") {
newRole.write = true;
} else if (aclDefaults["write_enabled"] && aclDefaults["write_enabled"] === "false") {
newRole.write = false;
}
if (aclDefaults["default_actions"]) {
newRole.actions = newRole.actions.concat(aclDefaults["default_actions"].split(","));
}
newRole.read = aclDefaults["read_enabled"];
newRole.write = aclDefaults["write_enabled"];
newRole.actions = newRole.actions.concat(aclDefaults["default_actions"]);
}

return newRole;
};

// Filter available options by custom prefixes from the config
if (aclDefaults) {
if (aclDefaults["display_role_filter_blacklist_prefixes"]) {
const prefixes = aclDefaults["display_role_filter_blacklist_prefixes"].split(",");
rolesFilteredbyPolicies = rolesFilteredbyPolicies.filter(role =>
!prefixes.some(prefix => role.name.startsWith(prefix)),
);
}
const prefixes = aclDefaults["display_role_filter_blacklist_prefixes"];
rolesFilteredbyPolicies = rolesFilteredbyPolicies.filter(role =>
!prefixes.some(prefix => role.name.startsWith(prefix)),
);
}

return (
Expand Down Expand Up @@ -596,7 +584,7 @@ export const AccessPolicyTable = <T extends AccessPolicyTabFormikProps>({
editAccessRole,
user,
) ||
(aclDefaults && aclDefaults["read_readonly"] !== "false")
(aclDefaults && aclDefaults["read_readonly"] !== false)
}
className={`${
transactions.readOnly
Expand All @@ -621,9 +609,7 @@ export const AccessPolicyTable = <T extends AccessPolicyTabFormikProps>({
editAccessRole,
user,
) ||
(aclDefaults
&& aclDefaults["write_readonly"]
&& aclDefaults["write_readonly"] === "true")
(aclDefaults && aclDefaults["write_readonly"] === true)
}
className={`${
transactions.readOnly
Expand Down
2 changes: 1 addition & 1 deletion src/selectors/aclSelectors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@ export const getTotalAcls = (state: RootState) => state.acls.total;
export const getAclDefaults = (state: RootState) => state.acls.aclDefaults;
export const getAclDefaultActions = createSelector(
[getAclDefaults],
aclDefaults => aclDefaults["default_actions"] ? aclDefaults["default_actions"].split(",") : [], // derived value
aclDefaults => aclDefaults ? aclDefaults["default_actions"] : [],
);
export const getAclDefaultTemplate = (state: RootState) => state.acls.aclDefaultTemplate;
38 changes: 34 additions & 4 deletions src/slices/aclSlice.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,17 @@ export type AclTemplate = {
organizationId: string,
}

export type AclDefaults = {
"read_enabled": boolean,
"write_enabled": boolean,
"read_readonly": boolean,
"write_readonly": boolean,
"default_actions": string[],
"keep_on_template_switch_role_prefixes": string[],
"display_role_filter_blacklist_prefixes": string[],
// [key: string]: string
}

type AclsState = {
status: "uninitialized" | "loading" | "succeeded" | "failed",
error: SerializedError | null,
Expand All @@ -69,7 +80,7 @@ type AclsState = {
count: number,
offset: number,
limit: number,
aclDefaults: { [key: string]: string },
aclDefaults?: AclDefaults,
aclDefaultTemplate?: AclTemplate,
};

Expand All @@ -89,7 +100,7 @@ const initialState: AclsState = {
count: 0,
offset: 0,
limit: 0,
aclDefaults: {},
aclDefaults: undefined,
};

export const fetchAcls = createAppAsyncThunk("acls/fetchAcls", async (_, { getState }) => {
Expand Down Expand Up @@ -126,10 +137,29 @@ export const fetchAclActions = async () => {
// fetch defaults for the access policy tab in the details views
export const fetchAclDefaults = createAppAsyncThunk("acls/fetchAclDefaults", async (_, { getState }) => {
const state = getState();
const data = await axios.get<{ [key: string]: string }>("/admin-ng/resources/ACL.DEFAULTS.json");
const data = await axios.get<{
"read_enabled": string,
"write_enabled": string,
"read_readonly": string,
"write_readonly": string,
"default_actions": string,
"default_template": string,
"keep_on_template_switch_role_prefixes": string,
"display_role_filter_blacklist_prefixes": string
}>("/admin-ng/resources/ACL.DEFAULTS.json");

const response = data.data;

const aclDefaults: AclDefaults = {
"read_enabled": response.read_enabled === "true" ? true : false,
"write_enabled": response.write_enabled === "true" ? true : false,
"read_readonly": response.read_readonly === "true" ? true : false,
"write_readonly": response.write_readonly === "true" ? true : false,
"default_actions": response.default_actions ? response.default_actions.split(",") : [],
"keep_on_template_switch_role_prefixes": response.keep_on_template_switch_role_prefixes ? response.keep_on_template_switch_role_prefixes.split(",") : [],
"display_role_filter_blacklist_prefixes": response.display_role_filter_blacklist_prefixes ? response.display_role_filter_blacklist_prefixes.split(",") : [],
};

let defaultTemplate = undefined;
// If the a default template id is configured and we haven't fetched the default template
// yet, do that now.
Expand All @@ -156,7 +186,7 @@ export const fetchAclDefaults = createAppAsyncThunk("acls/fetchAclDefaults", asy
defaultTemplate = template;
}

return { aclDefaults: response, aclDefaultTemplate: defaultTemplate };
return { aclDefaults: aclDefaults, aclDefaultTemplate: defaultTemplate };
});

// fetch all policies of an certain acl template
Expand Down
9 changes: 4 additions & 5 deletions src/utils/aclUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import { FormikProps } from "formik";
import { TransformedAcl } from "../slices/aclDetailsSlice";
import { checkAcls, fetchAclTemplateById, Role } from "../slices/aclSlice";
import { AclDefaults, checkAcls, fetchAclTemplateById, Role } from "../slices/aclSlice";
import { UserInfoState } from "../slices/userInfoSlice";
import { fetchUsersForTemplate } from "../slices/userSlice";
import { AppDispatch } from "../store";
Expand Down Expand Up @@ -53,7 +53,7 @@ export const handleTemplateChange = async <T extends { policies: TransformedAcl[
templateId: string,
formik: FormikProps<T>,
dispatch: AppDispatch,
aclDefaults: { [key: string]: string } | undefined,
aclDefaults?: AclDefaults,
defaultUser?: UserInfoState,
) => {
// fetch information about chosen template from backend
Expand All @@ -80,7 +80,7 @@ export const handleTemplateChange = async <T extends { policies: TransformedAcl[
role: defaultUser.userRole,
read: true,
write: true,
actions: aclDefaults && aclDefaults["default_actions"] ? aclDefaults["default_actions"].split(",") : [],
actions: aclDefaults ? aclDefaults["default_actions"] : [],
user: {
username: defaultUser.user.username,
name: defaultUser.user.name,
Expand All @@ -91,8 +91,7 @@ export const handleTemplateChange = async <T extends { policies: TransformedAcl[

// If configured, keep roles that match the configured prefix
if (aclDefaults && aclDefaults["keep_on_template_switch_role_prefixes"]) {
const prefixString = aclDefaults["keep_on_template_switch_role_prefixes"];
const prefixes = prefixString.split(",");
const prefixes = aclDefaults["keep_on_template_switch_role_prefixes"];
for (const policy of formik.values.policies) {
if (prefixes.some(prefix => policy.role.startsWith(prefix)) && !template.acl.find(acl => acl.role === policy.role)) {
template.acl.push(policy);
Expand Down
Loading