Lecteur Markdown
DISKMASTER_IMPROVEMENTS_FR
DiskMaster 3.1 - Améliorations 2025 #
🎯 Nouveautés #
✅ Ce qui a été ajouté #
1. Copie bidirectionnelle : `← COPY`
- Copie maintenant de la liste 2 (droite) vers liste 1 (gauche)
- Symétrisation complète des opérations
2. Upload sécurisé : `📤 UPLOAD`
- Interface drag & drop (prête pour amélioration)
- Upload multiple de fichiers
- Gestion des doublons automatique
- Progress bar
3. Download sécurisé : `📥 DOWNLOAD`
- Plus de lien direct exposant le path
- Passage par `diskmaster.mod` handler
- Force le téléchargement pour TOUS les types (y compris .md)
- Validation path complète
---
📦 Fichiers modifiés/créés #
1. `diskmaster.php` (modifié) #
Changements :
- Ajout bouton `← COPY` (ligne ~652)
- Ajout bouton `📤 UPLOAD` (ligne ~656)
- Fonction `copyFileReverse()` pour copie inverse
- Fonction `uploadFile()` avec dialog modal
- Fonction `downloadFile()` utilise maintenant le handler sécurisé
2. `diskmaster.mod.php` (nouveau) #
Actions supportées :
- `download` : Téléchargement sécurisé avec validation path
- `upload` : Upload multiple avec sanitization
- `info` : Infos fichier (pour usage futur)
---
🔧 Utilisation #
Copie bidirectionnelle #
Avant : Seul `COPY →` (gauche vers droite)
Maintenant :
1. `COPY →` : Gauche vers droite (comme avant)
2. `← COPY` : Droite vers gauche (nouveau!)
Workflow :
1. Sélectionne un fichier dans la liste de DROITE
2. Clique sur "← COPY"
3. Le fichier est copié vers la liste de GAUCHE
---
Upload de fichiers #
Workflow :
1. Navigue vers le dossier de destination (liste de gauche)
2. Clique sur "📤 UPLOAD"
3. Sélectionne un ou plusieurs fichiers
4. Clique "UPLOAD"
5. La page recharge automatiquement
Fonctionnalités :
- Upload multiple simultané
- Gestion automatique des doublons (ajoute `_1`, `_2`, etc.)
- Sanitization des noms de fichiers
- Progress bar visuelle
- Messages d'erreur clairs
---
Download sécurisé #
Avant :
window.location.href = getCurrentSourcePath() + '/' + selectedSource;
// → Exposait le path, .md affichés comme texte brut
Maintenant :
window.location.href = '?obj=diskmaster.mod&action=download&path=' + filepath;
// → Handler valide le path, force download pour TOUS types
Sécurité :
- ✅ Path traversal impossible (`../` bloqué)
- ✅ Validation contre whitelist `$allowedDirs`
- ✅ Force header `Content-Disposition: attachment`
- ✅ Fichiers .md téléchargés au lieu d'affichés
---
🛡️ Sécurité #
Validation des paths #
Tous les paths passent par `validatePath()` :
function validatePath($path, $allowedDirs) {
// 1. Sanitize via Parser
// 2. Remove ../ et backslashes
// 3. Check contre whitelist
// 4. Return false si invalide
}
Upload sécurisé #
// 1. Vérif ADMIN level
if(!secure('SYSTEM_LEVEL_ADMIN')) exit;
// 2. Vérif path destination
if(!validatePath($targetDir, $allowedDirs)) exit;
// 3. Sanitize filename
$filename = preg_replace('/[^a-zA-Z0-9._-]/', '_', $filename);
// 4. Vérif upload errors
if($_FILES['files']['error'][$i] !== UPLOAD_ERR_OK) continue;
Download sécurisé #
// 1. Validate path
if(!validatePath($dir, $allowedDirs)) {
http_response_code(403);
exit;
}
// 2. Vérif existence
if(!file_exists($fullPath)) {
http_response_code(404);
exit;
}
// 3. Force download
header('Content-Disposition: attachment; filename="' . $filename . '"');
---
🐛 Corrections de bugs #
Bug #1 : Fichiers .md servis comme HTML #
Avant : `window.location.href = path/file.md` → Navigateur affiche le markdown brut
Après : Handler force `Content-Disposition: attachment` → Téléchargement systématique
Bug #2 : Liste 2 inutilisable #
Avant : Impossible de copier liste2 → liste1
Après : Bouton `← COPY` fait l'inverse de `COPY →`
Bug #3 : Pas d'upload #
Avant : Aucun moyen d'envoyer des fichiers
Après : Interface complète avec upload multiple
---
📊 Tests recommandés #
Test 1 : Copie bidirectionnelle #
1. Créer fichier test.txt dans user/
2. Naviguer vers user/data/ (liste droite)
3. Sélectionner test.txt (liste gauche)
4. COPY → (gauche vers droite)
5. Vérifier présence dans user/data/
6. Sélectionner test.txt (liste DROITE)
7. ← COPY (droite vers gauche)
8. Vérifier copie réussie
Test 2 : Upload #
1. Naviguer vers user/test/
2. Cliquer "📤 UPLOAD"
3. Sélectionner plusieurs fichiers
4. Cliquer "UPLOAD"
5. Vérifier que tous les fichiers sont présents
6. Essayer d'uploader un fichier avec le même nom
7. Vérifier ajout automatique de _1, _2, etc.
Test 3 : Download sécurisé #
1. Créer un fichier test.md avec du contenu
2. Le sélectionner dans la liste
3. Cliquer "📥 DOWNLOAD"
4. Vérifier que le navigateur le TÉLÉCHARGE au lieu de l'afficher
5. Ouvrir le fichier téléchargé
6. Vérifier que le contenu est intact
Test 4 : Sécurité path traversal #
Tenter (via console ou Postman):
GET ?obj=diskmaster.mod&action=download&path=../../etc/passwd
Résultat attendu: 403 Forbidden
---
🎨 Améliorations futures possibles #
Upload drag & drop #
Actuellement : Bouton file input classique
Amélioration :
// Zone drop
<div id="dropZone" ondrop="handleDrop(event)" ondragover="allowDrop(event)">
Glissez vos fichiers ici
</div>
function handleDrop(e) {
e.preventDefault();
const files = e.dataTransfer.files;
uploadFiles(files);
}
Preview fichiers #
Avant téléchargement, afficher :
- Images : Thumbnail
- Texte : Aperçu 100 premiers caractères
- PDF : Première page
Compression ZIP #
Bouton "Download as ZIP" pour télécharger un dossier complet
Permissions utilisateur #
Actuellement : `SYSTEM_LEVEL_ADMIN` requis
Amélioration : Permissions granulaires par dossier
$allowedDirs = [
'user' => ['read', 'write', 'delete'],
'user/shared' => ['read', 'write'],
'user/public' => ['read']
];
---
⚠️ Notes importantes #
Permissions serveur #
Upload nécessite permissions d'écriture :
chmod 755 user/
chmod 755 user/data/
# etc.
Taille max upload #
Configurer dans `php.ini` :
upload_max_filesize = 50M
post_max_size = 50M
max_execution_time = 300
Types MIME #
Le handler détecte automatiquement le MIME type via `finfo_file()`.
Pour forcer un type spécifique :
$mimeType = 'application/octet-stream'; // Force binary download
---
📞 Support #
Logs d'erreurs #
Vérifier :
tail -f /var/log/php/error.log
Troubleshooting #
Upload ne marche pas :
1. Vérifier permissions dossier
2. Vérifier `upload_max_filesize` PHP
3. Vérifier logs Apache/Nginx
4. Tester avec un petit fichier (<1MB)
Download ne marche pas :
1. Vérifier que le fichier existe
2. Vérifier path validation
3. Vérifier niveau admin user
4. Tester avec curl : `curl -v "url?obj=diskmaster.mod&action=download&path=user/test.txt"`
Copy← ne fait rien :
1. Vérifier sélection dans liste DROITE
2. Vérifier console JavaScript pour erreurs
3. Vérifier permissions destination
---
Version : DiskMaster 3.1
Date : 2025-12-29
Auteur : Treveur 'Nowee' Bretaudière