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 --- config.php | 5 + controller/Security.php | 8 +- controller/admin.php | 70 ++++++- controller/backup.php | 16 +- controller/installation.php | 7 - controller/password.php | 79 +++++--- controller/visitor.php | 100 ++++++---- index.php | 30 ++- model/Image.php | 4 +- public/css/accueil.css | 5 +- public/css/donnees_hors_editeur.css | 19 +- public/css/melaine.css | 107 ----------- public/css/pages_articles_simples.css | 244 +++++++++++++++++++++++++ public/header_images/blonde.jpg | Bin 0 -> 39839 bytes public/header_images/blonde_mini.jpg | Bin 0 -> 22167 bytes public/header_images/blonde_petit.jpg | Bin 0 -> 29931 bytes public/header_images/canoe.png | Bin 0 -> 58206 bytes public/header_images/canoe_mini.png | Bin 0 -> 23013 bytes public/header_images/canoe_petit.png | Bin 0 -> 37555 bytes public/header_images/cavalier.jpg | Bin 0 -> 32299 bytes public/header_images/cavalier_mini.jpg | Bin 0 -> 17202 bytes public/header_images/cavalier_petit.jpg | Bin 0 -> 24059 bytes public/header_images/fille_qui_tombe.jpg | Bin 0 -> 22520 bytes public/header_images/fille_qui_tombe_mini.jpg | Bin 0 -> 14105 bytes public/header_images/fille_qui_tombe_petit.jpg | Bin 0 -> 17566 bytes public/header_images/melaine.png | Bin 0 -> 233561 bytes public/header_images/melaine_mini.png | Bin 0 -> 66245 bytes public/header_images/melaine_petit.png | Bin 0 -> 136131 bytes public/header_images/mouette_ocean.jpg | Bin 0 -> 22830 bytes public/header_images/mouette_ocean_mini.jpg | Bin 0 -> 13174 bytes public/header_images/mouette_ocean_petit.jpg | Bin 0 -> 17474 bytes public/header_images/sirene.jpg | Bin 0 -> 27544 bytes public/header_images/sirene_mini.jpg | Bin 0 -> 14850 bytes public/header_images/sirene_petit.jpg | Bin 0 -> 20385 bytes public/melaine/photo.png | Bin 233561 -> 0 bytes public/melaine/photo_mini.png | Bin 66245 -> 0 bytes public/melaine/photo_petit.png | Bin 136131 -> 0 bytes view/backup.php | 13 +- view/discographie.php | 2 +- view/melaine.php | 138 -------------- view/menu.php | 2 +- view/nav.php | 18 +- view/pageArticlesSimples.php | 136 ++++++++++++++ view/password.php | 16 +- view/template-formulaires.php | 8 +- view/template.php | 12 +- "\303\240 faire apr\303\250s livraison.txt" | 30 ++- 47 files changed, 676 insertions(+), 393 deletions(-) delete mode 100644 public/css/melaine.css create mode 100644 public/css/pages_articles_simples.css create mode 100644 public/header_images/blonde.jpg create mode 100644 public/header_images/blonde_mini.jpg create mode 100644 public/header_images/blonde_petit.jpg create mode 100644 public/header_images/canoe.png create mode 100644 public/header_images/canoe_mini.png create mode 100644 public/header_images/canoe_petit.png create mode 100644 public/header_images/cavalier.jpg create mode 100644 public/header_images/cavalier_mini.jpg create mode 100644 public/header_images/cavalier_petit.jpg create mode 100644 public/header_images/fille_qui_tombe.jpg create mode 100644 public/header_images/fille_qui_tombe_mini.jpg create mode 100644 public/header_images/fille_qui_tombe_petit.jpg create mode 100644 public/header_images/melaine.png create mode 100644 public/header_images/melaine_mini.png create mode 100644 public/header_images/melaine_petit.png create mode 100644 public/header_images/mouette_ocean.jpg create mode 100644 public/header_images/mouette_ocean_mini.jpg create mode 100644 public/header_images/mouette_ocean_petit.jpg create mode 100644 public/header_images/sirene.jpg create mode 100644 public/header_images/sirene_mini.jpg create mode 100644 public/header_images/sirene_petit.jpg delete mode 100644 public/melaine/photo.png delete mode 100644 public/melaine/photo_mini.png delete mode 100644 public/melaine/photo_petit.png delete mode 100644 view/melaine.php create mode 100644 view/pageArticlesSimples.php diff --git a/config.php b/config.php index be894e9..4d7dcfe 100644 --- a/config.php +++ b/config.php @@ -3,6 +3,11 @@ // écrire 'gd' ou 'imagick' $imageLibrary = 'imagick'; +// format des sauvegardes à la création +// écrire 'zip' ou 'tar' ou 'phar' +$archiveFormat = 'zip'; +// seul zip est supporté pour l'instant + // taille max des fichiers à adapter au php.ini $maxWeight = 2000000; 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 diff --git a/index.php b/index.php index c37ffc1..ea50afe 100644 --- a/index.php +++ b/index.php @@ -4,8 +4,10 @@ // routeur MVC ou controlleur principal // il traite les GET et passe la main aux contrôleurs +declare(strict_types=1); session_start(); +// erreurs affichées au rechargement (ça concerne une partie des erreurs) if(!empty($_SESSION['erreur'])) { echo(''); @@ -113,6 +115,8 @@ else // page du site demandée if(isset($_GET['page'])) { + $pagesArticlesSimples = ['melaine', 'concerts', 'presse', 'ateliers', 'liens', 'peinture', 'archives']; + // page d'accueil if($_GET['page'] == 'accueil') { @@ -123,9 +127,11 @@ if(isset($_GET['page'])) { menu(); } - // page melaine - elseif($_GET['page'] == 'melaine') + // pages avec articles simples + elseif(in_array($_GET['page'], $pagesArticlesSimples)) { + $fonctionVisitor = $_GET['page'] . 'Visitor'; + $fonctionEdit = $_GET['page'] . 'Edit'; // cas de l'ouverture de l'éditeur pour modification: // on récupère le GET qui sera placé dans une session // GET, POST, cookies => navigation (utiles au visiteur) @@ -136,30 +142,35 @@ if(isset($_GET['page'])) // rédaction if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor') { - //echo($_GET['file_code']); die(); - // modification if(isset($_GET['file_code']) || !empty($_GET['file_code'])) { - melaineEdit($_GET['file_code'], 0); + //melaineEdit($_GET['file_code'], 0); + $fonctionEdit($_GET['file_code'], 0); } // nouvel article else { - melaineEdit('', 0); + //melaineEdit('', 0); + $fonctionEdit('', 0); } } // suppression else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') { - melaineEdit($_GET['file_code'], 1); + //melaineEdit($_GET['file_code'], 1); + $fonctionEdit($_GET['file_code'], 1); } else { - melaineVisitor(); + //melaineVisitor(); + $fonctionVisitor(); } + + if($_GET['page'] == 'melaine') + {} } - // page discographie + // page discographie (avec albums et articles) elseif($_GET['page'] == 'discographie') { // rédaction @@ -214,7 +225,6 @@ elseif($_SESSION['admin'] == 1 && isset($_GET['action'])) { if($_GET['action'] == 'modif_mdp') { - //changePassword($secret); changePassword(); } else diff --git a/model/Image.php b/model/Image.php index 793bd8d..d94e95d 100644 --- a/model/Image.php +++ b/model/Image.php @@ -45,12 +45,12 @@ class Image } else { - $this->erreur = 'erreur du serveur: le fichier téléchargé est trop lourd, poids max = ' . self::MAX_WEIGHT . ' octets'; + $this->erreur = 'erreur du serveur: le fichier téléchargé est trop lourd, poids max = ' . $maxWeight . ' octets'; } } else { - $this->erreur = 'erreur du serveur: le fichier téléchargé est trop lourd, poids max = ' . self::MAX_WEIGHT . ' octets'; + $this->erreur = 'erreur du serveur: le fichier téléchargé est trop lourd, poids max = ' . $maxWeight . ' octets'; } // retour des rêquetes AJAX diff --git a/public/css/accueil.css b/public/css/accueil.css index 8f7f8c7..8c8ff35 100644 --- a/public/css/accueil.css +++ b/public/css/accueil.css @@ -99,12 +99,13 @@ h3 { background-color: #a8b3d9; padding: 2px 0px; + margin-bottom: 15px; } form { padding-bottom: 14px; - border-bottom: 1px black solid; + /*border-bottom: 1px black solid;*/ } #courriel @@ -201,6 +202,7 @@ form color: red; font-size: 90%; text-align: center; + padding-bottom: 10px; } .connexionFormulaire @@ -358,6 +360,7 @@ form header { + margin: 0px 30px; padding-top: 61px; } diff --git a/public/css/donnees_hors_editeur.css b/public/css/donnees_hors_editeur.css index 7b377ea..25436a4 100644 --- a/public/css/donnees_hors_editeur.css +++ b/public/css/donnees_hors_editeur.css @@ -24,8 +24,9 @@ input[type="checkbox"]:checked{border: none; background: #26ab33;} .table td{border: 1px grey solid; padding: 7px; min-width: 30px;} td p{margin: 0px;} -.image{margin: 0px;text-align: center;margin: auto;height: 100%;} +.image{width: fit-content;margin: 0px;text-align: center;margin: auto;/*height: 100%;*/} .image img{width: 100%;} +/*.image:not(.image_resized) img{width: auto;}*/ .image-style-side{float: right;} .image-style-side:not(.image_resized){max-width: 50%;} .image>figcaption{padding: 7px; text-align: center; font-size: small; background-color: #f0f0f0;} @@ -35,22 +36,26 @@ article:after{content: ""; display: block; clear: both;} iframe{min-width: 400px; min-height: 300px; max-width: 1200px; max-height: 900px;} -/*@media screen and (max-width: 1000px) + + + + +@media screen and (max-width: 1000px) { - img{max-width: 900px;} -}*/ + /*img{max-width: 900px;}*/ +} @media screen and (min-width: 700px) { - .image{/*max-width: 630px;*/width: auto;} + /*.image{width: auto;}*/ } @media screen and (max-width: 699px) { - .image{max-width: 480px;} + /*.image{max-width: 480px;}*/ } @media screen and (max-width: 479px) { - .image{max-width: 320px;} + /*.image{max-width: 320px;}*/ } \ No newline at end of file diff --git a/public/css/melaine.css b/public/css/melaine.css deleted file mode 100644 index 429ccec..0000000 --- a/public/css/melaine.css +++ /dev/null @@ -1,107 +0,0 @@ -/* public/melaine.css */ - -.police_titre -{ - color: #e9d4be; -} - -td -{ - vertical-align: top; -} - -pre -{ - font-family: 'Arial', 'sans'; - white-space: pre-wrap; -} - -figure -{ - /*margin: 5px;*/ -} -.boutonArticle -{ - border-bottom: 3px black double; -} -.boutonArticle a -{ - padding: 2px; - border: 4px black groove; -} - -@media screen and (min-width: 700px) -{ - #titre - { - width: 630px; - height: 171px; - background-image: url("../mouette.png"); - } - - #photo - { - width: 630px; - height: 230px; - background-image: url("../melaine/photo.png"); - position: relative; - bottom: 30px; - } - - /*img - { - max-width: 630px; - }*/ -} - -@media screen and (max-width: 699px) -{ - #titre - { - width: 480px; - height: 131px; - background-image: url("../mouette_petit.png"); - margin: auto; - } - - #photo - { - width: 480px; - height: 191px; - background-image: url("../melaine/photo_petit.png"); - margin: auto; - position: relative; - bottom: 24px; - } - - /*img - { - max-width: 480px; - }*/ -} - -@media screen and (max-width: 479px) -{ - #titre - { - width: 320px; - height: 88px; - background-image: url("../mouette_mini.png"); - margin: auto; - } - - #photo - { - width: 320px; - height: 127px; - background-image: url("../melaine/photo_mini.png"); - margin: auto; - position: relative; - bottom: 17px; - } - - /*img - { - max-width: 320px; - }*/ -} diff --git a/public/css/pages_articles_simples.css b/public/css/pages_articles_simples.css new file mode 100644 index 0000000..03e4317 --- /dev/null +++ b/public/css/pages_articles_simples.css @@ -0,0 +1,244 @@ +/* public/css/pages_articles_simples.css */ + +.police_titre +{ + color: #e9d4be; +} + +td +{ + vertical-align: top; +} + +pre +{ + font-family: 'Arial', 'sans'; + white-space: pre-wrap; +} + +figure +{ + /*margin: 5px;*/ +} +.boutonArticle +{ + border-bottom: 3px black double; +} +.boutonArticle a +{ + padding: 2px; + border: 4px black groove; +} + +@media screen and (min-width: 700px) +{ + #titre + { + width: 630px; + height: 171px; + background-image: url("../mouette.png"); + } + + .photo + { + width: 630px; + height: 230px; + /*background-image: url("../melaine/photo.png");*/ + position: relative; + bottom: 30px; + } +} + +@media screen and (max-width: 699px) +{ + #titre + { + width: 480px; + height: 131px; + background-image: url("../mouette_petit.png"); + margin: auto; + } + + .photo + { + width: 480px; + height: 191px; + /*background-image: url("../melaine/photo_petit.png");*/ + margin: auto; + position: relative; + bottom: 24px; + } +} + +@media screen and (max-width: 479px) +{ + #titre + { + width: 320px; + height: 88px; + background-image: url("../mouette_mini.png"); + margin: auto; + } + + .photo + { + width: 320px; + height: 127px; + /*background-image: url("../melaine/photo_mini.png");*/ + margin: auto; + position: relative; + bottom: 17px; + } +} + + +/* CSS spécifique à chaque page */ +@media screen and (min-width: 700px) +{ + #photo_melaine + { + background-image: url('../header_images/melaine.png'); + } + #photo_concerts + { + background-image: url('../header_images/sirene.jpg'); + width: 308px; + height: 170px; + margin-left: auto; + } + #photo_presse + { + background-image: url('../header_images/fille_qui_tombe.jpg'); + width: 208px; + height: 163px; + margin-left: auto; + } + #photo_ateliers + { + background-image: url('../header_images/cavalier.jpg'); + width: 159px; + height: 312px; + margin-left: 10px; + } + #photo_liens + { + background-image: url('../header_images/canoe.png'); + width: 207px; + height: 144px; + margin-left: auto; + } + #photo_peinture + { + background-image: url('../header_images/mouette_ocean.jpg'); + width: 257px; + height: 171px; + margin-left: auto; + } + #photo_archives + { + background-image: url('../header_images/blonde.jpg'); + width: 257px; + height: 233px; + margin-left: auto; + } +} + +@media screen and (max-width: 699px) +{ + #photo_melaine + { + background-image: url("../header_images/melaine_petit.png"); + } + #photo_concerts + { + background-image: url('../header_images/sirene_petit.jpg'); + width: 243px; + height: 132px; + margin: 0 0 0 auto; + } + #photo_presse + { + background-image: url('../header_images/fille_qui_tombe_petit.jpg'); + width: 158px; + height: 124px; + margin: 0 0 0 auto; + } + #photo_ateliers + { + background-image: url('../header_images/cavalier_petit.jpg'); + width: 121px; + height: 237px; + margin-left: 10px; + } + #photo_liens + { + background-image: url('../header_images/canoe_petit.png'); + width: 157px; + height: 109px; + margin: 0 0 0 auto; + } + #photo_peinture + { + background-image: url('../header_images/mouette_ocean_petit.jpg'); + width: 195px; + height: 130px; + margin: 0 0 0 auto; + } + #photo_archives + { + background-image: url('../header_images/blonde_petit.jpg'); + width: 195px; + height: 177px; + margin: 0 0 0 auto; + } +} + +@media screen and (max-width: 479px) +{ + #photo_melaine + { + background-image: url("../header_images/melaine_mini.png"); + } + #photo_concerts + { + background-image: url('../header_images/sirene_mini.jpg'); + width: 162px; + height: 88px; + margin: 0 0 0 auto; + } + #photo_presse + { + background-image: url('../header_images/fille_qui_tombe_mini.jpg'); + width: 105px; + height: 82px; + margin: 0 0 0 auto; + } + #photo_ateliers + { + background-image: url('../header_images/cavalier_mini.jpg'); + width: 80px; + height: 158px; + margin-left: 10px; + } + #photo_liens + { + background-image: url('../header_images/canoe_mini.png'); + width: 105px; + height: 73px; + margin: 0 0 0 auto; + } + #photo_peinture + { + background-image: url('../header_images/mouette_ocean_mini.jpg'); + width: 130px; + height: 86px; + margin: 0 0 0 auto; + } + #photo_archives + { + background-image: url('../header_images/blonde_mini.jpg'); + width: 130px; + height: 118px; + margin: 0 0 0 auto; + } +} diff --git a/public/header_images/blonde.jpg b/public/header_images/blonde.jpg new file mode 100644 index 0000000..35d9fe2 Binary files /dev/null and b/public/header_images/blonde.jpg differ diff --git a/public/header_images/blonde_mini.jpg b/public/header_images/blonde_mini.jpg new file mode 100644 index 0000000..87f5961 Binary files /dev/null and b/public/header_images/blonde_mini.jpg differ diff --git a/public/header_images/blonde_petit.jpg b/public/header_images/blonde_petit.jpg new file mode 100644 index 0000000..657966f Binary files /dev/null and b/public/header_images/blonde_petit.jpg differ diff --git a/public/header_images/canoe.png b/public/header_images/canoe.png new file mode 100644 index 0000000..9c449a6 Binary files /dev/null and b/public/header_images/canoe.png differ diff --git a/public/header_images/canoe_mini.png b/public/header_images/canoe_mini.png new file mode 100644 index 0000000..048dd37 Binary files /dev/null and b/public/header_images/canoe_mini.png differ diff --git a/public/header_images/canoe_petit.png b/public/header_images/canoe_petit.png new file mode 100644 index 0000000..1d82002 Binary files /dev/null and b/public/header_images/canoe_petit.png differ diff --git a/public/header_images/cavalier.jpg b/public/header_images/cavalier.jpg new file mode 100644 index 0000000..fcf92fe Binary files /dev/null and b/public/header_images/cavalier.jpg differ diff --git a/public/header_images/cavalier_mini.jpg b/public/header_images/cavalier_mini.jpg new file mode 100644 index 0000000..6050c67 Binary files /dev/null and b/public/header_images/cavalier_mini.jpg differ diff --git a/public/header_images/cavalier_petit.jpg b/public/header_images/cavalier_petit.jpg new file mode 100644 index 0000000..7dcf283 Binary files /dev/null and b/public/header_images/cavalier_petit.jpg differ diff --git a/public/header_images/fille_qui_tombe.jpg b/public/header_images/fille_qui_tombe.jpg new file mode 100644 index 0000000..e572287 Binary files /dev/null and b/public/header_images/fille_qui_tombe.jpg differ diff --git a/public/header_images/fille_qui_tombe_mini.jpg b/public/header_images/fille_qui_tombe_mini.jpg new file mode 100644 index 0000000..c8be5ee Binary files /dev/null and b/public/header_images/fille_qui_tombe_mini.jpg differ diff --git a/public/header_images/fille_qui_tombe_petit.jpg b/public/header_images/fille_qui_tombe_petit.jpg new file mode 100644 index 0000000..29b22f3 Binary files /dev/null and b/public/header_images/fille_qui_tombe_petit.jpg differ diff --git a/public/header_images/melaine.png b/public/header_images/melaine.png new file mode 100644 index 0000000..f50aea5 Binary files /dev/null and b/public/header_images/melaine.png differ diff --git a/public/header_images/melaine_mini.png b/public/header_images/melaine_mini.png new file mode 100644 index 0000000..7676a3d Binary files /dev/null and b/public/header_images/melaine_mini.png differ diff --git a/public/header_images/melaine_petit.png b/public/header_images/melaine_petit.png new file mode 100644 index 0000000..9b3ab18 Binary files /dev/null and b/public/header_images/melaine_petit.png differ diff --git a/public/header_images/mouette_ocean.jpg b/public/header_images/mouette_ocean.jpg new file mode 100644 index 0000000..089a9bd Binary files /dev/null and b/public/header_images/mouette_ocean.jpg differ diff --git a/public/header_images/mouette_ocean_mini.jpg b/public/header_images/mouette_ocean_mini.jpg new file mode 100644 index 0000000..42ac620 Binary files /dev/null and b/public/header_images/mouette_ocean_mini.jpg differ diff --git a/public/header_images/mouette_ocean_petit.jpg b/public/header_images/mouette_ocean_petit.jpg new file mode 100644 index 0000000..bf56f20 Binary files /dev/null and b/public/header_images/mouette_ocean_petit.jpg differ diff --git a/public/header_images/sirene.jpg b/public/header_images/sirene.jpg new file mode 100644 index 0000000..aaa1226 Binary files /dev/null and b/public/header_images/sirene.jpg differ diff --git a/public/header_images/sirene_mini.jpg b/public/header_images/sirene_mini.jpg new file mode 100644 index 0000000..028d22c Binary files /dev/null and b/public/header_images/sirene_mini.jpg differ diff --git a/public/header_images/sirene_petit.jpg b/public/header_images/sirene_petit.jpg new file mode 100644 index 0000000..6655514 Binary files /dev/null and b/public/header_images/sirene_petit.jpg differ diff --git a/public/melaine/photo.png b/public/melaine/photo.png deleted file mode 100644 index f50aea5..0000000 Binary files a/public/melaine/photo.png and /dev/null differ diff --git a/public/melaine/photo_mini.png b/public/melaine/photo_mini.png deleted file mode 100644 index 7676a3d..0000000 Binary files a/public/melaine/photo_mini.png and /dev/null differ diff --git a/public/melaine/photo_petit.png b/public/melaine/photo_petit.png deleted file mode 100644 index 9b3ab18..0000000 Binary files a/public/melaine/photo_petit.png and /dev/null differ diff --git a/view/backup.php b/view/backup.php index 9fce805..30b644b 100644 --- a/view/backup.php +++ b/view/backup.php @@ -27,8 +27,9 @@ if(isset($_GET['action']) && $_GET['action'] == 'sauvegarde') ?>

