From 4cb33afd6b8ec5da170007facb065b5067949807 Mon Sep 17 00:00:00 2001 From: TronoSfera <119615520+TronoSfera@users.noreply.github.com> Date: Mon, 2 Mar 2026 18:25:50 +0300 Subject: [PATCH] add security test 12 --- app/web/admin.css | 33 +++++++ app/web/admin.jsx | 234 ++++++++++++++++++++++++++++++++++++++++---- frontend/Dockerfile | 2 +- 3 files changed, 251 insertions(+), 18 deletions(-) diff --git a/app/web/admin.css b/app/web/admin.css index 5d4a1d2..2fef3f9 100644 --- a/app/web/admin.css +++ b/app/web/admin.css @@ -2746,6 +2746,33 @@ font-size: 1.2rem; } + .totp-setup-grid { + display: grid; + grid-template-columns: 240px minmax(0, 1fr); + gap: 0.9rem; + margin-bottom: 0.8rem; + align-items: start; + } + + .totp-qr-box { + border: 1px solid var(--line); + border-radius: 12px; + background: rgba(255, 255, 255, 0.03); + padding: 0.6rem; + display: grid; + place-items: center; + min-height: 240px; + } + + .totp-qr-img { + width: 220px; + height: 220px; + max-width: 100%; + object-fit: contain; + border-radius: 8px; + background: #fff; + } + .close { border: 1px solid var(--line); width: 34px; @@ -2817,6 +2844,12 @@ .filters { grid-template-columns: 1fr; } + .totp-setup-grid { grid-template-columns: 1fr; } + .totp-qr-box { min-height: 200px; } + .totp-qr-img { + width: 200px; + height: 200px; + } .lawyer-dashboard-grid { grid-template-columns: 1fr; } .lawyer-dashboard-card { grid-template-columns: 1fr; diff --git a/app/web/admin.jsx b/app/web/admin.jsx index 0f6580d..80ab251 100644 --- a/app/web/admin.jsx +++ b/app/web/admin.jsx @@ -60,6 +60,7 @@ import { translateApiError, userInitials, } from "./admin/shared/utils.js"; +import QRCode from "qrcode"; (function () { const { useCallback, useEffect, useMemo, useRef, useState } = React; @@ -503,6 +504,90 @@ const NEW_REQUEST_CLIENT_OPTION = "__new_client__"; ); } + function TotpSetupModal({ + open, + status, + secret, + uri, + qrDataUrl, + code, + loading, + onCodeChange, + onClose, + onSubmit, + onCopySecret, + onCopyUri, + }) { + if (!open) return null; + return ( + event.target.id === "totp-setup-overlay" && onClose()}> +
event.stopPropagation()}> +
+
+

Настройка 2FA

+

+ Сканируйте QR-код в Google Authenticator и подтвердите 6-значным кодом. +

+
+ +
+
+
+ {qrDataUrl ? ( + QR-код для настройки 2FA + ) : ( +

QR-код не удалось сгенерировать. Используйте ключ вручную.

+ )} +
+
+
+ + +
+
+ +