diff options
| author | polo <ordipolo@gmx.fr> | 2022-02-18 05:38:40 +0100 |
|---|---|---|
| committer | polo <ordipolo@gmx.fr> | 2022-02-18 05:38:40 +0100 |
| commit | 9a1fb624fd1089087bd363551ba64f5862d9919f (patch) | |
| tree | 87f33f1b1bede404efa2cfd8f4285d32e149d986 | |
| parent | f2c1f219dcd6e25b812d4dbed46f4c0c30541d83 (diff) | |
| download | melaine-9a1fb624fd1089087bd363551ba64f5862d9919f.tar.gz melaine-9a1fb624fd1089087bd363551ba64f5862d9919f.tar.bz2 melaine-9a1fb624fd1089087bd363551ba64f5862d9919f.zip | |
miniatures GD
| -rw-r--r-- | config.php | 8 | ||||
| -rw-r--r-- | controller/admin.php | 8 | ||||
| -rw-r--r-- | controller/ckeditor.php | 22 | ||||
| -rw-r--r-- | controller/installation.php | 9 | ||||
| -rw-r--r-- | controller/visitor.php | 10 | ||||
| -rw-r--r-- | index.php | 24 | ||||
| -rw-r--r-- | model/Album.php | 21 | ||||
| -rw-r--r-- | model/Image.php | 62 | ||||
| -rw-r--r-- | view/discographie.php | 6 | ||||
| -rw-r--r-- | à faire après livraison.txt (renamed from à faire après livraison) | 13 | ||||
| -rw-r--r-- | à faire avant livraison.txt | 4 |
11 files changed, 129 insertions, 58 deletions
diff --git a/config.php b/config.php new file mode 100644 index 0000000..80607e1 --- /dev/null +++ b/config.php | |||
| @@ -0,0 +1,8 @@ | |||
| 1 | <?php | ||
| 2 | // bibliothèque utilisée pour créer les miniatures | ||
| 3 | // écrire 'gd' ou 'imagick' | ||
| 4 | $imageLibrary = 'gd'; | ||
| 5 | |||
| 6 | // mode de stockage des données | ||
| 7 | // écrire 'files' ou 'database' | ||
| 8 | $storage = 'files'; | ||
diff --git a/controller/admin.php b/controller/admin.php index 7f22711..370426b 100644 --- a/controller/admin.php +++ b/controller/admin.php | |||
| @@ -81,11 +81,13 @@ function discoEdit($fileCode, $suppression) | |||
| 81 | // modèle | 81 | // modèle |
| 82 | $Albums = new Album($page_actuelle); | 82 | $Albums = new Album($page_actuelle); |
| 83 | $Albums->makeFileList(); | 83 | $Albums->makeFileList(); |
| 84 | //var_dump($Albums); | 84 | |
| 85 | // contenu: JSON, HTML, noms et chemins des fichiers | 85 | // contenu: JSON, HTML, noms et chemins des fichiers |
| 86 | $Albums->readAll(); | 86 | $Albums->readAll(); |
| 87 | $Albums->fileList = array_reverse($Albums->fileList); | 87 | if(!empty($Albums->fileList)) |
| 88 | //var_dump($Albums); | 88 | { |
| 89 | $Albums->fileList = array_reverse($Albums->fileList); | ||
| 90 | } | ||
| 89 | //var_dump($Albums->fileList); | 91 | //var_dump($Albums->fileList); |
| 90 | 92 | ||
| 91 | // nouvel album | 93 | // nouvel album |
diff --git a/controller/ckeditor.php b/controller/ckeditor.php index 7102f33..5313c3b 100644 --- a/controller/ckeditor.php +++ b/controller/ckeditor.php | |||
| @@ -89,13 +89,24 @@ function submitCKeditor() | |||
| 89 | 89 | ||
| 90 | $nouveauTitre = Security::secureString($_POST['titre']); | 90 | $nouveauTitre = Security::secureString($_POST['titre']); |
| 91 | $nouvelleAnnee = Security::secureString($_POST['annee']); | 91 | $nouvelleAnnee = Security::secureString($_POST['annee']); |
| 92 | $nouvellePochette = $_FILES['upload']['name']; | 92 | if(!empty($_FILES['upload']['name'])) |
| 93 | { | ||
| 94 | $nouvellePochette = $_FILES['upload']['name']; | ||
| 95 | $nouvellePochetteMini = pathinfo($_FILES['upload']['name'], PATHINFO_FILENAME) . '-mini.' . pathinfo($_FILES['upload']['name'], PATHINFO_EXTENSION); | ||
| 96 | } | ||
| 97 | else | ||
| 98 | { | ||
| 99 | $nouvellePochette = ''; | ||
| 100 | $nouvellePochetteMini = ''; | ||
| 101 | } | ||
| 102 | |||
| 103 | //var_dump($nouvellePochetteMini); die(); | ||
| 93 | 104 | ||
| 94 | // enregistrement nouvel album | 105 | // enregistrement nouvel album |
| 95 | if(!isset($_SESSION['target']) || $_SESSION['target'] == '') | 106 | if(!isset($_SESSION['target']) || $_SESSION['target'] == '') |
| 96 | { | 107 | { |
| 97 | // page disco | 108 | // page disco |
| 98 | $Album->createVignette($nouveauTitre, $nouvelleAnnee, $nouvellePochette); | 109 | $Album->createVignette($nouveauTitre, $nouvelleAnnee, $nouvellePochette, $nouvellePochetteMini); |
| 99 | 110 | ||
| 100 | // page de l'album | 111 | // page de l'album |
| 101 | if(!empty($_POST['contenu'])) | 112 | if(!empty($_POST['contenu'])) |
| @@ -114,12 +125,13 @@ function submitCKeditor() | |||
| 114 | 125 | ||
| 115 | // garder l'image si aucune n'est sélectionnée | 126 | // garder l'image si aucune n'est sélectionnée |
| 116 | // (on ne peut pas préremplir un <input type="file">) | 127 | // (on ne peut pas préremplir un <input type="file">) |
| 117 | if($nouvellePochette == '' && $Album->oneAlbum['pochette'] != '') | 128 | /*if($nouvellePochette == '' && $Album->oneAlbum['pochette'] != '') |
| 118 | { | 129 | { |
| 119 | $nouvellePochette = $Album->oneAlbum['pochette']; | 130 | $nouvellePochette = $Album->oneAlbum['pochette']; |
| 120 | } | 131 | $nouvellePochetteMini = $Album->oneAlbum['pochetteMini']; |
| 132 | }*/ | ||
| 121 | 133 | ||
| 122 | $Album->updateVignetteJSON($nouveauTitre, $nouvelleAnnee, $nouvellePochette); | 134 | $Album->updateVignetteJSON($nouveauTitre, $nouvelleAnnee, $nouvellePochette, $nouvellePochetteMini); |
| 123 | 135 | ||
| 124 | // page de l'album | 136 | // page de l'album |
| 125 | if(isset($_POST['contenu'])) | 137 | if(isset($_POST['contenu'])) |
diff --git a/controller/installation.php b/controller/installation.php index 91521e2..9d612dd 100644 --- a/controller/installation.php +++ b/controller/installation.php | |||
| @@ -24,7 +24,7 @@ function installation() | |||
| 24 | // créer le .htaccess | 24 | // créer le .htaccess |
| 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, 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); |
| @@ -75,12 +75,17 @@ function installation() | |||
| 75 | // chmod('data/' . $page . '/multimedia', 0777); | 75 | // chmod('data/' . $page . '/multimedia', 0777); |
| 76 | // } | 76 | // } |
| 77 | } | 77 | } |
| 78 | // dossier supplémentaire dans discographie | 78 | // dossiers supplémentaires dans discographie |
| 79 | if(!file_exists('data/discographie/json')) | 79 | if(!file_exists('data/discographie/json')) |
| 80 | { | 80 | { |
| 81 | mkdir('data/discographie/json'); | 81 | mkdir('data/discographie/json'); |
| 82 | chmod('data/discographie/json', $droitsDossiers); | 82 | chmod('data/discographie/json', $droitsDossiers); |
| 83 | } | 83 | } |
| 84 | if(!file_exists('data/discographie/images-mini')) | ||
| 85 | { | ||
| 86 | mkdir('data/discographie/images-mini'); | ||
| 87 | chmod('data/discographie/images-mini', $droitsDossiers); | ||
| 88 | } | ||
| 84 | // fichier password.txt | 89 | // fichier password.txt |
| 85 | if(!file_exists('data/password.txt')) | 90 | if(!file_exists('data/password.txt')) |
| 86 | { | 91 | { |
diff --git a/controller/visitor.php b/controller/visitor.php index fccc287..2656798 100644 --- a/controller/visitor.php +++ b/controller/visitor.php | |||
| @@ -70,7 +70,6 @@ function discoVisitor() | |||
| 70 | //var_dump($Albums->fileList); die(); | 70 | //var_dump($Albums->fileList); die(); |
| 71 | 71 | ||
| 72 | 72 | ||
| 73 | |||
| 74 | // tri des albums avec l'année dans le .json | 73 | // tri des albums avec l'année dans le .json |
| 75 | 74 | ||
| 76 | // noms des fichiers JSON | 75 | // noms des fichiers JSON |
| @@ -78,20 +77,13 @@ function discoVisitor() | |||
| 78 | 77 | ||
| 79 | //$annees = []; | 78 | //$annees = []; |
| 80 | for($i = 0; $i < $Albums->fileListCount; $i++) | 79 | for($i = 0; $i < $Albums->fileListCount; $i++) |
| 81 | { | 80 | {} |
| 82 | // une case supplémentaire contient le "fileCode" | ||
| 83 | //$albumsJSON[$i][3] = pathinfo($albumNamesJSON[$i])['filename']; | ||
| 84 | //$albumsJSON[$i][3] = pathinfo($Albums->fileList[$i]['fileCode'])['filename']; | ||
| 85 | |||
| 86 | //$annees[$i] = $albumsJSON[$i][1]; | ||
| 87 | } | ||
| 88 | //var_dump($annee); die(); | 81 | //var_dump($annee); die(); |
| 89 | 82 | ||
| 90 | // tri d'un tableau multidimensionnel | 83 | // tri d'un tableau multidimensionnel |
| 91 | //array_multisort($annees, $albumsJSON); | 84 | //array_multisort($annees, $albumsJSON); |
| 92 | 85 | ||
| 93 | 86 | ||
| 94 | |||
| 95 | // lien vers le HTML ou ancre? | 87 | // lien vers le HTML ou ancre? |
| 96 | /*$lienAlbum = []; | 88 | /*$lienAlbum = []; |
| 97 | $avecLien = []; | 89 | $avecLien = []; |
| @@ -4,14 +4,6 @@ | |||
| 4 | // routeur MVC ou controlleur principal | 4 | // routeur MVC ou controlleur principal |
| 5 | // il traite les GET et passe la main aux contrôleurs | 5 | // il traite les GET et passe la main aux contrôleurs |
| 6 | 6 | ||
| 7 | |||
| 8 | // sessions, penser aux attaques CSRF (cross-site request forgery): | ||
| 9 | // ça consite à faire qu'un utilisateur connecté avec une session envoie malgré lui une requête GET ou POST qu'un hacker aura cachée par exemple dans une fausse image clicable | ||
| 10 | // - solution: faire qu'un GET seul dans une session ne suffise pas à effectuer une action (les GET ne doivent servir qu'à afficher la bonne page), une attaque sur un POST est possible aussi mais plus difficile et nécessite d'injecter du javascript | ||
| 11 | // - on peut demander à l'utilisateur une vérification supplémentaire avant chaque action, mais c'est plutôt chiant | ||
| 12 | // - il y a la méthode des jetons, "nonces" et horodatage | ||
| 13 | // - vérifier le "référent", c'est à dire l'URL de la page d'où vient normallement la requête | ||
| 14 | // infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery | ||
| 15 | session_start(); | 7 | session_start(); |
| 16 | 8 | ||
| 17 | if(!empty($_SESSION['erreur'])) | 9 | if(!empty($_SESSION['erreur'])) |
| @@ -26,6 +18,12 @@ require('controller/installation.php'); | |||
| 26 | require('controller/password.php'); | 18 | require('controller/password.php'); |
| 27 | installation(); | 19 | installation(); |
| 28 | 20 | ||
| 21 | // config par défaut | ||
| 22 | $imageLibrary = 'gd'; // 'gd' ou 'imagick' | ||
| 23 | $storage = 'files'; // 'files' ou 'database' | ||
| 24 | // config perso | ||
| 25 | include('config.php'); | ||
| 26 | |||
| 29 | 27 | ||
| 30 | // traitement des requêtes AJAX | 28 | // traitement des requêtes AJAX |
| 31 | if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image') | 29 | if(isset($_GET['action']) && isset($_GET['page']) && $_GET['action'] == 'upload_image') |
| @@ -66,16 +64,6 @@ if(isset($_SESSION['admin']) && $_SESSION['admin'] == 1 | |||
| 66 | } | 64 | } |
| 67 | 65 | ||
| 68 | submitCKeditor(); | 66 | submitCKeditor(); |
| 69 | // modification | ||
| 70 | /*if(isset($_SESSION['target'])) | ||
| 71 | { | ||
| 72 | submitCKeditor($_SESSION['target']); | ||
| 73 | } | ||
| 74 | // nouvel article | ||
| 75 | else | ||
| 76 | { | ||
| 77 | submitCKeditor(''); // $target = '' | ||
| 78 | }*/ | ||
| 79 | } | 67 | } |
| 80 | else | 68 | else |
| 81 | { | 69 | { |
diff --git a/model/Album.php b/model/Album.php index 386a50f..e716a99 100644 --- a/model/Album.php +++ b/model/Album.php | |||
| @@ -21,7 +21,7 @@ class Album extends Article | |||
| 21 | // fonctions CRUD | 21 | // fonctions CRUD |
| 22 | 22 | ||
| 23 | // create | 23 | // create |
| 24 | public function createVignette($titre, $annee, $pochette) | 24 | public function createVignette($titre, $annee, $pochette, $pochetteMini) |
| 25 | { | 25 | { |
| 26 | //$this->format = 'json'; | 26 | //$this->format = 'json'; |
| 27 | 27 | ||
| @@ -33,6 +33,7 @@ class Album extends Article | |||
| 33 | require('model/Image.php'); | 33 | require('model/Image.php'); |
| 34 | $Image = new Image(false); | 34 | $Image = new Image(false); |
| 35 | $Image->upload(); | 35 | $Image->upload(); |
| 36 | $Image->makeThumbnail(); | ||
| 36 | 37 | ||
| 37 | $erreur = $Image->erreur; | 38 | $erreur = $Image->erreur; |
| 38 | if(!empty($erreur)) | 39 | if(!empty($erreur)) |
| @@ -40,7 +41,7 @@ class Album extends Article | |||
| 40 | } | 41 | } |
| 41 | 42 | ||
| 42 | // encodage avec un tableau simple | 43 | // encodage avec un tableau simple |
| 43 | $albumJSON = json_encode([$titre, $annee, $pochette]); | 44 | $albumJSON = json_encode([$titre, $annee, $pochette, $pochetteMini]); |
| 44 | //var_dump($albumJSON); die(); | 45 | //var_dump($albumJSON); die(); |
| 45 | 46 | ||
| 46 | // encodage avec un tableau associatif | 47 | // encodage avec un tableau associatif |
| @@ -66,15 +67,13 @@ class Album extends Article | |||
| 66 | for($i = 0; $i < $this->fileListCount; $i++) | 67 | for($i = 0; $i < $this->fileListCount; $i++) |
| 67 | { | 68 | { |
| 68 | // ajout du JSON | 69 | // ajout du JSON |
| 69 | /*$content = file_get_contents($this->fileList[$i]['fileName']); | ||
| 70 | $content = json_decode($content, true);*/ | ||
| 71 | $content = json_decode($this->fileList[$i]['content'], true); | 70 | $content = json_decode($this->fileList[$i]['content'], true); |
| 72 | //var_dump($content); die(); | ||
| 73 | 71 | ||
| 74 | // lecture de $content étant un tableau simple | 72 | // lecture de $content étant un tableau simple |
| 75 | $this->fileList[$i]['titre'] = $content[0]; | 73 | $this->fileList[$i]['titre'] = $content[0]; |
| 76 | $this->fileList[$i]['annee'] = $content[1]; | 74 | $this->fileList[$i]['annee'] = $content[1]; |
| 77 | $this->fileList[$i]['pochette'] = $content[2]; | 75 | $this->fileList[$i]['pochette'] = $content[2]; |
| 76 | $this->fileList[$i]['pochetteMini'] = $content[3]; | ||
| 78 | 77 | ||
| 79 | // ajout du HTML si il existe | 78 | // ajout du HTML si il existe |
| 80 | if(file_exists('data/' . $this->page . '/' . $this->format . '/' . $this->fileList[$i]['fileCode'] . '.' . $this->format)) | 79 | if(file_exists('data/' . $this->page . '/' . $this->format . '/' . $this->fileList[$i]['fileCode'] . '.' . $this->format)) |
| @@ -107,6 +106,7 @@ class Album extends Article | |||
| 107 | $this->oneAlbum['titre'] = $content[0]; | 106 | $this->oneAlbum['titre'] = $content[0]; |
| 108 | $this->oneAlbum['annee'] = $content[1]; | 107 | $this->oneAlbum['annee'] = $content[1]; |
| 109 | $this->oneAlbum['pochette'] = $content[2]; | 108 | $this->oneAlbum['pochette'] = $content[2]; |
| 109 | $this->oneAlbum['pochetteMini'] = $content[3]; | ||
| 110 | 110 | ||
| 111 | // html | 111 | // html |
| 112 | $this->format = 'html'; | 112 | $this->format = 'html'; |
| @@ -138,14 +138,18 @@ class Album extends Article | |||
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | // update | 140 | // update |
| 141 | public function updateVignetteJSON($titre, $annee, $pochette) | 141 | public function updateVignetteJSON($titre, $annee, $pochette, $pochetteMini) |
| 142 | { | 142 | { |
| 143 | // garder l'ancienne image | 143 | // garder l'image si aucune n'est sélectionnée |
| 144 | // (on ne peut pas préremplir un <input type="file">) | ||
| 144 | $albumJSON = self::getVignetteJSON(); | 145 | $albumJSON = self::getVignetteJSON(); |
| 146 | /*var_dump($pochette); var_dump($pochetteMini); | ||
| 147 | var_dump($albumJSON); die();*/ | ||
| 145 | 148 | ||
| 146 | if($pochette == '') | 149 | if($pochette == '') |
| 147 | { | 150 | { |
| 148 | $pochette = $albumJSON[2]; | 151 | $pochette = $albumJSON[2]; |
| 152 | $pochetteMini = $albumJSON[3]; | ||
| 149 | } | 153 | } |
| 150 | else | 154 | else |
| 151 | { | 155 | { |
| @@ -153,6 +157,7 @@ class Album extends Article | |||
| 153 | require('model/Image.php'); | 157 | require('model/Image.php'); |
| 154 | $Image = new Image(false); | 158 | $Image = new Image(false); |
| 155 | $Image->upload(); | 159 | $Image->upload(); |
| 160 | $Image->makeThumbnail(); | ||
| 156 | $erreur = $Image->erreur; | 161 | $erreur = $Image->erreur; |
| 157 | if(!empty($erreur)) | 162 | if(!empty($erreur)) |
| 158 | { | 163 | { |
| @@ -161,7 +166,7 @@ class Album extends Article | |||
| 161 | } | 166 | } |
| 162 | } | 167 | } |
| 163 | 168 | ||
| 164 | $albumJSON = json_encode([$titre, $annee, $pochette]); | 169 | $albumJSON = json_encode([$titre, $annee, $pochette, $pochetteMini]); |
| 165 | 170 | ||
| 166 | // écriture | 171 | // écriture |
| 167 | $nom_fichier = 'data/discographie/json/' . $this->albumCode . '.json'; | 172 | $nom_fichier = 'data/discographie/json/' . $this->albumCode . '.json'; |
diff --git a/model/Image.php b/model/Image.php index 8ebcd16..c305984 100644 --- a/model/Image.php +++ b/model/Image.php | |||
| @@ -5,7 +5,10 @@ class Image | |||
| 5 | { | 5 | { |
| 6 | private const MAX_WEIGHT = 2000000; // à adapter au php.ini | 6 | private const MAX_WEIGHT = 2000000; // à adapter au php.ini |
| 7 | private $page; | 7 | private $page; |
| 8 | private $ajax = false; // vaut true avec le ckeditor | 8 | private $ajax; // vaut true avec le ckeditor |
| 9 | public $path; | ||
| 10 | public $pathMini; | ||
| 11 | public $pathInfos; | ||
| 9 | public $erreur; | 12 | public $erreur; |
| 10 | 13 | ||
| 11 | public function __construct($ajax) | 14 | public function __construct($ajax) |
| @@ -13,14 +16,14 @@ class Image | |||
| 13 | // get envoyé avec le javascript | 16 | // get envoyé avec le javascript |
| 14 | $this->page = $_GET['page']; | 17 | $this->page = $_GET['page']; |
| 15 | $this->ajax = $ajax; | 18 | $this->ajax = $ajax; |
| 19 | $this->path = 'data/' . $this->page . '/images/'; | ||
| 20 | $this->pathMini = 'data/' . $this->page . '/images-mini/'; | ||
| 16 | } | 21 | } |
| 17 | 22 | ||
| 18 | // GET | 23 | // GET |
| 19 | 24 | ||
| 20 | // SET | 25 | // SET |
| 21 | 26 | ||
| 22 | // miniatures des photos | ||
| 23 | |||
| 24 | public function upload() | 27 | public function upload() |
| 25 | { | 28 | { |
| 26 | // traitement et enregistrement de l'image | 29 | // traitement et enregistrement de l'image |
| @@ -28,14 +31,14 @@ class Image | |||
| 28 | { | 31 | { |
| 29 | if ($_FILES['upload']['size'] <= self::MAX_WEIGHT) | 32 | if ($_FILES['upload']['size'] <= self::MAX_WEIGHT) |
| 30 | { | 33 | { |
| 31 | $infos = pathinfo($_FILES['upload']['name']); | 34 | $this->pathInfos = pathinfo($_FILES['upload']['name']); |
| 32 | $extension = $infos['extension']; | 35 | $extension = $this->pathInfos['extension']; |
| 33 | $extautorisées = array('jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff'); | 36 | $extautorisées = array('jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff'); |
| 34 | // on prend la même liste que celle côté javascript, le SVG est bloqué pour raison de sécurité (javascript à l'intérieur) | 37 | // on prend la même liste que celle côté javascript, le SVG est bloqué pour raison de sécurité (javascript à l'intérieur) |
| 35 | if (in_array($extension, $extautorisées)) | 38 | if (in_array($extension, $extautorisées)) |
| 36 | { | 39 | { |
| 37 | move_uploaded_file($_FILES['upload']['tmp_name'], 'data/' . $this->page . '/images/' . $_FILES['upload']['name']); | 40 | move_uploaded_file($_FILES['upload']['tmp_name'], $this->path . $_FILES['upload']['name']); |
| 38 | chmod('data/' . $this->page . '/images/' . $_FILES['upload']['name'], 0666); | 41 | chmod($this->path . $_FILES['upload']['name'], 0666); |
| 39 | } | 42 | } |
| 40 | else{$this->erreur = 'mauvais format, veuillez utiliser une image comportant un de ces formats: jpg ou jpeg, png, gif, bmp, webp, tiff<br />le format svg n\'est pas supporté';} | 43 | else{$this->erreur = 'mauvais format, veuillez utiliser une image comportant un de ces formats: jpg ou jpeg, png, gif, bmp, webp, tiff<br />le format svg n\'est pas supporté';} |
| 41 | } | 44 | } |
| @@ -57,4 +60,49 @@ class Image | |||
| 57 | echo $chemin; | 60 | echo $chemin; |
| 58 | } | 61 | } |
| 59 | } | 62 | } |
| 63 | |||
| 64 | // miniatures des photos | ||
| 65 | public function makeThumbnail() | ||
| 66 | { | ||
| 67 | if($imageLibrary == 'gd') | ||
| 68 | { | ||
| 69 | // des infos sur GD | ||
| 70 | //print_r(gd_info()); | ||
| 71 | |||
| 72 | // cette fonction fonctionne pour tous les formats | ||
| 73 | $source = imagecreatefromstring(file_get_contents($this->path . $_FILES['upload']['name'])); | ||
| 74 | var_dump($source); | ||
| 75 | |||
| 76 | $nomMiniImage = $this->pathMini . $this->pathInfos['filename'] . '-mini.jpg'; | ||
| 77 | var_dump($nomMiniImage); | ||
| 78 | |||
| 79 | //var_dump($nomMiniImage); | ||
| 80 | //var_dump(imagesx($image)); | ||
| 81 | |||
| 82 | $forme = imagesy($source) / imagesx($source); | ||
| 83 | var_dump($forme); | ||
| 84 | |||
| 85 | if(imagesx($source) > 201) | ||
| 86 | { | ||
| 87 | // créer un rectangle noir | ||
| 88 | $destination = imagecreatetruecolor(201, 201 * $forme); | ||
| 89 | var_dump($destination); | ||
| 90 | |||
| 91 | // sélectionne un rectangle dans l'image source | ||
| 92 | // et le place dans un rectangle dans la nouvelle | ||
| 93 | imagecopyresampled($destination, $source, 0, 0, 0, 0, 201, 201 * $forme, imagesx($source), imagesy($source)); | ||
| 94 | |||
| 95 | // envoie l'image dans un fichier | ||
| 96 | imagejpeg($destination, $nomMiniImage); | ||
| 97 | } | ||
| 98 | else | ||
| 99 | { | ||
| 100 | imagejpeg($source, $nomMiniImage); | ||
| 101 | } | ||
| 102 | } | ||
| 103 | elseif($imageLibrary == 'imagick') | ||
| 104 | {} | ||
| 105 | else | ||
| 106 | {} | ||
| 107 | } | ||
| 60 | } \ No newline at end of file | 108 | } \ No newline at end of file |
diff --git a/view/discographie.php b/view/discographie.php index 6d56854..f330a8d 100644 --- a/view/discographie.php +++ b/view/discographie.php | |||
| @@ -51,7 +51,6 @@ ob_start(); | |||
| 51 | <?php | 51 | <?php |
| 52 | //for($i = $Albums->fileListCount - 1; $i >= 0; $i--) | 52 | //for($i = $Albums->fileListCount - 1; $i >= 0; $i--) |
| 53 | for($i = 0; $i < $Albums->fileListCount; $i++) | 53 | for($i = 0; $i < $Albums->fileListCount; $i++) |
| 54 | //foreach($albumsJSON as $oneAlbum) | ||
| 55 | { | 54 | { |
| 56 | // menu dessous la mouette | 55 | // menu dessous la mouette |
| 57 | // comporte un lien si fichier html existe, sinon une ancre | 56 | // comporte un lien si fichier html existe, sinon une ancre |
| @@ -73,8 +72,9 @@ if($_SESSION['admin'] == 1) | |||
| 73 | $style = 'class="articleAvecEditeur"'; | 72 | $style = 'class="articleAvecEditeur"'; |
| 74 | ?> | 73 | ?> |
| 75 | <article <?= $style ?>> | 74 | <article <?= $style ?>> |
| 76 | <h3>Ajouter un album</h3> | 75 | <h3>Ajouter un album</h3> |
| 77 | <?= $editeurHTML ?> | 76 | <?= $editeurHTML ?> |
| 77 | </article> | ||
| 78 | <?php | 78 | <?php |
| 79 | } | 79 | } |
| 80 | else | 80 | else |
| @@ -87,11 +87,11 @@ if($_SESSION['admin'] == 1) | |||
| 87 | Nouvel album | 87 | Nouvel album |
| 88 | </a> | 88 | </a> |
| 89 | </p> | 89 | </p> |
| 90 | </article> | ||
| 90 | <?php | 91 | <?php |
| 91 | } | 92 | } |
| 92 | } | 93 | } |
| 93 | ?> | 94 | ?> |
| 94 | </article> | ||
| 95 | <div id="articles"> | 95 | <div id="articles"> |
| 96 | <?php | 96 | <?php |
| 97 | 97 | ||
diff --git a/à faire après livraison b/à faire après livraison.txt index aeaab1d..db20759 100644 --- a/à faire après livraison +++ b/à faire après livraison.txt | |||
| @@ -1,6 +1,9 @@ | |||
| 1 | Le reste du site | 1 | Le reste du site |
| 2 | 2 | ||
| 3 | Miniatures avec imagemagick en alternative de GD | 3 | Miniatures avec imagemagick |
| 4 | |||
| 5 | possibilité de regarder une image en grand dans une fenêtre javascript | ||
| 6 | OU au moins dans une "page" dotée d'un bouton pur sortir (avec GD? avec imagemagick?) | ||
| 4 | 7 | ||
| 5 | 8 | ||
| 6 | Protection contre les falsifications de requête inter-site - CSRF | 9 | Protection contre les falsifications de requête inter-site - CSRF |
| @@ -23,6 +26,14 @@ Si vous n’utilisez pas un framework qui gère la protection CSRF pour vous, je | |||
| 23 | 26 | ||
| 24 | une bibli qui fait ça: https://github.com/paragonie/anti-csrf | 27 | une bibli qui fait ça: https://github.com/paragonie/anti-csrf |
| 25 | 28 | ||
| 29 | "sessions, penser aux attaques CSRF (cross-site request forgery): | ||
| 30 | ça consite à faire qu'un utilisateur connecté avec une session envoie malgré lui une requête GET ou POST qu'un hacker aura cachée par exemple dans une fausse image clicable | ||
| 31 | - solution: faire qu'un GET seul dans une session ne suffise pas à effectuer une action (les GET ne doivent servir qu'à afficher la bonne page), une attaque sur un POST est possible aussi mais plus difficile et nécessite d'injecter du javascript | ||
| 32 | - on peut demander à l'utilisateur une vérification supplémentaire avant chaque action, mais c'est plutôt chiant | ||
| 33 | - il y a la méthode des jetons, "nonces" et horodatage | ||
| 34 | - vérifier le "référent", c'est à dire l'URL de la page d'où vient normallement la requête" | ||
| 35 | infos: https://fr.wikipedia.org/wiki/Cross-site_request_forgery | ||
| 36 | |||
| 26 | 37 | ||
| 27 | Upload de musique/vidéo | 38 | Upload de musique/vidéo |
| 28 | Ajout de liens youtube, spotify, etc | 39 | Ajout de liens youtube, spotify, etc |
diff --git a/à faire avant livraison.txt b/à faire avant livraison.txt index b785efb..b852baf 100644 --- a/à faire avant livraison.txt +++ b/à faire avant livraison.txt | |||
| @@ -1,9 +1,9 @@ | |||
| 1 | Miniatures avec php-gd | ||
| 2 | |||
| 3 | tri des albums selon l'année | 1 | tri des albums selon l'année |
| 4 | (avec des plages de timestamps?) | 2 | (avec des plages de timestamps?) |
| 5 | 3 | ||
| 6 | Identification avec deux codes (login + mot de passe) | 4 | Identification avec deux codes (login + mot de passe) |
| 7 | 5 | ||
| 6 | fichier backup.php -> mettre le html à part | ||
| 7 | |||
| 8 | Sauvegarde des données !! | 8 | Sauvegarde des données !! |
| 9 | 9 | ||
