stockage.php (5441B)
1 <?php 2 3 // Chaque fonction appelle Permissions::vérifier_permission($chemin, $action, $utilisateur). 4 5 // Chaque fonction ajoute un chemin de base (pour le stockage) avant 6 // $chemin, puis appelle une fonction de systeme-fichiers.php 7 8 class Stockage { 9 public static function nouvelle_page($chemin, $nom, $type) { 10 if (Permissions::vérifier_permission($chemin, "nouvelle_page")) { 11 $enfant = $chemin->enfant($nom); 12 Système_fichiers::créer_dossier($enfant->get_fs_stockage()); 13 self::set_prop($enfant, "type", $type); 14 $e = self::activer_réécriture($enfant); 15 if (Erreur::is_erreur($e)) return Erreur::fatale("Erreur lors de la mise en place de la redirection pour " . $enfant->get() . ".", $e); 16 return $enfant; 17 } else { 18 return false; 19 } 20 } 21 22 // Imitation de l'url rewriting lorsque ce n'est pas disponible sur 23 // le serveur. 24 public static function activer_réécriture($chemin_vers) { 25 // TODO : SECURITE : échapper les " dans le require_once et l'appel à cms. 26 $a = $chemin_vers->get_fs_public(); 27 $b = Path::combine(Config::get("chemin_base"), "cms.php"); 28 29 $php_str = "<?php\n\n"; 30 $php_str .= "require_once(dirname(__FILE__) . \"/" . Path::relative($a, $b) . "\");\n\n"; 31 $php_str .= "CMS::page(\"" . $chemin_vers->get() . "\");\n\n"; 32 $php_str .= "?>"; 33 return Système_fichiers::écrire(Path::combine($a, "/index.php"), $php_str); 34 } 35 36 public static function désactiver_réécriture($chemin_vers) { 37 return Système_fichiers::supprimer($chemin_vers->get_fs_public()); 38 } 39 40 private static function fichier_prop($chemin, $prop) { 41 return Path::combine($chemin->get_fs_stockage(), '__prop__' . $prop); 42 } 43 44 public static function set_prop($chemin, $prop, $valeur) { 45 if (Permissions::vérifier_permission($chemin, "set_prop")) { 46 return Système_fichiers::écrire(self::fichier_prop($chemin, $prop), $valeur); 47 } else { 48 return false; 49 } 50 } 51 52 // Stocke le contenu de $fichier dans $prop, et supprime $fichier. 53 public static function set_prop_fichier($chemin, $prop, $fichier) { 54 if (Permissions::vérifier_permission($chemin, "set_prop")) { 55 return Système_fichiers::déplacer($fichier, self::fichier_prop($chemin, $prop)); 56 } else { 57 return false; 58 } 59 } 60 61 // Comme pour set_prop_fichier, mais pour un fichier reçu (uploadé). 62 public static function set_prop_fichier_reçu($chemin, $prop, $fichier) { 63 if (Permissions::vérifier_permission($chemin, "set_prop")) { 64 return Système_fichiers::déplacer_fichier_téléchargé($fichier, self::fichier_prop($chemin, $prop)); 65 } else { 66 return false; 67 } 68 } 69 70 public static function get_prop($chemin, $prop, $forcer_permissions = false) { 71 // $forcer_permissions permet à Permissions::vérifier_permission() et ses 72 // dépendances get_regles() et get_groupe() de faire des get_prop 73 // même si l'utilisateur courant n'en a pas le droit. 74 if ($forcer_permissions || Permissions::vérifier_permission($chemin, "get_prop")) { 75 return Système_fichiers::lire(self::fichier_prop($chemin, $prop)); 76 } else { 77 return Erreur::lecture("Permission non accordée pour la lecture de chemin: " . $chemin->get() . " propriété: " . $prop); 78 } 79 } 80 81 public static function get_prop_sendfile($chemin, $prop) { 82 // Envoie tout le conctenu de $prop sur le réseau. 83 // Équivalent à appeller sendfile sur le fichier qui contient $prop. 84 if (Permissions::vérifier_permission($chemin, "get_prop")) { 85 return Système_fichiers::envoyer_fichier_directement(self::fichier_prop($chemin, $prop)); 86 } else { 87 return Erreur::lecture("Permission non accordée pour la lecture de chemin: " . $chemin->get() . " propriété: " . $prop); 88 } 89 } 90 91 public static function prop_diff($chemin, $prop, $valeur) { 92 // Renvoie true si la valeur actuelle de $prop est différente de $valeur. 93 return self::get_prop($chemin, $prop) != $valeur; 94 } 95 96 // TODO : la suppression non récursive d'une page implique de supprimer 97 // ses propriétés, or pour ça, il faudrait que la suppression soit 98 // récursive sur un niveau seulement, ce qui n'est pas possible avec ce 99 // code. 100 public static function supprimer($chemin, $récursif) { 101 if (Permissions::vérifier_permission($chemin, "supprimer")) { 102 // TODO : désactiver_réécriture($chemin) récursivement 103 return Système_fichiers::supprimer($chemin->get_fs_stockage(), $récursif); 104 } else { 105 return false; 106 } 107 } 108 109 public static function liste_enfants($chemin) { 110 // TODO : SECURITE : vérifier la permission. Mais pour quelle action ? 111 // get_prop ? ou une nouvelle (?) : liste_enfants ? 112 $enfants = Array(); 113 foreach (Système_fichiers::liste_fichiers($chemin->get_fs_stockage()) as $k => $v) { 114 if (strpos($v, "__prop__") !== 0 && is_dir($chemin->enfant($v)->get_fs_stockage()) && $v != "." && $v != "..") { 115 $enfants[] = $chemin->enfant($v); 116 } 117 } 118 return $enfants; 119 } 120 121 public static function renomer($chemin, $nouveau_nom) { 122 if ($chemin->dernier() == $nouveau_nom) { 123 return true; 124 } 125 126 if (Permissions::vérifier_permission($chemin->parent(), "nouvelle_page") && Permissions::vérifier_permission($chemin, "supprimer")) { 127 self::désactiver_réécriture($chemin); // TODO : récursivement ! 128 self::activer_réécriture($chemin->renomer($nouveau_nom)); // TODO : récursivement ! 129 return Système_fichiers::déplacer($chemin->get_fs_stockage(), $chemin->renomer($nouveau_nom)->get_fs_stockage()); 130 } else { 131 return false; 132 } 133 } 134 } 135 136 ?>