Skip to content

Commit 9e95468

Browse files
awehttamclaude
andcommitted
Surface virus detection error on file upload with server log entry
- Upload route now returns a specific 422 error when virus is detected instead of falling through to the generic 'Failed to upload file' message - Virus rejection is logged to server log via admin daemon with username, filename, and file area - Unknown upload errors now log to PHP error log before returning generic message - Add errors.files.upload.virus_detected i18n key to en/es/fr Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent c7c2fcb commit 9e95468

5 files changed

Lines changed: 19 additions & 1 deletion

File tree

config/i18n/en/errors.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
'errors.files.upload.area_not_found' => 'File area not found',
144144
'errors.files.upload.read_only' => 'This file area is read-only',
145145
'errors.files.upload.admin_only' => 'Only administrators can upload files to this area',
146+
'errors.files.upload.virus_detected' => 'File rejected: virus detected',
146147
'errors.files.upload.failed' => 'Failed to upload file',
147148

148149
// Admin Users

config/i18n/es/errors.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
'errors.files.upload.area_not_found' => 'Area de archivos no encontrada',
144144
'errors.files.upload.read_only' => 'Esta area de archivos es de solo lectura',
145145
'errors.files.upload.admin_only' => 'Solo los administradores pueden subir archivos a esta area',
146+
'errors.files.upload.virus_detected' => 'Archivo rechazado: virus detectado',
146147
'errors.files.upload.failed' => 'No se pudo subir el archivo',
147148

148149
// Admin Users

config/i18n/fr/errors.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@
112112
'errors.files.upload.area_not_found' => 'Zone de fichiers introuvable',
113113
'errors.files.upload.read_only' => 'Cette zone de fichiers est en lecture seule',
114114
'errors.files.upload.admin_only' => 'Seuls les administrateurs peuvent téléverser des fichiers dans cette zone',
115+
'errors.files.upload.virus_detected' => 'Fichier rejeté : virus détecté',
115116
'errors.files.upload.failed' => 'Échec du téléversement du fichier',
116117
'errors.admin.users.not_found' => 'Utilisateur introuvable',
117118
'errors.admin.users.create_failed' => 'Échec de la création de l\'utilisateur',

public_html/sw.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const CACHE_NAME = 'binkcache-v196';
1+
const CACHE_NAME = 'binkcache-v197';
22

33
// Static assets to precache
44
const staticAssets = [

routes/api-routes.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2486,7 +2486,22 @@ function apiLocalizeErrorPayload(array $payload, ?array $user = null): array
24862486
apiError('errors.files.upload.read_only', apiLocalizedText('errors.files.upload.read_only', 'This file area is read-only', $user));
24872487
} elseif ($message === 'Only administrators can upload files to this area.') {
24882488
apiError('errors.files.upload.admin_only', apiLocalizedText('errors.files.upload.admin_only', 'Only administrators can upload files to this area', $user));
2489+
} elseif ($message === 'File rejected: virus detected.') {
2490+
try {
2491+
$logClient = new \BinktermPHP\Admin\AdminDaemonClient();
2492+
$logClient->serverLog('WARNING', 'Infected file upload rejected', [
2493+
'username' => $user['username'] ?? 'unknown',
2494+
'filename' => $_FILES['file']['name'] ?? 'unknown',
2495+
'file_area' => $_POST['file_area_id'] ?? 'unknown',
2496+
]);
2497+
$logClient->close();
2498+
} catch (\Throwable $logEx) {
2499+
error_log("Failed to write virus rejection server log: " . $logEx->getMessage());
2500+
}
2501+
http_response_code(422);
2502+
apiError('errors.files.upload.virus_detected', apiLocalizedText('errors.files.upload.virus_detected', 'File rejected: virus detected', $user));
24892503
} else {
2504+
error_log("File upload error: " . $message);
24902505
apiError('errors.files.upload.failed', apiLocalizedText('errors.files.upload.failed', 'Failed to upload file', $user));
24912506
}
24922507
}

0 commit comments

Comments
 (0)