/* eslint-disable */ // @ts-nocheck import PolicyRepresentation, { DecisionStrategy, Logic, } from "@keycloak/keycloak-admin-client/lib/defs/policyRepresentation"; import PolicyProviderRepresentation from "@keycloak/keycloak-admin-client/lib/defs/policyProviderRepresentation"; import { useTranslation } from "react-i18next"; import { Modal, ModalVariant, TextContent, Text, TextVariants, ActionGroup, Button, Form, ButtonVariant, AlertVariant, } from "../../../shared/@patternfly/react-core"; import { SelectControl, TextControl, useAlerts, } from "../../../shared/keycloak-ui-shared"; import { FormProvider, useForm, useWatch } from "react-hook-form"; import { useAdminClient } from "../../admin-client"; import { useRealm } from "../../context/realm-context/RealmContext"; import { Client } from "../../clients/authorization/policy/Client"; import { User } from "../../clients/authorization/policy/User"; import { ClientScope, RequiredIdValue, } from "../../clients/authorization/policy/ClientScope"; import { Group, GroupValue } from "../../clients/authorization/policy/Group"; import { Regex } from "../../clients/authorization/policy/Regex"; import { Role } from "../../clients/authorization/policy/Role"; import { Time } from "../../clients/authorization/policy/Time"; import { JavaScript } from "../../clients/authorization/policy/JavaScript"; import { LogicSelector } from "../../clients/authorization/policy/LogicSelector"; import { Aggregate } from "../../clients/authorization/policy/Aggregate"; import { capitalize } from "lodash-es"; import { useEffect, type JSX } from "react"; type Policy = Omit & { groups?: GroupValue[]; clientScopes?: RequiredIdValue[]; roles?: RequiredIdValue[]; clients?: []; }; type ComponentsProps = { isPermissionClient?: boolean; permissionClientId: string; }; const defaultValues: Policy = { name: "", description: "", type: "group", policies: [], decisionStrategy: DecisionStrategy.UNANIMOUS, logic: Logic.POSITIVE, }; const COMPONENTS: { [index: string]: ({ isPermissionClient, permissionClientId, }: ComponentsProps) => JSX.Element; } = { aggregate: Aggregate, client: Client, user: User, "client-scope": ClientScope, group: Group, regex: Regex, role: Role, time: Time, js: JavaScript, default: Group, } as const; export const isValidComponentType = (value: string) => value in COMPONENTS; type NewPermissionConfigurationDialogProps = { permissionClientId: string; providers: PolicyProviderRepresentation[]; policies: PolicyRepresentation[]; resourceType: string; toggleDialog: () => void; onAssign: (newPolicy: PolicyRepresentation) => void; }; export const NewPermissionPolicyDialog = ({ permissionClientId, providers, policies, toggleDialog, onAssign, }: NewPermissionConfigurationDialogProps) => { const { adminClient } = useAdminClient(); const { realmRepresentation } = useRealm(); const { t } = useTranslation(); const form = useForm({ mode: "onChange", defaultValues, }); const { addAlert, addError } = useAlerts(); const { handleSubmit, reset } = form; const isPermissionClient = realmRepresentation.adminPermissionsEnabled; const policyTypeSelector = useWatch({ control: form.control, name: "type", }); function getComponentType() { if (policyTypeSelector && isValidComponentType(policyTypeSelector)) { return COMPONENTS[policyTypeSelector]; } return COMPONENTS["default"]; } const ComponentType = getComponentType(); useEffect(() => { if (policyTypeSelector) { const { name, description, decisionStrategy, logic } = form.getValues(); reset({ type: policyTypeSelector, name, description, decisionStrategy, logic, }); } }, [policyTypeSelector, reset, form]); const save = async (policy: Policy) => { const { groups, roles, policies, clients, ...rest } = policy; const cleanedPolicy = { ...rest, ...(groups && groups.length > 0 && { groups }), ...(roles && roles.length > 0 && { roles }), ...(policies && policies.length > 0 && { policies }), // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- clients may be undefined at runtime despite the type ...(clients && clients.length > 0 && { clients }), ...(rest.type === "group" && (!groups || groups.length === 0) && { groups: [] }), ...(rest.type === "client" && // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- clients may be undefined at runtime despite the type (!clients || clients.length === 0) && { clients: [] }), }; try { const createdPolicy = await adminClient.clients.createPolicy( { id: permissionClientId, type: policyTypeSelector! }, cleanedPolicy, ); onAssign(createdPolicy); toggleDialog(); addAlert(t("createPolicySuccess"), AlertVariant.success); } catch (error) { addError("policySaveError", error); } }; return ( {t("createPermissionPolicy")} } isOpen onClose={toggleDialog} >
{ e.stopPropagation(); await handleSubmit(save)(e); }} isHorizontal > {providers.length > 0 && ( ({ key: provider.type!, value: capitalize(provider.type!), }))} controller={{ defaultValue: "" }} /> )}
); };