version0.4.1 Общие исправления

This commit is contained in:
2026-06-19 15:37:02 +03:00
parent 621ce6723a
commit 5469a967a2
2 changed files with 27 additions and 1 deletions
+26 -1
View File
@@ -23,7 +23,11 @@ SSL_KEY = os.environ.get("SSL_KEY", "")
app = Flask(__name__)
app.secret_key = os.environ.get("FLASK_SECRET", secrets.token_hex(32))
app.config["SESSION_COOKIE_SAMESITE"] = "Lax"
app.config["SESSION_COOKIE_SECURE"] = bool(SSL_CERT)
# SESSION_COOKIE_SECURE не задаём статически — это ломает логин, если
# SSL_CERT прописан в env, но gunicorn по факту поднялся на HTTP
# (например, сертификат ещё не физически на диске, или используется
# SSH-туннель без TLS). Вместо этого выставляем Secure динамически
# по факту запроса — см. _set_cookie_secure_dynamically ниже.
app.config["PERMANENT_SESSION_LIFETIME"] = timedelta(hours=8)
# ── Rate limiter ─────────────────────────────────────────────────────────────
@@ -595,6 +599,27 @@ def check_secret_path():
if not (path == allowed_prefix or path.startswith(allowed_prefix + "/")):
abort(404)
# ── Динамическая правка Secure-флага на cookie сессии ────────────────────────
# Если выставить Secure статически по наличию SSL_CERT в env, можно словить
# ситуацию когда сертификат прописан, но запрос реально пришёл по HTTP
# (gunicorn не поднял TLS, SSH-туннель без TLS и т.п.) — тогда браузер
# тихо отбросит cookie с флагом Secure, и человек не сможет войти, видя
# при этом "успешный" логин без какой-либо ошибки. Поэтому проверяем
# request.is_secure на каждый ответ и правим флаг по факту.
@app.after_request
def fix_session_cookie_secure(response):
if not request.is_secure:
return response
set_cookie_headers = response.headers.getlist("Set-Cookie")
if not set_cookie_headers:
return response
response.headers.remove("Set-Cookie")
for header in set_cookie_headers:
if app.session_cookie_name in header and "Secure" not in header:
header += "; Secure"
response.headers.add("Set-Cookie", header)
return response
if __name__ == "__main__":
port = int(os.environ.get("PANEL_PORT", "8080"))
ssl_ctx = None
+1
View File
@@ -150,6 +150,7 @@ function showPage(id,btn){
if(id==='dashboard')loadDashboard();
if(id==='users')loadUsers();
if(id==='ssl')loadSSL();
if(id==='security')loadSecurityPage();
}
function openModal(title,html){
document.getElementById('modal-title-text').textContent=title;