/* This file is part of GNU Anastasis (C) 2021-2022 Anastasis SARL GNU Anastasis is free software; you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation; either version 3, or (at your option) any later version. GNU Anastasis 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with GNU Anastasis; see the file COPYING. If not, see */ import { AuthMethod } from "@gnu-taler/anastasis-core"; import { h, VNode } from "preact"; import postalIcon from "../../../assets/icons/auth_method/postal.svg"; import questionIcon from "../../../assets/icons/auth_method/question.svg"; import smsIcon from "../../../assets/icons/auth_method/sms.svg"; import { AuthMethodEmailSetup as EmailSetup } from "./AuthMethodEmailSetup.js"; import { AuthMethodEmailSolve as EmailSolve } from "./AuthMethodEmailSolve.js"; import { AuthMethodIbanSetup as IbanSetup } from "./AuthMethodIbanSetup.js"; import { AuthMethodIbanSolve as IbanSolve } from "./AuthMethodIbanSolve.js"; import { AuthMethodPostSetup as PostalSetup } from "./AuthMethodPostSetup.js"; import { AuthMethodPostSolve as PostalSolve } from "./AuthMethodPostSolve.js"; import { AuthMethodQuestionSetup as QuestionSetup } from "./AuthMethodQuestionSetup.js"; import { AuthMethodQuestionSolve as QuestionSolve } from "./AuthMethodQuestionSolve.js"; import { AuthMethodSmsSetup as SmsSetup } from "./AuthMethodSmsSetup.js"; import { AuthMethodSmsSolve as SmsSolve } from "./AuthMethodSmsSolve.js"; import { AuthMethodTotpSetup as TotpSetup } from "./AuthMethodTotpSetup.js"; import { AuthMethodTotpSolve as TotpSolve } from "./AuthMethodTotpSolve.js"; export type AuthMethodWithRemove = AuthMethod & { remove: () => void }; export interface AuthMethodSetupProps { method: string; addAuthMethod: (x: any) => void; configured: AuthMethodWithRemove[]; cancel: () => void; } export interface AuthMethodSolveProps { id: string; } interface AuthMethodConfiguration { icon: VNode; label: string; setup: (props: AuthMethodSetupProps) => VNode; solve: (props: AuthMethodSolveProps) => VNode; skip?: boolean; } const ALL_METHODS = [ "sms", "email", "post", "question", "totp", "iban", ] as const; export type KnownAuthMethods = typeof ALL_METHODS[number]; export function isKnownAuthMethods(value: string): value is KnownAuthMethods { return ALL_METHODS.includes(value as KnownAuthMethods); } type KnowMethodConfig = { [name in KnownAuthMethods]: AuthMethodConfiguration; }; export const authMethods: KnowMethodConfig = { question: { icon: , label: "Question", setup: QuestionSetup, solve: QuestionSolve, }, sms: { icon: , label: "SMS", setup: SmsSetup, solve: SmsSolve, }, email: { icon: , label: "Email", setup: EmailSetup, solve: EmailSolve, }, iban: { icon: , label: "IBAN", setup: IbanSetup, solve: IbanSolve, }, post: { icon: , label: "Physical mail", setup: PostalSetup, solve: PostalSolve, }, totp: { icon: , label: "TOTP", setup: TotpSetup, solve: TotpSolve, }, };