2025-06-05 01:34:10 +02:00

136 lines
5.0 KiB
Python

"""
Session-Blueprint für das 3D-Druck-Management-System
Dieses Modul enthält alle Routen und Funktionen für Session-Management.
"""
from flask import Blueprint, jsonify, request, session
from flask_login import login_required, current_user
from datetime import datetime, timedelta
from models import User, get_db_session, SystemLog
from utils.logging_config import get_logger
from utils.settings import SESSION_LIFETIME
# Blueprint erstellen
sessions_blueprint = Blueprint('sessions', __name__, url_prefix='/api/session')
# Logger initialisieren
sessions_logger = get_logger("sessions")
@sessions_blueprint.route('/heartbeat', methods=['POST'])
@login_required
def heartbeat():
"""
Session-Heartbeat zum Aktualisieren der letzten Aktivität.
Verhindert automatischen Logout bei aktiven Benutzern.
"""
try:
# Session-Aktivität aktualisieren
session['last_activity'] = datetime.now().isoformat()
session.permanent = True
# Benutzer-Aktivität in Datenbank aktualisieren
with get_db_session() as db_session:
user = db_session.query(User).filter_by(id=current_user.id).first()
if user:
user.last_activity = datetime.now()
db_session.commit()
# Verbleibende Session-Zeit berechnen
session_start = session.get('session_start')
if session_start:
elapsed = (datetime.now() - datetime.fromisoformat(session_start)).total_seconds()
remaining = max(0, SESSION_LIFETIME.total_seconds() - elapsed)
else:
remaining = SESSION_LIFETIME.total_seconds()
return jsonify({
'success': True,
'remaining_seconds': int(remaining),
'session_lifetime': int(SESSION_LIFETIME.total_seconds())
})
except Exception as e:
sessions_logger.error(f"Fehler beim Session-Heartbeat: {str(e)}")
return jsonify({'error': 'Fehler beim Aktualisieren der Session'}), 500
@sessions_blueprint.route('/status', methods=['GET'])
@login_required
def status():
"""Gibt den aktuellen Session-Status zurück"""
try:
# Session-Informationen sammeln
session_start = session.get('session_start')
last_activity = session.get('last_activity')
# Verbleibende Zeit berechnen
if session_start:
elapsed = (datetime.now() - datetime.fromisoformat(session_start)).total_seconds()
remaining = max(0, SESSION_LIFETIME.total_seconds() - elapsed)
else:
remaining = SESSION_LIFETIME.total_seconds()
# Inaktivitätszeit berechnen
if last_activity:
inactive_seconds = (datetime.now() - datetime.fromisoformat(last_activity)).total_seconds()
else:
inactive_seconds = 0
return jsonify({
'success': True,
'user': {
'id': current_user.id,
'username': current_user.username,
'email': current_user.email,
'name': current_user.name,
'is_admin': current_user.is_admin
},
'session': {
'start_time': session_start,
'last_activity': last_activity,
'remaining_seconds': int(remaining),
'inactive_seconds': int(inactive_seconds),
'lifetime_seconds': int(SESSION_LIFETIME.total_seconds()),
'is_permanent': session.permanent
}
})
except Exception as e:
sessions_logger.error(f"Fehler beim Abrufen des Session-Status: {str(e)}")
return jsonify({'error': 'Fehler beim Abrufen des Session-Status'}), 500
@sessions_blueprint.route('/extend', methods=['POST'])
@login_required
def extend():
"""Verlängert die aktuelle Session"""
try:
# Nur Admins können Sessions verlängern
if not current_user.is_admin:
return jsonify({'error': 'Keine Berechtigung zum Verlängern der Session'}), 403
# Session-Start zurücksetzen
session['session_start'] = datetime.now().isoformat()
session['last_activity'] = datetime.now().isoformat()
session.permanent = True
# SystemLog erstellen
with get_db_session() as db_session:
SystemLog.log_system_event(
level="INFO",
message=f"Session verlängert für Benutzer {current_user.username}",
module="sessions",
user_id=current_user.id
)
db_session.commit()
sessions_logger.info(f"Session verlängert für Benutzer {current_user.id}")
return jsonify({
'success': True,
'message': 'Session wurde verlängert',
'new_lifetime_seconds': int(SESSION_LIFETIME.total_seconds())
})
except Exception as e:
sessions_logger.error(f"Fehler beim Verlängern der Session: {str(e)}")
return jsonify({'error': 'Fehler beim Verlängern der Session'}), 500