commit 3afe99ebb4a09f0248de0c78430f04954d722ba8
parent b27eabf106b5d1cf7ee9e450311ebb53a8123c42
Author: Georges Dupéron <jahvascriptmaniac+github@free.fr>
Date: Wed, 23 Jun 2010 22:42:47 +0200
Refactoring : La (nouvelle) classe CheminPage s'occupe de la manipulation des chemins du site (gallerie/évènement3/photo5), la classe Page l'utilise et ne fait plus de manipulations de chemins directement.
Diffstat:
2 files changed, 67 insertions(+), 33 deletions(-)
diff --git a/controleur/chemin_page.php b/controleur/chemin_page.php
@@ -0,0 +1,42 @@
+<?php
+
+// Note : L'implémentation de CheminPage pourrait utiliser une pile au lieu des chaînes de caractère :
+// ["Chemin", "Vers", "Page"] == "/Chemin/Vers/Page"
+
+class CheminPage {
+ public function __construct($chemin) {
+ $this->chemin = CheminPage::nettoyer_chemin($chemin);
+ }
+
+ public function get() {
+ return $this->chemin;
+ }
+
+ public function enfant($nom) {
+ return $this->chemin . '/' . CheminPage::nettoyer_chemin($nom);
+ }
+
+ public function parent() {
+ $slash = strrpos($this->chemin, '/');
+ if ($slash !== false) {
+ return substr($this->chemin, 0, $slash);
+ } else {
+ return '/';
+ }
+ }
+
+ public static function nettoyer_chemin($chemin) {
+ // SECURITE : $chemin_nettoyé
+ // * Ne contient pas '\0'
+ // * Ne contient pas '../'
+ // * Ne contient pas de double occurence de '/'
+ // * Ni d'autres bizarreries des chemins de fichiers.
+ // * Ne contient pas _prop_
+ // * Ne se termine pas par '/'
+ // * Commence par '/'
+
+ // TODO
+ return $chemin;
+ }
+
+}
+\ No newline at end of file
diff --git a/controleur/page.php b/controleur/page.php
@@ -1,57 +1,48 @@
<?php
+require_once("util.php");
require_once("config.php");
+require_once("controleur/chemin_page.php");
// Protocole : http://site/actualités/?nouveau=Le%20titre
-// SECURITE : Invariants de sécurité :
-// Page::chemin ne contient jamais de chaîne '../' ou autres bizarreries des chemins de fichiers.
-// Donc on peut concaténer Page::chemin à un chemin dans le système de fichiers et être sûr d'être dans un sous-dossier.
-// TODO : Lors de la construction d'un chemin, tous les composants doivent être nettoyés.
-
-// TODO : créer une classe chemin_page
+// Structure des répertoires
+// article/_prop_article
+// /_prop_type
+// /_prop_photo
+// /_prop_date
+// /_prop_lieu
+// /article_1 // Sous article
+// /article_2 // Sous article
class Page {
- // article/prop_article
- // /prop_type
- // /prop_photo
- // /prop_date
- // /prop_lieu
- // /article_1 // Sous article
- // /article_2 // Sous article
-
public function __construct($chemin) {
- // SECURITE : chemin doit être un sous-dossier de .../modele/
- $this->chemin = nettoyer_chemin($chemin);
- }
-
- // Nettoie un chemin de page pour qu'il respecte l'invariant de sécurité.
- public static function nettoyer_chemin($chemin) {
- return $chemin;
+ $this->chemin = new CheminPage($chemin);
}
// Renvoie le chemin de la page dans le système de fichiers
private function chemin_fs() {
- return concaténer_chemin_fs($config_chemin_base, $this->chemin);
+ global $config_chemin_base;
+ return concaténer_chemin_fs($config_chemin_base, $this->chemin->get());
}
public function liste_enfants() {
- $lst = scandir($this->chemin_fs());
- $lst_enfants = Array();
- if ($lst !== false) {
- foreach ($lst as $k => $v) {
- $lst_enfants[] = $this->enfant($v);
- }
+ $scandir = scandir($this->chemin_fs());
+ if ($scandir === false) { error_log("Impossible d'accéder à la liste des pages enfant de " . $this->chemin->get()); }
+
+ $enfants = Array();
+ foreach ($scandir as $k => $v) {
+ $enfants[] = $this->enfant($v);
}
- return $lst_enfants;
+ return $enfants;
}
public function enfant($nom) {
- return new Page(nettoyer_chemin($this->chemin) . '/' . nettoyer_chemin($nom));
+ return new Page($this->chemin->enfant($nom));
}
public function parent() {
- return new Page(nettoyer_chemin($this->chemin) . '/..'); // TODO
+ return new Page($this->chemin->parent());
}
public function nouveau($nom) {
@@ -78,11 +69,11 @@ class Page {
public function url() {
// calculer l'url de cette page en fonction de son chemin et de l'url de base
global $config_url_base;
- return $config_url_base . $this->chemin;
+ return $config_url_base . $this->chemin->get();
}
public function vue() {
- return "Aucune vue pour «" . $this->chemin . "» .";
+ return "Aucune vue pour «" . $this->chemin->get() . "» .";
}
}