Added missing fields (#2047)

This commit is contained in:
Erik Jan de Wit 2022-02-22 12:22:29 +01:00 committed by GitHub
parent 816d2b5221
commit 27ed3e40fe
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 112 additions and 11 deletions

View file

@ -10,6 +10,7 @@ import {
Select, Select,
SelectVariant, SelectVariant,
SelectOption, SelectOption,
ValidatedOptions,
} from "@patternfly/react-core"; } from "@patternfly/react-core";
import { Controller, useFormContext } from "react-hook-form"; import { Controller, useFormContext } from "react-hook-form";
@ -36,7 +37,7 @@ export const ClientSettings = ({
save, save,
reset, reset,
}: ClientSettingsProps) => { }: ClientSettingsProps) => {
const { register, control, watch } = useFormContext<ClientForm>(); const { register, control, watch, errors } = useFormContext<ClientForm>();
const { t } = useTranslation("clients"); const { t } = useTranslation("clients");
const [loginThemeOpen, setLoginThemeOpen] = useState(false); const [loginThemeOpen, setLoginThemeOpen] = useState(false);
@ -58,7 +59,7 @@ export const ClientSettings = ({
return [...result, "accessSettings"]; return [...result, "accessSettings"];
} }
return [...result, "accessSettings", "loginSettings"]; return [...result, "accessSettings", "loginSettings", "logoutSettings"];
}, [protocol, client]); }, [protocol, client]);
return ( return (
@ -200,20 +201,18 @@ export const ClientSettings = ({
aria-label={t("loginTheme")} aria-label={t("loginTheme")}
isOpen={loginThemeOpen} isOpen={loginThemeOpen}
> >
<SelectOption key="empty" value=""> {[
{t("common:choose")} <SelectOption key="empty" value="">
</SelectOption> {t("common:choose")}
{/* The type for the children of Select are incorrect, so we need a fragment here. */} </SelectOption>,
{/* eslint-disable-next-line react/jsx-no-useless-fragment */} ...loginThemes.map((theme) => (
<>
{loginThemes.map((theme) => (
<SelectOption <SelectOption
selected={theme.name === value} selected={theme.name === value}
key={theme.name} key={theme.name}
value={theme.name} value={theme.name}
/> />
))} )),
</> ]}
</Select> </Select>
)} )}
/> />
@ -288,6 +287,96 @@ export const ClientSettings = ({
isDisabled={!(consentRequired && displayOnConsentScreen === "true")} isDisabled={!(consentRequired && displayOnConsentScreen === "true")}
/> />
</FormGroup> </FormGroup>
</FormAccess>
<FormAccess isHorizontal role="manage-clients">
<FormGroup
label={t("backchannelLogoutUrl")}
fieldId="backchannelLogoutUrl"
labelIcon={
<HelpItem
helpText="clients-help:backchannelLogoutUrl"
fieldLabelId="clients:backchannelLogoutUrl"
/>
}
helperTextInvalid={
errors.attributes?.backchannel?.logout?.url?.message
}
validated={
errors.attributes?.backchannel?.logout?.url?.message
? ValidatedOptions.error
: ValidatedOptions.default
}
>
<TextInput
type="text"
id="backchannelLogoutUrl"
name="attributes.backchannel.logout.url"
ref={register({
validate: (uri) =>
((uri.startsWith("https://") || uri.startsWith("http://")) &&
uri.indexOf("*") === -1) ||
uri === "" ||
t("backchannelUrlInvalid").toString(),
})}
validated={
errors.attributes?.backchannel?.logout?.url?.message
? ValidatedOptions.error
: ValidatedOptions.default
}
/>
</FormGroup>
<FormGroup
label={t("backchannelLogoutSessionRequired")}
labelIcon={
<HelpItem
helpText="clients-help:backchannelLogoutSessionRequired"
fieldLabelId="clients:backchannelLogoutSessionRequired"
/>
}
fieldId="backchannelLogoutSessionRequired"
hasNoPaddingTop
>
<Controller
name="attributes.backchannel.logout.session.required"
defaultValue="true"
control={control}
render={({ onChange, value }) => (
<Switch
id="backchannelLogoutSessionRequired"
label={t("common:on")}
labelOff={t("common:off")}
isChecked={value === "true"}
onChange={(value) => onChange(value.toString())}
/>
)}
/>
</FormGroup>
<FormGroup
label={t("backchannelLogoutRevokeOfflineSessions")}
labelIcon={
<HelpItem
helpText="clients-help:backchannelLogoutRevokeOfflineSessions"
fieldLabelId="clients:backchannelLogoutRevokeOfflineSessions"
/>
}
fieldId="backchannelLogoutRevokeOfflineSessions"
hasNoPaddingTop
>
<Controller
name="attributes.backchannel.logout.revoke.offline.tokens"
defaultValue="false"
control={control}
render={({ onChange, value }) => (
<Switch
id="backchannelLogoutRevokeOfflineSessions"
label={t("common:on")}
labelOff={t("common:off")}
isChecked={value === "true"}
onChange={(value) => onChange(value.toString())}
/>
)}
/>
</FormGroup>
<SaveReset <SaveReset
className="keycloak__form_actions" className="keycloak__form_actions"
name="settings" name="settings"

View file

@ -164,6 +164,12 @@ export default {
"SAML ARTIFACT Binding URL for the client's single logout service. You can leave this blank if you are using a different binding.", "SAML ARTIFACT Binding URL for the client's single logout service. You can leave this blank if you are using a different binding.",
artifactBindingUrl: artifactBindingUrl:
"URL to send the HTTP ARTIFACT messages to. You can leave this blank if you are using a different binding. This value should be set when forcing ARTIFACT binding together with IdP initiated login.", "URL to send the HTTP ARTIFACT messages to. You can leave this blank if you are using a different binding. This value should be set when forcing ARTIFACT binding together with IdP initiated login.",
backchannelLogoutUrl:
"URL that will cause the client to log itself out when a logout request is sent to this realm (via end_session_endpoint). If omitted, no logout request will be sent to the client is this case.",
backchannelLogoutSessionRequired:
"Specifying whether a sid (session ID) Claim is included in the Logout Token when the Backchannel Logout URL is used.",
backchannelLogoutRevokeOfflineSessions:
'Specifying whether a "revoke_offline_access" event is included in the Logout Token when the Backchannel Logout URL is used. Keycloak will revoke offline sessions when receiving a Logout Token with this event.',
artifactResolutionService: artifactResolutionService:
"SAML Artifact resolution service for the client. This is the endpoint to which Keycloak will send a SOAP ArtifactResolve message. You can leave this blank if you do not have a URL for this binding.", "SAML Artifact resolution service for the client. This is the endpoint to which Keycloak will send a SOAP ArtifactResolve message. You can leave this blank if you do not have a URL for this binding.",
authenticationOverrides: "Override realm authentication flow bindings.", authenticationOverrides: "Override realm authentication flow bindings.",

View file

@ -348,6 +348,12 @@ export default {
displayOnClient: "Display client on screen", displayOnClient: "Display client on screen",
consentScreenText: "Client consent screen text", consentScreenText: "Client consent screen text",
loginSettings: "Login settings", loginSettings: "Login settings",
logoutSettings: "Logout settings",
backchannelLogoutUrl: "Backchannel logout URL",
backchannelUrlInvalid: "Backchannel logout URL is not a valid URL",
backchannelLogoutSessionRequired: "Backchannel logout session required",
backchannelLogoutRevokeOfflineSessions:
"Backchannel logout revoke offline sessions",
accessSettings: "Access settings", accessSettings: "Access settings",
rootUrl: "Root URL", rootUrl: "Root URL",
validRedirectUri: "Valid redirect URIs", validRedirectUri: "Valid redirect URIs",