1
0
Fork 0

Add tsx syntax to TOTPNew and rename TOTP page IDs.

This commit is contained in:
Kitteh 2021-05-23 12:12:25 +01:00
parent 1ccb432cbc
commit 7568bc6d8e
9 changed files with 6897 additions and 125 deletions

6791
pnpm-lock.yaml Normal file

File diff suppressed because it is too large Load diff

View file

@ -18,7 +18,6 @@ import { MePage } from "./pages/Me";
import { NewKVEnginePage } from "./pages/Secrets/NewEngines/NewKVEngine";
import { NewSecretsEnginePage } from "./pages/Secrets/NewSecretsEngine";
import { NewTOTPEnginePage } from "./pages/Secrets/NewEngines/NewTOTPEngine";
import { NewTOTPPage } from "./pages/Secrets/TOTP/NewTOTP";
import { NewTransitEnginePage } from "./pages/Secrets/NewEngines/NewTransitEngine";
import { NewTransitKeyPage } from "./pages/Secrets/Transit/NewTransitKey";
import { Page } from "./types/Page";
@ -27,6 +26,7 @@ import { SecretsHomePage } from "./pages/Secrets/SecretsHome";
import { SetLanguagePage } from "./pages/SetLanguage";
import { SetVaultURLPage } from "./pages/SetVaultURL";
import { TOTPDeletePage } from "./pages/Secrets/TOTP/TOTPDelete";
import { TOTPNewPage } from "./pages/Secrets/TOTP/TOTPNew";
import { TOTPViewPage } from "./pages/Secrets/TOTP/TOTPView";
import { TransitDecryptPage } from "./pages/Secrets/Transit/TransitDecrypt";
import { TransitEncryptPage } from "./pages/Secrets/Transit/TransitEncrypt";
@ -57,8 +57,8 @@ export const allPages: pagesList = {
USERPASS_USER_NEW: new UserPassUserNewPage(),
USERPASS_USER_DELETE: new UserPassUserDeletePage(),
ME: new MePage(),
TOTP: new TOTPViewPage(),
NEW_TOTP: new NewTOTPPage(),
TOTP_VIEW: new TOTPViewPage(),
TOTP_NEW: new TOTPNewPage(),
TOTP_DELETE: new TOTPDeletePage(),
LOGIN: new LoginPage(),
SET_VAULT_URL: new SetVaultURLPage(),

View file

@ -55,7 +55,7 @@ export class NewTOTPEnginePage extends Page {
});
this.state.secretMountType = "totp";
this.state.baseMount = name + "/";
await this.router.changePage("TOTP");
await this.router.changePage("TOTP_VIEW");
} catch (e) {
const error = e as Error;
setErrorText(error.message);

View file

@ -2,9 +2,8 @@ import { PageRouter } from "z-pagerouter";
import { PageState } from "../../PageState";
import { makeElement } from "z-makeelement";
function currentTitleSecretText(state: PageState, suffix = ""): string {
function currentTitleSecretText(state: PageState): string {
let secretItemText = state.secretItem;
secretItemText += suffix;
if (state.secretVersion !== null) secretItemText += ` (v${state.secretVersion})`;
return secretItemText;
}
@ -25,7 +24,7 @@ export async function SecretTitleElement(router: PageRouter, suffix = ""): Promi
if (state.secretMountType.startsWith("kv") || state.secretMountType == "cubbyhole") {
await router.changePage("KEY_VALUE_VIEW");
} else if (state.secretMountType == "totp") {
await router.changePage("TOTP");
await router.changePage("TOTP_VIEW");
} else if (state.secretMountType == "transit") {
await router.changePage("TRANSIT_VIEW");
}
@ -47,7 +46,12 @@ export async function SecretTitleElement(router: PageRouter, suffix = ""): Promi
makeElement({
tag: "span",
condition: state.secretItem.length != 0,
text: currentTitleSecretText(state, suffix),
text: currentTitleSecretText(state),
}),
makeElement({
tag: "span",
condition: suffix.length != 0,
text: suffix,
}),
],
});

View file

