From 2ac4254829fb27d878044978e4e89f15eeeddd23 Mon Sep 17 00:00:00 2001 From: polo Date: Tue, 1 Mar 2022 04:02:05 +0100 Subject: factorisation et pages manquantes --- controller/Security.php | 8 +++- controller/admin.php | 70 +++++++++++++++++++++++++++---- controller/backup.php | 16 ++++--- controller/installation.php | 7 ---- controller/password.php | 79 ++++++++++++++++++++++------------ controller/visitor.php | 100 ++++++++++++++++++++++++++++++-------------- 6 files changed, 199 insertions(+), 81 deletions(-) (limited to 'controller') diff --git a/controller/Security.php b/controller/Security.php index 6ea121c..c53cdc6 100644 --- a/controller/Security.php +++ b/controller/Security.php @@ -14,10 +14,16 @@ class Security ); private static $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs - public static function secureString($chaine) + public static function secureString(string $chaine): string { $chaine = htmLawed($chaine, self::$configHtmLawed, self::$specHtmLawed); $chaine = trim($chaine); // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur) return $chaine; } } + +function removeSpacesTabsCRLF(string $chaine): string +{ + $cibles = [' ', "\t", "\n", "\r"]; // doubles quotes !! + return(str_replace($cibles, '', $chaine)); +} diff --git a/controller/admin.php b/controller/admin.php index b8ef7ff..ee5c217 100644 --- a/controller/admin.php +++ b/controller/admin.php @@ -4,12 +4,12 @@ // utilisation du site en écriture (admin uniquement) // éditeur ouvert ou suppression d'un élément -function melaineEdit($fileCode, $suppression) +function pageArticlesSimplesAdmin(string $page, string $title, string $headerPaintedTitle, $fileCode, int $suppression) { - $page_actuelle = "melaine"; + $headerImage = '
'; // infos sur les fichiers - $Articles = new Article($page_actuelle); + $Articles = new Article($page); // nouvel article if($fileCode == '') @@ -29,7 +29,7 @@ function melaineEdit($fileCode, $suppression) $Articles->delete(); // redirection immédiate avant affichage - header('Location: index.php?page=' . $page_actuelle); + header('Location: index.php?page=' . $page); exit(); } // modification @@ -68,18 +68,70 @@ function melaineEdit($fileCode, $suppression) require('view/template-formulaires.php'); // variables $css, $js, $header et $content, // $content contient $articles et $editeurHTML - require('view/melaine.php'); + require('view/pageArticlesSimples.php'); // fin de l'assemblage require('view/template.php'); } +function melaineEdit($fileCode, $suppression) +{ + $page = "melaine"; + $title = "Mais qui est Melaine Favennec?"; + $headerPaintedTitle = 'Melaine Favennec'; + pageArticlesSimplesAdmin($page, $title, $headerPaintedTitle, $fileCode, $suppression); +} +function concertsEdit($fileCode, $suppression) +{ + $page = "concerts"; + $title = "Concerts"; + $headerPaintedTitle = 'Concerts'; + pageArticlesSimplesAdmin($page, $title, $headerPaintedTitle, $fileCode, $suppression); +} +function presseEdit($fileCode, $suppression) +{ + $page = "presse"; + $title = "La presse"; + $headerPaintedTitle = 'La Presse'; + pageArticlesSimplesAdmin($page, $title, $headerPaintedTitle, $fileCode, $suppression); +} +function ateliersEdit($fileCode, $suppression) +{ + $page = "ateliers"; + $title = "Ateliers"; + $headerPaintedTitle = 'Les ateliers de Melaine'; + pageArticlesSimplesAdmin($page, $title, $headerPaintedTitle, $fileCode, $suppression); +} +function liensEdit($fileCode, $suppression) +{ + $page = "liens"; + $title = "Liens"; + $headerPaintedTitle = 'Liens'; + pageArticlesSimplesAdmin($page, $title, $headerPaintedTitle, $fileCode, $suppression); +} +function peintureEdit($fileCode, $suppression) +{ + $page = "peinture"; + $title = "peinture"; + $headerPaintedTitle = 'Celtic Boats'; + pageArticlesSimplesAdmin($page, $title, $headerPaintedTitle, $fileCode, $suppression); +} +function archivesEdit($fileCode, $suppression) +{ + $page = "archives"; + $title = "Archives"; + $headerPaintedTitle = 'Archives'; + pageArticlesSimplesAdmin($page, $title, $headerPaintedTitle, $fileCode, $suppression); +} + + +// page plus complexe que les autres function discoEdit($fileCode, $suppression) { - $page_actuelle = "discographie"; + $page = "discographie"; $title = "Discographie"; // modèle - $Albums = new Album($page_actuelle); + $Albums = new Album($page); $Albums->makeFileList(); // contenu: JSON, HTML, noms et chemins des fichiers @@ -109,7 +161,7 @@ function discoEdit($fileCode, $suppression) if($suppression) { $Albums->delete(); - header('Location: index.php?page=' . $page_actuelle); + header('Location: index.php?page=' . $page); exit(); } // modification @@ -132,7 +184,7 @@ function discoEdit($fileCode, $suppression) // image affichée à côté des formulaires if(!empty($vignette[2])) { - $imageFormulaire = '
'; + $imageFormulaire = '
'; } else { diff --git a/controller/backup.php b/controller/backup.php index 81d72b9..4fb01ef 100644 --- a/controller/backup.php +++ b/controller/backup.php @@ -8,20 +8,23 @@ function sauvegarder($from) $cheminDestination = "data/"; $date = date("d-m-Y", time()); - $nomFichier = "melaineDATA_" . $date . ".zip"; + $nomFichier = "melaineDATA_" . $date; // ne prendre que les dossiers pour exclure les fichiers password.txt, melaineDATA.zip et melainePHP.zip existant $dossiersCibles = [ 'data/archives', 'data/concerts', 'data/liens', 'data/presse', 'data/ateliers', 'data/discographie', 'data/melaine', 'data/peinture' ]; //$fichiersALaRacine = []; createZip($cheminDestination, $nomFichier, $dossiersCibles); + global $archiveFormat; + $nomFichier = $nomFichier . '.' . $archiveFormat; + require('view/backup.php'); } function creerMelainePHP() { $cheminDestination = 'data/'; - $nomFichier = "melainePHP.zip"; + $nomFichier = "melainePHP"; // tous les dossiers sauf data et .git $dossiersCibles = ['model', 'view', 'controller', 'public', 'lib']; $fichiersALaRacine = ['*.php', '.htaccess', '*.txt']; // robots? @@ -34,6 +37,9 @@ function creerMelainePHP() // le quatrième est optionnel et concerne les fichiers à la racine function createZip($destinationPath, $zipFileName, array $targetDirectories, array $allPattern = []) { + global $archiveFormat; // choix du format + $zipFileName = $zipFileName . '.' . $archiveFormat; + try { $Zip = new ZipArchive(); @@ -101,6 +107,8 @@ function restaurer($from) // recharger la même page en écrivant les données if(isset($_FILES['archive']) && $_FILES['archive']['error'] == 0) { + // détecter le format (zip ou autre) + // une copie du zip est conservée dans data/ au cas où move_uploaded_file($_FILES['archive']['tmp_name'], 'data/' . $_FILES['archive']['name']); chmod('data/' . $_FILES['archive']['name'], 0666); @@ -117,10 +125,6 @@ function restaurer($from) echo($e); die(); } - - //var_dump($Zip->open($nomFichier, ZipArchive::RDONLY)); - //var_dump(ZipArchive::ER_NOENT); - if($Zip->open($nomFichier, ZipArchive::RDONLY) === TRUE) { $j = 0; diff --git a/controller/installation.php b/controller/installation.php index 6037e17..bf6826d 100644 --- a/controller/installation.php +++ b/controller/installation.php @@ -103,12 +103,6 @@ function installation() mkdir('data/discographie/images-mini'); chmod('data/discographie/images-mini', $droitsDossiers); } - // fichier password.txt - if(!file_exists('data/password.txt')) - { - touch('data/password.txt'); - chmod('data/password.txt', 0600); - } // créer le melainePHP.zip if(!file_exists("data/melainePHP.zip")) @@ -116,7 +110,6 @@ function installation() require('controller/backup.php'); creerMelainePHP(); } - // le modèle donnera les droits 0666 (octal) aux nouveaux fichiers à l'intérieur des dossiers // création d'un mot de passe si password.txt est vide diff --git a/controller/password.php b/controller/password.php index 4ca9f4f..8f6a875 100644 --- a/controller/password.php +++ b/controller/password.php @@ -5,11 +5,25 @@ // affichage function createPassword() { - // si installation() vient de créer un fichier vide - $hashedPassword = trim(file_get_contents('data/password.txt')); + // création du fichier + if(!file_exists('data/password.txt')) + { + touch('data/password.txt'); + chmod('data/password.txt', 0600); + } + + // lecture + $hashedPassword = file_get_contents('data/password.txt'); + if($hashedPassword === false) + { + echo('Erreur: ouverture du fichier password.txt impossible.'); + exit(); + } + + // création du mot de passe if(empty($hashedPassword)) { - // paranoïa + // paranoïa? if(isset($_SESSION['admin'])) { unset($_SESSION['admin']); @@ -17,23 +31,31 @@ function createPassword() exit(); } - // au rechargement: un mot de passe a été saisi - // les espaces/tabulations sont considérés commes des erreurs - if(isset($_POST['motdepasse']) && !empty(trim($_POST['motdepasse']))) + // au rechargement après saisi + // impossible d'entrer un espace ou une tabulation et de valider par erreur + if(isset($_POST['motdepasse']) && !empty($_POST['motdepasse'])) + { + // caractères non désirés supprimés + require('controller/Security.php'); + $password = Security::secureString($_POST['motdepasse']); + $password = removeSpacesTabsCRLF($_POST['motdepasse']); + } + // enregistrement + if(isset($password) && $password == $_POST['motdepasse']) { - // enregistrement hashNewPassword($_POST['motdepasse']); header('Location: index.php'); } // 1ère fois else { - $title = "Créer un mot de passe"; - $subHeading = "Veuillez choisir le mot de passe que vous utiliserez pour gérer le site."; + $title = 'Créer un mot de passe'; + $subHeading = 'Veuillez choisir le mot de passe que vous utiliserez pour gérer le site.'; require('view/password.php'); echo($header); + echo($errorBadCharacters); echo($formulaireNouveauMDP); echo($warning); } @@ -103,37 +125,40 @@ function changePassword() $title = "Nouveau mot de passe"; $subHeading = "Veuillez saisir votre actuel mot de passe suivi du nouveau."; - // cette page utilise la même vue que la fonction connexion() dans controller/visiteur.php require('view/password.php'); - echo($header); - // traitements: vérification ancien mot de passe et choix du nouveau + // conformité du nouveau mot de passe + if(isset($_POST['nouveauMotdepasse']) && !empty($_POST['nouveauMotdepasse'])) + { + require('controller/Security.php'); + $newPassword = Security::secureString($_POST['nouveauMotdepasse']); + $newPassword = removeSpacesTabsCRLF($_POST['nouveauMotdepasse']); + } + // bon mot de passe - //if(isset ($_POST["ancienMotdepasse"]) AND $_POST["ancienMotdepasse"] == $secret) - if(isset ($_POST["ancienMotdepasse"]) AND testPassword($_POST["ancienMotdepasse"])) + if(isset($newPassword) && $newPassword === $_POST['nouveauMotdepasse'] + && isset ($_POST["ancienMotdepasse"]) AND testPassword($_POST["ancienMotdepasse"])) { - // enregistrement + // enregistrement et confirmation hashNewPassword($_POST["nouveauMotdepasse"]); - - // confirmation - echo($message); - //exit(); - - /*header('Location: index.php?page=' . $_GET['from'] . '&message=nouveau_mdp'); - exit();*/ + echo($message); } - // mauvais mot de passe elseif(isset ($_POST["ancienMotdepasse"]) AND !testPassword($_POST["ancienMotdepasse"])) { // défense aux attaques par force brute // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site - echo($erreurMDP); + echo($errorPassword); sleep(1); echo($formulaireModifMDP); } - + // erreur de conformité + elseif(isset($newPassword) && $newPassword !== $_POST['nouveauMotdepasse']) + { + echo($errorBadCharacters); + echo($formulaireModifMDP); + } // première arrivée sur la page else { @@ -146,7 +171,7 @@ function changePassword() // hachage -function hashNewPassword($newPassword) +function hashNewPassword(string $newPassword) { // "réparation" des espaces accidentels $newPassword= trim($newPassword); @@ -160,7 +185,7 @@ function hashNewPassword($newPassword) chmod('data/password.txt', 0600); } -function testPassword($password) +function testPassword(string $password): bool { // lecture $oldHashedPassword = file_get_contents('data/password.txt'); diff --git a/controller/visitor.php b/controller/visitor.php index f0dc877..aae15a7 100644 --- a/controller/visitor.php +++ b/controller/visitor.php @@ -7,7 +7,7 @@ function accueil() { $title = "Bienvenue sur le site de Melaine Favennec"; - $page_actuelle = "accueil"; + $page = "accueil"; $content = ''; // variables $js et $header @@ -19,7 +19,7 @@ function accueil() function menu() { $title = "Melaine Favennec - menu BD"; - $page_actuelle = "menu"; + $page = "menu"; // variables $css, $js, $header et $content require('view/menu.php'); @@ -27,38 +27,91 @@ function menu() require('view/template.php'); } -function melaineVisitor() +// toutes celles du menu sauf: menu et discographie +function pageArticlesSimplesVisitor(string $page, string $title, string $headerPaintedTitle) { - $page_actuelle = "melaine"; - $title = "Mais qui est Melaine Favennec?"; + $headerImage = '
'; - // infos sur les fichiers - $Articles = new Article($page_actuelle); + // infos sur les fichiers $Articles->fileList + $Articles = new Article($page); // données des dates //print_r($Articles->fileList[$i]['date']); //getdate($Albums->fileList[$i]['fileCode']); - // ajout des données dans $Articles->fileList['content'] + // si la page n'est pas vide if(!empty($Articles->fileList)) { + // données dans $Articles->fileList['content'] $Articles->readAll(); $Articles->fileList = array_reverse($Articles->fileList); } // variables $css, $js, $header et $content - require('view/melaine.php'); + require('view/pageArticlesSimples.php'); // HTML require('view/template.php'); } +function melaineVisitor() +{ + $page = "melaine"; + $title = "Mais qui est Melaine Favennec?"; + $headerPaintedTitle = 'Melaine Favennec'; + pageArticlesSimplesVisitor($page, $title, $headerPaintedTitle); +} +function concertsVisitor() +{ + $page = "concerts"; + $title = "Concerts"; + $headerPaintedTitle = 'Concerts'; + pageArticlesSimplesVisitor($page, $title, $headerPaintedTitle); +} +function presseVisitor() +{ + $page = "presse"; + $title = "La presse"; + $headerPaintedTitle = 'La Presse'; + pageArticlesSimplesVisitor($page, $title, $headerPaintedTitle); +} +function ateliersVisitor() +{ + $page = "ateliers"; + $title = "Ateliers"; + $headerPaintedTitle = 'Les ateliers de Melaine'; + pageArticlesSimplesVisitor($page, $title, $headerPaintedTitle); +} +function liensVisitor() +{ + $page = "liens"; + $title = "Liens"; + $headerPaintedTitle = 'Liens'; + pageArticlesSimplesVisitor($page, $title, $headerPaintedTitle); +} +function peintureVisitor() +{ + $page = "peinture"; + $title = "peinture"; + $headerPaintedTitle = 'Celtic Boats'; + pageArticlesSimplesVisitor($page, $title, $headerPaintedTitle); +} +function archivesVisitor() +{ + $page = "archives"; + $title = "Archives"; + $headerPaintedTitle = 'Archives'; + pageArticlesSimplesVisitor($page, $title, $headerPaintedTitle); +} + + +// page plus complexe que les autres function discoVisitor() { - $page_actuelle = "discographie"; + $page = "discographie"; $title = "Discographie"; // modèle - $Albums = new Album($page_actuelle); + $Albums = new Album($page); //var_dump($Albums->fileList); die(); // on récupère tout: JSON, HTML, noms et chemins des fichiers @@ -117,27 +170,27 @@ function discoVisitor() // page d'un album function album($fileCode) { - $page_actuelle = 'discographie'; // ??? + $page = 'discographie'; // = nom du dossier où sont les données - $Albums = new Album($page_actuelle); + $Albums = new Album($page); $Albums->getAllJSON(); $Albums->fileCode = $fileCode; $Albums->readOne(); - //var_dump($Albums); die(); - + $title = $Albums->oneAlbum['titre']; $album = $Albums->oneAlbum['HTMLcontent']; - //$album = Album::readOneHTML($fileCode); for($i = 0; $i < $Albums->fileListCount; $i++) { if(file_exists('data/discographie/html/' . $Albums->fileList[$i]['fileCode'] . '.html')) { $lienAlbum[$i] = 'page=album&file_code=' . $Albums->fileList[$i]['fileCode']; + $linkDiscoChrono[$i] = 'linkChrono'; // pour le css } else { $lienAlbum[$i] = 'page=discographie#' . $Albums->fileList[$i]['titre']; + $linkDiscoChrono[$i] = 'noLinkChrono'; // pour le css } } @@ -146,18 +199,3 @@ function album($fileCode) // HTML require('view/template.php'); } - -function presse() -{} - -function ateliers() -{} - -function liens() -{} - -function peinture() -{} - -function archives() -{} \ No newline at end of file -- cgit v1.2.3