fix(zglos): podpowiedź jednostki znów działa dla nie-redaktorów (403→200)#673
fix(zglos): podpowiedź jednostki znów działa dla nie-redaktorów (403→200)#673mpasternak wants to merge 3 commits into
Conversation
…200) Endpoint /bpp/api/ostatnia-jednostka-i-dyscyplina/ dostał w e892142 bramkę WprowadzanieDanychRequiredMixin, choć niczego nie mutuje — czyta Autor/Autor_Dyscyplina i zwraca JSON. Konsumuje go autorform_dependant.js, ładowany także do PUBLICZNEGO formularza zglos_publikacje, więc każdy zgłaszający bez roli redaktora dostawał 403 i tracił podpowiedź jednostki oraz dyscypliny — po cichu, bo to AJAX. Wracamy do LoginRequiredMixin (stan sprzed e892142): anonim nadal dostaje redirect na login, co pokrywa istniejący test test_api_endpoints_require_login. W Rollbarze objawiało się to ~19 osobnymi itemami PermissionDenied (m.in. #1532, #1495, #1486) — po jednym na wystąpienie. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH
- Newsfragment obiecywał, że formularz "znów podpowiada" — dla ANONIMA to nieprawda: LoginRequiredMixin nadal daje mu 302, tak samo jak przed e892142. Formularz zgłoszeń przepuszcza niezalogowanych, więc to realna grupa. Doprecyzowane w newsfragmencie i w docstringu widoku, wraz z powodem, dla którego nie luzujemy tego teraz (endpoint jest oraklem istnienia autora dla całej przestrzeni PK, bez rate-limitu). - Nowy test-lustro: pozostałe trzy widoki API (rok habilitacji, punktacja źródła, upload punktacji) NADAL dają 403 zalogowanemu bez uprawnień redaktorskich. Bez tego nic nie broni przed przyszłym "skoro tamten odblokowaliśmy, odblokujmy wszystkie". Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH
Poprawki po self-reviewNaniesione w 1. Newsfragment obiecywał za dużo. „Formularz znów podpowiada" — dla 2. Test-lustro. Nowy Znaleziska poza zakresem tego PR-a (do osobnego wątku)A. Podpowiedź może wstrzyknąć jednostkę, której formularz nie przyjmie. Skutek jest łagodny (czytelny komunikat „Do jednostki … nie można afiliować B. Brak scopingu po uczelni (IDOR wielotenantowy). C. Dlaczego CI tego nie złapało. Playwrightowy test podpowiedzi |
… konflikt) CI wywaliło test_api_zwykly_user_403[bpp:api_ostatnia_jednostka_i_dyscyplina] — istniejący test w src/bpp/tests/test_authz_views.py asertował 403 dla tego endpointu, a to jest dokładnie zachowanie, które ten PR zmienia. Przegapiłem ten plik, bo lokalnie uruchamiałem testy celowane (test_api.py, test_permissions.py, zglos_publikacje), a nie całe src/bpp/tests. API_ROUTES było wspólną listą dla dwóch testów o różnych kontraktach. Rozdzielone: - API_ROUTES_REDAKCYJNE — zalogowany bez uprawnień → 403 (trzy widoki mutujące/redakcyjne), - API_ROUTES = powyższe + ostatnia_jednostka — anonim → 302 na login. Ten kontrakt się NIE zmienia i nadal jest pilnowany. Komentarz przy liście wyjaśnia, dlaczego ostatnia_jednostka jest w drugiej, a nie w pierwszej, i wskazuje test pilnujący jej dostępności (200). Zweryfikowane pełnym przebiegiem src/bpp/tests: 2850 passed, 2 skipped. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH
Problem
Endpoint
/bpp/api/ostatnia-jednostka-i-dyscyplina/dostał we892142ff(„fix(security): wymagaj uprawnień redaktorskich dla operacji mutujących")
mixin
WprowadzanieDanychRequiredMixin— choć niczego nie mutuje: czytaAutor/Autor_Dyscyplinai zwraca JSON.Ten endpoint konsumuje
autorform_dependant.js, ładowany przezzglos_publikacje/forms.py:487do publicznego formularza „Zgłośpublikację". Efekt: każdy zgłaszający bez roli redaktora dostawał 403 i tracił
podpowiedź jednostki oraz dyscypliny — po cichu, bo to zapytanie AJAX.
W Rollbarze objawiało się to ~19 osobnymi itemami
PermissionDenied: Brak uprawnień do wprowadzania danych.(po jednym na wystąpienie), m.in.#1532,
#1495,
#1486 —
to była mniej więcej połowa świeżego strumienia błędów produkcyjnych.
Rozwiązanie
Powrót do
LoginRequiredMixin(stan sprzede892142ff) + komentarz wdocstringu, żeby następny audyt bezpieczeństwa nie zaklasyfikował tego widoku
ponownie jako mutującego.
Anonim nadal dostaje redirect na login — pokrywa to istniejący
test_api_endpoints_require_login.Testy
Nowy
test_ostatnia_jednostka_dostepna_bez_uprawnien_redaktorskich— TDD:najpierw padał na
assert 403 == 200, po zmianie przechodzi.src/bpp/tests/test_views/test_api.py— 31 passedsrc/bpp/tests/test_permissions.py+src/zglos_publikacje— 190 passed(z Playwrightem)
🤖 Generated with Claude Code
https://claude.ai/code/session_01NcAqeqyqBzNEkkVnhpHDaH