Sauvegarde complète

Toutes les données du sites (textes, photos) ont été rassemblées dans un unique fichier que vous pouvez conserver si vous le souhaitez sur votre ordinateur.

-

Vous pourrez l'utiliser plus tard pour restaurer le site dans l'état où il se trouve aujourd'hui ou pour récupérer des fichiers effacés ou perdus. Ceci est utile dans le cas d'un changement d'hébergement, d'un problème affectant le serveur, ou encore d'une mauvaise manipulation.

-

Ce fichier se nomme .

+

Vous pourrez l'utiliser plus tard pour restaurer le site dans l'état où il se trouve aujourd'hui ou pour récupérer des fichiers effacés ou perdus. Ce fichier sera utile dans le cas d'une migration (déplacement du site, changement d'hébergeur), d'un problème affectant le serveur, ou encore d'une mauvaise manipulation.

+

Veuillez noter que votre mot de passe ne sera pas conservé. Dans le cas d'une migration, il vous sera proposé d'en créer un nouveau.

+

Ce fichier se nomme

@@ -53,7 +54,7 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'restauration') ob_start(); ?>

Restauration des données à partir d'une sauvegarde.

-

Vous devez avoir créé précédemment un fichier melaineDATA.zip
+

Vous devez avoir créé précédemment un fichier melaineDATA
à la page Sauvegarder les données.


