permissions.php (3831B)
1 <?php 2 3 // Regle : 4 // - motif de chemin (liste de segments pouvant être une chaîne, *, ou ** pour le dernier) 5 // - motif d'action (get_prop, set_prop, creer_page, supprimer, *) 6 // - motif d'utilisateur ($utilisateur ou * ou "propriétaire") 7 // - autorisation : true ou false. 8 9 class Permissions { 10 private static function singleton() { 11 return new Chemin("/admin/permissions/"); 12 } 13 14 // Vérifie si $utilisateur a la permission d'effectuer $action sur $chemin. 15 public static function vérifier_permission($chemin, $action, $utilisateur = null) { 16 if ($utilisateur === null) { 17 $utilisateur = Authentification::get_utilisateur(); 18 } 19 $groupe = Authentification::get_groupe($utilisateur, true); // true => forcer permissions. 20 21 // Parcourt la liste les règles de sécurité (get_regles()), et 22 // sélectionne la première pour laquelle $chemin correspond au motif 23 // de la règle, $action correspond au motif de la règle, et 24 // $utilisateur a comme groupe le groupe de la règle (get_groupe()). 25 // Si le champ "autorisation" de la règle est true, on renvoie true, 26 // sinon on renvoie false 27 28 foreach (self::get_regles() as $r) { 29 if ( self::chemin_correspond($chemin, $r["chemin"]) 30 && self::action_correspond($action, $r["action"]) 31 && self::groupe_correspond($groupe, $r["groupe"])) { 32 return $r["autorisation"]; 33 } 34 } 35 36 return false; 37 } 38 39 public static function chemin_correspond($chemin, $motif) { 40 return $chemin->correspond($motif); 41 } 42 43 public static function action_correspond($action, $motif) { 44 if ($motif == '*') return true; 45 if ($action == $motif) return true; 46 return false; 47 } 48 49 public static function groupe_correspond($groupe, $motif) { 50 if ($motif == '*') return true; 51 if ($groupe == $motif) return true; 52 return false; 53 } 54 55 // TODO : d'abord set_nouvelles_regles, puis appliquer_nouvelles_regles. 56 public static function set_regles($regles) { 57 // $regles est un tableau de quadruplets 58 // (chemin, action, groupe, autorisation). 59 60 $str_regles = ''; 61 foreach ($regles as $k => $r) { 62 $str_regles .= self::escape_element_regle($r["chemin"]->get()); 63 $str_regles .= '|' . self::escape_element_regle($r["action"]); 64 $str_regles .= '|' . self::escape_element_regle($r["groupe"]); 65 $str_regles .= '|' . ($r["autorisation"] ? "oui" : "non"); 66 $str_regles .= '|' . self::escape_element_regle($r["commentaire"]); 67 $str_regles .= "\n"; // TODO vérifier que la séquence d'échappement est bien comprise. 68 } 69 70 return Stockage::set_prop(self::singleton(), "regles", $str_regles); 71 } 72 73 public static function get_regles() { 74 // Renvoie un tableau de quintuplets 75 // (chemin, action, groupe, autorisation, commentaire). 76 // ou false si erreur. 77 78 $str_regles = Stockage::get_prop(self::singleton(), "regles", true); // true => forcer permissions. 79 if (!$str_regles) Erreur::fatale("Impossible de lire les règles de sécurité."); 80 81 $str_regles = preg_replace('/\r\n|\r/', "\n", $str_regles); 82 $regles = array(); 83 // TODO : ignorer les lignes vides ! 84 foreach (explode("\n", $str_regles) as $k => $v) { 85 $r = explode('|',$v); 86 if (count($r) != 5) { 87 return false; 88 } 89 $regles[] = array( 90 "chemin" => new Chemin(self::unescape_element_regle($r[0]), true), 91 "action" => self::unescape_element_regle($r[1]), 92 "groupe" => self::unescape_element_regle($r[2]), 93 "autorisation" => ($r[3] == "oui"), 94 "commentaire" => self::unescape_element_regle($r[4]) 95 ); 96 } 97 return $regles; 98 } 99 100 public static function escape_element_regle() { 101 $str = preg_replace('/-/', '--', $str); 102 $str = preg_replace('/|/', '-p', $str); 103 return $str; 104 } 105 106 public static function unescape_element_regle($str) { 107 $str = preg_replace('/-p/', '|', $str); 108 $str = preg_replace('/--/', '-', $str); 109 return $str; 110 } 111 } 112 113 ?>