From 10954c386cacb270e4ae16837483120ca3406259 Mon Sep 17 00:00:00 2001 From: polo Date: Wed, 1 Sep 2021 23:35:42 +0200 Subject: albums --- controller/admin.php | 86 ++++++++++++++++++++++++------ controller/ckeditor.php | 124 +++++++++++++++++++++++++------------------- controller/installation.php | 5 +- controller/visitor.php | 65 ++++++++++++++++++----- 4 files changed, 193 insertions(+), 87 deletions(-) (limited to 'controller') diff --git a/controller/admin.php b/controller/admin.php index 0abdb1c..2588d36 100644 --- a/controller/admin.php +++ b/controller/admin.php @@ -8,11 +8,9 @@ function melaineEdit($numArticle, $suppression) { $page_actuelle = "melaine"; - $Articles = new ArticlesManager; - - // contenu de la page - $Articles->setPage($page_actuelle); - $Articles->getFiles(); + // modèle + $Article = new OneArticle($page_actuelle); + $Article->makeFileList(); // nouvel article if($numArticle == 0) @@ -23,13 +21,13 @@ function melaineEdit($numArticle, $suppression) else { // nom de l'article ciblé (objet et session) - $Articles->findFileName($numArticle); - $_SESSION['nomFichier'] = $Articles->getFileName(); + $Article->findFileName($numArticle); + $_SESSION['nomFichier'] = $Article->getFileName(); // suppression if($suppression) { - $Articles->delete(); + $Article->delete(); header('Location: index.php?page=' . $page_actuelle); exit(); } @@ -37,15 +35,12 @@ function melaineEdit($numArticle, $suppression) else { $title = "Modifier un article"; - - // contenu envoyé à l'éditeur - $texte = $Articles->getOne(); + $texte = $Article->readOne(); // entrée de l'éditeur } } // pour l'affichage des articles - $Articles->reverseFilesArray(); - $articles = $Articles->getAll(); + $articles = array_reverse($Article->readAll()); // lourd // sécurisation du contenu pré-existant inséré dans l'éditeur if($numArticle >= 0 && !$suppression) @@ -73,13 +68,70 @@ function discoEdit($numArticle, $suppression) $title = "Discographie"; // modèle - $Albums = new AlbumsManager; - $texte = ''; + $Album = new OneArticle($page_actuelle); + $Album->makeFileList(); + + // nouvel album + if($numArticle == 0) + { + $title = "Ajouter un album"; + $texte = ''; + } + else + { + // nom de l'article ciblé (objet et session) + $Album->findFileName($numArticle); + $_SESSION['nomFichier'] = $Album->getFileName(); + + // suppression + if($suppression) + { + $Album->delete(); + header('Location: index.php?page=' . $page_actuelle); + exit(); + } + // modification + else + { + $title = "Modifier un album"; + $texte = $Album->readOne(); // entrée de l'éditeur + } + } + + $albums = array_reverse($Album->readAll()); // lourd + + // $albums contient un tableau de chaines JSON, + // on extrait de chacune 3 variables: titre, année, pochette // traitements PHP pour l'éditeur - require('controller/ckeditor.php'); // sécurisation du contenu pré-existant inséré dans l'éditeur - $texte = preparationCKeditor($numArticle, $texte); + if($numArticle >= 0 && !$suppression) + { + require('controller/ckeditor.php'); + $texte = preparationCKeditor($numArticle, $texte); + } + + // changer les chaines JSON en tableaux + $i = 0; + foreach($albums as $oneAlbum) + { + $albums[$i] = json_decode($oneAlbum, true); + $i++; + } + + // pour chaque album, détecter le fichier html + // si il y en a un, proposer un lien + // si non, ne fournir qu'un lien d'ancre pour la liste d'album + $titreAlbum = 'discographie'; + if(false) + { + $lienAlbum = $titreAlbum; + } + else + { + $lienAlbum = 'discographie#' . $titreAlbum; + } + //echo($lienAlbum); // morceaux en HTML à assembler // variable $editeurHTML, contient $texte diff --git a/controller/ckeditor.php b/controller/ckeditor.php index d25e5ac..2e72be2 100644 --- a/controller/ckeditor.php +++ b/controller/ckeditor.php @@ -44,35 +44,51 @@ function preparationCKeditor($numArticle, $texte) function submitCKeditor($nomFichier) { $page = $_GET['page']; - $contenu = $_POST['contenu']; // déjà fait mais on ne sait jamais if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) { header('Location: index.php?page=' . $page . '&erreur=connexion'); + exit(); } - else + + // sécurité faille XSS avec htmLawed + $configHtmLawed = array( + 'safe'=>1, // protection contre les élements et attributs dangereux + 'elements'=>'h2, h3, h4, p, br, span, i, strong, u, mark, blockquote, li, ol, ul, a, figure, hr, img, figcaption, table, tbody, tr, td', // paramètre optionnel: les balises non indiquées sont supprimées + 'deny_attribute'=>'id', // gêner le JS hostile + // on garde 'class' et 'style' utilisés par le ckediteur + ); + $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs + + // de l'éditeur + if(isset($_POST['contenu'])) // optionnel pour discographie { + $contenu = $_POST['contenu']; + // récupérer les liens multimedia //require("media.php"); //$contenu = mediaSubmit($contenu); - // sécurité faille XSS - $configHtmLawed = array( - 'safe'=>1, // protection contre les élements et attributs dangereux - 'elements'=>'h2, h3, h4, p, br, span, i, strong, u, mark, blockquote, li, ol, ul, a, figure, hr, img, figcaption, table, tbody, tr, td', // paramètre optionnel: les balises non indiquées sont supprimées - 'deny_attribute'=>'id', // gêner le JS hostile - // on garde 'class' et 'style' utilisés par le ckediteur - ); - $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs + $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed); + // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur) + $contenu = trim($contenu); + + // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !! + if($page != 'discographie' && $contenu == '') + { + header('Location: index.php?page=' . $page . '&erreur=contenu_vide'); + exit(); + } } + if($page == 'discographie') { $titre = $_POST['titre']; $annee = $_POST['annee']; $pochette = $_POST['pochette']; // une image - + // des formulaires simples $titre = htmLawed($titre, $configHtmLawed, $specHtmLawed); $titre = trim($titre); @@ -83,25 +99,6 @@ function submitCKeditor($nomFichier) // Album->imageUpload(); // test formats jpg, jpeg, png, gif, tiff // enregistrement du fichier - - // du ckeditor - $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed); - $contenu = trim($contenu); - } - else // pages comme "melaine" - { - // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !! - if($contenu == '') - { - header('Location: index.php?page=' . $page . '&erreur=contenu_vide'); - } - else - { - // failles XSS - $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed); - // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur) - $contenu = trim($contenu); - } } // lien sans http:// @@ -114,42 +111,61 @@ function submitCKeditor($nomFichier) // solution 2 (façon pop-up): fermer ce nouvel onglet avec echo ''; // pour faire passer par le .htaccess l'info comme quoi la page précédente comportait un éditeur ouvert... - //var_dump($titre, $annee, $pochette, $contenu); - //die(); - - // modèle - $Article = new ArticlesManager; - $Article->setPage($page); // enregistrement - if($_GET['article'] == 0) - { - $Article->create($contenu); - } - else - { - $Article->setFileName($nomFichier); - $Article->update($contenu); - } + // var_dump($titre, $annee, $pochette, $contenu); + // die(); + // modèle if($page == 'discographie') { - $Album = new AlbumsManager; + // on instancie avec l'enfant de OneArticle + $Album = new Album($page); - var_dump($_POST); - echo('
'); //var_dump($_GET['article']); - + //var_dump($_POST); + //exit(); + // enregistrement if($_GET['article'] == 0) { - // ERREUR, il faut le même nombre de paramètre pour une méthode du même nom - $Album->create($titre, $annee, $pochette); + // page disco + $Album->createVignette($titre, $annee, $pochette); + + // page détail de l'album + if(!empty($_POST['contenu'])) + { + $Album->create($contenu); + } + } + else + { + // page disco + $Album->updateVignette($titre, $annee, $pochette); + + // page détail de l'album + if(isset($_POST['contenu'])) + { + $Album->update($content); + } + } + } + // autres pages + else + { + $Article = new OneArticle($page); + + if($_GET['article'] == 0) + { + $Article->create($contenu); } else { - $Album->update($titre, $annee, $pochette); + $Article->setFileName($nomFichier); + $Article->update($contenu); } - die(); } -} \ No newline at end of file +} + +function cleanHTML($contenu) +{} diff --git a/controller/installation.php b/controller/installation.php index 42212f5..fc8c900 100644 --- a/controller/installation.php +++ b/controller/installation.php @@ -25,7 +25,7 @@ function installation() if(!file_exists(".htaccess")) { echo('

Le .htaccess semble absent ce qui rend le site vulnérable aux attaques, veuillez contacter l\'administrateur.

'); - // $contenu = "# redirection en cas d'erreur 404\nErrorDocument 404 http://" . $_SERVER['SERVER_NAME'] . "/" . $nomDuSite . "/erreur404.php\n# Interdire exploration du répertoire\nOptions All -Indexes"; + //$contenu = "# redirection en cas d'erreur 404\nErrorDocument 404 http://" . $_SERVER['SERVER_NAME'] . "/" . $nomDuSite . "/erreur404.php\n# Interdire exploration du répertoire\nOptions All -Indexes"; // $fichier = fopen('.htaccess', 'w'); // fputs($fichier, $contenu); // fclose($fichier); @@ -49,8 +49,7 @@ function installation() // - modifier ceux du dossier parent (nom du site) avec son client FTP à la mise en ligne chez l'hébergeur et ensuite remettre tout comme avant // le 0 devant signifie que le nombre est en octal - // changer cette valeur à la mise en production du site si le script d'upload des données est bon - $droitsDossiers = 0777; + $droitsDossiers = 0777; // mettre 0700 à la fin $listePages = array('melaine', 'discographie', 'concerts', 'presse', 'ateliers', 'liens', 'peinture', 'archives'); foreach ($listePages as $page) diff --git a/controller/visitor.php b/controller/visitor.php index 4f51dda..936eb35 100644 --- a/controller/visitor.php +++ b/controller/visitor.php @@ -33,18 +33,9 @@ function melaineVisitor() $title = "Mais qui est Melaine Favennec?"; // modèle - $Articles = new ArticlesManager; - $Articles->setPage($page_actuelle); - $Articles->getFiles(); - $Articles->reverseFilesArray(); - $articles = $Articles->getAll(); // lourd - - // vérification pour protéger les visiteurs - // normalement déjà faite dans submit.php, au cas où la base a été trafiquée - foreach ($Articles as $oneArticle) - { - $oneArticle = htmLawed($oneArticle); - } + $Articles = new AllArticles($page_actuelle); + $Articles->makeFileList(); + $articles = array_reverse($Articles->readAll()); // lourd // variables $css, $js, $header et $content require('view/melaine.php'); @@ -58,7 +49,55 @@ function discoVisitor() $title = "Discographie"; // modèle - $Albums = new AlbumsManager; + $Albums = new Album($page_actuelle); + $Albums->makeFileList(); + $albumsJSON = array_reverse($Albums->readAll()); // lourd + + // $albums est un tableau de chaines JSON, + // chacune renferme 3 variables: titre, année, pochette + + // changer les chaines JSON en tableaux + $i = 0; + foreach($albumsJSON as $oneAlbum) + { + $albumsJSON[$i] = json_decode($oneAlbum, true); + $i++; + } + + // on passe maintenant au contenu HTML + $albumNamesJSON = array_reverse($Albums->getFileNames()); + $Albums->setFormat('html'); + $Albums->makeFileList(); + $albumNamesHTML = array_reverse($Albums->getFileNames()); + + // pour chaque album, détecter le fichier html + // si il y en a un, proposer un lien
+ // si non, ne fournir qu'un lien d'ancre pour la liste d'album + $i = 0; + //print_r($albumNamesJSON); exit(); + + foreach($albumNamesJSON as $oneAlbum) + { + $chemin = pathinfo($oneAlbum); + $nomJSONsansExt = $chemin['filename']; + $chemin = pathinfo($albumNamesHTML[0]); + $nomHTMLsansExt = $chemin['filename']; + + // détecter un fichier du même nom + if(isset($nomJSONsansExt . '.html')) // c'est pas ça!! + { + //$lienAlbum[$i] = $titreAlbum; + } + else + { + //$lienAlbum[$i] = 'discographie#' . $oneAlbum[0]; + } + $i++; + } + //exit(); + + + //echo($lienAlbum); // variables $css, $js et $content require('view/discographie.php'); -- cgit v1.2.3