diff --git a/admin.php b/admin.php index f3f6b23..5637d96 100644 --- a/admin.php +++ b/admin.php @@ -121,6 +121,18 @@ function showAdminInterface() { + + + + diff --git a/arbre-img-prive.php b/arbre-img-prive.php new file mode 100644 index 0000000..fe8a3de --- /dev/null +++ b/arbre-img-prive.php @@ -0,0 +1,305 @@ + 0) { + $_SESSION['success_message'] = "$successCount image(s) téléversée(s) avec succès."; + } + if (!empty($errors)) { + $_SESSION['error_message'] = implode("\n", $errors); + } + break; + + case 'toggle_top': + $image = $_POST['image'] ?? ''; + if ($image) { + $imagePath = $currentPath . '/' . basename($image); + if (isSecurePrivatePath($imagePath) && file_exists($imagePath)) { + $info = pathinfo($imagePath); + $isTop = strpos($info['filename'], '--top--') !== false; + + if ($isTop) { + // Enlever le tag top + $newName = str_replace('--top--', '', $info['filename']) . '.' . $info['extension']; + } else { + // Ajouter le tag top + $newName = $info['filename'] . '--top--.' . $info['extension']; + } + + $newPath = $currentPath . '/' . $newName; + if (rename($imagePath, $newPath)) { + $_SESSION['success_message'] = $isTop ? "Image retirée des tops." : "Image mise en top."; + } else { + $_SESSION['error_message'] = "Erreur lors de la modification du statut top."; + } + } + } + break; + + case 'delete': + $images = $_POST['images'] ?? []; + $deleteCount = 0; + + foreach ($images as $image) { + $imagePath = $currentPath . '/' . basename($image); + if (isSecurePrivatePath($imagePath) && file_exists($imagePath)) { + if (unlink($imagePath)) { + $deleteCount++; + } + } + } + + if ($deleteCount > 0) { + $_SESSION['success_message'] = "$deleteCount image(s) supprimée(s)."; + } + break; + } + } + header('Location: arbre-img-prive.php?path=' . urlencode($currentPath)); + exit; +} + +// Récupérer les images du dossier courant +$images = []; +$tempImages = []; +foreach (new DirectoryIterator($currentPath) as $file) { + if ($file->isDot()) continue; + if ($file->isFile()) { + $extension = strtolower($file->getExtension()); + if (in_array($extension, ALLOWED_EXTENSIONS)) { + $tempImages[] = [ + 'name' => $file->getFilename(), + 'time' => $file->getCTime() + ]; + } + } +} + +// Trier par date de création décroissante +usort($tempImages, function($a, $b) { + return $b['time'] - $a['time']; +}); + +// Extraire uniquement les noms de fichiers +$images = array_map(function($img) { + return $img['name']; +}, $tempImages); + +$currentAlbumInfo = getAlbumInfo($currentPath); +?> + + + + + + + Gestion des images privées - ICO + + + + + +
+

+ Images de : + Privé +

+
+ + + + Retour + +
+
+ +
+ +
+ + + + +
+ + + +
+

Glissez-déposez vos images ici ou cliquez sur "Ajouter des images"

+
+ + +
+
+ +
+ +
+ +
+ +
+ <?php echo htmlspecialchars($image); ?> +
+ + + +
+
+
+ +
+
+
+ + + + \ No newline at end of file diff --git a/arbre-prive.php b/arbre-prive.php new file mode 100644 index 0000000..124ada3 --- /dev/null +++ b/arbre-prive.php @@ -0,0 +1,327 @@ +'; + + // Si c'est le dossier racine, ajoutons-le à l'arborescence + if ($path === './liste_albums_prives') { + $info = getAlbumInfo($path); + $output .= '
  • '; + $output .= '
    '; + $output .= ''; + $output .= '🔒 ' . htmlspecialchars($info['title']); + if ($info['mature_content']) { + $output .= ' 🔞'; + } + $output .= ''; + $output .= '
    '; + $output .= ''; + $output .= ''; + $output .= '
    '; + } + + // Parcourir tous les sous-dossiers + foreach (new DirectoryIterator($path) as $item) { + if ($item->isDot()) continue; + if ($item->isDir()) { + $fullPath = $item->getPathname(); + $info = getAlbumInfo($fullPath); + $isCurrentPath = realpath($fullPath) === $currentPath; + $hasSubfolders = hasSubfolders($fullPath); + + $output .= '
  • '; + $output .= '
    '; + $output .= ''; + $output .= '🔒 ' . htmlspecialchars($info['title']); + if ($info['mature_content']) { + $output .= ' 🔞'; + } + $output .= ''; + $output .= '
    '; + if (!$hasSubfolders) { + $output .= '🖼️'; + } + if (!$hasSubfolders) { + $output .= ''; + } else { + $output .= ''; + } + if (!hasImages($fullPath)) { + $output .= ''; + } + if ($fullPath !== './liste_albums_prives') { + $output .= ''; + } + $output .= '
    '; + + $output .= generatePrivateTree($fullPath, $currentPath); + $output .= '
  • '; + } + } + + $output .= ''; + return $output; +} +?> + + + + + + Albums privés - ICO + + + + + +
    +

    Gestion des albums privés

    +
    + + Retour +
    +
    + +
    + +
    + + + + +
    + + + +
    + +
    +
    + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonctions.php b/fonctions.php index 6d66a37..7982165 100644 --- a/fonctions.php +++ b/fonctions.php @@ -12,6 +12,18 @@ function getBaseUrl() { return $protocol . $_SERVER['HTTP_HOST'] . '/' . PROJECT_ROOT_DIR; } +/** + * Vérifie si le chemin est sécurisé (dans le dossier liste_albums_prives) + * @param string $path Chemin à vérifier + * @return bool True si le chemin est sécurisé + */ +function isSecurePrivatePath($path) { + $realPath = realpath($path); + $privateRootPath = realpath('./liste_albums_prives'); + + return $realPath && (strpos($realPath, $privateRootPath) === 0); +} + /** * Récupère les informations d'un album depuis son fichier infos.txt * @param string $albumPath Chemin vers l'album diff --git a/styles-admin.css b/styles-admin.css index 0749a1f..a958f63 100644 --- a/styles-admin.css +++ b/styles-admin.css @@ -57,6 +57,25 @@ body { margin: 0; } +/* Badge pour les contenus privés */ +.private-badge { + display: inline-flex; + align-items: center; + gap: 0.5rem; + background-color: #6c757d; + color: white; + padding: 0.25rem 0.75rem; + border-radius: 1rem; + font-size: 0.9rem; + margin-left: 1rem; + font-weight: normal; +} + +.private-badge::before { + content: "🔒"; + font-size: 1.1em; +} + /* Zone de contenu principale */ .admin-content { width: 100%;