2021-11-17 08:27:56 +00:00
|
|
|
import React, { useState } from "react";
|
|
|
|
import { useTranslation } from "react-i18next";
|
|
|
|
import { Controller, useForm } from "react-hook-form";
|
|
|
|
import {
|
|
|
|
Button,
|
|
|
|
Divider,
|
|
|
|
FormGroup,
|
|
|
|
PageSection,
|
|
|
|
Radio,
|
|
|
|
Switch,
|
|
|
|
} from "@patternfly/react-core";
|
|
|
|
|
|
|
|
import type ResourceServerRepresentation from "@keycloak/keycloak-admin-client/lib/defs/resourceServerRepresentation";
|
2021-12-01 07:58:25 +00:00
|
|
|
import { KeycloakSpinner } from "../../components/keycloak-spinner/KeycloakSpinner";
|
2021-11-17 08:27:56 +00:00
|
|
|
import { useAdminClient, useFetch } from "../../context/auth/AdminClient";
|
|
|
|
import { FormAccess } from "../../components/form-access/FormAccess";
|
|
|
|
import { HelpItem } from "../../components/help-enabler/HelpItem";
|
|
|
|
import { SaveReset } from "../advanced/SaveReset";
|
|
|
|
|
|
|
|
const POLICY_ENFORCEMENT_MODES = [
|
|
|
|
"ENFORCING",
|
|
|
|
"PERMISSIVE",
|
|
|
|
"DISABLED",
|
|
|
|
] as const;
|
|
|
|
const DECISION_STRATEGY = ["UNANIMOUS", "AFFIRMATIVE"] as const;
|
|
|
|
|
|
|
|
export const AuthorizationSettings = ({ clientId }: { clientId: string }) => {
|
|
|
|
const { t } = useTranslation("clients");
|
|
|
|
const [resource, setResource] = useState<ResourceServerRepresentation>();
|
|
|
|
const { control, reset } = useForm<ResourceServerRepresentation>({
|
|
|
|
shouldUnregister: false,
|
|
|
|
});
|
|
|
|
|
|
|
|
const adminClient = useAdminClient();
|
|
|
|
|
|
|
|
useFetch(
|
|
|
|
() => adminClient.clients.getResourceServer({ id: clientId }),
|
|
|
|
(resource) => {
|
|
|
|
setResource(resource);
|
|
|
|
reset(resource);
|
|
|
|
},
|
|
|
|
[]
|
|
|
|
);
|
|
|
|
|
|
|
|
if (!resource) {
|
2021-12-01 07:58:25 +00:00
|
|
|
return <KeycloakSpinner />;
|
2021-11-17 08:27:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return (
|
|
|
|
<PageSection variant="light">
|
|
|
|
<FormAccess role="manage-clients" isHorizontal>
|
|
|
|
<FormGroup
|
|
|
|
label={t("import")}
|
|
|
|
fieldId="import"
|
|
|
|
labelIcon={
|
|
|
|
<HelpItem
|
|
|
|
helpText="clients-help:import"
|
|
|
|
forLabel={t("import")}
|
|
|
|
forID={t(`common:helpLabel`, { label: t("import") })}
|
|
|
|
/>
|
|
|
|
}
|
|
|
|
>
|
|
|
|
<Button variant="secondary">{t("import")}</Button>
|
|
|
|
</FormGroup>
|
|
|
|
<Divider />
|
|
|
|
<FormGroup
|
|
|
|
label={t("policyEnforcementMode")}
|
|
|
|
labelIcon={
|
|
|
|
<HelpItem
|
|
|
|
helpText="clients-help:policyEnforcementMode"
|
|
|
|
forLabel={t("policyEnforcementMode")}
|
|
|
|
forID="policyEnforcementMode"
|
|
|
|
/>
|
|
|
|
}
|
|
|
|
fieldId="policyEnforcementMode"
|
|
|
|
hasNoPaddingTop
|
|
|
|
>
|
|
|
|
<Controller
|
|
|
|
name="policyEnforcementMode"
|
|
|
|
data-testid="policyEnforcementMode"
|
|
|
|
defaultValue={DECISION_STRATEGY[0]}
|
|
|
|
control={control}
|
|
|
|
render={({ onChange, value }) => (
|
|
|
|
<>
|
|
|
|
{POLICY_ENFORCEMENT_MODES.map((mode) => (
|
|
|
|
<Radio
|
|
|
|
id={mode}
|
|
|
|
key={mode}
|
|
|
|
data-testid={mode}
|
|
|
|
isChecked={value === mode}
|
|
|
|
name="policyEnforcementMode"
|
|
|
|
onChange={() => onChange(mode)}
|
|
|
|
label={t(`policyEnforcementModes.${mode}`)}
|
|
|
|
className="pf-u-mb-md"
|
|
|
|
/>
|
|
|
|
))}
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
/>
|
|
|
|
</FormGroup>
|
|
|
|
<FormGroup
|
|
|
|
label={t("decisionStrategy")}
|
|
|
|
labelIcon={
|
|
|
|
<HelpItem
|
|
|
|
helpText="clients-help:decisionStrategy"
|
|
|
|
forLabel={t("decisionStrategy")}
|
|
|
|
forID="decisionStrategy"
|
|
|
|
/>
|
|
|
|
}
|
|
|
|
fieldId="decisionStrategy"
|
|
|
|
hasNoPaddingTop
|
|
|
|
>
|
|
|
|
<Controller
|
|
|
|
name="decisionStrategy"
|
|
|
|
data-testid="decisionStrategy"
|
|
|
|
defaultValue={DECISION_STRATEGY[0]}
|
|
|
|
control={control}
|
|
|
|
render={({ onChange, value }) => (
|
|
|
|
<>
|
|
|
|
{DECISION_STRATEGY.map((strategy) => (
|
|
|
|
<Radio
|
|
|
|
id={strategy}
|
|
|
|
key={strategy}
|
|
|
|
data-testid={strategy}
|
|
|
|
isChecked={value === strategy}
|
|
|
|
name="decisionStrategy"
|
|
|
|
onChange={() => onChange(strategy)}
|
|
|
|
label={t(`decisionStrategies.${strategy}`)}
|
|
|
|
className="pf-u-mb-md"
|
|
|
|
/>
|
|
|
|
))}
|
|
|
|
</>
|
|
|
|
)}
|
|
|
|
/>
|
|
|
|
</FormGroup>
|
|
|
|
<FormGroup
|
|
|
|
hasNoPaddingTop
|
|
|
|
label={t("allowRemoteResourceManagement")}
|
|
|
|
fieldId="allowRemoteResourceManagement"
|
|
|
|
labelIcon={
|
|
|
|
<HelpItem
|
|
|
|
helpText={t("allowRemoteResourceManagement")}
|
|
|
|
forLabel={t("allowRemoteResourceManagement")}
|
|
|
|
forID={"allowRemoteResourceManagement"}
|
|
|
|
/>
|
|
|
|
}
|
|
|
|
>
|
|
|
|
<Controller
|
|
|
|
name="allowRemoteResourceManagement"
|
|
|
|
data-testid="allowRemoteResourceManagement"
|
|
|
|
defaultValue={false}
|
|
|
|
control={control}
|
|
|
|
render={({ onChange, value }) => (
|
|
|
|
<Switch
|
|
|
|
id="allowRemoteResourceManagement"
|
|
|
|
label={t("common:on")}
|
|
|
|
labelOff={t("common:off")}
|
|
|
|
isChecked={value}
|
|
|
|
onChange={onChange}
|
|
|
|
/>
|
|
|
|
)}
|
|
|
|
/>
|
|
|
|
</FormGroup>
|
|
|
|
<SaveReset
|
|
|
|
name="settings"
|
|
|
|
save={(): void => {
|
|
|
|
// another PR
|
|
|
|
}}
|
|
|
|
reset={() => reset(resource)}
|
|
|
|
/>
|
|
|
|
</FormAccess>
|
|
|
|
</PageSection>
|
|
|
|
);
|
|
|
|
};
|