@@ -61,10 +62,10 @@ elseif(isset($_GET['action']) && $_GET['action'] == 'restauration') -

- - + +
+ - + - - - - - - - -
-
- Melaine Favennec -
-
-
- -
> -

Rédiger un nouvel article

- -
-

- - Nouvel article - -

- -
-fileListCount; $i++) -{ - // la div invisible sert à la compensation des liens d'ancre # - - // article modifié sur fond coloré - if(isset($fileCode) && $Articles->fileList[$i]['fileCode'] == $fileCode) - { - $style = 'class="articleAvecEditeur"'; - } - else - { - $style = ''; - } -?> -
-
-
> -fileList[$i]['fileCode'] - ) - { - // on pourrait utiliser ici le timedate, ou encore le nom de l'article -?> -

Modification d'un article

-fileList[$i]['content'] . "\n"); - - // bouton - if($_SESSION['admin'] == 1) - { - ?> -

- - Modifier cet article - -   - - Supprimer cet article - -

- -
-
- - + \ No newline at end of file diff --git a/view/pageArticlesSimples.php b/view/pageArticlesSimples.php new file mode 100644 index 0000000..aa755d8 --- /dev/null +++ b/view/pageArticlesSimples.php @@ -0,0 +1,136 @@ + + + + + + + + +
+
+ +
+ +
+ +
> +

