# Przyczyna i naprawa — 2.7.2.3

## Nieprawidłowy token bezpieczeństwa

Kanoniczna funkcja `balt_verify_csrf()` odczytuje pole POST `csrf`. Kod JavaScript układu strategicznego wysyłał jedynie `csrf_token`. Token był prawidłowy, ale znajdował się pod nazwą, której backend nie sprawdzał.

Naprawa:

- klient wysyła `csrf`, `csrf_token`, `_csrf` i nagłówek `X-CSRF-Token`;
- API odczytuje wszystkie wspierane warianty;
- przy wygaśnięciu sesji API zwraca HTTP 419 i aktualny token;
- klient aktualizuje token i ponawia żądanie tylko raz.

## Pozorne ciągłe ładowanie

`balt2722_hcc_enrich_state()` uruchamiał `balt2722_seed_floor()` podczas zwykłego renderowania strony, gdy układ lub obiekty jeszcze nie istniały. Funkcja generowała wiele elementów dla każdego pomieszczenia i wykonywała osobne zapisy. Ten sam kod mógł zostać wywołany przez okresowy polling.

Dodatkowo `balt2722_apply()` wywoływał `balt2722_seed_all()` w jednym żądaniu upgrade’u.

Naprawa:

- renderowanie strony tworzy najwyżej lekki rekord metadanych układu;
- nie zapisuje wyposażenia;
- użytkownik uruchamia przygotowanie jawnie;
- frontend wywołuje `seed_prepare`, serię `seed_batch` i `seed_finalize`;
- każda partia obejmuje maksymalnie cztery pomieszczenia;
- zapisy są idempotentne dzięki kanonicznemu `object_key`;
- ręczne obiekty pozostają nietknięte;
- generowanie jest chronione krótką blokadą MySQL dla piętra.
