136 lines
5.0 KiB
Python
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 |