user logging
This commit is contained in:
Binary file not shown.
Binary file not shown.
@@ -2,6 +2,8 @@ from flask import render_template, request, flash, redirect, url_for
|
||||
from flask_login import login_user, logout_user, login_required, current_user
|
||||
from models import db, User
|
||||
from functools import wraps
|
||||
from utils import log_event
|
||||
from datetime import datetime
|
||||
|
||||
def require_password_change(f):
|
||||
@wraps(f)
|
||||
@@ -26,11 +28,26 @@ def init_routes(auth_bp):
|
||||
user = User.query.filter_by(email=email).first()
|
||||
|
||||
if not user or not user.check_password(password):
|
||||
# Log failed login attempt
|
||||
log_event('user_login', {
|
||||
'email': email,
|
||||
'success': False,
|
||||
'reason': 'invalid_credentials'
|
||||
})
|
||||
flash('Please check your login details and try again.', 'danger')
|
||||
return redirect(url_for('auth.login'))
|
||||
|
||||
login_user(user, remember=remember)
|
||||
|
||||
# Log successful login
|
||||
log_event('user_login', {
|
||||
'user_id': user.id,
|
||||
'email': email,
|
||||
'success': True,
|
||||
'remember': remember,
|
||||
'using_default_password': password == 'changeme'
|
||||
}, user.id)
|
||||
|
||||
# Check if user is using default password
|
||||
if password == 'changeme':
|
||||
flash('Please change your password before continuing.', 'warning')
|
||||
@@ -69,6 +86,16 @@ def init_routes(auth_bp):
|
||||
db.session.add(new_user)
|
||||
db.session.commit()
|
||||
|
||||
# Log user registration
|
||||
log_event('user_register', {
|
||||
'email': email,
|
||||
'username': username,
|
||||
'timestamp': datetime.utcnow().isoformat(),
|
||||
'ip_address': request.remote_addr,
|
||||
'user_agent': request.user_agent.string,
|
||||
'registration_method': 'web_form'
|
||||
}, new_user.id)
|
||||
|
||||
login_user(new_user)
|
||||
return redirect(url_for('main.dashboard'))
|
||||
|
||||
@@ -77,6 +104,12 @@ def init_routes(auth_bp):
|
||||
@auth_bp.route('/logout')
|
||||
@login_required
|
||||
def logout():
|
||||
# Log logout event
|
||||
log_event('user_logout', {
|
||||
'user_id': current_user.id,
|
||||
'email': current_user.email
|
||||
}, current_user.id)
|
||||
|
||||
logout_user()
|
||||
return redirect(url_for('auth.login'))
|
||||
|
||||
@@ -98,6 +131,14 @@ def init_routes(auth_bp):
|
||||
|
||||
current_user.set_password(new_password)
|
||||
db.session.commit()
|
||||
|
||||
# Log password change
|
||||
log_event('user_update', {
|
||||
'user_id': current_user.id,
|
||||
'email': current_user.email,
|
||||
'update_type': 'password_change'
|
||||
}, current_user.id)
|
||||
|
||||
flash('Password changed successfully!', 'success')
|
||||
return redirect(url_for('main.dashboard'))
|
||||
|
||||
|
||||
109
routes/main.py
109
routes/main.py
@@ -1,4 +1,4 @@
|
||||
from flask import render_template, Blueprint, redirect, url_for, request, flash, Response, jsonify
|
||||
from flask import render_template, Blueprint, redirect, url_for, request, flash, Response, jsonify, session
|
||||
from flask_login import current_user, login_required
|
||||
from models import User, db, Room, RoomFile, RoomMemberPermission, SiteSettings, Event
|
||||
from routes.auth import require_password_change
|
||||
@@ -9,7 +9,6 @@ from datetime import datetime, timedelta
|
||||
import logging
|
||||
import sys
|
||||
import time
|
||||
from flask import session
|
||||
|
||||
# Set up logging to show in console
|
||||
logging.basicConfig(
|
||||
@@ -356,11 +355,62 @@ def init_routes(main_bp):
|
||||
|
||||
site_settings = SiteSettings.get_settings()
|
||||
active_tab = request.args.get('tab', 'colors')
|
||||
|
||||
# Get events data if events tab is active
|
||||
events = None
|
||||
total_pages = 1
|
||||
current_page = 1
|
||||
users = []
|
||||
|
||||
if active_tab == 'events':
|
||||
# Get filter parameters
|
||||
event_type = request.args.get('event_type')
|
||||
date_range = request.args.get('date_range', '7d')
|
||||
user_id = request.args.get('user_id')
|
||||
page = request.args.get('page', 1, type=int)
|
||||
per_page = 50
|
||||
|
||||
# Calculate date range
|
||||
end_date = datetime.utcnow()
|
||||
if date_range == '24h':
|
||||
start_date = end_date - timedelta(days=1)
|
||||
elif date_range == '7d':
|
||||
start_date = end_date - timedelta(days=7)
|
||||
elif date_range == '30d':
|
||||
start_date = end_date - timedelta(days=30)
|
||||
else:
|
||||
start_date = None
|
||||
|
||||
# Build query
|
||||
query = Event.query
|
||||
|
||||
if event_type:
|
||||
query = query.filter_by(event_type=event_type)
|
||||
if start_date:
|
||||
query = query.filter(Event.timestamp >= start_date)
|
||||
if user_id:
|
||||
query = query.filter_by(user_id=user_id)
|
||||
|
||||
# Get total count for pagination
|
||||
total_events = query.count()
|
||||
total_pages = (total_events + per_page - 1) // per_page
|
||||
|
||||
# Get paginated events
|
||||
events = query.order_by(Event.timestamp.desc()).paginate(page=page, per_page=per_page)
|
||||
|
||||
# Get all users for filter dropdown
|
||||
users = User.query.order_by(User.username).all()
|
||||
|
||||
return render_template('settings/settings.html',
|
||||
primary_color=site_settings.primary_color,
|
||||
secondary_color=site_settings.secondary_color,
|
||||
active_tab=active_tab,
|
||||
site_settings=site_settings)
|
||||
site_settings=site_settings,
|
||||
events=events.items if events else None,
|
||||
total_pages=total_pages,
|
||||
current_page=current_page,
|
||||
users=users,
|
||||
csrf_token=session.get('csrf_token'))
|
||||
|
||||
@main_bp.route('/settings/colors', methods=['POST'])
|
||||
@login_required
|
||||
@@ -578,13 +628,29 @@ def init_routes(main_bp):
|
||||
# Get all users for filter dropdown
|
||||
users = User.query.order_by(User.username).all()
|
||||
|
||||
return render_template('settings/tabs/events.html',
|
||||
# Check if this is an AJAX request
|
||||
if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
|
||||
logger.info(f"Processing AJAX request for events. Found {len(events.items)} events")
|
||||
return render_template('settings/tabs/events.html',
|
||||
events=events.items,
|
||||
total_pages=total_pages,
|
||||
current_page=page,
|
||||
event_type=event_type,
|
||||
date_range=date_range,
|
||||
user_id=user_id,
|
||||
users=users,
|
||||
csrf_token=session.get('csrf_token'))
|
||||
|
||||
# For full page requests, render the full settings page
|
||||
site_settings = SiteSettings.get_settings()
|
||||
return render_template('settings/settings.html',
|
||||
primary_color=site_settings.primary_color,
|
||||
secondary_color=site_settings.secondary_color,
|
||||
active_tab='events',
|
||||
site_settings=site_settings,
|
||||
events=events.items,
|
||||
total_pages=total_pages,
|
||||
current_page=page,
|
||||
event_type=event_type,
|
||||
date_range=date_range,
|
||||
user_id=user_id,
|
||||
users=users,
|
||||
csrf_token=session.get('csrf_token'))
|
||||
|
||||
@@ -595,16 +661,33 @@ def init_routes(main_bp):
|
||||
return jsonify({'error': 'Unauthorized'}), 403
|
||||
|
||||
event = Event.query.get_or_404(event_id)
|
||||
return jsonify({
|
||||
logger.info(f"Raw event object: {event}")
|
||||
logger.info(f"Event details type: {type(event.details)}")
|
||||
logger.info(f"Event details value: {event.details}")
|
||||
|
||||
# Convert details to dict if it's a string
|
||||
details = event.details
|
||||
if isinstance(details, str):
|
||||
try:
|
||||
import json
|
||||
details = json.loads(details)
|
||||
except json.JSONDecodeError:
|
||||
details = {'raw_details': details}
|
||||
|
||||
# Return the raw event data
|
||||
response_data = {
|
||||
'id': event.id,
|
||||
'event_type': event.event_type,
|
||||
'timestamp': event.timestamp.isoformat(),
|
||||
'user': {
|
||||
'id': event.user.id,
|
||||
'username': event.user.username,
|
||||
'last_name': event.user.last_name
|
||||
},
|
||||
'timestamp': event.timestamp.isoformat(),
|
||||
'details': event.details,
|
||||
} if event.user else None,
|
||||
'ip_address': event.ip_address,
|
||||
'user_agent': event.user_agent
|
||||
})
|
||||
'user_agent': event.user_agent,
|
||||
'details': details
|
||||
}
|
||||
|
||||
logger.info(f"Sending response: {response_data}")
|
||||
return jsonify(response_data)
|
||||
Reference in New Issue
Block a user