Rédiger un nouvel article

+ +
+

+ + Nouvel article + +

+ +
+fileListCount; $i++) +{ + // la div invisible sert à la compensation des liens d'ancre # + + // article modifié sur fond coloré + if(isset($fileCode) && $Articles->fileList[$i]['fileCode'] == $fileCode) + { + $style = 'class="articleAvecEditeur"'; + } + else + { + $style = ''; + } +?> +
+
+
> +fileList[$i]['fileCode'] + ) + { + // on pourrait utiliser ici le timedate, ou encore le nom de l'article +?> +

Modification d'un article

+fileList[$i]['content'] . "\n"); + + // bouton + if($_SESSION['admin'] == 1) + { + ?> +

+ + Modifier cet article + +   + + Supprimer cet article + +

+ +
+
+Mauvais mot de passe

'; +// messages d'erreur +$errorPassword = '

Mauvais mot de passe

'; +$errorBadCharacters = '

Caractères interdits: espaces, tabulations, sauts CR/LF.

'; + +// avertissement +$warning = '

Rappel de sécurité
Vous n\'utilisez pas votre propre ordinateur ou téléphone? Utilisez la navigation privée!

'; // confirmation modification du mot de passe @@ -88,14 +92,6 @@ ob_start(); $message = ob_get_clean(); -// avertissement -ob_start(); -?> -

