Админка: защита от перебора пароля и правка дефолта SETTINGS_FILE

- не больше 10 неудачных входов с одного адреса за 5 минут, дальше 429
  (панель доступна из интернета, простой перебор закрываем);
  успешный вход сбрасывает счётчик;
- .env.example: SETTINGS_FILE пустой — локально настройки живут в памяти,
  в docker compose подставляет /data/settings.json по умолчанию.
This commit is contained in:
2026-09-28 12:07:45 +03:00
parent cfa6a99639
commit e007a85f56
3 changed files with 63 additions and 3 deletions

View File

@@ -7,7 +7,7 @@ import pytest
from fastapi.testclient import TestClient
import main
from admin import AdminConfig, make_token, verify_token
from admin import LOGIN_MAX_FAILURES, AdminConfig, make_token, verify_token
from fixtures import fixture_xlsx, make_cache
from schedule import ScheduleError
from schedule.settings import SettingsStore
@@ -84,6 +84,14 @@ def test_logout(client):
assert client.get("/api/admin/state").status_code == 401
def test_login_throttled_after_failures(client):
for _ in range(LOGIN_MAX_FAILURES):
assert do_login(client, password="неверный").status_code == 401
# дальше — отказ, даже с верным паролем, пока не истекло окно
assert do_login(client, password="неверный").status_code == 429
assert do_login(client, password="s3cret").status_code == 429
def test_token_helpers():
token = make_token("admin", "s3cret", ttl=60)
assert verify_token(token, "s3cret")