Added missing fields (#2047)
This commit is contained in:
parent
816d2b5221
commit
27ed3e40fe
3 changed files with 112 additions and 11 deletions
|
@ -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"
|
||||||
|
|
|
@ -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.",
|
||||||
|
|
|
@ -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",
|
||||||
|
|
Loading…
Reference in a new issue