@keycloakify/keycloak-admin-ui
Version:
Repackaged Keycloak Admin UI
67 lines • 4.73 kB
JavaScript
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
import { TextControl, useAlerts, useFetch } from "../../ui-shared";
import { ActionGroup, AlertVariant, Button, Card, CardBody, CardHeader, CardTitle, PageSection, Text, TextContent, } from "@patternfly/react-core";
import { saveAs } from "file-saver";
import { useState } from "react";
import { useFormContext, useWatch } from "react-hook-form";
import { useTranslation } from "react-i18next";
import { useAdminClient } from "../../admin-client";
import { FormAccess } from "../../components/form/FormAccess";
import { DefaultSwitchControl } from "../../components/SwitchControl";
import { convertAttributeNameToForm } from "../../util";
import useToggle from "../../utils/useToggle";
import { Certificate } from "../../clients/keys/Certificate";
import { GenerateKeyDialog, getFileExtension } from "../../clients/keys/GenerateKeyDialog";
import { ImportKeyDialog } from "../../clients/keys/ImportKeyDialog";
const attr = "jwt.credential";
export const Keys = ({ clientId, save, hasConfigureAccess }) => {
const { adminClient } = useAdminClient();
const { t } = useTranslation();
const { control, getValues, formState: { isDirty }, } = useFormContext();
const { addAlert, addError } = useAlerts();
const [keyInfo, setKeyInfo] = useState();
const [openGenerateKeys, toggleOpenGenerateKeys, setOpenGenerateKeys] = useToggle();
const [openImportKeys, toggleOpenImportKeys, setOpenImportKeys] = useToggle();
const [key, setKey] = useState(0);
const refresh = () => setKey(key + 1);
const useJwksUrl = useWatch({
control,
name: convertAttributeNameToForm("attributes.use.jwks.url"),
defaultValue: "false",
});
useFetch(() => adminClient.clients.getKeyInfo({ id: clientId, attr }), (info) => setKeyInfo(info), [key]);
const generate = async (config) => {
var _a;
try {
const keyStore = await adminClient.clients.generateAndDownloadKey({
id: clientId,
attr,
}, config);
saveAs(new Blob([keyStore], { type: "application/octet-stream" }), `keystore.${getFileExtension((_a = config.format) !== null && _a !== void 0 ? _a : "")}`);
addAlert(t("generateSuccess"), AlertVariant.success);
refresh();
}
catch (error) {
addError("generateError", error);
}
};
const importKey = async (importFile) => {
try {
const formData = new FormData();
const { file, ...rest } = importFile;
for (const [key, value] of Object.entries(rest)) {
formData.append(key, value);
}
formData.append("file", file.value);
await adminClient.clients.uploadCertificate({ id: clientId, attr }, formData);
addAlert(t("importSuccess"), AlertVariant.success);
refresh();
}
catch (error) {
addError("importError", error);
}
};
return (_jsxs(PageSection, { variant: "light", className: "keycloak__form", children: [openGenerateKeys && (_jsx(GenerateKeyDialog, { clientId: getValues("clientId"), toggleDialog: toggleOpenGenerateKeys, save: generate })), openImportKeys && (_jsx(ImportKeyDialog, { toggleDialog: toggleOpenImportKeys, save: importKey })), _jsxs(Card, { isFlat: true, children: [_jsx(CardHeader, { children: _jsx(CardTitle, { children: t("jwksUrlConfig") }) }), _jsx(CardBody, { children: _jsx(TextContent, { children: _jsx(Text, { children: t("keysIntro") }) }) }), _jsx(CardBody, { children: _jsxs(FormAccess, { role: "manage-clients", fineGrainedAccess: hasConfigureAccess, isHorizontal: true, children: [_jsx(DefaultSwitchControl, { name: convertAttributeNameToForm("attributes.use.jwks.url"), label: t("useJwksUrl"), labelIcon: t("useJwksUrlHelp"), stringify: true }), useJwksUrl !== "true" &&
(keyInfo ? (_jsx(Certificate, { plain: true, keyInfo: keyInfo })) : ("No client certificate configured")), useJwksUrl === "true" && (_jsx(TextControl, { name: convertAttributeNameToForm("attributes.jwks.url"), label: t("jwksUrl"), labelIcon: t("jwksUrlHelp"), type: "url" })), _jsxs(ActionGroup, { children: [_jsx(Button, { "data-testid": "saveKeys", onClick: save, isDisabled: !isDirty, children: t("save") }), _jsx(Button, { "data-testid": "generate", variant: "secondary", onClick: () => setOpenGenerateKeys(true), children: t("generateNewKeys") }), _jsx(Button, { "data-testid": "import", variant: "secondary", onClick: () => setOpenImportKeys(true), isDisabled: useJwksUrl === "true", children: t("import") })] })] }) })] })] }));
};
//# sourceMappingURL=Keys.js.map