From ed5df18ed28a338ecd763e6492991ccbf5e23eb0 Mon Sep 17 00:00:00 2001 From: polo Date: Wed, 6 Jul 2022 01:59:48 +0200 Subject: rangement du code --- .htaccess | 8 +--- controller/ajax.php | 60 +++++++++++++++++++++++++++++ controller/backup.php | 2 + controller/config.php | 63 +++++++++++++++++++++++++++++++ controller/installation.php | 92 ++++++++++++++++++--------------------------- controller/password.php | 3 +- dependances.php | 67 --------------------------------- erreur404.php | 11 ++---- index.php | 68 ++++----------------------------- model/Album.php | 8 ++-- model/Image.php | 30 +++++++-------- 11 files changed, 195 insertions(+), 217 deletions(-) create mode 100644 controller/ajax.php create mode 100644 controller/config.php delete mode 100644 dependances.php diff --git a/.htaccess b/.htaccess index 72d17a4..aaae3a8 100644 --- a/.htaccess +++ b/.htaccess @@ -1,12 +1,8 @@ # redirection en cas d'erreur 404 +# ne décocher qu'une seule ligne "ErrorDocument" # site simple #ErrorDocument 404 http://localhost/melaine/erreur404.php # site "hôte virtuel" (cas des hébergeurs et d'une debian par défaut) -ErrorDocument 404 http://melaine.localhost/erreur404.php -#ErrorDocument 404 "retour au site" - -# Interdire l'exploration des répertoires -# mettre un .htaccess avec cette ligne dans chacun des dossiers à la racine -# Options -Indexes +ErrorDocument 404 /erreur404.php diff --git a/controller/ajax.php b/controller/ajax.php new file mode 100644 index 0000000..489e814 --- /dev/null +++ b/controller/ajax.php @@ -0,0 +1,60 @@ + insertion d'une image dans l'éditeur +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'])) + { + // sans effet? + header('Location: index.php?erreur=image_ajax'); + } + else + { + require('model/Image.php'); + // paramètre "true" parce qu'on reçoit une requête AJAX + $Image = new Image(true); + $Image->upload(); + echo($Image->reponseAjax); // attendu par l'éditeur + } + exit; // stop !! +} + +// page restauration quand le fichier zip est lourd +// -> input file onchange +if(isset($_GET['action']) && $_GET['action'] == 'restauration' + && isset($_GET['file_name']) && isset($_GET['file_size'])) +{ + if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) + { + header('Location: index.php?erreur=file_infos_ajax'); + } + else + { + $_SESSION['fileSize'] = $_GET['file_size']; + $_SESSION['fileName'] = $_GET['file_name']; + //echo("file infos send"); + var_dump($_SESSION['fileName']); + exit(); // stop !! + } +} +// -> input submit onclick +if(isset($_GET['action']) && $_GET['action'] == 'restauration' + && isset($_GET['chunk_name']) && isset($_FILES['blob'])) +{ + + if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) + { + header('Location: index.php?erreur=upload_ajax'); + } + else + { + require('controller/backup.php'); + uploadChunkAndMerge(); + echo('file send'); + exit(); // stop !! + } +} \ No newline at end of file diff --git a/controller/backup.php b/controller/backup.php index 62f08a1..014a6cb 100644 --- a/controller/backup.php +++ b/controller/backup.php @@ -156,10 +156,12 @@ function restoreData($path) return($message); } + function pageRestauration($from) { $title = 'Restauration des données'; $message = ''; + // taille max des fichiers dans le php.ini (défaut = 2M) global $maxWeight; // recharger la même page en écrivant les données diff --git a/controller/config.php b/controller/config.php new file mode 100644 index 0000000..47b85f9 --- /dev/null +++ b/controller/config.php @@ -0,0 +1,63 @@ + vérifier la disponibilité des extensions PHP +// => obtenir des variables globales +// => permettre une configuration à la main par l'utilisateur + + +// mode de stockage des données, écrire 'files' ou 'database' +$storage = 'files'; +// laisser 'files'!! +// l'utilisation d'une BDD n'est pas prévue pour l'instant + +// Racine du site (inutile pour l'instant) +//$root = getcwd(); + +// nom de domaine (inutile pour l'instant) +//$host = $_SERVER['HTTP_HOST']; + +// bibliothèque utilisée pour créer les miniatures +if(extension_loaded("imagick")) // on préfère imagemagick +{ + $imageLibrary = 'imagick'; +} +elseif(extension_loaded('gd')) +{ + $imageLibrary = 'gd'; +} +else +{ + echo(''); +} + +// format dans lequel créer les sauvegardes +// zip uniquement pour l'instant +if(extension_loaded("zip")) +{ + $archiveFormat = 'zip'; +} +else +{ + echo(''); +} + + +// conversion des 2M du php.ini en 2000000 +// les kibi, mébi et gibi sont inutiles ici +function returnBytes ($size_str) // chaine du style '2M' +{ + switch (substr ($size_str, -1)) + { + case 'Ki': case 'ki': return (int)$size_str * 1024; + case 'Mi': case 'mi': return (int)$size_str * 1048576; + case 'Gi': case 'gi': return (int)$size_str * 1073741824; + case 'K': case 'k': return (int)$size_str * 1000; + case 'M': case 'm': return (int)$size_str * 1000000; + case 'G': case 'g': return (int)$size_str * 1000000000; + default: return $size_str; + } +} +// taille max des fichiers dans le php.ini (défaut = 2M) +$maxWeight = returnBytes(ini_get('upload_max_filesize')); diff --git a/controller/installation.php b/controller/installation.php index 1c90026..b2a687c 100644 --- a/controller/installation.php +++ b/controller/installation.php @@ -1,54 +1,36 @@ '); - //echo('server name: ' . $_SERVER['SERVER_NAME'] . '
'); - // echo('dirname: ' . dirname(__FILE__) . '
'); - // echo('file: ' . __FILE__ . '
'); - // echo('dir: ' . __DIR__. '
'); - - //$lien_htaccess = $_SERVER['SERVER_NAME'] . "/.htaccess"; - //$nomDuSite = "melaine"; - - // créer le .htaccess + // présence du .htaccess if(!file_exists(".htaccess")) { - echo('

