www

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

commit 3677d695629ad46df1a1c254627d38eb20c916e2
parent 168b61563934b4febb461d364638efa6673a3835
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date:   Sun,  1 Aug 2010 04:18:14 +0200

Remplissage des fonctions de Permissions.

Diffstat:
M__cms__/securite/permissions.php | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 78 insertions(+), 20 deletions(-)

diff --git a/__cms__/securite/permissions.php b/__cms__/securite/permissions.php @@ -6,28 +6,86 @@ // - motif d'utilisateur ($utilisateur ou * ou "propriétaire") // - autorisation : true ou false. -function vérifier_permission($chemin, $action, $utilisateur = null) { - if ($utilisateur === null) { - $utilisateur = Authentification::get_utilisateur(); - } +class Permissions { + private $singleton = new Chemin("/admin/permissions/"); + // Vérifie si $utilisateur a la permission d'effectuer $action sur $chemin. - // Parcourt la liste les règles de sécurité (get_regles()), et - // sélectionne la première pour laquelle $chemin correspond au motif - // de la règle, $action correspond au motif de la règle, et - // $utilisateur a comme groupe le groupe de la règle (get_groupe()). - // Si le champ "autorisation" de la règle est true, on renvoie true, - // sinon on renvoie false -} - -function set_regles($regles) { - // $regles est un tableau de quadruplets - // (chemin, action, groupe, autorisation). + public function vérifier_permission($chemin, $action, $utilisateur = null) { + if ($utilisateur === null) { + $utilisateur = Authentification::get_utilisateur(); + } + $groupe = Authentification::get_groupe($utilisateur); + + // Parcourt la liste les règles de sécurité (get_regles()), et + // sélectionne la première pour laquelle $chemin correspond au motif + // de la règle, $action correspond au motif de la règle, et + // $utilisateur a comme groupe le groupe de la règle (get_groupe()). + // Si le champ "autorisation" de la règle est true, on renvoie true, + // sinon on renvoie false + + foreach (self::get_regles() as $r) { + if ($chemin->correspond($r["chemin"]) + && self::action_correspond($action, $r["action"]) + && $groupe == $r["groupe"]) { + return $r["autorisation"]; + } + } + + return false; + } - // Enregistre $regles pour qu'il puisse être lu par get_regles. -} - -function get_regles() { - // Renvoie les regles. + // TODO : d'abord set_nouvelles_regles, puis appliquer_nouvelles_regles. + public function set_regles($regles) { + // $regles est un tableau de quadruplets + // (chemin, action, groupe, autorisation). + + $str_regles = ''; + foreach ($regles as $k => $r) { + $str_regles .= self::escape_element_regle($r["chemin"]->get()); + $str_regles .= '|' . self::escape_element_regle($r["action"]); + $str_regles .= '|' . self::escape_element_regle($r["groupe"]); + $str_regles .= '|' . ($r["autorisation"] ? "oui" : "non"); + $str_regles .= "\n"; // TODO vérifier que la séquence d'échappement est bien comprise. + } + + return Stockage::get_prop(self::$singleton, "regles", $str_regles); + } + + public function get_regles() { + // Renvoie un tableau de quadruplets + // (chemin, action, groupe, autorisation). + // ou false si erreur. + $str_regles = Stockage::get_prop(self::$singleton, "regles"); + // TODO erreur si la propriété n'existe pas. + $str_regles = preg_replace('/\r\n|\r/', "\n", $str_regles); + $regles = array(); + // TODO : ignorer les lignes vides ! + foreach (explode("\n", $str_regles) as $k => $v) { + $r = explode('|',$v); + if (count($r) != 4) { + return false; + } + array_push(array( + "chemin" => self::unescape_element_regle(new Chemin($r[0])), + "action" => self::unescape_element_regle($r[1]), + "groupe" => self::unescape_element_regle($r[2]), + "autorisation" => ($r[3] == "oui") + )); + } + return $regles; + } + + public function escape_element_regle() { + $str = preg_replace('/-/', '--', $str); + $str = preg_replace('/|/', '-p', $str); + return $str; + } + + public function unescape_element_regle($str) { + $str = preg_replace('/-p/', '|', $str); + $str = preg_replace('/--/', '-', $str); + return $str; + } } ?>