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() { 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() { 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) { public function enfant($nom) {

View File

@ -1,6 +1,13 @@
<?php <?php
error_reporting(E_ALL); // || E_STRICT
require_once(dirname(__FILE__) . "/config.php"); 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"); require_once(dirname(__FILE__) . "/include.php");
class CMS { class CMS {
@ -8,7 +15,7 @@ class CMS {
// TODO : appeller Modules::action($chemin, $action, $paramètres); // TODO : appeller Modules::action($chemin, $action, $paramètres);
$chemin = new Chemin($chemin_str); $chemin = new Chemin($chemin_str);
$noms_params = Modules::liste_paramètres(); $noms_params = Modules::liste_paramètres($chemin);
$noms_params[] = "action"; $noms_params[] = "action";
// récupérer $noms_params dans $_GET, $_POST et $_FILE // récupérer $noms_params dans $_GET, $_POST et $_FILE
$action = $paramètres["action"]; $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 <?php
// Fonction Path::normalize();
require_once(dirname(__FILE__) . "/chemin/path.php"); require_once(dirname(__FILE__) . "/chemin/path.php");
require_once(dirname(__FILE__) . "/cms/configuration.php");
// ========== CONFIGURATION ========= // ========== 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/ // URL de la racine du site. Ex: http://www.monsite.com/cms/
// Doit se terminer par '/'. // 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__'. // Chemin absolu vers le dossier '__cms__'.
// dirname(__FILE__) peut retourner un chemin relatif (PHP < 4.0.2), // dirname(__FILE__) peut retourner un chemin relatif (PHP < 4.0.2),
// donc utiliser realpath si on s'en sert. // 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. // Chemin vers le stockage interne des données.
// En général, c'est le chemin ..../__cms__/modele // 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. // Chemin vers la partie visible du site.
// En général, c'est le chemin vers le dossier contenant __cms__ // 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 ======= // ======== FIN CONFIGURATION =======

View File

@ -12,7 +12,7 @@ class AdminConnexion {
déconnexion(); déconnexion();
return self::vue("déconnexion"); return self::vue("déconnexion");
} else { } else {
if (is_set($paramètres["vue"])) { if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]); self::vue($chemin, $paramètres["vue"]);
} else { } else {
self::vue($chemin); 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") { if ($action == "anuler") {
return redirect($chemin); return redirect($chemin);
} else { } else {
if (is_set($paramètres["Couleur_A"])) { if (isset($paramètres["Couleur_A"])) {
// Stocker couleur A // Stocker couleur A
} }
if (is_set($paramètres["Couleur_B"])) { if (isset($paramètres["Couleur_B"])) {
// Stocker couleur B // Stocker couleur B
} }
if (is_set($paramètres["Couleur_C"])) { if (isset($paramètres["Couleur_C"])) {
// Stocker couleur C // Stocker couleur C
} }
// ... // ...
if (is_set($paramètres["vue"])) { if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]); self::vue($chemin, $paramètres["vue"]);
} else { } else {
self::vue($chemin); 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") { if ($action == "anuler") {
return redirect($chemin); return redirect($chemin);
} else { } else {
if (is_set($paramètres["regles"])) { if (isset($paramètres["regles"])) {
Stockage::set_prop($singleton, "regles", $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"]); self::vue($chemin, $paramètres["vue"]);
} else { } else {
self::vue($chemin); 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 : // Solution B :
} else { } 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 ! // 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"]); Authentification::nouvel_utilisateur($paramètres["nouveau_nom"]);
$paramètres["nom"] = $paramètres["nouveau_nom"]; $paramètres["nom"] = $paramètres["nouveau_nom"];
// TODO : message de confirmation quelque part ? // 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"]); Authentification::renomer_utilisateur($paramètres["nom"], $paramètres["nouveau_nom"]);
$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"]); 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"]); 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")); 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"]); Authentification::supprimer_utilisateur($paramètres["nom"]);
// TODO : message de confirmation quelque part ? // TODO : message de confirmation quelque part ?
} }
if (is_set($paramètres["vue"])) { if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]); self::vue($chemin, $paramètres["vue"]);
} else { } else {
self::vue($chemin); 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()); Stockage::set_prop($np, "proprietaire", get_utilisateur());
return redirect($np); return redirect($np);
} else { } else {
if (is_set($paramètres["vue"])) { if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]); self::vue($chemin, $paramètres["vue"]);
} else { } else {
self::vue($chemin); 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); Stockage::supprimer($chemin);
return redirect($chemin->parent()); return redirect($chemin->parent());
} else { } else {
if (is_set($paramètres["message"])) { if (isset($paramètres["message"])) {
Stockage::set_prop($chemin, "message", $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, ... // 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"]); Modules::vue($chemin->parent(), $paramètres["vue"]);
} else { } else {
Modules::vue($chemin->parent()); 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); Stockage::supprimer($chemin);
return redirect($chemin->parent()); return redirect($chemin->parent());
} else { } else {
if (is_set($paramètres["titre"])) { if (isset($paramètres["titre"])) {
Stockage::renomer($chemin, $paramètres["titre"]); Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]); $chemin = $chemin->renomer($paramètres["titre"]);
// TODO : peut-être redirect($chemin) ? // TODO : peut-être redirect($chemin) ?
} }
if (is_set($paramètres["vue"])) { if (isset($paramètres["vue"])) {
self::vue($chemin, $paramètres["vue"]); self::vue($chemin, $paramètres["vue"]);
} else { } else {
self::vue($chemin); 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); Stockage::supprimer($chemin);
return redirect($chemin->parent()); return redirect($chemin->parent());
} else { } else {
if (is_set($paramètres["titre"])) { if (isset($paramètres["titre"])) {
Stockage::renomer($chemin, $paramètres["titre"]); Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]); $chemin = $chemin->renomer($paramètres["titre"]);
// TODO : peut-être redirect($chemin) ? // TODO : peut-être redirect($chemin) ?
} }
if (is_set($paramètres["description"])) { if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $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"]); self::vue($chemin, $paramètres["vue"]);
} else { } else {
self::vue($chemin); self::vue($chemin);
@ -59,12 +59,12 @@ class GalerieÉvènement {
return $ret; return $ret;
} else if ($vue == "miniature") { } else if ($vue == "miniature") {
$enfants = Stockage::liste_enfants($chemin); $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"; 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); Stockage::supprimer($chemin);
return redirect($chemin->parent()); return redirect($chemin->parent());
} else { } else {
if (is_set($paramètres["titre"])) { if (isset($paramètres["titre"])) {
Stockage::renomer($chemin, $paramètres["titre"]); Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]); $chemin = $chemin->renomer($paramètres["titre"]);
// TODO : peut-être redirect($chemin) ? // TODO : peut-être redirect($chemin) ?
} }
if (is_set($paramètres["description"])) { if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $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"]); self::vue($chemin, $paramètres["vue"]);
} else { } else {
self::vue($chemin); self::vue($chemin);
@ -59,12 +59,12 @@ class GalerieIndex {
return $ret; return $ret;
} else if ($vue == "miniature") { } else if ($vue == "miniature") {
$enfants = Stockage::liste_enfants($chemin); $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"; 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); Stockage::supprimer($chemin);
return redirect($chemin->parent()); return redirect($chemin->parent());
} else { } else {
if (is_set($paramètres["titre"])) { if (isset($paramètres["titre"])) {
Stockage::renomer($chemin, $paramètres["titre"]); Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]); $chemin = $chemin->renomer($paramètres["titre"]);
// TODO : peut-être redirect($chemin) ? // TODO : peut-être redirect($chemin) ?
} }
if (is_set($paramètres["description"])) { if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $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"]); self::vue($chemin, $paramètres["vue"]);
} else { } else {
self::vue($chemin); self::vue($chemin);
@ -59,12 +59,12 @@ class GaleriePériode {
return $ret; return $ret;
} else if ($vue == "miniature") { } else if ($vue == "miniature") {
$enfants = Stockage::liste_enfants($chemin); $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"; 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); Stockage::supprimer($chemin);
return redirect($chemin->parent()); return redirect($chemin->parent());
} else { } else {
if (is_set($paramètres["fichier_image"])) { if (isset($paramètres["fichier_image"])) {
// redimensionner l'image avec gd, stocker la miniature dans // redimensionner l'image avec gd, stocker la miniature dans
// prop_image_mini (set_prop_fichier()). // prop_image_mini (set_prop_fichier()).
// Pb : Où est-ce qu'on met temporairement la miniature // Pb : Où est-ce qu'on met temporairement la miniature
// avant de la déplacer ??? // avant de la déplacer ???
// stocker le fichier reçu dans prop_image (set_prop_fichier_reçu()). // 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"]); Stockage::renomer($chemin, $paramètres["titre"]);
$chemin = $chemin->renomer($paramètres["titre"]); $chemin = $chemin->renomer($paramètres["titre"]);
// TODO : peut-être redirect($chemin) ? // TODO : peut-être redirect($chemin) ?
}*/ }*/
if (is_set($paramètres["description"])) { if (isset($paramètres["description"])) {
Stockage::set_prop($chemin, "description", $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"]); self::vue($chemin, $paramètres["vue"]);
} else { } else {
self::vue($chemin); 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 <?php
require_once(dirname(__FILE__) . "/modules.php");
require_once(dirname(__FILE__) . "/admin/include.php"); require_once(dirname(__FILE__) . "/admin/include.php");
require_once(dirname(__FILE__) . "/forum/include.php"); require_once(dirname(__FILE__) . "/forum/include.php");
require_once(dirname(__FILE__) . "/galerie/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) { public function connexion($nom_utilisateur, $mdp) {
$mdp_réel = Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "mot_de_passe"); $ch_utilisateur = self::singleton()->enfant($nom_utilisateur);
$peut_se_connecter = Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "peut_se_connecter"); $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 ! 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. // TODO : Vérifier si c'est sécurisé => stocké _uniquement_ sur le serveur.
Session::put("utilisateur", $nom_utilisateur); Session::put("utilisateur", $nom_utilisateur);
@ -57,8 +58,8 @@ class Authentification {
Stockage::set_pop(self::singleton()->enfant($nom_utilisateur), "groupe", $groupe); Stockage::set_pop(self::singleton()->enfant($nom_utilisateur), "groupe", $groupe);
} }
public function get_groupe($nom_utilisateur) { public function get_groupe($nom_utilisateur, $forcer_permissions = false) {
return Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "groupe"); return Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "groupe", $forcer_permissions);
} }
public function set_mot_de_passe($nom_utilisateur, $mot_de_passe) { 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)); self::set_mot_de_passe($utilisateur, substr(md5($utilisateur . rand() . microtime()) , 0, 8));
} }
public function get_mot_de_passe($nom_utilisateur) { public function get_mot_de_passe($nom_utilisateur, $forcer_permissions = false) {
return Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "mot_de_passe"); return Stockage::get_prop(self::singleton()->enfant($nom_utilisateur), "mot_de_passe", $forcer_permissions);
} }
public function set_peut_se_connecter($nom_utilisateur, $valeur) { public function set_peut_se_connecter($nom_utilisateur, $valeur) {
Stockage::set_pop(self::singleton()->enfant($nom_utilisateur), "peut_se_connecter", $valeur ? "true" : "false"); Stockage::set_pop(self::singleton()->enfant($nom_utilisateur), "peut_se_connecter", $valeur ? "true" : "false");
} }
public function get_peut_se_connecter($nom_utilisateur) { public function get_peut_se_connecter($nom_utilisateur, $forcer_permissions = false) {
return (Stockage::get_pop(self::singleton()->enfant($nom_utilisateur), "peut_se_connecter") == "true") ? true : 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 <?php
require_once(dirname(__FILE__) . "/erreur.php");
require_once(dirname(__FILE__) . "/authentification.php"); require_once(dirname(__FILE__) . "/authentification.php");
require_once(dirname(__FILE__) . "/nettoyage.php"); require_once(dirname(__FILE__) . "/nettoyage.php");
require_once(dirname(__FILE__) . "/permissions.php"); require_once(dirname(__FILE__) . "/permissions.php");

View File

@ -16,7 +16,7 @@ class Permissions {
if ($utilisateur === null) { if ($utilisateur === null) {
$utilisateur = Authentification::get_utilisateur(); $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 // Parcourt la liste les règles de sécurité (get_regles()), et
// sélectionne la première pour laquelle $chemin correspond au motif // 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. $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() { public function get_regles() {
// Renvoie un tableau de quadruplets // Renvoie un tableau de quadruplets
// (chemin, action, groupe, autorisation). // (chemin, action, groupe, autorisation).
// ou false si erreur. // 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); $str_regles = preg_replace('/\r\n|\r/', "\n", $str_regles);
$regles = array(); $regles = array();
// TODO : ignorer les lignes vides ! // TODO : ignorer les lignes vides !

View File

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

View File

@ -2,7 +2,7 @@
class Session { class Session {
public function démarrer() { public function démarrer() {
return session_id !== "" || session_start(); return (session_id() !== "") || session_start();
} }
public function put($k, $v) { public function put($k, $v) {
@ -12,7 +12,7 @@ class Session {
public function get($k) { public function get($k) {
self::démarrer(); self::démarrer();
return is_set($_SESSION[$k]) ? $_SESSION[$k] : false; return isset($_SESSION[$k]) ? $_SESSION[$k] : false;
} }
public function effacer($k) { 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 // $forcer_permissions permet à vérifier_permission() et ses
// dépendances get_regles() et get_groupe() de faire des get_prop // dépendances get_regles() et get_groupe() de faire des get_prop
// même si l'utilisateur courant n'en a pas le droit. // même si l'utilisateur courant n'en a pas le droit.
if ($forcer_permissions || vérifier_permission($chemin, "get_prop")) { if ($forcer_permissions || Permissions::vérifier_permission($chemin, "get_prop")) {
return SystemeFichiers::lire(Path::combine($chemin->get_fs_stockage(), $prop)); return SystèmeFichiers::lire(Path::combine($chemin->get_fs_stockage(), $prop));
} else { } else {
return "[Accès interdit]"; return false;
} }
} }

View File

@ -25,15 +25,15 @@ class SystèmeFichiers {
} }
public function lire($chemin_fs) { 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) { 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) { 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) { public function déplacer($chemin_fs_de, $chemin_fs_vers) {