diff --git a/api/post.php b/api/post.php index c9375b4..7cbb8e3 100644 --- a/api/post.php +++ b/api/post.php @@ -1,37 +1,112 @@ -false,'message'=>'Vous devez être connecté']); - exit; -} - -$content = trim($_POST['content'] ?? ''); -if(!$content){ - echo json_encode(['success'=>false,'message'=>'Message vide']); - exit; -} - -// Insertion du message -$stmt = $pdo->prepare("INSERT INTO messages (id_utilisateur, contenu, date_creation)> -$stmt->execute([$userId, $content]); -$messageId = $pdo->lastInsertId(); - -// Upload de fichier -if(!empty($_FILES['image']['tmp_name'])){ - $file = $_FILES['image']; - $allowedTypes = ['image/png','image/jpeg']; - if(!in_array($file['type'],$allowedTypes) || $file['size']>2*1024*1024){ - echo json_encode(['success'=>false,'message'=>'Fichier non valide']); - exit; - } - - $data = file_get_contents($file['tmp_name']); - $base64 = 'data:'.$file['type'].';base64,'.base64_encode($data); - $stmt = $pdo->prepare("INSERT INTO fichiers (id_message, nom_fichier, chemin_fic> - $stmt->execute([$messageId, $file['name'], $base64, $file['size'], $file['type']> -} - -echo json_encode(['success'=>true,'message'=>'Post publié avec succès']); \ No newline at end of file + 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']); \ No newline at end of file