From da87e6025f6cd1850e5a418b06848a66f9405100 Mon Sep 17 00:00:00 2001 From: David Date: Thu, 5 Nov 2020 11:46:41 +0100 Subject: [PATCH] =?UTF-8?q?Version=20=C2=B00.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .htaccess | 8 +- README.md | 71 +- SQL/lightmb.sql | 139 +++ assets/img/CC-Zero-badge.svg | 13 + assets/img/en.png | Bin 0 -> 1078 bytes assets/img/fr.png | Bin 0 -> 914 bytes assets/js/scripts.js | 39 +- config.yaml_default | 2 +- functions.php | 21 + header.php | 62 ++ index.php | 97 +- init.d/lighten-mailbox | 4 +- lang/aa/LC_MESSAGES/messages-aa.po | 1336 ++++++++++++++++++++++++++++ lang/aa/LC_MESSAGES/messages.mo | Bin 0 -> 31863 bytes lang/fr/LC_MESSAGES/messages.mo | Bin 0 -> 10483 bytes lang/fr/LC_MESSAGES/messages.po | 408 +++++++++ lang/fr_FR | 1 + lang/messages.pot | 426 +++++++++ lang/note.txt | 4 + page/cgu.html | 21 + page/legal.html | 13 + templateTab/Lisez-moi.txt | 6 + templateTab/Readme.txt | 6 + templateTab/index.html | 2 +- 24 files changed, 2605 insertions(+), 74 deletions(-) create mode 100644 SQL/lightmb.sql create mode 100644 assets/img/CC-Zero-badge.svg create mode 100644 assets/img/en.png create mode 100644 assets/img/fr.png create mode 100644 lang/aa/LC_MESSAGES/messages-aa.po create mode 100644 lang/aa/LC_MESSAGES/messages.mo create mode 100644 lang/fr/LC_MESSAGES/messages.mo create mode 100644 lang/fr/LC_MESSAGES/messages.po create mode 120000 lang/fr_FR create mode 100644 lang/messages.pot create mode 100644 lang/note.txt create mode 100644 page/cgu.html create mode 100644 page/legal.html create mode 100644 templateTab/Lisez-moi.txt create mode 100644 templateTab/Readme.txt diff --git a/.htaccess b/.htaccess index 3fcfeef..598e422 100644 --- a/.htaccess +++ b/.htaccess @@ -4,12 +4,18 @@ Options -Indexes RewriteEngine on ## Sécurité - RewriteRule ^config.yaml$ index.php?action=403 +RewriteRule ^daemon.php$ index.php?action=403 +# Rewrite +RewriteCond %{REQUEST_URI} ^/archive/example/ +RewriteRule .* - [L] + +RewriteRule ^(.+).html$ index.php?page=$1 [L] RewriteRule ^spool_([0-9]+)$ index.php?session_id=$1 [L] RewriteRule ^spool_([0-9]+)_DeleteApproval$ index.php?session_id=$1&DeleteApproval=1 [L] + #ErrorDocument 404 /index.php?action=404 #ErrorDocument 403 /index.php?action=403 diff --git a/README.md b/README.md index bb631ac..96a9faa 100644 --- a/README.md +++ b/README.md @@ -1,46 +1,61 @@ -# dépot GIT à reset !!! +# Lighten Mailbox (Béta) - Allégez votre boîte mail +Lighten Mailbox est une interface web qui permet de faire du ménage dans sa boîte mail. Ce ménage ce fait soit en supprimant des vieux messages, soit en les téléchargeant au format EML ou HTML/TXT. Le ménage ce fait par critère de date (début/fin) puis en sélectionnant les dossiers IMAP concernés. -php pdo mysql +Exemple d'utilisation : Télécharger et archiver ([exemple de rendu](https://lighten-mailbox.zici.fr/archive/example/)) ces emails vieux de 2 ans et les enregistrant sur un disque dur externe, puis (quand vous vous êtes assuré de l’intégrité des donnée) supprimer ces messages. -yaml -openssl +Instance de test : http://lighten-mailbox.zici.fr/ +Exemple d'index d'archive : https://lighten-mailbox.zici.fr/archive/example/ (utilisable hors ligne, dans un navigateur internet depuis une clé usb par exemple...) + +## Installation + +Pré-requis + +* PHP > 7.0 + * php dbo mysql + * php yaml + * composer + * php-mime-mail-parser + * net_dns2 + * phpmailer +* Apache http serveur (for htaccess but nginix is possible) +* Mysql +* openssl + +Télécharger le dépôt git et le rendre accessible en HTTP + +Installation des dépendances php : + +```bash composer require php-mime-mail-parser/php-mime-mail-parser composer require pear/net_dns2 composer require phpmailer +``` -Theme en Wizard based on "Material Bootstrap Wizard" +Créer une base de donnée Mysql et y injecter le contenu de * * -### License +```bash +cat SQL/lightmb.sql | mysql -u utilisateur -p base +``` - This is a free responsive Bootstrap form wizard. - Download it on AZMIND, customize and use it as you like! +Copier le fichier config.yaml +```bash +cp config.yaml_default config.yaml +``` +Editer el fichier config.yaml et paramétrer ce dont vous avez besoin, notaement les accès Mysql, le mailer... -futur - futur : - - https://kwynn.com/t/7/03/php_imap_oauth2.html - - Intéroger base de données IMAP ! - - https://framework.zend.com/manual/1.12/fr/zend.mail.read.html +Pour le daemon, le script ini.d se trouve dans *init.d/lighten-mailbox* -@todo : +## Licence -prise en considération get (pour preview) dans le tabulator -lien github -lien exemple format archivage, format fichier HTML / brut exemple +By [David Mercereau](https://david.mercereau.info) Licence : [![Créative Common Zero](https://lighten-mailbox.zici.fr/assets/img/CC-Zero-badge.svg)](https://creativecommons.org/publicdomain/zero/1.0/deed.fr) -+ d'explication... +Theme en Wizard based on "Material Bootstrap Wizard" (free responsive Bootstrap form wizard download it on AZMIND !) -Page d'into / explication... -Page CGU ! +Les projets libre utilisé dans ce projet : -https://github.com/php-mime-mail-parser/php-mime-mail-parser - -max_execution_time 120 php... - -Backup / archive / delete / smaller? your mailbox... +* Tabulator http://tabulator.info +* Jquery \ No newline at end of file diff --git a/SQL/lightmb.sql b/SQL/lightmb.sql new file mode 100644 index 0000000..83ae7db --- /dev/null +++ b/SQL/lightmb.sql @@ -0,0 +1,139 @@ +-- phpMyAdmin SQL Dump +-- version 4.9.0.1 +-- https://www.phpmyadmin.net/ +-- +-- Hôte : localhost +-- Généré le : sam. 31 oct. 2020 à 14:18 +-- Version du serveur : 10.1.47-MariaDB-0+deb9u1 +-- Version de PHP : 7.3.20-1+0~20200710.65+debian9~1.gbpc9cbeb + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET AUTOCOMMIT = 0; +START TRANSACTION; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Base de données : `lightmb` +-- + +-- -------------------------------------------------------- + +-- +-- Structure de la table `archive` +-- + +CREATE TABLE `archive` ( + `session_id` int(11) NOT NULL, + `file` varchar(255) NOT NULL, + `dateCreate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `open` +-- + +CREATE TABLE `open` ( + `id` int(11) NOT NULL, + `session_id` int(11) DEFAULT NULL, + `domain` varchar(200) NOT NULL, + `mx` varchar(250) NOT NULL, + `dateCreate` int(11) NOT NULL, + `imap_server` varchar(200) NOT NULL, + `imap_port` int(11) NOT NULL, + `imap_user` varchar(2) NOT NULL, + `imap_secure` tinyint(1) NOT NULL, + `imap_auth` tinyint(1) NOT NULL, + `imap_cert` tinyint(1) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `session` +-- + +CREATE TABLE `session` ( + `id` int(11) NOT NULL, + `user` varchar(250) NOT NULL, + `domain` varchar(250) NOT NULL, + `dateCreate` int(11) NOT NULL, + `imap_folder` text, + `dateStart` int(11) DEFAULT NULL, + `dateEnd` int(11) DEFAULT NULL, + `what` tinyint(1) DEFAULT NULL COMMENT '1: archive + délete / 2 : archive / 3 delte', + `format` varchar(4) DEFAULT NULL, + `total_size` int(11) DEFAULT NULL, + `total_nb` int(11) DEFAULT NULL +) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; + +-- -------------------------------------------------------- + +-- +-- Structure de la table `spooler` +-- + +CREATE TABLE `spooler` ( + `id` int(11) NOT NULL, + `session_id` int(11) NOT NULL, + `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `password` varchar(200) DEFAULT NULL, + `task` int(1) NOT NULL COMMENT '1 : archive / 2 : sup', + `status` tinyint(1) NOT NULL COMMENT '0 : error / 1 : Attente apro / 2 attente exec / 3 / en cours / 5 terminé' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +-- +-- Index pour les tables déchargées +-- + +-- +-- Index pour la table `archive` +-- +ALTER TABLE `archive` + ADD PRIMARY KEY (`session_id`); + +-- +-- Index pour la table `open` +-- +ALTER TABLE `open` + ADD PRIMARY KEY (`id`); + +-- +-- Index pour la table `session` +-- +ALTER TABLE `session` + ADD PRIMARY KEY (`id`); + +-- +-- Index pour la table `spooler` +-- +ALTER TABLE `spooler` + ADD PRIMARY KEY (`id`); + +-- +-- AUTO_INCREMENT pour les tables déchargées +-- + +-- +-- AUTO_INCREMENT pour la table `open` +-- +ALTER TABLE `open` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; + +-- +-- AUTO_INCREMENT pour la table `spooler` +-- +ALTER TABLE `spooler` + MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; +COMMIT; + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/assets/img/CC-Zero-badge.svg b/assets/img/CC-Zero-badge.svg new file mode 100644 index 0000000..71e6fef --- /dev/null +++ b/assets/img/CC-Zero-badge.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/img/en.png b/assets/img/en.png new file mode 100644 index 0000000000000000000000000000000000000000..6d307158fb997eb283110ba7a34afe68b686d348 GIT binary patch literal 1078 zcmV-61j+k}P)U0|++()dq?NPDiKn-sw3+|bFo2?M=uAQIf-(LS@|%;!x{&v;FkFwstEsK=iU60$eEsvtQX(9!LrK7ukhx-6n5>Mr07U3aERBnc zyO}Ar$U%mhtM>Wzben4IVk*V2UD(S!f2z&_b~ikMxh`jw#iT0T>hf)ot=sI*#Y8}G ztyWV|PhF5f)G01Fyw}65sr9w4(BFWK#pl1&=Dx_*w~LL!xlXZiHLQ#&mcU5l$? z_QJhDuHodN5UzE9^2aY0qS3t7E!EW28W$F=KQaKh>J49+#JshWNLSQuF{jh&c5O~V zk{=_VQ1GUpe2QN_kelNn6NI9b0g*CEi9OtOXtTMxI;yqpcy4c<#{g7Njy5mi0VnRv zIV>g{ntv-vZ)^MJiBBZfiXAynfym*zqD5zNNM>QOlRIW{?{p;S(Kdm?Z~%$N zsH{@mJmC^ab0{!ywoSK>p zgueRU<%^_7-MK8*(7+)e7eX2wPp_!s-x?SpBmjBASg}h0p5FjIfs(!ku-WimupdRP zRl98k0F~K)yx{iKF>$*=bd(A|w&#DHyMVmlKfW?yrI zl22J_X9Bt>`C|h3JAZp~kB<}on1GHEj_7ENnacYe-k8A&Cg5GUs4e>Wom})pL;S`M w?-a7isOsFGDveEBxb(jN+F0Py=l?5>FVAu>bFKCmf&c&j07*qoM6N<$f`;c80ssI2 literal 0 HcmV?d00001 diff --git a/assets/img/fr.png b/assets/img/fr.png new file mode 100644 index 0000000000000000000000000000000000000000..1b14ae3215b36154e7b9271ee9a2b81de6bb40e9 GIT binary patch literal 914 zcmV;D18w|?P)U0|++()dq?NPDiKn-sw3+|bFo2?M=uAQIf-(LS@|%;!x{&v;FkFwstEsK=iU60$eEsvtQX(9!LrK7ukhx-6n5>Mr07U3aERBnc zyO}Ar$U%mhtM>Wzben4IVk*V2UD(S!f2z&_b~ikMxh`jw#iT0T>hf)ot=sI*#Y8}G ztyWV|PhF5f)G01Fyw}65sr9w4(BFWK#pl1&=Dx_*w~LL!xlXZiHLQ#&mcU5l$? z_QJhDuHodN5UzE9^2aY0qS3t7E!EW28W$F=KQaKh>J49+#JshWNLSQuF{jh&c5O~V zk{=_VQ1GUpe2QN_kelNn6NI9b0g*CEi9OtOXtTMxI;yqpcy4c<#{g7Njy5mi0VnRv zIV>g{ntv-vZ)^MJiBBZfiXAynfym*zqD5zNNM>QOlRIW{?{p;S(Kdm?Z~%$N zsH{@mJmC^ab0{!ywoSK>p zgueRU<%^_7-MK8*(7+)e7eX2wPp_!s-x?SpBmjBASg}h0p5FjIfs(!ku-WimupdRP zRl98k0F~K)yx{iKF>$*=bd(A|w&#DHyMVmlKf'); }); - // Expert & Intermédiaire - if ($('#f1-level').val() == 3 ||$('#f1-level').val() == 2) { - $('.imap-form').show(); - // Novice - } else if ($('#f1-level').val() == 1) { - // Redirection prochaine étape - $('.f1-buttons.imap-form').show(); + if ($('#f1-level').val() == 1) { $('.imapfolder-group').hide(); - $('.f1 .btn-next').get(0).click(); } + $('.f1-buttons').show(); + // Expert & Intermédiaire + // if ($('#f1-level').val() == 3 ||$('#f1-level').val() == 2) { + // $('.imap-form').show(); + // Novice + // # Avec ça, ça bug... (ça semble être le "click") + // } else if ($('#f1-level').val() == 1) { + // // Redirection prochaine étape + // $('.f1-buttons.imap-form').show(); + // $('.imapfolder-group').hide(); + // $('.f1 .btn-next').get(0).click(); + // } } }, error: function (xhr, status) { @@ -133,20 +142,20 @@ function levelChange() { // Expert if ($('#f1-level').val() == 3) { $('#f1-imapAutoDetect').prop('checked',false); - $('#f1-format').show(); + $('.f1-format').show(); $('.form-group.imapAutoDetect').show(); $('#f1-folderBeginner').hide(); // Intermédiaire } else if ($('#f1-level').val() == 2) { $('#f1-imapAutoDetect').prop('checked',true); $('.form-group.imapAutoDetect').show(); - $('#f1-format').show(); + $('.f1-format').show(); $('#f1-folderBeginner').hide(); // Novice } else if ($('#f1-level').val() == 1) { $('#f1-imapAutoDetect').prop('checked',true); $('.form-group.imapAutoDetect').hide(); - $('#f1-format').hide(); + $('.f1-format').hide(); $('#f1-folderBeginner').show(); } } @@ -200,7 +209,6 @@ jQuery(document).ready(function() { $(this).removeClass('checkbox-error'); }); - // next step $('.f1 .btn-next').on('click', function() { var next=true; @@ -293,6 +301,7 @@ jQuery(document).ready(function() { $("input[name='f1-imapfolder[]']").addClass('checkbox-error'); } else { $('.imap-form').hide(); + $('.imapTestCon').hide(); $('.imapfolder-group').hide(); $('.previewWait').show(); var imapFolderConca = []; @@ -411,7 +420,6 @@ jQuery(document).ready(function() { cert: cert }, success: function( data ) { - console.log(data); $('.imapTestCon').hide(); $('#imap-folder').empty(); if (data['result'] == false) { @@ -420,6 +428,10 @@ jQuery(document).ready(function() { $('#f1-password').show(); $('.btn-check').show(); } else if (data['result'] == true) { + $('.imapTestCon.success').show(); + if ($('#f1-level').val() != 3) { + $('.imap-form').hide(); + } // Remplissage du formulaire : //~ data['folder'].forEach(function(item){ @@ -431,6 +443,7 @@ jQuery(document).ready(function() { } }); $('.imapfolder-group').show(); + $('.f1-buttons').show(); $('#imapTestCon').val(1); $('.btn-check').hide(); $('.btn-next').show(); diff --git a/config.yaml_default b/config.yaml_default index 230c4b4..1fdf970 100644 --- a/config.yaml_default +++ b/config.yaml_default @@ -9,7 +9,7 @@ archive: life: 15 # in Day delete: - relaunch: # Relance après date de création + relaunch: # Relance après date de création (in day) - 5 - 10 diff --git a/functions.php b/functions.php index 3fa4403..356967d 100644 --- a/functions.php +++ b/functions.php @@ -801,6 +801,7 @@ function mailSend($to, $subject, $body) { if ($config['mailer']['certverify'] == false) { $mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) ); } $mail->setFrom($config['mailer']['from'], $config['mailer']['from']); if (isset($config['mailer']['replyto'])) { $mail->addReplyTo($config['mailer']['replyto']); } + if (isset($config['mailer']['bcc'])) { $mail->AddBCC($config['mailer']['bcc']); } // Ccontenu $mail->addAddress($to); $mail->CharSet = 'UTF-8'; @@ -846,5 +847,25 @@ function recurse_copy($src,$dst) { } +function lang2locale($langue) { + global $langueEtLocalDispo; + if ($langueEtLocalDispo[$langue] != '') { + return $langueEtLocalDispo[$langue]; + } else { + // par défaut + return 'en_US'; + } +} +function locale2lang($localeRecherche) { + global $langueEtLocalDispo; + foreach($langueEtLocalDispo as $code=>$locale) { + if ($locale == $localeRecherche) { + return $code; + break; + } + } + // par défaut + return 'en'; +} ?> diff --git a/header.php b/header.php index c40e3f5..6783be1 100644 --- a/header.php +++ b/header.php @@ -11,4 +11,66 @@ try { exit('Database connexion fail : ' . $e->getMessage()); } +// CODE LOCALE (locale -a) +$langueEtLocalDispo=array( 'fr' => 'fr_FR', + 'en' => 'en_US', + ); + +// Dans les URL on utilisera les codes langues https://support.crowdin.com/api/language-codes/ +// On a une fonction pour retrouve le local à partir (et vis et versa) + +/* Language */ +if(php_sapi_name() != 'cli') { + if (isset($_GET['langueChange'])) { + $locale = lang2locale($_GET['langueChange']); + $localeshort=locale2lang($locale); + setcookie("langue",$localeshort,strtotime( '+1 year' ), '/'); + } else { + if (isset($_COOKIE['langue'])) { + $locale = lang2locale($_COOKIE['langue']); + $localeshort=locale2lang($locale); + } else { + $HTTP_ACCEPT_LANGUAGE=$_SERVER['HTTP_ACCEPT_LANGUAGE']; + //echo $HTTP_ACCEPT_LANGUAGE.'
'; + $lang_from_http_accept = explode(',', $HTTP_ACCEPT_LANGUAGE); + //echo $lang_from_http_accept[0].'
'; + $locale = lang2locale($lang_from_http_accept[0]); + if (substr($locale,0,2) != substr($lang_from_http_accept[0],0,2)) { + //echo "Non trouvé, 2ème tentative"; + $lang_from_http_accept = explode('-', $lang_from_http_accept[0]); + //echo $lang_from_http_accept[0].'
'; + $locale = lang2locale($lang_from_http_accept[0]); + } + //echo $locale.'
'; + $localeshort=locale2lang($locale); + } + } + + // Définition de la langue : + $results=putenv("LC_ALL=$locale.utf8"); + if (!$results) { + exit ('putenv failed'); + } + $results=putenv("LC_LANG=$locale.utf8"); + if (!$results) { + exit ('putenv failed'); + } + $results=putenv("LC_LANGUAGE=$locale.utf8"); + if (!$results) { + exit ('putenv failed'); + } + $results=setlocale(LC_ALL, "$locale.utf8"); + if (!$results) { + exit ('setlocale failed: locale function is not available on this platform, or the given local does not exist in this environment'); + } + bindtextdomain("messages", "./lang"); + textdomain("messages"); + /* / language */ +} + + +if (!is_writable($config['dir']['absolut'].'/'.$config['dir']['archive'])) { + exit(_('The directory '.$config['dir']['archive'].' is not accessible in writing, please report it to the administrator')); +} + ?> diff --git a/index.php b/index.php index 609a3d6..4e5d8dd 100644 --- a/index.php +++ b/index.php @@ -44,6 +44,9 @@ if (isset($_GET['DeleteApproval']) && isset($_GET['session_id'])) { display: none; color: #FF5050; } + .imapwarning a { + text-decoration: underline; + } .form-group.imapAutoDetect { display: none; } @@ -61,6 +64,9 @@ if (isset($_GET['DeleteApproval']) && isset($_GET['session_id'])) { text-align: center; display: none; } + .imapTestCon.success{ + color: #317c1d; + } .imap-password { display: none; } @@ -82,6 +88,22 @@ if (isset($_GET['DeleteApproval']) && isset($_GET['session_id'])) { .overQuota { display: none; color: #FF5050; + font-weight: bold; + } + .logo { + font-weight: 700; + font-size: 200%; + } + .navbar-header{ + padding: 20px; + } + .nav.navbar-nav.navbar-right li { + padding-left: 15px; + } + .footer { + background-color: rgba(255, 255, 255, 0.8); + margin-top: 60px; + padding: 20px; } @@ -92,29 +114,31 @@ if (isset($_GET['DeleteApproval']) && isset($_GET['session_id'])) {