diff --git a/app.py b/app.py index 927b777..85d92ce 100644 --- a/app.py +++ b/app.py @@ -225,6 +225,19 @@ def create_app() -> Flask: # Request / response hooks # ------------------------------------------------------------------ + @app.before_request + def adjust_session_lifetime(): + """ + Dynamically set session lifetime based on the 'remember_me' flag stored + in the session. When the user chose 'Remember Me' at login, their + permanent session lives for 30 days; otherwise the default 10-hour + lifetime from Config.PERMANENT_SESSION_LIFETIME applies. + """ + if session.get('remember_me'): + app.permanent_session_lifetime = timedelta(days=30) + else: + app.permanent_session_lifetime = timedelta(hours=10) + @app.before_request def log_request_info(): """Record request start time and scan for suspicious user agents""" diff --git a/utils/helpers.py b/utils/helpers.py index ee38f65..04c60d3 100644 --- a/utils/helpers.py +++ b/utils/helpers.py @@ -1,4 +1,3 @@ - """ utils/helpers.py ================ @@ -17,7 +16,7 @@ from datetime import datetime, date, time, timedelta from functools import wraps import qrcode -from flask import session, redirect, flash, request +from flask import session, redirect, flash, request, url_for from user_agents import parse from extensions import logger_handler @@ -141,7 +140,7 @@ def login_required(f): def decorated_function(*args, **kwargs): if 'user_id' not in session: flash('Please log in to access this page.', 'error') - return redirect(url_for('login')) + return redirect(url_for('auth.login')) return f(*args, **kwargs) return decorated_function @@ -152,11 +151,11 @@ def admin_required(f): def decorated_function(*args, **kwargs): if 'username' not in session: flash('Please log in to access this page.', 'error') - return redirect(url_for('login')) + return redirect(url_for('auth.login')) user_role = session.get('role') if not has_admin_privileges(user_role): flash('Administrator privileges required for this action.', 'error') - return redirect(url_for('dashboard')) + return redirect(url_for('dashboard.dashboard')) return f(*args, **kwargs) return decorated_function @@ -167,11 +166,11 @@ def staff_or_admin_required(f): def decorated_function(*args, **kwargs): if 'username' not in session: flash('Please log in to access this page.', 'error') - return redirect(url_for('login')) + return redirect(url_for('auth.login')) user_role = session.get('role') if not (has_admin_privileges(user_role) or has_staff_level_access(user_role)): flash('Insufficient privileges to access this page.', 'error') - return redirect(url_for('dashboard')) + return redirect(url_for('dashboard.dashboard')) return f(*args, **kwargs) return decorated_function @@ -372,4 +371,4 @@ def format_time_interval(minutes): if remaining_hours == 0: return f"{days} day{'s' if days != 1 else ''}" else: - return f"{days}d {remaining_hours}h" + return f"{days}d {remaining_hours}h" \ No newline at end of file