From 54b5efd1d829759e0873ca6865695034f633aefa Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sat, 8 Aug 2020 17:06:06 +0200 Subject: [PATCH 01/44] =?UTF-8?q?init=20+=20am=C3=A9liorer=20la=20notifica?= =?UTF-8?q?tion=20finale.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core.js.php | 24 +++--- core/layout/common.css | 2 +- core/module/config/config.php | 9 +- core/module/config/view/backup/backup.css | 36 +++++++- core/module/config/view/backup/backup.js.php | 31 +++++++ core/module/config/view/backup/backup.php | 10 ++- core/module/config/view/manage/manage.php | 4 +- core/module/config/view/restore/restore.css | 15 ---- core/module/config/view/restore/restore.php | 85 ------------------- core/module/theme/theme.php | 2 +- core/module/theme/view/manage/manage.php | 13 ++- core/vendor/zwiico/img/ajax-loader.gif | Bin 0 -> 673 bytes index.php | 1 + 13 files changed, 106 insertions(+), 126 deletions(-) create mode 100644 core/module/config/view/backup/backup.js.php delete mode 100755 core/module/config/view/restore/restore.css delete mode 100755 core/module/config/view/restore/restore.php create mode 100644 core/vendor/zwiico/img/ajax-loader.gif diff --git a/core/core.js.php b/core/core.js.php index 2342eb13..7165ee17 100755 --- a/core/core.js.php +++ b/core/core.js.php @@ -346,8 +346,8 @@ core.start = function() { var ratio = width / height; if ( ($(window).width() / ratio) <= height) { $("header").height( $(window).width() / ratio ); - $("header").css("line-height", $(window).width() / ratio + "px"); - } + $("header").css("line-height", $(window).width() / ratio + "px"); + } } }).trigger("resize"); @@ -389,7 +389,7 @@ core.relativeLuminanceW3C = function(rgba) { $(document).ready(function(){ /** - * Affiche le sous-menu quand il est sticky + * Affiche le sous-menu quand il est sticky */ $("nav").mouseenter(function(){ $("#navfixedlogout .navLevel2").css({ 'pointer-events' : 'auto' }); @@ -414,7 +414,7 @@ $(document).ready(function(){ // on récupère la valeur data-speed si elle existe var toggleSpeed = accordion.attr('data-speed') || 100; - // fonction pour afficher un élément + // fonction pour afficher un élément function open(item, speed) { // on récupère tous les éléments, on enlève l'élément actif de ce résultat, et on les cache accordion.find('.accordion-item').not(item).removeClass('active') @@ -428,32 +428,32 @@ $(document).ready(function(){ .find('.accordion-content').slideUp(speed); } - // on initialise l'accordéon, sans animation + // on initialise l'accordéon, sans animation open(accordion.find('.active:first'), 0); // au clic sur un titre... accordion.on('click', '.accordion-title', function(ev) { - ev.preventDefault(); + ev.preventDefault(); // Masquer l'élément déjà actif if ($(this).closest('.accordion-item').hasClass('active')) { close($(this).closest('.accordion-item'), toggleSpeed); } else { - // ...on lance l'affichage de l'élément, avec animation - open($(this).closest('.accordion-item'), toggleSpeed); + // ...on lance l'affichage de l'élément, avec animation + open($(this).closest('.accordion-item'), toggleSpeed); } }); }); /** - * Icône du Menu Burger + * Icône du Menu Burger */ - $("#toggle").click(function() { + $("#toggle").click(function() { var changeIcon = $('#toggle').children("span"); if ( $(changeIcon).hasClass('zwiico-menu') ) { $(changeIcon).removeClass('zwiico-menu').addClass('zwiico-cancel'); } - else { + else { $(changeIcon).addClass('zwiico-menu'); }; }); -}); \ No newline at end of file +}); diff --git a/core/layout/common.css b/core/layout/common.css index 9cff5bb0..884aa9f3 100755 --- a/core/layout/common.css +++ b/core/layout/common.css @@ -455,7 +455,7 @@ header .container { font-size: 0.9em; } -/* Menu +/* Menu body > nav { margin: 0 -10px; } diff --git a/core/module/config/config.php b/core/module/config/config.php index 21f5ba1b..e0f5da66 100755 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -8,7 +8,7 @@ * * @author Rémi Jean * @copyright Copyright (C) 2008-2018, Rémi Jean - * * @author Frédéric Tempez + * @author Frédéric Tempez * @copyright Copyright (C) 2018-2020, Frédéric Tempez * @license GNU General Public License, version 3 * @link http://zwiicms.com/ @@ -246,8 +246,12 @@ class config extends common { // Creation du ZIP $filter = $this->getInput('configBackupOption',helper::FILTER_BOOLEAN) === true ? ['backup','tmp'] : ['backup','tmp','file']; $fileName = helper::autoBackup(self::TEMP_DIR,$filter); + if (!is_dir(self::FILE_DIR.'source/backup')) { + mkdir(self::FILE_DIR.'source/backup'); + } + copy (self::TEMP_DIR . $fileName , self::FILE_DIR.'source/backup/' . $fileName); - // Téléchargement du ZIP + /*// Téléchargement du ZIP // NE marche pas avec le spinner header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="' . $fileName . '"'); header('Content-Length: ' . filesize(self::TEMP_DIR . $fileName)); @@ -256,6 +260,7 @@ class config extends common { $this->addOutput([ 'display' => self::DISPLAY_RAW ]); + */ unlink(self::TEMP_DIR . $fileName); } else { // Valeurs en sortie diff --git a/core/module/config/view/backup/backup.css b/core/module/config/view/backup/backup.css index 6faa3a6a..823be7d8 100755 --- a/core/module/config/view/backup/backup.css +++ b/core/module/config/view/backup/backup.css @@ -12,4 +12,38 @@ * @link http://zwiicms.com/ */ -@import url("site/data/admin.css"); \ No newline at end of file +@import url("site/data/admin.css"); + +/** +* Effet d'animation +*/ +/* Start by setting display:none to make this hidden. + Then we position it in relation to the viewport window + with position:fixed. Width, height, top and left speak + for themselves. Background we set to 80% white with + our animation centered, and no-repeating */ +.modal { +display: none; + position: fixed; + z-index: 1000; + top: 0; + left: 0; + height: 100%; + width: 100%; + background: rgba( 255, 255, 255, .2 ) + url('core/vendor/zwiico/img/ajax-loader.gif') + 50% 50% + no-repeat; + } + + /* When the body has the loading class, we turn + the scrollbar off with overflow:hidden */ + body.loading .modal { + overflow: hidden; + } + + /* Anytime the body has the loading class, our + modal element will be visible */ + body.loading .modal { + display: block; + } \ No newline at end of file diff --git a/core/module/config/view/backup/backup.js.php b/core/module/config/view/backup/backup.js.php new file mode 100644 index 00000000..833985e3 --- /dev/null +++ b/core/module/config/view/backup/backup.js.php @@ -0,0 +1,31 @@ +/** + * This file is part of Zwii. + * + * For full copyright and license information, please see the LICENSE + * file that was distributed with this source code. + * + * @author Frédéric Tempez + * @copyright Copyright (C) 2018-2020, Frédéric Tempez + * @license GNU General Public License, version 3 + * @link http://zwiicms.com/ + */ + +$( document).ready(function() { + $("#configBackupForm").submit( function(e){ + console.log('click'); + e.preventDefault(); + $("body").addClass("loading"); + var url = "getUrl(0); ?>/backup"; + $.ajax({ + type: "POST", + url: url, + data: $("form").serialize(), + complete: function(r, s){ + $("body").removeClass("loading"); + $("body").append("
Sauvegarde générée avec succès !
"); + $("#notification").delay("3000").fadeOut("1000"); + }, + }); + }); +}); + diff --git a/core/module/config/view/backup/backup.php b/core/module/config/view/backup/backup.php index b4ff41e6..3863255a 100755 --- a/core/module/config/view/backup/backup.php +++ b/core/module/config/view/backup/backup.php @@ -10,10 +10,11 @@
'Valider', - 'ico' => 'check' - ]); ?> + 'value' => 'Sauvegarder', + 'ico' => 'download-cloud' + ]); ?>
+
@@ -26,6 +27,9 @@ 'help' => 'Cette option n\'est pas recommandée lorsque le contenu du gestionnaire de fichiers est très volumineux.' ]); ?>
+
+ Le fichier de sauvegarde est généré dans le dossier Backup du gestionnaire de fichiers. +
diff --git a/core/module/config/view/manage/manage.php b/core/module/config/view/manage/manage.php index cd951922..953ac7a7 100755 --- a/core/module/config/view/manage/manage.php +++ b/core/module/config/view/manage/manage.php @@ -10,8 +10,8 @@
'Valider', - 'ico' => 'check' + 'value' => 'Restaurer', + 'ico' => 'upload' ]); ?>
diff --git a/core/module/config/view/restore/restore.css b/core/module/config/view/restore/restore.css deleted file mode 100755 index 6faa3a6a..00000000 --- a/core/module/config/view/restore/restore.css +++ /dev/null @@ -1,15 +0,0 @@ -/** - * This file is part of Zwii. - * - * For full copyright and license information, please see the LICENSE - * file that was distributed with this source code. - * - * @author Rémi Jean - * @copyright Copyright (C) 2008-2018, Rémi Jean - * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez - * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ - */ - -@import url("site/data/admin.css"); \ No newline at end of file diff --git a/core/module/config/view/restore/restore.php b/core/module/config/view/restore/restore.php deleted file mode 100755 index 8c4fc4ff..00000000 --- a/core/module/config/view/restore/restore.php +++ /dev/null @@ -1,85 +0,0 @@ - -
-
- 'buttonGrey', - 'href' => helper::baseUrl() . 'config', - 'ico' => 'left', - 'value' => 'Retour' - ]); ?> -
-
- 'Restaurer', - 'ico' => 'upload' - ]); ?> -
-
-
-
-
-

Restauration ou transfert d'un site

-
-
- 'Sélectionnez une sauvegarde au format ZIP', - 'type' => 2, - 'help' => 'L\'archive a été déposée dans le gestionnaire de fichiers. Les archives inférieures à la version 9 ne sont pas acceptées.' - ]); ?> -
-
-
-
- true, - 'help' => 'Les données des utilisateurs installés ne sont pas écrasés par la restauration quand l\'option est active.' - ]); ?> -
-
-
-
-
-
-
-
-

Conversion des URL après transfert de site

