From 1e92093a50962f4702339e872caa4f82af90af70 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Tue, 12 Apr 2022 12:54:57 +0200 Subject: anastasis: discovery --- .../src/pages/home/SecretSelectionScreen.tsx | 100 ++++++++++++++++++++- 1 file changed, 97 insertions(+), 3 deletions(-) (limited to 'packages/anastasis-webui/src/pages') diff --git a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx index 076d205b6..84f0303fe 100644 --- a/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx +++ b/packages/anastasis-webui/src/pages/home/SecretSelectionScreen.tsx @@ -1,9 +1,10 @@ import { AuthenticationProviderStatus, AuthenticationProviderStatusOk, + PolicyMetaInfo, } from "@gnu-taler/anastasis-core"; import { h, VNode } from "preact"; -import { useState } from "preact/hooks"; +import { useEffect, useState } from "preact/hooks"; import { AsyncButton } from "../../components/AsyncButton"; import { PhoneNumberInput } from "../../components/fields/NumberInput"; import { useAnastasisContext } from "../../context/anastasis"; @@ -13,8 +14,100 @@ import { AnastasisClientFrame } from "./index"; export function SecretSelectionScreen(): VNode { const [selectingVersion, setSelectingVersion] = useState(false); const reducer = useAnastasisContext(); + const [manageProvider, setManageProvider] = useState(false); + + useEffect(() => { + async function f() { + if (reducer) { + await reducer.discoverStart(); + } + } + f().catch((e) => console.log(e)); + }, []); + + if (!reducer) { + return
no reducer in context
; + } + + if ( + !reducer.currentReducerState || + reducer.currentReducerState.recovery_state === undefined + ) { + return
invalid state
; + } + const provs = reducer.currentReducerState.authentication_providers ?? {}; + const recoveryDocument = reducer.currentReducerState.recovery_document; + + if (manageProvider) { + return setManageProvider(false)} />; + } + + if (reducer.discoveryState.state === "none") { + // Can this even happen? + return ( + +
waiting to start discovery
+
+ ); + } + + if (reducer.discoveryState.state === "active") { + return ( + +
loading secret versions
+
+ ); + } + + const policies = reducer.discoveryState.aggregatedPolicies ?? []; + + if (policies.length === 0) { + return ( + () => {}} + > + ); + } + + return ( + +

Found versions:

+ {policies.map((x) => ( +
+ {x.policy_hash} / {x.secret_name} + +
+ ))} + +
+ ); +} + +export function OldSecretSelectionScreen(): VNode { + const [selectingVersion, setSelectingVersion] = useState(false); + const reducer = useAnastasisContext(); const [manageProvider, setManageProvider] = useState(false); + + useEffect(() => { + async function f() { + if (reducer) { + await reducer.discoverStart(); + } + } + f().catch((e) => console.log(e)); + }, []); + const currentVersion = (reducer?.currentReducerState && "recovery_document" in reducer.currentReducerState && @@ -71,15 +164,16 @@ export function SecretSelectionScreen(): VNode { return setManageProvider(false)} />; } - const provierInfo = provs[ + const providerInfo = provs[ recoveryDocument.provider_url ] as AuthenticationProviderStatusOk; + return (
-

{provierInfo.business_name}

+

{providerInfo.business_name}

{currentVersion === 0 ? (

Set to recover the latest version

-- cgit v1.2.3