diff options
Diffstat (limited to 'packages/challenger-ui')
20 files changed, 150 insertions, 1162 deletions
diff --git a/packages/challenger-ui/dev.mjs b/packages/challenger-ui/dev.mjs index 595c3e99e..a6b715538 100755 --- a/packages/challenger-ui/dev.mjs +++ b/packages/challenger-ui/dev.mjs @@ -28,16 +28,6 @@ const build = initializeDev({ base: "src", files: [ "src/index.html", - "src/attempts-exhausted.html", - "src/enter-address-form.html", - "src/enter-email-form.html", - "src/enter-file-access-form.html", - "src/enter-phone-form.html", - "src/enter-tan-form.html", - "src/internal-error.html", - "src/invalid-pin.html", - "src/invalid-request.html", - "src/validation-unknown.html", ] }], }, diff --git a/packages/challenger-ui/package.json b/packages/challenger-ui/package.json index b52175b39..5166ef06d 100644 --- a/packages/challenger-ui/package.json +++ b/packages/challenger-ui/package.json @@ -1,7 +1,7 @@ { "private": true, "name": "@gnu-taler/challenger-ui", - "version": "0.12.2", + "version": "0.12.12", "author": "sebasjm", "license": "AGPL-3.0-OR-LATER", "description": "UI for GNU Challenger.", @@ -59,9 +59,6 @@ "swr": "2.0.3", "@gnu-taler/taler-util": "workspace:*", "@gnu-taler/web-util": "workspace:*", - "date-fns": "2.29.3", - "jed": "1.1.1", - "qrcode-generator": "^1.4.4", "preact": "10.11.3" } } diff --git a/packages/challenger-ui/src/Routing.tsx b/packages/challenger-ui/src/Routing.tsx index 74c1687bb..e2a4bd067 100644 --- a/packages/challenger-ui/src/Routing.tsx +++ b/packages/challenger-ui/src/Routing.tsx @@ -15,22 +15,20 @@ */ import { - Loading, urlPattern, useCurrentLocation, - useNavigationContext, + useNavigationContext } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; import { assertUnreachable } from "@gnu-taler/taler-util"; import { useErrorBoundary } from "preact/hooks"; import { CheckChallengeIsUpToDate } from "./components/CheckChallengeIsUpToDate.js"; -import { SessionId, useSessionState } from "./hooks/session.js"; +import { SessionId } from "./hooks/session.js"; import { AnswerChallenge } from "./pages/AnswerChallenge.js"; import { AskChallenge } from "./pages/AskChallenge.js"; import { CallengeCompleted } from "./pages/CallengeCompleted.js"; import { Frame } from "./pages/Frame.js"; -import { NonceNotFound } from "./pages/NonceNotFound.js"; import { Setup } from "./pages/Setup.js"; export function Routing(): VNode { @@ -73,16 +71,19 @@ export function safeToURL(s: string | undefined): URL | undefined { } function PublicRounting(): VNode { - const location = useCurrentLocation(publicPages); + const loc = useCurrentLocation(publicPages); const { navigateTo } = useNavigationContext(); - const { start } = useSessionState(); useErrorBoundary((e) => { console.log("error", e); }); - if (location === undefined) { - return <NonceNotFound />; - } + const location: typeof loc = + loc.name === undefined + ? { + ...loc, + name: "authorize", + } + : loc; switch (location.name) { case "noinfo": { @@ -91,14 +92,13 @@ function PublicRounting(): VNode { case "setup": { const secret = safeGetParam(location.params, "secret"); const redirectURL = safeToURL( - safeGetParam(location.params, "redirect_url"), + safeGetParam(location.params, "redirect_uri"), ); return ( <Setup clientId={location.values.client} secret={secret} - // redirect_url=http://exchange.taler.test:1180/kyc-proof/kyc-provider-wallet&secret=chal-secret redirectURL={redirectURL} onCreated={() => { navigateTo(publicPages.ask.url({})); @@ -109,20 +109,33 @@ function PublicRounting(): VNode { case "authorize": { const clientId = safeGetParam(location.params, "client_id"); const redirectURL = safeToURL( - safeGetParam(location.params, "redirect_url"), + safeGetParam(location.params, "redirect_uri"), ); const state = safeGetParam(location.params, "state"); + const nonce = safeGetParam(location.params, "nonce"); const sessionId: SessionId | undefined = - !clientId || !redirectURL || !state + !clientId || !redirectURL || !state || !nonce ? undefined : { clientId, - nonce: location.values.nonce, + nonce: nonce, redirectURL: redirectURL.href, state, }; + if (!sessionId) { + return ( + <div> + one of the params is missing{" "} + {JSON.stringify( + { clientId, redirectURL, state, nonce }, + undefined, + 2, + )} + </div> + ); + } return ( <CheckChallengeIsUpToDate session={sessionId} @@ -148,64 +161,112 @@ function PublicRounting(): VNode { ); }} > - <Loading /> + No nonce has been found </CheckChallengeIsUpToDate> ); } case "ask": { + const clientId = safeGetParam(location.params, "client_id"); + const redirectURL = safeToURL( + safeGetParam(location.params, "redirect_uri"), + ); + const state = safeGetParam(location.params, "state"); + const nonce = safeGetParam(location.params, "nonce"); + + const sessionId: SessionId | undefined = + !clientId || !redirectURL || !state || !nonce + ? undefined + : { + clientId, + nonce: nonce, + redirectURL: redirectURL.href, + state, + }; + + if (!sessionId) { + return ( + <div> + one of the params is missing{" "} + {JSON.stringify(sessionId, undefined, 2)} + </div> + ); + } return ( - <CheckChallengeIsUpToDate> - <AskChallenge - focus - routeSolveChallenge={publicPages.answer} - onSendSuccesful={() => { - navigateTo( - publicPages.answer.url({ - nonce: location.values.nonce, - }), - ); - }} - // onCompleted={() => { - // navigateTo( - // publicPages.completed.url({ - // nonce: location.values.nonce, - // }), - // ); - // }} - /> - </CheckChallengeIsUpToDate> + <AskChallenge + session={sessionId} + focus + routeSolveChallenge={publicPages.answer} + onSendSuccesful={() => { + navigateTo( + publicPages.answer.url({ + nonce: location.values.nonce, + }), + ); + }} + // onCompleted={() => { + // navigateTo( + // publicPages.completed.url({ + // nonce: location.values.nonce, + // }), + // ); + // }} + /> ); } case "answer": { + const clientId = safeGetParam(location.params, "client_id"); + const redirectURL = safeToURL( + safeGetParam(location.params, "redirect_uri"), + ); + const state = safeGetParam(location.params, "state"); + const nonce = safeGetParam(location.params, "nonce"); + + const sessionId: SessionId | undefined = + !clientId || !redirectURL || !state || !nonce + ? undefined + : { + clientId, + nonce: nonce, + redirectURL: redirectURL.href, + state, + }; + + if (!sessionId) { + return ( + <div> + one of the params is missing{" "} + {JSON.stringify( + { clientId, redirectURL, state, nonce }, + undefined, + 2, + )} + </div> + ); + } return ( - <CheckChallengeIsUpToDate> - <AnswerChallenge - focus - routeAsk={publicPages.ask} - onComplete={() => { - navigateTo( - publicPages.completed.url({ - nonce: location.values.nonce, - }), - ); - }} - // onCompleted={() => { - // navigateTo( - // publicPages.completed.url({ - // nonce: location.values.nonce, - // }), - // ); - // }} - /> - </CheckChallengeIsUpToDate> + <AnswerChallenge + focus + session={sessionId} + routeAsk={publicPages.ask} + onComplete={() => { + navigateTo( + publicPages.completed.url({ + nonce: location.values.nonce, + }), + ); + }} + // onCompleted={() => { + // navigateTo( + // publicPages.completed.url({ + // nonce: location.values.nonce, + // }), + // ); + // }} + /> ); } case "completed": { - return ( - <CheckChallengeIsUpToDate> - <CallengeCompleted /> - </CheckChallengeIsUpToDate> - ); + return <CallengeCompleted />; } default: assertUnreachable(location); diff --git a/packages/challenger-ui/src/attempts-exhausted.html b/packages/challenger-ui/src/attempts-exhausted.html deleted file mode 100644 index c2468b98b..000000000 --- a/packages/challenger-ui/src/attempts-exhausted.html +++ /dev/null @@ -1,88 +0,0 @@ -<!-- - This file is part of GNU Taler - (C) 2021--2022 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - - @author Sebastian Javier Marchano ---> -<!DOCTYPE html> -<html lang="en" class="h-full"> - -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width,initial-scale=1" /> - <meta name="taler-support" content="uri"> - <meta name="mobile-web-app-capable" content="yes" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> - <link rel="icon" - href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> - <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" /> - <link rel="stylesheet" href="main.css" /> - <script type="module" src="main.js"></script> - <title>Attempts exhausted (#{{ec}})</title> -</head> - -<body class="min-h-full flex flex-col"> - <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 border-indigo-400"> - <div class="flex flex-row h-16 items-center "> - <div class="flex px-2 justify-start"> - <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img class="h-8 w-auto" - src="data:image/svg+xml,<?xml version="1.0" encoding="UTF-8" standalone="no"?>%0A<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 201 90">%0A <g fill="%230042b3" fill-rule="evenodd" stroke-width=".3">%0A <path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z" />%0A <path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z" />%0A <path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z" />%0A </g>%0A <path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z" />%0A</svg>" - alt="GNU Taler" style="height: 1.5rem; margin: 0.5rem;"></a></div><span - class="flex items-center text-white text-lg font-bold ml-4">Challenger</span> - </div> - <div class="block flex-1 ml-6 "></div> - <div class="flex justify-end"> - </div> - </div> - </header> - - <main class="flex-1"> - <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 items-center mt-4"> - <div class="rounded-md bg-red-50 p-4 shadow-xl"> - <div class="flex"> - <div class="flex-shrink-0"> - <svg xmlns="http://www.w3.org/2000/svg" stroke="none" viewBox="0 0 24 24" fill="currentColor" - class="w-8 h-8 text-red-400"> - <path fill-rule="evenodd" - d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z" /> - </svg> - </div> - <div class="ml-3"> - <h3 class="text-sm font-medium text-red-800"> - You have tried too many times - </h3> - <div class="mt-2 text-sm text-red-700"> - <p>More attempts are not allowed</p> - </div> - </div> - </div> - </div> - </div> - </main> - - <footer class="bottom-4 mb-4"> - <div class="mt-8 mx-8 md:order-1 md:mt-0"> - <div> - <p class="text-xs leading-5 text-gray-400">Learn more about <a target="_blank" rel="noreferrer noopener" - class="font-semibold text-gray-500 hover:text-gray-400" href="https://taler.net">GNU Taler</a></p> - </div> - <div style="flex-grow: 1;"></div> - <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler Systems SA. </p> - </div> - </footer> - -</body> - -</html>
\ No newline at end of file diff --git a/packages/challenger-ui/src/components/CheckChallengeIsUpToDate.tsx b/packages/challenger-ui/src/components/CheckChallengeIsUpToDate.tsx index 8ceb969b5..fecb36cbb 100644 --- a/packages/challenger-ui/src/components/CheckChallengeIsUpToDate.tsx +++ b/packages/challenger-ui/src/components/CheckChallengeIsUpToDate.tsx @@ -28,7 +28,7 @@ import { useChallengeSession } from "../hooks/challenge.js"; import { SessionId, useSessionState } from "../hooks/session.js"; interface Props { - session?: SessionId | undefined; + session: SessionId; children: ComponentChildren; onCompleted?: () => void; onChangeLeft?: () => void; @@ -44,9 +44,7 @@ export function CheckChallengeIsUpToDate({ const { state } = useSessionState(); const { i18n } = useTranslationContext(); - const id = session ?? state; - - const result = useChallengeSession(id); + const result = useChallengeSession(session); if (!result) { return <Loading />; @@ -103,7 +101,7 @@ export function CheckChallengeIsUpToDate({ </Attention> <div class="mt-2"> - <a href={id?.redirectURL ?? ""}>{id?.redirectURL}</a> + <a href={session.redirectURL ?? ""}>{session.redirectURL}</a> </div> </Fragment> ); diff --git a/packages/challenger-ui/src/enter-address-form.html b/packages/challenger-ui/src/enter-address-form.html deleted file mode 100644 index 76b4d2262..000000000 --- a/packages/challenger-ui/src/enter-address-form.html +++ /dev/null @@ -1,133 +0,0 @@ -<!-- - This file is part of GNU Taler - (C) 2021--2023 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - - @author Sebastian Javier Marchano ---> -<!DOCTYPE html> -<html lang="en" class="h-full"> - -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width,initial-scale=1" /> - <meta name="taler-support" content="uri"> - <meta name="mobile-web-app-capable" content="yes" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> - <link rel="icon" - href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> - <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" /> - <link rel="stylesheet" href="main.css" /> - <script type="module" src="main.js"></script> - <title>Enter contact details</title> -</head> - -<body class="min-h-full flex flex-col"> - <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 border-indigo-400"> - <div class="flex flex-row h-16 items-center "> - <div class="flex px-2 justify-start"> - <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img class="h-8 w-auto" - src="data:image/svg+xml,<?xml version="1.0" encoding="UTF-8" standalone="no"?>%0A<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 201 90">%0A <g fill="%230042b3" fill-rule="evenodd" stroke-width=".3">%0A <path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z" />%0A <path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z" />%0A <path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z" />%0A </g>%0A <path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z" />%0A</svg>" - alt="GNU Taler" style="height: 1.5rem; margin: 0.5rem;"></a></div><span - class="flex items-center text-white text-lg font-bold ml-4">Challenger</span> - </div> - <div class="block flex-1 ml-6 "></div> - <div class="flex justify-end"> - </div> - </div> - </header> - - <main class="flex-1"> - - <div class="isolate bg-white px-6 py-12"> - <div class="mx-auto max-w-2xl text-center"> - <h2 class="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl"> - Enter contact details - </h2> - <p class="mt-2 text-lg leading-8 text-gray-600"> - You will receive a letter with a TAN code that must be provided on the next page. - </p> - </div> - <form action="/challenge/{{nonce}}" method="POST" class="mx-auto mt-16 max-w-xl sm:mt-20"> - <div class="grid grid-cols-1 gap-x-8 gap-y-6"> - <div class="sm:col-span-2"> - <label for="address" class="block text-sm font-semibold leading-6 text-gray-900"> - Street address - </label> - <div class="mt-2.5"> - <textarea name="address" id="address" rows="3" autocomplete="shipping street-address" - class="block w-full rounded-md border-0 py-1.5 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"></textarea> - - </div> - </div> - - <div class="sm:col-span-2"> - <label for="city" class="block text-sm font-semibold leading-6 text-gray-900"> - City - </label> - <div class="mt-2.5"> - <input type="text" name="city" id="city" maxlength="512" autocomplete="address-level2" - class="block w-full rounded-md border-0 px-3.5 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"> - </div> - </div> - - <div class="sm:col-span-2"> - <label for="postal-code" class="block text-sm font-semibold leading-6 text-gray-900"> - Postal code - </label> - <div class="mt-2.5"> - <input type="text" name="postal-code" id="postal-code" maxlength="512" autocomplete="postal-code" - class="block w-full rounded-md border-0 px-3.5 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"> - </div> - </div> - - <div class="sm:col-span-2"> - <label for="country" class="block text-sm font-semibold leading-6 text-gray-900"> - Country - </label> - <div class="mt-2.5"> - <input type="text" name="country" id="country" maxlength="512" autocomplete="country" - class="block w-full rounded-md border-0 px-3.5 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"> - </div> - </div> - - <p class="mt-3 text-sm leading-6 text-gray-400"> - You can change address another {{changes_left}} times. - </p> - </div> - - <div class="mt-10"> - <button type="submit" - class="block w-full rounded-md bg-indigo-600 px-3.5 py-2.5 text-center text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"> - Send mail - </button> - </div> - </form> - </div> - </main> - - - <footer class="bottom-4 mb-4"> - <div class="mt-8 mx-8 md:order-1 md:mt-0"> - <div> - <p class="text-xs leading-5 text-gray-400">Learn more about <a target="_blank" rel="noreferrer noopener" - class="font-semibold text-gray-500 hover:text-gray-400" href="https://taler.net">GNU Taler</a></p> - </div> - <div style="flex-grow: 1;"></div> - <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler Systems SA. </p> - </div> - </footer> -</body> - -</html> diff --git a/packages/challenger-ui/src/enter-email-form.html b/packages/challenger-ui/src/enter-email-form.html deleted file mode 100644 index 3b8720244..000000000 --- a/packages/challenger-ui/src/enter-email-form.html +++ /dev/null @@ -1,127 +0,0 @@ -<!-- - This file is part of GNU Taler - (C) 2021--2022 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - - @author Sebastian Javier Marchano ---> -<!DOCTYPE html> -<html lang="en" class="h-full"> - -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width,initial-scale=1" /> - <meta name="taler-support" content="uri"> - <meta name="mobile-web-app-capable" content="yes" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> - <link rel="icon" - href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> - <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" /> - <link rel="stylesheet" href="main.css" /> - <script type="module" src="main.js"></script> - <title>Enter contact details</title> -</head> - -<body class="min-h-full flex flex-col"> - <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 border-indigo-400"> - <div class="flex flex-row h-16 items-center "> - <div class="flex px-2 justify-start"> - <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img class="h-8 w-auto" - src="data:image/svg+xml,<?xml version="1.0" encoding="UTF-8" standalone="no"?>%0A<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 201 90">%0A <g fill="%230042b3" fill-rule="evenodd" stroke-width=".3">%0A <path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z" />%0A <path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z" />%0A <path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z" />%0A </g>%0A <path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z" />%0A</svg>" - alt="GNU Taler" style="height: 1.5rem; margin: 0.5rem;"></a></div><span - class="flex items-center text-white text-lg font-bold ml-4">Challenger</span> - </div> - <div class="block flex-1 ml-6 "></div> - <div class="flex justify-end"> - </div> - </div> - </header> - - <main class="flex-1"> - - <div class="isolate bg-white px-6 py-12"> - <div class="mx-auto max-w-2xl text-center"> - <h2 class="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl"> - Enter contact details - </h2> - <p class="mt-2 text-lg leading-8 text-gray-600"> - You will receive an email with a TAN code that must be provided on the next page. - </p> - </div> - <form action="/challenge/{{nonce}}" method="POST" class="mx-auto mt-16 max-w-xl sm:mt-20"> - <div class="grid grid-cols-1 gap-x-8 gap-y-6"> - <div class="sm:col-span-2"> - <label for="email" class="block text-sm font-semibold leading-6 text-gray-900"> - Email - </label> - <div class="mt-2.5"> - <input type="email" name="email" id="email" maxlength="512" autocomplete="email" value="{{last_address}}" - {{#fixed_address}}readonly{{/fixed_address}} - class="block w-full rounded-md border-0 px-3.5 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"> - </div> - </div> - - <script> - function check() { - var email = document.getElementById('email'); - var emailRepeat = document.getElementById('repeat-email'); - - if (email.value != emailRepeat.value) { - emailRepeat.setCustomValidity('The two email addresses must match.'); - } else { - // input is valid -- reset the error message - emailRepeat.setCustomValidity(''); - } - } - </script> - - <div class="sm:col-span-2"> - <label for="repeat-email" class="block text-sm font-semibold leading-6 text-gray-900"> - Repeat email - </label> - <div class="mt-2.5"> - <input oninput="check(this)" type="email" name="repeat-email" id="repeat-email" autocomplete="email" - class="block w-full rounded-md border-0 px-3.5 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"> - </div> - </div> - - <p class="mt-3 text-sm leading-6 text-gray-400"> - You can change your email address another {{changes_left}} times. - </p> - </div> - - <div class="mt-10"> - <button type="submit" - class="block w-full rounded-md bg-indigo-600 px-3.5 py-2.5 text-center text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"> - Send email - </button> - </div> - </form> - </div> - </main> - - - <footer class="bottom-4 mb-4"> - <div class="mt-8 mx-8 md:order-1 md:mt-0"> - <div> - <p class="text-xs leading-5 text-gray-400">Learn more about <a target="_blank" rel="noreferrer noopener" - class="font-semibold text-gray-500 hover:text-gray-400" href="https://taler.net">GNU Taler</a></p> - </div> - <div style="flex-grow: 1;"></div> - <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler Systems SA. </p> - </div> - </footer> -</body> - -</html> diff --git a/packages/challenger-ui/src/enter-file-access-form.html b/packages/challenger-ui/src/enter-file-access-form.html deleted file mode 100644 index b79d1dada..000000000 --- a/packages/challenger-ui/src/enter-file-access-form.html +++ /dev/null @@ -1,102 +0,0 @@ -<!-- - This file is part of GNU Taler - (C) 2021--2023 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - - @author Sebastian Javier Marchano ---> -<!DOCTYPE html> -<html lang="en" class="h-full"> - -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width,initial-scale=1" /> - <meta name="taler-support" content="uri"> - <meta name="mobile-web-app-capable" content="yes" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> - <link rel="icon" - href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> - <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" /> - <link rel="stylesheet" href="main.css" /> - <script type="module" src="main.js"></script> - <title>Enter local file name</title> -</head> - -<body class="min-h-full flex flex-col"> - <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 border-indigo-400"> - <div class="flex flex-row h-16 items-center "> - <div class="flex px-2 justify-start"> - <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img class="h-8 w-auto" - src="data:image/svg+xml,<?xml version="1.0" encoding="UTF-8" standalone="no"?>%0A<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 201 90">%0A <g fill="%230042b3" fill-rule="evenodd" stroke-width=".3">%0A <path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z" />%0A <path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z" />%0A <path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z" />%0A </g>%0A <path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z" />%0A</svg>" - alt="GNU Taler" style="height: 1.5rem; margin: 0.5rem;"></a></div><span - class="flex items-center text-white text-lg font-bold ml-4">Challenger</span> - </div> - <div class="block flex-1 ml-6 "></div> - <div class="flex justify-end"> - </div> - </div> - </header> - - <main class="flex-1"> - - <div class="isolate bg-white px-6 py-12"> - <div class="mx-auto max-w-2xl text-center"> - <h2 class="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl"> - Enter file name - </h2> - <p class="mt-2 text-lg leading-8 text-gray-600"> - The file will be overwritten with a code which need to be entered in the next page. - </p> - </div> - <form action="/challenge/{{nonce}}" method="POST" class="mx-auto mt-16 max-w-xl sm:mt-20"> - <div class="grid grid-cols-1 gap-x-8 gap-y-6"> - <div class="sm:col-span-2"> - <label for="phone" class="block text-sm font-semibold leading-6 text-gray-900"> - Phone number - </label> - <div class="mt-2.5"> - <input type="filename" name="filename" id="filename" maxlength="200" - class="block w-full rounded-md border-0 px-3.5 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"> - </div> - </div> - - <p class="mt-3 text-sm leading-6 text-gray-400"> - You can change the filename another {{changes_left}} times. - </p> - </div> - - <div class="mt-10"> - <button type="submit" - class="block w-full rounded-md bg-indigo-600 px-3.5 py-2.5 text-center text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"> - Write file - </button> - </div> - </form> - </div> - </main> - - - <footer class="bottom-4 mb-4"> - <div class="mt-8 mx-8 md:order-1 md:mt-0"> - <div> - <p class="text-xs leading-5 text-gray-400">Learn more about <a target="_blank" rel="noreferrer noopener" - class="font-semibold text-gray-500 hover:text-gray-400" href="https://taler.net">GNU Taler</a></p> - </div> - <div style="flex-grow: 1;"></div> - <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler Systems SA. </p> - </div> - </footer> -</body> - -</html> diff --git a/packages/challenger-ui/src/enter-phone-form.html b/packages/challenger-ui/src/enter-phone-form.html deleted file mode 100644 index ca06fb94e..000000000 --- a/packages/challenger-ui/src/enter-phone-form.html +++ /dev/null @@ -1,126 +0,0 @@ -<!-- - This file is part of GNU Taler - (C) 2021--2023 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - - @author Sebastian Javier Marchano ---> -<!DOCTYPE html> -<html lang="en" class="h-full"> - -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width,initial-scale=1" /> - <meta name="taler-support" content="uri"> - <meta name="mobile-web-app-capable" content="yes" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> - <link rel="icon" - href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> - <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" /> - <link rel="stylesheet" href="main.css" /> - <script type="module" src="main.js"></script> - <title>Enter contact details</title> -</head> - -<body class="min-h-full flex flex-col"> - <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 border-indigo-400"> - <div class="flex flex-row h-16 items-center "> - <div class="flex px-2 justify-start"> - <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img class="h-8 w-auto" - src="data:image/svg+xml,<?xml version="1.0" encoding="UTF-8" standalone="no"?>%0A<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 201 90">%0A <g fill="%230042b3" fill-rule="evenodd" stroke-width=".3">%0A <path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z" />%0A <path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z" />%0A <path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z" />%0A </g>%0A <path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z" />%0A</svg>" - alt="GNU Taler" style="height: 1.5rem; margin: 0.5rem;"></a></div><span - class="flex items-center text-white text-lg font-bold ml-4">Challenger</span> - </div> - <div class="block flex-1 ml-6 "></div> - <div class="flex justify-end"> - </div> - </div> - </header> - - <main class="flex-1"> - - <div class="isolate bg-white px-6 py-12"> - <div class="mx-auto max-w-2xl text-center"> - <h2 class="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl"> - Enter contact details - </h2> - <p class="mt-2 text-lg leading-8 text-gray-600"> - You will receive an SMS with a TAN code that must be provided on the next page. - </p> - </div> - <form action="/challenge/{{nonce}}" method="POST" class="mx-auto mt-16 max-w-xl sm:mt-20"> - <div class="grid grid-cols-1 gap-x-8 gap-y-6"> - <div class="sm:col-span-2"> - <label for="phone" class="block text-sm font-semibold leading-6 text-gray-900"> - Phone number - </label> - <div class="mt-2.5"> - <input type="phone" name="phone" id="phone" maxlength="20" autocomplete="tel" - class="block w-full rounded-md border-0 px-3.5 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"> - </div> - </div> - - <script> - function check() { - var phone = document.getElementById('phone'); - var phoneRepeat = document.getElementById('repeat-phone'); - - if (phone.value != phoneRepeat.value) { - phoneRepeat.setCustomValidity('The two phone numbers must match.'); - } else { - // input is valid -- reset the error message - phoneRepeat.setCustomValidity(''); - } - } - </script> - - <div class="sm:col-span-2"> - <label for="repeat-phone" class="block text-sm font-semibold leading-6 text-gray-900"> - Repeat phone - </label> - <div class="mt-2.5"> - <input oninput="check(this)" type="number" name="repeat-phone" id="repeat-phone" autocomplete="tel" - class="block w-full rounded-md border-0 px-3.5 py-2 text-gray-900 shadow-sm ring-1 ring-inset ring-gray-300 placeholder:text-gray-400 focus:ring-2 focus:ring-inset focus:ring-indigo-600 sm:text-sm sm:leading-6"> - </div> - </div> - - <p class="mt-3 text-sm leading-6 text-gray-400"> - You can change your phone number another {{changes_left}} times. - </p> - </div> - - <div class="mt-10"> - <button type="submit" - class="block w-full rounded-md bg-indigo-600 px-3.5 py-2.5 text-center text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"> - Send SMS - </button> - </div> - </form> - </div> - </main> - - - <footer class="bottom-4 mb-4"> - <div class="mt-8 mx-8 md:order-1 md:mt-0"> - <div> - <p class="text-xs leading-5 text-gray-400">Learn more about <a target="_blank" rel="noreferrer noopener" - class="font-semibold text-gray-500 hover:text-gray-400" href="https://taler.net">GNU Taler</a></p> - </div> - <div style="flex-grow: 1;"></div> - <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler Systems SA. </p> - </div> - </footer> -</body> - -</html> diff --git a/packages/challenger-ui/src/enter-tan-form.html b/packages/challenger-ui/src/enter-tan-form.html deleted file mode 100644 index 965f8e9d2..000000000 --- a/packages/challenger-ui/src/enter-tan-form.html +++ /dev/null @@ -1,117 +0,0 @@ -<!-- - This file is part of GNU Taler - (C) 2021--2022 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - - @author Sebastian Javier Marchano ---> -<!DOCTYPE html> -<html lang="en" class="h-full"> - -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width,initial-scale=1" /> - <meta name="taler-support" content="uri"> - <meta name="mobile-web-app-capable" content="yes" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> - <link rel="icon" - href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> - <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" /> - <link rel="stylesheet" href="main.css" /> - <script type="module" src="main.js"></script> - <title>Enter your TAN</title> -</head> - -<body class="min-h-full flex flex-col"> - <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 border-indigo-400"> - <div class="flex flex-row h-16 items-center "> - <div class="flex px-2 justify-start"> - <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img class="h-8 w-auto" - src="data:image/svg+xml,<?xml version="1.0" encoding="UTF-8" standalone="no"?>%0A<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 201 90">%0A <g fill="%230042b3" fill-rule="evenodd" stroke-width=".3">%0A <path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z" />%0A <path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z" />%0A <path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z" />%0A </g>%0A <path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z" />%0A</svg>" - alt="GNU Taler" style="height: 1.5rem; margin: 0.5rem;"></a></div><span - class="flex items-center text-white text-lg font-bold ml-4">Challenger</span> - </div> - <div class="block flex-1 ml-6 "></div> - <div class="flex justify-end"> - </div> - </div> - </header> - - <main class="flex-1"> - - <div class="isolate bg-white px-6 py-12"> - <div class="mx-auto max-w-2xl text-center"> - <h2 class="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl"> - Please enter the TAN you received to authenticate. - </h2> - <p class="mt-2 text-lg leading-8 text-gray-600"> - <!-- {{#transmitted}} - A TAN was sent to your address "{{address}}". - {{/transmitted}} --> - <!-- {{^transmitted}} --> - We recently already sent a TAN to your address "{{address}}". - A new TAN will not be transmitted again before {{next_tx_time}}. - <!-- {{/transmitted}} --> - </p> - </div> - - - <form action="/solve/{{nonce}}" method="POST" class="mx-auto mt-16 max-w-xl sm:mt-20"> - <div class="grid grid-cols-1 gap-x-8 gap-y-6"> - <div class="sm:col-span-2"> - <label for="pin" class="block text-sm font-semibold leading-6 text-gray-900"> - TAN code - </label> - <div class="mt-2.5"> - <div - class="flex rounded-md shadow-sm ring-1 ring-inset ring-gray-300 focus-within:ring-2 focus-within:ring-inset focus-within:ring-indigo-600"> - <span class="flex select-none items-center pl-3 text-gray-500 sm:text-sm">TAN:</span> - <input type="number" name="pin" id="pin" maxlength="64" - class="block flex-1 border-0 bg-transparent py-1.5 pl-1 text-gray-900 placeholder:text-gray-400 focus:ring-0 sm:text-sm sm:leading-6" - placeholder="12345678"> - </div> - - </div> - </div> - - <p class="mt-3 text-sm leading-6 text-gray-400"> - You have {{attempts_left}} attempts left. - </p> - </div> - - <div class="mt-10"> - <button type="submit" - class="block w-full rounded-md bg-indigo-600 px-3.5 py-2.5 text-center text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600"> - Check - </button> - </div> - </form> - - </div> - </main> - - <footer class="bottom-4 mb-4"> - <div class="mt-8 mx-8 md:order-1 md:mt-0"> - <div> - <p class="text-xs leading-5 text-gray-400">Learn more about <a target="_blank" rel="noreferrer noopener" - class="font-semibold text-gray-500 hover:text-gray-400" href="https://taler.net">GNU Taler</a></p> - </div> - <div style="flex-grow: 1;"></div> - <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler Systems SA. </p> - </div> - </footer> - -</body> - -</html> diff --git a/packages/challenger-ui/src/hooks/challenge.ts b/packages/challenger-ui/src/hooks/challenge.ts index 4a641aa26..81cceec3f 100644 --- a/packages/challenger-ui/src/hooks/challenge.ts +++ b/packages/challenger-ui/src/hooks/challenge.ts @@ -30,7 +30,7 @@ export function revalidateChallengeSession() { ); } -export function useChallengeSession(session: SessionId | undefined) { +export function useChallengeSession(session: SessionId) { const { lib: { challenger: api }, } = useChallengerApiContext(); diff --git a/packages/challenger-ui/src/hooks/session.ts b/packages/challenger-ui/src/hooks/session.ts index 2c466147f..a808697ea 100644 --- a/packages/challenger-ui/src/hooks/session.ts +++ b/packages/challenger-ui/src/hooks/session.ts @@ -16,15 +16,15 @@ import { AbsoluteTime, + ChallengerApi, Codec, buildCodecForObject, codecForAbsoluteTime, codecForAny, + codecForList, codecForString, codecForStringURL, codecOptional, - ChallengerApi, - codecForList, } from "@gnu-taler/taler-util"; import { buildStorageKey, useLocalStorage } from "@gnu-taler/web-util/browser"; @@ -53,7 +53,7 @@ interface LastAddress { savedAt: AbsoluteTime; } -export type SessionState = SessionId & { +export type SessionState = { completedURL: string | undefined; lastAddress: Array<LastAddress> | undefined; }; @@ -66,10 +66,6 @@ export const codecForLastAddress = (): Codec<LastAddress> => export const codecForSessionState = (): Codec<SessionState> => buildCodecForObject<SessionState>() - .property("nonce", codecForString()) - .property("clientId", codecForString()) - .property("redirectURL", codecForStringURL()) - .property("state", codecForString()) .property("completedURL", codecOptional(codecForStringURL())) .property("lastAddress", codecOptional(codecForList(codecForLastAddress()))) .build("SessionState"); @@ -99,9 +95,8 @@ export function useSessionState(): SessionStateHandler { return { state, - start(info) { + start() { update({ - ...info, completedURL: undefined, lastAddress: state?.lastAddress ?? [], }); diff --git a/packages/challenger-ui/src/i18n/challenger-ui.pot b/packages/challenger-ui/src/i18n/challenger-ui.pot index 5d2497acf..c1501192f 100644 --- a/packages/challenger-ui/src/i18n/challenger-ui.pot +++ b/packages/challenger-ui/src/i18n/challenger-ui.pot @@ -15,7 +15,7 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: Taler Bank\n" +"Project-Id-Version: Challenger\n" "Report-Msgid-Bugs-To: taler@gnu.org\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" diff --git a/packages/challenger-ui/src/internal-error.html b/packages/challenger-ui/src/internal-error.html deleted file mode 100644 index 521a2b69e..000000000 --- a/packages/challenger-ui/src/internal-error.html +++ /dev/null @@ -1,89 +0,0 @@ -<!-- - This file is part of GNU Taler - (C) 2021--2022 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - - @author Sebastian Javier Marchano ---> -<!DOCTYPE html> -<html lang="en" class="h-full"> - -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width,initial-scale=1" /> - <meta name="taler-support" content="uri"> - <meta name="mobile-web-app-capable" content="yes" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> - <link rel="icon" - href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> - <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" /> - <link rel="stylesheet" href="main.css" /> - <script type="module" src="main.js"></script> - <title>Internal server error (#{{ec}})</title> -</head> - -<body class="min-h-full flex flex-col"> - <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 border-indigo-400"> - <div class="flex flex-row h-16 items-center "> - <div class="flex px-2 justify-start"> - <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img class="h-8 w-auto" - src="data:image/svg+xml,<?xml version="1.0" encoding="UTF-8" standalone="no"?>%0A<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 201 90">%0A <g fill="%230042b3" fill-rule="evenodd" stroke-width=".3">%0A <path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z" />%0A <path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z" />%0A <path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z" />%0A </g>%0A <path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z" />%0A</svg>" - alt="GNU Taler" style="height: 1.5rem; margin: 0.5rem;"></a></div><span - class="flex items-center text-white text-lg font-bold ml-4">Challenger</span> - </div> - <div class="block flex-1 ml-6 "></div> - <div class="flex justify-end"> - </div> - </div> - </header> - - <main class="flex-1"> - <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 items-center mt-4"> - <div class="rounded-md bg-red-50 p-4 shadow-xl"> - <div class="flex"> - <div class="flex-shrink-0"> - <svg xmlns="http://www.w3.org/2000/svg" stroke="none" viewBox="0 0 24 24" fill="currentColor" - class="w-8 h-8 text-red-400"> - <path fill-rule="evenodd" - d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z" /> - </svg> - </div> - <div class="ml-3"> - <h3 class="text-sm font-medium text-red-800"> - Internal error - </h3> - <div class="mt-2 text-sm text-red-700"> - <p>{{hint}} ({{detail}})</p> - </div> - </div> - </div> - </div> - </div> - - </main> - - <footer class="bottom-4 mb-4"> - <div class="mt-8 mx-8 md:order-1 md:mt-0"> - <div> - <p class="text-xs leading-5 text-gray-400">Learn more about <a target="_blank" rel="noreferrer noopener" - class="font-semibold text-gray-500 hover:text-gray-400" href="https://taler.net">GNU Taler</a></p> - </div> - <div style="flex-grow: 1;"></div> - <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler Systems SA. </p> - </div> - </footer> - -</body> - -</html>
\ No newline at end of file diff --git a/packages/challenger-ui/src/invalid-pin.html b/packages/challenger-ui/src/invalid-pin.html deleted file mode 100644 index 1229b8095..000000000 --- a/packages/challenger-ui/src/invalid-pin.html +++ /dev/null @@ -1,87 +0,0 @@ -<!-- - This file is part of GNU Taler - (C) 2021--2022 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - - @author Sebastian Javier Marchano ---> -<!DOCTYPE html> -<html lang="en" class="h-full"> - -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width,initial-scale=1" /> - <meta name="taler-support" content="uri"> - <meta name="mobile-web-app-capable" content="yes" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> - <link rel="icon" - href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> - <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" /> - <link rel="stylesheet" href="main.css" /> - <script type="module" src="main.js"></script> - <title>Invalid solution (#{{ec}})</title> -</head> - -<body class="min-h-full flex flex-col"> - <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 border-indigo-400"> - <div class="flex flex-row h-16 items-center "> - <div class="flex px-2 justify-start"> - <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img class="h-8 w-auto" - src="data:image/svg+xml,<?xml version="1.0" encoding="UTF-8" standalone="no"?>%0A<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 201 90">%0A <g fill="%230042b3" fill-rule="evenodd" stroke-width=".3">%0A <path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z" />%0A <path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z" />%0A <path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z" />%0A </g>%0A <path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z" />%0A</svg>" - alt="GNU Taler" style="height: 1.5rem; margin: 0.5rem;"></a></div><span - class="flex items-center text-white text-lg font-bold ml-4">Challenger</span> - </div> - <div class="block flex-1 ml-6 "></div> - <div class="flex justify-end"> - </div> - </div> - </header> - - <main class="flex-1"> - <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 items-center mt-4"> - <div class="rounded-md bg-red-50 p-4 shadow-xl"> - <div class="flex"> - <div class="flex-shrink-0"> - <svg xmlns="http://www.w3.org/2000/svg" stroke="none" viewBox="0 0 24 24" fill="currentColor" - class="w-8 h-8 text-red-400"> - <path fill-rule="evenodd" - d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z" /> - </svg> - </div> - <div class="ml-3"> - <h3 class="text-sm font-medium text-red-800"> - Invalid PIN - </h3> - <div class="mt-2 text-sm text-red-700"> - <p>{{hint}}</p> - </div> - </div> - </div> - </div> - </div> - </main> - - <footer class="bottom-4 mb-4"> - <div class="mt-8 mx-8 md:order-1 md:mt-0"> - <div> - <p class="text-xs leading-5 text-gray-400">Learn more about <a target="_blank" rel="noreferrer noopener" - class="font-semibold text-gray-500 hover:text-gray-400" href="https://taler.net">GNU Taler</a></p> - </div> - <div style="flex-grow: 1;"></div> - <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler Systems SA. </p> - </div> - </footer> -</body> - -</html>
\ No newline at end of file diff --git a/packages/challenger-ui/src/invalid-request.html b/packages/challenger-ui/src/invalid-request.html deleted file mode 100644 index 89e6b125c..000000000 --- a/packages/challenger-ui/src/invalid-request.html +++ /dev/null @@ -1,88 +0,0 @@ -<!-- - This file is part of GNU Taler - (C) 2021--2022 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - - @author Sebastian Javier Marchano ---> -<!DOCTYPE html> -<html lang="en" class="h-full"> - -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width,initial-scale=1" /> - <meta name="taler-support" content="uri"> - <meta name="mobile-web-app-capable" content="yes" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> - <link rel="icon" - href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> - <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" /> - <link rel="stylesheet" href="main.css" /> - <script type="module" src="main.js"></script> - <title>Invalid request (#{{ec}})</title> -</head> - -<body class="min-h-full flex flex-col"> - <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 border-indigo-400"> - <div class="flex flex-row h-16 items-center "> - <div class="flex px-2 justify-start"> - <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img class="h-8 w-auto" - src="data:image/svg+xml,<?xml version="1.0" encoding="UTF-8" standalone="no"?>%0A<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 201 90">%0A <g fill="%230042b3" fill-rule="evenodd" stroke-width=".3">%0A <path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z" />%0A <path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z" />%0A <path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z" />%0A </g>%0A <path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z" />%0A</svg>" - alt="GNU Taler" style="height: 1.5rem; margin: 0.5rem;"></a></div><span - class="flex items-center text-white text-lg font-bold ml-4">Challenger</span> - </div> - <div class="block flex-1 ml-6 "></div> - <div class="flex justify-end"> - </div> - </div> - </header> - - <main class="flex-1"> - - <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 items-center mt-4"> - <div class="rounded-md bg-red-50 p-4 shadow-xl"> - <div class="flex"> - <div class="flex-shrink-0"> - <svg xmlns="http://www.w3.org/2000/svg" stroke="none" viewBox="0 0 24 24" fill="currentColor" - class="w-8 h-8 text-red-400"> - <path fill-rule="evenodd" - d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z" /> - </svg> - </div> - <div class="ml-3"> - <h3 class="text-sm font-medium text-red-800"> - Request error - </h3> - <div class="mt-2 text-sm text-red-700"> - <p>{{hint}}</p> - </div> - </div> - </div> - </div> - </div> - </main> - - <footer class="bottom-4 mb-4"> - <div class="mt-8 mx-8 md:order-1 md:mt-0"> - <div> - <p class="text-xs leading-5 text-gray-400">Learn more about <a target="_blank" rel="noreferrer noopener" - class="font-semibold text-gray-500 hover:text-gray-400" href="https://taler.net">GNU Taler</a></p> - </div> - <div style="flex-grow: 1;"></div> - <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler Systems SA. </p> - </div> - </footer> -</body> - -</html>
\ No newline at end of file diff --git a/packages/challenger-ui/src/pages/AnswerChallenge.tsx b/packages/challenger-ui/src/pages/AnswerChallenge.tsx index 13ae16a33..48f4db477 100644 --- a/packages/challenger-ui/src/pages/AnswerChallenge.tsx +++ b/packages/challenger-ui/src/pages/AnswerChallenge.tsx @@ -37,10 +37,11 @@ import { revalidateChallengeSession, useChallengeSession, } from "../hooks/challenge.js"; -import { useSessionState } from "../hooks/session.js"; +import { SessionId, useSessionState } from "../hooks/session.js"; type Props = { focus?: boolean; + session: SessionId, onComplete: () => void; routeAsk: RouteDefinition<EmptyObject>; }; @@ -63,10 +64,10 @@ function useReloadOnDeadline(deadline: AbsoluteTime): void { }, [deadline]); } -export function AnswerChallenge({ focus, onComplete, routeAsk }: Props): VNode { +export function AnswerChallenge({ session, focus, onComplete, routeAsk }: Props): VNode { const { config, lib } = useChallengerApiContext(); const { i18n } = useTranslationContext(); - const { state, sent, failed, completed } = useSessionState(); + const { sent, failed, completed } = useSessionState(); const [notification, withErrorHandler] = useLocalNotificationHandler(); const [pin, setPin] = useState<string | undefined>(); const errors = undefinedIfEmpty({ @@ -80,7 +81,7 @@ export function AnswerChallenge({ focus, onComplete, routeAsk }: Props): VNode { ? undefined : restrictionKeys[0]; - const result = useChallengeSession(state); + const result = useChallengeSession(session); const lastStatus = result && !(result instanceof TalerError) && result.type !== "fail" @@ -110,7 +111,6 @@ export function AnswerChallenge({ focus, onComplete, routeAsk }: Props): VNode { const contact = lastAddr ? { [restrictionKey]: lastAddr } : undefined; const onSendAgain = - !state?.nonce || contact === undefined || lastStatus == undefined || lastStatus.pin_transmissions_left === 0 || @@ -119,7 +119,7 @@ export function AnswerChallenge({ focus, onComplete, routeAsk }: Props): VNode { ? undefined : withErrorHandler( async () => { - return await lib.challenger.challenge(state.nonce, contact); + return await lib.challenger.challenge(session.nonce, contact); }, (ok) => { if (ok.body.type === "completed") { @@ -145,14 +145,13 @@ export function AnswerChallenge({ focus, onComplete, routeAsk }: Props): VNode { ); const onCheck = - !state?.nonce || errors !== undefined || lastStatus == undefined || lastStatus.auth_attempts_left === 0 ? undefined : withErrorHandler( async () => { - return lib.challenger.solve(state.nonce, { pin: pin! }); + return lib.challenger.solve(session.nonce, { pin: pin! }); }, (ok) => { if (ok.body.type === "completed") { diff --git a/packages/challenger-ui/src/pages/AskChallenge.tsx b/packages/challenger-ui/src/pages/AskChallenge.tsx index 9f4eb9ee5..f034a773b 100644 --- a/packages/challenger-ui/src/pages/AskChallenge.tsx +++ b/packages/challenger-ui/src/pages/AskChallenge.tsx @@ -14,11 +14,10 @@ GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ import { - AbsoluteTime, EmptyObject, HttpStatusCode, TalerError, - TranslatedString, + TranslatedString } from "@gnu-taler/taler-util"; import { Attention, @@ -33,14 +32,15 @@ import { } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; import { useState } from "preact/hooks"; -import { useSessionState } from "../hooks/session.js"; -import { doAutoFocus } from "./AnswerChallenge.js"; import { useChallengeSession } from "../hooks/challenge.js"; +import { SessionId, useSessionState } from "../hooks/session.js"; +import { doAutoFocus } from "./AnswerChallenge.js"; export const EMAIL_REGEX = /^[\w-.]+@([\w-]+\.)+[\w-]{2,4}$/; type Props = { onSendSuccesful: () => void; + session: SessionId; routeSolveChallenge: RouteDefinition<EmptyObject>; focus?: boolean; }; @@ -48,6 +48,7 @@ type Props = { export function AskChallenge({ onSendSuccesful, routeSolveChallenge, + session, focus, }: Props): VNode { const { state, sent, saveAddress, completed } = useSessionState(); @@ -67,7 +68,7 @@ export function AskChallenge({ ? undefined : restrictionKeys[0]; - const result = useChallengeSession(state); + const result = useChallengeSession(session); if (!restrictionKey) { return ( @@ -117,11 +118,11 @@ export function AskChallenge({ : state.lastAddress.filter((d) => !!d.address[restrictionKey]); const onSend = - errors || !contact || !state?.nonce + errors || !contact ? undefined : withErrorHandler( async () => { - return lib.challenger.challenge(state.nonce, contact); + return lib.challenger.challenge(session.nonce, contact); }, (ok) => { if (ok.body.type === "completed") { @@ -210,6 +211,7 @@ export function AskChallenge({ return ( <label data-checked={addrIndex === idx} + key={idx} class="relative flex border-gray-200 data-[checked=true]:z-10 data-[checked=true]:bg-indigo-50 cursor-pointer flex-col rounded-tl-md rounded-tr-md border p-4 focus:outline-none md:grid md:grid-cols-2 md:pl-4 md:pr-6" > <span class="flex items-center text-sm"> @@ -286,7 +288,7 @@ export function AskChallenge({ > <div class="sm:col-span-2"> <label - for="adress" + for="address" class="block text-sm font-semibold leading-6 text-gray-900" > {(function (): TranslatedString { @@ -301,8 +303,8 @@ export function AskChallenge({ <div class="mt-2.5"> <input type="text" - name="adress" - id="adress" + name="address" + id="address" ref={focus ? doAutoFocus : undefined} maxLength={512} autocomplete={(function (): string { diff --git a/packages/challenger-ui/src/pages/CallengeCompleted.tsx b/packages/challenger-ui/src/pages/CallengeCompleted.tsx index 67b26b452..f99e1ee32 100644 --- a/packages/challenger-ui/src/pages/CallengeCompleted.tsx +++ b/packages/challenger-ui/src/pages/CallengeCompleted.tsx @@ -13,20 +13,12 @@ You should have received a copy of the GNU General Public License along with GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> */ -import { TalerError } from "@gnu-taler/taler-util"; import { Attention, useTranslationContext } from "@gnu-taler/web-util/browser"; import { Fragment, VNode, h } from "preact"; -import { useChallengeSession } from "../hooks/challenge.js"; import { useSessionState } from "../hooks/session.js"; export function CallengeCompleted(): VNode { const { state } = useSessionState(); - const result = useChallengeSession(state); - - const lastStatus = - result && !(result instanceof TalerError) && result.type !== "fail" - ? result.body - : undefined; const { i18n } = useTranslationContext(); diff --git a/packages/challenger-ui/src/validation-unknown.html b/packages/challenger-ui/src/validation-unknown.html deleted file mode 100644 index 56c8d156c..000000000 --- a/packages/challenger-ui/src/validation-unknown.html +++ /dev/null @@ -1,89 +0,0 @@ -<!-- - This file is part of GNU Taler - (C) 2021--2022 Taler Systems S.A. - - GNU Taler is free software; you can redistribute it and/or modify it under the - terms of the GNU General Public License as published by the Free Software - Foundation; either version 3, or (at your option) any later version. - - GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY - WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR - A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with - GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/> - - @author Sebastian Javier Marchano ---> -<!DOCTYPE html> -<html lang="en" class="h-full"> - -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8" /> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width,initial-scale=1" /> - <meta name="taler-support" content="uri"> - <meta name="mobile-web-app-capable" content="yes" /> - <meta name="apple-mobile-web-app-capable" content="yes" /> - <link rel="icon" - href="data:;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAQAABILAAASCwAAAAAAAAAAAAD///////////////////////////////////////////////////////////////////////////////////////////////////7//v38//78/P/+/fz//vz7///+/v/+/f3//vz7///+/v/+/fz//v38///////////////////////+/v3///7+/////////////////////////////////////////////////////////v3//v79///////+/v3///////r28v/ct5//06SG/9Gffv/Xqo7/7N/V/9e2nf/bsJb/6uDW/9Sskf/euKH/+/j2///////+/v3//////+3azv+/eE3/2rWd/9Kkhv/Vr5T/48i2/8J+VP/Qn3//3ryn/795Tf/WrpP/2LCW/8B6T//w4Nb///////Pn4P+/d0v/9u3n/+7d0v/EhV7//v///+HDr//fxLD/zph2/+TJt//8/Pv/woBX//Lm3f/y5dz/v3hN//bu6f/JjGn/4sW0///////Df1j/8OLZ//v6+P+/elH/+vj1//jy7f+/elL//////+zYzP/Eg13//////967p//MlHT/wn5X///////v4Nb/yY1s///////jw7H/06KG////////////z5t9/+fNvf//////x4pn//Pp4v/8+vn/w39X/8WEX///////5s/A/9CbfP//////27Oc/9y2n////////////9itlf/gu6f//////86Vdf/r2Mz//////8SCXP/Df1j//////+7d0v/KkG7//////+HBrf/VpYr////////////RnoH/5sq6///////Ii2n/8ubf//39/P/Cf1j/xohk/+bNvv//////wn5W//Tq4//58/D/wHxV//7+/f/59fH/v3xU//39/P/w4Nf/xIFb///////hw7H/yo9t/+/f1f/AeU3/+/n2/+nSxP/FhmD//////9qzm//Upon/4MSx/96+qf//////xINc/+3bz//48e3/v3hN//Pn3///////6M+//752S//gw6//06aK/8J+VP/kzLr/zZd1/8OCWv/q18r/17KZ/9Ooi//fv6r/v3dK/+vWyP///////v39///////27un/1aeK/9Opjv/m1cf/1KCC/9a0nP/n08T/0Jx8/82YdP/QnHz/16yR//jx7P///////v39///////+/f3///7+///////+//7//v7+///////+/v7//v/+/////////////////////////v7//v79///////////////////+/v/+/Pv//v39///+/v/+/Pv///7+//7+/f/+/Pv//v39//79/P/+/Pv///7+////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" /> - <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon" /> - <link rel="stylesheet" href="main.css" /> - <script type="module" src="main.js"></script> - <title>Validation process unknown (#{{ec}})</title> -</head> - -<body class="min-h-full flex flex-col"> - <header class="bg-indigo-600 w-full mx-auto px-2 border-b border-opacity-25 border-indigo-400"> - <div class="flex flex-row h-16 items-center "> - <div class="flex px-2 justify-start"> - <div class="flex-shrink-0 bg-white rounded-lg"><a href="#"><img class="h-8 w-auto" - src="data:image/svg+xml,<?xml version="1.0" encoding="UTF-8" standalone="no"?>%0A<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 201 90">%0A <g fill="%230042b3" fill-rule="evenodd" stroke-width=".3">%0A <path d="M86.7 1.1c15.6 0 29 9.4 36 23.2h-5.9A35.1 35.1 0 0086.7 6.5C67 6.5 51 23.6 51 44.7c0 10.4 3.8 19.7 10 26.6a31.4 31.4 0 01-4.2 3A45.2 45.2 0 0146 44.7c0-24 18.2-43.6 40.7-43.6zm35.8 64.3a40.4 40.4 0 01-39 22.8c3-1.5 6-3.5 8.6-5.7a35.6 35.6 0 0024.6-17.1z" />%0A <path d="M64.2 1.1l3.1.1c-3 1.6-5.9 3.5-8.5 5.8a37.5 37.5 0 00-30.2 37.7c0 14.3 7.3 26.7 18 33.3a29.6 29.6 0 01-8.5.2c-9-8-14.6-20-14.6-33.5 0-24 18.2-43.6 40.7-43.6zm5.4 81.4a35.6 35.6 0 0024.6-17.1h5.9a40.4 40.4 0 01-39 22.8c3-1.5 5.9-3.5 8.5-5.7zm24.8-58.2a37 37 0 00-12.6-12.8 29.6 29.6 0 018.5-.2c4 3.6 7.4 8 9.9 13z" />%0A <path d="M41.8 1.1c1 0 2 0 3.1.2-3 1.5-5.9 3.4-8.5 5.6A37.5 37.5 0 006.1 44.7c0 21.1 16 38.3 35.7 38.3 12.6 0 23.6-7 30-17.6h5.8a40.4 40.4 0 01-35.8 23C19.3 88.4 1 68.8 1 44.7c0-24 18.2-43.6 40.7-43.6zm30.1 23.2a38.1 38.1 0 00-4.5-6.1c1.3-1.2 2.7-2.2 4.3-3 2.3 2.7 4.4 5.8 6 9.1z" />%0A </g>%0A <path d="M76.1 34.4h9.2v-5H61.9v5H71v26h5.1zM92.6 52.9h13.7l3 7.4h5.3l-12.7-31.2h-4.7L84.5 60.3h5.2zm11.8-4.9h-9.9l5-12.4zM123.8 29.4h-4.6v31h20.6v-5h-16zM166.5 29.4H145v31h21.6v-5H150v-8.3h14.5v-4.9h-14.5v-8h16.4zM191.2 39.5c0 1.6-.5 2.8-1.6 3.8s-2.6 1.4-4.4 1.4h-7.4V34.3h7.4c1.9 0 3.4.4 4.4 1.3 1 .9 1.6 2.2 1.6 3.9zm6 20.8l-7.7-11.7c1-.3 1.9-.7 2.7-1.3a8.8 8.8 0 003.6-4.6c.4-1 .5-2.2.5-3.5 0-1.5-.2-2.9-.7-4.1a8.4 8.4 0 00-2.1-3.1c-1-.8-2-1.5-3.4-2-1.3-.4-2.8-.6-4.5-.6h-12.9v31h5V49.4h6.5l7 10.8z" />%0A</svg>" - alt="GNU Taler" style="height: 1.5rem; margin: 0.5rem;"></a></div><span - class="flex items-center text-white text-lg font-bold ml-4">Challenger</span> - </div> - <div class="block flex-1 ml-6 "></div> - <div class="flex justify-end"> - </div> - </div> - </header> - - <main class="flex-1"> - - <div class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8 items-center mt-4"> - <div class="rounded-md bg-red-50 p-4 shadow-xl"> - <div class="flex"> - <div class="flex-shrink-0"> - <svg xmlns="http://www.w3.org/2000/svg" stroke="none" viewBox="0 0 24 24" fill="currentColor" - class="w-8 h-8 text-red-400"> - <path fill-rule="evenodd" - d="M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12zM12 8.25a.75.75 0 01.75.75v3.75a.75.75 0 01-1.5 0V9a.75.75 0 01.75-.75zm0 8.25a.75.75 0 100-1.5.75.75 0 000 1.5z" /> - </svg> - </div> - <div class="ml-3"> - <h3 class="text-sm font-medium text-red-800"> - Validation error - </h3> - <div class="mt-2 text-sm text-red-700"> - <p>{{hint}}</p> - </div> - </div> - </div> - </div> - </div> - - </main> - - <footer class="bottom-4 mb-4"> - <div class="mt-8 mx-8 md:order-1 md:mt-0"> - <div> - <p class="text-xs leading-5 text-gray-400">Learn more about <a target="_blank" rel="noreferrer noopener" - class="font-semibold text-gray-500 hover:text-gray-400" href="https://taler.net">GNU Taler</a></p> - </div> - <div style="flex-grow: 1;"></div> - <p class="text-xs leading-5 text-gray-400">Copyright © 2014—2023 Taler Systems SA. </p> - </div> - </footer> -</body> - -</html>
\ No newline at end of file |