1
0
Fork 0
VaultUI/src/pages/Secrets/Transit/TransitRewrap.tsx

108 lines
3.4 KiB
TypeScript
Raw Normal View History

import { CopyableModal } from "../../../elements/CopyableModal";
2021-05-24 14:37:37 +01:00
import { Form } from "../../../elements/Form";
import { Margin } from "../../../elements/Margin";
import { Page } from "../../../types/Page";
2021-05-19 10:27:00 +01:00
import { SecretTitleElement } from "../SecretTitleElement";
import { getTransitKey } from "../../../api/transit/getTransitKey";
import { objectToMap } from "../../../utils";
2021-05-23 15:34:16 +01:00
import { render } from "preact";
import { setErrorText } from "../../../pageUtils";
import { transitRewrap } from "../../../api/transit/transitRewrap";
2021-05-23 15:34:16 +01:00
import UIkit from "uikit";
2021-05-10 11:35:14 +01:00
import i18next from "i18next";
2021-05-09 16:02:04 +01:00
type versionOption = { version: string; label: string };
2021-05-09 16:02:04 +01:00
export class TransitRewrapPage extends Page {
constructor() {
super();
}
2021-05-12 17:37:09 +01:00
async goBack(): Promise<void> {
await this.router.changePage("TRANSIT_VIEW_SECRET");
2021-05-09 16:02:04 +01:00
}
async render(): Promise<void> {
2021-05-20 14:12:12 +01:00
const transitKey = await getTransitKey(this.state.baseMount, this.state.secretItem);
2021-05-09 16:02:04 +01:00
const stringVersions = Array.from(
objectToMap(transitKey.keys).keys(),
).reverse() as unknown as string[];
2021-05-10 11:35:14 +01:00
const versions = stringVersions.map((val): number => parseInt(val, 10));
2021-05-09 16:02:04 +01:00
// get the selectable version options in the same
// format the official UI uses.
2021-05-09 16:02:04 +01:00
// e.g: ["2 (latest)", "1"]
2021-05-10 11:35:14 +01:00
const options: versionOption[] = versions.map((val): versionOption => {
const i18nkey =
val == Math.max(...versions)
? "transit_rewrap_latest_version_option_text"
: "transit_rewrap_version_option_text";
2021-05-09 16:02:04 +01:00
return {
version: String(val),
label: i18next.t(i18nkey, { version_num: String(val) }),
};
});
2021-05-09 16:02:04 +01:00
2021-05-23 15:34:16 +01:00
render(
<Form onSubmit={async (data) => await this.onSubmit(data)}>
<Margin>
<select class="uk-select uk-width-1-2" name="version">
{options.map((option) => (
<option label={option.label} value={option.version}>
{option.label}
</option>
))}
</select>
</Margin>
<Margin>
<textarea
class="uk-textarea uk-width-1-2"
name="ciphertext"
placeholder={i18next.t("transit_rewrap_input_placeholder")}
/>
</Margin>
<p class="uk-text-danger" id="errorText" />
<button class="uk-button uk-button-primary" type="submit">
{i18next.t("transit_rewrap_rewrap_btn")}
</button>
<div id="modalAttachmentPoint" />
</Form>,
this.router.pageContentElement,
);
2021-05-09 16:02:04 +01:00
}
2021-05-23 15:34:16 +01:00
async onSubmit(data: FormData): Promise<void> {
2021-05-09 16:02:04 +01:00
try {
2021-05-20 14:12:12 +01:00
const res = await transitRewrap(this.state.baseMount, this.state.secretItem, {
2021-05-23 15:34:16 +01:00
ciphertext: data.get("ciphertext") as string,
key_version: parseInt(data.get("version") as string, 10),
});
2021-05-23 15:34:16 +01:00
render(
<CopyableModal
id="transitResultModal"
name={i18next.t("transit_rewrap_result_modal_title")}
contentString={res.ciphertext}
/>,
document.querySelector("#modalAttachmentPoint"),
);
UIkit.modal(document.querySelector("#transitResultModal")).show();
2021-05-10 11:35:14 +01:00
} catch (e: unknown) {
const error = e as Error;
setErrorText(`API Error: ${error.message}`);
2021-05-09 16:02:04 +01:00
}
}
async renderPageTitle(): Promise<void> {
render(
<SecretTitleElement router={this.router} suffix={i18next.t("transit_rewrap_suffix")} />,
this.router.pageTitleElement,
);
2021-05-09 16:02:04 +01:00
}
get name(): string {
return i18next.t("transit_rewrap_title");
}
}