Beaucoup de choses. Voir le reste du message pour le détail.

- Ajout d'une classe Erreur, pour des plantages en beauté \o/ ;
- Ajout d'une classe Config (dans cms/configuration.php), qui gère la configuration. Plus propre que des constantes ou des variables globales ;
- Utilisation de error_reporting(E_ALL) pour détecter les variables non initialisées (entre autres) ;
- Obligation d'indiquer une adresse de courriel (valide de préférence ;-) ) pour contacter l'administrateur ;
- Bug : enregister_module() => Modules::enregister_module() ;
- Bug : is_set() => isset() ;
- Ajout de la classe Modules (déjà utilisée, mais pas définie) ;
- Utilisation du paramètre forcer_permissions pour éviter une récursion sans fin -_-' ;
- Déclenchement d'une erreur si on ne peut pas lire les règles de sécurité. Il y a encore plein d'autres vérifications d'erreurs à ajouter ;
- Un peu de détection d'erreur dans SystèmeFichiers ;
- Suppression du require sur css.php (doit être include() uniquement quand on veut l'afficher) ;
- Suppression de pas mal de bogues.
This commit is contained in:
Georges Dupéron 2010-08-02 04:20:54 +02:00
parent aa2817b397
commit e0e55ce46a
25 changed files with 162 additions and 76 deletions

View File

@ -53,11 +53,11 @@ class Chemin {
}
public function get_fs_stockage() {
return Path::combine($config_chemin_base_stockage, $this->get());
return Path::combine(Config::get('chemin_base_stockage'), $this->get());
}
public function get_fs_public() {
return Path::combine($config_chemin_base_public, $this->get());
return Path::combine(Config::get('chemin_base_public'), $this->get());
}
public function enfant($nom) {

View File

@ -1,6 +1,13 @@
<?php
error_reporting(E_ALL); // || E_STRICT
require_once(dirname(__FILE__) . "/config.php");
if (Config::get('courriel_admin') === null) {
echo "Vous devez indiquer le courriel de l'administrateur dans le fichier config.php.";
exit;
}
require_once(dirname(__FILE__) . "/include.php");
class CMS {
@ -8,7 +15,7 @@ class CMS {
// TODO : appeller Modules::action($chemin, $action, $paramètres);
$chemin = new Chemin($chemin_str);
$noms_params = Modules::liste_paramètres();
$noms_params = Modules::liste_paramètres($chemin);
$noms_params[] = "action";
// récupérer $noms_params dans $_GET, $_POST et $_FILE
$action = $paramètres["action"];

View File

@ -0,0 +1,21 @@
<?php
/***************************************
* La configuration n'est pas ici, *
* elle est dans le fichier config.php *
***************************************/
class Config {
static $config = array();
public static function get($nom) {
if (!isset(self::$config[$nom])) return null;
return self::$config[$nom];
}
public static function set($nom, $valeur) {
self::$config[$nom] = $valeur;
}
}
?>

View File

@ -1,26 +1,29 @@
<?php
// Fonction Path::normalize();
require_once(dirname(__FILE__) . "/chemin/path.php");
require_once(dirname(__FILE__) . "/cms/configuration.php");
// ========== CONFIGURATION =========
// Addresse de courriel de l'administrateur.
Config::set('courriel_admin', "jahvascriptmaniac+github@free.fr");
// URL de la racine du site. Ex: http://www.monsite.com/cms/
// Doit se terminer par '/'.
$config_url_base = "http://127.0.0.1/2010-moteur-site-simple/";
Config::set('url_base', "http://127.0.0.1/2010-moteur-site-simple/");
// Chemin absolu vers le dossier '__cms__'.
// dirname(__FILE__) peut retourner un chemin relatif (PHP < 4.0.2),
// donc utiliser realpath si on s'en sert.
$config_chemin_base = realpath(dirname(__FILE__));
Config::set('chemin_base', realpath(dirname(__FILE__)));
// Chemin vers le stockage interne des données.
// En général, c'est le chemin ..../__cms__/modele
$config_chemin_base_stockage = Path::combine($config_chemin_base, "modele");
Config::set('chemin_base_stockage', Path::combine(Config::get("chemin_base"), "modele"));
// Chemin vers la partie visible du site.
// En général, c'est le chemin vers le dossier contenant __cms__
$config_chemin_base_public = Path::combine($config_chemin_base, "/..");
Config::set('chemin_base_public', Path::combine(Config::get("chemin_base"), "/.."));
// ======== FIN CONFIGURATION =======

View File

@ -12,7 +12,7 @@ class AdminConnexion {
déconnexion();
return self::vue("déconnexion");
} else {
if (is_set($paramètres["vue"])) {
if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]);
} else {
self::vue($chemin);
@ -42,6 +42,6 @@ class AdminConnexion {
}
}
enregister_module("AdminConnexion", "admin-connexion");
Modules::enregister_module("AdminConnexion", "admin-connexion");
?>

View File

@ -5,18 +5,18 @@ class AdminCouleurs {
if ($action == "anuler") {
return redirect($chemin);
} else {
if (is_set($paramètres["Couleur_A"])) {
if (isset($paramètres["Couleur_A"])) {
// Stocker couleur A
}
if (is_set($paramètres["Couleur_B"])) {
if (isset($paramètres["Couleur_B"])) {
// Stocker couleur B
}
if (is_set($paramètres["Couleur_C"])) {
if (isset($paramètres["Couleur_C"])) {
// Stocker couleur C
}
// ...
if (is_set($paramètres["vue"])) {
if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]);
} else {
self::vue($chemin);
@ -45,6 +45,6 @@ class AdminCouleurs {
}
}
enregister_module("AdminCouleurs", "admin-couleurs");
Modules::enregister_module("AdminCouleurs", "admin-couleurs");
?>

View File

@ -6,11 +6,11 @@ class AdminPermissions {
if ($action == "anuler") {
return redirect($chemin);
} else {
if (is_set($paramètres["regles"])) {
if (isset($paramètres["regles"])) {
Stockage::set_prop($singleton, "regles", $paramètres["regles"]);
}
if (is_set($paramètres["vue"])) {
if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]);
} else {
self::vue($chemin);
@ -34,6 +34,6 @@ class AdminPermissions {
}
}
enregister_module("AdminPermissions", "admin-permissions");
Modules::enregister_module("AdminPermissions", "admin-permissions");
?>

View File

@ -18,36 +18,36 @@ class AdminUtilisateurs {
// Solution B :
} else {
if (is_set($paramètres["nouveau_nom"]) && ($action == "nouvelle_page")) {
if (isset($paramètres["nouveau_nom"]) && ($action == "nouvelle_page")) {
// TODO : SECURITE : Si l'utilisateur existe déjà, laisser tomber et ne pas faire les set_* qui suivent !
Authentification::nouvel_utilisateur($paramètres["nouveau_nom"]);
$paramètres["nom"] = $paramètres["nouveau_nom"];
// TODO : message de confirmation quelque part ?
}
if (is_set($paramètres["nom"]) && is_set($paramètres["nouveau_nom"]) && ($action != "nouvelle_page")) {
if (isset($paramètres["nom"]) && isset($paramètres["nouveau_nom"]) && ($action != "nouvelle_page")) {
Authentification::renomer_utilisateur($paramètres["nom"], $paramètres["nouveau_nom"]);
$paramètres["nom"] = $paramètres["nouveau_nom"];
}
if (is_set($paramètres["nom"]) && is_set($paramètres["mot_de_passe"])) {
if (isset($paramètres["nom"]) && isset($paramètres["mot_de_passe"])) {
Authentification::set_mot_de_passe($paramètres["nom"], $paramètres["mot_de_passe"]);
}
if (is_set($paramètres["nom"]) && is_set($paramètres["groupe"])) {
if (isset($paramètres["nom"]) && isset($paramètres["groupe"])) {
Authentification::set_groupe($paramètres["nom"], $paramètres["groupe"]);
}
if (is_set($paramètres["nom"]) && is_set($paramètres["peut_se_connecter"])) {
if (isset($paramètres["nom"]) && isset($paramètres["peut_se_connecter"])) {
Authentification::set_peut_se_connecter($paramètres["nom"], ($paramètres["peut_se_connecter"] == "true"));
}
if (is_set($paramètres["nom"]) && ($action == "supprimer")) {
if (isset($paramètres["nom"]) && ($action == "supprimer")) {
Authentification::supprimer_utilisateur($paramètres["nom"]);
// TODO : message de confirmation quelque part ?
}
if (is_set($paramètres["vue"])) {
if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]);
} else {
self::vue($chemin);
@ -87,6 +87,6 @@ class AdminUtilisateurs {
}
}
enregister_module("AdminUtilisateurs", "admin-utilisateurs");
Modules::enregister_module("AdminUtilisateurs", "admin-utilisateurs");
?>

View File

@ -11,7 +11,7 @@ class ForumIndex {
Stockage::set_prop($np, "proprietaire", get_utilisateur());
return redirect($np);
} else {
if (is_set($paramètres["vue"])) {
if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]);
} else {
self::vue($chemin);
@ -36,6 +36,6 @@ class ForumIndex {
}
}
enregister_module("ForumIndex", "forum-index");
Modules::enregister_module("ForumIndex", "forum-index");
?>

View File

@ -7,12 +7,12 @@ function action($chemin, $action, $paramètres) {
Stockage::supprimer($chemin);
return redirect($chemin->parent());
} else {
if (is_set($paramètres["message"])) {
if (isset($paramètres["message"])) {
Stockage::set_prop($chemin, "message", $paramètres["message"]);
}
// TODO ... Quelles sont les interactions entre l'utilisateur et le message, dans quel ordre, ...
if (is_set($paramètres["vue"])) {
if (isset($paramètres["vue"])) {
Modules::vue($chemin->parent(), $paramètres["vue"]);
} else {
Modules::vue($chemin->parent());
@ -36,6 +36,6 @@ function vue($chemin, $vue = "normal") {
}
}
enregister_module("ForumMessage", "forum-message");
Modules::enregister_module("ForumMessage", "forum-message");
?>

View File

@ -16,13 +16,13 @@ class ForumSujet {
Stockage::supprimer($chemin);
return redirect($chemin->parent());
} else {
if (is_set($paramètres["titre"])) {
if (isset($paramètres["titre"])) {
Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]);
// TODO : peut-être redirect($chemin) ?
}
if (is_set($paramètres["vue"])) {
if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]);
} else {
self::vue($chemin);
@ -65,6 +65,6 @@ class ForumSujet {
}
}
enregister_module("ForumSujet", "forum-sujet");
Modules::enregister_module("ForumSujet", "forum-sujet");
?>

View File

@ -12,16 +12,16 @@ class GalerieÉvènement {
Stockage::supprimer($chemin);
return redirect($chemin->parent());
} else {
if (is_set($paramètres["titre"])) {
if (isset($paramètres["titre"])) {
Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]);
// TODO : peut-être redirect($chemin) ?
}
if (is_set($paramètres["description"])) {
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
}
if (is_set($paramètres["vue"])) {
if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]);
} else {
self::vue($chemin);
@ -59,12 +59,12 @@ class GalerieÉvènement {
return $ret;
} else if ($vue == "miniature") {
$enfants = Stockage::liste_enfants($chemin);
if (is_set($enfants[0])) return Modules::vue($enfants[0], 'miniature');
if (isset($enfants[0])) return Modules::vue($enfants[0], 'miniature');
else return "Aucune<br/>photo";
}
}
}
enregister_module("GalerieÉvènement", "galerie-evenement");
Modules::enregister_module("GalerieÉvènement", "galerie-evenement");
?>

View File

@ -12,16 +12,16 @@ class GalerieIndex {
Stockage::supprimer($chemin);
return redirect($chemin->parent());
} else {
if (is_set($paramètres["titre"])) {
if (isset($paramètres["titre"])) {
Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]);
// TODO : peut-être redirect($chemin) ?
}
if (is_set($paramètres["description"])) {
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
}
if (is_set($paramètres["vue"])) {
if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]);
} else {
self::vue($chemin);
@ -59,12 +59,12 @@ class GalerieIndex {
return $ret;
} else if ($vue == "miniature") {
$enfants = Stockage::liste_enfants($chemin);
if (is_set($enfants[0])) return Modules::vue($enfants[0], 'miniature');
if (isset($enfants[0])) return Modules::vue($enfants[0], 'miniature');
else return "Aucune<br/>photo";
}
}
}
enregister_module("GalerieIndex", "galerie-index");
Modules::enregister_module("GalerieIndex", "galerie-index");
?>

View File

@ -12,16 +12,16 @@ class GaleriePériode {
Stockage::supprimer($chemin);
return redirect($chemin->parent());
} else {
if (is_set($paramètres["titre"])) {
if (isset($paramètres["titre"])) {
Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]);
// TODO : peut-être redirect($chemin) ?
}
if (is_set($paramètres["description"])) {
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
}
if (is_set($paramètres["vue"])) {
if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]);
} else {
self::vue($chemin);
@ -59,12 +59,12 @@ class GaleriePériode {
return $ret;
} else if ($vue == "miniature") {
$enfants = Stockage::liste_enfants($chemin);
if (is_set($enfants[0])) return Modules::vue($enfants[0], 'miniature');
if (isset($enfants[0])) return Modules::vue($enfants[0], 'miniature');
else return "Aucune<br/>photo";
}
}
}
enregister_module("GaleriePériode", "galerie-periode");
Modules::enregister_module("GaleriePériode", "galerie-periode");
?>

View File

@ -8,23 +8,23 @@ class GaleriePhoto {
Stockage::supprimer($chemin);
return redirect($chemin->parent());
} else {
if (is_set($paramètres["fichier_image"])) {
if (isset($paramètres["fichier_image"])) {
// redimensionner l'image avec gd, stocker la miniature dans
// prop_image_mini (set_prop_fichier()).
// Pb : Où est-ce qu'on met temporairement la miniature
// avant de la déplacer ???
// stocker le fichier reçu dans prop_image (set_prop_fichier_reçu()).
}
/* if (is_set($paramètres["titre"])) {
/* if (isset($paramètres["titre"])) {
Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]);
// TODO : peut-être redirect($chemin) ?
}*/
if (is_set($paramètres["description"])) {
if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $paramètres["description"]);
}
if (is_set($paramètres["vue"])) {
if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]);
} else {
self::vue($chemin);
@ -56,6 +56,6 @@ class GaleriePhoto {
}
}
enregister_module("GaleriePhoto", "galerie-photo");
Modules::enregister_module("GaleriePhoto", "galerie-photo");
?>

View File

@ -1,5 +1,7 @@
<?php
require_once(dirname(__FILE__) . "/modules.php");
require_once(dirname(__FILE__) . "/admin/include.php");
require_once(dirname(__FILE__) . "/forum/include.php");
require_once(dirname(__FILE__) . "/galerie/include.php");

View File

@ -0,0 +1,22 @@
<?php
class Modules {
static $liste_modules = array();
public static function enregister_module($classe, $type) {
self::$liste_modules[$type] = $classe;
}
public static function get_module($chemin) {
$type = Stockage::get_prop($chemin, "type");
if ($type === false) return false;
return self::$liste_modules[$type];
}
public static function liste_paramètres($chemin) {
// TODO
return self::get_module($chemin);
}
}
?>

View File

@ -6,8 +6,9 @@ class Authentification {
}
public function connexion($nom_utilisateur, $mdp) {
$mdp_réel = Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "mot_de_passe");
$peut_se_connecter = Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "peut_se_connecter");
$ch_utilisateur = self::singleton()->enfant($nom_utilisateur);
$mdp_réel = self::get_mot_de_passe($nom_utilisateur, true); // true => forcer permissions.
$peut_se_connecter = self::get_peut_se_connecter($nom_utilisateur, true); // true => forcer permissions.
if ($mdp == $mdp_réel && $peut_se_connecter === "true") { // Triple égale. Pas d'entourloupe avec des casts miteux !
// TODO : Vérifier si c'est sécurisé => stocké _uniquement_ sur le serveur.
Session::put("utilisateur", $nom_utilisateur);
@ -57,8 +58,8 @@ class Authentification {
Stockage::set_pop(self::singleton()->enfant($nom_utilisateur), "groupe", $groupe);
}
public function get_groupe($nom_utilisateur) {
return Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "groupe");
public function get_groupe($nom_utilisateur, $forcer_permissions = false) {
return Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "groupe", $forcer_permissions);
}
public function set_mot_de_passe($nom_utilisateur, $mot_de_passe) {
@ -69,16 +70,17 @@ class Authentification {
self::set_mot_de_passe($utilisateur, substr(md5($utilisateur . rand() . microtime()) , 0, 8));
}
public function get_mot_de_passe($nom_utilisateur) {
return Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "mot_de_passe");
public function get_mot_de_passe($nom_utilisateur, $forcer_permissions = false) {
return Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "mot_de_passe", $forcer_permissions);
}
public function set_peut_se_connecter($nom_utilisateur, $valeur) {
Stockage::set_pop(self::singleton()->enfant($nom_utilisateur), "peut_se_connecter", $valeur ? "true" : "false");
}
public function get_peut_se_connecter($nom_utilisateur) {
return (Stockage::get_pop(self::singleton()->enfant($nom_utilisateur), "peut_se_connecter") == "true") ? true : false;
public function get_peut_se_connecter($nom_utilisateur, $forcer_permissions = false) {
$peut_se_connecter = Stockage::get_pop(self::singleton()->enfant($nom_utilisateur), "peut_se_connecter", $forcer_permissions);
return ($peut_se_connecter == "true") ? true : false;
}
}

View File

@ -0,0 +1,27 @@
<?php
class Erreur {
public static function fatale($message) {
echo '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<title>Erreur</title>
</head>
<body>
<h1>Erreur</h1>
<p>Désolé, une erreur est survenue. Contactez le créateur du site SVP :
<a href="mailto:' . htmlspecialchars(Config::get('courriel_admin'))
. '?subject=Erreur%20dans%20le%20programme%202010-moteur-site-simple&body='
. htmlspecialchars(rawurlencode("Code de l'erreur : " . $message)) . '">'
. htmlspecialchars(Config::get('courriel_admin'))
. '</a>. Indiquez l\'erreur ci-dessous dans votre courriel.</p>
<p><strong>' . htmlspecialchars($message) . '</strong></p>
</body>
</html>';
exit;
}
}
?>

View File

@ -1,5 +1,6 @@
<?php
require_once(dirname(__FILE__) . "/erreur.php");
require_once(dirname(__FILE__) . "/authentification.php");
require_once(dirname(__FILE__) . "/nettoyage.php");
require_once(dirname(__FILE__) . "/permissions.php");

View File

@ -16,7 +16,7 @@ class Permissions {
if ($utilisateur === null) {
$utilisateur = Authentification::get_utilisateur();
}
$groupe = Authentification::get_groupe($utilisateur);
$groupe = Authentification::get_groupe($utilisateur, true); // true => forcer permissions.
// Parcourt la liste les règles de sécurité (get_regles()), et
// sélectionne la première pour laquelle $chemin correspond au motif
@ -50,15 +50,17 @@ class Permissions {
$str_regles .= "\n"; // TODO vérifier que la séquence d'échappement est bien comprise.
}
return Stockage::get_prop(self::singleton(), "regles", $str_regles);
return Stockage::set_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 = Stockage::get_prop(self::singleton(), "regles", true); // true => forcer permissions.
if (!$str_regles) Erreur::fatale("Impossible de lire les règles de sécurité.");
$str_regles = preg_replace('/\r\n|\r/', "\n", $str_regles);
$regles = array();
// TODO : ignorer les lignes vides !

View File

@ -1,6 +1,5 @@
<?php
require_once(dirname(__FILE__) . "/css.php");
require_once(dirname(__FILE__) . "/squelette.php");
?>

View File

@ -2,7 +2,7 @@
class Session {
public function démarrer() {
return session_id !== "" || session_start();
return (session_id() !== "") || session_start();
}
public function put($k, $v) {
@ -12,7 +12,7 @@ class Session {
public function get($k) {
self::démarrer();
return is_set($_SESSION[$k]) ? $_SESSION[$k] : false;
return isset($_SESSION[$k]) ? $_SESSION[$k] : false;
}
public function effacer($k) {
@ -21,4 +21,4 @@ class Session {
}
}
?>
?>

View File

@ -63,10 +63,10 @@ class Stockage {
// $forcer_permissions permet à vérifier_permission() et ses
// dépendances get_regles() et get_groupe() de faire des get_prop
// même si l'utilisateur courant n'en a pas le droit.
if ($forcer_permissions || vérifier_permission($chemin, "get_prop")) {
return SystemeFichiers::lire(Path::combine($chemin->get_fs_stockage(), $prop));
if ($forcer_permissions || Permissions::vérifier_permission($chemin, "get_prop")) {
return SystèmeFichiers::lire(Path::combine($chemin->get_fs_stockage(), $prop));
} else {
return "[Accès interdit]";
return false;
}
}

View File

@ -25,15 +25,15 @@ class SystèmeFichiers {
}
public function lire($chemin_fs) {
file_get_contents($chermin_fs);
return file_exists($chemin_fs) && file_get_contents($chemin_fs);
}
public function écrire($chemin_fs, $données) {
file_put_contents($chemin_fs, $données);
return is_dir(dirname($chemin_fs)) && file_put_contents($chemin_fs, $données);
}
public function liste_fichiers($chemin_fs) {
return scandir($chemin_fs);
return is_dir($chemin_fs) && scandir($chemin_fs);
}
public function déplacer($chemin_fs_de, $chemin_fs_vers) {