commit 6280525d34c6ee7d854dcd9c362510c428e4b3bb
parent e279e497ab9df8d786d90fc5f65cef01849ee559
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Fri, 30 Jul 2010 01:02:03 +0200
nettoyer_segment() dans chemin.php + petites modifications.
Diffstat:
1 file changed, 45 insertions(+), 15 deletions(-)
diff --git 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);
+
+ $segments = explode('/', $chemin);
+ $segments = array_map("nettoyer_segment", $segments)
- // TODO
- return $chemin;
+ 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;
}
}