Fix backup error checking in rename and delete endpoints
- Add error checking for mkdir command (check result == 1) - Add error checking for cp backup command (check result == 1) - Strip trailing slash from wp_path to avoid double slashes - Return proper error messages when backup fails - Prevents rename/delete if backup fails - Fixes: 'Failed to backup file before quarantine' error
This commit is contained in:
parent
95be6ea49d
commit
1169b872cf
|
|
@ -1443,9 +1443,17 @@ def scanner_rename_file(request):
|
||||||
|
|
||||||
# Create backup if requested
|
# Create backup if requested
|
||||||
if backup_before_rename:
|
if backup_before_rename:
|
||||||
backup_dir_name = f'{file_token.wp_path}/.ai-scanner-backups/{datetime.datetime.now().strftime("%Y-%m-%d")}'
|
wp_path_clean = file_token.wp_path.rstrip('/')
|
||||||
|
backup_dir_name = f'{wp_path_clean}/.ai-scanner-backups/{datetime.datetime.now().strftime("%Y-%m-%d")}'
|
||||||
mkdir_cmd = f'mkdir -p "{backup_dir_name}"'
|
mkdir_cmd = f'mkdir -p "{backup_dir_name}"'
|
||||||
ProcessUtilities.executioner(mkdir_cmd, user=user)
|
mkdir_result = ProcessUtilities.executioner(mkdir_cmd, user=user)
|
||||||
|
|
||||||
|
# executioner returns 1 for success, 0 for failure
|
||||||
|
if mkdir_result != 1:
|
||||||
|
error_msg = f'Failed to create backup directory: {backup_dir_name}'
|
||||||
|
logging.writeToFile(f'[API] {error_msg}')
|
||||||
|
log_file_operation(scan_id, 'rename', old_path, False, error_msg, request=request)
|
||||||
|
return JsonResponse({'success': False, 'error': 'Failed to create backup directory', 'error_code': 'BACKUP_DIR_FAILED'}, status=500)
|
||||||
|
|
||||||
timestamp = int(time.time())
|
timestamp = int(time.time())
|
||||||
basename = os.path.basename(full_old_path)
|
basename = os.path.basename(full_old_path)
|
||||||
|
|
@ -1453,7 +1461,14 @@ def scanner_rename_file(request):
|
||||||
backup_path = os.path.join(backup_dir_name, backup_filename)
|
backup_path = os.path.join(backup_dir_name, backup_filename)
|
||||||
|
|
||||||
cp_cmd = f'cp "{full_old_path}" "{backup_path}"'
|
cp_cmd = f'cp "{full_old_path}" "{backup_path}"'
|
||||||
ProcessUtilities.executioner(cp_cmd, user=user)
|
cp_result = ProcessUtilities.executioner(cp_cmd, user=user)
|
||||||
|
|
||||||
|
# executioner returns 1 for success, 0 for failure
|
||||||
|
if cp_result != 1:
|
||||||
|
error_msg = f'Failed to backup file before rename'
|
||||||
|
logging.writeToFile(f'[API] {error_msg}, cp_result={cp_result}')
|
||||||
|
log_file_operation(scan_id, 'rename', old_path, False, error_msg, request=request)
|
||||||
|
return JsonResponse({'success': False, 'error': 'Failed to backup file before quarantine', 'error_code': 'BACKUP_FAILED'}, status=500)
|
||||||
|
|
||||||
# Perform rename
|
# Perform rename
|
||||||
mv_cmd = f'mv "{full_old_path}" "{full_new_path}"'
|
mv_cmd = f'mv "{full_old_path}" "{full_new_path}"'
|
||||||
|
|
@ -1620,9 +1635,17 @@ def scanner_delete_file(request):
|
||||||
backup_path = None
|
backup_path = None
|
||||||
|
|
||||||
# ALWAYS create backup before deletion
|
# ALWAYS create backup before deletion
|
||||||
backup_dir_name = f'{file_token.wp_path}/.ai-scanner-backups/{datetime.datetime.now().strftime("%Y-%m-%d")}'
|
wp_path_clean = file_token.wp_path.rstrip('/')
|
||||||
|
backup_dir_name = f'{wp_path_clean}/.ai-scanner-backups/{datetime.datetime.now().strftime("%Y-%m-%d")}'
|
||||||
mkdir_cmd = f'mkdir -p "{backup_dir_name}"'
|
mkdir_cmd = f'mkdir -p "{backup_dir_name}"'
|
||||||
ProcessUtilities.executioner(mkdir_cmd, user=user)
|
mkdir_result = ProcessUtilities.executioner(mkdir_cmd, user=user)
|
||||||
|
|
||||||
|
# executioner returns 1 for success, 0 for failure
|
||||||
|
if mkdir_result != 1:
|
||||||
|
error_msg = f'Failed to create backup directory: {backup_dir_name}'
|
||||||
|
logging.writeToFile(f'[API] {error_msg}')
|
||||||
|
log_file_operation(scan_id, 'delete', file_path, False, error_msg, request=request)
|
||||||
|
return JsonResponse({'success': False, 'error': 'Failed to create backup directory', 'error_code': 'BACKUP_DIR_FAILED'}, status=500)
|
||||||
|
|
||||||
timestamp = int(time.time())
|
timestamp = int(time.time())
|
||||||
basename = os.path.basename(full_path)
|
basename = os.path.basename(full_path)
|
||||||
|
|
@ -1634,7 +1657,9 @@ def scanner_delete_file(request):
|
||||||
|
|
||||||
# executioner returns 1 for success, 0 for failure
|
# executioner returns 1 for success, 0 for failure
|
||||||
if cp_result != 1:
|
if cp_result != 1:
|
||||||
log_file_operation(scan_id, 'delete', file_path, False, 'Backup creation failed - deletion blocked', backup_path=backup_path, request=request)
|
error_msg = f'Failed to backup file before deletion'
|
||||||
|
logging.writeToFile(f'[API] {error_msg}, cp_result={cp_result}')
|
||||||
|
log_file_operation(scan_id, 'delete', file_path, False, error_msg, backup_path=backup_path, request=request)
|
||||||
return JsonResponse({'success': False, 'error': 'Backup creation failed - deletion blocked', 'error_code': 'BACKUP_FAILED'}, status=500)
|
return JsonResponse({'success': False, 'error': 'Backup creation failed - deletion blocked', 'error_code': 'BACKUP_FAILED'}, status=500)
|
||||||
|
|
||||||
# Delete file
|
# Delete file
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue