Realm settings: Sessions tab (#807)

This commit is contained in:
Jenny 2021-07-15 10:25:22 -04:00 committed by GitHub
parent 589ae8e28d
commit 6d8db5d533
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 1388 additions and 20 deletions

View file

@ -82,7 +82,6 @@ describe("Realm settings", () => {
realmSettingsPage.toggleSwitch(realmSettingsPage.userRegSwitch);
realmSettingsPage.toggleSwitch(realmSettingsPage.forgotPwdSwitch);
realmSettingsPage.toggleSwitch(realmSettingsPage.rememberMeSwitch);
realmSettingsPage.toggleSwitch(realmSettingsPage.verifyEmailSwitch);
});
it("Go to email tab", () => {
@ -233,6 +232,56 @@ describe("Realm settings", () => {
cy.getId("headers-form-tab-save").should("be.disabled");
cy.get("#xFrameOptions").clear().type("DENY");
cy.getId("headers-form-tab-save").should("be.enabled").click();
masthead.checkNotificationMessage("Realm successfully updated");
});
it("add session data", () => {
sidebarPage.goToRealmSettings();
cy.wait(500);
cy.getId("rs-sessions-tab").click();
realmSettingsPage.populateSessionsPage();
realmSettingsPage.save("sessions-tab-save");
masthead.checkNotificationMessage("Realm successfully updated");
});
it("check that sessions data was saved", () => {
sidebarPage.goToAuthentication();
sidebarPage.goToRealmSettings();
cy.wait(500);
cy.getId("rs-sessions-tab").click();
cy.getId(realmSettingsPage.ssoSessionIdleInput).should("have.value", 1);
cy.getId(realmSettingsPage.ssoSessionMaxInput).should("have.value", 2);
cy.getId(realmSettingsPage.ssoSessionIdleRememberMeInput).should(
"have.value",
3
);
cy.getId(realmSettingsPage.ssoSessionMaxRememberMeInput).should(
"have.value",
4
);
cy.getId(realmSettingsPage.clientSessionIdleInput).should("have.value", 5);
cy.getId(realmSettingsPage.clientSessionMaxInput).should("have.value", 6);
cy.getId(realmSettingsPage.offlineSessionIdleInput).should("have.value", 7);
cy.getId(realmSettingsPage.offlineSessionMaxSwitch).should(
"have.value",
"on"
);
cy.getId(realmSettingsPage.loginTimeoutInput).should("have.value", 9);
cy.getId(realmSettingsPage.loginActionTimeoutInput).should(
"have.value",
10
);
});
});

View file

@ -12,8 +12,40 @@ export default class RealmSettingsPage {
selectEmailTheme = "#kc-email-theme";
emailThemeList = "#kc-email-theme + ul";
hostInput = "#kc-host";
ssoSessionIdleSelectMenu = "#kc-sso-session-idle-select-menu";
ssoSessionIdleSelectMenuList = "#kc-sso-session-idle-select-menu > div > ul";
ssoSessionMaxSelectMenu = "#kc-sso-session-max-select-menu";
ssoSessionMaxSelectMenuList = "#kc-sso-session-max-select-menu > div > ul";
ssoSessionMaxRememberMeSelectMenu =
"#kc-sso-session-max-remember-me-select-menu";
ssoSessionMaxRememberMeSelectMenuList =
"#kc-sso-session-max-remember-me-select-menu > div > ul";
ssoSessionIdleRememberMeSelectMenu =
"#kc-sso-session-idle-remember-me-select-menu";
ssoSessionIdleRememberMeSelectMenuList =
"#kc-sso-session-idle-remember-me-select-menu > div > ul";
clientSessionIdleSelectMenu = "#kc-client-session-idle-select-menu";
clientSessionIdleSelectMenuList =
"#kc-client-session-idle-select-menu > div > ul";
clientSessionMaxSelectMenu = "#kc-client-session-max-select-menu";
clientSessionMaxSelectMenuList =
"#kc-client-session-max-select-menu > div > ul";
offlineSessionIdleSelectMenu = "#kc-offline-session-idle-select-menu";
loginTimeoutSelectMenu = "#kc-login-timeout-select-menu";
loginTimeoutSelectMenuList = "#kc-login-timeout-select-menu > div > ul";
loginActionTimeoutSelectMenu = "#kc-login-action-timeout-select-menu";
loginActionTimeoutSelectMenuList =
"#kc-login-action-timeout-select-menu > div > ul";
selectDefaultLocale = "select-default-locale";
defaultLocaleList = "select-default-locale + ul";
defaultLocaleList = "select-default-locale > div > ul";
emailSaveBtn = "email-tab-save";
managedAccessSwitch = "user-managed-access-switch";
userRegSwitch = "user-reg-switch";
@ -45,6 +77,16 @@ export default class RealmSettingsPage {
valueInput = "value-input";
deleteAction = "delete-action";
modalConfirm = "modalConfirm";
ssoSessionIdleInput = "sso-session-idle-input";
ssoSessionMaxInput = "sso-session-max-input";
ssoSessionIdleRememberMeInput = "sso-session-idle-remember-me-input";
ssoSessionMaxRememberMeInput = "sso-session-max-remember-me-input";
clientSessionIdleInput = "client-session-idle-input";
clientSessionMaxInput = "client-session-max-input";
offlineSessionIdleInput = "offline-session-idle-input";
offlineSessionMaxSwitch = "offline-session-max-switch";
loginTimeoutInput = "login-timeout-input";
loginActionTimeoutInput = "login-action-timeout-input";
selectLoginThemeType(themeType: string) {
cy.get(this.selectLoginTheme).click();
@ -192,6 +234,86 @@ export default class RealmSettingsPage {
return this;
}
changeTimeUnit(
unit: "Minutes" | "Hours" | "Days",
inputType: string,
listType: string
) {
switch (unit) {
case "Minutes":
cy.get(inputType).click();
cy.get(listType).contains(unit).click();
break;
case "Hours":
cy.get(inputType).click();
cy.get(listType).contains(unit).click();
break;
case "Days":
cy.get(inputType).click();
cy.get(listType).contains(unit).click();
break;
default:
throw "Invalid unit, must be 'minutes', 'hours', or 'days'.";
}
return this;
}
populateSessionsPage() {
cy.getId(this.ssoSessionIdleInput).clear().type("1");
this.changeTimeUnit(
"Minutes",
this.ssoSessionIdleSelectMenu,
this.ssoSessionIdleSelectMenuList
);
cy.getId(this.ssoSessionMaxInput).clear().type("2");
this.changeTimeUnit(
"Hours",
this.ssoSessionMaxSelectMenu,
this.ssoSessionMaxSelectMenuList
);
cy.getId(this.ssoSessionIdleRememberMeInput).clear().type("3");
this.changeTimeUnit(
"Days",
this.ssoSessionIdleRememberMeSelectMenu,
this.ssoSessionIdleRememberMeSelectMenuList
);
cy.getId(this.ssoSessionMaxRememberMeInput).clear().type("4");
this.changeTimeUnit(
"Minutes",
this.ssoSessionMaxRememberMeSelectMenu,
this.ssoSessionMaxRememberMeSelectMenuList
);
cy.getId(this.clientSessionIdleInput).clear().type("5");
this.changeTimeUnit(
"Hours",
this.clientSessionIdleSelectMenu,
this.clientSessionIdleSelectMenuList
);
cy.getId(this.clientSessionMaxInput).clear().type("6");
this.changeTimeUnit(
"Days",
this.clientSessionMaxSelectMenu,
this.clientSessionMaxSelectMenuList
);
cy.getId(this.offlineSessionIdleInput).clear().type("7");
this.toggleSwitch(this.offlineSessionMaxSwitch);
cy.getId(this.loginTimeoutInput).clear().type("9");
this.changeTimeUnit(
"Minutes",
this.loginTimeoutSelectMenu,
this.loginTimeoutSelectMenuList
);
cy.getId(this.loginActionTimeoutInput).clear().type("10");
this.changeTimeUnit(
"Days",
this.loginActionTimeoutSelectMenu,
this.loginActionTimeoutSelectMenuList
);
}
checkUserEvents(events: string[]) {
cy.get(this.eventTypeColumn).should((event) => {
for (const user of events) {

View file

@ -10,21 +10,12 @@
margin-bottom: 52px;
}
input[type='checkbox'] {
input[type="checkbox"] {
height: 20px;
width: 20px;
vertical-align: baseline;
}
label.pf-c-form__label {
display: inline-flex;
}
.pf-c-form__group-label {
display: flex;
align-items: end;
}
.pf-c-select__toggle:before {
border-top: var(--pf-c-select__toggle--before--BorderTopWidth) solid
var(--pf-c-select__toggle--before--BorderTopColor);
@ -52,7 +43,7 @@ label.pf-c-form__label {
cursor: pointer;
}
td.pf-c-table__check > input[type='checkbox'] {
td.pf-c-table__check > input[type="checkbox"] {
vertical-align: text-bottom;
}
@ -64,3 +55,7 @@ td.pf-c-table__check > input[type='checkbox'] {
.pf-c-pagination.pf-m-bottom.pf-m-compact {
padding: 0px;
}
.kc-time-select-dropdown {
min-width: 170px;
}

View file

@ -16,12 +16,14 @@ export type TimeSelectorProps = TextInputProps & {
value: number;
units?: Unit[];
onChange: (time: number | string) => void;
className?: string;
};
export const TimeSelector = ({
value,
units = ["seconds", "minutes", "hours", "days"],
onChange,
className,
...rest
}: TimeSelectorProps) => {
const { t } = useTranslation("common");
@ -75,7 +77,7 @@ export const TimeSelector = ({
};
return (
<Split hasGutter>
<Split hasGutter className={className}>
<SplitItem>
<TextInput
{...rest}
@ -84,15 +86,17 @@ export const TimeSelector = ({
aria-label="kc-time"
min="0"
value={timeValue}
className={`${className}-input`}
onChange={(value) => {
updateTimeout("" === value ? value : parseInt(value));
}}
/>
</SplitItem>
<SplitItem>
<SplitItem id={`${className}-select-menu`}>
<Select
variant={SelectVariant.single}
aria-label={t("unitLabel")}
className={`${className}-select`}
onSelect={(_, value) => {
setMultiplier(value as number);
updateTimeout(timeValue, value as number);
@ -105,7 +109,11 @@ export const TimeSelector = ({
isOpen={open}
>
{times.map((time) => (
<SelectOption key={time.label} value={time.multiplier}>
<SelectOption
id={time.label}
key={time.label}
value={time.multiplier}
>
{time.label}
</SelectOption>
))}

View file

@ -2,7 +2,11 @@
.pf-c-card.pf-m-flat.kc-email-settings,
.pf-c-card.pf-m-flat.kc-email-template,
.pf-c-card.pf-m-flat.kc-email-connection,
.pf-c-card.pf-m-flat.kc-message-bundles {
.pf-c-card.pf-m-flat.kc-message-bundles,
.pf-c-card.pf-m-flat.kc-sso-session-template,
.pf-c-card.pf-m-flat.kc-client-session-template,
.pf-c-card.pf-m-flat.kc-offline-session-template,
.pf-c-card.pf-m-flat.kc-login-settings-template {
border: none;
margin-top: 0px;
margin-bottom: 0px;
@ -73,9 +77,13 @@ button.pf-c-button.pf-m-link.add-provider {
padding-left: var(--pf-c-toolbar__content--PaddingLeft);
}
.pf-c-form__group-label {
display: flex;
align-items: start;
div#login-action-timeout-label > .pf-c-form__group-label,
div#offline-session-max-label > .pf-c-form__group-label {
width: 90%;
}
div#offline-session-max-label > .pf-c-form__group-label {
width: 85%;
}
.add-provider-modal > div.pf-c-modal-box__body {
@ -101,3 +109,51 @@ button.pf-c-button.pf-m-link.add-provider {
.pf-c-content.kc-provide-email-text {
padding-bottom: var(--pf-global--spacer--md);
}
.kc-sso-session-idle-input,
.kc-sso-session-max-input,
.kc-sso-session-max-input,
.kc-sso-session-idle-remember-me-input,
.kc-sso-session-max-remember-me-input,
.kc-offline-session-idle-input,
.kc-offline-session-max-input,
.kc-client-session-idle-input,
.kc-client-session-max-input,
.kc-login-timeout-input,
.kc-login-action-timeout-input {
width: 170px;
margin-right: 12px;
}
.kc-sso-session-idle-select,
.kc-sso-session-max-select,
.kc-sso-session-idle-remember-me-select,
.kc-sso-session-max-remember-me-select,
.kc-client-session-idle-select,
.kc-client-session-max-select,
.kc-offline-session-idle-select,
.kc-offline-session-max-select,
.kc-login-action-timeout-select,
.kc-sso-session-idle-select.pf-m-expanded,
.kc-sso-session-max-select.pf-m-expanded {
width: 170px;
}
article.pf-c-card.pf-m-flat.kc-sso-session-template
> .pf-c-card__header.kc-form-panel__header,
article.pf-c-card.pf-m-flat.kc-sso-session-template
> .pf-c-card__body.kc-form-panel__body,
article.pf-c-card.pf-m-flat.kc-client-session-template
> .pf-c-card__header.kc-form-panel__header,
article.pf-c-card.pf-m-flat.kc-client-session-template
> .pf-c-card__body.kc-form-panel__body,
article.pf-c-card.pf-m-flat.kc-offline-session-template
> .pf-c-card__header.kc-form-panel__header,
article.pf-c-card.pf-m-flat.kc-offline-session-template
> .pf-c-card__body.kc-form-panel__body,
article.pf-c-card.pf-m-flat.kc-login-settings-template
> .pf-c-card__header.kc-form-panel__header,
article.pf-c-card.pf-m-flat.kc-login-settings-template
> .pf-c-card__body.kc-form-panel__body {
padding: 0px;
}

View file

@ -35,6 +35,7 @@ import { LocalizationTab } from "./LocalizationTab";
import { WhoAmIContext } from "../context/whoami/WhoAmI";
import type UserRepresentation from "keycloak-admin/lib/defs/userRepresentation";
import { SecurityDefences } from "./security-defences/SecurityDefences";
import { RealmSettingsSessionsTab } from "./SessionsTab";
type RealmSettingsHeaderProps = {
onChange: (value: boolean) => void;
@ -209,6 +210,7 @@ export const RealmSettingsSection = () => {
eventKey="general"
title={<TabTitleText>{t("general")}</TabTitleText>}
data-testid="rs-general-tab"
aria-label="general-tab"
>
<RealmSettingsGeneralTab
save={save}
@ -219,6 +221,7 @@ export const RealmSettingsSection = () => {
eventKey="login"
title={<TabTitleText>{t("login")}</TabTitleText>}
data-testid="rs-login-tab"
aria-label="login-tab"
>
<RealmSettingsLoginTab save={save} realm={realm!} />
</Tab>
@ -226,6 +229,7 @@ export const RealmSettingsSection = () => {
eventKey="email"
title={<TabTitleText>{t("email")}</TabTitleText>}
data-testid="rs-email-tab"
aria-label="email-tab"
>
{realm && (
<RealmSettingsEmailTab user={currentUser!} realm={realm} />
@ -235,6 +239,7 @@ export const RealmSettingsSection = () => {
eventKey="themes"
title={<TabTitleText>{t("themes")}</TabTitleText>}
data-testid="rs-themes-tab"
aria-label="themes-tab"
>
<RealmSettingsThemesTab
save={save}
@ -246,6 +251,7 @@ export const RealmSettingsSection = () => {
eventKey="keys"
title={<TabTitleText>{t("realm-settings:keys")}</TabTitleText>}
data-testid="rs-keys-tab"
aria-label="keys-tab"
>
{realmComponents && (
<Tabs
@ -256,6 +262,7 @@ export const RealmSettingsSection = () => {
id="keysList"
eventKey={0}
data-testid="rs-keys-list-tab"
aria-label="keys-list-subtab"
title={<TabTitleText>{t("keysList")}</TabTitleText>}
>
<KeysListTab realmComponents={realmComponents} />
@ -263,6 +270,7 @@ export const RealmSettingsSection = () => {
<Tab
id="providers"
data-testid="rs-providers-tab"
aria-label="rs-providers-tab"
eventKey={1}
title={<TabTitleText>{t("providers")}</TabTitleText>}
>
@ -279,6 +287,7 @@ export const RealmSettingsSection = () => {
eventKey="events"
title={<TabTitleText>{t("events")}</TabTitleText>}
data-testid="rs-realm-events-tab"
aria-label="realm-events-tab"
>
<EventsTab />
</Tab>
@ -308,6 +317,17 @@ export const RealmSettingsSection = () => {
<SecurityDefences save={save} reset={() => resetForm(realm)} />
)}
</Tab>
<Tab
id="sessions"
eventKey="sessions"
data-testid="rs-sessions-tab"
aria-label="sessions-tab"
title={
<TabTitleText>{t("realm-settings:sessions")}</TabTitleText>
}
>
<RealmSettingsSessionsTab key={key} realm={realm} />
</Tab>
</KeycloakTabs>
</FormProvider>
</PageSection>

View file

@ -0,0 +1,461 @@
import React, { useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { Controller, useForm, useWatch } from "react-hook-form";
import {
ActionGroup,
AlertVariant,
Button,
FormGroup,
PageSection,
Switch,
} from "@patternfly/react-core";
import type RealmRepresentation from "keycloak-admin/lib/defs/realmRepresentation";
import { FormAccess } from "../components/form-access/FormAccess";
import { HelpItem } from "../components/help-enabler/HelpItem";
import { FormPanel } from "../components/scroll-form/FormPanel";
import { useAdminClient } from "../context/auth/AdminClient";
import { useAlerts } from "../components/alert/Alerts";
import { useRealm } from "../context/realm-context/RealmContext";
import "./RealmSettingsSection.css";
import type UserRepresentation from "keycloak-admin/lib/defs/userRepresentation";
import { TimeSelector } from "../components/time-selector/TimeSelector";
type RealmSettingsSessionsTabProps = {
realm?: RealmRepresentation;
user?: UserRepresentation;
};
export const RealmSettingsSessionsTab = ({
realm: initialRealm,
}: RealmSettingsSessionsTabProps) => {
const { t } = useTranslation("realm-settings");
const adminClient = useAdminClient();
const { realm: realmName } = useRealm();
const { addAlert } = useAlerts();
const [realm, setRealm] = useState(initialRealm);
const {
control,
handleSubmit,
reset: resetForm,
formState,
} = useForm<RealmRepresentation>();
const offlineSessionMaxEnabled = useWatch({
control,
name: "offlineSessionMaxLifespanEnabled",
defaultValue: realm?.offlineSessionMaxLifespanEnabled,
});
useEffect(() => resetForm(realm), [realm]);
const save = async (form: RealmRepresentation) => {
try {
const savedRealm = { ...realm, ...form };
await adminClient.realms.update({ realm: realmName }, savedRealm);
setRealm(savedRealm);
addAlert(t("saveSuccess"), AlertVariant.success);
} catch (error) {
addAlert(
t("saveError", { error: error.response?.data?.errorMessage || error }),
AlertVariant.danger
);
}
};
const reset = () => {
if (realm) {
resetForm(realm);
}
};
return (
<>
<PageSection variant="light">
<FormPanel
title={t("realm-settings:SSOSessionSettings")}
className="kc-sso-session-template"
>
<FormAccess
isHorizontal
role="manage-realm"
onSubmit={handleSubmit(save)}
>
<FormGroup
label={t("SSOSessionIdle")}
fieldId="SSOSessionIdle"
labelIcon={
<HelpItem
helpText="realm-settings-help:ssoSessionIdle"
forLabel={t("SSOSessionIdle")}
forID="SSOSessionIdle"
id="SSOSessionIdle"
/>
}
>
<Controller
name="ssoSessionIdleTimeout"
defaultValue={realm?.ssoSessionIdleTimeout}
control={control}
render={({ onChange, value }) => (
<TimeSelector
className="kc-sso-session-idle"
data-testid="sso-session-idle-input"
aria-label="sso-session-idle-input"
value={value}
onChange={onChange}
units={["minutes", "hours", "days"]}
/>
)}
/>
</FormGroup>
<FormGroup
label={t("SSOSessionMax")}
fieldId="SSOSessionMax"
labelIcon={
<HelpItem
helpText="realm-settings-help:ssoSessionMax"
forLabel={t("SSOSessionMax")}
forID="SSOSessionMax"
id="SSOSessionMax"
/>
}
>
<Controller
name="ssoSessionMaxLifespan"
defaultValue=""
control={control}
render={({ onChange, value }) => (
<TimeSelector
className="kc-sso-session-max"
data-testid="sso-session-max-input"
aria-label="sso-session-max-input"
value={value}
onChange={onChange}
units={["minutes", "hours", "days"]}
/>
)}
/>
</FormGroup>
<FormGroup
label={t("SSOSessionIdleRememberMe")}
fieldId="SSOSessionIdleRememberMe"
labelIcon={
<HelpItem
helpText="realm-settings-help:ssoSessionIdleRememberMe"
forLabel={t("SSOSessionIdleRememberMe")}
forID="SSOSessionIdleRememberMe"
id="SSOSessionIdleRememberMe"
/>
}
>
<Controller
name="ssoSessionIdleTimeoutRememberMe"
defaultValue=""
control={control}
render={({ onChange, value }) => (
<TimeSelector
className="kc-sso-session-idle-remember-me"
data-testid="sso-session-idle-remember-me-input"
aria-label="sso-session-idle-remember-me-input"
value={value}
onChange={onChange}
units={["minutes", "hours", "days"]}
/>
)}
/>
</FormGroup>
<FormGroup
label={t("SSOSessionMaxRememberMe")}
fieldId="SSOSessionMaxRememberMe"
labelIcon={
<HelpItem
helpText="realm-settings-help:ssoSessionMaxRememberMe"
forLabel={t("SSOSessionMaxRememberMe")}
forID="SSOSessionMaxRememberMe"
id="SSOSessionMaxRememberMe"
/>
}
>
<Controller
name="ssoSessionMaxLifespanRememberMe"
defaultValue=""
control={control}
render={({ onChange, value }) => (
<TimeSelector
className="kc-sso-session-max-remember-me"
aria-label="sso-session-max-remember-me-input"
data-testid="sso-session-max-remember-me-input"
value={value}
onChange={onChange}
units={["minutes", "hours", "days"]}
/>
)}
/>
</FormGroup>
</FormAccess>
</FormPanel>
<FormPanel
title={t("realm-settings:clientSessionSettings")}
className="kc-client-session-template"
>
<FormAccess
isHorizontal
role="manage-realm"
className="pf-u-mt-lg"
onSubmit={handleSubmit(save)}
>
<FormGroup
label={t("clientSessionIdle")}
fieldId="clientSessionIdle"
labelIcon={
<HelpItem
helpText="realm-settings-help:clientSessionIdle"
forLabel={t("clientSessionIdle")}
forID="clientSessionIdle"
id="clientSessionIdle"
/>
}
>
<Controller
name="clientSessionIdleTimeout"
defaultValue=""
control={control}
render={({ onChange, value }) => (
<TimeSelector
className="kc-client-session-idle"
data-testid="client-session-idle-input"
aria-label="client-session-idle-input"
value={value}
onChange={onChange}
units={["minutes", "hours", "days"]}
/>
)}
/>
</FormGroup>
<FormGroup
label={t("clientSessionMax")}
fieldId="clientSessionMax"
labelIcon={
<HelpItem
helpText="realm-settings-help:clientSessionMax"
forLabel={t("clientSessionMax")}
forID="clientSessionMax"
id="clientSessionMax"
/>
}
>
<Controller
name="clientSessionMaxLifespan"
defaultValue=""
control={control}
render={({ onChange, value }) => (
<TimeSelector
className="kc-client-session-max"
data-testid="client-session-max-input"
aria-label="client-session-max-input"
value={value}
onChange={onChange}
units={["minutes", "hours", "days"]}
/>
)}
/>
</FormGroup>
</FormAccess>
</FormPanel>
<FormPanel
title={t("realm-settings:offlineSessionSettings")}
className="kc-offline-session-template"
>
<FormAccess
isHorizontal
role="manage-realm"
className="pf-u-mt-lg"
onSubmit={handleSubmit(save)}
>
<FormGroup
label={t("offlineSessionIdle")}
fieldId="offlineSessionIdle"
labelIcon={
<HelpItem
helpText="realm-settings-help:offlineSessionIdle"
forLabel={t("offlineSessionIdle")}
forID="offlineSessionIdle"
id="offlineSessionIdle"
/>
}
>
<Controller
name="offlineSessionIdleTimeout"
defaultValue=""
control={control}
render={({ onChange, value }) => (
<TimeSelector
className="kc-offline-session-idle"
data-testid="offline-session-idle-input"
aria-label="offline-session-idle-input"
value={value}
onChange={onChange}
units={["minutes", "hours", "days"]}
/>
)}
/>
</FormGroup>
<FormGroup
hasNoPaddingTop
label={t("offlineSessionMaxLimited")}
fieldId="kc-offlineSessionMaxLimited"
labelIcon={
<HelpItem
helpText="realm-settings-help:offlineSessionMaxLimited"
forLabel={t("offlineSessionMaxLimited")}
forID="offlineSessionMaxLimited"
id="offlineSessionMaxLimited"
/>
}
>
<Controller
name="offlineSessionMaxLifespanEnabled"
control={control}
defaultValue={false}
render={({ onChange, value }) => (
<Switch
id="kc-offline-session-max"
data-testid="offline-session-max-switch"
aria-label="offline-session-max-switch"
label={t("common:enabled")}
labelOff={t("common:disabled")}
isChecked={value}
onChange={onChange}
/>
)}
/>
</FormGroup>
{offlineSessionMaxEnabled && (
<FormGroup
label={t("offlineSessionMax")}
fieldId="offlineSessionMax"
id="offline-session-max-label"
labelIcon={
<HelpItem
helpText="realm-settings-help:offlineSessionMax"
forLabel={t("offlineSessionMax")}
forID="offlineSessionMax"
id="offlineSessionMax"
/>
}
>
<Controller
name="offlineSessionMaxLifespan"
defaultValue=""
control={control}
render={({ onChange, value }) => (
<TimeSelector
className="kc-offline-session-max"
data-testid="offline-session-max-input"
aria-label="offline-session-max-input"
value={value}
onChange={onChange}
units={["minutes", "hours", "days"]}
/>
)}
/>
</FormGroup>
)}
</FormAccess>
</FormPanel>
<FormPanel
className="kc-login-settings-template"
title={t("loginSettings")}
>
<FormAccess
isHorizontal
role="manage-realm"
className="pf-u-mt-lg"
onSubmit={handleSubmit(save)}
>
<FormGroup
label={t("loginTimeout")}
id="kc-login-timeout-label"
fieldId="offlineSessionIdle"
labelIcon={
<HelpItem
helpText="realm-settings-help:loginTimeout"
forLabel={t("loginTimeout")}
forID="loginTimeout"
id="loginTimeout"
/>
}
>
<Controller
name="accessCodeLifespanLogin"
defaultValue=""
control={control}
render={({ onChange, value }) => (
<TimeSelector
className="kc-login-timeout"
data-testid="login-timeout-input"
aria-label="login-timeout-input"
value={value}
onChange={onChange}
units={["minutes", "hours", "days"]}
/>
)}
/>
</FormGroup>
<FormGroup
label={t("loginActionTimeout")}
fieldId="loginActionTimeout"
id="login-action-timeout-label"
labelIcon={
<HelpItem
helpText="realm-settings-help:loginActionTimeout"
forLabel={t("loginActionTimeout")}
forID="loginActionTimeout"
id="loginActionTimeout"
/>
}
>
<Controller
name="accessCodeLifespanUserAction"
defaultValue=""
control={control}
render={({ onChange, value }) => (
<TimeSelector
className="kc-login-action-timeout"
data-testid="login-action-timeout-input"
aria-label="login-action-timeout-input"
value={value}
onChange={onChange}
units={["minutes", "hours", "days"]}
/>
)}
/>
</FormGroup>
<ActionGroup>
<Button
variant="primary"
type="submit"
data-testid="sessions-tab-save"
isDisabled={!formState.isDirty}
>
{t("common:save")}
</Button>
<Button variant="link" onClick={reset}>
{t("common:revert")}
</Button>
</ActionGroup>
</FormAccess>
</FormPanel>
</PageSection>
</>
);
};

View file

@ -0,0 +1,61 @@
{
"realm-settings-help": {
"fromDisplayName": "A user-friendly name for the 'From' address (optional).",
"replyToDisplayName": "A user-friendly name for the 'Reply-To' address (optional).",
"envelopeFrom": "An email address used for bounces (optional).",
"password": "SMTP password. This field is able to obtain its value from vault, use ${vault.ID} format.",
"frontendUrl": "Set the frontend URL for the realm. Use in combination with the default hostname provider to override the base URL for frontend requests for a specific realm.",
"requireSsl": "Is HTTPS required? 'None' means HTTPS is not required for any client IP address. 'External requests' means localhost and private IP addresses can access without HTTPS. 'All requests' means HTTPS is required for all IP addresses.",
"userManagedAccess": "If enabled, users are allowed to manage their resources and permissions using the Account Management Console.",
"endpoints": "Shows the configuration of the protocol endpoints",
"loginTheme": "Select theme for login, OTP, grant, registration and forgot password pages.",
"accountTheme": "Select theme for user account management pages.",
"adminConsoleTheme": "Select theme for admin console.",
"emailTheme": "Select theme for emails that are sent by the server.",
"displayName": "Display name of provider when linked in admin console",
"priority": "Priority of the provider",
"enabled": "Set if the keys are enabled",
"active": "Set if the keys can be used for signing",
"AESKeySize": "Size in bytes for the generated AES key. Size 16 is for AES-128, Size 24 for AES-192, and Size 32 for AES-256. WARN: Bigger keys than 128 are not allowed on some JDK implementations.",
"save-user-events": "If enabled, login events are saved to the database, which makes events available to the admin and account management consoles.",
"save-admin-events": "If enabled, admin events are saved to the database, which makes events available to the admin console.",
"expiration": "Sets the expiration for events. Expired events are periodically deleted from the database.",
"admin-clearEvents": "Deletes all admin events in the database.",
"includeRepresentation": "Include JSON representation for create and update requests.",
"user-clearEvents": "Deletes all user events in the database.",
"ellipticCurve": "Elliptic curve used in ECDSA",
"secretSize": "Size in bytes for the generated secret",
"algorithm": "Intended algorithm for the key",
"keystore": "Path to keys file",
"keystorePassword": "Password for the keys",
"keyAlias": "Alias for the private key",
"keyPassword": "Password for the private key",
"privateRSAKey": "Private RSA Key encoded in PEM format",
"x509Certificate": "X509 Certificate encoded in PEM format",
"xFrameOptions": "Default value prevents pages from being included by non-origin iframes <1>Learn more</1>",
"contentSecurityPolicy": "Default value prevents pages from being included by non-origin iframes <1>Learn more</1>",
"contentSecurityPolicyReportOnly": "For testing Content Security Policies <1>Learn more</1>",
"xContentTypeOptions": "Default value prevents Internet Explorer and Google Chrome from MIME-sniffing a response away from the declared content-type <1>Learn more</1>",
"xRobotsTag": "Prevent pages from appearing in search engines <1>Learn more</1>",
"xXSSProtection": "Prevent pages from appearing in search engines <1>Learn more</1>",
"strictTransportSecurity": "The Strict-Transport-Security HTTP header tells browsers to always use HTTPS. Once a browser sees this header, it will only visit the site over HTTPS for the time specified (1 year) at max-age, including the subdomains. <1>Learn more</1>",
"failureFactor": "How many failures before wait is triggered.",
"permanentLockout": "Lock the user permanently when the user exceeds the maximum login failures.",
"waitIncrement": "When failure threshold has been met, how much time should the user be locked out?",
"maxFailureWait": "Max time a user will be locked out.",
"maxDeltaTime": "When will failure count be reset?",
"quickLoginCheckMilliSeconds": "If a failure happens concurrently too quickly, lock out the user.",
"minimumQuickLoginWaitSeconds": "How long to wait after a quick login failure.",
"ssoSessionIdle": "Time a session is allowed to be idle before it expires. Tokens and browser sessions are invalidated when a session is expired.",
"ssoSessionMax": "Max time before a session is expired. Tokens and browser sessions are invalidated when a session is expired.",
"ssoSessionIdleRememberMe": "Time a remember me session is allowed to be idle before it expires. Tokens and browser sessions are invalidated when a session is expired. If not set it uses the standard SSO Session Idle value.",
"ssoSessionMaxRememberMe": "Max time before a session is expired when a user has set the remember me option. Tokens and browser sessions are invalidated when a session is expired. If not set it uses the standard SSO Session Max value.",
"clientSessionIdle": "Time a client session is allowed to be idle before it expires. Tokens are invalidated when a client session is expired. If not set it uses the standard SSO Session Idle value.",
"clientSessionMax": "Max time before a client session is expired. Tokens are invalidated when a session is expired. If not set it uses the standard SSO Session Max value.",
"offlineSessionIdle": "Time an offline session is allowed to be idle before it expires. You need to use offline token to refresh at least once within this period; otherwise offline session will expire.",
"offlineSessionMaxLimited": "Enable offline session max",
"offlineSessionMax": "Max time before an offline session is expired regardless of activity.",
"loginTimeout": "Max time a user has to complete a login. This is recommended to be relatively long, such as 30 minutes or more",
"loginActionTimeout": "Max time a user has to complete login related actions like update password or configure totp. This is recommended to be relatively long, such as 5 minutes or more"
}
}

View file

@ -67,5 +67,26 @@ export default {
quickLoginCheckMilliSeconds:
"If a failure happens concurrently too quickly, lock out the user.",
minimumQuickLoginWait: "How long to wait after a quick login failure.",
ssoSessionIdle:
"Time a session is allowed to be idle before it expires. Tokens and browser sessions are invalidated when a session is expired.",
ssoSessionMax:
"Max time before a session is expired. Tokens and browser sessions are invalidated when a session is expired.",
ssoSessionIdleRememberMe:
"Time a remember me session is allowed to be idle before it expires. Tokens and browser sessions are invalidated when a session is expired. If not set it uses the standard SSO Session Idle value.",
ssoSessionMaxRememberMe:
"Max time before a session is expired when a user has set the remember me option. Tokens and browser sessions are invalidated when a session is expired. If not set it uses the standard SSO Session Max value.",
clientSessionIdle:
"Time a client session is allowed to be idle before it expires. Tokens are invalidated when a client session is expired. If not set it uses the standard SSO Session Idle value.",
clientSessionMax:
"Max time before a client session is expired. Tokens are invalidated when a session is expired. If not set it uses the standard SSO Session Max value.",
offlineSessionIdle:
"Time an offline session is allowed to be idle before it expires. You need to use offline token to refresh at least once within this period; otherwise offline session will expire.",
offlineSessionMaxLimited: "Enable offline session max",
offlineSessionMax:
"Max time before an offline session is expired regardless of activity.",
loginTimeout:
"Max time a user has to complete a login. This is recommended to be relatively long, such as 30 minutes or more",
loginActionTimeout:
"Max time a user has to complete login related actions like update password or configure totp. This is recommended to be relatively long, such as 5 minutes or more",
},
};

View file

@ -0,0 +1,559 @@
{
"realm-settings": {
"partialImport": "Partial import",
"partialExport": "Partial export",
"deleteRealm": "Delete realm",
"deleteConfirmTitle": "Delete realm?",
"deleteConfirm": "If you delete this realm, all associated data will be removed.",
"deleteProviderTitle": "Delete key provider?",
"deleteProviderConfirm": "Are you sure you want to permanently delete the key provider ",
"deleteProviderSuccess": "Success. The provider has been deleted.",
"deleteProviderError": "Error deleting the provider",
"deletedSuccess": "The realm has been deleted",
"deleteError": "Could not delete realm: {{error}}",
"disableConfirmTitle": "Disable realm?",
"disableConfirm": "User and clients can't access the realm if it's disabled. Are you sure you want to continue?",
"editProvider": "Edit provider",
"saveSuccess": "Realm successfully updated",
"saveProviderSuccess": "The provider has been saved successfully.",
"saveProviderError": "Error saving provider: ",
"saveError": "Realm could not be updated: {error}",
"general": "General",
"login": "Login",
"themes": "Themes",
"events": "Events",
"userEventsConfig": "User events configuration",
"userEventsSettings": "User events settings",
"adminEventsConfig": "Admin events config",
"adminEventsSettings": "Admin events settings",
"saveEvents": "Save events",
"expiration": "Expiration",
"clearEvents": "Clear user events",
"includeRepresentation": "Include representation",
"email": "Email",
"template": "Template",
"connectionAndAuthentication": "Connection & Authentication",
"from": "From",
"fromDisplayName": "From display name",
"replyTo": "Reply to",
"replyToDisplayName": "Reply to display name",
"envelopeFrom": "Envelope from",
"host": "Host",
"port": "Port",
"encryption": "Encryption",
"authentication": "Authentication",
"enableSSL": "Enable SSL",
"enableStartTLS": "Enable StartTLS",
"username": "Username",
"password": "Password",
"keys": "Keys",
"keysList": "Keys list",
"searchKey": "Search key",
"keystore": "Keystore",
"keystorePassword": "Keystore password",
"keyAlias": "Key alias",
"keyPassword": "Key password",
"providers": "Providers",
"algorithm": "Algorithm",
"aesGenerated": "aes-generated",
"ecdsaGenerated": "ecdsca-generated",
"hmacGenerated": "hmac-generated",
"javaKeystore": "java-keystore",
"rsa": "rsa",
"rsaGenerated": "rsa-generated",
"consoleDisplayName": "Console Display Name",
"AESKeySize": "AES Key Size",
"active": "Active",
"privateRSAKey": "Private RSA Key",
"x509Certificate": "X509 Certificate",
"ellipticCurve": "Elliptic Curve",
"secretSize": "Secret size",
"type": "Type",
"name": "Name",
"providerId": "ID",
"kid": "Kid",
"provider": "Provider",
"providerDescription": "Provider description",
"addProvider": "Add provider",
"publicKeys": "Public keys",
"activeKeys": "Active keys",
"passiveKeys": "Passive keys",
"disabledKeys": "Disabled keys",
"noKeys": "No keys",
"noKeysDescription": "You haven't created any ",
"certificate": "Certificate",
"userRegistration": "User registration",
"userRegistrationHelpText": "Enable/disable the registration page. A link for registration will show on login page too.",
"forgotPassword": "Forgot password",
"forgotPasswordHelpText": "Show a link on login page for user to click when they have forgotten their credentials.",
"rememberMe": "Remember me",
"rememberMeHelpText": "Show checkbox on login page to allow user to remain logged in between browser restarts until session expires.",
"emailAsUsername": "Email as username",
"emailAsUsernameHelpText": "Allow users to set email as username.",
"loginWithEmail": "Login with email",
"loginWithEmailHelpText": "Allow users to log in with their email address.",
"duplicateEmails": "Duplicate emails",
"duplicateEmailsHelpText": "Allow multiple users to have the same email address. Changing this setting will also clear the user's cache. It is recommended to manually update email constraints of existing users in the database after switching off support for duplicate email addresses.",
"provideEmailTitle": "Provide your email address",
"provideEmail": "To test connection, you should provide your email address first.",
"verifyEmail": "Verify email",
"verifyEmailHelpText": "Require user to verify their email address after initial login or after address changes are submitted.",
"testConnection": "Test connection",
"testConnectionSuccess": "Success! SMTP connection successful. E-mail was sent!",
"testConnectionError": "Error! Failed to send email.",
"realmId": "Realm ID",
"displayName": "Display name",
"htmlDisplayName": "HTML Display name",
"frontendUrl": "Frontend URL",
"requireSsl": "Require SSL",
"sslType": {
"all": "All requests",
"external": "External requests",
"none": "None"
},
"selectATheme": "Select a theme",
"SSOSessionSettings": "SSO Session Settings",
"SSOSessionIdle": "SSO Session Idle",
"SSOSessionMax": "SSO Session Max",
"SSOSessionIdleRememberMe": "SSO Session Idle Remember Me",
"SSOSessionMaxRememberMe": "SSO Session Max Remember Me",
"clientSessionSettings": "Client session settings",
"clientSessionIdle": "Client Session Idle",
"clientSessionMax": "Client Session Max",
"offlineSessionSettings": "Offline session settings",
"offlineSessionIdle": "Offline Session Idle",
"offlineSessionMaxLimited": "Offline Session Max Limited",
"offlineSessionMax": "Offline Session Max",
"loginSettings": "Login settings",
"loginTimeout": "Login timeout",
"loginActionTimeout": "Login action timeout",
"allSupportedLocales": {
"ca": "Català",
"cs": "Čeština",
"da": "Dansk",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"hu": "Magyar",
"it": "Italiano",
"ja": "日本語",
"lt": "Lietuvių kalba",
"nl": "Nederlands",
"no": "Norsk",
"pl": "Polski",
"pt-BR": "Português (Brasil)",
"ru": "Русский",
"sk": "Slovenčina",
"sv": "Svenska",
"tr": "Türkçe",
"zh-CN": "中文"
},
"placeholderText": "Select one",
"userManagedAccess": "User-managed access",
"endpoints": "Endpoints",
"openIDEndpointConfiguration": "OpenID Endpoint Configuration",
"samlIdentityProviderMetadata": "SAML 2.0 Identity Provider Metadata",
"loginTheme": "Login theme",
"accountTheme": "Account theme",
"adminTheme": "Admin console theme",
"emailTheme": "Email theme",
"internationalization": "Internationalization",
"localization": "Localization",
"key": "Key",
"value": "Value",
"pairCreatedSuccess": "Success! The localization text has been created.",
"pairCreatedError": "Error creating localization text.",
"addMessageBundle": "Add message bundle",
"sessions": "Sessions",
"supportedLocales": "Supported locales",
"defaultLocale": "Default locale",
"eventType": "Event saved type",
"searchEventType": "Search saved event type",
"addSavedTypes": "Add saved types",
"addTypes": "Add types",
"eventTypes": {
"SEND_RESET_PASSWORD": {
"name": "Send reset password",
"description": "Send reset password"
},
"UPDATE_CONSENT_ERROR": {
"name": "Update consent error",
"description": "Update consent error"
},
"GRANT_CONSENT": {
"name": "Grant consent",
"description": "Grant consent"
},
"REMOVE_TOTP": { "name": "Remove totp", "description": "Remove totp" },
"REVOKE_GRANT": { "name": "Revoke grant", "description": "Revoke grant" },
"UPDATE_TOTP": { "name": "Update totp", "description": "Update totp" },
"LOGIN_ERROR": { "name": "Login error", "description": "Login error" },
"CLIENT_LOGIN": { "name": "Client login", "description": "Client login" },
"RESET_PASSWORD_ERROR": {
"name": "Reset password error",
"description": "Reset password error"
},
"IMPERSONATE_ERROR": {
"name": "Impersonate error",
"description": "Impersonate error"
},
"CODE_TO_TOKEN_ERROR": {
"name": "Code to token error",
"description": "Code to token error"
},
"CUSTOM_REQUIRED_ACTION": {
"name": "Custom required action",
"description": "Custom required action"
},
"RESTART_AUTHENTICATION": {
"name": "Restart authentication",
"description": "Restart authentication"
},
"IMPERSONATE": { "name": "Impersonate", "description": "Impersonate" },
"UPDATE_PROFILE_ERROR": {
"name": "Update profile error",
"description": "Update profile error"
},
"LOGIN": { "name": "Login", "description": "Login" },
"UPDATE_PASSWORD_ERROR": {
"name": "Update password error",
"description": "Update password error"
},
"CLIENT_INITIATED_ACCOUNT_LINKING": {
"name": "Client initiated account linking",
"description": "Client initiated account linking"
},
"TOKEN_EXCHANGE": {
"name": "Token exchange",
"description": "Token exchange"
},
"LOGOUT": { "name": "Logout", "description": "Logout" },
"REGISTER": { "name": "Register", "description": "Register" },
"DELETE_ACCOUNT_ERROR": {
"name": "Delete account error",
"description": "Delete account error"
},
"CLIENT_REGISTER": {
"name": "Client register",
"description": "Client register"
},
"IDENTITY_PROVIDER_LINK_ACCOUNT": {
"name": "Identity provider link account",
"description": "Identity provider link account"
},
"DELETE_ACCOUNT": {
"name": "Delete account",
"description": "Delete account"
},
"UPDATE_PASSWORD": {
"name": "Update password",
"description": "Update password"
},
"CLIENT_DELETE": {
"name": "Client delete",
"description": "Client delete"
},
"FEDERATED_IDENTITY_LINK_ERROR": {
"name": "Federated identity link error",
"description": "Federated identity link error"
},
"IDENTITY_PROVIDER_FIRST_LOGIN": {
"name": "Identity provider first login",
"description": "Identity provider first login"
},
"CLIENT_DELETE_ERROR": {
"name": "Client delete error",
"description": "Client delete error"
},
"VERIFY_EMAIL": { "name": "Verify email", "description": "Verify email" },
"CLIENT_LOGIN_ERROR": {
"name": "Client login error",
"description": "Client login error"
},
"RESTART_AUTHENTICATION_ERROR": {
"name": "Restart authentication error",
"description": "Restart authentication error"
},
"EXECUTE_ACTIONS": {
"name": "Execute actions",
"description": "Execute actions"
},
"REMOVE_FEDERATED_IDENTITY_ERROR": {
"name": "Remove federated identity error",
"description": "Remove federated identity error"
},
"TOKEN_EXCHANGE_ERROR": {
"name": "Token exchange error",
"description": "Token exchange error"
},
"PERMISSION_TOKEN": {
"name": "Permission token",
"description": "Permission token"
},
"SEND_IDENTITY_PROVIDER_LINK_ERROR": {
"name": "Send identity provider link error",
"description": "Send identity provider link error"
},
"EXECUTE_ACTION_TOKEN_ERROR": {
"name": "Execute action token error",
"description": "Execute action token error"
},
"SEND_VERIFY_EMAIL": {
"name": "Send verify email",
"description": "Send verify email"
},
"EXECUTE_ACTIONS_ERROR": {
"name": "Execute actions error",
"description": "Execute actions error"
},
"REMOVE_FEDERATED_IDENTITY": {
"name": "Remove federated identity",
"description": "Remove federated identity"
},
"IDENTITY_PROVIDER_POST_LOGIN": {
"name": "Identity provider post login",
"description": "Identity provider post login"
},
"IDENTITY_PROVIDER_LINK_ACCOUNT_ERROR": {
"name": "Identity provider link account error",
"description": "Identity provider link account error"
},
"UPDATE_EMAIL": { "name": "Update email", "description": "Update email" },
"REGISTER_ERROR": {
"name": "Register error",
"description": "Register error"
},
"REVOKE_GRANT_ERROR": {
"name": "Revoke grant error",
"description": "Revoke grant error"
},
"EXECUTE_ACTION_TOKEN": {
"name": "Execute action token",
"description": "Execute action token"
},
"LOGOUT_ERROR": { "name": "Logout error", "description": "Logout error" },
"UPDATE_EMAIL_ERROR": {
"name": "Update email error",
"description": "Update email error"
},
"CLIENT_UPDATE_ERROR": {
"name": "Client update error",
"description": "Client update error"
},
"UPDATE_PROFILE": {
"name": "Update profile",
"description": "Update profile"
},
"CLIENT_REGISTER_ERROR": {
"name": "Client register error",
"description": "Client register error"
},
"FEDERATED_IDENTITY_LINK": {
"name": "Federated identity link",
"description": "Federated identity link"
},
"SEND_IDENTITY_PROVIDER_LINK": {
"name": "Send identity provider link",
"description": "Send identity provider link"
},
"SEND_VERIFY_EMAIL_ERROR": {
"name": "Send verify email error",
"description": "Send verify email error"
},
"RESET_PASSWORD": {
"name": "Reset password",
"description": "Reset password"
},
"CLIENT_INITIATED_ACCOUNT_LINKING_ERROR": {
"name": "Client initiated account linking error",
"description": "Client initiated account linking error"
},
"UPDATE_CONSENT": {
"name": "Update consent",
"description": "Update consent"
},
"REMOVE_TOTP_ERROR": {
"name": "Remove totp error",
"description": "Remove totp error"
},
"VERIFY_EMAIL_ERROR": {
"name": "Verify email error",
"description": "Verify email error"
},
"SEND_RESET_PASSWORD_ERROR": {
"name": "Send reset password error",
"description": "Send reset password error"
},
"CLIENT_UPDATE": {
"name": "Client update",
"description": "Client update"
},
"CUSTOM_REQUIRED_ACTION_ERROR": {
"name": "Custom required action error",
"description": "Custom required action error"
},
"IDENTITY_PROVIDER_POST_LOGIN_ERROR": {
"name": "Identity provider post login error",
"description": "Identity provider post login error"
},
"UPDATE_TOTP_ERROR": {
"name": "Update totp error",
"description": "Update totp error"
},
"CODE_TO_TOKEN": {
"name": "Code to token",
"description": "Code to token"
},
"GRANT_CONSENT_ERROR": {
"name": "Grant consent error",
"description": "Grant consent error"
},
"IDENTITY_PROVIDER_FIRST_LOGIN_ERROR": {
"name": "Identity provider first login error",
"description": "Identity provider first login error"
},
"REGISTER_NODE_ERROR": {
"name": "Register node error",
"description": "Register node error"
},
"PERMISSION_TOKEN_ERROR": {
"name": "Permission token error",
"description": "Permission token error"
},
"IDENTITY_PROVIDER_RETRIEVE_TOKEN_ERROR": {
"name": "Identity provider retrieve token error",
"description": "Identity provider retrieve token error"
},
"CLIENT_INFO": {
"name": "Client info",
"description": "Client info"
},
"VALIDATE_ACCESS_TOKEN": {
"name": "Validate access token",
"description": "Validate access token"
},
"IDENTITY_PROVIDER_LOGIN": {
"name": "Identity provider login",
"description": "Identity provider login"
},
"CLIENT_INFO_ERROR": {
"name": "Client info error",
"description": "Client info error"
},
"INTROSPECT_TOKEN_ERROR": {
"name": "Introspect token error",
"description": "Introspect token error"
},
"INTROSPECT_TOKEN": {
"name": "Introspect token",
"description": "Introspect token"
},
"UNREGISTER_NODE": {
"name": "Unregister node",
"description": "Unregister node"
},
"REGISTER_NODE": {
"name": "Register node",
"description": "Register node"
},
"INVALID_SIGNATURE": {
"name": "Invalid signature",
"description": "Invalid signature"
},
"USER_INFO_REQUEST_ERROR": {
"name": "User info request error",
"description": "User info request error"
},
"REFRESH_TOKEN": {
"name": "Refresh token",
"description": "Refresh token"
},
"IDENTITY_PROVIDER_RESPONSE": {
"name": "Identity provider response",
"description": "Identity provider response"
},
"IDENTITY_PROVIDER_RETRIEVE_TOKEN": {
"name": "Identity provider retrieve token",
"description": "Identity provider retrieve token"
},
"UNREGISTER_NODE_ERROR": {
"name": "Unregister node error",
"description": "Unregister node error"
},
"VALIDATE_ACCESS_TOKEN_ERROR": {
"name": "Validate access token error",
"description": "Validate access token error"
},
"INVALID_SIGNATURE_ERROR": {
"name": "Invalid signature error",
"description": "Invalid signature error"
},
"USER_INFO_REQUEST": {
"name": "User info request",
"description": "User info request"
},
"IDENTITY_PROVIDER_RESPONSE_ERROR": {
"name": "Identity provider response error",
"description": "Identity provider response error"
},
"IDENTITY_PROVIDER_LOGIN_ERROR": {
"name": "Identity provider login error",
"description": "Identity provider login error"
},
"REFRESH_TOKEN_ERROR": {
"name": "Refresh token error",
"description": "Refresh token error"
}
},
"emptyEvents": "Nothing to add",
"emptyEventsInstructions": "There are no more events types left to add",
"eventConfigSuccessfully": "Successfully saved configuration",
"eventConfigError": "Could not save event configuration {{error}}",
"deleteEvents": "Clear events",
"deleteEventsConfirm": "If you clear all events of this realm, all records will be permanently cleared in the database",
"admin-events-cleared": "The admin events have been cleared",
"admin-events-cleared-error": "Could not clear the admin events {{error}}",
"user-events-cleared": "The user events have been cleared",
"user-events-cleared-error": "Could not clear the user events {{error}}",
"events-disable-title": "Unsave events?",
"events-disable-confirm": "If \"Save events\" is disabled, subsequent events will not be displayed in the \"Events\" menu",
"confirm": "Confirm",
"noMessageBundles": "No message bundles",
"noMessageBundlesInstructions": "Add a message bundle to get started.",
"messageBundleDescription": "You can edit the supported locales. If you haven't selected supported locales yet, you can only edit the English locale.",
"defaultRoles": "Default roles",
"defaultGroups": "Default groups",
"securityDefences": "Security defenses",
"headers": "Headers",
"bruteForceDetection": "Brute force detection",
"xFrameOptions": "X-Frame-Options",
"contentSecurityPolicy": "Content-Security-Policy",
"contentSecurityPolicyReportOnly": "Content-Security-Policy-Report-Only",
"xContentTypeOptions": "X-Content-Type-Options",
"xRobotsTag": "X-Robots-Tag",
"xXSSProtection": "X-XSS-Protection",
"strictTransportSecurity": "HTTP Strict Transport Security (HSTS)",
"failureFactor": "Max login failures",
"permanentLockout": "Permanent lockout",
"waitIncrement": "Wait increment",
"maxFailureWait": "Max wait",
"maxDeltaTime": "Failure reset time",
"quickLoginCheckMilliSeconds": "Quick login check milliseconds",
"minimumQuickLoginWaitSeconds": "Minimum quick login wait"
},
"partial-import": {
"partialImportHeaderText": "Partial import allows you to import users, clients, and other resources from a previously exported json file.",
"selectRealm": "Select realm",
"chooseResources": "Choose the resources you want to import",
"selectIfResourceExists": "If a resource already exists, specify what should be done",
"import": "Import",
"FAIL": "Fail import",
"SKIP": "Skip",
"OVERWRITE": "Overwrite"
},
"onDragStart": "Dragging started for item {{id}}",
"onDragMove": "Dragging item {{id}}",
"onDragCancel": "Dragging cancelled. List is unchanged.",
"onDragFinish": "Dragging finished {{list}}"
}

View file

@ -155,6 +155,22 @@ export default {
emailTheme: "Email theme",
internationalization: "Internationalization",
localization: "Localization",
sessions: "Sessions",
SSOSessionSettings: "SSO Session Settings",
SSOSessionIdle: "SSO Session Idle",
SSOSessionMax: "SSO Session Max",
SSOSessionIdleRememberMe: "SSO Session Idle Remember Me",
SSOSessionMaxRememberMe: "SSO Session Max Remember Me",
clientSessionSettings: "Client session settings",
clientSessionIdle: "Client Session Idle",
clientSessionMax: "Client Session Max",
offlineSessionSettings: "Offline session settings",
offlineSessionIdle: "Offline Session Idle",
offlineSessionMaxLimited: "Offline Session Max Limited",
offlineSessionMax: "Offline Session Max",
loginSettings: "Login settings",
loginTimeout: "Login timeout",
loginActionTimeout: "Login action timeout",
key: "Key",
value: "Value",
pairCreatedSuccess: "Success! The localization text has been created.",