false, 'message' => 'Vous devez être connecté']); exit; } // Rate limiting : 1 post par minute par utilisateur if ($rateLimit->isBlocked($userId, 'post', 1, 60)) { http_response_code(429); echo json_encode(['success' => false, 'message' => 'Vous ne pouvez poster qu\'une fois par minute']); exit; } $content = trim($_POST['content'] ?? ''); if (empty($content)) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Le message ne peut pas être vide']); exit; } if (strlen($content) > 5000) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Le message ne doit pas dépasser 5000 caractères']); exit; } // Insérer le message $stmt = $pdo->prepare( "INSERT INTO `{$env['TABLE_MESSAGES']}` (id_utilisateur, contenu, date_creation) VALUES (?, ?, NOW())" ); $stmt->execute([$userId, $content]); $messageId = $pdo->lastInsertId(); // Traiter les fichiers if (!empty($_FILES['image']['tmp_name'])) { $file = $_FILES['image']; // Valider le fichier avec un max de 2 Mo $validationResult = $fileValidator->validate($file, 2 * 1024 * 1024); if (!$validationResult['valid']) { http_response_code(400); echo json_encode(['success' => false, 'message' => $validationResult['error']]); exit; } // Vérifier la sécurité du fichier (avant de le déplacer) if (!$fileValidator->isSafe($file['tmp_name'])) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'Le fichier contient du contenu dangereux']); exit; } // Créer le répertoire uploads s'il n'existe pas $uploadDir = __DIR__ . '/../uploads/'; if (!is_dir($uploadDir)) { mkdir($uploadDir, 0755, true); } // Générer un nom de fichier sécurisé $fileName = uniqid('post_', true) . '.' . $validationResult['ext']; $filePath = $uploadDir . $fileName; // Vérifier les permissions if (!is_writable($uploadDir)) { http_response_code(500); echo json_encode(['success' => false, 'message' => 'Erreur serveur']); exit; } // Déplacer le fichier if (!move_uploaded_file($file['tmp_name'], $filePath)) { http_response_code(500); echo json_encode(['success' => false, 'message' => 'Erreur lors de l\'upload']); exit; } // Sauvegarder dans la DB le chemin du fichier (pas le base64) $stmt = $pdo->prepare( "INSERT INTO `{$env['TABLE_FILES']}` (id_message, nom_fichier, chemin_fichier, taille, type_mime, date_upload) VALUES (?, ?, ?, ?, ?, NOW())" ); $stmt->execute([ $messageId, $file['name'], '/uploads/' . $fileName, // Chemin relatif au web $file['size'], $validationResult['mime'] ]); } // Enregistrer l'activité $rateLimit->recordAttempt($userId, 'post'); echo json_encode(['success' => true, 'message' => 'Post publié avec succès']);