From ccc9a05b758f1dc0313b96807edfc447a9e8d278 Mon Sep 17 00:00:00 2001 From: polo Date: Thu, 8 Feb 2024 04:31:14 +0100 Subject: RGPD cookie uniquement en mode admin et avertissement, logo journal --- controller/ajax.php | 15 +- controller/backup.php | 8 +- controller/ckeditor.php | 7 +- controller/config.php | 4 +- controller/cookies.php | 66 +++++++++ controller/installation.php | 15 +- controller/password.php | 346 ++++++++++++++++++++++++------------------- index.php | 77 +++------- public/css/menu.css | 18 ++- public/file_upload.js | 21 +-- public/newspaper.png | Bin 0 -> 39185 bytes view/album.php | 5 +- view/articlesContent.php | 8 +- view/backup.php | 2 +- view/discographie.php | 45 ++---- view/pageArticlesSimples.php | 6 +- view/password.php | 31 ++-- view/template.php | 4 +- 18 files changed, 364 insertions(+), 314 deletions(-) create mode 100644 controller/cookies.php create mode 100644 public/newspaper.png diff --git a/controller/ajax.php b/controller/ajax.php index 1a4909e..96df9cb 100644 --- a/controller/ajax.php +++ b/controller/ajax.php @@ -4,12 +4,12 @@ // traitement des requêtes AJAX -// -> insertion d'une image dans l'éditeur +// éditeur +// -> insertion d'une image if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image') { // sécurité !! - if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1 - || !isset($_FILES['upload']) || empty($_FILES['upload'])) + if(!isset($_SESSION) || !isset($_FILES['upload']) || empty($_FILES['upload'])) { // sans effet? header('Location: index.php?erreur=image_ajax'); @@ -48,7 +48,7 @@ if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_ if(isset($_GET['action']) && $_GET['action'] == 'restauration' && isset($_GET['file_name']) && isset($_GET['file_size'])) { - if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) + if(!isset($_SESSION)) { header('Location: index.php?erreur=file_infos_ajax'); } @@ -56,8 +56,6 @@ if(isset($_GET['action']) && $_GET['action'] == 'restauration' { $_SESSION['fileSize'] = $_GET['file_size']; $_SESSION['fileName'] = $_GET['file_name']; - //echo("file infos send"); - //var_dump($_SESSION['fileName']); exit(); // stop !! } } @@ -65,8 +63,7 @@ if(isset($_GET['action']) && $_GET['action'] == 'restauration' if(isset($_GET['action']) && $_GET['action'] == 'restauration' && isset($_GET['chunk_name']) && isset($_FILES['blob'])) { - - if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) + if(!isset($_SESSION)) { header('Location: index.php?erreur=upload_ajax'); } @@ -79,7 +76,7 @@ if(isset($_GET['action']) && $_GET['action'] == 'restauration' } } -// nettoyage +// nettoyage systématique if(!isset($_GET['action']) || $_GET['action'] != 'restauration') { if(isset($_SESSION['fileName'])) diff --git a/controller/backup.php b/controller/backup.php index c10ca21..52f300f 100644 --- a/controller/backup.php +++ b/controller/backup.php @@ -10,7 +10,7 @@ function pageSauvegarde($from) $date = date("d-m-Y", time()); $nomFichier = "melaineDATA_" . $date; // ne prendre que les dossiers pour exclure les fichiers password.txt, melaineDATA.zip et melainePHP.zip existant - $dossiersCibles = [ 'data/archives', 'data/musique', 'data/jaime', 'data/presse', 'data/livres', 'data/legal', 'data/discographie', 'data/melaine', 'data/peinture' ]; + $dossiersCibles = [ 'data/menu', 'data/archives', 'data/musique', 'data/jaime', 'data/presse', 'data/livres', 'data/legal', 'data/discographie', 'data/melaine', 'data/peinture' ]; //$fichiersALaRacine = []; createZip($cheminDestination, $nomFichier, $dossiersCibles); @@ -177,7 +177,7 @@ function pageRestauration($from) $message = restoreData($path); } - // variables obtenues en AJAX + // variables crées dans ajax.php if(isset($_SESSION['fileName'])) { unset($_SESSION['fileName']); @@ -206,8 +206,8 @@ function pageRestauration($from) require('view/backup.php'); } -// upload AJAX d'un zip dans file_upload.js -function uploadChunkAndMerge() +// upload AJAX d'un zip en morceaux dans file_upload.js +function uploadChunkAndMerge() // appel dans ajax.php { // $_GET['chunk_name'] n'est pas utilisé pour l'instant diff --git a/controller/ckeditor.php b/controller/ckeditor.php index 1707128..d0c5824 100644 --- a/controller/ckeditor.php +++ b/controller/ckeditor.php @@ -18,8 +18,9 @@ function preparationCKeditor($html) header('Location: index.php?erreur=empty_input'); } - // supprimer espaces, tabulations et sauts de ligne en début et fin de chaine - $html = trim($html); + // sécuriser le HTML + require('controller/Security.php'); + $html = Security::secureString($html); // supprimer les sauts de ligne $sautsDeLigne = array("\n", "\r", "\r\n"); @@ -58,7 +59,7 @@ function getFileCodeFromHTTPReferrer(): string function submitCKeditor() { // déjà fait mais on ne sait jamais - if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) + if(!isset($_SESSION)) { header('Location: index.php?page=' . $_GET['page'] . '&erreur=connexion'); exit(); diff --git a/controller/config.php b/controller/config.php index 6fc7000..804671b 100644 --- a/controller/config.php +++ b/controller/config.php @@ -34,7 +34,7 @@ else echo(''); } -// format dans lequel créer les sauvegardes +// format dans lequel créer les sauvegardes, // zip uniquement pour l'instant if(extension_loaded("zip")) { @@ -48,7 +48,7 @@ else // conversion des 2M du php.ini en 2000000 // note: les kibi, mébi et gibi sont inutiles ici -function returnBytes ($size_str) // chaine du style '2M' +function returnBytes($size_str) // chaine du style '2M' { switch (substr ($size_str, -1)) { diff --git a/controller/cookies.php b/controller/cookies.php new file mode 100644 index 0000000..f5c7e64 --- /dev/null +++ b/controller/cookies.php @@ -0,0 +1,66 @@ + 0, + 'path' => '/', + 'domain' => $_SERVER['HTTP_HOST'], + 'secure' => true, + 'httponly' => true, + 'samesite' => 'strict']); + session_start();*/ + + /*session_start([ + 'cookie_lifetime' => 0, + 'cookie_path' => '/', + 'cookie_domain' => $_SERVER['HTTP_HOST'], + 'cookie_secure' => true, + 'cookie_httponly' => true, + 'cookie_samesite' => 'strict']);*/ + session_start(); + + // le cookie ne semble pas prendre les paramètres! pourquoi? + //var_dump(session_get_cookie_params()); + } + else // cas anormal: session déjà démarrée, mode parano activé! + { + deleteCookie($cookie); + header("Location: index.php"); + exit(); + } +} + +// erreurs affichées au rechargement (lesquelles déjà?) +if(isset($_SESSION['erreur']) && !empty($_SESSION['erreur'])) +{ + echo(''); + unset($_SESSION['erreur']); +} + + +function deleteCookie(string $name) +{ + unset($_COOKIE[$name]); // utile? + setcookie($name, '', time() - 4200, '/'); // suppression + + // cookie supprimé au prochain chargement de la page + // forcer un rechargement pour effet immédiat + //header("Location: index.php"); + //exit(); +} diff --git a/controller/installation.php b/controller/installation.php index f0d2890..90dcd28 100644 --- a/controller/installation.php +++ b/controller/installation.php @@ -1,5 +1,7 @@ caractères HTML dangereux supprimés + // -> empêche validation par erreur d'une chaine "vide" + require('controller/Security.php'); + $password = Security::secureString($_POST['motdepasse']); + $password = removeSpacesTabsCRLF($_POST['motdepasse']); + + // enregistrement et redirection + if(isset($password) && $password == $_POST['motdepasse']) + { + hashNewPassword($_POST['motdepasse']); + header('Location: index.php'); + exit(); + } + else + { + $error = 'bad_password'; + } } } - // saisie non valide - elseif(isset($_POST['captcha']) && controlCaptchaInput() == 0) - { - sleep(1); - echo($header); - echo($errorNonValidCaptcha); - echo($formulaireNouveauMDP); - echo($errorBadCharacters); - } - // mauvais captcha - elseif(isset($_POST['captcha']) && (int) $_POST['captcha'] != $_SESSION['captcha']) + else // première fois + {} + + // inséré dans $captchaHtml puis dans $formulaireNouveauMDP + $captcha = createCaptcha(); + // enregistrement de la réponse du captcha pour vérification + saveSolutionCaptcha($captcha[2]); + + + // II - affichage + $title = 'Bienvenue Melaine Favennec'; + $subHeading = 'Veuillez choisir le mot de passe que vous utiliserez pour gérer le site.'; + + // même vue que la fonction changerMotDePasse() + require('view/password.php'); + + echo($header); + if($error != '') { sleep(1); - echo($header); - echo($errorCaptcha); - echo($formulaireNouveauMDP); - echo($errorBadCharacters); - } - // 1ère fois - else - { - echo($header); - echo($formulaireNouveauMDP); - echo($errorBadCharacters); - //echo($warning); // message pas top + echo($error_messages[$error]); } + echo($formulaireNouveauMDP); + echo($error_messages['forbidden_characters']); echo($footer); - - // fois suivante (dispense de nettoyer la variable) - $_SESSION['captcha'] = $captcha[2]; - exit(); } function connect() { + // I - traitement // déjà en mode admin - if($_SESSION['admin'] == 1) + global $cookie; // nom du cookie dans cookies.php + if(isset($_COOKIE[$cookie])) { - header('Location: index.php?page=' . $_GET['from']); - exit(); + header('Location: index.php?page=' . $_GET['from']); + exit(); } - // Ajouter une sécurité par cpatcha avec un "input" supplémentaire + // contrôle de la saisie + $file_name = 'data/tmp/solution.txt'; + $error = ''; + if(file_exists($file_name)) + { + $captcha_solution = file_get_contents($file_name); + unlink($file_name); + + if(empty($_POST)) // page rechargée + {} + elseif(!isset($_POST['captcha']) || controlCaptchaInput() == 0) + { + $error = 'error_non_valid_captcha'; + } + elseif($_POST['captcha'] != $captcha_solution) + { + $error = 'bad_solution_captcha'; + } + elseif(!isset($_POST['motdepasse']) || empty($_POST['motdepasse'])) + { + $error = 'bad_password'; + } + else + { + // enregistrement et redirection + if(testPassword($_POST["motdepasse"])) + { + session_name($cookie); + session_start(); + header('Location: index.php?page=' . $_GET['from']); + exit(); + } + else + { + $error = 'bad_password'; + } + } + } + else // première fois + {} + + // inséré dans $captchaHtml puis dans $formulaireNouveauMDP $captcha = createCaptcha(); - // Et créer une variable de session pour la réponse au CAPTCHA + // enregistrement de la réponse du captcha pour vérification + saveSolutionCaptcha($captcha[2]); + + // II - affichage $title = "Connexion"; $subHeading = "Veuillez saisir votre mot de passe pour pouvoir apporter des modifications au site."; - - // cette page utilise la même vue que la fonction changerMotDePasse() dans controller/admin.php + // même vue que la fonction changerMotDePasse() require('view/password.php'); echo($header); - - // bon codes (mot de passe et captcha) - if(isset ($_POST["motdepasse"]) && testPassword($_POST["motdepasse"]) && isset($_POST['captcha']) && (int) $_POST['captcha'] == $_SESSION['captcha']) - { - $_SESSION['admin'] = 1; - unset($_SESSION['captcha']); // nettoyage - header('Location: index.php?page=' . $_GET['from']); - exit(); - } - // saisie non valide - elseif(isset($_POST['captcha']) && controlCaptchaInput() == 0) - { - echo($errorNonValidCaptcha); - sleep(1); - echo($formulaireConnexion); - } - // mauvais captcha - elseif(isset($_POST['captcha']) && (int) $_POST['captcha'] != $_SESSION['captcha']) + //echo($warning_messages['message_disconnect']); + if($error != '') { - echo($errorCaptcha); sleep(1); - echo($formulaireConnexion); + echo($error_messages[$error]); } + echo($formulaireConnexion); + echo($warning_messages['message_cookie']); + echo($warning_messages['private_browsing']); + echo($footer); +} - // mauvais codes - elseif(isset ($_POST["motdepasse"]) && !testPassword($_POST["motdepasse"])) - { - // défense aux attaques par force brute - // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site - echo($errorPassword); - sleep(1); - echo($formulaireConnexion); - } - // première arrivée sur la page - else - { - echo($formulaireConnexion); - } - - // fois suivante (dispense de nettoyer la variable) - $_SESSION['captcha'] = $captcha[2]; - - echo($messageDeconnect); - echo($footer); +function saveSolutionCaptcha(string $solution) +{ + $file_name = 'data/tmp/solution.txt'; + if(!file_exists($file_name)) + { + touch($file_name); + chmod($file_name, 0600); + } + file_put_contents($file_name, $solution); } + function changePassword() { + // I - traitement // vérification supplémentaire - if($_SESSION['admin'] !== 1) + global $cookie; // nom du cookie dans cookies.php + if(!isset($_SESSION)) { - $_SESSION['admin'] = 0; + deleteCookie($cookie); header('Location: index.php?page=' . $_GET['from']); exit(); } - $title = "Nouveau mot de passe"; - $subHeading = "Veuillez saisir votre actuel mot de passe suivi du nouveau."; - - require('view/password.php'); - echo($header); - - // conformité du nouveau mot de passe - if(isset($_POST['nouveauMotdepasse']) && !empty($_POST['nouveauMotdepasse'])) + // contrôle de la saisie + $error = ''; + $success = false; + if(empty($_POST)) // première fois ou page rechargée + {} + elseif(!isset($_POST['nouveauMotdepasse']) || empty($_POST['nouveauMotdepasse'])|| !isset($_POST['ancienMotdepasse']) || empty($_POST['ancienMotdepasse'])) + { + $error = 'bad_password'; + } + else { require('controller/Security.php'); $newPassword = Security::secureString($_POST['nouveauMotdepasse']); $newPassword = removeSpacesTabsCRLF($_POST['nouveauMotdepasse']); - } - // bon mot de passe - if(isset($newPassword) && $newPassword === $_POST['nouveauMotdepasse'] - && isset ($_POST["ancienMotdepasse"]) && testPassword($_POST["ancienMotdepasse"])) - { - // enregistrement et confirmation - hashNewPassword($_POST["nouveauMotdepasse"]); - echo($message); + if(isset($newPassword) && $newPassword !== $_POST['nouveauMotdepasse']) // erreur de conformité + { + $error = 'forbidden_characters'; + } + else + { + if(testPassword($_POST["ancienMotdepasse"])) + { + // enregistrement et confirmation + hashNewPassword($_POST["nouveauMotdepasse"]); + $success = true; + } + else + { + $error = 'bad_password'; + } + } } - // mauvais mot de passe - elseif(isset ($_POST["ancienMotdepasse"]) && !testPassword($_POST["ancienMotdepasse"])) + + + // II - affichage + $title = "Nouveau mot de passe"; + $subHeading = "Veuillez saisir votre actuel mot de passe suivi du nouveau."; + + require('view/password.php'); + + echo($header); + if($error != '') { - // défense aux attaques par force brute - // pas parfait, ne marche pas si l'attaquant multiplie les connexions au site - echo($errorPassword); sleep(1); - echo($formulaireModifMDP); + echo($error_messages[$error]); } - // erreur de conformité - elseif(isset($newPassword) && $newPassword !== $_POST['nouveauMotdepasse']) + elseif($success) { - echo($errorBadCharacters); - echo($formulaireModifMDP); + echo($alertJSNewPassword); } - // première arrivée sur la page - else - { - echo($formulaireModifMDP); - } - - //echo($warning); + echo($formulaireModifMDP); echo($footer); } -// hachage function hashNewPassword(string $newPassword) { - // "réparation" des espaces accidentels - $newPassword= trim($newPassword); // hachage $newHashedPassword = password_hash($newPassword, PASSWORD_DEFAULT); @@ -306,14 +347,9 @@ function hashNewPassword(string $newPassword) function testPassword(string $password): bool { - // lecture - $oldHashedPassword = file_get_contents('data/password.txt'); - - // "réparation" des espaces accidentels - $password= trim($password); - $oldHashedPassword = trim($oldHashedPassword); + $hashedPassword = file_get_contents('data/password.txt'); - if(password_verify($password, $oldHashedPassword)) + if(password_verify($password, $hashedPassword)) { return true; } diff --git a/index.php b/index.php index 2d86f58..182f931 100644 --- a/index.php +++ b/index.php @@ -5,33 +5,19 @@ // 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(''); - unset($_SESSION['erreur']); -} - -// variables globales, dépendances et config par l'utilisateur +require('controller/cookies.php'); require('controller/config.php'); - -// -> présence du data/password.txt? require('controller/password.php'); - -// au premier démarrage du site (création du dossier "data") require('controller/installation.php'); installation(); + // traitement des requêtes AJAX, execute exit() à la fin require('controller/ajax.php'); - // traitement des POST du ckeditor -// la fonction submitCKeditor est "autonome", elle n'affiche rien puis redirige sans GET -if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 - && isset($_GET['action']) && $_GET['action'] == 'submit' +if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'submit' // trois possibilités: on a un contenu HTML ou JSON ou les deux && ((isset($_POST['contenu']) && $_POST['contenu'] != '') || (isset($_POST['titre']) && isset($_POST['annee'])))) @@ -45,23 +31,20 @@ if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 require('model/Album.php'); } + // fonction "autonome", n'affiche rien puis redirige submitCKeditor(); } // déconnexion -if(isset($_GET['action']) && isset($_GET['page'])) +if(isset($_GET['action']) && isset($_GET['page']) && isset($_GET['action']) && $_GET['action'] === "deconnexion") { - if($_GET['action'] == "deconnexion") - { - // on nettoie et on recharge - $_SESSION['admin'] = 0; - header('Location: index.php?page=' . $_GET['page']); - } + deleteCookie($cookie); + header("Location: index.php?page=" . $_GET['page']); + exit(); } - // modèle if(isset($_GET['page'])) // utile? { @@ -72,24 +55,16 @@ if(isset($_GET['page'])) // utile? } } - - // contrôleurs // mode visiteur (sans l'éditeur) require('controller/visitor.php'); // contrôleur des pages en mode admin -if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1) +if(isset($_SESSION)) { // contrôleur en mode admin (= lecture/écriture) require('controller/admin.php'); } -else -{ - // initialisation - $_SESSION['admin'] = 0; -} - // traitements des GET (page du site et action souhaitée) @@ -102,11 +77,6 @@ if(isset($_GET['page'])) { accueil(); } - // page menu - /*elseif($_GET['page'] == 'menu') - { - menu(); - }*/ // pages avec articles simples elseif(in_array($_GET['page'], $pagesArticlesSimples)) { @@ -120,7 +90,7 @@ if(isset($_GET['page'])) // avec plusieurs utilisateurs, il faut plus de sécurités // rédaction - if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor') + if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'editor') { // modification if(isset($_GET['file_code']) || !empty($_GET['file_code'])) @@ -134,7 +104,7 @@ if(isset($_GET['page'])) } } // modification d'un positions.json (version sans JS) - else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'monter') + elseif(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'monter') { if(isset($_GET['file_code']) && !empty($_GET['file_code'])) { @@ -147,7 +117,7 @@ if(isset($_GET['page'])) $fonctionVisitor(); } } - else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'descendre') + elseif(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'descendre') { if(isset($_GET['file_code']) && !empty($_GET['file_code'])) { @@ -161,7 +131,7 @@ if(isset($_GET['page'])) } } // suppression - else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') + elseif(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'suppression') { $fonctionEdit($_GET['file_code'], 1); } @@ -176,7 +146,7 @@ if(isset($_GET['page'])) elseif($_GET['page'] === 'discographie') { // nouvel album - if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition') + if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'edition') { if(!isset($_GET['file_code']) || empty($_GET['file_code'])) { @@ -191,7 +161,7 @@ if(isset($_GET['page'])) } } // modification d'un positions.json (version sans JS) - elseif($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] === 'monter') + elseif(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] === 'monter') { if(isset($_GET['file_code']) && !empty($_GET['file_code'])) { @@ -204,7 +174,7 @@ if(isset($_GET['page'])) discoVisitor(); } } - elseif($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] === 'descendre') + elseif(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] === 'descendre') { if(isset($_GET['file_code']) && !empty($_GET['file_code'])) { @@ -218,7 +188,7 @@ if(isset($_GET['page'])) } } // suppression - else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') + else if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'suppression') { if(isset($_GET['file_code']) && !empty($_GET['file_code'])) { @@ -243,18 +213,13 @@ if(isset($_GET['page'])) header('Location: index.php?page=discographie'); } - if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'edition') + if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'edition') { // modification if(isset($_GET['file_code']) || !empty($_GET['file_code'])) { albumEdit($_GET['file_code'], 0); } - // suppression - else if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'suppression') - { - albumEdit($_GET['file_code'], 1); - } // on fait rien else { @@ -285,9 +250,9 @@ if(isset($_GET['page'])) // actions en mode admin depuis le menu orange // recharger une des pages principales -elseif($_SESSION['admin'] == 1 && isset($_GET['action'])) +elseif(isset($_SESSION) && isset($_GET['action'])) { - if($_GET['action'] == 'modif_mdp') + if($_GET['action'] === 'modif_mdp') { changePassword(); } @@ -314,7 +279,7 @@ elseif($_SESSION['admin'] == 1 && isset($_GET['action'])) // à supprimer, on utilisera plutôt une variable de session // renvoi ici par le .htaccess si lien mort ou sans http:// au début -elseif(isset($_GET['erreur'])) +elseif(isset($_SESSION['erreur'])) { //if($_GET['erreur'] == 404) //{ diff --git a/public/css/menu.css b/public/css/menu.css index 957f6a5..cbafa00 100644 --- a/public/css/menu.css +++ b/public/css/menu.css @@ -21,7 +21,9 @@ .sectionActu { - float: left; + /*float: left;*/ + display: flex; + /*justify-content: space-between;*/ } header h3 @@ -32,9 +34,13 @@ header h3 /*.articleActu > *:not(.boutonArticle)*/ .articleActu { - /*max-width: 50%;*/ + max-width: 80%; margin: auto; } +.articleActu p +{ + margin: 5px 0; +} #contenu { @@ -78,10 +84,10 @@ header h3 background-image: url("../mouette.png"); } - .articleActu + /*.articleActu { - max-width: 50%; - } + max-width: 80%; + }*/ #contenu { @@ -185,7 +191,7 @@ header h3 .articleActu { - max-width: 65%; + max-width: 85%; } #contenu diff --git a/public/file_upload.js b/public/file_upload.js index 4102828..c24b798 100644 --- a/public/file_upload.js +++ b/public/file_upload.js @@ -1,21 +1,7 @@ // public/file_upload.js - +// // envoie d'un gros fichier ZIP en contournant la limite du php.ini -// ce fichier est "caché", le serveur ne l'envoit qu'à -// un utilisateur connecté et sur la page "restauration" - -// retirer antislash dans le nom à l'upload d'une image -/*function filtrerAntislash() -{ - var fileInfos = getFileInfo('upload'); // = ID - var chaine = fileInfos.name.replace('\\', '_'); - alert(document.getElementById('upload').files[0].name); - - // ne marche pas, "name" est en lecture seule - document.getElementById('upload').files[0].name = chaine; - alert(document.getElementById('upload').files[0].name); - //return chaine; -}*/ +// ce fichier est "caché", il n'est envoyé qu'à un utilisateur connecté et sur la page "restauration" // -> input file onchange function sendFileSize() @@ -106,8 +92,7 @@ function uploadChunksAJAX(chunksArray, tagId) formData.append('blob', chunksArray[i]); url = 'index.php?from=menu&action=restauration&chunk_name='+fileName+'_'+i; - // false => synchrone, déprécié parce que fige le navigateur - // mais ici on s'en fout + // false => synchrone, déprécié parce que fige le navigateur, mais ici on s'en fout xhr.open("POST", url, false); xhr.send(formData); diff --git a/public/newspaper.png b/public/newspaper.png new file mode 100644 index 0000000..3945471 Binary files /dev/null and b/public/newspaper.png differ diff --git a/view/album.php b/view/album.php index 28b1b13..6fcca36 100644 --- a/view/album.php +++ b/view/album.php @@ -64,8 +64,7 @@ for($i = 0; $i < $Albums->fileListCount; $i++) @@ -95,7 +94,7 @@ else diff --git a/view/articlesContent.php b/view/articlesContent.php index 7abc289..8ec7f70 100644 --- a/view/articlesContent.php +++ b/view/articlesContent.php @@ -3,7 +3,7 @@ // tampon pour $articlesContent ob_start(); -if($_SESSION['admin'] == 1) +if(isset($_SESSION)) { // à la place du bouton après rechargement if(isset($_GET['action']) && $_GET['action'] == 'editor' && !isset($_GET['file_code'])) @@ -64,7 +64,7 @@ for($i = 0; $i < $Articles->fileListCount; $i++) global $host; // remplacer un article par l'éditeur - if($_SESSION['admin'] == 1 && isset($_GET['action']) && $_GET['action'] == 'editor' && isset($_GET['file_code']) + if(isset($_SESSION) && isset($_GET['action']) && $_GET['action'] == 'editor' && isset($_GET['file_code']) && $_GET['file_code'] == $Articles->fileList[$i]['fileCode'] ) { @@ -85,14 +85,14 @@ for($i = 0; $i < $Articles->fileListCount; $i++) echo($Articles->fileList[$i]['content'] . "\n"); ?> -

