/* eslint-disable */ // @ts-nocheck import type PolicyRepresentation from "@keycloak/keycloak-admin-client/lib/defs/policyRepresentation"; import { useAlerts, useFetch } from "../../../../shared/keycloak-ui-shared"; import { ActionGroup, AlertVariant, Button, ButtonVariant, DropdownItem, PageSection, } from "../../../../shared/@patternfly/react-core"; import { useState, type JSX } from "react"; import { FormProvider, useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { Link, useNavigate } from "react-router-dom"; import { useAdminClient } from "../../../admin-client"; import { useConfirmDialog } from "../../../components/confirm-dialog/ConfirmDialog"; import { FormAccess } from "../../../components/form/FormAccess"; import { KeycloakSpinner } from "../../../../shared/keycloak-ui-shared"; import { ViewHeader } from "../../../components/view-header/ViewHeader"; import { useParams } from "../../../utils/useParams"; import { toAuthorizationTab } from "../../routes/AuthenticationTab"; import { PolicyDetailsParams, toPolicyDetails, } from "../../routes/PolicyDetails"; import { useIsAdminPermissionsClient } from "../../../utils/useIsAdminPermissionsClient"; import { toPermissionsConfigurationTabs } from "../../../permissions-configuration/routes/PermissionsConfigurationTabs"; import { NewPermissionPolicyDetailsParams } from "../../../permissions-configuration/routes/NewPermissionPolicy"; import { toPermissionPolicyDetails } from "../../../permissions-configuration/routes/PermissionPolicyDetails"; import { Aggregate } from "./Aggregate"; import { Client } from "./Client"; import { ClientScope, RequiredIdValue } from "./ClientScope"; import { Group, GroupValue } from "./Group"; import { JavaScript } from "./JavaScript"; import { LogicSelector } from "./LogicSelector"; import { NameDescription } from "./NameDescription"; import { Regex } from "./Regex"; import { Role } from "./Role"; import { Time } from "./Time"; import { User } from "./User"; import "./policy-details.css"; type Policy = Omit & { groups?: GroupValue[]; clientScopes?: RequiredIdValue[]; roles?: RequiredIdValue[]; }; const COMPONENTS: { [index: string]: () => JSX.Element; } = { aggregate: Aggregate, client: Client, user: User, "client-scope": ClientScope, group: Group, regex: Regex, role: Role, time: Time, js: JavaScript, } as const; export const isValidComponentType = (value: string) => value in COMPONENTS; export default function PolicyDetails() { const { adminClient } = useAdminClient(); const { t } = useTranslation(); const { id, realm, policyId, policyType } = useParams(); const { permissionClientId } = useParams(); const navigate = useNavigate(); const form = useForm(); const { reset, handleSubmit } = form; const { addAlert, addError } = useAlerts(); const [policy, setPolicy] = useState(); const isDisabled = policyType === "js"; const isAdminPermissionsClient = useIsAdminPermissionsClient(permissionClientId); useFetch( async () => { if (policyId) { const result = await Promise.all([ adminClient.clients.findOnePolicyWithType({ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- permissionClientId is undefined when navigating from client authorization tab id: permissionClientId ?? id, type: policyType!, policyId, }) as PolicyRepresentation | undefined, adminClient.clients.getAssociatedPolicies({ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- permissionClientId is undefined when navigating from client authorization tab id: permissionClientId ?? id, permissionId: policyId, }), ]); if (!result[0]) { throw new Error(t("notFound")); } return { policy: result[0], policies: result[1].map((p) => p.id), }; } if (!isValidComponentType(policyType!)) { const providers = await adminClient.clients.listPolicyProviders({ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- permissionClientId is undefined when navigating from client authorization tab id: permissionClientId ?? id, }); const provider = providers.find((p) => p.type === policyType); if (provider) { return { policy: { code: provider.code, description: provider.description, } as PolicyRepresentation, }; } } return {}; }, ({ policy, policies }) => { reset({ ...policy, policies }); setPolicy(policy); }, [permissionClientId, id, policyType, policyId], ); const onSubmitPolicy = async (policy: Policy) => { policy.groups = policy.groups?.filter((g) => g.id); policy.clientScopes = policy.clientScopes?.filter((c) => c.id); policy.roles = policy.roles ?.filter((r) => r.id) .map((r) => ({ ...r, required: r.required || false })); const clientId = isAdminPermissionsClient ? permissionClientId : id; const navigateTo = isAdminPermissionsClient ? toPermissionPolicyDetails : toPolicyDetails; try { if (policyId) { await adminClient.clients.updatePolicy( { id: clientId!, type: policyType!, policyId }, policy, ); } else { const result = await adminClient.clients.createPolicy( { id: clientId!, type: policyType! }, policy, ); navigate( navigateTo({ realm: realm!, id: clientId!, permissionClientId: clientId!, policyId: result.id!, policyType: result.type!, }), ); } addAlert( t((policyId ? "update" : "create") + "PolicySuccess"), AlertVariant.success, ); } catch (error) { addError("policySaveError", error); } }; const [toggleDeleteDialog, DeleteConfirm] = useConfirmDialog({ titleKey: "deletePolicy", messageKey: "deletePolicyConfirm", continueButtonLabel: "confirm", onConfirm: async () => { try { await adminClient.clients.delPolicy({ id: isAdminPermissionsClient ? permissionClientId : id, policyId, }); addAlert(t("policyDeletedSuccess"), AlertVariant.success); navigate( isAdminPermissionsClient ? toPermissionsConfigurationTabs({ realm: realm!, permissionClientId, tab: "policies", }) : toAuthorizationTab({ realm, clientId: id, tab: "policies" }), ); } catch (error) { addError("policyDeletedError", error); } }, }); if (policyId && !policy) { return ; } function getComponentType() { return isValidComponentType(policyType) ? COMPONENTS[policyType] : COMPONENTS["js"]; } const ComponentType = getComponentType(); return ( <> toggleDeleteDialog()} > {t("delete")} , ] : undefined } /> onSubmitPolicy(policy))} role="anyone" // if you get this far it means you have access >
); }