From 64e3705669e7c12b8013704654f17cf8eaf659d4 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 25 May 2023 18:08:20 -0300 Subject: cases, account details and new-form screen --- .../exchange-backoffice-ui/src/pages/Officer.tsx | 204 +++++++++++---------- 1 file changed, 104 insertions(+), 100 deletions(-) (limited to 'packages/exchange-backoffice-ui/src/pages/Officer.tsx') diff --git a/packages/exchange-backoffice-ui/src/pages/Officer.tsx b/packages/exchange-backoffice-ui/src/pages/Officer.tsx index 4d8b90228..79dd8bace 100644 --- a/packages/exchange-backoffice-ui/src/pages/Officer.tsx +++ b/packages/exchange-backoffice-ui/src/pages/Officer.tsx @@ -4,69 +4,60 @@ import { notifyInfo, useLocalStorage, useMemoryStorage, + useTranslationContext, } from "@gnu-taler/web-util/browser"; import { VNode, h } from "preact"; import { useEffect, useState } from "preact/hooks"; import { + Account, UnwrapKeyError, createNewAccount, - createNewSessionId, unlockAccount, } from "../account.js"; import { createNewForm } from "../handlers/forms.js"; +import { Officer, codecForOfficer } from "../Dashboard.js"; export function Officer() { const password = useMemoryStorage("password"); - const session = useLocalStorage("session"); - const officer = useLocalStorage("officer"); - const [keys, setKeys] = useState({ accountId: "", pub: "" }); + const officer = useLocalStorage("officer", { + codec: codecForOfficer(), + }); + const [keys, setKeys] = useState(); useEffect(() => { - if ( - officer.value === undefined || - session.value === undefined || - password.value === undefined - ) { + if (officer.value === undefined || password.value === undefined) { return; } - unlockAccount(session.value, officer.value, password.value) + + unlockAccount(officer.value.salt, officer.value.key, password.value) .then((keys) => setKeys(keys ?? { accountId: "", pub: "" })) .catch((e) => { if (e instanceof UnwrapKeyError) { console.log(e); } }); - }, [officer.value, session.value, password.value]); - - useEffect(() => { - if (!session.value) { - session.update(createNewSessionId()); - } - }, []); - - const { value: sessionId } = session; - if (!sessionId) { - return
loading...
; - } + }, [officer.value, password.value]); - if (officer.value === undefined) { + if ( + officer.value === undefined || + !officer.value.key || + !officer.value.salt + ) { return ( { - password.reset(); - officer.update(id); + onNewAccount={(salt, key, pwd) => { + password.update(pwd); + officer.update({ salt, when: { t_ms: Date.now() }, key }); }} /> ); } - console.log("pwd", password.value); if (password.value === undefined) { return ( { password.update(pwd); }} @@ -76,42 +67,59 @@ export function Officer() { return (
-
Officer
-

{sessionId}

Public key

-
-

- -----BEGIN PUBLIC KEY----- -

{keys.pub}
- -----END PUBLIC KEY----- -

-
-

- Private key -

-
-

- -----BEGIN PRIVATE KEY----- -

{keys.accountId}
- -----END PRIVATE KEY----- -

+
+

{keys?.accountId}

+

+ + Request account activation + +

+

+ +

+

+ +

); } function CreateAccount({ - sessionId, onNewAccount, }: { - sessionId: string; - onNewAccount: (accountId: string) => void; + onNewAccount: (salt: string, accountId: string, password: string) => void; }): VNode { + const { i18n } = useTranslationContext(); const Form = createNewForm<{ - email: string; password: string; + repeat: string; }>(); return ( @@ -125,24 +133,50 @@ function CreateAccount({
{ + return { + password: { + error: !v.password + ? i18n.str`required` + : v.password.length < 8 + ? i18n.str`should have at least 8 characters` + : !v.password.match(/[a-z]/) && v.password.match(/[A-Z]/) + ? i18n.str`should have lowercase and uppercase characters` + : !v.password.match(/\d/) + ? i18n.str`should have numbers` + : !v.password.match(/[^a-zA-Z\d]/) + ? i18n.str`should have at least one character which is not a number or letter` + : undefined, + }, + repeat: { + // error: !v.repeat + // ? i18n.str`required` + // // : v.repeat !== v.password + // // ? i18n.str`doesn't match` + // : undefined, + }, + }; + }} onSubmit={async (v) => { - const keys = await createNewAccount(sessionId, v.password); - onNewAccount(keys.accountId); + const keys = await createNewAccount(v.password); + onNewAccount(keys.salt, keys.accountId, v.password); }} >
-
@@ -164,17 +198,15 @@ function CreateAccount({ } function UnlockAccount({ - sessionId, - accountId, + salt, + sealedKey, onAccountUnlocked, }: { - sessionId: string; - accountId: string; + salt: string; + sealedKey: string; onAccountUnlocked: (password: string) => void; }): VNode { const Form = createNewForm<{ - sessionId: string; - accountId: string; password: string; }>(); @@ -182,34 +214,21 @@ function UnlockAccount({

- Unlock account + Account locked

+

+ Your account is normally locked anytime you reload. To unlock type + your password again. +

{ - return { - accountId: { - disabled: true, - }, - sessionId: { - disabled: true, - }, - }; - }} onSubmit={async (v) => { try { // test login - await unlockAccount(sessionId, accountId, v.password); + await unlockAccount(salt, sealedKey, v.password); onAccountUnlocked(v.password ?? ""); notifyInfo("Account unlocked" as TranslatedString); @@ -225,21 +244,6 @@ function UnlockAccount({ } }} > -
- -
-
- -
-