+

bouton diff --git a/view/backup.php b/view/backup.php index 8461543..78e2d04 100644 --- a/view/backup.php +++ b/view/backup.php @@ -28,7 +28,7 @@ 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. 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.

+

Veuillez noter que votre mot de passe n'est pas inclu dans la sauvegarde. Dans le cas d'une migration, il vous sera proposé d'en créer un nouveau.

Ce fichier se nomme

diff --git a/view/discographie.php b/view/discographie.php index 6e560af..84358db 100644 --- a/view/discographie.php +++ b/view/discographie.php @@ -66,7 +66,7 @@ for($i = 0; $i < $Albums->fileListCount; $i++)
fileListCount - 1; $i >= 0; $i--) for($i = 0; $i < $Albums->fileListCount; $i++) { - // article modifié sur fond coloré - if(isset($fileCode) && $Albums->fileList[$i]['fileCode'] == $fileCode) - { - $style = 'class="articleAvecEditeur"'; - } - else - { - $style = 'class="articleSansEditeur"'; - } ?> -
> + diff --git a/view/pageArticlesSimples.php b/view/pageArticlesSimples.php index 8758373..d282964 100644 --- a/view/pageArticlesSimples.php +++ b/view/pageArticlesSimples.php @@ -66,8 +66,10 @@ echo "\n"; if($page == 'menu' && !empty($ArticlesContent)) { ?> -
-

Actualité

+
+
+ +
diff --git a/view/password.php b/view/password.php index 6302950..ae153b5 100644 --- a/view/password.php +++ b/view/password.php @@ -47,7 +47,6 @@ ob_start(); $formulaireNouveauMDP = ob_get_clean(); // formulaire changement de mot de passe -// vérification de l'ancien et choix du nouveau à taper deux fois dont une à l'aveugle ob_start(); ?>
@@ -64,7 +63,6 @@ ob_start(); @@ -91,15 +89,20 @@ ob_start(); $header = ob_get_clean(); -// messages d'erreur -$errorPassword = '

Mauvais mot de passe

'; -$errorNonValidCaptcha = '

Captcha non valide, veuillez saisir un nombre entier.

'; -$errorCaptcha = '

Erreur au test anti-robot

'; -$errorBadCharacters = '

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

'; -$messageDeconnect = "

N'oubliez de cliquer sur 'déconnexion' quand vous aurez fini.

"; +$error_messages = [ + 'error_non_valid_captcha' => '

Erreur au test anti-robot, veuillez saisir un nombre entier.

', + 'bad_solution_captcha' => '

Erreur au test anti-robot, veuillez réessayer.

', + 'bad_password' => '

Mauvais mot de passe, veuillez réessayer.

', + 'forbidden_characters' => '

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!

'; +$warning_messages = [ + 'message_disconnect' => "

N'oubliez de cliquer sur 'déconnexion' quand vous aurez fini.

", + 'message_cookie' => "

Ce site utilisera un cookie « obligatoire » dès que vous serez connecté.
Il sera supprimé à votre déconnexion ou dès que vous aurez quitté le site.

", + //   est un espace insécable + 'private_browsing' =>"

Au fait? Vous n'utilisez pas votre propre ordinateur ou téléphone?
+ Utilisez la navigation privée.

" +]; // confirmation modification du mot de passe @@ -111,16 +114,20 @@ ob_start(); Retour au site.

- +

diff --git a/view/template.php b/view/template.php index 2a4d182..dfe68bd 100644 --- a/view/template.php +++ b/view/template.php @@ -53,7 +53,7 @@ if($page != "accueil") } // lien vers le mode admin -if($_SESSION['admin'] == 0 && isset($_GET['page']) && $_GET['page'] != 'accueil') +if(!isset($_SESSION) && isset($_GET['page']) && $_GET['page'] != 'accueil') { ?>
@@ -63,7 +63,7 @@ if($_SESSION['admin'] == 0 && isset($_GET['page']) && $_GET['page'] != 'accueil' } // actions en mode admin -if($_SESSION['admin'] == 1) +if(isset($_SESSION)) { ?> -- cgit v1.2.3