added a lot of logging

This commit is contained in:
2025-05-30 20:43:14 +02:00
parent c09a5c758e
commit a08345e676
11 changed files with 247 additions and 2 deletions

Binary file not shown.

View File

@@ -10,6 +10,7 @@ import logging
import sys import sys
import time import time
from forms import CompanySettingsForm from forms import CompanySettingsForm
from utils import log_event
# Set up logging to show in console # Set up logging to show in console
logging.basicConfig( logging.basicConfig(

View File

@@ -29,6 +29,7 @@ import shutil
import io import io
import zipfile import zipfile
from datetime import datetime from datetime import datetime
from utils import log_event
# Blueprint for room file operations # Blueprint for room file operations
room_files_bp = Blueprint('room_files', __name__, url_prefix='/api/rooms') room_files_bp = Blueprint('room_files', __name__, url_prefix='/api/rooms')
@@ -221,6 +222,18 @@ def upload_room_file(room_id):
existing_file.uploaded_by = current_user.id existing_file.uploaded_by = current_user.id
existing_file.uploaded_at = datetime.utcnow() existing_file.uploaded_at = datetime.utcnow()
db.session.commit() db.session.commit()
log_event(
event_type='file_upload',
details={
'uploaded_by': f"{current_user.username} {current_user.last_name}",
'filename': filename,
'room_id': room_id,
'path': rel_path,
'size': stat.st_size,
'overwritten': True
},
user_id=current_user.id
)
return jsonify({'success': True, 'filename': filename, 'overwritten': True}) return jsonify({'success': True, 'filename': filename, 'overwritten': True})
else: else:
rf = RoomFile( rf = RoomFile(
@@ -235,6 +248,18 @@ def upload_room_file(room_id):
) )
db.session.add(rf) db.session.add(rf)
db.session.commit() db.session.commit()
log_event(
event_type='file_upload',
details={
'uploaded_by': f"{current_user.username} {current_user.last_name}",
'filename': filename,
'room_id': room_id,
'path': rel_path,
'size': stat.st_size,
'overwritten': False
},
user_id=current_user.id
)
return jsonify({'success': True, 'filename': filename}) return jsonify({'success': True, 'filename': filename})
@room_files_bp.route('/<int:room_id>/files/<filename>', methods=['GET']) @room_files_bp.route('/<int:room_id>/files/<filename>', methods=['GET'])
@@ -262,6 +287,18 @@ def download_room_file(room_id, filename):
file_path = os.path.join(room_dir, rel_path, filename) if rel_path else os.path.join(room_dir, filename) file_path = os.path.join(room_dir, rel_path, filename) if rel_path else os.path.join(room_dir, filename)
if not os.path.exists(file_path): if not os.path.exists(file_path):
return jsonify({'error': 'File not found'}), 404 return jsonify({'error': 'File not found'}), 404
log_event(
event_type='file_download',
details={
'downloaded_by': f"{current_user.username} {current_user.last_name}",
'filename': filename,
'room_id': room_id,
'path': rel_path,
'size': rf.size if rf else None
},
user_id=current_user.id
)
return send_from_directory(os.path.dirname(file_path), filename, as_attachment=True) return send_from_directory(os.path.dirname(file_path), filename, as_attachment=True)
@room_files_bp.route('/<int:room_id>/files/<path:filename>', methods=['DELETE']) @room_files_bp.route('/<int:room_id>/files/<path:filename>', methods=['DELETE'])
@@ -294,6 +331,19 @@ def delete_file(room_id, filename):
rf.deleted_at = datetime.utcnow() rf.deleted_at = datetime.utcnow()
db.session.commit() db.session.commit()
log_event(
event_type='file_delete',
details={
'deleted_by': f"{current_user.username} {current_user.last_name}",
'filename': filename,
'room_id': room_id,
'path': rel_path,
'type': rf.type,
'size': rf.size if rf.type == 'file' else None
},
user_id=current_user.id
)
return jsonify({'success': True}) return jsonify({'success': True})
@room_files_bp.route('/<int:room_id>/folders', methods=['POST']) @room_files_bp.route('/<int:room_id>/folders', methods=['POST'])
@@ -429,6 +479,22 @@ def rename_room_file(room_id):
item.path = item.path.replace(old_folder_path, new_folder_path, 1) item.path = item.path.replace(old_folder_path, new_folder_path, 1)
db.session.commit() db.session.commit()
log_event(
event_type='file_rename',
details={
'renamed_by': f"{current_user.username} {current_user.last_name}",
'old_name': old_name,
'new_name': new_name,
'room_id': room_id,
'path': rel_path,
'type': rf.type,
'size': rf.size if rf.type == 'file' else None,
'is_folder': os.path.isdir(new_path)
},
user_id=current_user.id
)
return jsonify({'success': True, 'old_name': old_name, 'new_name': new_name}) return jsonify({'success': True, 'old_name': old_name, 'new_name': new_name})
@room_files_bp.route('/<int:room_id>/download-zip', methods=['POST']) @room_files_bp.route('/<int:room_id>/download-zip', methods=['POST'])
@@ -554,6 +620,20 @@ def move_room_file(room_id):
rf.modified = os.path.getmtime(target_file_path) rf.modified = os.path.getmtime(target_file_path)
db.session.commit() db.session.commit()
log_event(
event_type='file_move',
details={
'moved_by': f"{current_user.username} {current_user.last_name}",
'filename': filename,
'room_id': room_id,
'source_path': source_path,
'target_path': target_path,
'type': rf.type,
'size': rf.size if rf.type == 'file' else None
},
user_id=current_user.id
)
return jsonify({'success': True}) return jsonify({'success': True})
@room_files_bp.route('/<int:room_id>/folders', methods=['GET']) @room_files_bp.route('/<int:room_id>/folders', methods=['GET'])
@@ -822,6 +902,19 @@ def restore_file(room_id):
rf.deleted = False rf.deleted = False
db.session.commit() db.session.commit()
log_event(
event_type='file_restore',
details={
'restored_by': f"{current_user.username} {current_user.last_name}",
'filename': filename,
'room_id': room_id,
'path': rel_path,
'type': rf.type,
'size': rf.size if rf.type == 'file' else None
},
user_id=current_user.id
)
return jsonify({'success': True}) return jsonify({'success': True})
@room_files_bp.route('/<int:room_id>/delete-permanent', methods=['POST']) @room_files_bp.route('/<int:room_id>/delete-permanent', methods=['POST'])
@@ -880,6 +973,19 @@ def delete_permanent(room_id):
for item in contained_items: for item in contained_items:
db.session.delete(item) db.session.delete(item)
log_event(
event_type='file_delete_permanent',
details={
'deleted_by': f"{current_user.username} {current_user.last_name}",
'filename': rf.name,
'room_id': room_id,
'path': rf.path,
'type': rf.type,
'size': rf.size if rf.type == 'file' else None
},
user_id=current_user.id
)
except Exception as e: except Exception as e:
print(f"Error deleting {rf.type} from storage: {e}") print(f"Error deleting {rf.type} from storage: {e}")

View File

@@ -1,7 +1,7 @@
from flask import Blueprint, jsonify, request, abort from flask import Blueprint, jsonify, request, abort
from flask_login import login_required, current_user from flask_login import login_required, current_user
from models import db, Room, User, RoomMemberPermission from models import db, Room, User, RoomMemberPermission
from utils import user_has_permission from utils import user_has_permission, log_event
room_members_bp = Blueprint('room_members', __name__) room_members_bp = Blueprint('room_members', __name__)
@@ -70,6 +70,19 @@ def add_room_member(room_id):
db.session.commit() db.session.commit()
log_event(
event_type='room_member_add',
details={
'room_id': room_id,
'room_name': room.name,
'added_user_id': user_id,
'added_user_name': f"{user.username} {user.last_name}",
'added_by': f"{current_user.username} {current_user.last_name}",
'permissions': permissions
},
user_id=current_user.id
)
return jsonify({'success': True}) return jsonify({'success': True})
@room_members_bp.route('/<int:room_id>/members/<int:user_id>', methods=['DELETE']) @room_members_bp.route('/<int:room_id>/members/<int:user_id>', methods=['DELETE'])
@@ -92,6 +105,18 @@ def remove_room_member(room_id, user_id):
db.session.commit() db.session.commit()
log_event(
event_type='room_member_remove',
details={
'room_id': room_id,
'room_name': room.name,
'removed_user_id': user_id,
'removed_user_name': f"{user.username} {user.last_name}",
'removed_by': f"{current_user.username} {current_user.last_name}"
},
user_id=current_user.id
)
return jsonify({'success': True}) return jsonify({'success': True})
@room_members_bp.route('/<int:room_id>/members/<int:user_id>/permissions', methods=['PUT']) @room_members_bp.route('/<int:room_id>/members/<int:user_id>/permissions', methods=['PUT'])
@@ -118,4 +143,26 @@ def update_member_permissions(room_id, user_id):
db.session.commit() db.session.commit()
log_event(
event_type='room_member_permissions_update',
details={
'room_id': room_id,
'room_name': room.name,
'user_id': user_id,
'user_name': f"{permission.user.username} {permission.user.last_name}",
'updated_by': f"{current_user.username} {current_user.last_name}",
'old_permissions': {
'can_view': permission.can_view,
'can_download': permission.can_download,
'can_upload': permission.can_upload,
'can_delete': permission.can_delete,
'can_rename': permission.can_rename,
'can_move': permission.can_move,
'can_share': permission.can_share
},
'new_permissions': permissions
},
user_id=current_user.id
)
return jsonify({'success': True}) return jsonify({'success': True})

View File

@@ -4,6 +4,7 @@ from models import db, Room, User, RoomMemberPermission, RoomFile
from forms import RoomForm from forms import RoomForm
from routes.room_files import user_has_permission from routes.room_files import user_has_permission
from routes.auth import require_password_change from routes.auth import require_password_change
from utils import log_event
rooms_bp = Blueprint('rooms', __name__, url_prefix='/rooms') rooms_bp = Blueprint('rooms', __name__, url_prefix='/rooms')
@@ -53,6 +54,17 @@ def create_room():
db.session.add(creator_permission) db.session.add(creator_permission)
db.session.commit() db.session.commit()
log_event(
event_type='room_create',
details={
'room_id': room.id,
'room_name': room.name,
'description': room.description,
'created_by': f"{current_user.username} {current_user.last_name}"
},
user_id=current_user.id
)
flash('Room created successfully!', 'success') flash('Room created successfully!', 'success')
return redirect(url_for('rooms.rooms')) return redirect(url_for('rooms.rooms'))
return render_template('rooms/create_room.html', form=form) return render_template('rooms/create_room.html', form=form)
@@ -74,6 +86,17 @@ def room(room_id):
can_rename = user_has_permission(room, 'can_rename') can_rename = user_has_permission(room, 'can_rename')
can_move = user_has_permission(room, 'can_move') can_move = user_has_permission(room, 'can_move')
can_share = user_has_permission(room, 'can_share') can_share = user_has_permission(room, 'can_share')
log_event(
event_type='room_open',
details={
'room_id': room_id,
'room_name': room.name,
'accessed_by': f"{current_user.username} {current_user.last_name}"
},
user_id=current_user.id
)
return render_template('rooms/room.html', room=room, can_download=can_download, can_upload=can_upload, can_delete=can_delete, can_rename=can_rename, can_move=can_move, can_share=can_share) return render_template('rooms/room.html', room=room, can_download=can_download, can_upload=can_upload, can_delete=can_delete, can_rename=can_rename, can_move=can_move, can_share=can_share)
@rooms_bp.route('/<int:room_id>/members') @rooms_bp.route('/<int:room_id>/members')
@@ -183,9 +206,26 @@ def edit_room(room_id):
form = RoomForm() form = RoomForm()
if form.validate_on_submit(): if form.validate_on_submit():
old_name = room.name
old_description = room.description
room.name = form.name.data room.name = form.name.data
room.description = form.description.data room.description = form.description.data
db.session.commit() db.session.commit()
log_event(
event_type='room_update',
details={
'room_id': room.id,
'old_name': old_name,
'new_name': room.name,
'old_description': old_description,
'new_description': room.description,
'updated_by': f"{current_user.username} {current_user.last_name}"
},
user_id=current_user.id
)
flash('Room updated successfully!', 'success') flash('Room updated successfully!', 'success')
return redirect(url_for('rooms.rooms')) return redirect(url_for('rooms.rooms'))
@@ -214,6 +254,16 @@ def delete_room(room_id):
db.session.commit() db.session.commit()
print("Room deleted successfully") print("Room deleted successfully")
log_event(
event_type='room_delete',
details={
'room_id': room_id,
'room_name': room_name,
'deleted_by': f"{current_user.username} {current_user.last_name}"
},
user_id=current_user.id
)
flash(f'Room "{room_name}" has been deleted.', 'success') flash(f'Room "{room_name}" has been deleted.', 'success')
except Exception as e: except Exception as e:
db.session.rollback() db.session.rollback()

View File

@@ -1,7 +1,7 @@
from flask import Blueprint, jsonify, request, abort from flask import Blueprint, jsonify, request, abort
from flask_login import login_required, current_user from flask_login import login_required, current_user
from models import db, Room, RoomFile, TrashedFile, UserStarredFile from models import db, Room, RoomFile, TrashedFile, UserStarredFile
from utils import user_has_permission, clean_path from utils import user_has_permission, clean_path, log_event
import os import os
from datetime import datetime from datetime import datetime
@@ -77,6 +77,20 @@ def restore_file(room_id, trash_id):
db.session.delete(trashed_file) db.session.delete(trashed_file)
db.session.commit() db.session.commit()
log_event(
event_type='file_restore',
details={
'filename': trashed_file.name,
'room_id': room_id,
'room_name': room.name,
'original_path': trashed_file.original_path,
'restored_by': f"{current_user.username} {current_user.last_name}",
'file_type': trashed_file.type,
'file_size': trashed_file.size if trashed_file.type == 'file' else None
},
user_id=current_user.id
)
return jsonify({'success': True}) return jsonify({'success': True})
@trash_bp.route('/<int:room_id>/trash/<int:trash_id>', methods=['DELETE']) @trash_bp.route('/<int:room_id>/trash/<int:trash_id>', methods=['DELETE'])
@@ -94,6 +108,21 @@ def permanently_delete_file(room_id, trash_id):
db.session.delete(trashed_file) db.session.delete(trashed_file)
db.session.commit() db.session.commit()
log_event(
event_type='file_delete_permanent',
details={
'filename': trashed_file.name,
'room_id': room_id,
'room_name': room.name,
'original_path': trashed_file.original_path,
'deleted_by': f"{current_user.username} {current_user.last_name}",
'file_type': trashed_file.type,
'file_size': trashed_file.size if trashed_file.type == 'file' else None,
'was_in_trash': True
},
user_id=current_user.id
)
return jsonify({'success': True}) return jsonify({'success': True})
@trash_bp.route('/<int:room_id>/trash/empty', methods=['POST']) @trash_bp.route('/<int:room_id>/trash/empty', methods=['POST'])
@@ -101,6 +130,7 @@ def permanently_delete_file(room_id, trash_id):
def empty_trash(room_id): def empty_trash(room_id):
"""Empty the trash for a specific room.""" """Empty the trash for a specific room."""
try: try:
room = Room.query.get_or_404(room_id)
# Get all trashed files # Get all trashed files
trashed_files = TrashedFile.query.filter_by(room_id=room_id).all() trashed_files = TrashedFile.query.filter_by(room_id=room_id).all()
@@ -125,6 +155,17 @@ def empty_trash(room_id):
db.session.commit() db.session.commit()
log_event(
event_type='trash_empty',
details={
'room_id': room_id,
'room_name': room.name,
'emptied_by': f"{current_user.username} {current_user.last_name}",
'files_deleted_count': len(trashed_files)
},
user_id=current_user.id
)
return jsonify({'success': True}) return jsonify({'success': True})
except Exception as e: except Exception as e:
db.session.rollback() db.session.rollback()