Rappel de sécurité
Vous n'utilisez pas votre propre ordinateur ou téléphone? Utilisez la navigation privée!

- diff --git a/view/template-formulaires.php b/view/template-formulaires.php index d1d47c4..ede8f27 100644 --- a/view/template-formulaires.php +++ b/view/template-formulaires.php @@ -43,9 +43,9 @@ ob_start(); ?>
-
+ Infos qui seront affichées dans la page spécifique à cet album:

"); } @@ -53,7 +53,7 @@ if($page_actuelle == 'discographie') - + @@ -146,7 +146,7 @@ if($page_actuelle == 'discographie') // - à télécharger immédiatement l'image envoyée pour la placer dans l'éditeur // - à inclure l'adresse de l'image dans le HTML produit par l'éditeur simpleUpload: { - uploadUrl: 'index.php?action=upload_image&page=', + uploadUrl: 'index.php?action=upload_image&page=', // Headers supplémentaires envoyés avec la requête // c'est ici qu'on installe les mécanismes de sécurités comme l'authentification et la protection au CSRF diff --git a/view/template.php b/view/template.php index 4cf0e52..0b084f6 100644 --- a/view/template.php +++ b/view/template.php @@ -45,7 +45,7 @@ echo($content);

Vous êtes en mode administrateur. - +

