From 6280525d34c6ee7d854dcd9c362510c428e4b3bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Georges=20Dup=C3=A9ron?= Date: Fri, 30 Jul 2010 01:02:03 +0200 Subject: [PATCH] nettoyer_segment() dans chemin.php + petites modifications. --- __cms__/chemin/chemin.php | 60 +++++++++++++++++++++++++++++---------- 1 file changed, 45 insertions(+), 15 deletions(-) diff --git a/__cms__/chemin/chemin.php b/__cms__/chemin/chemin.php index 83afee4..42e0117 100644 --- a/__cms__/chemin/chemin.php +++ b/__cms__/chemin/chemin.php @@ -3,16 +3,16 @@ require_once(dirname(__FILE__) . "/path.php"); class Chemin { - // Si $chemin est un tableau, il doit vérifier les invariants de nettoyer_chemin. + // Si $chemin est un tableau, chaque segment doit vérifier les invariants de nettoyer_segment. public function __construct($chemin) { if (! is_array($chemin)) { - $this->segments = explode('/', self::nettoyer_chemin($chemin)); + $this->segments = self::nettoyer_chemin($chemin); } else { $this->segments = $chemin; } } - public function correspond(motif, chemin) { + public function correspond($motif) { // motif : liste de segments, pouvant être un chaîne ou un jocker // correspondant à "n'importe quelle chaîne pour ce segment". Le // dernier segment peut être le joker "n'importe quelle suite de @@ -20,7 +20,24 @@ class Chemin { // dans ce cas-là). // chemin : liste de segments. - // les segments de chemin et motif sont déjà nettoyés. + // SÉCURITÉ : les segments de chemin et motif sont déjà nettoyés. + + if ((count($motif) != count($this->segments)) && (end($motif) != CHEMIN_JOKER_MULTI_SEGMENTS)) { + return false; + } + for ($i = 0; $i < count($motif); i++) { + if ($motif[$i] == CHEMIN_JOKER_MULTI_SEGMENTS) { + continue; + } + if ($motif[$i] == CHEMIN_JOKER_SEGMENT) { + continue; + } + if ($motif[$i] == $this->segments[$i]) { + continue; + } + return false; + } + return true; } // Invariant de sécurité : la chaîne renvoyée ne commence ni ne @@ -31,7 +48,10 @@ class Chemin { public function enfant($nom) { $s = $this->segments; - array_push($s, self::nettoyer_segment($nom)); + $x = self::nettoyer_segment($nom) + if ($x != '') { + array_push($s, $x); + } return new self($s); } @@ -45,28 +65,38 @@ class Chemin { public static function nettoyer_chemin($chemin) { - // SECURITE : $chemin nettoyé + // SÉCURITÉ : $chemin nettoyé // * Ne contient pas '\0' // * Ne contient pas '../' // * Ne contient pas de double occurence de '/' - // * Ne contient pas __prop__ // * Ne se termine pas par '/' // * Ne commence pas par '/' - // * Ni d'autres bizarreries des chemins de fichiers. + // * Est découpé en segments + // * Chaque segment est nettoyé avec nettoyer_segment(). $chemin = preg_replace("/\\0/", '', $chemin); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???) $chemin = Path::normalize($chemin); - $chemin = preg_replace("/__prop__/", '___prop___', $chemin); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???) - $chemin = preg_replace("/^\/*/", '', $chemin); - $chemin = preg_replace("/\/*$/", '', $chemin); + $chemin = preg_replace("/^\\/*/", '', $chemin); + $chemin = preg_replace("/\\/*$/", '', $chemin); - // TODO - return $chemin; + $segments = explode('/', $chemin); + $segments = array_map("nettoyer_segment", $segments) + + return $segments; } public static function nettoyer_segment($segment) { - // TODO. Ne doit pas être vide, remplacer par _vide_ sinon. - // Ne doit pas contenir '*' non plus. Remplacer par '-' + // SÉCURITÉ : $segment nettoyé : + // * /!\ Peut être vide /!\ + // * Ne doit pas contenir '/' non plus, remplacer par '-'. + // * Ne doit pas contenir '*' non plus, remplacer par '-'. + // * Ne contient pas "__prop__", remplacer par "___prop___". + + $segment = preg_replace("/\\0/", '', $segment); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???) + $segment = preg_replace("/\\//", '', $segment); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???) + $segment = preg_replace("/\\*/", '', $segment); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???) + $segment = preg_replace("/__prop__/", '___prop___', $segment); // TODO : vérifier si c'est bien ça ! (supprime _toutes_ les occurences ???) + return $segment; } }