Actualiser api/post.php
This commit is contained in:
parent
c8b418118d
commit
fcb30cd19f
107
api/post.php
107
api/post.php
@ -1,37 +1,112 @@
|
||||
<?php
|
||||
session_start();
|
||||
|
||||
header('Content-Type: application/json');
|
||||
require '../config/db.php';
|
||||
require '../lib/RateLimit.php';
|
||||
require '../lib/FileValidator.php';
|
||||
|
||||
$env = require '../config/env.php';
|
||||
$rateLimit = new RateLimit($pdo);
|
||||
$fileValidator = new FileValidator();
|
||||
|
||||
$userId = $_SESSION['user_id'] ?? null;
|
||||
if(!$userId){
|
||||
echo json_encode(['success'=>false,'message'=>'Vous devez être connecté']);
|
||||
|
||||
if (!$userId) {
|
||||
http_response_code(401);
|
||||
echo json_encode(['success' => 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(!$content){
|
||||
echo json_encode(['success'=>false,'message'=>'Message vide']);
|
||||
|
||||
if (empty($content)) {
|
||||
http_response_code(400);
|
||||
echo json_encode(['success' => false, 'message' => 'Le message ne peut pas être vide']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Insertion du message
|
||||
$stmt = $pdo->prepare("INSERT INTO messages (id_utilisateur, contenu, date_creation)>
|
||||
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();
|
||||
|
||||
// Upload de fichier
|
||||
if(!empty($_FILES['image']['tmp_name'])){
|
||||
// Traiter les fichiers
|
||||
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']);
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
$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']>
|
||||
// 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']
|
||||
]);
|
||||
}
|
||||
|
||||
echo json_encode(['success'=>true,'message'=>'Post publié avec succès']);
|
||||
// Enregistrer l'activité
|
||||
$rateLimit->recordAttempt($userId, 'post');
|
||||
|
||||
echo json_encode(['success' => true, 'message' => 'Post publié avec succès']);
|
||||
Loading…
Reference in New Issue
Block a user