@ -65,7 +65,7 @@ export class SecretsHomePage extends Page {
linkPage = "KEY_VALUE_VIEW";
} else if (mount.type == "totp") {
linkText = `TOTP - ${baseMount}`;
linkPage = "TOTP";
linkPage = "TOTP_VIEW";
} else if (mount.type == "transit") {
linkText = `Transit - ${baseMount}`;
linkPage = "TRANSIT_VIEW";

View file

@ -1,114 +0,0 @@
import { Form } from "../../../elements/Form";
import { Margin } from "../../../elements/Margin";
import { MarginInline } from "../../../elements/MarginInline";
import { Page } from "../../../types/Page";
import { SecretTitleElement } from "../SecretTitleElement";
import { addNewTOTP } from "../../../api/totp/addNewTOTP";
import { makeElement } from "z-makeelement";
import { setErrorText } from "../../../pageUtils";
import i18next from "i18next";
function replaceAll(str: string, replace: string, replaceWith: string): string {
return str.replace(new RegExp(replace, "g"), replaceWith);
}
function removeDashSpaces(str: string): string {
str = replaceAll(str, "-", "");
str = replaceAll(str, " ", "");
return str;
}
export class NewTOTPPage extends Page {
constructor() {
super();
}
async goBack(): Promise<void> {
await this.router.changePage("TOTP");
}
async render(): Promise<void> {
await this.router.setPageContent(
Form(
[
Margin(
makeElement({
tag: "input",
class: ["uk-input", "uk-form-width-medium"],
attributes: {
required: "true",
type: "text",
placeholder: i18next.t("totp_new_name_text"),
name: "name",
},
}),
),
makeElement({
tag: "p",
text: i18next.t("totp_new_info"),
}),
Margin(
makeElement({
tag: "input",
class: ["uk-input", "uk-form-width-medium"],
attributes: {
type: "text",
placeholder: i18next.t("totp_new_uri_input"),
name: "uri",
},
}),
),
Margin(
makeElement({
tag: "input",
class: ["uk-input", "uk-form-width-medium"],
attributes: {
type: "text",
placeholder: i18next.t("totp_new_key_input"),
name: "key",
},
}),
),
makeElement({
tag: "p",
id: "errorText",
class: "uk-text-danger",
}),
MarginInline(
makeElement({
tag: "button",
class: ["uk-button", "uk-button-primary"],
text: i18next.t("totp_new_add_btn"),
attributes: {
type: "submit",
},
}),
),
],
async (form: HTMLFormElement) => {
const formData = new FormData(form);
const parms = {
url: formData.get("uri") as string,
key: removeDashSpaces(formData.get("key") as string).toUpperCase(),
name: formData.get("name") as string,
generate: false,
};
try {
await addNewTOTP(this.state.baseMount, parms);
await this.router.changePage("TOTP");
} catch (e: unknown) {
const error = e as Error;
setErrorText(`API Error: ${error.message}`);
}
},
),
);
}
async getPageTitle(): Promise<Element | string> {
return await SecretTitleElement(this.router, i18next.t("totp_new_suffix"));
}
get name(): string {
return i18next.t("totp_new_title");
}
}

View file

@ -15,7 +15,7 @@ export class TOTPDeletePage extends Page {
async goBack(): Promise<void> {
this.state.secretItem = "";
await this.router.changePage("TOTP");
await this.router.changePage("TOTP_VIEW");
}
async render(): Promise<void> {
render(

View file

@ -0,0 +1,91 @@
import { Form } from "../../../elements/ReactForm";
import { Margin } from "../../../elements/ReactMargin";
import { MarginInline } from "../../../elements/ReactMarginInline";
import { Page } from "../../../types/Page";
import { SecretTitleElement } from "../SecretTitleElement";
import { addNewTOTP } from "../../../api/totp/addNewTOTP";
import { render } from "preact";
import { setErrorText } from "../../../pageUtils";
import i18next from "i18next";
function replaceAll(str: string, replace: string, replaceWith: string): string {
return str.replace(new RegExp(replace, "g"), replaceWith);
}
function removeDashSpaces(str: string): string {
str = replaceAll(str, "-", "");
str = replaceAll(str, " ", "");
return str;
}
export class TOTPNewPage extends Page {
constructor() {
super();
}
async goBack(): Promise<void> {
await this.router.changePage("TOTP_VIEW");
}
async render(): Promise<void> {
render(
<Form onSubmit={(data) => this.onSubmit(data)}>
<Margin>
<input
class="uk-input uk-form-width-medium"
name="name"
type="text"
placeholder={i18next.t("totp_new_name_text")}
required
/>
</Margin>
<p>{i18next.t("totp_new_info")}</p>
<Margin>
<input
class="uk-input uk-form-width-medium"
name="uri"
type="text"
placeholder={i18next.t("totp_new_uri_input")}
/>
</Margin>
<Margin>
<input
class="uk-input uk-form-width-medium"
name="key"
type="text"
placeholder={i18next.t("totp_new_key_input")}
/>
</Margin>
<p id="errorText" class="uk-text-danger" />
<MarginInline>
<button class="uk-button uk-button-primary" type="submit">
{i18next.t("totp_new_add_btn")}
</button>
</MarginInline>
</Form>,
this.router.pageContentElement,
);
}
async onSubmit(data: FormData): Promise<void> {
const parms = {
url: data.get("uri") as string,
key: removeDashSpaces(data.get("key") as string).toUpperCase(),
name: data.get("name") as string,
generate: false,
};
try {
await addNewTOTP(this.state.baseMount, parms);
await this.router.changePage("TOTP_VIEW");
} catch (e: unknown) {
const error = e as Error;
setErrorText(`API Error: ${error.message}`);
}
}
async getPageTitle(): Promise<Element | string> {
return await SecretTitleElement(this.router, i18next.t("totp_new_suffix"));
}
get name(): string {
return i18next.t("totp_new_title");
}
}

View file

@ -77,7 +77,7 @@ export class TOTPViewPage extends Page {
<button
class="uk-button uk-button-primary uk-margin-bottom"
onClick={async () => {
await this.router.changePage("NEW_TOTP");
await this.router.changePage("TOTP_NEW");
}}
>
{i18next.t("totp_view_new_btn")}