From 52ce12656e535ddc0242977920c2b6fd04f97a33 Mon Sep 17 00:00:00 2001
From: Zoey
Date: Wed, 14 Jan 2026 17:53:25 +0100
Subject: [PATCH] render totp qrcode locally (do not expose the totp secret to
a third party api)
Signed-off-by: Zoey
---
frontend/package.json | 1 +
frontend/src/modals/TwoFactorModal.tsx | 8 ++------
frontend/yarn.lock | 5 +++++
3 files changed, 8 insertions(+), 6 deletions(-)
diff --git a/frontend/package.json b/frontend/package.json
index e0a36a17e5..dcd664c86e 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -28,6 +28,7 @@
"formik": "^2.4.6",
"generate-password-browser": "^1.1.0",
"humps": "^2.0.1",
+ "qrcode.react": "^4.2.0",
"query-string": "^9.3.1",
"react": "^19.2.3",
"react-bootstrap": "^2.10.10",
diff --git a/frontend/src/modals/TwoFactorModal.tsx b/frontend/src/modals/TwoFactorModal.tsx
index b5dd480c30..e2cbe9d2d0 100644
--- a/frontend/src/modals/TwoFactorModal.tsx
+++ b/frontend/src/modals/TwoFactorModal.tsx
@@ -1,5 +1,6 @@
import EasyModal, { type InnerModalProps } from "ez-modal-react";
import { Field, Form, Formik } from "formik";
+import { QRCodeSVG } from "qrcode.react";
import { type ReactNode, useCallback, useEffect, useState } from "react";
import { Alert } from "react-bootstrap";
import Modal from "react-bootstrap/Modal";
@@ -166,12 +167,7 @@ const TwoFactorModal = EasyModal.create(({ id, visible, remove }: Props) => {
-
}`})
+