1) Nakon uspjesnog logina redirect je isao na sirovi 'next' parametar.
'next' dolazi iz request.path, dakle bez SCRIPT_NAME prefiksa, pa je
/guacadmin/login?next=/ nakon prijave vodio na / -> /guacamole/.
Korisnik bi se prijavio i zavrsio na Guacamole login ekranu umjesto
na dashboardu. Sad se dodaje request.script_root, uz provjeru da je
next relativna putanja (open-redirect).
2) limit_req_zone je bio rate=10r/m - deset zahtjeva po MINUTI.
Guacamole je Angular SPA i na jedno otvaranje ispali desetke
zahtjeva, pa je nginx redom vracao 503 na app.js, app.css,
api/tokens i translations. Podignuto na 10r/s, burst 50.
Brute-force i dalje pokrivaju basic auth + fail2ban.
Provjereno: /guacadmin/ -> login -> /guacadmin/dashboard (200), svih
osam GUI stranica 200, 40 paralelnih zahtjeva na Guacamole API sve 200.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Flask slusa na rootu, a nginx ga proxira na ${GUI_PATH} (/guacadmin/).
Bez SCRIPT_NAME-a svi redirecti i url_for pozivi generirali su putanje
izvan prefiksa - / je redirectao na /login, sto nginx ne poznaje, pa je
GUI bio potpuno nedostupan (404 odmah nakon otvaranja).
Dodan PrefixMiddleware koji postavlja SCRIPT_NAME iz nove GUI_PATH
env varijable; systemd unit je sad prosljedjuje. Isto primijenjeno na
webgui/app.py i na inline kopiju u install.sh.
Provjereno: /guacadmin/ -> /guacadmin/login -> login -> /guacadmin/dashboard
(200), svi navigacijski linkovi ostaju pod prefiksom.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
All-in-one installer za Apache Guacamole s Nginx reverse proxy,
fail2ban, SSL (Let's Encrypt / Self-signed), GeoIP blokiranjem
i Flask web GUI za upravljanje.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>