93 lines
3.8 KiB
Python
93 lines
3.8 KiB
Python
"""
|
|
Logs blueprint for the SMTP server web UI.
|
|
|
|
This module provides email and authentication log viewing functionality.
|
|
"""
|
|
|
|
from flask import render_template, request, send_file, redirect, url_for, flash, Response
|
|
from email_server.models import Session, EmailLog, AuthLog, EmailRecipientLog, EmailAttachment
|
|
from email_server.tool_box import get_logger
|
|
from .routes import email_bp
|
|
import os
|
|
|
|
logger = get_logger()
|
|
|
|
|
|
@email_bp.route('/logs')
|
|
def logs():
|
|
"""Display email and authentication logs."""
|
|
session = Session()
|
|
try:
|
|
# Get filter parameters
|
|
filter_type = request.args.get('type', 'all')
|
|
page = request.args.get('page', 1, type=int)
|
|
per_page = 50
|
|
|
|
if filter_type == 'emails':
|
|
# Email logs only
|
|
total_query = session.query(EmailLog)
|
|
logs_query = session.query(EmailLog).order_by(EmailLog.created_at.desc())
|
|
elif filter_type == 'auth':
|
|
# Auth logs only
|
|
total_query = session.query(AuthLog)
|
|
logs_query = session.query(AuthLog).order_by(AuthLog.created_at.desc())
|
|
else:
|
|
# Combined view (default)
|
|
email_logs = session.query(EmailLog).order_by(EmailLog.created_at.desc()).limit(per_page//2).all()
|
|
auth_logs = session.query(AuthLog).order_by(AuthLog.created_at.desc()).limit(per_page//2).all()
|
|
|
|
# Convert to unified format
|
|
combined_logs = []
|
|
for log in email_logs:
|
|
# Fetch recipient logs and attachments for each email log
|
|
recipient_logs = session.query(EmailRecipientLog).filter_by(email_log_id=log.id).all()
|
|
attachments = session.query(EmailAttachment).filter_by(email_log_id=log.id).all()
|
|
combined_logs.append({
|
|
'type': 'email',
|
|
'timestamp': log.created_at,
|
|
'data': log,
|
|
'recipients': recipient_logs,
|
|
'attachments': attachments
|
|
})
|
|
for log in auth_logs:
|
|
combined_logs.append({
|
|
'type': 'auth',
|
|
'timestamp': log.created_at,
|
|
'data': log
|
|
})
|
|
|
|
# Sort by timestamp
|
|
combined_logs.sort(key=lambda x: x['timestamp'], reverse=True)
|
|
|
|
return render_template('logs.html',
|
|
logs=combined_logs[:per_page],
|
|
filter_type=filter_type,
|
|
page=page,
|
|
has_next=len(combined_logs) > per_page,
|
|
has_prev=page > 1)
|
|
|
|
# Pagination for single type logs
|
|
offset = (page - 1) * per_page
|
|
total = total_query.count()
|
|
logs = logs_query.offset(offset).limit(per_page).all()
|
|
|
|
has_next = offset + per_page < total
|
|
has_prev = page > 1
|
|
# Fetch recipient logs and attachments for each email log if emails
|
|
recipient_logs_map = {}
|
|
attachments_map = {}
|
|
if filter_type == 'emails':
|
|
for log in logs:
|
|
recipient_logs_map[log.id] = session.query(EmailRecipientLog).filter_by(email_log_id=log.id).all()
|
|
attachments_map[log.id] = session.query(EmailAttachment).filter_by(email_log_id=log.id).all()
|
|
return render_template('logs.html',
|
|
logs=logs,
|
|
filter_type=filter_type,
|
|
page=page,
|
|
has_next=has_next,
|
|
has_prev=has_prev,
|
|
recipient_logs_map=recipient_logs_map,
|
|
attachments_map=attachments_map)
|
|
finally:
|
|
session.close()
|