Le .htaccess semble absent ce qui rend le site vulnérable, 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 = "ErrorDocument 404 /erreur404.php"; + + echo('

Le .htaccess est absent.
+ Si vous ne savez pas de quoi il s\'agit, contactez le responsable du site.
+ Sinon, veuillez créer un fichier nommé .htaccess à la racine du site et y copier-coller la ligne suivante:

+ ' . $contenu . '

'); + + // Pour le créer + // laisser commenté, la création risque d'échouer // $fichier = fopen('.htaccess', 'w'); // fputs($fichier, $contenu); // fclose($fichier); // chmod('.htaccess', 0666); // mettre 0644 en production } - // droits en lecture et écriture dans le cas d'une migration - // tester si le site est "vide" et prévoir un formulaire permettant d'upload le fichier .zip - // contenant toutes les données qu'il est possible de créer depuis le mode admin - // cette méthode a deux intérêts: - // - facilité pour l'utilisateur - // - toutes les données sont la "possession" du serveur apache, - // on prévient ainsi tous les futurs problèmes de droits - - // dans le cas de l'utilisation d'une base de données, le fichiers zip devrait contenir un "dump" - // (un fichier .sql), à voir si php est capable d'obtenir ou redonner ce fichier à la BDD + + // dans le cas de l'utilisation d'une base de données, le fichiers zip devrait contenir un "dump" (un fichier .sql), + // à voir si php est capable d'obtenir ou redonner ce fichier à la BDD - // créer les dossiers (fait également à l'extraction du zip de données) - // attention: ne fonctionne pas sans une manipulation préalable - // - modifier soit-même les droits du dossier data pour 777 - // - 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 // création des dossiers + // attention: ne fonctionne pas sans une manipulation préalable + // - créer le dossier data à la racine du site + // - lui donner les droits du dossier data pour 777 // valeur en octal $droitsDossiers = 0777; // mettre 0755 en production @@ -61,22 +43,13 @@ function installation() require('view/backup.php'); exit(); } - if(!touch('data')) + if(!touch('data')) // test autorisation en écriture { $erreur = 'data'; $title = 'Écriture non autorisée dans le dossier data'; require('view/backup.php'); exit(); } - - function createIndexPHP($path, $droitsFichiers) - { - $content = "alert(\'Erreur: Une de ces extensions de PHP est nécessaire: imagemagick ou GD. Veuillez activer une des deux dans le fichier php.ini ou installer le paquet php-imagick ou php-gd.\');'); -} - -// format des sauvegardes à la création -if(extension_loaded("zip")) -{ - $archiveFormat = 'zip'; -} -else -{ - echo(''); -} - - -// bout de code à déplacer dans controller/backup.php -// taille max des fichiers dans le php.ini (défaut = 2M) -$maxWeight = ini_get('upload_max_filesize'); - -// on utilisera cette valeur dans "main.js" pour envoyer -// les fichiers un par un quand un zip est trop grand - -// conversion des mégas en octets -function return_bytes ($size_str) -{ - switch (substr ($size_str, -1)) - { - case 'M': case 'm': return (int)$size_str * 1048576; - case 'K': case 'k': return (int)$size_str * 1024; - case 'G': case 'g': return (int)$size_str * 1073741824; - default: return $size_str; - } -} -$maxWeight = return_bytes(ini_get('upload_max_filesize')); diff --git a/erreur404.php b/erreur404.php index 3059e70..e8fc033 100644 --- a/erreur404.php +++ b/erreur404.php @@ -1,13 +1,9 @@ javascript:window.close()'; +// les erreurs 404 sont renvoyées ici par le .htaccess +header('Location: http://' . $_SERVER['HTTP_HOST'] . '/index.php?erreur=404'); -// Le fichier .htaccess est situé dans le répertoire racine du site (et non du serveur), il comporte cette ligne: -// ErrorDocument 404 /siteweb/erreur404.php -// en cas d'erreur 404, le serveur apache renverra le visiteur vers ce fichier (erreur404.php) -// // ATTENTION depuis apache en version 2.4 le .htaccess est ignoré par défaut, il y a deux méthodes pour y remedier: // - méthode facile et moins sécurisée: trouver la ligne "AllowOverride None" dans le fichier de conf d'apache et changer "None" par "All" // - méthode sécurisée consistant à autoriser uniquement la directive ErrorDocument pour notre site, @@ -21,4 +17,3 @@ header('Location: index.php?erreur=404'); // identifier l'adresse qui a provoqué l'erreur // $_SERVER['REQUEST_URI'] // https://www.developpez.net/forums/d107096/php/langage/recuperer-url-erreur-404-a/ - diff --git a/index.php b/index.php index ac3910b..7cef980 100644 --- a/index.php +++ b/index.php @@ -14,72 +14,20 @@ if(!empty($_SESSION['erreur'])) unset($_SESSION['erreur']); } -// fichier destiné à l'utilisateur -require('dependances.php'); +// variables globales, dépendances et config par l'utilisateur +require('controller/config.php'); -// au premier démarrage du site -// l'explication des éventuels problèmes de droits en lecture/écriture est à chercher ici: +// au premier démarrage du site (création du dossier "data") require('controller/installation.php'); + +// penser à faire qu'on ne l'ouvre pas tout le temps +// -> présence du data/password.txt? require('controller/password.php'); -installation(); +installation(); // traitement des requêtes AJAX -// -> insertion d'une image dans l'éditeur -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'])) - { - // sans effet? - header('Location: index.php?erreur=image_ajax'); - } - else - { - require('model/Image.php'); - // paramètre "true" parce qu'on reçoit une requête AJAX - $Image = new Image(true); - $Image->upload(); - echo($Image->reponseAjax); // attendu par l'éditeur - } - exit; // stop !! -} -// page restauration quand le fichier zip est lourd -// -> input file onchange -if(isset($_GET['action']) && $_GET['action'] == 'restauration' - && isset($_GET['file_name']) && isset($_GET['file_size'])) -{ - if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) - { - header('Location: index.php?erreur=file_infos_ajax'); - } - else - { - $_SESSION['fileSize'] = $_GET['file_size']; - $_SESSION['fileName'] = $_GET['file_name']; - //echo("file infos send"); - var_dump($_SESSION['fileName']); - exit(); // stop !! - } -} -// -> input submit onclick -if(isset($_GET['action']) && $_GET['action'] == 'restauration' - && isset($_GET['chunk_name']) && isset($_FILES['blob'])) -{ - - if(!isset($_SESSION['admin']) || $_SESSION['admin'] != 1) - { - header('Location: index.php?erreur=upload_ajax'); - } - else - { - require('controller/backup.php'); - uploadChunkAndMerge(); - echo('file send'); - exit(); // stop !! - } -} +require('controller/ajax.php'); // traitement des POST du ckeditor // la fonction submitCKeditor est "autonome", elle n'affiche rien puis redirige sans GET diff --git a/model/Album.php b/model/Album.php index 3f13939..95dac50 100644 --- a/model/Album.php +++ b/model/Album.php @@ -51,7 +51,7 @@ class Album extends Article require('model/Image.php'); $Image = new Image(false); $Image->upload(); - $Image->makeThumbnail(); + $Image->makeThumbnail(201); $erreur = $Image->erreur; if(!empty($erreur)) @@ -181,7 +181,7 @@ class Album extends Article require('model/Image.php'); $Image = new Image(false); $Image->upload(); - $Image->makeThumbnail(); + $Image->makeThumbnail(201); $erreur = $Image->erreur; if(!empty($erreur)) { @@ -205,12 +205,12 @@ class Album extends Article // delete public function delete() { - parent::delete(); + parent::delete(); // json if(file_exists('data/' . $this->page . '/html/' . $this->fileCode . '.' . $this->format)); { $this->format = 'html'; - parent::delete(); + parent::delete(); // html } } } diff --git a/model/Image.php b/model/Image.php index 05773e9..59665e9 100644 --- a/model/Image.php +++ b/model/Image.php @@ -16,8 +16,8 @@ class Image public function __construct($ajax) { // get envoyé avec le javascript - $this->page = $_GET['page']; $this->ajax = $ajax; + $this->page = $_GET['page']; $this->path = 'data/' . $this->page . '/images/'; $this->pathMini = 'data/' . $this->page . '/images-mini/'; } @@ -60,11 +60,19 @@ class Image } // miniatures des photos - public function makeThumbnail() + public function makeThumbnail($largeur) { global $imageLibrary; - if($imageLibrary == 'gd') + if($imageLibrary == 'imagick') + { + $Image = new Imagick($this->path . $_FILES['upload']['name']); + // 0 signifie qu'on conserve les proportions + $Image->thumbnailImage($largeur, 0); + // écriture dans un fichier + $Image->writeImage($this->pathMini . $this->pathInfos['filename'] . '-mini.' . $this->pathInfos['extension']); + } + elseif($imageLibrary == 'gd') { // cette fonction fonctionne pour tous les formats $source = imagecreatefromstring(file_get_contents($this->path . $_FILES['upload']['name'])); @@ -74,15 +82,15 @@ class Image $forme = imagesy($source) / imagesx($source); var_dump($forme); - if(imagesx($source) > 201) + if(imagesx($source) > $largeur) { // créer un rectangle noir - $destination = imagecreatetruecolor(201, 201 * $forme); - var_dump($destination); + $destination = imagecreatetruecolor($largeur, $largeur * $forme); + //var_dump($destination); // sélectionne un rectangle dans l'image source // et le place dans un rectangle dans la nouvelle - imagecopyresampled($destination, $source, 0, 0, 0, 0, 201, 201 * $forme, imagesx($source), imagesy($source)); + imagecopyresampled($destination, $source, 0, 0, 0, 0, $largeur, $largeur * $forme, imagesx($source), imagesy($source)); // envoie l'image dans un fichier imagejpeg($destination, $nomMiniImage); @@ -92,14 +100,6 @@ class Image imagejpeg($source, $nomMiniImage); } } - elseif($imageLibrary == 'imagick') - { - $Image = new Imagick($this->path . $_FILES['upload']['name']); - // 0 signifie qu'on conserve les proportions - $Image->thumbnailImage(201, 0); - // écriture dans un fichier - $Image->writeImage($this->pathMini . $this->pathInfos['filename'] . '-mini.' . $this->pathInfos['extension']); - } else { // utiliser la grande image si il est impossible de créer une miniature -- cgit v1.2.3