diff options
| author | polo <ordipolo@gmx.fr> | 2021-09-01 23:35:42 +0200 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2021-09-01 23:35:42 +0200 |
| commit | 10954c386cacb270e4ae16837483120ca3406259 (patch) | |
| tree | e3107a29984b0e91db899fc08d4a7e066eaf2710 /controller | |
| parent | 452420d0cd05822a9974fe27f0edc4cc4dc300cc (diff) | |
| download | melaine-10954c386cacb270e4ae16837483120ca3406259.tar.gz melaine-10954c386cacb270e4ae16837483120ca3406259.tar.bz2 melaine-10954c386cacb270e4ae16837483120ca3406259.zip | |
albums
Diffstat (limited to 'controller')
| -rw-r--r-- | controller/admin.php | 86 | ||||
| -rw-r--r-- | controller/ckeditor.php | 124 | ||||
| -rw-r--r-- | controller/installation.php | 5 | ||||
| -rw-r--r-- | controller/visitor.php | 65 |
4 files changed, 193 insertions, 87 deletions
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) | |||
| 8 | { | 8 | { |
| 9 | $page_actuelle = "melaine"; | 9 | $page_actuelle = "melaine"; |
| 10 | 10 | ||
| 11 | $Articles = new ArticlesManager; | 11 | // modèle |
| 12 | 12 | $Article = new OneArticle($page_actuelle); | |
| 13 | // contenu de la page | 13 | $Article->makeFileList(); |
| 14 | $Articles->setPage($page_actuelle); | ||
| 15 | $Articles->getFiles(); | ||
| 16 | 14 | ||
| 17 | // nouvel article | 15 | // nouvel article |
| 18 | if($numArticle == 0) | 16 | if($numArticle == 0) |
| @@ -23,13 +21,13 @@ function melaineEdit($numArticle, $suppression) | |||
| 23 | else | 21 | else |
| 24 | { | 22 | { |
| 25 | // nom de l'article ciblé (objet et session) | 23 | // nom de l'article ciblé (objet et session) |
| 26 | $Articles->findFileName($numArticle); | 24 | $Article->findFileName($numArticle); |
| 27 | $_SESSION['nomFichier'] = $Articles->getFileName(); | 25 | $_SESSION['nomFichier'] = $Article->getFileName(); |
| 28 | 26 | ||
| 29 | // suppression | 27 | // suppression |
| 30 | if($suppression) | 28 | if($suppression) |
| 31 | { | 29 | { |
| 32 | $Articles->delete(); | 30 | $Article->delete(); |
| 33 | header('Location: index.php?page=' . $page_actuelle); | 31 | header('Location: index.php?page=' . $page_actuelle); |
| 34 | exit(); | 32 | exit(); |
| 35 | } | 33 | } |
| @@ -37,15 +35,12 @@ function melaineEdit($numArticle, $suppression) | |||
| 37 | else | 35 | else |
| 38 | { | 36 | { |
| 39 | $title = "Modifier un article"; | 37 | $title = "Modifier un article"; |
| 40 | 38 | $texte = $Article->readOne(); // entrée de l'éditeur | |
| 41 | // contenu envoyé à l'éditeur | ||
| 42 | $texte = $Articles->getOne(); | ||
| 43 | } | 39 | } |
| 44 | } | 40 | } |
| 45 | 41 | ||
| 46 | // pour l'affichage des articles | 42 | // pour l'affichage des articles |
| 47 | $Articles->reverseFilesArray(); | 43 | $articles = array_reverse($Article->readAll()); // lourd |
| 48 | $articles = $Articles->getAll(); | ||
| 49 | 44 | ||
| 50 | // sécurisation du contenu pré-existant inséré dans l'éditeur | 45 | // sécurisation du contenu pré-existant inséré dans l'éditeur |
| 51 | if($numArticle >= 0 && !$suppression) | 46 | if($numArticle >= 0 && !$suppression) |
| @@ -73,13 +68,70 @@ function discoEdit($numArticle, $suppression) | |||
| 73 | $title = "Discographie"; | 68 | $title = "Discographie"; |
| 74 | 69 | ||
| 75 | // modèle | 70 | // modèle |
| 76 | $Albums = new AlbumsManager; | 71 | $Album = new OneArticle($page_actuelle); |
| 77 | $texte = ''; | 72 | $Album->makeFileList(); |
| 73 | |||
| 74 | // nouvel album | ||
| 75 | if($numArticle == 0) | ||
| 76 | { | ||
| 77 | $title = "Ajouter un album"; | ||
| 78 | $texte = ''; | ||
| 79 | } | ||
| 80 | else | ||
| 81 | { | ||
| 82 | // nom de l'article ciblé (objet et session) | ||
| 83 | $Album->findFileName($numArticle); | ||
| 84 | $_SESSION['nomFichier'] = $Album->getFileName(); | ||
| 85 | |||
| 86 | // suppression | ||
| 87 | if($suppression) | ||
| 88 | { | ||
| 89 | $Album->delete(); | ||
| 90 | header('Location: index.php?page=' . $page_actuelle); | ||
| 91 | exit(); | ||
| 92 | } | ||
| 93 | // modification | ||
| 94 | else | ||
| 95 | { | ||
| 96 | $title = "Modifier un album"; | ||
| 97 | $texte = $Album->readOne(); // entrée de l'éditeur | ||
| 98 | } | ||
| 99 | } | ||
| 100 | |||
| 101 | $albums = array_reverse($Album->readAll()); // lourd | ||
| 102 | |||
| 103 | // $albums contient un tableau de chaines JSON, | ||
| 104 | // on extrait de chacune 3 variables: titre, année, pochette | ||
| 78 | 105 | ||
| 79 | // traitements PHP pour l'éditeur | 106 | // traitements PHP pour l'éditeur |
| 80 | require('controller/ckeditor.php'); | ||
| 81 | // sécurisation du contenu pré-existant inséré dans l'éditeur | 107 | // sécurisation du contenu pré-existant inséré dans l'éditeur |
| 82 | $texte = preparationCKeditor($numArticle, $texte); | 108 | if($numArticle >= 0 && !$suppression) |
| 109 | { | ||
| 110 | require('controller/ckeditor.php'); | ||
| 111 | $texte = preparationCKeditor($numArticle, $texte); | ||
| 112 | } | ||
| 113 | |||
| 114 | // changer les chaines JSON en tableaux | ||
| 115 | $i = 0; | ||
| 116 | foreach($albums as $oneAlbum) | ||
| 117 | { | ||
| 118 | $albums[$i] = json_decode($oneAlbum, true); | ||
| 119 | $i++; | ||
| 120 | } | ||
| 121 | |||
| 122 | // pour chaque album, détecter le fichier html | ||
| 123 | // si il y en a un, proposer un lien <a> | ||
| 124 | // si non, ne fournir qu'un lien d'ancre pour la liste d'album | ||
| 125 | $titreAlbum = 'discographie'; | ||
| 126 | if(false) | ||
| 127 | { | ||
| 128 | $lienAlbum = $titreAlbum; | ||
| 129 | } | ||
| 130 | else | ||
| 131 | { | ||
| 132 | $lienAlbum = 'discographie#' . $titreAlbum; | ||
| 133 | } | ||
| 134 | //echo($lienAlbum); | ||
| 83 | 135 | ||
| 84 | // morceaux en HTML à assembler | 136 | // morceaux en HTML à assembler |
| 85 | // variable $editeurHTML, contient $texte | 137 | // 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) | |||
| 44 | function submitCKeditor($nomFichier) | 44 | function submitCKeditor($nomFichier) |
| 45 | { | 45 | { |
| 46 | $page = $_GET['page']; | 46 | $page = $_GET['page']; |
| 47 | $contenu = $_POST['contenu']; | ||
| 48 | 47 | ||
| 49 | // déjà fait mais on ne sait jamais | 48 | // déjà fait mais on ne sait jamais |
| 50 | if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) | 49 | if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) |
| 51 | { | 50 | { |
| 52 | header('Location: index.php?page=' . $page . '&erreur=connexion'); | 51 | header('Location: index.php?page=' . $page . '&erreur=connexion'); |
| 52 | exit(); | ||
| 53 | } | 53 | } |
| 54 | else | 54 | |
| 55 | // sécurité faille XSS avec htmLawed | ||
| 56 | $configHtmLawed = array( | ||
| 57 | 'safe'=>1, // protection contre les élements et attributs dangereux | ||
| 58 | '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 | ||
| 59 | 'deny_attribute'=>'id', // gêner le JS hostile | ||
| 60 | // on garde 'class' et 'style' utilisés par le ckediteur | ||
| 61 | ); | ||
| 62 | $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs | ||
| 63 | |||
| 64 | // de l'éditeur | ||
| 65 | if(isset($_POST['contenu'])) // optionnel pour discographie | ||
| 55 | { | 66 | { |
| 67 | $contenu = $_POST['contenu']; | ||
| 68 | |||
| 56 | // récupérer les liens multimedia | 69 | // récupérer les liens multimedia |
| 57 | //require("media.php"); | 70 | //require("media.php"); |
| 58 | //$contenu = mediaSubmit($contenu); | 71 | //$contenu = mediaSubmit($contenu); |
| 59 | 72 | ||
| 60 | // sécurité faille XSS | 73 | $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed); |
| 61 | $configHtmLawed = array( | 74 | // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur) |
| 62 | 'safe'=>1, // protection contre les élements et attributs dangereux | 75 | $contenu = trim($contenu); |
| 63 | '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 | 76 | |
| 64 | 'deny_attribute'=>'id', // gêner le JS hostile | 77 | // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !! |
| 65 | // on garde 'class' et 'style' utilisés par le ckediteur | 78 | if($page != 'discographie' && $contenu == '') |
| 66 | ); | 79 | { |
| 67 | $specHtmLawed = ''; // optionnel: faire qu'un certain élément puisse n'avoir que certains attributs | 80 | header('Location: index.php?page=' . $page . '&erreur=contenu_vide'); |
| 81 | exit(); | ||
| 82 | } | ||
| 68 | } | 83 | } |
| 69 | 84 | ||
| 85 | |||
| 70 | if($page == 'discographie') | 86 | if($page == 'discographie') |
| 71 | { | 87 | { |
| 72 | $titre = $_POST['titre']; | 88 | $titre = $_POST['titre']; |
| 73 | $annee = $_POST['annee']; | 89 | $annee = $_POST['annee']; |
| 74 | $pochette = $_POST['pochette']; // une image | 90 | $pochette = $_POST['pochette']; // une image |
| 75 | 91 | ||
| 76 | // des formulaires simples | 92 | // des formulaires simples |
| 77 | $titre = htmLawed($titre, $configHtmLawed, $specHtmLawed); | 93 | $titre = htmLawed($titre, $configHtmLawed, $specHtmLawed); |
| 78 | $titre = trim($titre); | 94 | $titre = trim($titre); |
| @@ -83,25 +99,6 @@ function submitCKeditor($nomFichier) | |||
| 83 | // Album->imageUpload(); | 99 | // Album->imageUpload(); |
| 84 | // test formats jpg, jpeg, png, gif, tiff | 100 | // test formats jpg, jpeg, png, gif, tiff |
| 85 | // enregistrement du fichier | 101 | // enregistrement du fichier |
| 86 | |||
| 87 | // du ckeditor | ||
| 88 | $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed); | ||
| 89 | $contenu = trim($contenu); | ||
| 90 | } | ||
| 91 | else // pages comme "melaine" | ||
| 92 | { | ||
| 93 | // ne pas continuer si la variable est vide (javascript mal supporté ou utilisation de IE, bug?, erreur de l'utilisateur), risque perte de contenu !! | ||
| 94 | if($contenu == '') | ||
| 95 | { | ||
| 96 | header('Location: index.php?page=' . $page . '&erreur=contenu_vide'); | ||
| 97 | } | ||
| 98 | else | ||
| 99 | { | ||
| 100 | // failles XSS | ||
| 101 | $contenu = htmLawed($contenu, $configHtmLawed, $specHtmLawed); | ||
| 102 | // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine (pour l'entrée de l'éditeur) | ||
| 103 | $contenu = trim($contenu); | ||
| 104 | } | ||
| 105 | } | 102 | } |
| 106 | 103 | ||
| 107 | // lien sans http:// | 104 | // lien sans http:// |
| @@ -114,42 +111,61 @@ function submitCKeditor($nomFichier) | |||
| 114 | // solution 2 (façon pop-up): fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>'; | 111 | // solution 2 (façon pop-up): fermer ce nouvel onglet avec echo '<SCRIPT>javascript:window.close()</SCRIPT>'; |
| 115 | // pour faire passer par le .htaccess l'info comme quoi la page précédente comportait un éditeur ouvert... | 112 | // pour faire passer par le .htaccess l'info comme quoi la page précédente comportait un éditeur ouvert... |
| 116 | 113 | ||
| 117 | //var_dump($titre, $annee, $pochette, $contenu); | ||
| 118 | //die(); | ||
| 119 | |||
| 120 | // modèle | ||
| 121 | $Article = new ArticlesManager; | ||
| 122 | $Article->setPage($page); | ||
| 123 | 114 | ||
| 124 | // enregistrement | 115 | // enregistrement |
| 125 | if($_GET['article'] == 0) | 116 | // var_dump($titre, $annee, $pochette, $contenu); |
| 126 | { | 117 | // die(); |
| 127 | $Article->create($contenu); | ||
| 128 | } | ||
| 129 | else | ||
| 130 | { | ||
| 131 | $Article->setFileName($nomFichier); | ||
| 132 | $Article->update($contenu); | ||
| 133 | } | ||
| 134 | 118 | ||
| 119 | // modèle | ||
| 135 | if($page == 'discographie') | 120 | if($page == 'discographie') |
| 136 | { | 121 | { |
| 137 | $Album = new AlbumsManager; | 122 | // on instancie avec l'enfant de OneArticle |
| 123 | $Album = new Album($page); | ||
| 138 | 124 | ||
| 139 | var_dump($_POST); | ||
| 140 | echo('<br />'); | ||
| 141 | //var_dump($_GET['article']); | 125 | //var_dump($_GET['article']); |
| 142 | 126 | //var_dump($_POST); | |
| 127 | //exit(); | ||
| 128 | |||
| 143 | // enregistrement | 129 | // enregistrement |
| 144 | if($_GET['article'] == 0) | 130 | if($_GET['article'] == 0) |
| 145 | { | 131 | { |
| 146 | // ERREUR, il faut le même nombre de paramètre pour une méthode du même nom | 132 | // page disco |
| 147 | $Album->create($titre, $annee, $pochette); | 133 | $Album->createVignette($titre, $annee, $pochette); |
| 134 | |||
| 135 | // page détail de l'album | ||
| 136 | if(!empty($_POST['contenu'])) | ||
| 137 | { | ||
| 138 | $Album->create($contenu); | ||
| 139 | } | ||
| 140 | } | ||
| 141 | else | ||
| 142 | { | ||
| 143 | // page disco | ||
| 144 | $Album->updateVignette($titre, $annee, $pochette); | ||
| 145 | |||
| 146 | // page détail de l'album | ||
| 147 | if(isset($_POST['contenu'])) | ||
| 148 | { | ||
| 149 | $Album->update($content); | ||
| 150 | } | ||
| 151 | } | ||
| 152 | } | ||
| 153 | // autres pages | ||
| 154 | else | ||
| 155 | { | ||
| 156 | $Article = new OneArticle($page); | ||
| 157 | |||
| 158 | if($_GET['article'] == 0) | ||
| 159 | { | ||
| 160 | $Article->create($contenu); | ||
| 148 | } | 161 | } |
| 149 | else | 162 | else |
| 150 | { | 163 | { |
| 151 | $Album->update($titre, $annee, $pochette); | 164 | $Article->setFileName($nomFichier); |
| 165 | $Article->update($contenu); | ||
| 152 | } | 166 | } |
| 153 | die(); | ||
| 154 | } | 167 | } |
| 155 | } \ No newline at end of file | 168 | } |
| 169 | |||
| 170 | function cleanHTML($contenu) | ||
| 171 | {} | ||
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() | |||
| 25 | if(!file_exists(".htaccess")) | 25 | if(!file_exists(".htaccess")) |
| 26 | { | 26 | { |
| 27 | echo('<p style="color: red;" >Le .htaccess semble absent ce qui rend le site vulnérable aux attaques, veuillez contacter l\'administrateur.</p>'); | 27 | echo('<p style="color: red;" >Le .htaccess semble absent ce qui rend le site vulnérable aux attaques, veuillez contacter l\'administrateur.</p>'); |
| 28 | // $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"; | 28 | //$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"; |
| 29 | // $fichier = fopen('.htaccess', 'w'); | 29 | // $fichier = fopen('.htaccess', 'w'); |
| 30 | // fputs($fichier, $contenu); | 30 | // fputs($fichier, $contenu); |
| 31 | // fclose($fichier); | 31 | // fclose($fichier); |
| @@ -49,8 +49,7 @@ function installation() | |||
| 49 | // - 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 | 49 | // - 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 |
| 50 | 50 | ||
| 51 | // le 0 devant signifie que le nombre est en octal | 51 | // le 0 devant signifie que le nombre est en octal |
| 52 | // changer cette valeur à la mise en production du site si le script d'upload des données est bon | 52 | $droitsDossiers = 0777; // mettre 0700 à la fin |
| 53 | $droitsDossiers = 0777; | ||
| 54 | 53 | ||
| 55 | $listePages = array('melaine', 'discographie', 'concerts', 'presse', 'ateliers', 'liens', 'peinture', 'archives'); | 54 | $listePages = array('melaine', 'discographie', 'concerts', 'presse', 'ateliers', 'liens', 'peinture', 'archives'); |
| 56 | foreach ($listePages as $page) | 55 | 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() | |||
| 33 | $title = "Mais qui est Melaine Favennec?"; | 33 | $title = "Mais qui est Melaine Favennec?"; |
| 34 | 34 | ||
| 35 | // modèle | 35 | // modèle |
| 36 | $Articles = new ArticlesManager; | 36 | $Articles = new AllArticles($page_actuelle); |
| 37 | $Articles->setPage($page_actuelle); | 37 | $Articles->makeFileList(); |
| 38 | $Articles->getFiles(); | 38 | $articles = array_reverse($Articles->readAll()); // lourd |
| 39 | $Articles->reverseFilesArray(); | ||
| 40 | $articles = $Articles->getAll(); // lourd | ||
| 41 | |||
| 42 | // vérification pour protéger les visiteurs | ||
| 43 | // normalement déjà faite dans submit.php, au cas où la base a été trafiquée | ||
| 44 | foreach ($Articles as $oneArticle) | ||
| 45 | { | ||
| 46 | $oneArticle = htmLawed($oneArticle); | ||
| 47 | } | ||
| 48 | 39 | ||
| 49 | // variables $css, $js, $header et $content | 40 | // variables $css, $js, $header et $content |
| 50 | require('view/melaine.php'); | 41 | require('view/melaine.php'); |
| @@ -58,7 +49,55 @@ function discoVisitor() | |||
| 58 | $title = "Discographie"; | 49 | $title = "Discographie"; |
| 59 | 50 | ||
| 60 | // modèle | 51 | // modèle |
| 61 | $Albums = new AlbumsManager; | 52 | $Albums = new Album($page_actuelle); |
| 53 | $Albums->makeFileList(); | ||
| 54 | $albumsJSON = array_reverse($Albums->readAll()); // lourd | ||
| 55 | |||
| 56 | // $albums est un tableau de chaines JSON, | ||
| 57 | // chacune renferme 3 variables: titre, année, pochette | ||
| 58 | |||
| 59 | // changer les chaines JSON en tableaux | ||
| 60 | $i = 0; | ||
| 61 | foreach($albumsJSON as $oneAlbum) | ||
| 62 | { | ||
| 63 | $albumsJSON[$i] = json_decode($oneAlbum, true); | ||
| 64 | $i++; | ||
| 65 | } | ||
| 66 | |||
| 67 | // on passe maintenant au contenu HTML | ||
| 68 | $albumNamesJSON = array_reverse($Albums->getFileNames()); | ||
| 69 | $Albums->setFormat('html'); | ||
| 70 | $Albums->makeFileList(); | ||
| 71 | $albumNamesHTML = array_reverse($Albums->getFileNames()); | ||
| 72 | |||
| 73 | // pour chaque album, détecter le fichier html | ||
| 74 | // si il y en a un, proposer un lien <a> | ||
| 75 | // si non, ne fournir qu'un lien d'ancre pour la liste d'album | ||
| 76 | $i = 0; | ||
| 77 | //print_r($albumNamesJSON); exit(); | ||
| 78 | |||
| 79 | foreach($albumNamesJSON as $oneAlbum) | ||
| 80 | { | ||
| 81 | $chemin = pathinfo($oneAlbum); | ||
| 82 | $nomJSONsansExt = $chemin['filename']; | ||
| 83 | $chemin = pathinfo($albumNamesHTML[0]); | ||
| 84 | $nomHTMLsansExt = $chemin['filename']; | ||
| 85 | |||
| 86 | // détecter un fichier du même nom | ||
| 87 | if(isset($nomJSONsansExt . '.html')) // c'est pas ça!! | ||
| 88 | { | ||
| 89 | //$lienAlbum[$i] = $titreAlbum; | ||
| 90 | } | ||
| 91 | else | ||
| 92 | { | ||
| 93 | //$lienAlbum[$i] = 'discographie#' . $oneAlbum[0]; | ||
| 94 | } | ||
| 95 | $i++; | ||
| 96 | } | ||
| 97 | //exit(); | ||
| 98 | |||
| 99 | |||
| 100 | //echo($lienAlbum); | ||
| 62 | 101 | ||
| 63 | // variables $css, $js et $content | 102 | // variables $css, $js et $content |
| 64 | require('view/discographie.php'); | 103 | require('view/discographie.php'); |
