/* 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 */ /** * * @author Sebastian Javier Marchano (sebasjm) */ import { useTranslationContext } from "@gnu-taler/web-util/browser"; import { ComponentChildren, h, VNode } from "preact"; import { useCallback, useEffect, useState } from "preact/hooks"; import { useBackendContext } from "../../context/backend.js"; import { useInstanceContext } from "../../context/instance.js"; import { AccessToken, LoginToken } from "../../declaration.js"; import { useCredentialsChecker } from "../../hooks/backend.js"; import { useBackendURL } from "../../hooks/index.js"; interface Props { onConfirm: (token: LoginToken | undefined) => void; } function getTokenValuePart(t: string): string { if (!t) return t; const match = /secret-token:(.*)/.exec(t); if (!match || !match[1]) return ""; return match[1]; } function normalizeToken(r: string): AccessToken { return `secret-token:${r}` as AccessToken; } function cleanUp(s: string): string { let result = s; if (result.indexOf("webui/") !== -1) { result = result.substring(0, result.indexOf("webui/")); } return result; } export function LoginPage({ onConfirm }: Props): VNode { const { url: backendURL, changeBackend } = useBackendContext(); const { admin, id } = useInstanceContext(); const { requestNewLoginToken } = useCredentialsChecker(); const [token, setToken] = useState(""); const { i18n } = useTranslationContext(); const doLogin = useCallback(async function doLoginImpl() { const secretToken = normalizeToken(token); const baseUrl = id === undefined ? backendURL : `${backendURL}/instances/${id}` const result = await requestNewLoginToken(baseUrl, secretToken); if (result.valid) { const { token, expiration } = result onConfirm({ token, expiration }); } else { onConfirm(undefined); } }, [backendURL, id, token]) async function changeServer() { changeBackend("") } console.log(admin, id) if (admin && id !== "default") { //admin trying to access another instance return (
) } return (
); } function AsyncButton({ onClick, disabled, type = "", children }: { type?: string, disabled?: boolean, onClick: () => Promise, children: ComponentChildren }): VNode { const [running, setRunning] = useState(false) return } export function ConnectionPage({ onConfirm }: { onConfirm: (s: string) => void }): VNode { const { url: backendURL } = useBackendContext() const [url, setURL] = useState(cleanUp(backendURL)); const { i18n } = useTranslationContext(); async function doConnect() { onConfirm(url) } return (
); }