- - - + diff --git "a/\303\240 faire apr\303\250s livraison.txt" "b/\303\240 faire apr\303\250s livraison.txt" index c151c0d..19b8b01 100644 --- "a/\303\240 faire apr\303\250s livraison.txt" +++ "b/\303\240 faire apr\303\250s livraison.txt" @@ -1,23 +1,34 @@ +liens sans http dans l'éditeur + +captcha dans password.php + +gestion des liens "real media" = un lien pour télécharger VLC + remplacer le survol par un clic sur les smartphones -changer de format de sauvegarde (y a mieux que zip) +fignoler l'affichage petits écrans + +penser aux grands écrans (en l'état, on a 700 pixels de large au maximum) + +ajouter d'autres format de sauvegarde (il parait que zip se fait mieux) tri des albums selon l'année (avec des plages de timestamps?) Identification avec deux codes (login + mot de passe) -pages manquantes - -liens sans http dans l'éditeur - -zoom sur images +Zoom sur images voir ici pour une galerie en css https://www.guyom-design.com/blog/astuces/css/tuto_diapo_css/ -système d'onglets +Explorateur de fichiers pour les images + +pagination (ex: max 10 articles par page) +à voir selon le volume, c'est mieux avec de l'AJAX -onglets AJAX +pagination + AJAX + +système d'onglets avec AJAX: changement de page sans recharger plugin autosave @@ -26,8 +37,7 @@ Editeur "inline" ou "balloon block" Possibilité de regarder une image en grand dans une fenêtre javascript OU au moins dans une "page" dotée d'un bouton pur sortir (avec GD? avec imagemagick?) -Explorateur de fichiers pour les images - +défense aux attaques par force brute quand l'attaquant multiplie les connexions au site Protection contre les falsifications de requête inter-site - CSRF -- cgit v1.2.3