-
-
- getData(['core', 'baseUrl'])) ) { - $baseUrlValue = 'Pas de donnée dans la sauvegarde'; - $buttonClass = 'disabled'; - } elseif ($this->getData(['core', 'baseUrl']) === '') { - $baseUrlValue = '/'; - $buttonClass = (helper::baseUrl(true,false) !== $this->getData(['core', 'baseUrl']) ) ? '' : 'disabled'; - } else { - $baseUrlValue = $this->getData(['core', 'baseUrl']); - $buttonClass = (helper::baseUrl(true,false) !== $this->getData(['core', 'baseUrl']) ) ? '' : 'disabled'; - } - echo template::text('configRestoreBaseURLToConvert', [ - 'label' => 'Dossier d\'installation de l\'archive' , - 'value' => $baseUrlValue, - 'readonly' => true, - 'help' => 'Lors de la restauration d\'un backup d\'une version 9.2.10 ou supérieure, l\'URL de base est stockée dans la configuration sinon cette donnée est vide.' - ]); ?> -
-
- 'Dossier du site actuel', - 'value' => helper::baseUrl(true,false), - 'readonly' => true, - 'help' => 'Dossier du site installé.' - ]); ?> -
-
- helper::baseUrl() . 'config/updateBaseUrl', - 'class' => $buttonClass, - 'value' => 'convertir' - ]); ?> -
-
-
-
-
- diff --git a/core/module/theme/theme.php b/core/module/theme/theme.php index 498960e5..529d6900 100755 --- a/core/module/theme/theme.php +++ b/core/module/theme/theme.php @@ -669,7 +669,7 @@ class theme extends common { unlink (self::TEMP_DIR . $zipFilename); // Valeurs en sortie $this->addOutput([ - 'notification' => 'Archive '.$zipFilename.' sauvegardée dans fichiers', + 'notification' => 'Archive '.$zipFilename.' sauvegardée avec succès', 'redirect' => helper::baseUrl() . 'theme/manage', 'state' => true ]); diff --git a/core/module/theme/view/manage/manage.php b/core/module/theme/view/manage/manage.php index ad86da93..ff7a28ba 100755 --- a/core/module/theme/view/manage/manage.php +++ b/core/module/theme/view/manage/manage.php @@ -26,7 +26,7 @@ 'Appliquer' ]); ?> - + @@ -49,6 +49,11 @@ ]); ?> +
+
+ Le fichier de sauvegarde est généré dans le dossier Thème du gestionnaire de fichiers. +
+

Télécharger le thème

@@ -59,16 +64,16 @@ 'ico' => 'download', 'value' => 'Thème site' ]); ?> -
+
helper::baseUrl() . 'theme/export/admin', 'ico' => 'download', 'value' => 'Thème administration' ]); ?> -
+ - + diff --git a/core/vendor/zwiico/img/ajax-loader.gif b/core/vendor/zwiico/img/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0bce1542342e912da81a2c260562df172f30d73 GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nnmm28Kh24mmkF0U1e2Nli^nlO|14{Lk&@8WQa67~pE8 zXTZz|lvDgC+Z`3#dv5h=E26FfcG1 zbL_hF&)}42ws10s6^G;;cE1^EoUR)U5A70}d2pLv!jVIT7j&Z~EblI3x0K*v_sV|m z0kj3v921Z^em#l`(k(o@H$3ZdDRc@9NidXDNbqrumReCGv$gd8+e8WW28HVqkJ_9i zH>s*<31KtHjANIPvi2#*6BEu%3Dak5O_t&NBI)H?V$TxT}#l{vOTn5naXTfF^&~Hhq+NX@#Ccc>y7T?;vjI&jdhsDsPJyAw*m0Qz>i}K7# zL9w50Ng{fT}A5JUe8lRK1h7_Y2;BWJDd=c6f&i?Wv5(5q?6|P zQw{>maxZP<537OA37Uk}7@%_$4o$EWe_Zl>&#id|lE-BpDC#+Fn|msJ%_2h{Hg1vP z#N8WAzfWasG}yq|xqE)DrWaOofX=z|?*pgc%{ig5vl!pqDlC|q&~Z0$&Rvsft&VO- z4MZj+%-+Vx%W}v;V76hyp=;+R;x+~t^Q%*xuFTQAF2})fSfTHDAs>sO!OBw`)&)o$ c0!CNZt))x~rAZP^^P&YOFfdqy5)K#u0POD40{{R3 literal 0 HcmV?d00001 diff --git a/index.php b/index.php index 19518a72..0a03051a 100755 --- a/index.php +++ b/index.php @@ -28,6 +28,7 @@ setlocale (LC_TIME, 'fra_FRA', 'french'); /** * Initialisation de Zwii */ + session_start(); // Chargement des classes require 'core/class/autoload.php'; From 14e0499bc8606864bb95c679566b718c40c20996 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sat, 8 Aug 2020 17:14:52 +0200 Subject: [PATCH 02/44] Virer les icones de bouton + petites modifs --- core/module/config/view/backup/backup.js.php | 4 ++-- core/module/config/view/backup/backup.php | 3 +-- core/module/config/view/index/index.php | 6 ++---- core/module/config/view/manage/manage.php | 3 +-- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/core/module/config/view/backup/backup.js.php b/core/module/config/view/backup/backup.js.php index 833985e3..7ad52f44 100644 --- a/core/module/config/view/backup/backup.js.php +++ b/core/module/config/view/backup/backup.js.php @@ -22,9 +22,9 @@ $( document).ready(function() { data: $("form").serialize(), complete: function(r, s){ $("body").removeClass("loading"); - $("body").append("
Sauvegarde générée avec succès !
"); + $("body").append("
Sauvegarde réalisée avec succès !
"); $("#notification").delay("3000").fadeOut("1000"); - }, + } }); }); }); diff --git a/core/module/config/view/backup/backup.php b/core/module/config/view/backup/backup.php index 3863255a..e1778c99 100755 --- a/core/module/config/view/backup/backup.php +++ b/core/module/config/view/backup/backup.php @@ -10,8 +10,7 @@
'Sauvegarder', - 'ico' => 'download-cloud' + 'value' => 'Sauvegarder' ]); ?>
diff --git a/core/module/config/view/index/index.php b/core/module/config/view/index/index.php index f7939075..a5d149c4 100755 --- a/core/module/config/view/index/index.php +++ b/core/module/config/view/index/index.php @@ -11,15 +11,13 @@
helper::baseUrl() . 'config/backup', - 'value' => 'Sauvegarder', - 'ico' => 'download' + 'value' => 'Sauvegarder' ]); ?>
helper::baseUrl() . 'config/manage', - 'value' => 'Restaurer', - 'ico' => 'upload' + 'value' => 'Restaurer' ]); ?>
diff --git a/core/module/config/view/manage/manage.php b/core/module/config/view/manage/manage.php index 953ac7a7..bc5a8c2e 100755 --- a/core/module/config/view/manage/manage.php +++ b/core/module/config/view/manage/manage.php @@ -10,8 +10,7 @@
'Restaurer', - 'ico' => 'upload' + 'value' => 'Restaurer' ]); ?>
From 5a0998e1392d4a0c87d7faadfcbeed04908440b9 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sat, 8 Aug 2020 17:15:19 +0200 Subject: [PATCH 03/44] Virer une console --- core/module/config/view/backup/backup.js.php | 1 - 1 file changed, 1 deletion(-) diff --git a/core/module/config/view/backup/backup.js.php b/core/module/config/view/backup/backup.js.php index 7ad52f44..6dbf0f2a 100644 --- a/core/module/config/view/backup/backup.js.php +++ b/core/module/config/view/backup/backup.js.php @@ -12,7 +12,6 @@ $( document).ready(function() { $("#configBackupForm").submit( function(e){ - console.log('click'); e.preventDefault(); $("body").addClass("loading"); var url = "getUrl(0); ?>/backup"; From 4400b6de8bf8998d49dcc76983632b5576c73e01 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sat, 8 Aug 2020 18:36:11 +0200 Subject: [PATCH 04/44] =?UTF-8?q?Notification=20ok=20+=20libell=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/config/view/backup/backup.js.php | 3 +-- core/module/config/view/backup/backup.php | 4 ++-- core/vendor/zwiico/img/ajax-loader.gif | Bin 3 files changed, 3 insertions(+), 4 deletions(-) mode change 100644 => 100755 core/module/config/view/backup/backup.js.php mode change 100644 => 100755 core/vendor/zwiico/img/ajax-loader.gif diff --git a/core/module/config/view/backup/backup.js.php b/core/module/config/view/backup/backup.js.php old mode 100644 new mode 100755 index 6dbf0f2a..9295cefc --- a/core/module/config/view/backup/backup.js.php +++ b/core/module/config/view/backup/backup.js.php @@ -21,8 +21,7 @@ $( document).ready(function() { data: $("form").serialize(), complete: function(r, s){ $("body").removeClass("loading"); - $("body").append("
Sauvegarde réalisée avec succès !
"); - $("#notification").delay("3000").fadeOut("1000"); + core.alert("Sauvegarde terminée avec succès !"); } }); }); diff --git a/core/module/config/view/backup/backup.php b/core/module/config/view/backup/backup.php index e1778c99..cc240b23 100755 --- a/core/module/config/view/backup/backup.php +++ b/core/module/config/view/backup/backup.php @@ -20,10 +20,10 @@

Paramètre

-
+
true, - 'help' => 'Cette option n\'est pas recommandée lorsque le contenu du gestionnaire de fichiers est très volumineux.' + 'help' => 'Lorsque le contenu du gestionnaire de fichiers est très volumineux une copie par FTP est préférable.' ]); ?>
diff --git a/core/vendor/zwiico/img/ajax-loader.gif b/core/vendor/zwiico/img/ajax-loader.gif old mode 100644 new mode 100755 From 8581911e6198da90c2b532eae429aa528386296b Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sat, 8 Aug 2020 19:41:12 +0200 Subject: [PATCH 05/44] =?UTF-8?q?Correctif=20:=20edit=20page,=20=20changem?= =?UTF-8?q?ent=20id=20si=20le=20nom=20de=20la=20page=20a=20chang=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/page/page.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/core/module/page/page.php b/core/module/page/page.php index 0afd8acd..f409058e 100755 --- a/core/module/page/page.php +++ b/core/module/page/page.php @@ -184,7 +184,12 @@ class page extends common { else { // Soumission du formulaire if($this->isPost()) { - $pageId = $this->getInput('pageEditTitle', helper::FILTER_ID, true); + // Génére l'ID si le titre de la page a changé + if ( $this->getInput('pageEditTitle') !== $this->getData(['page',$this->getUrl(2),'title']) ) { + $pageId = $this->getInput('pageEditTitle', helper::FILTER_ID, true); + } else { + $pageId = $this->getUrl(2); + } // un dossier existe du même nom (erreur en cas de redirection) if (file_exists($pageId)) { $pageId = uniqid($pageId); From 80f091b59f91154ce461e7a0853cde95d315c504 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 10:50:45 +0200 Subject: [PATCH 06/44] Merge bug_page_id --- CHANGES.md | 4 ++++ README.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index c91efa1d..86598e12 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,9 @@ # Changelog +## version 10.2.07 +- Correction : + - Bloquage de l'incrémentation de l'id de page lorsque deux pages ont le même nom. + ## version 10.2.06 - Corrections : - Dépréciation option de cookie samesite. diff --git a/README.md b/README.md index f427f44d..fd806728 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![](https://img.shields.io/github/last-commit/fredtempez/ZwiiCMS/master) ![](https://img.shields.io/github/release-date/fredtempez/ZwiiCMS) -# ZwiiCMS 10.2.06 +# ZwiiCMS 10.2.07 Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation. From c03a22436e0c5f7fd0b44c3921b2698ae74aa823 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 10:53:58 +0200 Subject: [PATCH 07/44] Merge bug_page_id --- CHANGES.md | 4 ++++ README.md | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index e698931e..f179a697 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,9 @@ # Changelog +## version 10.2.07 +- Correction : + - Bloquage de l'incrémentation de l'id de page lorsque deux pages ont le même nom. + ## version 10.2.06 - Corrections : - Anticipation de la dépréciation de l'option de cookie samesite=none. diff --git a/README.md b/README.md index f427f44d..fd806728 100755 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![](https://img.shields.io/github/last-commit/fredtempez/ZwiiCMS/master) ![](https://img.shields.io/github/release-date/fredtempez/ZwiiCMS) -# ZwiiCMS 10.2.06 +# ZwiiCMS 10.2.07 Zwii est un CMS sans base de données (flat-file) qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation. From 603f28189ef8f2ac05c5462ab8f89c721da4274f Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 11:47:46 +0200 Subject: [PATCH 08/44] =?UTF-8?q?Am=C3=A9liorations=20:=20spinner=20+=20ma?= =?UTF-8?q?sque?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/config/view/backup/backup.css | 4 ++-- core/module/config/view/backup/backup.js.php | 2 +- core/module/config/view/backup/backup.php | 6 +++--- core/vendor/zwiico/img/ajax-loader.gif | Bin 673 -> 0 bytes core/vendor/zwiico/img/ajax-loader.png | Bin 0 -> 8529 bytes 5 files changed, 6 insertions(+), 6 deletions(-) delete mode 100755 core/vendor/zwiico/img/ajax-loader.gif create mode 100644 core/vendor/zwiico/img/ajax-loader.png diff --git a/core/module/config/view/backup/backup.css b/core/module/config/view/backup/backup.css index 823be7d8..6b4e29e1 100755 --- a/core/module/config/view/backup/backup.css +++ b/core/module/config/view/backup/backup.css @@ -30,8 +30,8 @@ display: none; left: 0; height: 100%; width: 100%; - background: rgba( 255, 255, 255, .2 ) - url('core/vendor/zwiico/img/ajax-loader.gif') + background: rgba( 0, 0, 0, .9 ) + url('core/vendor/zwiico/img/ajax-loader.png') 50% 50% no-repeat; } diff --git a/core/module/config/view/backup/backup.js.php b/core/module/config/view/backup/backup.js.php index 9295cefc..0f33f90e 100755 --- a/core/module/config/view/backup/backup.js.php +++ b/core/module/config/view/backup/backup.js.php @@ -21,7 +21,7 @@ $( document).ready(function() { data: $("form").serialize(), complete: function(r, s){ $("body").removeClass("loading"); - core.alert("Sauvegarde terminée avec succès !"); + core.alert("Processus terminé : la sauvegarde a été générée."); } }); }); diff --git a/core/module/config/view/backup/backup.php b/core/module/config/view/backup/backup.php index cc240b23..8c35a2c7 100755 --- a/core/module/config/view/backup/backup.php +++ b/core/module/config/view/backup/backup.php @@ -16,18 +16,18 @@
-
+

Paramètre

-
+
true, 'help' => 'Lorsque le contenu du gestionnaire de fichiers est très volumineux une copie par FTP est préférable.' ]); ?>
- Le fichier de sauvegarde est généré dans le dossier Backup du gestionnaire de fichiers. + L'archive est générée dans le dossier Backup du gestionnaire de fichiers.
diff --git a/core/vendor/zwiico/img/ajax-loader.gif b/core/vendor/zwiico/img/ajax-loader.gif deleted file mode 100755 index d0bce1542342e912da81a2c260562df172f30d73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nnmm28Kh24mmkF0U1e2Nli^nlO|14{Lk&@8WQa67~pE8 zXTZz|lvDgC+Z`3#dv5h=E26FfcG1 zbL_hF&)}42ws10s6^G;;cE1^EoUR)U5A70}d2pLv!jVIT7j&Z~EblI3x0K*v_sV|m z0kj3v921Z^em#l`(k(o@H$3ZdDRc@9NidXDNbqrumReCGv$gd8+e8WW28HVqkJ_9i zH>s*<31KtHjANIPvi2#*6BEu%3Dak5O_t&NBI)H?V$TxT}#l{vOTn5naXTfF^&~Hhq+NX@#Ccc>y7T?;vjI&jdhsDsPJyAw*m0Qz>i}K7# zL9w50Ng{fT}A5JUe8lRK1h7_Y2;BWJDd=c6f&i?Wv5(5q?6|P zQw{>maxZP<537OA37Uk}7@%_$4o$EWe_Zl>&#id|lE-BpDC#+Fn|msJ%_2h{Hg1vP z#N8WAzfWasG}yq|xqE)DrWaOofX=z|?*pgc%{ig5vl!pqDlC|q&~Z0$&Rvsft&VO- z4MZj+%-+Vx%W}v;V76hyp=;+R;x+~t^Q%*xuFTQAF2})fSfTHDAs>sO!OBw`)&)o$ c0!CNZt))x~rAZP^^P&YOFfdqy5)K#u0POD40{{R3 diff --git a/core/vendor/zwiico/img/ajax-loader.png b/core/vendor/zwiico/img/ajax-loader.png new file mode 100644 index 0000000000000000000000000000000000000000..62b215f30686041afff8857490a0c95461a786ff GIT binary patch literal 8529 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 literal 0 HcmV?d00001 From c38c8b86940411e639aaf8637594224d48e9a8d7 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 12:00:29 +0200 Subject: [PATCH 09/44] Gestion d'erreur --- core/module/config/config.php | 17 +++++++---------- core/module/config/view/backup/backup.js.php | 8 ++++++-- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/core/module/config/config.php b/core/module/config/config.php index e0f5da66..07881941 100755 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -246,22 +246,19 @@ class config extends common { // Creation du ZIP $filter = $this->getInput('configBackupOption',helper::FILTER_BOOLEAN) === true ? ['backup','tmp'] : ['backup','tmp','file']; $fileName = helper::autoBackup(self::TEMP_DIR,$filter); + // Créer le répertoire manquant if (!is_dir(self::FILE_DIR.'source/backup')) { mkdir(self::FILE_DIR.'source/backup'); } - copy (self::TEMP_DIR . $fileName , self::FILE_DIR.'source/backup/' . $fileName); - - /*// Téléchargement du ZIP // NE marche pas avec le spinner - header('Content-Type: application/zip'); - header('Content-Disposition: attachment; filename="' . $fileName . '"'); - header('Content-Length: ' . filesize(self::TEMP_DIR . $fileName)); - readfile(self::TEMP_DIR . $fileName); + // Copie dans les fichiers + $success = copy (self::TEMP_DIR . $fileName , self::FILE_DIR.'source/backup/' . $fileName); + // Détruire le temporaire + unlink(self::TEMP_DIR . $fileName); // Valeurs en sortie $this->addOutput([ - 'display' => self::DISPLAY_RAW + 'display' => self::DISPLAY_JSON, + 'content' => json_encode($success) ]); - */ - unlink(self::TEMP_DIR . $fileName); } else { // Valeurs en sortie $this->addOutput([ diff --git a/core/module/config/view/backup/backup.js.php b/core/module/config/view/backup/backup.js.php index 0f33f90e..5a3d7dac 100755 --- a/core/module/config/view/backup/backup.js.php +++ b/core/module/config/view/backup/backup.js.php @@ -19,9 +19,13 @@ $( document).ready(function() { type: "POST", url: url, data: $("form").serialize(), - complete: function(r, s){ + success: function(data){ $("body").removeClass("loading"); - core.alert("Processus terminé : la sauvegarde a été générée."); + core.alert("La sauvegarde a été générée avec succès."); + }, + error: function(data){ + $("body").removeClass("loading"); + core.alert("Une erreur s'est produite, la sauvegarde n'a pas été générée !"); } }); }); From 30542b157b65f871ce9d8c67cf8184453a096d2e Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 12:13:15 +0200 Subject: [PATCH 10/44] Changes --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index f179a697..bf8f84c5 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,8 @@ ## version 10.2.07 - Correction : - Bloquage de l'incrémentation de l'id de page lorsque deux pages ont le même nom. +- Modification : + - Configuration: Sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur. ## version 10.2.06 - Corrections : From 065c8832cb5a644fcb3a963621cfe235b4686588 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 12:14:03 +0200 Subject: [PATCH 11/44] Changes --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index bf8f84c5..0d67ec6c 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,7 +4,7 @@ - Correction : - Bloquage de l'incrémentation de l'id de page lorsque deux pages ont le même nom. - Modification : - - Configuration: Sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur. + - Configuration: sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur. ## version 10.2.06 - Corrections : From 8b4775967d9a2bc800ebf3b16dd54738d91fc995 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 15:53:20 +0200 Subject: [PATCH 12/44] Image du loader --- core/vendor/zwiico/img/ajax-loader.png | Bin 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 core/vendor/zwiico/img/ajax-loader.png diff --git a/core/vendor/zwiico/img/ajax-loader.png b/core/vendor/zwiico/img/ajax-loader.png old mode 100644 new mode 100755 From c933abefc233fb83fe204767d0a46e1f49e8e8bd Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 15:53:30 +0200 Subject: [PATCH 13/44] =?UTF-8?q?optimisation=20d'=C3=A9criture?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/form/form.php | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/module/form/form.php b/module/form/form.php index 2784ebdf..b419f074 100755 --- a/module/form/form.php +++ b/module/form/form.php @@ -71,12 +71,6 @@ class form extends common { // Soumission du formulaire if($this->isPost()) { // Configuration - // Option sélectionnée sans page choisie - $pageId = ''; - if ($this->getInput('formConfigPageId') !== "") { - // Option désactivée, réinitialiser l'id de la page sélectionnée. - $pageId = $this->getInput('formConfigPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formConfigPageId', helper::FILTER_ID) : ''; - } $this->setData([ 'module', $this->getUrl(0), @@ -87,7 +81,7 @@ class form extends common { 'group' => $this->getInput('formConfigGroup', helper::FILTER_INT), 'user' => self::$listUsers [$this->getInput('formConfigUser', helper::FILTER_INT)], 'mail' => $this->getInput('formConfigMail') , - 'pageId' => $pageId, + 'pageId' => $this->getInput('formConfigPageIdToggle', helper::FILTER_BOOLEAN) === true ? $this->getInput('formConfigPageId', helper::FILTER_ID) : '', 'subject' => $this->getInput('formConfigSubject'), 'replyto' => $this->getInput('formConfigMailReplyTo', helper::FILTER_BOOLEAN) ] From 5a9e7405e0ab21b11991ca3077c8e0d290f9bdb2 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 16:35:03 +0200 Subject: [PATCH 14/44] Cookie authentification : samesite = strict | remember me ok --- CHANGES.md | 4 +++- core/module/install/view/index/index.php | 4 ++-- core/module/user/user.php | 14 ++++++++++---- core/module/user/view/login/login.php | 7 +++---- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 0d67ec6c..f60de150 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,8 +3,10 @@ ## version 10.2.07 - Correction : - Bloquage de l'incrémentation de l'id de page lorsque deux pages ont le même nom. -- Modification : + - Login : l'option "Se souvenir de moi" est fonctionnelle. +- Modifications : - Configuration: sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur. + - Cookies d'authentification : option samesite sur Strict ## version 10.2.06 - Corrections : diff --git a/core/module/install/view/index/index.php b/core/module/install/view/index/index.php index 74677c5a..6debdbf3 100755 --- a/core/module/install/view/index/index.php +++ b/core/module/install/view/index/index.php @@ -20,7 +20,7 @@
'off', - 'label' => 'Adresse mail' + 'label' => 'Adresse mail' ]); ?>
@@ -41,7 +41,7 @@ true ]); - ?> + ?>
diff --git a/core/module/user/user.php b/core/module/user/user.php index 4ab38f8f..3dba717c 100755 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -24,8 +24,11 @@ class user extends common { 'logout' => self::GROUP_MEMBER, 'reset' => self::GROUP_VISITOR ]; + public static $users = []; + public static $userId = ''; + /** * Ajout */ @@ -373,7 +376,7 @@ class user extends common { */ } else { // Cas 4 : le délai de blocage est dépassé et le compte est au max - Réinitialiser - if ($this->getData(['user',$userId,'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) < time() + if ($this->getData(['user',$userId,'connectTimeout']) + $this->getData(['config', 'connect', 'timeout']) < time() AND $this->getData(['user',$userId,'connectFail']) === $this->getData(['config', 'connect', 'attempt']) ) { $this->setData(['user',$userId,'connectFail',0 ]); $this->setData(['user',$userId,'connectTimeout',0 ]); @@ -388,8 +391,8 @@ class user extends common { ) { // Expiration $expire = $this->getInput('userLoginLongTime') ? strtotime("+1 year") : 0; - setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false), '', helper::isHttps(), true); - setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false), '', helper::isHttps(), true); + setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false) . '; samesite=strict' , '', helper::isHttps(), true); + setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false) . '; samesite=strict', '', helper::isHttps(), true); // Accès multiples avec le même compte $this->setData(['user',$userId,'accessCsrf',$_SESSION['csrf']]); // Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur @@ -442,6 +445,9 @@ class user extends common { } } } + if (!empty($_COOKIE['ZWII_USER_ID'])) { + self::$userId = $_COOKIE['ZWII_USER_ID']; + } // Valeurs en sortie $this->addOutput([ 'display' => self::DISPLAY_LAYOUT_LIGHT, @@ -454,7 +460,7 @@ class user extends common { * Déconnexion */ public function logout() { - helper::deleteCookie('ZWII_USER_ID'); + // Ne pas effacer l'identifiant mais seulement le mot de passe helper::deleteCookie('ZWII_USER_PASSWORD'); session_destroy(); // Valeurs en sortie diff --git a/core/module/user/view/login/login.php b/core/module/user/view/login/login.php index a25c0529..bce31c82 100755 --- a/core/module/user/view/login/login.php +++ b/core/module/user/view/login/login.php @@ -2,7 +2,8 @@
'Identifiant' + 'label' => 'Identifiant', + 'value' => $module::$userId ]); ?>
@@ -13,9 +14,7 @@
- 'La session est close à la fermeture du navigateur.' - ]); ?> +
From 38e05f011556ec71e06a76931742f40342ba1b5e Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 17:58:13 +0200 Subject: [PATCH 15/44] reverse samesite=strict --- CHANGES.md | 1 - core/module/user/user.php | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index f60de150..7e948cf4 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -6,7 +6,6 @@ - Login : l'option "Se souvenir de moi" est fonctionnelle. - Modifications : - Configuration: sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur. - - Cookies d'authentification : option samesite sur Strict ## version 10.2.06 - Corrections : diff --git a/core/module/user/user.php b/core/module/user/user.php index 3dba717c..84d27e15 100755 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -391,8 +391,8 @@ class user extends common { ) { // Expiration $expire = $this->getInput('userLoginLongTime') ? strtotime("+1 year") : 0; - setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false) . '; samesite=strict' , '', helper::isHttps(), true); - setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false) . '; samesite=strict', '', helper::isHttps(), true); + setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false) , '', helper::isHttps(), true); + setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false), '', helper::isHttps(), true); // Accès multiples avec le même compte $this->setData(['user',$userId,'accessCsrf',$_SESSION['csrf']]); // Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur From 9ab2e0eefd553af0cdbeba9520b83e45a9dd5854 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 18:10:36 +0200 Subject: [PATCH 16/44] =?UTF-8?q?Num=C3=A9ro=20de=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.php b/core/core.php index c7e34b24..219210ef 100755 --- a/core/core.php +++ b/core/core.php @@ -39,7 +39,7 @@ class common { const ACCESS_TIMER = 1800; // Numéro de version - const ZWII_VERSION = '10.2.06'; + const ZWII_VERSION = '10.2.07'; const ZWII_UPDATE_CHANNEL = "v10"; public static $actions = []; From 7c956dd919512bb2fad71a8fa98ce3a771bda59b Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 18:11:49 +0200 Subject: [PATCH 17/44] Soumission unique --- core/module/config/view/backup/backup.js.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/module/config/view/backup/backup.js.php b/core/module/config/view/backup/backup.js.php index 5a3d7dac..cf101faf 100755 --- a/core/module/config/view/backup/backup.js.php +++ b/core/module/config/view/backup/backup.js.php @@ -12,6 +12,7 @@ $( document).ready(function() { $("#configBackupForm").submit( function(e){ + $("#configBackupSubmit").addClass("disabled").prop("disabled", true); e.preventDefault(); $("body").addClass("loading"); var url = "getUrl(0); ?>/backup"; @@ -26,6 +27,9 @@ $( document).ready(function() { error: function(data){ $("body").removeClass("loading"); core.alert("Une erreur s'est produite, la sauvegarde n'a pas été générée !"); + }, + complete: function(){ + $("#configBackupSubmit").removeClass("disabled").prop("disabled", false); } }); }); From 74787dffbc5a9d1f6e85678b0b1e5f6084809fe8 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 18:32:16 +0200 Subject: [PATCH 18/44] Message d'attente --- core/module/config/view/backup/backup.css | 30 +++++++++++++------- core/module/config/view/backup/backup.js.php | 2 ++ core/module/config/view/backup/backup.php | 2 +- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/core/module/config/view/backup/backup.css b/core/module/config/view/backup/backup.css index 6b4e29e1..bf1dfa91 100755 --- a/core/module/config/view/backup/backup.css +++ b/core/module/config/view/backup/backup.css @@ -23,27 +23,35 @@ for themselves. Background we set to 80% white with our animation centered, and no-repeating */ .modal { -display: none; - position: fixed; - z-index: 1000; - top: 0; - left: 0; - height: 100%; - width: 100%; - background: rgba( 0, 0, 0, .9 ) + display: none; + position: fixed; + z-index: 1000; + top: 0; + left: 0; + height: 100%; + width: 100%; + background: rgba( 0, 0, 0, .9 ) url('core/vendor/zwiico/img/ajax-loader.png') - 50% 50% + 50% 45% no-repeat; } + +.alertMessage { + color: lightgrey; + display: none; + display: flex; + align-items: center; + justify-content: center; +} /* When the body has the loading class, we turn the scrollbar off with overflow:hidden */ - body.loading .modal { + body.loading .modal .alertMessage { overflow: hidden; } /* Anytime the body has the loading class, our modal element will be visible */ - body.loading .modal { + body.loading .modal .alertMessage { display: block; } \ No newline at end of file diff --git a/core/module/config/view/backup/backup.js.php b/core/module/config/view/backup/backup.js.php index cf101faf..d3325d2c 100755 --- a/core/module/config/view/backup/backup.js.php +++ b/core/module/config/view/backup/backup.js.php @@ -15,6 +15,7 @@ $( document).ready(function() { $("#configBackupSubmit").addClass("disabled").prop("disabled", true); e.preventDefault(); $("body").addClass("loading"); + $(".modal").addClass("alertMessage"); var url = "getUrl(0); ?>/backup"; $.ajax({ type: "POST", @@ -30,6 +31,7 @@ $( document).ready(function() { }, complete: function(){ $("#configBackupSubmit").removeClass("disabled").prop("disabled", false); + $(".modal").removeClass("alertMessage"); } }); }); diff --git a/core/module/config/view/backup/backup.php b/core/module/config/view/backup/backup.php index 8c35a2c7..89a7e0a1 100755 --- a/core/module/config/view/backup/backup.php +++ b/core/module/config/view/backup/backup.php @@ -13,7 +13,7 @@ 'value' => 'Sauvegarder' ]); ?>
- +
From a670fa4e5dc1f0ba0c737aadda897413341542cf Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 18:59:43 +0200 Subject: [PATCH 19/44] Backup name = base Url --- core/class/helper.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/class/helper.class.php b/core/class/helper.class.php index ffe6c1ad..86649506 100755 --- a/core/class/helper.class.php +++ b/core/class/helper.class.php @@ -98,7 +98,9 @@ class helper { public static function autoBackup($folder, $filter = ['backup','tmp'] ) { // Creation du ZIP - $fileName = 'ZwiiCMS-backup'. date('Y-m-d-h-i-s', time()) . '.zip'; + $baseName = str_replace('/','',helper::baseUrl(false,false)); + $baseName = empty($baseName) ? 'ZwiiCMS' : $baseName; + $fileName = $baseName . '-backup-' . date('Y-m-d-h-i-s', time()) . '.zip'; $zip = new ZipArchive(); $zip->open($folder . $fileName, ZipArchive::CREATE | ZipArchive::OVERWRITE); $directory = 'site/'; From d31cedb23ec74aa92397c3b71e9fb11bfa11b42f Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Sun, 9 Aug 2020 19:16:39 +0200 Subject: [PATCH 20/44] Menu : classe active --- CHANGES.md | 4 +++- core/core.php | 16 ++++++++-------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 7e948cf4..f8139854 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,8 +4,10 @@ - Correction : - Bloquage de l'incrémentation de l'id de page lorsque deux pages ont le même nom. - Login : l'option "Se souvenir de moi" est fonctionnelle. + - Menu : déplacement de la classe "active". - Modifications : - - Configuration: sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur. + - Configuration : sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur. + - Configuration : le nom de l'archive prend le nom du sous-domaine s'il existe. ## version 10.2.06 - Corrections : diff --git a/core/core.php b/core/core.php index 219210ef..8f83cace 100755 --- a/core/core.php +++ b/core/core.php @@ -2258,7 +2258,7 @@ class layout extends common { foreach($this->getHierarchy() as $parentPageId => $childrenPageIds) { // Passer les entrées masquées // Propriétés de l'item - $active = ($parentPageId === $currentPageId OR in_array($currentPageId, $childrenPageIds)) ? ' class="active"' : ''; + $active = ($parentPageId === $currentPageId OR in_array($currentPageId, $childrenPageIds)) ? 'active ' : ''; $targetBlank = $this->getData(['page', $parentPageId, 'targetBlank']) ? ' target="_blank"' : ''; // Mise en page de l'item $items .= '
  • '; @@ -2268,7 +2268,7 @@ class layout extends common { {$items .= ''; } else { - $items .= ''; + $items .= ''; } switch ($this->getData(['page', $parentPageId, 'typeMenu'])) { @@ -2314,7 +2314,7 @@ class layout extends common { $items .= '
  • - - + $module::$userLongtime + ]); ?>
    Mot de passe perdu ? From 9c46c227d06c18fbccea9211e095eeee89404c4e Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Mon, 10 Aug 2020 09:16:28 +0200 Subject: [PATCH 23/44] remember me true value --- core/module/user/user.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/module/user/user.php b/core/module/user/user.php index 1870c2bf..b9e8a124 100755 --- a/core/module/user/user.php +++ b/core/module/user/user.php @@ -393,9 +393,10 @@ class user extends common { ) { // Expiration $expire = $this->getInput('userLoginLongTime') ? strtotime("+1 year") : 0; + $c = $this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN) === true ? 'true' : 'false'; setcookie('ZWII_USER_ID', $userId, $expire, helper::baseUrl(false, false) , '', helper::isHttps(), true); setcookie('ZWII_USER_PASSWORD', $this->getData(['user', $userId, 'password']), $expire, helper::baseUrl(false, false), '', helper::isHttps(), true); - setcookie('ZWII_USER_LONGTIME', $this->getInput('userLoginLongTime', helper::FILTER_BOOLEAN), $expire, helper::baseUrl(false, false), '', helper::isHttps(), true); + setcookie('ZWII_USER_LONGTIME', $c, $expire, helper::baseUrl(false, false), '', helper::isHttps(), true); // Accès multiples avec le même compte $this->setData(['user',$userId,'accessCsrf',$_SESSION['csrf']]); // Valeurs en sortie lorsque le site est en maintenance et que l'utilisateur n'est pas administrateur @@ -452,7 +453,7 @@ class user extends common { self::$userId = $_COOKIE['ZWII_USER_ID']; } if (!empty($_COOKIE['ZWII_USER_LONGTIME'])) { - self::$userLongtime = $_COOKIE['ZWII_USER_LONGTIME'] == '1' ? true : false; + self::$userLongtime = $_COOKIE['ZWII_USER_LONGTIME'] == 'true' ? true : false; } // Valeurs en sortie $this->addOutput([ @@ -467,7 +468,7 @@ class user extends common { */ public function logout() { // Ne pas effacer l'identifiant mais seulement le mot de passe - if ($_COOKIE['ZWII_USER_LONGTIME'] !== '1' ) { + if ($_COOKIE['ZWII_USER_LONGTIME'] !== 'true' ) { helper::deleteCookie('ZWII_USER_ID'); helper::deleteCookie('ZWII_USER_LONGTIME'); } From bf1819fc741e664da66de8e43df199c73e9f4301 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Mon, 10 Aug 2020 13:30:48 +0200 Subject: [PATCH 24/44] Ajustements --- core/module/config/view/backup/backup.php | 4 ++-- core/module/install/ressource/defaultdata.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/module/config/view/backup/backup.php b/core/module/config/view/backup/backup.php index 89a7e0a1..8e244b47 100755 --- a/core/module/config/view/backup/backup.php +++ b/core/module/config/view/backup/backup.php @@ -16,14 +16,14 @@
    -
    +

    Paramètre

    true, - 'help' => 'Lorsque le contenu du gestionnaire de fichiers est très volumineux une copie par FTP est préférable.' + 'help' => 'Si le contenu du gestionnaire de fichiers est très volumineux, mieux vaut une copie par FTP.' ]); ?>
    diff --git a/core/module/install/ressource/defaultdata.php b/core/module/install/ressource/defaultdata.php index 4a9cf666..f0b3d7a9 100755 --- a/core/module/install/ressource/defaultdata.php +++ b/core/module/install/ressource/defaultdata.php @@ -112,7 +112,7 @@ class init extends common { 'template' => '3' ], 'header' => [ - 'backgroundColor' => 'rgba(255, 255, 255, 1)', + 'backgroundColor' => 'rgba(32, 59, 82, 1)', 'font' => 'Oswald', 'fontSize' => '2em', 'fontWeight' => 'normal', @@ -123,7 +123,7 @@ class init extends common { 'margin' => false, 'position' => 'site', 'textAlign' => 'center', - 'textColor' => 'rgba(0, 17, 157, 1)', + 'textColor' => 'rgba(255, 255, 255, 1)', 'textHide' => false, 'textTransform' => 'none', 'linkHomePage' => true, From e94cb81b24593889899c43576567d25b4d12a0b9 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Mon, 10 Aug 2020 19:07:17 +0200 Subject: [PATCH 25/44] Captcha en lettres + correction du nom : capcha en captcha --- core/class/template.class.php | 16 +++++++++------- core/module/install/ressource/defaultdata.php | 2 +- module/blog/blog.php | 6 +++--- module/blog/view/article/article.php | 2 +- module/form/form.php | 10 +++++----- module/form/view/config/config.php | 4 ++-- module/form/view/index/index.php | 4 ++-- 7 files changed, 23 insertions(+), 21 deletions(-) diff --git a/core/class/template.class.php b/core/class/template.class.php index d3cc78bf..63a9ca6c 100755 --- a/core/class/template.class.php +++ b/core/class/template.class.php @@ -33,12 +33,12 @@ class template { } /** - * Crée un champ capcha + * Crée un champ captcha * @param string $nameId Nom et id du champ * @param array $attributes Attributs ($key => $value) * @return string */ - public static function capcha($nameId, array $attributes = []) { + public static function captcha($nameId, array $attributes = []) { // Attributs par défaut $attributes = array_merge([ 'class' => '', @@ -48,13 +48,15 @@ class template { 'name' => $nameId, 'value' => '' ], $attributes); - // Génère deux nombres pour le capcha - $firstNumber = mt_rand(1, 15); - $secondNumber = mt_rand(1, 15); + // Génère deux nombres pour le captcha + $numbers=array(0,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20); + $letters=array('zéro','un','deux','trois','quatre','cinq','six','sept','huit','neuf','dix','onze','douze','treize','quatorze','quinze','seize','dix-sept','dix-huit','dix-neuf','vingt'); + $firstNumber=rand ( 0 , count($letters)-1 ); + $secondNumber=rand ( 0 , count($letters)-1 ); // Début du wrapper $html = '
    '; // Label - $html .= self::label($attributes['id'], $firstNumber . ' + ' . $secondNumber . ' = ?', [ + $html .= self::label($attributes['id'], $letters[$firstNumber] . ' + ' . $letters[$secondNumber] . ' = ? (réponse en chiffres)', [ 'help' => $attributes['help'] ]); // Notice @@ -64,7 +66,7 @@ class template { $attributes['class'] .= ' notice'; } $html .= self::notice($attributes['id'], $notice); - // Capcha + // captcha $html .= sprintf( '', helper::sprintAttributes($attributes) diff --git a/core/module/install/ressource/defaultdata.php b/core/module/install/ressource/defaultdata.php index f0b3d7a9..5e7397a1 100755 --- a/core/module/install/ressource/defaultdata.php +++ b/core/module/install/ressource/defaultdata.php @@ -632,7 +632,7 @@ class init extends common { 'contact' => [ 'config' => [ 'button' => '', - 'capcha' => true, + 'captcha' => true, 'group' => self::GROUP_ADMIN, 'pageId' => '', 'subject' => '' diff --git a/module/blog/blog.php b/module/blog/blog.php index 67f3a7e5..0709be0f 100755 --- a/module/blog/blog.php +++ b/module/blog/blog.php @@ -339,12 +339,12 @@ class blog extends common { else { // Soumission du formulaire if($this->isPost()) { - // Check la capcha + // Check la captcha if( $this->getUser('password') !== $this->getInput('ZWII_USER_PASSWORD') - AND $this->getInput('blogArticleCapcha', helper::FILTER_INT) !== $this->getInput('blogArticleCapchaFirstNumber', helper::FILTER_INT) + $this->getInput('blogArticleCapchaSecondNumber', helper::FILTER_INT)) + AND $this->getInput('blogArticlecaptcha', helper::FILTER_INT) !== $this->getInput('blogArticlecaptchaFirstNumber', helper::FILTER_INT) + $this->getInput('blogArticlecaptchaSecondNumber', helper::FILTER_INT)) { - self::$inputNotices['blogArticleCapcha'] = 'Incorrect'; + self::$inputNotices['blogArticlecaptcha'] = 'Incorrect'; } // Crée le commentaire $commentId = helper::increment(uniqid(), $this->getData(['module', $this->getUrl(0), $this->getUrl(1), 'comment'])); diff --git a/module/blog/view/article/article.php b/module/blog/view/article/article.php index e3386281..8ce7acb4 100755 --- a/module/blog/view/article/article.php +++ b/module/blog/view/article/article.php @@ -75,7 +75,7 @@ getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')): ?>
    - +
    diff --git a/module/form/form.php b/module/form/form.php index b419f074..3332afc6 100755 --- a/module/form/form.php +++ b/module/form/form.php @@ -77,7 +77,7 @@ class form extends common { 'config', [ 'button' => $this->getInput('formConfigButton'), - 'capcha' => $this->getInput('formConfigCapcha', helper::FILTER_BOOLEAN), + 'captcha' => $this->getInput('formConfigcaptcha', helper::FILTER_BOOLEAN), 'group' => $this->getInput('formConfigGroup', helper::FILTER_INT), 'user' => self::$listUsers [$this->getInput('formConfigUser', helper::FILTER_INT)], 'mail' => $this->getInput('formConfigMail') , @@ -279,12 +279,12 @@ class form extends common { public function index() { // Soumission du formulaire if($this->isPost()) { - // Check la capcha + // Check la captcha if( - $this->getData(['module', $this->getUrl(0), 'config', 'capcha']) - AND $this->getInput('formCapcha', helper::FILTER_INT) !== $this->getInput('formCapchaFirstNumber', helper::FILTER_INT) + $this->getInput('formCapchaSecondNumber', helper::FILTER_INT)) + $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) + AND $this->getInput('formcaptcha', helper::FILTER_INT) !== $this->getInput('formcaptchaFirstNumber', helper::FILTER_INT) + $this->getInput('formcaptchaSecondNumber', helper::FILTER_INT)) { - self::$inputNotices['formCapcha'] = 'Incorrect'; + self::$inputNotices['formcaptcha'] = 'Incorrect'; } // Préparation le contenu du mail diff --git a/module/form/view/config/config.php b/module/form/view/config/config.php index 47ada59d..7eae904c 100755 --- a/module/form/view/config/config.php +++ b/module/form/view/config/config.php @@ -142,8 +142,8 @@ ]); ?>
    - $this->getData(['module', $this->getUrl(0), 'config', 'capcha']) + $this->getData(['module', $this->getUrl(0), 'config', 'captcha']) ]); ?>
    diff --git a/module/form/view/index/index.php b/module/form/view/index/index.php index 4fe54a9a..e1dc4422 100755 --- a/module/form/view/index/index.php +++ b/module/form/view/index/index.php @@ -43,10 +43,10 @@ - getData(['module', $this->getUrl(0), 'config', 'capcha'])): ?> + getData(['module', $this->getUrl(0), 'config', 'captcha'])): ?>
    - +
    From ac15324da5c516f543043143dd222e3987401d19 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Mon, 10 Aug 2020 19:39:39 +0200 Subject: [PATCH 26/44] changes --- CHANGES.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index f8139854..56652276 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,13 +1,15 @@ # Changelog ## version 10.2.07 -- Correction : +- Corrections : - Bloquage de l'incrémentation de l'id de page lorsque deux pages ont le même nom. - Login : l'option "Se souvenir de moi" est fonctionnelle. - Menu : déplacement de la classe "active". - Modifications : - Configuration : sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur. - Configuration : le nom de l'archive prend le nom du sous-domaine s'il existe. + - Captcha : correction du nom de la fonction (capcha en captcha). + - Captcha : addition présentée en lettres, réponse en chiffres. ## version 10.2.06 - Corrections : From 8ee8229e3f23160f48f362e2c6638af3ab446755 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 11 Aug 2020 08:25:41 +0200 Subject: [PATCH 27/44] =?UTF-8?q?Bug=20bouton=20bouton=20=C3=A9diter=20ave?= =?UTF-8?q?c=20cookie=20persistant?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module/blog/view/article/article.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/module/blog/view/article/article.php b/module/blog/view/article/article.php index 8ce7acb4..4c24f23e 100755 --- a/module/blog/view/article/article.php +++ b/module/blog/view/article/article.php @@ -6,8 +6,12 @@ à getData(['module', $this->getUrl(0), $this->getUrl(1), 'publishedOn']))); ?>
    - getUser('group') >= self::GROUP_ADMIN): ?> + getUser('group') >= self::GROUP_ADMIN + AND $this->getUser('password') === $this->getInput('ZWII_USER_PASSWORD') + ): ?>
    + getUser('group'); ?> helper::baseUrl() . $this->getUrl(0) . '/edit/' . $this->getUrl(1) . '/' . $_SESSION['csrf'], 'value' => 'Editer' From 53bb2efeff36636ea0243dcf38dccbad79fd9bce Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 11 Aug 2020 16:03:48 +0200 Subject: [PATCH 28/44] captcha lettres --- core/class/template.class.php | 15 ++++++++------- core/layout/common.css | 7 +++++++ core/vendor/zwiico/png/a.png | Bin 0 -> 4990 bytes core/vendor/zwiico/png/b.png | Bin 0 -> 11963 bytes core/vendor/zwiico/png/c.png | Bin 0 -> 8777 bytes core/vendor/zwiico/png/d.png | Bin 0 -> 5597 bytes core/vendor/zwiico/png/e.png | Bin 0 -> 3060 bytes core/vendor/zwiico/png/f.png | Bin 0 -> 4325 bytes core/vendor/zwiico/png/g.png | Bin 0 -> 13801 bytes core/vendor/zwiico/png/h.png | Bin 0 -> 3689 bytes core/vendor/zwiico/png/i.png | Bin 0 -> 4120 bytes core/vendor/zwiico/png/j.png | Bin 0 -> 7297 bytes core/vendor/zwiico/png/k.png | Bin 0 -> 2199 bytes core/vendor/zwiico/png/l.png | Bin 0 -> 3693 bytes core/vendor/zwiico/png/m.png | Bin 0 -> 1876 bytes core/vendor/zwiico/png/n.png | Bin 0 -> 3680 bytes core/vendor/zwiico/png/o.png | Bin 0 -> 2654 bytes core/vendor/zwiico/png/p.png | Bin 0 -> 3051 bytes core/vendor/zwiico/png/q.png | Bin 0 -> 5051 bytes core/vendor/zwiico/png/r.png | Bin 0 -> 6898 bytes core/vendor/zwiico/png/s.png | Bin 0 -> 4363 bytes core/vendor/zwiico/png/t.png | Bin 0 -> 2152 bytes core/vendor/zwiico/png/u.png | Bin 0 -> 3218 bytes 23 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 core/vendor/zwiico/png/a.png create mode 100644 core/vendor/zwiico/png/b.png create mode 100644 core/vendor/zwiico/png/c.png create mode 100644 core/vendor/zwiico/png/d.png create mode 100644 core/vendor/zwiico/png/e.png create mode 100644 core/vendor/zwiico/png/f.png create mode 100644 core/vendor/zwiico/png/g.png create mode 100644 core/vendor/zwiico/png/h.png create mode 100644 core/vendor/zwiico/png/i.png create mode 100644 core/vendor/zwiico/png/j.png create mode 100644 core/vendor/zwiico/png/k.png create mode 100644 core/vendor/zwiico/png/l.png create mode 100644 core/vendor/zwiico/png/m.png create mode 100644 core/vendor/zwiico/png/n.png create mode 100644 core/vendor/zwiico/png/o.png create mode 100644 core/vendor/zwiico/png/p.png create mode 100644 core/vendor/zwiico/png/q.png create mode 100644 core/vendor/zwiico/png/r.png create mode 100644 core/vendor/zwiico/png/s.png create mode 100644 core/vendor/zwiico/png/t.png create mode 100644 core/vendor/zwiico/png/u.png diff --git a/core/class/template.class.php b/core/class/template.class.php index 63a9ca6c..fa2aa7a3 100755 --- a/core/class/template.class.php +++ b/core/class/template.class.php @@ -49,16 +49,17 @@ class template { 'value' => '' ], $attributes); // Génère deux nombres pour le captcha - $numbers=array(0,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20); - $letters=array('zéro','un','deux','trois','quatre','cinq','six','sept','huit','neuf','dix','onze','douze','treize','quatorze','quinze','seize','dix-sept','dix-huit','dix-neuf','vingt'); - $firstNumber=rand ( 0 , count($letters)-1 ); - $secondNumber=rand ( 0 , count($letters)-1 ); + $numbers = array(0,1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,18,19,20); + $letters = array('u','t','s','r','q','p','o','n','m','l','k','j','i','h','g','f','e','d','c','b','a'); + $firstNumber = rand ( 0 , count($letters)-1 ); + $secondNumber = rand ( 0 , count($letters)-1 ); // Début du wrapper $html = '
    '; // Label - $html .= self::label($attributes['id'], $letters[$firstNumber] . ' + ' . $letters[$secondNumber] . ' = ? (réponse en chiffres)', [ - 'help' => $attributes['help'] - ]); + $html .= self::label($attributes['id'], + ' + = ? (réponse en chiffres)', [ + 'help' => $attributes['help'] + ]); // Notice $notice = ''; if(array_key_exists($attributes['id'], common::$inputNotices)) { diff --git a/core/layout/common.css b/core/layout/common.css index 884aa9f3..4b41e5ee 100755 --- a/core/layout/common.css +++ b/core/layout/common.css @@ -1358,4 +1358,11 @@ th.col12 { } .accordion-content { padding: 7px; +} + +/* Captcha +* Taille des images +*/ +.captchaNumber { + height:20px; } \ No newline at end of file diff --git a/core/vendor/zwiico/png/a.png b/core/vendor/zwiico/png/a.png new file mode 100644 index 0000000000000000000000000000000000000000..f4ef6eef104f7413ca4ad6dc756472971946ee06 GIT binary patch literal 4990 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 F{{XQNOr-z- literal 0 HcmV?d00001 diff --git a/core/vendor/zwiico/png/b.png b/core/vendor/zwiico/png/b.png new file mode 100644 index 0000000000000000000000000000000000000000..e14be925b1c0d99e6b58fe144a55367f443da1f1 GIT binary patch literal 11963 zcmW++2Rzm58$V=aQ%3f#Y?3{)XLbnLviII(?<6ZLBrD0a$;!&g-YePJA!PlZ^Y3== zr_Ocwo%em7?|PnSbyayhYzk}y0)eNfAft&uppe0zg|IN-zf`DBEbu~@jkL77qO>%f zv#Zlf8+%Ix;z3eCl9)or6RIv_gF@Ldd{07`@9G|vbgaLMpFNNYS7)pKZQ{B`#%H6T zX-I`W^(vG$_8BIb)eCAvbjgEToxLN9BeF`D#+uedEA1{4iwl19&9^R3c(n!-T%Js@ zGp0o0WbBj@`paT1V42@-CVq4xq@nW7&3~bzXR3*O=#Tj6#-@fV%PoJ@L-sMeSnp78 z-?34l{X6n{8k$i<(LK10bcc*nmT60ZWK@5T2BMNw2k*#7g-cQPI}F4`D2d8aJ=2c= zb9FC`dH>1Jd-bFG*Gkms z=SR7r+8cLS62z%Ixt8Lj? z_@vTq>htG&+frnKTy!^>s)O`Cf&6x-L|f4Jbav|KY~)G=io6yJJ%Qo+gfr;n{7*p%G5M!#5_Ra;lL;KK*B zxjH9#8ylM`cK3FCJ2#&KSv9d$%Wk?h*kXeA2AOP48*f?sVPQ2 zzPp2igIG8?p%b>@+N`qr`V{<5i*a#rxX0U56@x<}et+#nPv_mDqN3Wqh2tC!1zjg6 zm~)fApV}rOCy#noreoR>fv4Id=zIL&%wOEr&d%lf(g&ADlw46!5uY!U#~j1RcZ=D= z!eY948#M$G5)$IMf8OA>!EM%w<-3?I;zfAx-t8oX)hAV3V?`p1Z`ndWD-|+?5i+Fp zN3%V+i%m>KBqorS&Elc8F91{izSk}?4(Tr z{04gEI=n&G{&f*%WfQ+A^jsUVqPl)zzI0||V>|Lrl$Dh|b&p@^NxT!=^^5znTtVf< zSId6VqE_9qi7-Mb6_z_QbxyPm-iHkIVXsqDN&hvgurMON-_P|o6L{(2@tB7q9)HTQ zS?-fg*_e>q#`G6iWo4X7J$5DuiQLQMF*TWTojYX{N)!|nvnmyENyPA%ftQaOJa;K( z8a>!-Y;9fZ>%{#2*7I$aYO|X0XDY(`&!<|iWn*Guu;{}^HOnT5OSFH#ed)Eo$c)<| zXqZ@7cYk_x0FI^0Oj1khj=ONSasnkWF{-iglIOm9OG^v#f{}MNR;0$r!GXsp7x%>8 z{*!L2CDGlxGD5{1PzaY-SJ~G_1tULKdy_eHuhs`Mt?lj65YB>B1Gy4QYs~}MB4kwf zn541jas?y10XJtWiNn@>1S+i4mFAdPT~B#&rEh2io$3Dj@4wjqya>~s5A$$1h+y>x z)pNUhi_P1|r`X}BQ2O2VE-O$PJnoz7>4PufHzHVup?#uE7X@*6c!)rhXk#OyVq@JJ zS!N!a`6W`}7Yz<|eY4;-z4*Jkxzs9g>?@|tO7eGS=2p1W$V=accd_55q|o2LkGat3 z(eYj~l#qhL)=TyI^Ly}B^EMREpFfX^i<2=oXT-p#!b zIXBlA`yzw`wlxd_0%Rgydto|dg-Zm~!gquIjpb5xpB?4i#2p{I6G}N>p1EWRd-ScH zz;iG9?KfkVy4ufH-%jIv;d+)cv?0Q+V&GB0!JVPvnR|748934IK-Q^lrkfgdgA&t)}QD;||>A&MGYg=2}qx!xIOBIYf;Y=HQTA7!Ja$hY+royQCbxzLSlSj$DXwVuY zgN_T0Cv)6sH&;tHvewoQ8lfIdaU@t-u^+u0coG;G*c2Fa{>O4>v6&JhG{p7aB+ddU z8JAJ#`OyY7`2zgp12_+Q9-gE?E<&t>QDrWnxWjq3p^%}C(2iv~M#fur?yG)yGeRJ7 zX(Di)@yN>g{LdO@w_bN5Z6a;p8H(NHr^9+2bTl**xcJ>h)$K|TVd|7g3*HP};%}QH z1uiGQpP`|lwOR8?<*C2_`jsj=I+`wQdL${OQ?Iw%Q%p!2&IM{>dVS;fSP=p0ty?^n zeRs3O{76SeM%*2s@XyZAYx>uDO~0YRU!r6f4!lKeF#%P+eSDg!{^A8*l0ulz(Ru@w zG;504@#aXq$2Mu06n)|IfB>-w+Hk-<1>YiwENFNMFm%efrvapQc4Q7udlCIVGkQ>>R71{CAiYOhk=3NRiLVhiaYBd zBDl3x0t1gC49ZgLnO%P>2Z6TjvTK9)YLYzMV?;+JfuE>^m>4yi&L`_MeG9hF7w6~n zbacT#D(+6FvZk^>M-6#`2ze3=wN1ysfGRF7uAr*=al@`gU!hPFD_p9H ztc%33q%Q|PW;|ER8S2c;jOTW6icYnD`9f74`lo8svRStVL(!vwN5vHt@}{PF*xGbxWs|MZLWh=!@~1@x zb&h-i9R{oG>%Te(B*NNFf@kb8=)?A^eSCcCeNR}Qg$%xY)M>^;K}osG#8Ne5Uo=^p zYC9V`QXsz)PGjAFY)8YkJEw9KC0z9 zT2;BqRXNPnjtH@Ysmpo&9)D=q?3+?r^s?$6bTxMPH;%zsTl2$r4R9cg?CiL31z+^b zozp}IUA1fU@u0_Q^aIrH^sO8o3_Ke0&LY%pqEnV}Ivf;O8g6A|VA$l`#!Y5<`d?L@ zVCam!XL@=?%RlUF^s9d-9sOLbaU2GARa#thI?C@3i7^+U7Q za&hFQR!*k7g3Z1s|7nHzh~_MaE;hLJNS4~Nv9huv5WT&FJ({3(bCBr4Pra zraG+oUJY$93JKlw7pDaTab(`vZ@r-jI`228yNkW$*FI`LU+z@y^WHR)f>mLyZ5bsx*v@5)M~-q*;>lK7PcwubR~s z%heJk8H$l-+!{zO>iuOZE8yT~yMnUvHX&u#yT^84tVb9+ySu;j^hCx?*18baMkrM3 z#ig+63Qre66FqxIB1o0+B2LoMl3D!nK-!%JS&SgRkZ4!@dmTGb;<{eTPs#%=j!U}Qr(q=(|5Cts!JhFe)HxDmZY@wEdWLQpr9a7DbQ7K z-@a8JaxyZaIYA?mD%PGE9YqDA6txp@T13`jMFm%3hE(2{Oo=oaUNsj^4-b#kzq@ms z0rQoWmH2@dQBhb$*Ox+W>#rjsFe+9|Ja?v-dHJ8PruaUVd-?LCZgi}O=Z^DPd6i!1 ze#=Dyf=$LRl-Xp+S_Sz~srp2>@#bi2R5f3Y=dTL0m%Sg!m>$VvzB5cJ$h?|1wB zq6q`x{VV$Z!N2W_x(j^=jc0x*ztI7`^Q0s5f!sjx{d5*g7xrMy3H)dCyL8VQo-fg} z)DKi8uUrDv)^Sh{!^|CG;+3IB-^^jqUV*yW{6vTyu2*AAvgo~nmv(sX76$Hn3|oGgg*!k&qP|2ZT8ea*U}PgMn=Z4Z4F_xj06AMM%3-cl_zx72^eV3#`j0> zfqdLCIWYHdo=nL~N(!m2<|B`nBa|wpp`fPTeeYLWU2Ou@zd4|wrq*-3HCAae#!@uW zC2@Ih%OhD%R@QX#({q}hxTq))dzD9`)v1UD*@v`3u4vG0-baH1^lAMgRaRdLL8lDtHj3mejp%-&mtY0eja9c+u) zI61q+Zr}OhFvkxCJdnlXsA(LW@)ybfO^RL8+i8^Cn+h3 zT)>gaalRe}$hTl5YHy**k6H5SK0Ol?TA5DyHyp07!Q$PK zGtN)wa~THbM&nFgD3a`1Ya;Vbz?nVmyB|lazgP{?9Pce;Vhr96mvU|}{6|GZM5I@3 zO;ngXW8ZC+8!%Zy`V+2wWOz7uc2*zRX`peuug^CsotLGk#C-39E{_2C$?;jg2YucF zwE&$f>*&Zy%C3iiP5}pJ+LJ)-Sn09|`3K zb-w^WJeQv7>aIXHwP!lD*xV;oW+E1Orolu!vd{=+4FV+l_l%OV^5GKbP4EXDJ+wh_ zmzVychn;tjwjl6)jSNVEfs+#-jBi)9&6qVs;OX9iDSxI5pwZ<)2SL5}VgB5YnptQ}Av9U+$U?re=;jMh2h%8XU6EO6*&^-Oq(Z;?1QgkBEGGu zrIo!m3|i2#$nP^W&WDd5L0kX)*&Z4d9o;TZ8-NC$2N(=K5f##N1YJ!9NfwL*6TbTR zktIt!fC8$4FZQy$Zt+_xhk>Eo{(o|M2DhhPxZBuSynLBoT8a&>Oshy0ogU4_#pS1K z1M*R_gxnhI71>1LgFoQnic~G?0L6n_H4_H_|ILK^=XOPFcfM>aRUjj2YzZMfX{?Pu z&Ng#-MMb1hg}k=*+p%-42X_Id97Nn)QY!!D2167+LOg<$v|hLzthEZgP4W ztJ%nDLor!_Np)izETs3vZrzp@Fy&XUR``VvrsK>e6OvL>Ukdyv)+kU{R}UV{6fhrt zFRA_bE*2W6vIg`W{0@tVs1>SesjMUd^U;M={p$nw;>dYWNk~ZQotIHx4!%Pd&sCGX zdTcjo0)6`6;lp+2tpU;?$Hu{#d+d~r zVlQ_LY*XpBp~}Ro|2N{{ddO7v{G;L$Z5WwDCqhqR|6jI<~;W%q}L*!Pgz0X z{TqCPpMw^>d3ky5ob_sD6Tikww2%+87;w5!%agVw;x4=(He;`vB^Uw(u<|{L5fN-N z_Hl%)&#cm9XS&kb+WI|Ls|w4l4(_Og1V=BNx8ec+rY+5SIy&vkUy| z>#Qu54SMj)kF0)lzNVM9&LK+dsfzt(IY>iKPfr)tX2C1TngV$L-tTk|$pD~f=Azam z>`#JXyIj>2(;#i?0TiqBJ+Wnf(Rddi3~F7SH3bVB``f{CM^Z+HV*H!s<>jcDm{&3k zHo7c42X?4gDl7%D^Y_eAsPGm(8@7}qZ|n7ILU!X8swMv;JTPJ5tyjBFdX;AAEUH;i z0QJa691=UFLTX2_e7N^`(LfbK_Q9Ic#~JPXd%R@2HRvWFL!wagcA;i80BTrxxW1w_NOr zh;#>5VBzC`{JamE6|B;HgInZ!U1ejSg#}Xt0WCfpphkflcz&oAX(r;C67$*!?{Fy; zDXi{zN=(25Tq;3AuvJDA@3sa^9GH;^AmVX|d zS3k@zPwple1l#=j%^Orm%J>(H%bb!Zsf1j^Fa|5R;=w}$)Pr<{B;<8U3VNP;6nrrF zWwO#8fBH$J$~K&%!=+mfevVus&8~;2I$SMM$k*t{gDjRn=r~|@;Z{NOIg1jb@IYUm5`@WwQtC!Vd#@A6GE5AL3Y$$r*Mp6l%^`k7%N>eTV3L9dW>L#g!LcJD zBU^GCHiSDy`7Ymg$p+ZLPn_Y`O~L(h>JgI05s!OtDLF59FLFw{GqB(*JJ+}TcMUKjvt;V zLc9|&E!U;R&ZI!)|nyBwc%*r2gH z@JHW;EU`(GVWD~d+bXh&xsoOj3o9*U{rBH&cdkE(ESjT&ckkYDL*#55*D{5=3ZV#i z2M|P1t!I!3A1+7IGCX*I6^eoPtx!3wm@=zp#T3*l+#M1IA*SNx<;~)a0c{BA-E?Ah z;VQaG{?4yKJgpy?R}L;8Oq1vSVmz=M9eg7=kF(R(n|O2_(qT8$EuRbK7gNPMSx>1qI2)e2;^*SqtMJlWLQ+^@YP(m}P__CnO;WM{?ye3+JcI;rsL0OUsHv{Li$lsDtW@|d z1Yb`tasyCT`SAYXZ~*9G4#ZnfCGPx`Scgl*GkATPJd*D|07o-(Wu!sucRb;)DrjzKHb_? zkfIn#tnC81V#QQ4G(NBWG`FUn-e$GlTY*TOvXj!YgtDcL_4POZ{`roMj!J=#i&8Br z2oHB$YIzESuwH>Be`(@7cbZvAC;q`t3+-qIrh&mvFSv&9KqkGwl2H@3%*4@Q2)diI z9*HQ;5_f}D?Cke?Z>t#eYQOjQyZyU(^$Iod=$XF065@5U->I+Y)U!&k__8pHiiY=s zGH0d_BZP=Vzx<??7!nG(ZxR+}$Q9)AHTj)7ZagII z^2O9w#sy>E2F*dmAS8kupaBWUgYSV0u;DX>GV}er6CDmXwbxE7LgA5of`o=c)Tv97GD3%~$^@9q`nb}Z|nCdeeC&LYRceN^~ovwKkFN~LNLOjdAE&-L@itNbae_cCJ z#vv_05kI_r0s>F(i-~09*g#JvWeY9Iaux@&K~ECK0jxl~TJuo=B&uZaq63#aefm^; z<880SE~~P&fz6Le*TvZtUbl4>3X!(GFYGz~e|nd8e|c_T^oUo((7(17ilKSGZ zBKH-Bt41@th7Pv1Zd1do(3!3a~ZA*I=m9t55eu;^nuij}aXe?C~betDNN@D0>kL}Oy<~ScbVrIw^NcKe< z4GVVt>r&gG9C!KYBTQ%KF$8#dM-vney+w;k3+{7ejaXMdx~z)pGU0Z&?$xWvh)ql+ zc&o(x=FJ-*a19NOlwwdU^SfHY3yGX6;Y zZ&q4;?!Ax!rR+AfOo{d{5Qq;rIJ(|2D?=#qb7e((P8&SLaQ!O@3bz>`eJJ*AjekCX zc!v|Z#>?Q|99l3d^>CAWS(o3{BM`We$Xx)7Qz_7Y^lWTp9XL;`zAR|Z%rhG#LewYg z?97d<%9He?jUjm`E$W!|i;D{pd+Q&DyR{%XF*>+C`5tAcfJ$8m&C9s&qyd3!gWoCV z2~|z4MO}}9JB+6)*!L$UCL9f7p_=liwxheu=mAL?p_al-$wdg#>dIviuNRyB?!?Qj zm|S^bM3^ePe93Z;-#$H5esHpi->frAb%Wzi*tc&|iRSUtB9m;1OMnInGBRN=*htkD z8DM1q2Db_x9yJT+as?2l66a6YDq31vMvid_2uzjLfGME*D)b`(G$ zy?b@#JyX_vtKi90ZFCF_ltHkb*ydMx$3j&=ssNP(LnDxhkZ(?|C!Dgw*=B&=XMsN^)I!A{~0&Ocb(_YqaiTPYiO7$naTU~X<)aR2R9TL0^}G>yiie5 zg~d^4l2?D>>X)bTqaNwFMn^@_VG__Vy{wwq{%8%Uaiu|TICa_MA}$UNX1I|L0C`W} zC`0Hnbz19x?#e(K8!f{?4}37LseqR++;>co|`jg32q zRai|hQsl(#AO!!U$zbm!+Uw*3=Tmgbn4*Lnv1f>Qah4Pp)3K(+05^cflmZi{s#9U~ z6!AJH1{?VTA4PmelQSd?P3f$jctld)p$!(4kl(Y}Xur1oh5YbH^1FT0t zkk?+K@fl(RWWQgYAI-h>n4O=GgUNz#O-F5QZI!RHfoC09V_|Liv|bC}X+D+Pa=jxEj=GoXtz zn4PVSr!UQFS#XmZeomtla1>Z6d0rw9kl4^4^eR!@pZ57@$hel%$dMuEf_pk5I8 zjg^h<5Q50Io*qod``otHguV8%UNmUc_M>bInoK3BuyhpV2F8GAWn^WIN!l`DJwLJ} zM}q+xy)j@Xtm>u7O`bAQ^Hmvl{(ux$y*w$9-(QYY-0_EzQC7Tpm$x z?>488>Pz@H#4pKk`hkH{BG7l&N;+VK3_EEuasv9+5R4rbG`~n)x!4NaJATu_k8F{W zyD;9g33GCDdt^!;0Zzr14S1Xr#Bybo3zfKkdQO$y6ldCyu){208c}uac8dqj9L&)O z5uFyiL{eBKrKJq;QydMLs|1~Y26qHhry2sRLhZyVzk|HVqkeVtBbA%MkE!Wt1+DF; zEO(HSe16{W-GlDmQ^e69275zKPENd+!^!4zs)B9;AwY)_Gd&;QxXoU;A?InSbV${E zAzj$J=q#&fQF^gat4R?HohKsTD<$>KY4&^bBSlWcK{ut7H|}sue0&!~ZU=DfnqJLp zcge`4VP4Np3PxC}Tu00I&$)k7#Ew(*2`PM)9J5uD0vdiK(gT9Ths-FnXJsUq4`gwY zg2l!-%J%BMUX+@J>YyDAJN0oSv=77qn6 z0l}&*3RPG@bQbN|i|6i-j2%BQ9Qo0fN@X&^2v7mQ71_Aaoj|Q@>?tA9${%hESN+MT zdA6K~?5yT%o=%yEoqt?R%pX=MFW6WxTFP~3r=DvCg0tR%aNdjXs(DNM%+Hb&9Uc7) zKBj1nfX8obCMG6tJ~WBH)8>Hia*B$#VG|^DNa7}IQ44$!F){Ijat=})aOG_)ht5#p zX+z&q@!;XXu2;{wf6#nriLt0%;I~^dWyt#-8Ml;8Kz>aJc{KCbQzfN8tbGBH8XKWA zfS;x@t4y!;xLVJ2+I&PxLSot(MMRy$yX;BQyXK0CbF|i<=CV0V-_%wNu5}j80OAXx z9EaP>ctD@3*}~xqIn(C0R+S3hyu_$O2f6)MSYD}UY^KKQMV%vc&30!`&s_6c zr9xt3|3h?+{~kI2d=lwjD1q&U5)4ab!=o6V>4>AhAQLac`eBDs@ok<)m{Y^ECBW(d z7?huooq_~U7j$6&mO)(3V!YfO&V$VyzNcN*eEBe@f|9HDN12o5eemEry}1~eFc{t< zw@SFUyk^v*yP%aTO*=4(>^LAg2UB`*bkqS`2Zoc97=aviW^Bu~`21iAEi#!FVWH=3 zTG|Rs`nn-s2W6C$oQzyF0YBj3eX5pLRt!m%e)*(iIXSNd7Vo1+HZ*vMrpb385J1#I ztZD6*KMpgJuL+J8UXUMx{(*}!;m@?`{2*6w$eQ*G@^+8!H9X|F#l^+Wgf=tpg-9Ve zkqHcJ$tG(2{5hfVOVQIzxqEDhJslt`uD=X~Th`{xXK!t7={5U4u611a&8zT+Bjj~P zMl`HQm@j_|PX}24Y}6bBKUS(@ssM&dh+wa!0J4CKzg@6Yf=rhG`;Qm+3z-_5nwkQP zMYNl|cSA@d5ghh(IrW{?;fja|dE2bn%Y3Lh7J=e}8Y+`aGLzqi2@j>rGZ z8PEv1Oy|a(_UDf)#jpcPcFYkd!;vdQP+k1(m*n zX5MrchNp+N2qr`o&rO7wtc@$D10wmVIye4GL${Z%4~WaU9fMUxH-&1NLf8_IvGLQlC;GGm$+QF}_&DF_7=3 zgdthom|yI?tel@P#Gs0>P!=ER8V;f=&3tFJCKkBs4I~hRh*j8Dpd*b9f18?0EQO^} zHX*~BLX232x!6bZ&-yhne86X*A4Y)`U`llsnojSTZ9TGl_ZJF?9WW^-e3yDH>U#O|rRSN;UDJ0QIlMbmUx6LS1Q|;YF zWPAgQov`>L2k98dr#x*|7pVHMurNBxHCAq`d_#T3lxiZ_+NDuXUh=kmK=Up9OCt zV^L9&`CP5TxL+oiXM=mdqhP*ejyY}@p&*`3rLv1&_D@BIf+g%@pE#SP^ m26*wsrWxmpP2|gtml8>q>}~EwadWW4j8K$SmH8}X^6GynjP~CE literal 0 HcmV?d00001 diff --git a/core/vendor/zwiico/png/c.png b/core/vendor/zwiico/png/c.png new file mode 100644 index 0000000000000000000000000000000000000000..dcf2125dc90f1f79cdcab1373e54f1468048fb9a GIT binary patch literal 8777 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 TprIrw<$T;jdlJs0t zT7}8TF!lJF{x!|0MgFv3mMCV(1~%%-Gi+HQ8H-EXgiDF-V5qN1PixoWR+gha@oZ^8 z?$?=$-_QnkbcQ_^O=UWh+!@Q&@0pP&y6-f8N{pY|EwT*A`_Q>ed0bx3wJ~zauhPGp zG{4bg&N;u|Ju_LNCjUds$9H*hLuS>F02VU&K*_HRq7x}g-c>Xq?ihVzfpY(LP}h<6 zoq$!x>VbC@QVCHeKfiYuL)Low5A((;QcjxPFT+MgP7ag>-%d+S8FKsI57k}q3hWU2 zsGIpiAbjlq9ate~xgfAf5TK!>La+fPCMBiInKt1CTl4`crU6Rco}P|g0T3lWN812L z2i9QM02fv@4IMp`XfiqogsN3TS-~)5;lL_X+t7qg&dt4*cNtyBya&f|EMvE;Go7j? zM5nse3c?sgU&3kBMU(LQxXQTkgOSA8M!2)9GfA2cW4KuJSV=BleE1-+FNHIZk0~Nw z^T8}S;VT|oKER}P_>ak)E(ec2-7ehh5ll#6Rg8sp3m7wDQ?e;z-MObo&H8^ADVkW^ z{QU8P_Md)P{&;%I%voSw_gw2WUtfP5vF-K6NqSBWm#hrstqhi%mlwy^+S*!E*A{c$ zknnJFqR}YUKa%UCFcQu5b99%gBl z?3bp=+Mz=){yuEAM8g&I^)t?>RiKJ4E?iwFGZq3)Bd{D%cUssTt;4VC!9CU0NnFCB zqK;_W_X>jPim?RVb zLxM;7P&G8PV-)j7*!d>hP@>M5SYKaX`TRYmXIQfx(TD959L)JuNl|eXNiIv_90y(b zGB!4Qem%rl1e;n(sP^&n^hCj{5{}zf!jiMRmfra`24k$#HPI9>7*yDK6xYPW#Iz9+ zEy1n~RkXCsM;+kMeM)f<2~ttP(=L*=s_>X7Q8_$2vOgM1f(5m-w^Jnt8XMDoacGW= zCz_p_QqKIAC;lX&nN8ILi>~u2%m{mGZcaV(TaKX8f19{?czDY5i{8E07)n%U=i`$7 z^)xx!qS^#Xg@_30rjWdxoU3r$ge{z05!aVz4k{#4ot>Sl8$+)iJA%rIej&g`plIql zI~jz8h3`FlNJvCXd{0h}rM9lFZ)u6i!_(7tG+**?R0=~fQ*j=(5_$VnSGK38r!oB0 ztDyPaJBhQcJnw`~kVu59Yn6eMyF0P1t!>QI;M|-kNL+kMN=jdIoke^9M5)@(ER*Ly zLaL_Sip$DykB^U8Wn`GSxw+-}UJt~xJcDj+Z3%cTh%`1eMVq~K+DU1;H`ZKP32lD+ zwitzid>tMxe)kUc=+Ps@#orx);NO;wEiJfjwDH$Jr)@9){#;0ygAirUPs&RF|Rlk92~s;G%_wO4!66tRkYfWo5}0%>8ZV< zB6ht+`wRaFg8KAy3Xox%5v|e*gqRDa zP>@fR#1Ud-WE69k0fO-L72K8y3J6$DqTzuqWM*dC(iN7Mb1c1ePO~Oo{PYQ*n20Fk z52#6hDx>(WOvk_ddF1l)a(;xJot*?;B^r$b#--9{}vV&OygdNNs=*1d>F#aHQD1@ArPyL#83SF zh3n1UenJuOWvDmS)}~~o8P^PkpZ=zIj5(qot1)S~6TsiYOGAVg*th1dqO2_N;(_M` zP1xYzAiY{tSa|rv@Nn|ik5g0BV}&xwpw5+gTzY7@t*h%pRTY)u zYifAbV=M!~wbda+pD#_3b=dr?_Df%!lE$dJ{d3neQendos=_%gz^)-xz zB~9o}ie}{6M?&2d@ankBV{*46?(oTfl-gmQR#wcKX!sgdQ&rNZ{(*S%s#kB^$3z?B z%{u%Z@R>E^y1ToZ?ZwB%=@%hEmbNxGeXB7b+5?v-1&;?c#RHDD&~RmC4{z_!Mm5Ge zf1_P}_dsKTF*CTl%gp>uvd678S95WE9C7$|otkx_ngkN^vmbBDMWicdV{5Afyyb*y zNQeZdr-w(abu|tf=p8l%cRM>p5=$E!7O%y&)Jl+Csr~-aX*a^@Z+(5y{@xM+#dhI; zSlMJlk7IpHN1V|r%KN{6tAa;mz5qPYG)Yp|8+PKhkHO3eDxRO8`~EAgsUd#NZ=?G+ za<<+o|Ju09a4LM8K^Tcw+0j7{LRTV3(Tb#leMo|nNx^}E0m9D4Mu8R8v|=|h$m-_s z>%d*B-e(1s{=dfW^_^CdSJ%`KuB5TZiE*c0T!gJ1RAc;^E{snP4-vJXE*ghRJx|}i zugX0FXo6yT{kp7q|P(n|Tyvj8n69lO0}Ld;7Y2l#}3w5H55ugI%qX%Ip`>((I>AZf@VS?i74t0|Ns?F6x-G_V#vz#kJ!Hs>;d~B7J>*s`NIhuP=}UDlarGqNhoHyXVULFIusln%5=|v4#XFilwboi<1aWKe$DUi^e`wm zSn0`=G?XAr+>1#RlbB5bV`3u7&dwIF?Z-v3ll)$Oua?Oy6{M}lW~Qb_VEI0XRLpCs z(%|>j)~8%b?c^R7c|AP}?Luj@@os_Cc=I|Z^!IHhvK54o#rKhCmK<95!fv8OpS!QS zknCv$2aBIPdv5(c7_;RF>j*h2K@|0`bcfUPy6Woc8qy4pe~E8v6RW1}bKabF5izy2 zOerodHsq-WU?3(g{$1`(%KEU-MEwP+a`{Qt?kdlDj&a&d@hUkLA)u)csy|h5g``j>iRmg=6TBpWxhtVr*^?(8lY9M0F_fvP@t$*JAw|( z)79^yC?!q1gQK{u-tubrq0ybns4rM zlvZtfZ7n7`I{NJJr_v*Se(^68Up^LTE#K*^cpP!oh~Oy$%sNp>bvS>hb^p$aK0(At z3nU64aej-4+|ghKkl&R~ zxOeX!jFK`M^p&ZhVeHAtNtm3C*f#G$s#Ajh!oUF108aMY5hPm-lP2MQ-tnYV{d}goIeRxDqZ{SXlI| ztqT=oQT6qFhkyUxzcP~w+K&p{o1r{OW0GW>>lKFoH_vkm3yKa7_tnwxf?F}~6%xSv zogEj{$TUknf;wX=_P_Mg2Qt#RUWRrfxst+hqa)m8jX>-5tYdTr=%+ zc4)gB8A0ZcXa+t2wYrLcl9SIqd>^<+JCZL+uw|1Gq7~$S`MhvH7<8D(TzQHef8OO)@gF{FWAfiImV>-h1*5-TxT$t7>bt zeFoaSe{gVMk~tjf2biAsh~j?;Oxl60t*_fIwt2>GUjac1vz!1`Cj1Y=Ps zM5;thfcz;`xzCrDEYEf-iXaeZp#2BB;xuy59es@6U40s0=!tu;j)@iac6O@#SrbxI zNq@ddNJv2ZrAeh77l|o;mfB?hx&JvSW6IjVB*FCbw5r)TAjdw?AzY__|8CIiX1;tW z6d}u+3lUtt{{wT#mG!l6h$ln+17NJm0Zy{ye-ETU6zf;RpFhX{@3EKez?Gy>j-~Kz@pdiav0e{QfQ3ldL?eqJ3WT@6wn&AC8h1B~Em6fZ^#4g%J92nDg zK;i4rzdc9Xp`r?e(*oerubH+B2oRajRaM1z{>*39sXT7g;TM;+we!6K_gl45jl^3i zS3wItKE8omz2Jj|Rt0Oo6C|G!QuTw$w5AZFp8(6pT$+yw+{|d zkB*K^_4T6xN|@T%q-}0)!szJKtWvQcm><1k^b?~Su~|b7Fk0H@^z`(mR#vH`q@N>>@@qaT2I++IrY1_Dv;iZnM&l5`cKEEj zxI$`OU00K7dHaD-HssDSH8V>T6cj|BzzqyY=~$IN8dT`+(8#rV|Bx+^C`F-IOUO)M z(rj?%Ms4qUfZYM0LAczaw_1Sf-)@BJ85z;oTNb7#V`8i8>Nc}R`%a0-$(^mLie$o7 zQ@3V0pC1nD@jMlY0hUN1!qUnL?+B}n;!ZgicKO~ytNX_fWLEmxIy#|vij#h4Z|r(q zyd^=B6`CwtGKp71VWqN_RaKM$7hEKgGdyBq#^cEPh6XifXJ;ht=lOYhEiEm{P??a! zsOnBf2M4`V)epXivhnu*WFW++Iz9#fC-sNykrNFnS|_KWfuHlc=VF^6S#4Tcn(p$+ z-t3>GTkOIP4A7lZ_8~wF=&;bzkmN8x{ds=+4QGttE>A9q=Jt-XMw*w8lA9H0`|hFo2B!$bmUFf>RW-3 zr^WTa>%M&Xl2uTU60n|jjsO<;jIz4d(EFUf_v)o6-o^Y|=he+k(KAm&8ylOsR(Coc zxj03IkUAZ0ZB$j2#^ zi(HKhdMBBy zi&`N3p9iq)|Ic}Aa|oZUoA8%_>AfrWj3n)@Ow7iHgNwH}0SN8CH4+VaCI*DFwwEd? z3ZXvw5e1w|zD#(wX+Fs{+dr3&rboWX0%9&lv7bWxU#KQ{vr?+6I6HH8op0qShdy~i zE;PIOjtRjKx zFWGmzx$~Y&o-KvQyuVOTSY8F|&Ji3LlvDD*YldpDR%29_ONUafF{;Nx|GSz3@Bc6Q ch;MOjM2g8@*wjmduY3><6z>% literal 0 HcmV?d00001 diff --git a/core/vendor/zwiico/png/e.png b/core/vendor/zwiico/png/e.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3f028bf08df86b5b44d5c9a507c4ba90a6aa53 GIT binary patch literal 3060 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 literal 0 HcmV?d00001 diff --git a/core/vendor/zwiico/png/g.png b/core/vendor/zwiico/png/g.png new file mode 100644 index 0000000000000000000000000000000000000000..a55422c1eefd22d59d9e1c38fcbcb6c2cad5bba7 GIT binary patch literal 13801 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 literal 0 HcmV?d00001 diff --git a/core/vendor/zwiico/png/h.png b/core/vendor/zwiico/png/h.png new file mode 100644 index 0000000000000000000000000000000000000000..5bc5592db322789d38b85bb311bdc3cf2230f9ec GIT binary patch literal 3689 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 F`5)a4_9FlQ literal 0 HcmV?d00001 diff --git a/core/vendor/zwiico/png/i.png b/core/vendor/zwiico/png/i.png new file mode 100644 index 0000000000000000000000000000000000000000..2732d8c1806284036f2a20e8043d0dc4c448ff5a GIT binary patch literal 4120 zcmYjUcQ_pF*Ip%7B+9FcUK6WDiyo_6L|tq|U2QF^EK#CI=S70mYogZ>B6<=*um~cE zURLj3LA2lG`|F#zo|$XTGjpCf=RW5?=ZQ1a*P^7jM*#wXC}G;_#=yN47)s=1!1cZ$ z?I{RE6zQU-W(ZSLBS()<*Efu? z0wh7ihr;8O3H}lOFUH5@_UW_`M#ixtaea4Nxej?J9WxeWnb>|G<6~dz57BAGMyaw6 zV({_NI*J->rtrk0E0zp~;b*xMSe*2JzYX)Si_oBDnOr0(V?F6V#13#HRTf5MBf2s6bN%s3Wa)z@T>dA!q;dXH`^?~(1 zbdlxbn8mdYd*(S`$Ir1hTF`|@o?dfft4fPlFth&{zZ$j}^d$5#b$h|6jAQuqvqIOQ z-I|u}wk(Wn};sGNi7SI_T!_S=dpQ z3P^5yYCrV`fkb)#4kG^&WnVxD_JKXo0I!nYp(LgM&e1Ush**3y5I$-i7>uL44@eE` zXy@bTz~$%SgW}SHJux&7r(y!a-~gts0{8#5YZa(BKFOpkJUBnpAmSyq+!#S?5v8Kp zD={a})bKDp>nhw%bNx+3`5mWZR3917=#yx>uu;sgAa|>_ExR7e9XkoIJnrZny$eBv zz|8=`M2(I9zP?5*#(X%Pong%E-@AW)J?=fyQg^I$IvY50{wS746$)LX>b63XlSU#b z$jN)?Y2pRBxaduw4@$#6g=&b0-dy>SQ&1dj3JMF;OY+luhm1~7Z%U4&@aulnyXvE9 z{0`m`&A8Ls+iUCKK&mG|cbAIl%LmNNCkF|mfLhBIVu>t0e7Ye%s(W>nZx+yo%Brsy z_di>T>2ZrI30m^J`tv-k77mFrrs%Qsw`}vJEb03F%N3a(i4;}*b8%tx0)fcP6Y0u>TtA$m@z3@Nhf?zZJD?_}3hafc-6{F;ToIP{LP3qe|@+fzA zvOIk-Sp*T@NmAIVm3|c~_kf-v_TPUa_x9Z3!*m9UOXgQFTa3V!xEQ{Z~c}WTek4)QQ7CQ6VuIJ~i8yp82yS4}Lc)pdD z6%>1468kZ%bk2Pp9f-wBKmgTK5oIkc0s0KbU*qU3F&Gqz%gf6vWa4n#Kv|?3DbGfg zl9RLDB#v##g`1nF0!T0W$oFq-Jdg{$Ry;rGrp{s)gg}-nyDBT=g)JJtRs9RVM3bkl zC2;?K|Jj*rMMXtX`V)P90XjN5lyYETAPj>M@is*?yR)B8!T4w^*(%^Vx%y?`1+lKn zWg|15*RPsfCsXivy#|kk$0-E`21iFndYE}P;>$WeXY2#h=>LuSI)aPq7PY*|DMdDq=U0EGz=RsgW$d*>kD_={116> z$_ffILI#0>3KsiQQ&X3Mr4wj=A@kbeY`Or_UbARI zGe8D&G^#2pxIs|gohcQi;ee}?Nu!pF-@Eo7FgMp%@asGUKjZVx%OhRLLcUVq+DKm` zLU?01;lol^qNMY1AxW88RmV}5o~~f1Fjhy++h=>czq!i)S1%mxkL;Y7Fbea)0Hn2(oj|gE*XCrVNmcm@ra*~ z@4(7W+@0rL)!66HDrx3LhMrA!{{GA*LO7iQFdcDLz*y6X>yw(B6#>R^g)Q`go3k%O%QrMW856=JKXIe5XMau?WY4cf+tRnho z`uqE5ufC(C%7u6ShAAascW-YEO)_X+Dv}{}31oYD`_vQy`6wp~TN;d*SBf;N;*X1q zD|d~^d-r`YwP$Bz1G;ITd?jTPJ?$3#;lm?{lAz%2y_R*3faPQ36CgA9@qKMytO)>6WYDmo%*m@bT{MuA#NH zzEw}LvEb_Zx>`_ByNwFlV=sV+4P7L%{;gUOUVuO#1Ka!627?EpMWCA?C{ee4vXW+S z#lt8aJ-tXUhkw{0&ai3%m8Fru=yl=laiuqo;737{djqK@#jSy>HvX9fBY!x4|qi}=zD;v zUfK9<0)g;&zt{sTWR=0l7DO0eNE^whdoCprPl8>43cokUnR$=6c#wmhBY|7nRMdOU}K8!y17;;e6JD~N>y9mEWynkF8^xk zJV%{p>B!@0hy>`nd2Wh-yLRCO&c4|?06#3>VKQ#DA2HvwV9@7G&mTAik*Hu?>_)t z8po}cKFJB9a&s(^#D~0-)sN{87f`h;LRS}>10^<5Y?X5BYAwg3y!}N-zPh@)XChGz zCr~Z%kqS7SsOZ_NKihSZj)MaO?Vat_hV4LJx(9o;%@wz_WGSHMJbJz^KO_p{*cJsc~_)$EK#V=R+Wn!MHprd z4uS2-I_eD)aC?BTk~7X18*h^{&6a<=Y0TF-Zk)VuV(sngi?gU%`?aaB%)-J_TvIc& z{~6n2Is4fA#f#QSw;`9Vgp;qmy|m3ULzaK80uZb{(`BGG-`(YOq1W2l`ubGj%y)_Q z2d=K)yc;CEEG-o%uc!!5U=sU67|h_7m%j%zZ`Fu;;xFCZEgts7;X_UlgBfCK_V&Du zO-(9VT40~&&%;%V!kqI1$ar{pxrK%A(o<+a?GW!r=jJFwFAu>#CMHz8y^rw>ws1H- z5baP0hhl@nG(UMVFu16uhO*H@1TbV{dz+-gnwp!N`)|_@ECG&EC0bfq`mt?kb69sn zgbRa0Wt54DRmE>bBICJf{@+e2%utW0DD(fONUxJ`h>nEauT*-i{{uFNAee@}dabJM G%l`rU82JGJ literal 0 HcmV?d00001 diff --git a/core/vendor/zwiico/png/j.png b/core/vendor/zwiico/png/j.png new file mode 100644 index 0000000000000000000000000000000000000000..7dbaf1895b918068ee5f403f0259a9b00298283e GIT binary patch literal 7297 zcmY*ebyQSuw7qnL2$DnR52aI(j-f%MyIYX%M!Jy_5di@akS=Kv5XqrCq@|J0_wm;I z=K%w24YTfi_nfo$*?Uj4x+)wGn*tkxAUp+m84d6^4m?CL(ZTN^?T~#4LJGH&mR47g zmZp8<>TGT2Xazy6$pOit@?8?JZWDt-*;0JZM=rnAJ*sHg{(RA5m3piGwDzy5>ozH$ zoxFx23~eejj3!nKgVe@|$`DQR5ankdLIEMGcw?erOSszUBEGobH{XhKbIS8-Fu_G) z;u%9)6i(Le*GK-cmM&h@$ilQV z9@Xj@Q@I^^`0U%jAut`ge*{ znU{>MlcV`?i6wzIE(@b;qRXxrWZt7p(ypH&l^`*KmRy9ORmh#eCx^kk@}|Tw3|bW< zCgrr`F z;$V1qAbA&xdx9r1+!a)0G1f3~@K6Lrh4dZ3Q{?Wly6)1>uU}g^xkJ*fR%Y&2mb6}W z?zXgW1r>Fj5PVVyqR>;2k<|2_-81r0*PNNSN7@T5g2T%bZYj7f1-mqSNEk;B6$Z*bM*iwUE|=H`jZ4~w~uD3p#`?uq(D&mI*PwOd_3O4)jN z<$v#g5V&x%Gqv#L@)(}`RmTc(zUY;)B)aK!AhNk7DTCV3*sXBnt`=f2AM6rK$>rpN z(!=i5(b$bg2LAK#3u%=^&~*L}dfflMBJ*a)*}w99)C62SXpTc5Vo%tEqRhv ziz!cD%(n&173Dr0;$TsIj3==OGYRn14c3SM4< z>uYOCnrw9<7&}uHED5W|Vy2+LTcs6kkI{a2*qrUoxL=>W)+o`eHS0o8>0ke>UE1d; zFxHpKQj(X~xgoj~cwOG*DfoJpak{qvo+vy~5f_Kc_Vj5%M~4J97FOQmh-VZn5T=~Hiuea9kzA)-#zyz z*bN(#TA#79MmfzlN_y?j=Y@x(7L&*`rxHR}o8tEhGBSxY;>?iy-HlJ_dCm);Q9G{s z+FIQSb~ZLwtbrD0*mT0vo7WoyS*nRa*JpbVcVh44RP^y9H7Gz{em?zsf!7pI1sx`z zSyQK`q}Wb-EczSC1_%tm$6VQnHa|d%%#D7+2W##2f z^$!SmZG5&8Nu%N7!cC5g&Xc9=zVZXD(^X1MK>>@9(8|(M-Ov!0rObS`7#fOP8tr#+ zNS7lPFzaLh8d|mwrfquZ_V(6pXR@4_oP4`de0_aAj@RhBdvtYm^_QBOu@ax(zki$W z{p{@>izDYXMBnY$yt}=Yk#RrYH$s-^O`xjr0X)LKH`kCzPfri4Z+JZ?Ku`bO`zZgD z9qFpmBa~lZ7zAHFeG2y6otAu6tXel0f`Wnna44itm6cpqch?8et3vk9&c)raq$02m z@M`&rsZ?cVi&$A1_uDHENv=0AxWm-9CyoxFe&CJ&ZKxa{9px=An_^>Pnts|nI4G{M z8J^wi|M3=Q<{ETE6|x=r@Lcr>Jy7zp_}jOH@87>q&*N_N4GuEV)3+KA%U3?Syglyc z)XM<}=&ZLM$n30D_3+>av;0)Mtn$C}LBXX)d@`MZV5vOX)IJ$dsoj0r=g+fd=jQrs z`9?d#Fl2WG1q3u~Y*-WuH6r$}&kt%kU(Yut19GvuI@yk!u5W0-sekh5kwhdu6+NV> zsVQS!ll8s1`9FI4P-^kOfu4-iR0iGqi=)-DfD%nbaDLCfL&XgZ8KGfedLrqJi>6#7 zV7_xE8`HfwZ;(Q0#`YJQ(Uyi$tOwuoTk=t$`TS02H`wZlr*tGD16Xo)W}%^>$*!)e ztNVr|SE9+2;Ic75{=2`QXyQ?N+|5DIy@)}}-@o?s^jG`M2fLHb4h{wB=_E0+u@-xl z*48PBi3B;Ke(3w>gaS5yoB;@(T8Fi*XjLX^PEZekWUmVD?A7 zmI8XCbY8wByu7-4I4i%P;42-SjD@R(g@uzX1jB5lS=dDPM2E%k#$YxUBx0ngqk~f~ zXfp&WEfDE-i5u26{-}~GwonAB=oKBsDkioV;UA0DuJ9~zv&EB}4EOVd{r2`)@#nE^ z`Qovca5zRY} z$47>8M9{9yxX7ZSwthwvp$305ZvE|9rta6>-MyQzIp5@_si&tvMMZ@ge0H!jJd1~o z{g^Qm*4yM?^A%y6>FIj5F{42(>ihF5DJN&JXV9%9l|?OPaucb`;U^f%Sl86=--VGS zxVgDMPwkY{*K4cy;}RE(iTV2YbdHS$BIu+eIxKlQ=jP^$sG&?{X2coOW2`tih6n;0 zr+?XU1(L3=JkauljtLs{BH)S`qD@nzOYL*~+j73>$3=#VNkGt>dw*l2{6UD&q9+as zx;gA3$PXYF^B2NJM?pqGnYsRuoXi0Kb9=so0j;gAEvp4x5wWqc9UiVo*VfnPx3@1j z8I^0t##0I+Lx2AKc|=8pM=zzVO~S*&Q|YuI9RBw0^92HkOu#X7&{_NnkvI(>Y*_Tg zX=-YkZVwVaK0aRF+>9(Mdscefet&y_1OfK?7Epe6d>k4X8QCAaBFm8x8^m*d5{|I_ z8AZr|O8TZV6b%YS6u?m+FsDcmH8u6c<#3RbmKZlTp+*TY01zuHYX?{aT%NnS@{Ete zBO>wv4bqv`>a#EU9f%^h=TdumwzGh%zLhFjalMW0NOMj*p`s5zD?6Hu0n7?>PAL*C7LmbVpmbO8=IRLb^7eH8D?D( zlEq_HIe)*#(TG#Oefu`4f8BAYrL~pYZj@2^Jzw-`5U7^-*)I9yH=|giW=|xj?e5A! zIg<;?%E}582S-{$0s?&A$rr|utXN3KV~IHzj=NQqcf-Kn|Ee>jlQ@!P72;*WD#*N{s`;(OSi z>%MOck+|zq3q*##l$1z&qhWDA#cjDee8n~PsIG@cwDLcK1IUQw+W(13MK zm%>v{&R))-OQme84a|34kpyrPliaR8FD+$eqK_|pLQ8cj=)p{hU(XDa=|Z$(Vjn}K z+0vxwlN%i$8|dp#x4+$pqVWT3=Y^=K%g!YG%?d#fSU4R6S-dY_y$Tb*J4&>*we0{L z;IiC-v^!gegN21v#+gEjM8?U4V*!275FoHt_oW^YY z%S&~(G*%7{IXStAGzAYiAYSQ`<#&BAeEj?@euQHQxo1~5{Zb4!Yn=Yb4p#?+36qIv^~d;28@jo&oI{OWw<-u{g1ByRa#+0HGBYR zIbLwl6t?OEx$VzCFIMAEpIzChXt#E&_C7NAKkUQ^8?}5KEu-G`z&#Z4=yrB?)0Ji@ z&@#B8OnwIvP-q}hl9G~wK{G#y1yHnKbaOfi?)^(yyt?w;I`wV2`dd1(bIL)GBu);_ zZ;-49Pc>H?u;vv?kXBbu!o#BBv5fjMvs#xZSK#vA7F$6@1rL-xsAFu52>60V*L7@c z9Gsbhs;VkSc(yY08(8m$R(Jv|n%knsbZaDUSqL8xwXMDV56~qldsE}Cn~I(CLFc}{ zKJV+j2A9KS$?(WX26lEl=k{9x3QEcETzP`S@9QkB6%XN}qoL*7%*z(P?TX2yrZ*NCq5iw&XN0Hzqk#c6={qrYS9W@AzX%@oY)kSDAefe@9$rsKl-Xs)*2Io z{Xp%ZM5cTcvYcz)D!&qKDo1B$V-m&h$i#0BQDS0ZxGZ{bOBrfPT~D@Nel9LHIQkT_ z)0O+me1C5bPh4EwmXAV4RyMDt1;(QKK|)tIQ^_KLuGc=S69V+`!tZQ=S}e+$!GcTvLVdDWlYR0FnGok!jqXAAn9v>q+3%SnezpTt|nL@o{u~ktY_{ znP9i7>#_>CXXGGA6;E52M38j zof-@_C<(USgyOwx_Bud@K-+iiX}MPt#}e9}PfSiCL%f0%@exLL28uuoFZ%AVqeI3- zMoq4=CynzXBORJ8rOdzu)A92^0X@NhWZ-ZHZf*pJ?rt9t&=1w?7#=3z$-s=82=CJC%7LFS zueMh6@SI60eR;g(RVWJ)obd@nE#{92J(N#2F%}RP64Y`w>k#)8QvpO4LJ3{j&TV~n zlM4&+qoW##F*Q&H;8D1p=7qd{eDd=0kV;BQ0Hh+io(luo7jRzOt^805V+I~3D<6ap z1G(ZfD=RAkMQJoTetykHuDMxRSZ}4w&PDXBteAk4$fHt8NbG+DN{Zl$6vo zF;T;Q8wzB>-aC_nI)|yuSCe2?el0DTaDDuboqh24+q&Xncx5ZFfs%s5e&_q#8HRT` zE%z0M9L4ZN>gNY8z;j5-$N;ts#qUZVPGM5YbYLRL#3AK~LS|-Tivfn`m!klV94d$y zcq-9RQIk}Q8ER&f5eP&+w|F|VMmorYD~rkHALLyLd*Q84{LH@Yy_A%cE?Hb54l9j< zE%5muAp#Cm667)i7L_F>(LB7odkJQJX$R{&d*yfs*t+Uc*8e z0JN4x)UeL$y!hg~%PP8?fI#-(099%RaC}dbHrChmn#gATfcfg?A<|7(k(W39 zunEMmjT{}HJ@_l&=dw+VpNe}Q2H)<1nIF17 zIXgKS0p1V`y1clk#99@4X#Ib*v>p4F7-(n+pzFw%(UA*lYu{bAy&tsJU?r{vQlXP; z1aK-gE^cj%dZYhk^@3MqcsN(xpbL!M==;03TgS{Pxny*kHV`o(VW)XA*u#BGOS%63 z{$;Q+KR-VO=G2!`Qpl&Lr@;6{cEvr?FHZ-`Mh;?SV(PXpCWsqdTTS$?2n3TYNTSG= z##4hD3^)TsP^pTA)sz$tmxpabAa=0c`RyQ;K~FPi{lEE1N!f=Fu#M!UiHUA{oDV)= zrS2iWrKwfdq{;Q66%a@V@Ba{s2qh5V24p>VE7G#X6rTZ67W?V>`B;OCu<-3E;G8rx;)w8Yb#wFl_@+RR00Hx!s>x3eQg1&)4R@MfC1UePl-2D82khF%zV^N>uaQ5%I11SvgKmNr#w_Wy_xdN5Z zH9+U=z>cyf4W_#N87Utp=dgWs>DRBndV3>53L_2cP1Y!>uj_9m^5+h`D`z z`gg*Ti>&ObD(F5Cp~)Ebd-2WXv6Wm52>+N^Sa{u!4S})x88d*7st8h8B?)pNg#VT! z7+a7~Bx#gbnl&+}MuW*NuZ^E^EIK)HFC912`DSQlnk^pG_N0%Uo!x5f5->pM?XRIB z>sg74DFZ8iVBv|MJn2SW4NoCCdV%11HSyuO8(GB)Kd|8GrbeK^Ahmk`{=Ga$MruVx zg$nJ$!$4xWEw=dV8Y!heqsvi+148Q#{8zMHxE5(=Z(rS)1VAP^Rbk?V`HnQ%cL!u; zd;wSPzd`oaYODs>AWn@+)OXyettq5e<1XAx!4)LqWPNpUz4aMZY&<+E_6`nUPbSM1 z4g+96415@ERplBWat(8HdXy&ZQY*<*^Oc8qo+@{5ffS@d1|d8E zS|D86b{F=f1#0KXcs?gz9-!p{fJXgF(-7(SKVP?9_;X>ox4%JutV0v2MC1T_8p-3m z1FoTn3MiFqLvFVp?HS@&*b69HT3S`L3=aXFopQ_B<9;-YCLh?TR-wjAAVifoOu5LW z(GBYC(*`|yf*5;qK=HqRWkV+hq2A2Q42O-qJHP1kVyoYb6yA&U9d}_cRZm)F>rtUx zIhm+6>}cbPhq(EHfBM#4-*a1_gI%L%R|NPBs6ba=W#G4;RUu4k-p(4()ak2$CcCIE z@;!gbiOU5jbk`evEMPbMQB;*>#fSQ3=|r5`^X%fmkB7ygevDpRI1lO30|-DQT>KZb zy6UN~Sn*&i$(EX>4Tx04R}tkv&MmKpe$iTct&-4t5Z6$WV2$AS&XhRVYG*P%E_RU~=gfG-*gu zTpR`0f`cE6RR%KKJM7QF0~&d;;+-(+!JwgLrz= z(mC%FM_5r(h|h_~47wokBiCh@-#8Z>_Vdh$kxtDMM~H<&8_R9XiiS!&MI2RBjq?2& zmle)ioYiubHSft^7|v-c%Uq{9gaj6`1Q7ycR8c}17Gkt&q?kz2e%!-9==eo)$>b`5 zkz)ZBsE`~#_#gc4*33^%xJltS(D`E9AHzU!7iiRM`}^3o8z(^E8Mx9~{z@H~`6Rv8 z(xOK|-!^b@-O}Ve;Bp5Tc+w?9a-;xFe?AYqpV2pEf&N>dYt8MgxsTHaAWdB*Z-9eC zV5C6V>mKh8wfFY#nPz`KJR@?EUp+rR00006VoOIv0RI600RN!9r;`8x010qNS#tmY zE+YT{E+YYWr9XB6000McNlirueSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00wVKL_t(|+U=ZQNKA`P3J?ecX2lD`i^t<|I-SVO%w(T@ z0v9h{WcxmN@L*maHoQb4fos>UX$Cjd_UzdMzu%wo@KjYrWo0GXueY~%$^5#zyV-sx zPMmm&|8Lcy6~_xRZ;Ei}B*c3yh78Argr|RaFE60rd6t z3Eg?A1}_qcz;3s*d@U9W#>U2`W50g=${wMYmzU%B@882NGu)HfPE1{|?B9RD6OG{ZXn>KBl1wCnap->2BvzgryWo2cUoSbBx z`0m}ihJ+_NT68*{Xl-p}AOHIGYjz%_*9rg;;lqay>=TE>VWAa_RDuTpO-)TKf04zE z=H_Oh92Q+{{PgJ)dzsB{x6_6V8`#HZWMoi9MTKFP743FA?cKX~$>V~-Aj|LI!Gly< zTB_f!!kag5*hVEKCBhxBefxI9!dtz1HC?!HfwHo)G<%uNW^y%f6Mn+NzWM^j^8lK5yqKb+N+P!}S+S-KUZr{F5(P&hE zc%mbpWRu_yrBhjt9zCMQ#zx_|=H_O)fB*jS!~6B?S5gU#j*c1{+|bYv?c296>G(s3 z4$;8CfWGk3)6>apHnWY!$H#?FuBs|MeE86?-~xdF9X)zfv(J$uN9g!rtxEYpFw!g#S5UPQ3xm^0}Dg=W;xg|7D$zE}B zG0QtYKOYkl6YzLE>@t#~q9RO8OlXG(05@*jkejhHau+F>QWRx6wx_2@sJ1m8kEd1{ zM1Oz3q01niKYz~ly?OKIocQ|sdUpJ?XV0|51Av;En*V(PlH2V@R#q0vbN~MR^FBU; z!60_++Qr_){rvf}c6eT|_kUgb7Y>JEwOZMo?smHu^m4ge?A)wYE5hNhHh2Kg+1aT( zjAO@+rF_wCB9TBtLj&8dqoZTV{PZfJ7b>eVZu3h;$W(`PCg zjiS7~obB7y)uj#IRNcNvXDvM=%|I(+yrB9VwTcr)+H+S*#7w}N_l zdgjbuQWf6y>(|*Hb#-;~zMH^#6p6f`+S1Z8E8e8_>+T+phu*z=M~b4*+qZAY<#J8G z*1ToQ7Rt@drOlf+lf`18l`B`uom)LiFyyECjVoCOA>m0$cv2FcgeN88NlAE865ijX Ze*s`nnr3ZVGK~NL002ovPDHLkV1oQpK4Sm? literal 0 HcmV?d00001 diff --git a/core/vendor/zwiico/png/l.png b/core/vendor/zwiico/png/l.png new file mode 100644 index 0000000000000000000000000000000000000000..4a88e1318580b3140f868e277698e0b82d8f315f GIT binary patch literal 3693 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 literal 0 HcmV?d00001 diff --git a/core/vendor/zwiico/png/m.png b/core/vendor/zwiico/png/m.png new file mode 100644 index 0000000000000000000000000000000000000000..747bc5c6055a390e2daaf46c4d51ddf5afb3c778 GIT binary patch literal 1876 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 literal 0 HcmV?d00001 diff --git a/core/vendor/zwiico/png/o.png b/core/vendor/zwiico/png/o.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa61db1724769a032d117e466d9167a46a9027a GIT binary patch literal 2654 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 M07*qoM6N<$g0m0a1^@s6 literal 0 HcmV?d00001 diff --git a/core/vendor/zwiico/png/p.png b/core/vendor/zwiico/png/p.png new file mode 100644 index 0000000000000000000000000000000000000000..c5d4377e436729c2622226b85851801c85561e1b GIT binary patch literal 3051 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 TDHR1h97tVRN9nzSb@=}P@d>XG literal 0 HcmV?d00001 diff --git a/core/vendor/zwiico/png/r.png b/core/vendor/zwiico/png/r.png new file mode 100644 index 0000000000000000000000000000000000000000..c6d308ce1c8b0b5650508fcaa032bd50c9008040 GIT binary patch literal 6898 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 Gw3;|-}mqLJBh}II%m(EKLY^3SzWZ2DOjh0 zF9vcF{QAUszX1S-I4lxrtcyg7`s4iWV!hn}0Gbh%p@wc%7ixE~Ekc#Dg>VFP83$L1 zN=?5uhib+fU#(qo#Qo%x$D&Q`giZ`Uj1@^XKgH*6f5GmA#&4!J5>=Oq!W=l5dT`FP z1R%aoM2vr8I@pxGO->6?ACeZwC$K#I^@bx71(|@jaDO@{x2a^J|0OVTqP26lk)N^w z-(FZW!AUYjGOkMxo=pyo4GkY0P+H^Cu`)4Dpd@y(eh^(3A9i~(3F8ymqW30b7?Qbk z65=%ldwhD69${2bLgr?v8;1f-%9Y6t}AmXpqUI$FT- z-{!omu>@Quz}4VnakP*y=mKOY}A z-yi^qb8`xEa}~XZ4e}7x(KRr(jA7#g0Ja%jEe*5Ku@(CWeW9UkgpWb#t>;!HUK!g6?T^bswMjHvSSb4XGlFkt#}Mn6diMS&N?o8 zTd@8kp|R)7>KC}uB;vl)gWkShtE@$lBJcBEk8)JDd*91#2U64mDeoJXIXGjYqs3{N zmg?#W$p6ZJt^c+DKmAJ2P}g#vJ_-ft=O^>pOv+dae?vuuw>VcuIwpY-$d8&GLey4&&StYC9XON_

    KO#B>N265vfNDM`ew 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 literal 0 HcmV?d00001 From f97b2a7ed3900394ab96211512636d0b1af7b525 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 11 Aug 2020 16:09:11 +0200 Subject: [PATCH 29/44] formulation --- core/class/template.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/class/template.class.php b/core/class/template.class.php index fa2aa7a3..786ecc97 100755 --- a/core/class/template.class.php +++ b/core/class/template.class.php @@ -57,7 +57,7 @@ class template { $html = '

    '; // Label $html .= self::label($attributes['id'], - ' + = ? (réponse en chiffres)', [ + ' + = en chiffres ?', [ 'help' => $attributes['help'] ]); // Notice From 6ec6e74c0bf31b8eec6e7bcc7555a3bc8a1fa543 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 11 Aug 2020 16:28:10 +0200 Subject: [PATCH 30/44] alignement sur image captcha --- core/layout/common.css | 1 + 1 file changed, 1 insertion(+) diff --git a/core/layout/common.css b/core/layout/common.css index 4b41e5ee..4e37b800 100755 --- a/core/layout/common.css +++ b/core/layout/common.css @@ -1365,4 +1365,5 @@ th.col12 { */ .captchaNumber { height:20px; + vertical-align: middle; } \ No newline at end of file From f062d209c89a1e6ad69cebe042f9853ea9e5b42b Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 11 Aug 2020 18:06:35 +0200 Subject: [PATCH 31/44] =?UTF-8?q?th=C3=A8me=20du=20bouton=20installation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/install/view/index/index.css | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100755 core/module/install/view/index/index.css diff --git a/core/module/install/view/index/index.css b/core/module/install/view/index/index.css deleted file mode 100755 index ba396f2e..00000000 --- a/core/module/install/view/index/index.css +++ /dev/null @@ -1,17 +0,0 @@ -/** - * This file is part of Zwii. - * - * For full copyright and license information, please see the LICENSE - * file that was distributed with this source code. - * - * @author Rémi Jean - * @copyright Copyright (C) 2008-2018, Rémi Jean - * @author Frédéric Tempez - * @copyright Copyright (C) 2018-2020, Frédéric Tempez - * @license GNU General Public License, version 3 - * @link http://zwiicms.com/ - */ - - - -@import url("site/data/admin.css"); \ No newline at end of file From 87b19c913a6b693fcc927e8d6de6edb24577c085 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 11 Aug 2020 18:06:52 +0200 Subject: [PATCH 32/44] largeur div captcha col5 --- module/blog/view/article/article.php | 2 +- module/form/view/index/index.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/blog/view/article/article.php b/module/blog/view/article/article.php index 4c24f23e..11f4f5e9 100755 --- a/module/blog/view/article/article.php +++ b/module/blog/view/article/article.php @@ -78,7 +78,7 @@ ]); ?> getUser('password') !== $this->getInput('ZWII_USER_PASSWORD')): ?>
    -
    +
    diff --git a/module/form/view/index/index.php b/module/form/view/index/index.php index e1dc4422..e7374a1c 100755 --- a/module/form/view/index/index.php +++ b/module/form/view/index/index.php @@ -45,7 +45,7 @@ getData(['module', $this->getUrl(0), 'config', 'captcha'])): ?>
    -
    +
    From fd633ccfd2abac5517dd4ea03600f9cacd3b3b44 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Tue, 11 Aug 2020 18:10:53 +0200 Subject: [PATCH 33/44] nettoyage d'espaces --- module/form/view/index/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module/form/view/index/index.php b/module/form/view/index/index.php index e7374a1c..368d534e 100755 --- a/module/form/view/index/index.php +++ b/module/form/view/index/index.php @@ -35,7 +35,7 @@ ]); ?> + ); ?>

    From cddf3ab4a565f01032f2b8b431052fa44165d562 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Wed, 12 Aug 2020 09:18:30 +0200 Subject: [PATCH 34/44] =?UTF-8?q?Fichier=20vide=20pour=20=C3=A9crasement?= =?UTF-8?q?=20du=20fichier=20dans=20les=20installations=20existantes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/module/install/view/index/index.css | 1 + 1 file changed, 1 insertion(+) create mode 100644 core/module/install/view/index/index.css diff --git a/core/module/install/view/index/index.css b/core/module/install/view/index/index.css new file mode 100644 index 00000000..d7c543b0 --- /dev/null +++ b/core/module/install/view/index/index.css @@ -0,0 +1 @@ +/* Vide */ \ No newline at end of file From 0b400cdb35dd543a60a45feafc9b28857882aa47 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Wed, 12 Aug 2020 09:21:40 +0200 Subject: [PATCH 35/44] =?UTF-8?q?D=C3=A9bordement=20dans=20inputfile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/class/template.class.php | 2 +- core/layout/common.css | 10 ++++++++++ module/blog/view/article/article.php | 1 - module/blog/view/edit/edit.php | 6 +++--- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/core/class/template.class.php b/core/class/template.class.php index 786ecc97..dfdcad0d 100755 --- a/core/class/template.class.php +++ b/core/class/template.class.php @@ -244,7 +244,7 @@ class template { 'value' => $attributes['value'] ]); // Champ d'upload - $html .= '
    -
    +
    'Taille optimale de l\'image de couverture : ' . ((int) substr($this->getData(['theme', 'site', 'width']), 0, -2) - (20 * 2)) . ' x 350 pixels.', 'label' => 'Image de couverture', @@ -44,13 +44,13 @@ 'value' => $this->getData(['module', $this->getUrl(0), $this->getUrl(2), 'picture']) ]); ?>
    -
    +
    'Largeur de l\'image', 'selected' => $this->getData(['module', $this->getUrl(0), $this->getUrl(2), 'pictureSize']) ]); ?>
    -

    Image

    - getData(['theme', 'body', 'image'])) ? $this->getData(['theme', 'body', 'image']) : ""; - echo template::file('themeBodyImage', [ - 'label' => 'Fond', - 'type' => 1, - 'value' => $imageFile - ]); ?> +
    +
    + getData(['theme', 'body', 'image'])) ? $this->getData(['theme', 'body', 'image']) : ""; + echo template::file('themeBodyImage', [ + 'help' => 'Sélectionner une image', + 'label' => 'Fond', + 'type' => 1, + 'value' => $imageFile + ]); ?> +
    +
    diff --git a/core/module/theme/view/header/header.php b/core/module/theme/view/header/header.php index 8d3b41cf..34b54e91 100755 --- a/core/module/theme/view/header/header.php +++ b/core/module/theme/view/header/header.php @@ -20,7 +20,7 @@
    'colorPicker', - 'help' => 'Le curseur horizontal règle le niveau de transparence.', + 'help' => 'Le curseur horizontal règle le niveau de transparence.', 'label' => 'Fond', 'value' => $this->getData(['theme', 'header', 'backgroundColor']) ]); ?> @@ -30,7 +30,7 @@
    'colorPicker', - 'help' => 'Le curseur horizontal règle le niveau de transparence.', + 'help' => 'Le curseur horizontal règle le niveau de transparence.', 'label' => 'Texte', 'value' => $this->getData(['theme', 'header', 'textColor']) ]); ?> @@ -47,6 +47,7 @@ $imageFile = file_exists(self::FILE_DIR.'source/'.$this->getData(['theme', 'header', 'image'])) ? $this->getData(['theme', 'header', 'image']) : ""; echo template::file('themeHeaderImage', [ + 'help' => 'Sélectionner une image aux dimensions recommandées ci-dessous :', 'label' => 'Fond', 'type' => 1, 'value' => $imageFile @@ -77,15 +78,15 @@
    $this->getData(['theme', 'header', 'linkHomePage']) - ]); ?> -
    + ]); ?> +
    Dimensions de l'image : largeur - hauteur - ratio -
    +
    @@ -110,7 +111,7 @@ Cover pour une image plus grande que la bannière, Contain pour une image plus petite. Les modes Auto et Etiré ne provoquent pas de modification de la hauteur de la bannière.' ]); ?> -
    +
    'Hauteur maximale', From 03620979b685a71bba5b0c4d090018a38a4e8757 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Wed, 12 Aug 2020 18:19:54 +0200 Subject: [PATCH 38/44] Commit inital --- core/core.php | 12 ++++-- core/module/config/config.php | 1 + core/module/config/view/index/index.php | 39 ++++++++++++------- core/module/install/ressource/defaultdata.php | 36 ++++++++++++++--- 4 files changed, 63 insertions(+), 25 deletions(-) diff --git a/core/core.php b/core/core.php index 8f83cace..ce1961fb 100755 --- a/core/core.php +++ b/core/core.php @@ -1954,10 +1954,14 @@ class core extends common { } elseif($this->output['content'] === '') { http_response_code(404); - $this->addOutput([ - 'title' => 'Erreur 404', - 'content' => template::speech('Oups ! La page demandée est introuvable...') - ]); + if ($this->getData(['config','page404'])) { + header('Location:' . helper::baseUrl() . $this->getData(['config','page404'])); + } else { + $this->addOutput([ + 'title' => 'Erreur 404', + 'content' => template::speech('Oups ! La page demandée est introuvable...') + ]); + } } // Mise en forme des métas if($this->output['metaTitle'] === '') { diff --git a/core/module/config/config.php b/core/module/config/config.php index 07881941..4a12da33 100755 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -424,6 +424,7 @@ class config extends common { 'config', [ 'homePageId' => $this->getInput('configHomePageId', helper::FILTER_ID, true), + 'page404' => $this->getInput('configPage404', helper::FILTER_ID, true), 'analyticsId' => $this->getInput('configAnalyticsId'), 'autoBackup' => $this->getInput('configAutoBackup', helper::FILTER_BOOLEAN), 'maintenance' => $this->getInput('configMaintenance', helper::FILTER_BOOLEAN), diff --git a/core/module/config/view/index/index.php b/core/module/config/view/index/index.php index a5d149c4..4611a2d3 100755 --- a/core/module/config/view/index/index.php +++ b/core/module/config/view/index/index.php @@ -29,21 +29,7 @@

    Informations générales

    -
    - getData(['page']); - foreach($pages as $page => $pageId) { - if ($this->getData(['page',$page,'block']) === 'bar' || - $this->getData(['page',$page,'disable']) === true) { - unset($pages[$page]); - } - } - echo template::select('configHomePageId', helper::arrayCollumn($pages, 'title', 'SORT_ASC'), [ - 'label' => 'Page d\'accueil', - 'selected' =>$this->getData(['config', 'homePageId']) - ]); ?> -
    -
    +
    'Titre du site', 'value' => $this->getData(['config', 'title']), @@ -60,6 +46,29 @@ ]); ?>
    +
    +
    + getData(['page']); + foreach($pages as $page => $pageId) { + if ($this->getData(['page',$page,'block']) === 'bar' || + $this->getData(['page',$page,'disable']) === true) { + unset($pages[$page]); + } + } + echo template::select('configHomePageId', helper::arrayCollumn($pages, 'title', 'SORT_ASC'), [ + 'label' => 'Page d\'accueil', + 'selected' =>$this->getData(['config', 'homePageId']) + ]); ?> +
    +
    + 'Page 404', + 'selected' =>$this->getData(['config', 'page404']) + ]); ?> +
    +
    diff --git a/core/module/install/ressource/defaultdata.php b/core/module/install/ressource/defaultdata.php index 5e7397a1..666c05d1 100755 --- a/core/module/install/ressource/defaultdata.php +++ b/core/module/install/ressource/defaultdata.php @@ -9,6 +9,7 @@ class init extends common { 'favicon' => 'favicon.ico', 'faviconDark' => 'faviconDark.ico', 'homePageId' => 'accueil', + 'page404' => 'erreur-404', 'maintenance' => false, 'social' => [ 'facebookId' => 'facebook', @@ -24,15 +25,15 @@ class init extends common { 'legalPageId' => 'mentions-legales', 'metaDescription' => 'Zwii est un CMS sans base de données qui permet de créer et gérer facilement un site web sans aucune connaissance en programmation.', 'title' => 'Votre site en quelques clics !', - 'proxyUrl' => "", - 'proxyPort' => "", - 'proxyType' => "tcp://", + 'proxyUrl' => '', + 'proxyPort' => '', + 'proxyType' => 'tcp://', 'smtp' => [ 'enable' => false, ], - "connect" => [ - "timeout" => 600, - "attempt" => 3, + 'connect' => [ + 'timeout' => 600, + 'attempt' => 3, 'log' => false ] ], @@ -537,6 +538,29 @@ class init extends common { 'hideMenuSide' => false, 'hideMenuHead' => false, 'hideMenuChildren' => false + ],'erreur-404'=> [ + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + 'content' => '

    Page introuvable !<\/h1>', + 'hideTitle' => false, + 'breadCrumb' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => '', + 'modulePosition' => 'bottom', + 'parentPageId' => '', + 'position' => 0, + 'group' => 0, + 'targetBlank' => false, + 'title' => 'Erreur 404', + 'block' => '12', + 'barLeft' => '', + 'barRight' => '', + 'displayMenu' => 'none', + 'hideMenuSide' => false, + 'hideMenuHead' => false, + 'hideMenuChildren' => false ] ], 'module' => [ From baffde2f07f8645f47a98293ea980609ffa3e3e9 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Wed, 12 Aug 2020 18:26:04 +0200 Subject: [PATCH 39/44] erreur de slash --- core/module/install/ressource/defaultdata.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/module/install/ressource/defaultdata.php b/core/module/install/ressource/defaultdata.php index 666c05d1..839ab60f 100755 --- a/core/module/install/ressource/defaultdata.php +++ b/core/module/install/ressource/defaultdata.php @@ -542,7 +542,7 @@ class init extends common { 'typeMenu' => 'text', 'iconUrl' => '', 'disable' => false, - 'content' => '

    Page introuvable !<\/h1>', + 'content' => '

    Page introuvable !

    ', 'hideTitle' => false, 'breadCrumb' => false, 'metaDescription' => '', From a7376f7f177caa4984e0c702e31eea736f37911a Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Thu, 13 Aug 2020 09:47:58 +0200 Subject: [PATCH 40/44] =?UTF-8?q?Choix=20aucune=20page=20personnalis=C3=A9?= =?UTF-8?q?e=20version=2010.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGES.md | 10 ++-- core/core.php | 20 ++++--- core/module/config/config.php | 3 +- core/module/config/view/index/index.php | 57 +++++++++---------- core/module/install/ressource/defaultdata.php | 23 -------- 5 files changed, 48 insertions(+), 65 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 56652276..09d9fda3 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,15 +1,15 @@ # Changelog -## version 10.2.07 +## version 10.3.00 - Corrections : - Bloquage de l'incrémentation de l'id de page lorsque deux pages ont le même nom. - Login : l'option "Se souvenir de moi" est fonctionnelle. - Menu : déplacement de la classe "active". - Modifications : - - Configuration : sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur. - - Configuration : le nom de l'archive prend le nom du sous-domaine s'il existe. - - Captcha : correction du nom de la fonction (capcha en captcha). - - Captcha : addition présentée en lettres, réponse en chiffres. + - Configuration du site : + - Page 404 personnalisable + - Sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur. ; le nom de l'archive prend le nom du sous-domaine s'il existe. + - Captcha : addition présentée en lettres sous la forme d'images, réponse en chiffres ; correction du nom de la fonction (capcha en captcha). ## version 10.2.06 - Corrections : diff --git a/core/core.php b/core/core.php index ce1961fb..7cb527f6 100755 --- a/core/core.php +++ b/core/core.php @@ -39,7 +39,7 @@ class common { const ACCESS_TIMER = 1800; // Numéro de version - const ZWII_VERSION = '10.2.07'; + const ZWII_VERSION = '10.3.00'; const ZWII_UPDATE_CHANNEL = "v10"; public static $actions = []; @@ -1356,6 +1356,12 @@ class common { $this->deleteData(['theme','footer','displayMemberLogout']); $this->setData(['core', 'dataVersion', 10201]); } + // Version 10.3.00 + if ($this->getData(['core', 'dataVersion']) < 10300) { + // Options de barre de membre simple + $this->setData(['config','page404','none']); + $this->setData(['core', 'dataVersion', 10300]); + } } } @@ -1954,13 +1960,13 @@ class core extends common { } elseif($this->output['content'] === '') { http_response_code(404); - if ($this->getData(['config','page404'])) { - header('Location:' . helper::baseUrl() . $this->getData(['config','page404'])); + if ( $this->getData(['config','page404']) === 'none') { + $this->addOutput([ + 'title' => 'Erreur 404', + 'content' => template::speech('Oups ! La page demandée est introuvable...') + ]); } else { - $this->addOutput([ - 'title' => 'Erreur 404', - 'content' => template::speech('Oups ! La page demandée est introuvable...') - ]); + header('Location:' . helper::baseUrl() . $this->getData(['config','page404'])); } } // Mise en forme des métas diff --git a/core/module/config/config.php b/core/module/config/config.php index 4a12da33..ffb5b577 100755 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -419,12 +419,13 @@ class config extends common { } else { $legalPageId = ''; } + $this->getInput('configPage404'); // Sauvegarder $this->setData([ 'config', [ 'homePageId' => $this->getInput('configHomePageId', helper::FILTER_ID, true), - 'page404' => $this->getInput('configPage404', helper::FILTER_ID, true), + 'page404' => $this->getInput('configPage404'), 'analyticsId' => $this->getInput('configAnalyticsId'), 'autoBackup' => $this->getInput('configAutoBackup', helper::FILTER_BOOLEAN), 'maintenance' => $this->getInput('configMaintenance', helper::FILTER_BOOLEAN), diff --git a/core/module/config/view/index/index.php b/core/module/config/view/index/index.php index 4611a2d3..c840bc7e 100755 --- a/core/module/config/view/index/index.php +++ b/core/module/config/view/index/index.php @@ -47,28 +47,36 @@

    -
    - getData(['page']); - foreach($pages as $page => $pageId) { - if ($this->getData(['page',$page,'block']) === 'bar' || - $this->getData(['page',$page,'disable']) === true) { - unset($pages[$page]); +
    + getData(['page']); + foreach($pages as $page => $pageId) { + if ($this->getData(['page',$page,'block']) === 'bar' || + $this->getData(['page',$page,'disable']) === true) { + unset($pages[$page]); + } } - } - echo template::select('configHomePageId', helper::arrayCollumn($pages, 'title', 'SORT_ASC'), [ - 'label' => 'Page d\'accueil', - 'selected' =>$this->getData(['config', 'homePageId']) + echo template::select('configHomePageId', helper::arrayCollumn($pages, 'title', 'SORT_ASC'), [ + 'label' => 'Page d\'accueil', + 'selected' =>$this->getData(['config', 'homePageId']) ]); ?>
    -
    - 'Page 404', - 'selected' =>$this->getData(['config', 'page404']) - ]); ?> -
    -
    + 'Aucune'],helper::arrayCollumn($pages, 'title', 'SORT_ASC')), [ + 'label' => 'Page d\'erreur 404 personnalisée', + 'selected' =>$this->getData(['config', 'page404']), + 'help' => 'Une page 404 ne doit pas apparaître dans l\'arborescence du menu. Créez puis sélectionnez une page orpheline.' + ]); ?> +
    +
    + 'Sélectionner'] , helper::arrayCollumn($this->getData(['page']), 'title', 'SORT_ASC') ) , [ + 'label' => 'Mentions légales', + 'selected' => $this->getData(['config', 'legalPageId']), + 'help' => 'Les mentions légales sont obligatoires en France.' + ]); ?> +
    +

    @@ -110,16 +118,7 @@ 'help' => 'Le fuseau horaire est utile au bon référencement' ]); ?>
    -
    - 'Sélectionner'] , helper::arrayCollumn($this->getData(['page']), 'title', 'SORT_ASC') ); - ?> - 'Mentions légales', - 'selected' => $this->getData(['config', 'legalPageId']), - 'help' => 'Les mentions légales sont obligatoires en France' - ]); ?> -
    -
    +
    $this->getData(['config', 'cookieConsent']) ]); ?> diff --git a/core/module/install/ressource/defaultdata.php b/core/module/install/ressource/defaultdata.php index 839ab60f..dc189880 100755 --- a/core/module/install/ressource/defaultdata.php +++ b/core/module/install/ressource/defaultdata.php @@ -538,29 +538,6 @@ class init extends common { 'hideMenuSide' => false, 'hideMenuHead' => false, 'hideMenuChildren' => false - ],'erreur-404'=> [ - 'typeMenu' => 'text', - 'iconUrl' => '', - 'disable' => false, - 'content' => '

    Page introuvable !

    ', - 'hideTitle' => false, - 'breadCrumb' => false, - 'metaDescription' => '', - 'metaTitle' => '', - 'moduleId' => '', - 'modulePosition' => 'bottom', - 'parentPageId' => '', - 'position' => 0, - 'group' => 0, - 'targetBlank' => false, - 'title' => 'Erreur 404', - 'block' => '12', - 'barLeft' => '', - 'barRight' => '', - 'displayMenu' => 'none', - 'hideMenuSide' => false, - 'hideMenuHead' => false, - 'hideMenuChildren' => false ] ], 'module' => [ From 1a6ce51080ab87a1b3aa452a0d61c80dc8a9ad57 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Thu, 13 Aug 2020 14:11:33 +0200 Subject: [PATCH 41/44] page 403 --- core/core.php | 15 ++++-- core/module/config/config.php | 1 + core/module/config/view/index/index.php | 46 +++++++++++++------ core/module/install/ressource/defaultdata.php | 4 +- 4 files changed, 46 insertions(+), 20 deletions(-) diff --git a/core/core.php b/core/core.php index 7cb527f6..586d17da 100755 --- a/core/core.php +++ b/core/core.php @@ -1360,8 +1360,9 @@ class common { if ($this->getData(['core', 'dataVersion']) < 10300) { // Options de barre de membre simple $this->setData(['config','page404','none']); + $this->setData(['config','page403','none']); $this->setData(['core', 'dataVersion', 10300]); - } + } } } @@ -1952,10 +1953,14 @@ class core extends common { 'content' => template::speech('La page ' . $accessInfo['pageId'] . ' est ouverte par l\'utilisateur ' . $accessInfo['userName'] . '') ]); } else { - $this->addOutput([ - 'title' => 'Erreur 403', - 'content' => template::speech('Vous n\'êtes pas autorisé à accéder à cette page...') - ]); + if ( $this->getData(['config','page404']) === 'none') { + $this->addOutput([ + 'title' => 'Erreur 403', + 'content' => template::speech('Vous n\'êtes pas autorisé à accéder à cette page...') + ]); + } else { + header('Location:' . helper::baseUrl() . $this->getData(['config','page403'])); + } } } elseif($this->output['content'] === '') { diff --git a/core/module/config/config.php b/core/module/config/config.php index ffb5b577..be28aefe 100755 --- a/core/module/config/config.php +++ b/core/module/config/config.php @@ -426,6 +426,7 @@ class config extends common { [ 'homePageId' => $this->getInput('configHomePageId', helper::FILTER_ID, true), 'page404' => $this->getInput('configPage404'), + 'page403' => $this->getInput('configPage403'), 'analyticsId' => $this->getInput('configAnalyticsId'), 'autoBackup' => $this->getInput('configAutoBackup', helper::FILTER_BOOLEAN), 'maintenance' => $this->getInput('configMaintenance', helper::FILTER_BOOLEAN), diff --git a/core/module/config/view/index/index.php b/core/module/config/view/index/index.php index c840bc7e..0fb94b39 100755 --- a/core/module/config/view/index/index.php +++ b/core/module/config/view/index/index.php @@ -42,12 +42,19 @@ 'Description du site', 'value' => $this->getData(['config', 'metaDescription']), - 'help' => 'Elle apparaît dans les partages sur les réseaux sociaux.' + 'help' => 'La description participe au référence, n\'oubliez pas de personnaliser la description de chaque page sans copié collé.' ]); ?>
    +
    +
    +
    +
    +
    +
    +

    Pages spéciales

    -
    +
    getData(['page']); foreach($pages as $page => $pageId) { @@ -57,26 +64,37 @@ } } echo template::select('configHomePageId', helper::arrayCollumn($pages, 'title', 'SORT_ASC'), [ - 'label' => 'Page d\'accueil', - 'selected' =>$this->getData(['config', 'homePageId']) + 'label' => 'Accueil du site', + 'selected' =>$this->getData(['config', 'homePageId']), + 'help' => 'La page par défaut, c\'est la première page vue par vos visiteurs' ]); ?>
    -
    - 'Aucune'],helper::arrayCollumn($pages, 'title', 'SORT_ASC')), [ - 'label' => 'Page d\'erreur 404 personnalisée', - 'selected' =>$this->getData(['config', 'page404']), - 'help' => 'Une page 404 ne doit pas apparaître dans l\'arborescence du menu. Créez puis sélectionnez une page orpheline.' - ]); ?> -
    -
    +
    'Sélectionner'] , helper::arrayCollumn($this->getData(['page']), 'title', 'SORT_ASC') ) , [ 'label' => 'Mentions légales', 'selected' => $this->getData(['config', 'legalPageId']), - 'help' => 'Les mentions légales sont obligatoires en France.' + 'help' => 'Les mentions légales sont obligatoires en France. Une option du thèmz - pied de page ajoute un lien discret vers cette page.' ]); ?>
    +
    +
    + 'Aucune'],helper::arrayCollumn($pages, 'title', 'SORT_ASC')), [ + 'label' => 'Accès interdit, erreur 403', + 'selected' =>$this->getData(['config', 'page403']), + 'help' => 'Une page 403 ne doit pas apparaître dans l\'arborescence du menu. Créez puis sélectionnez une page orpheline.' + ]); ?> +
    +
    + 'Aucune'],helper::arrayCollumn($pages, 'title', 'SORT_ASC')), [ + 'label' => 'Page inexistante, erreur 404 ', + 'selected' =>$this->getData(['config', 'page404']), + 'help' => 'Une page 404 ne doit pas apparaître dans l\'arborescence du menu. Créez puis sélectionnez une page orpheline.' + ]); ?> +
    +
    diff --git a/core/module/install/ressource/defaultdata.php b/core/module/install/ressource/defaultdata.php index dc189880..342f2587 100755 --- a/core/module/install/ressource/defaultdata.php +++ b/core/module/install/ressource/defaultdata.php @@ -9,7 +9,8 @@ class init extends common { 'favicon' => 'favicon.ico', 'faviconDark' => 'faviconDark.ico', 'homePageId' => 'accueil', - 'page404' => 'erreur-404', + 'page404' => 'none', + 'page403' => 'none', 'maintenance' => false, 'social' => [ 'facebookId' => 'facebook', @@ -666,3 +667,4 @@ class init extends common { ] ]; } + From 3a054065258c4d52af794eb9f2d2240d3cfa4c0e Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Thu, 13 Aug 2020 14:16:06 +0200 Subject: [PATCH 42/44] Erreur de champ --- core/core.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.php b/core/core.php index 586d17da..c722df05 100755 --- a/core/core.php +++ b/core/core.php @@ -1953,7 +1953,7 @@ class core extends common { 'content' => template::speech('La page ' . $accessInfo['pageId'] . ' est ouverte par l\'utilisateur ' . $accessInfo['userName'] . '') ]); } else { - if ( $this->getData(['config','page404']) === 'none') { + if ( $this->getData(['config','page403']) === 'none') { $this->addOutput([ 'title' => 'Erreur 403', 'content' => template::speech('Vous n\'êtes pas autorisé à accéder à cette page...') From 0aa0652de173ca47a628dc00fede4a7b72ae6432 Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Fri, 14 Aug 2020 07:14:11 +0200 Subject: [PATCH 43/44] =?UTF-8?q?Donn=C3=A9es=20par=20d=C3=A9faut=20actual?= =?UTF-8?q?is=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/core.php | 1 - core/module/install/ressource/defaultdata.php | 59 +++++++++++++++++-- 2 files changed, 54 insertions(+), 6 deletions(-) diff --git a/core/core.php b/core/core.php index c722df05..39dd9b1f 100755 --- a/core/core.php +++ b/core/core.php @@ -1351,7 +1351,6 @@ class common { if ($this->getData(['core', 'dataVersion']) < 10201) { // Options de barre de membre simple $this->setData(['theme','footer','displayMemberBar',false]); - $this->setData(['theme','menu','memberBar',true]); $this->deleteData(['theme','footer','displayMemberAccount']); $this->deleteData(['theme','footer','displayMemberLogout']); $this->setData(['core', 'dataVersion', 10201]); diff --git a/core/module/install/ressource/defaultdata.php b/core/module/install/ressource/defaultdata.php index 342f2587..7942a8f4 100755 --- a/core/module/install/ressource/defaultdata.php +++ b/core/module/install/ressource/defaultdata.php @@ -5,12 +5,13 @@ class init extends common { 'analyticsId' => '', 'autoBackup' => true, 'autoUpdate' => true, + 'autoUpdateHtaccess' => false, 'cookieConsent' => true, 'favicon' => 'favicon.ico', 'faviconDark' => 'faviconDark.ico', 'homePageId' => 'accueil', - 'page404' => 'none', - 'page403' => 'none', + 'page404' => 'erreur404', + 'page403' => 'erreur403', 'maintenance' => false, 'social' => [ 'facebookId' => 'facebook', @@ -39,7 +40,7 @@ class init extends common { ] ], 'core' => [ - 'dataVersion' => 10000, + 'dataVersion' => 10300, 'lastBackup' => 0, 'lastClearTmp' => 0, 'lastAutoUpdate' => 0, @@ -111,6 +112,7 @@ class init extends common { 'displayCopyright' => false, 'displayLegal' => false, 'displaySearch' => false, + 'displayMemberBar' => false, 'template' => '3' ], 'header' => [ @@ -148,7 +150,8 @@ class init extends common { 'activeColorAuto' => true, 'activeColor' => 'rgba(255, 255, 255, 1)', 'activeTextColor' => 'rgba(255, 255, 255, 1)', - 'radius' => '0px' + 'radius' => '0px', + 'memberBar' => true ], 'site' => [ 'backgroundColor' => 'rgba(255, 255, 255, 1)', @@ -539,7 +542,53 @@ class init extends common { 'hideMenuSide' => false, 'hideMenuHead' => false, 'hideMenuChildren' => false - ] + ], + 'erreur403' => [ + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + 'content' => '

    Vous n\'êtes pas autorisé à accéder à cette page...

    Personnalisez cette page à votre convenance sans qu\'elle apparaisse dans les menus.

    ', + 'hideTitle' => false, + 'breadCrumb' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => '', + 'modulePosition' => 'bottom', + 'parentPageId' => '', + 'position' => 0, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => false, + 'title' => 'Erreur 403', + 'block' => '12', + 'barLeft' => '', + 'barRight' => '', + 'displayMenu' => 'none', + 'hideMenuSide' => false, + 'hideMenuChildren' =>false + ], + 'erreur404' => [ + 'typeMenu' => 'text', + 'iconUrl' => '', + 'disable' => false, + 'content' => '

    Oups ! La page demandée est introuvable...

    Personnalisez cette page à votre convenance sans qu\'elle apparaisse dans les menus.

    ', + 'hideTitle' => false, + 'breadCrumb' => false, + 'metaDescription' => '', + 'metaTitle' => '', + 'moduleId' => '', + 'modulePosition' => 'bottom', + 'parentPageId' => '', + 'position' => 0, + 'group' => self::GROUP_VISITOR, + 'targetBlank' => false, + 'title' => 'Erreur 404', + 'block' => '12', + 'barLeft' => '', + 'barRight' => '', + 'displayMenu' => 'none', + 'hideMenuSide' => false, + 'hideMenuChildren' =>false + ], ], 'module' => [ 'blog' => [ From 2c803996f666fd8a662407565ce737261586aa5a Mon Sep 17 00:00:00 2001 From: Fred Tempez Date: Fri, 14 Aug 2020 07:16:09 +0200 Subject: [PATCH 44/44] Changes --- CHANGES.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 09d9fda3..ee86978d 100755 --- a/CHANGES.md +++ b/CHANGES.md @@ -7,7 +7,7 @@ - Menu : déplacement de la classe "active". - Modifications : - Configuration du site : - - Page 404 personnalisable + - Pages 403 (accès interdit) et 404 (page introuvable) personnalisables - Sauvegarde du site dans une archive : animation d'attente avec message de confirmation ou d'erreur. ; le nom de l'archive prend le nom du sous-domaine s'il existe. - Captcha : addition présentée en lettres sous la forme d'images, réponse en chiffres ; correction du nom de la fonction (capcha en captcha).