www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

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 ?>