Files
lokses 04b1625fde Безопасность: закрытие 5 открытых находок ревью 25.07
- 2FA: убраны /api/ и /media/ из ALLOWED_PREFIXES — staff-сессия без TOTP
  больше не дотягивается до API/медиа (устройства в /api/ идут без staff-сессии)
- Nextcloud «Обмен»: writable только для staff (не для любого logged-in)
- Nextcloud путь отдела/адрес аптеки: safe_component() санитайзит сегмент
  (сепараторы/управляющие/ведущие точки) в провижининге и в браузере
- Mattermost: shared secret кнопки «Виконано» перенесён из query string в
  context (тело POST) — без утечки в логи/Referer
- Login: throttle на кэше (5 попыток / 5 мин, 429); logout только POST (CSRF),
  logout-ссылки в шаблонах → POST-формы

Тесты обновлены под enforcement 2FA (login_2fa helper) и новые правила.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-28 15:38:44 +03:00

40 lines
2.6 KiB
HTML

{% load static %}
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Подтверждение входа — АКС Портал</title>
<link rel="stylesheet" href="{% static 'assets/css/main.css' %}">
</head>
<body style="background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-sidebar-accent) 100%); min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 1rem; font-family: var(--font-sans);">
<div style="width: 100%; max-width: 26rem; background: var(--color-card); border-radius: 0.75rem; border: 1px solid var(--color-border); box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1); overflow: hidden;">
<div style="padding: 1.75rem 2rem 1.25rem; text-align: center; border-bottom: 1px solid var(--color-border);">
<h1 style="font-size: 1.25rem; font-weight: 600; color: var(--color-foreground); margin-bottom: 0.375rem;">Подтверждение входа</h1>
<p style="font-size: 0.875rem; color: var(--color-muted-foreground);">Введите код из приложения-аутентификатора или один из резервных кодов.</p>
</div>
<div style="padding: 1.75rem 2rem;">
{% if error %}
<div style="margin-bottom: 1rem; color: #d63333; background: rgba(214,51,51,0.1); border: 1px solid rgba(214,51,51,0.25); padding: 0.75rem; border-radius: 0.5rem; font-size: 0.875rem;">{{ error }}</div>
{% endif %}
<form method="post">
{% csrf_token %}
<input type="hidden" name="next" value="{{ next }}">
<label style="display:block; font-size:0.8125rem; font-weight:500; color:var(--color-foreground); margin-bottom:0.375rem;">Код подтверждения</label>
<input type="text" name="code" inputmode="numeric" autocomplete="one-time-code" required autofocus
class="input" style="width:100%; text-align:center; letter-spacing:0.2em; font-size:1.1rem; margin-bottom:1rem;">
<button type="submit" class="btn btn-primary" style="width:100%; justify-content:center;">Подтвердить</button>
</form>
<div style="text-align:center; margin-top:1rem;">
<form method="post" action="{% url 'logout' %}" style="margin:0;">
{% csrf_token %}
<button type="submit" style="font-size:0.8125rem; color:var(--color-muted-foreground); background:none; border:none; cursor:pointer; text-decoration:none;">Выйти</button>
</form>
</div>
</div>
</div>
</body>
</html>