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:
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;
+ }
}
?>