www

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

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