197 lines
5.9 KiB
TypeScript
Raw Normal View History

import type { AccountThemePageId } from "keycloakify/bin/keycloakify/generateFtl";
import { assert } from "tsafe/assert";
import type { Equals } from "tsafe";
import { type ThemeType } from "keycloakify/bin/constants";
2024-02-16 17:40:12 +02:00
export type KcContext = KcContext.Password | KcContext.Account | KcContext.Sessions | KcContext.Totp;
export declare namespace KcContext {
export type Common = {
2023-11-22 18:00:29 +01:00
themeVersion: string;
keycloakifyVersion: string;
2023-04-27 11:52:02 +02:00
themeType: "account";
2023-06-08 23:09:14 +02:00
themeName: string;
locale?: {
supported: {
url: string;
label: string;
languageTag: string;
}[];
currentLanguageTag: string;
};
url: {
accountUrl: string;
passwordUrl: string;
totpUrl: string;
socialUrl: string;
sessionsUrl: string;
applicationsUrl: string;
logUrl: string;
resourceUrl: string;
resourcesCommonPath: string;
resourcesPath: string;
/** @deprecated, not present in recent keycloak version apparently, use kcContext.referrer instead */
referrerURI?: string;
getLogoutUrl: () => string;
};
features: {
passwordUpdateSupported: boolean;
identityFederation: boolean;
log: boolean;
authorization: boolean;
};
realm: {
internationalizationEnabled: boolean;
userManagedAccessAllowed: boolean;
};
2023-04-20 13:10:33 +02:00
// Present only if redirected to account page with ?referrer=xxx&referrer_uri=http...
message?: {
type: "success" | "warning" | "error" | "info";
summary: string;
};
referrer?: {
2023-04-20 13:10:33 +02:00
url: string; // The url of the App
name: string; // Client id
};
messagesPerField: {
2023-06-15 17:10:15 +02:00
/**
* Return text if message for given field exists. Useful eg. to add css styles for fields with message.
*
* @param fieldName to check for
* @param text to return
* @return text if message exists for given field, else undefined
*/
printIfExists: <T extends string>(fieldName: string, text: T) => T | undefined;
/**
* Check if exists error message for given fields
*
* @param fields
* @return boolean
*/
existsError: (fieldName: string) => boolean;
2023-06-15 17:10:15 +02:00
/**
* Get message for given field.
*
* @param fieldName
* @return message text or empty string
*/
get: (fieldName: string) => string;
2023-06-15 17:10:15 +02:00
/**
* Check if message for given field exists
*
* @param field
* @return boolean
*/
exists: (fieldName: string) => boolean;
};
2023-03-21 05:27:31 +01:00
account: {
email?: string;
firstName: string;
lastName?: string;
username?: string;
};
2024-02-07 15:18:27 +02:00
sessions: {
sessions: {
ipAddress: string;
started?: any;
lastAccess?: any;
expires?: any;
clients: string[];
}[];
};
};
export type Password = Common & {
pageId: "password.ftl";
password: {
passwordSet: boolean;
};
2023-03-22 03:02:44 +01:00
stateChecker: string;
};
export type Account = Common & {
pageId: "account.ftl";
url: {
accountUrl: string;
};
realm: {
registrationEmailAsUsername: boolean;
editUsernameAllowed: boolean;
};
stateChecker: string;
};
2024-02-07 15:18:27 +02:00
export type Sessions = Common & {
pageId: "sessions.ftl";
sessions: {
sessions: {
ipAddress: string;
started?: any;
lastAccess?: any;
expires?: any;
clients: string[];
}[];
};
stateChecker: string;
};
2024-02-16 17:40:12 +02:00
export type Totp = Common & {
pageId: "totp.ftl";
totp: {
enabled: boolean;
2024-02-16 17:40:12 +02:00
totpSecretEncoded: string;
qrUrl: string;
policy: {
algorithm: "HmacSHA1" | "HmacSHA256" | "HmacSHA512";
digits: number;
lookAheadWindow: number;
} & (
| {
type: "totp";
period: number;
}
| {
type: "hotp";
initialCounter: number;
}
);
supportedApplications: string[];
totpSecretQrCode: string;
manualUrl: string;
totpSecret: string;
otpCredentials: { id: string; userLabel: string }[];
};
2024-02-19 08:58:27 +02:00
mode?: "qr" | "manual" | undefined | null;
isAppInitiatedAction: boolean;
2024-02-16 17:40:12 +02:00
url: {
accountUrl: string;
passwordUrl: string;
totpUrl: string;
socialUrl: string;
sessionsUrl: string;
applicationsUrl: string;
logUrl: string;
resourceUrl: string;
resourcesCommonPath: string;
resourcesPath: string;
/** @deprecated, not present in recent keycloak version apparently, use kcContext.referrer instead */
referrerURI?: string;
getLogoutUrl: () => string;
};
stateChecker: string;
};
}
2023-04-27 11:52:02 +02:00
{
type Got = KcContext["pageId"];
type Expected = AccountThemePageId;
type OnlyInGot = Exclude<Got, Expected>;
type OnlyInExpected = Exclude<Expected, Got>;
assert<Equals<OnlyInGot, never>>();
assert<Equals<OnlyInExpected, never>>();
}
assert<KcContext["themeType"] extends ThemeType ? true : false>();