From bf2ee46a1c270deee870cd8270f9086a37a0cb2c Mon Sep 17 00:00:00 2001 From: Eric Lupinacci Date: Thu, 17 Feb 2022 18:57:16 +0100 Subject: [PATCH] Refactoring complet du plugin pour simplifier et fiabiliser le code en plus d'utiliser le plugin Archiviste. --- action/archive_mf_supprimer.php | 26 ++ action/archive_mf_telecharger.php | 34 ++ action/mes_fichiers_sauver.php | 46 --- action/mes_fichiers_telecharger.php | 33 -- ...iers_sauver.html => archive_mf_creer.html} | 44 +-- formulaires/archive_mf_creer.php | 63 ++++ formulaires/configurer_mes_fichiers.html | 2 +- formulaires/mes_fichiers_sauver.php | 46 --- ...iers_sauver.php => archive_mf_generer.php} | 6 +- genie/archive_mf_nettoyer.php | 18 ++ genie/mes_fichiers_cleaner.php | 17 - genie/mes_fichiers_cron.php | 14 +- inc/mes_fichiers.php | 300 ++++++++++++++++++ inc/mes_fichiers_archive_mf.php | 254 +++++++++++++++ inc/mes_fichiers_cleaner.php | 68 ---- inc/mes_fichiers_destinataires.php | 45 +++ inc/mes_fichiers_sauver.php | 98 ------ inc/mes_fichiers_utils.php | 274 ---------------- lang/mes_fichiers_fr.php | 9 +- mes_fichiers_fonctions.php | 48 +++ ...chiers_sauver.php => archive_mf_creer.php} | 16 +- notifications/archive_mf_nettoyer.php | 35 ++ notifications/mes_fichiers_cleaner.php | 37 --- paquet.xml | 2 +- prive/squelettes/contenu/mes_fichiers.html | 23 +- .../{mes_fichiers.html => archives_mf.html} | 29 +- .../liste/archives_mf_fonctions.php | 6 + .../liste/mes_fichiers_fonctions.php | 84 ----- 28 files changed, 903 insertions(+), 774 deletions(-) create mode 100644 action/archive_mf_supprimer.php create mode 100644 action/archive_mf_telecharger.php delete mode 100644 action/mes_fichiers_sauver.php delete mode 100644 action/mes_fichiers_telecharger.php rename formulaires/{mes_fichiers_sauver.html => archive_mf_creer.html} (53%) create mode 100644 formulaires/archive_mf_creer.php delete mode 100644 formulaires/mes_fichiers_sauver.php rename genie/{mes_fichiers_sauver.php => archive_mf_generer.php} (64%) create mode 100644 genie/archive_mf_nettoyer.php delete mode 100644 genie/mes_fichiers_cleaner.php create mode 100644 inc/mes_fichiers.php create mode 100644 inc/mes_fichiers_archive_mf.php delete mode 100644 inc/mes_fichiers_cleaner.php create mode 100644 inc/mes_fichiers_destinataires.php delete mode 100644 inc/mes_fichiers_sauver.php delete mode 100644 inc/mes_fichiers_utils.php create mode 100644 mes_fichiers_fonctions.php rename notifications/{mes_fichiers_sauver.php => archive_mf_creer.php} (66%) create mode 100644 notifications/archive_mf_nettoyer.php delete mode 100644 notifications/mes_fichiers_cleaner.php rename prive/squelettes/liste/{mes_fichiers.html => archives_mf.html} (63%) create mode 100644 prive/squelettes/liste/archives_mf_fonctions.php delete mode 100644 prive/squelettes/liste/mes_fichiers_fonctions.php diff --git a/action/archive_mf_supprimer.php b/action/archive_mf_supprimer.php new file mode 100644 index 0000000..3ad6fdb --- /dev/null +++ b/action/archive_mf_supprimer.php @@ -0,0 +1,26 @@ +
#ACTION_FORMULAIRE{#ENV{action}} -

<:mes_fichiers:info_liste_a_sauver:>

+ + #SET{name,a_sauver}#SET{obli,''}#SET{erreurs,#ENV**{erreurs/#GET{name}}} -
    -
  • +
    +
    + [ + (#GET{erreurs})] - [(#SET{taille_config,[(#CONFIG{mes_fichiers/taille_max_rep,500})]})] - [(#SET{taille_max,[(#GET{taille_config}|mult{1000}|mult{1000})]})] - [(#VALEUR|is_dir|oui) - [(#SET{taille,[(#VALEUR|mes_fichiers_dirsize)]})] - [(#SET{disabled,[(#GET{taille}|>{#GET{taille_max}}|?{'disabled="disabled"',''})]})] - ] - [(#VALEUR|is_dir|non) - [(#SET{taille,[(#VALEUR|filesize)]})] - [(#SET{disabled,''})] - ]
    - [(#GET{disabled}|oui) - - ] - + [] - [(#GET{disabled}|oui) -
    <:mes_fichiers:erreur_repertoire_trop_grand{taille_max=#GET{taille_config}}:>
    - ] + (#CLE|mes_fichiers_afficher_dossier) + [((#VALEUR{taille})[(#VALEUR{disable}|oui) <:mes_fichiers:erreur_repertoire_trop_grand{taille_max=#ENV{limite_max}}:>])] + ]

    @@ -41,16 +28,15 @@ <:mes_fichiers:bouton_tout_decocher:>

    -
  • -
+
+ + [(#EDITABLE|oui)

-

+

] - #BOITE_OUVRIR{'', notice} - <:mes_fichiers:message_rien_a_sauver:> - #BOITE_FERMER + [(#ALERTE_MESSAGE{<:mes_fichiers:message_rien_a_sauver:>, '', notice})] diff --git a/formulaires/archive_mf_creer.php b/formulaires/archive_mf_creer.php new file mode 100644 index 0000000..07042a1 --- /dev/null +++ b/formulaires/archive_mf_creer.php @@ -0,0 +1,63 @@ + 0) && ($octets > $octets_max); + } + + return [ + '_fichiers' => $chemins, + 'limite_max' => mes_fichiers_afficher_taille($octets_max), + 'editable' => autoriser('sauvegarder') + ]; +} + +function formulaires_archive_mf_creer_verifier_dist() { + + // Initialisation des erreurs de saisie + $erreurs = []; + + // Il devient obligatoire de saisir une liste non vide à archiver + if (!_request('a_sauver')) { + $erreurs['a_sauver'] = _T('info_obligatoire'); + } + + return $erreurs; +} + +function formulaires_archive_mf_creer_traiter_dist() { + + // Récupération de la liste des fichiers à archiver + $chemins = _request('a_sauver'); + + // Lancement de l'archivage + include_spip('inc/mes_fichiers_archive_mf'); + $erreur = archive_mf_creer($chemins); + + if ($erreur) { + $retour['message_erreur'] = _T('mes_fichiers:message_sauvegarde_nok', ['erreur' => $erreur]); + } else { + $retour['message_ok'] = _T('mes_fichiers:message_sauvegarde_ok'); + } + + return $retour; +} diff --git a/formulaires/configurer_mes_fichiers.html b/formulaires/configurer_mes_fichiers.html index fb34e7b..3a6db0e 100644 --- a/formulaires/configurer_mes_fichiers.html +++ b/formulaires/configurer_mes_fichiers.html @@ -10,7 +10,7 @@
  • <:mes_fichiers:explication_cfg_prefixe:>

    - +
  • <:mes_fichiers:explication_cfg_taille_max_rep:>

    diff --git a/formulaires/mes_fichiers_sauver.php b/formulaires/mes_fichiers_sauver.php deleted file mode 100644 index a1aa2a6..0000000 --- a/formulaires/mes_fichiers_sauver.php +++ /dev/null @@ -1,46 +0,0 @@ - mes_fichiers_a_sauver(), - 'editable' => autoriser('sauvegarder') - ]; -} - -function formulaires_mes_fichiers_sauver_verifier_dist() { - - // Initialisation des erreurs de saisie - $erreurs = []; - - // Il devient obligatoire de saisir une liste non vide à archiver - if (!_request('a_sauver')) { - $erreurs['a_sauver'] = _T('info_obligatoire'); - } - - return $erreurs; -} - -function formulaires_mes_fichiers_sauver_traiter_dist() { - - // Récupération de la liste des fichiers à archiver - $chemins = _request('a_sauver'); - - // Lancement de l'archivage - $archiver = charger_fonction('mes_fichiers_sauver', 'inc'); - $erreur = $archiver($chemins); - - if ($erreur) { - $retour['message_erreur'] = _T('mes_fichiers:message_sauvegarde_nok', ['erreur' => $erreur]); - } else { - $retour['message_ok'] = _T('mes_fichiers:message_sauvegarde_ok'); - } - - return $retour; -} diff --git a/genie/mes_fichiers_sauver.php b/genie/archive_mf_generer.php similarity index 64% rename from genie/mes_fichiers_sauver.php rename to genie/archive_mf_generer.php index c3e6c7d..d8ed519 100644 --- a/genie/mes_fichiers_sauver.php +++ b/genie/archive_mf_generer.php @@ -10,11 +10,11 @@ if (!defined('_ECRIRE_INC_VERSION')) { * * @return int */ -function genie_mes_fichiers_sauver_dist($last) { +function genie_archive_mf_generer_dist($last) { // On lance la sauvegarde périodique de tous les fichiers possibles avec comme auteur le CRON - $archiver = charger_fonction('mes_fichiers_sauver', 'inc'); - $archiver(null, array('auteur' => 'cron')); + include_spip('inc/mes_fichiers_archive_mf'); + archive_mf_creer(null, ['auteur' => 'cron']); return 1; } diff --git a/genie/archive_mf_nettoyer.php b/genie/archive_mf_nettoyer.php new file mode 100644 index 0000000..6644f77 --- /dev/null +++ b/genie/archive_mf_nettoyer.php @@ -0,0 +1,18 @@ + 'cron']); + + return 1; +} diff --git a/genie/mes_fichiers_cleaner.php b/genie/mes_fichiers_cleaner.php deleted file mode 100644 index 6eaa5ae..0000000 --- a/genie/mes_fichiers_cleaner.php +++ /dev/null @@ -1,17 +0,0 @@ - 'cron')); - - return 1; -} diff --git a/genie/mes_fichiers_cron.php b/genie/mes_fichiers_cron.php index 3ae7be9..5710b76 100644 --- a/genie/mes_fichiers_cron.php +++ b/genie/mes_fichiers_cron.php @@ -11,17 +11,17 @@ if (!defined('_ECRIRE_INC_VERSION')) { * @param array $taches_generales */ function mes_fichiers_taches_generales_cron($taches_generales) { - include_spip('inc/config'); - $sauver_auto = (lire_config('mes_fichiers/sauvegarde_reguliere', 'non') == 'oui'); - if ($sauver_auto) { + include_spip('inc/config'); + if (lire_config('mes_fichiers/sauvegarde_reguliere', 'non') === 'oui') { + // Archivage journalière de tous les fichiers possibles $jour = lire_config('mes_fichiers/frequence', 1); - $taches_generales['mes_fichiers_sauver'] = $jour * 24 * 3600; + $taches_generales['archive_mf_generer'] = $jour * 24 * 3600; } - $laver_auto = (lire_config('mes_fichiers/nettoyage_journalier', 'oui') == 'oui'); - if ($laver_auto) { - $taches_generales['mes_fichiers_cleaner'] = 24 * 3600; + if (lire_config('mes_fichiers/nettoyage_journalier', 'oui') === 'oui') { + // Nettoyage journalier des archives obsolètes + $taches_generales['archive_mf_nettoyer'] = 24 * 3600; } return $taches_generales; diff --git a/inc/mes_fichiers.php b/inc/mes_fichiers.php new file mode 100644 index 0000000..5dc8e92 --- /dev/null +++ b/inc/mes_fichiers.php @@ -0,0 +1,300 @@ + 0) { + // Convertir la taille max de Mo en octets pour comparaison + $octets_max = taille_convertir_en_octets($megaoctets_max); + + // Exclusion des fichiers ou dossiers trop volumineux + foreach ($liste as $_cle => $_chemin) { + // Calcul de la taille du fichier ou dossier + $taille_octets = mes_fichiers_lire_taille($_chemin); + if ($taille_octets > $octets_max) { + unset($liste[$_cle]); + } + } + } + + return $liste; +} + +/** + * Renvoie la taille d'un fichier ou d'un répertoire exprimée en octets. + * + * @uses dossier_calculer_taille() + * + * @param string $chemin Chemin vers le fichier ou le dossier concerné + * + * @return int Taille du dossier ou du fichier en octets + */ +function mes_fichiers_lire_taille($chemin) { + + return is_dir($chemin) + ? dossier_calculer_taille($chemin) + : filesize($chemin); +} + +/** + * Renvoie un chemin de dossier le plus propre possible en gérant le cas d'un SPIP mutualisé ou non. + * + * @uses joli_repertoire() + * + * @param string $dossier Chemin du dossier à afficher d'une manière la plus lisible. + */ +function mes_fichiers_afficher_dossier($dossier) { + + if ( + defined('_DIR_SITE') + and preg_match(',' . _DIR_SITE . ',', $dossier) + ) { + $joli_repertoire = str_replace(_DIR_SITE, '', $dossier); + } else { + include_spip('inc/utils'); + $joli_repertoire = joli_repertoire($dossier); + } + + return $joli_repertoire; +} + +// ---------------------------- + +/** + * Renvoie le fichier le plus récent d'un dossier donné. + * Le dossier ne doit contenir que des fichiers concernant le même sujet. + * + * @param $dossier + * + * @return string + */ +function dossier_trouver_fichier_recent($dossier) { + + // Par défaut, si le dossier est vide on renvoie un nom de fichier vide + $fichier_recent = ''; + + // On considère que dans le dossier tous les fichiers concernent le même sujet, il est donc inutile + // d'utiliser un pattern pour le fichier. + include_spip('inc/flock'); + $fichiers = preg_files($dossier); + $mtime_recent = 0; + foreach ($fichiers as $_fichier) { + if (($mtime = filemtime($_fichier)) > $mtime_recent) { + $fichier_recent = $_fichier; + $mtime_recent = $mtime; + } + } + + return $fichier_recent; +} + + +/** + * Calculer la taille d'un répertoire en itérant sur son contenu. + * + * @link http://aidanlister.com/repos/v/function.dirsize.php + * + * @param string $path Chemin vers le dossier concerné + * + * @return int + */ +function dossier_calculer_taille($path) { + + // Par défaut, erreur ou pas, le dossier est vide + $size = 0; + + // Trailing slash + if (substr($path, -1, 1) !== DIRECTORY_SEPARATOR) { + $path .= DIRECTORY_SEPARATOR; + } + + // Sanity check + if (is_file($path)) { + $size = filesize($path); + } elseif (is_dir($path)) { + // Iterate queue + $queue = array($path); + for ($i = 0, $j = count($queue); $i < $j; ++$i) { + // Open directory + if (is_dir($queue[$i]) && $dir = @dir($queue[$i])) { + $subdirs = array(); + while (false !== ($entry = $dir->read())) { + // Skip pointers + if ($entry == '.' || $entry == '..') { + continue; + } + + // Get list of directories or filesizes + $path = $queue[$i] . $entry; + if (is_dir($path)) { + $path .= DIRECTORY_SEPARATOR; + $subdirs[] = $path; + } elseif (is_file($path)) { + $size += filesize($path); + } + } + + // Add subdirectories to start of queue + unset($queue[0]); + $queue = array_merge($subdirs, $queue); + + // Recalculate stack size + $i = -1; + $j = count($queue); + + // Clean up + $dir->close(); + unset($dir); + } + } + } + + return $size; +} + + +/** + * Convertit en octets une taille exprimée en multiple d'octets, en considérant le système d'unité utilisé, à savoir, + * le système international en base 10 ou le système binaire. + * + * @param int $taille Taille dans l'unité spécifiée en second argument + * @param string $unite Abbréviation de l'unité, à savoir, `K`, `M` (défaut), `G` ou `T`. + * @param string $systeme Système d'unité dans lequel calculer et afficher la taille lisble. Vaut `BI` (défaut) ou `SI`. + * + * @return int + */ +function taille_convertir_en_octets($taille, $unite = 'M', $systeme = 'BI') { + + static $puissances = [ + 'k' => 1, + 'm' => 2, + 'g' => 3, + 't' => 4, + ]; + static $bases = [ + 'si' => 1000, + 'bi' => 1024 + ]; + + // Si l'unité est incorrecte on renvoie 0 + $taille_octets = 0; + if ( + ($unite = strtolower($unite)) + and array_key_exists($unite, $puissances) + and ($systeme = strtolower($systeme)) + and array_key_exists($systeme, $bases) + ) { + return (int)$taille * pow($bases[$systeme], $puissances[$unite]); + } + + return $taille_octets; +} diff --git a/inc/mes_fichiers_archive_mf.php b/inc/mes_fichiers_archive_mf.php new file mode 100644 index 0000000..21634c8 --- /dev/null +++ b/inc/mes_fichiers_archive_mf.php @@ -0,0 +1,254 @@ + 0) { + // On stocke les fichiers et répertoires source pour insérer cette liste en commentaire de l'archive + $liste_finale = []; + foreach ($liste as $_chemin) { + $liste_finale[] = mes_fichiers_afficher_dossier($_chemin); + } + + // On construit le nom de l'archive et on crée le répertoire d'accueil si il n'existe pas déjà. + $dir = sous_repertoire(_MES_FICHIERS_DOSSIER); + $prefixe = lire_config('mes_fichiers/prefixe', 'mf3'); + $chemin_archive = $dir . $prefixe . '_' . date('Ymd_His') . '.zip'; + + // On prépare le commentaire + if ($auteur === 'cron') { + $auteur = 'SPIP'; + } + $meta = [ + 'auteur' => $auteur, + 'contenu' => $liste_finale + ]; + + // On lance l'archivage du contenu. + include_spip('inc/archives'); + $archive = new Spip\Archives\SpipArchives($chemin_archive); + if (!$archive->emballer($liste)) { + // -- on renvoie le message d'erreur provenant de la librairie d'archivage + $erreur = $archive->message(); + } else { + // -- si pas d'erreur, on ajoute le commentaire + $archive->commenter(serialize($meta)); + } + } else { + $erreur = _T('mes_fichiers:erreur_aucun_fichier_sauver'); + } + + // Un pipeline post_sauvegarde pour que d'autres plugins puissent agir à ce moment là. + pipeline( + 'post_sauvegarde', + array( + 'args' => array( + 'err' => $erreur, + 'auteur' => $auteur, + 'type' => 'mes_fichiers_sauver' + ), + 'data' => '' + ) + ); + + // Notifications si nécessaire. + if ($notifications = charger_fonction('notifications', 'inc')) { + $notifications( + 'archive_mf_creer', + '', + array( + 'auteur' => $auteur, + 'err' => $erreur) + ); + } + + return $erreur; +} + + +/** + * Supprime les fichiers d'archive considérés comme obsolètes. + * La fonction retourne la liste des archives effectivement supprimées. + * + * @api + * + * @param array $options + * + * @return array Liste des archives effectivement supprimées. + */ +function archive_mf_nettoyer($options = array()) { + // Initialiser la liste des archives supprimées fournie en retour + $liste = []; + + // Supprimer les archives dont l'échéance de garde est échue + include_spip('inc/config'); + $duree_sauvegarde = intval(lire_config('mes_fichiers/duree_sauvegarde', 15)); + if ($duree_sauvegarde > 0) { + // Stocker la date actuelle pour calculer l'obsolescence + $temps = time(); + + // Identification du préfixe des archives + $prefixe = lire_config('mes_fichiers/prefixe', 'mf3') . '_'; + + // Scan des archives existantes et suppression des obsolètes + include_spip('inc/flock'); + $archives = preg_files(_MES_FICHIERS_DOSSIER, "${prefixe}.+[.](zip)$"); + $liste = array(); + foreach ($archives as $_archive) { + $date_fichier = filemtime($_archive); + if ($temps > ($date_fichier + $duree_sauvegarde * 3600 * 24)) { + supprimer_fichier($_archive); + $liste[] = $_archive; + } + } + } + + // Identification de l'auteur ayant déclenché l'archivage + $auteur = $options['auteur'] ?: $GLOBALS['visiteur_session']['id_auteur']; + if ($auteur == 'cron') { + $auteur = 'SPIP'; + } + + // Pipeline de post sauvegarde si besoin + pipeline( + 'post_sauvegarde', + array( + 'args' => array( + 'liste' => $liste, + 'auteur' => $auteur, + 'type' => 'mes_fichiers_cleaner' + ), + 'data' => '' + ) + ); + + // Notification de l'action + if ($notifications = charger_fonction('notifications', 'inc')) { + $notifications( + 'archive_mf_nettoyer', + '', + array('liste' => $liste, 'auteur' => $auteur) + ); + } + + return $liste; +} + +/** + * Renvoie la liste des archives disponibles au telechargement par date inverse + * + * @api + * + * @return array + */ +function archive_mf_lister() { + + include_spip('inc/config'); + $prefixe = lire_config('mes_fichiers/prefixe', 'mf3'); + $laver_auto = (lire_config('mes_fichiers/nettoyage_journalier', 'oui') == 'oui'); + + $pattern = "${prefixe}.*\.zip$"; + + include_spip('inc/flock'); + if ($laver_auto) { + $liste = preg_files(_MES_FICHIERS_DOSSIER, $pattern); + } else { + $liste = preg_files(_MES_FICHIERS_DOSSIER, $pattern, 50); + } + + // On filtre les fichiers vides ou corrompues qui sont des résultats d'erreur lors de l'archivage + foreach ($liste as $_cle => $_archive) { + if (!is_file($_archive) + or !is_readable($_archive) + or (filesize($_archive) === 0)) { + unset($liste[$_cle]); + } + } + + return array_reverse($liste); +} + +/** + * Renvoie les informations sur le contenu de l'archive + * + * @api + * + * @param string $zip Chemin de l'archive + * + * @return string + */ +function archive_mf_informer($zip) { + + // Extraction des informations sur l'archive + include_spip('inc/archives'); + $archive = new Spip\Archives\SpipArchives($zip); + $informations = $archive->informer(); + + $resume = ''; + if (empty($informations['commentaire'])) { + $resume .= _T('mes_fichiers:message_zip_propriete_nok'); + spip_log('Commentaire de l\'archive absente ou d\'un format obsolète', 'mes_fichiers' . _LOG_ERREUR); + } else { + $commentaire = unserialize($informations['commentaire']); + + if ( + !empty($commentaire['contenu']) + and !empty($commentaire['auteur']) + ) { + $liste = $commentaire['contenu']; + $id_auteur = $commentaire['auteur']; + + // On gere le cas où l'auteur est le cron + if (intval($id_auteur)) { + $auteur = sql_getfetsel('nom', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); + } else { + $auteur = $id_auteur; + } + $resume .= _T('mes_fichiers:resume_zip_auteur') . ' : ' . $auteur . '
    '; + $resume .= _T('mes_fichiers:resume_zip_compteur') . ' : ' . count($informations['fichiers']) . '
    '; + $resume .= _T('mes_fichiers:resume_zip_contenu') . ' : ' . '
    '; + $resume .= ''; + } + } + + return $resume; +} diff --git a/inc/mes_fichiers_cleaner.php b/inc/mes_fichiers_cleaner.php deleted file mode 100644 index c5790f2..0000000 --- a/inc/mes_fichiers_cleaner.php +++ /dev/null @@ -1,68 +0,0 @@ - 0) { - // Stocker la date actuelle pour calculer l'obsolescence - $temps = time(); - - // Scan des archives existantes - include_spip('inc/mes_fichiers_utils'); - $prefixe = lire_config('mes_fichiers/prefixe', 'mf2') . '_'; - $archives = preg_files(_MES_FICHIERS_DOSSIER, "${prefixe}.+[.](zip)$"); - $liste = array(); - foreach ($archives as $_archive) { - $date_fichier = filemtime($_archive); - if ($temps > ($date_fichier + $jours_obso * 3600 * 24)) { - $liste[] = $_archive; - supprimer_fichier($_archive); - } - } - } - - // Identification de l'auteur ayant déclenché l'archivage - $auteur = $options['auteur'] ?: $GLOBALS['visiteur_session']['id_auteur']; - if ($auteur == 'cron') { - $auteur = 'SPIP'; - } - - // Pipeline de post sauvegarde si besoin - pipeline( - 'post_sauvegarde', - array( - 'args' => array( - 'liste' => $liste, - 'auteur' => $auteur, - 'type' => 'mes_fichiers_cleaner' - ), - 'data' => '' - ) - ); - - // Notification de l'action - if ($notifications = charger_fonction('notifications', 'inc')) { - $notifications( - 'mes_fichiers_cleaner', - '', - array('liste' => $liste, 'auteur' => $auteur) - ); - } - - return $liste; -} diff --git a/inc/mes_fichiers_destinataires.php b/inc/mes_fichiers_destinataires.php new file mode 100644 index 0000000..d119723 --- /dev/null +++ b/inc/mes_fichiers_destinataires.php @@ -0,0 +1,45 @@ + [ + 'quoi' => $quoi, + 'id' => $id, + 'options'=> $options + ], + 'data'=> $mails_configures + ] + ); + + // Nettoyage de la liste d'emails en vérifiant les doublons + // et la validité des emails + include_spip('inc/notifications'); + notifications_nettoyer_emails($destinataires); + + return $destinataires; +} diff --git a/inc/mes_fichiers_sauver.php b/inc/mes_fichiers_sauver.php deleted file mode 100644 index 1b7c50f..0000000 --- a/inc/mes_fichiers_sauver.php +++ /dev/null @@ -1,98 +0,0 @@ - 0) { - // On vérifie que les répertoires n'excèdent pas la taille maximale configurée - // et on stocke les fichiers et répertoires pour insérer cette liste en commentaire de l'archive - include_spip('inc/config'); - $taille_max = intval(lire_config('mes_fichiers/taille_max_rep', 75)) * 1000 * 1000; - $liste_finale = []; - foreach ($liste as $_cle => $_chemin) { - if (is_dir($_chemin) and (mes_fichiers_dirsize($_chemin) > $taille_max)) { - unset($liste[$_cle]); - } else { - $liste_finale[] = mes_fichiers_joli_repertoire($_chemin); - } - } - - // On construit le nom de l'archive et on crée le répertoire d'accueil si il n'existe pas déjà. - $dir = sous_repertoire(_MES_FICHIERS_DOSSIER); - $prefixe = lire_config('mes_fichiers/prefixe', 'mf2'); - $chemin_archive = $dir . $prefixe . '_' . date('Ymd_His') . '.zip'; - - // On prépare le commentaire - if ($auteur === 'cron') { - $auteur = 'SPIP'; - } - $meta = [ - 'auteur' => $auteur, - 'contenu' => $liste_finale - ]; - - // On lance l'archivage du contenu. - include_spip('inc/archives'); - $archive = new Spip\Archives\SpipArchives($chemin_archive); - if (!$archive->emballer($liste)) { - // -- on renvoie le message d'erreur provenant de la librairie d'archivage - $erreur = $archive->message(); - } else { - // -- si pas d'erreur, on ajoute le commentaire - $archive->commenter(serialize($meta)); - } - } else { - $erreur = _T('mes_fichiers:erreur_aucun_fichier_sauver'); - } - - // Un pipeline post_sauvegarde pour que d'autres plugins puissent agir à ce moment là. - pipeline( - 'post_sauvegarde', - array( - 'args' => array( - 'err' => $erreur, - 'auteur' => $auteur, - 'type' => 'mes_fichiers_sauver' - ), - 'data' => '' - ) - ); - - // Notifications si nécessaire. - if ($notifications = charger_fonction('notifications', 'inc')) { - $notifications( - 'mes_fichiers_sauver', - '', - array( - 'auteur' => $auteur, - 'err' => $erreur) - ); - } - - return $erreur; -} diff --git a/inc/mes_fichiers_utils.php b/inc/mes_fichiers_utils.php deleted file mode 100644 index 16550d7..0000000 --- a/inc/mes_fichiers_utils.php +++ /dev/null @@ -1,274 +0,0 @@ -read())) { - // Skip pointers - if ($entry == '.' || $entry == '..') { - continue; - } - - // Get list of directories or filesizes - $path = $queue[$i] . $entry; - if (is_dir($path)) { - $path .= DIRECTORY_SEPARATOR; - $subdirs[] = $path; - } elseif (is_file($path)) { - $size += filesize($path); - } - } - - // Add subdirectories to start of queue - unset($queue[0]); - $queue = array_merge($subdirs, $queue); - - // Recalculate stack size - $i = -1; - $j = count($queue); - - // Clean up - $dir->close(); - unset($dir); - } - } - } - - return $size; -} - -/** - * Renvoie une taille de dossier ou de fichier humainement lisible. - * - * @link http://aidanlister.com/repos/v/function.size_readable.php - * - * @param int $size Taille en octets - * @param string $max Unité maximale - * @param string $system Système d'unités : `si` pour le système international, `bi` pour des unités binaires - * @param string $format Format de retour - * - * @return string Chaine compréhensible pour une taille de fichier ou dossier - */ -function mes_fichiers_size_readable($size, $max = null, $system = 'si', $format = '%01.2f %s') { - - // Pick units - $systems['si']['prefix'] = array('B', 'K', 'MB', 'GB', 'TB', 'PB'); - $systems['si']['size'] = 1000; - $systems['bi']['prefix'] = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB'); - $systems['bi']['size'] = 1024; - - // Système choisi - $sys = $systems[$system] ?? $systems['si']; - - // Max unit to display - $depth = count($sys['prefix']) - 1; - if ($max && false !== $d = array_search($max, $sys['prefix'])) { - $depth = $d; - } - - // Loop - $i = 0; - while ($size >= $sys['size'] && $i < $depth) { - $size /= $sys['size']; - $i++; - } - - return sprintf($format, $size, $sys['prefix'][$i]); -} - -/** - * Renvoie le fichier le plus récent d'un dossier donné. - * Le dossier ne doit contenir que des fichiers concernant le même sujet. - * - * @param $dossier - * - * @return string - */ -function mes_fichiers_fichier_recent($dossier) { - - // Par défaut, si le dossier est vide on renvoie un nom de fichier vide - $fichier_recent = ''; - - // On considère que dans le dossier tous les fichiers concernent le même sujet, il est donc inutile - // d'utiliser un pattern pour le fichier. - include_spip('inc/flock'); - $fichiers = preg_files($dossier); - $mtime_recent = 0; - foreach ($fichiers as $_fichier) { - if (($mtime = filemtime($_fichier)) > $mtime_recent) { - $fichier_recent = $_fichier; - $mtime_recent = $mtime; - } - } - - return $fichier_recent; -} - -/** - * @param $quoi - * @param $id - * @param $options - * - * @return mixed|null - */ -function mes_fichiers_preparer_destinataires($quoi, $id, $options) { - - // Recuperation des destinataires configurés - include_spip('inc/config'); - $mails_configures = lire_config('mes_fichiers/notif_mail', []); - if ($mails_configures) { - $mails_configures = explode(',', $mails_configures); - } - - // On ajoute systématiquement le webmestre - if (!empty($GLOBALS['meta']['email_webmaster'])) { - $mails_configures[] = $GLOBALS['meta']['email_webmaster']; - } - - // On ajoute les éventuels destinataires supplémentaires fournis par des plugins - $destinataires = pipeline( - 'notifications_destinataires', - [ - 'args'=> [ - 'quoi'=>$quoi, - 'id'=>$id, - 'options'=>$options - ], - 'data'=> $mails_configures - ] - ); - - // Nettoyage de la liste d'emails en vérifiant les doublons - // et la validité des emails - notifications_nettoyer_emails($destinataires); - - return $destinataires; -} diff --git a/lang/mes_fichiers_fr.php b/lang/mes_fichiers_fr.php index 220a2bb..152ccf8 100644 --- a/lang/mes_fichiers_fr.php +++ b/lang/mes_fichiers_fr.php @@ -20,7 +20,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( // E 'erreur_aucun_fichier_sauver' => 'Il n’y a aucun fichier à sauvegarder', - 'erreur_repertoire_trop_grand' => 'Ce répertoire dépasse la limite de @taille_max@ MB et ne peut être sauvegardé.', + 'erreur_repertoire_trop_grand' => '> à la limite de @taille_max@', 'explication_cfg_duree_sauvegarde' => 'Saisir la durée de conservation des sauvegardes en jours', 'explication_cfg_frequence' => 'Saisir la fréquence des sauvegardes en jours', 'explication_cfg_notif_mail' => 'Saisir les adresses en les séparant par des virgules ",". Ces adresses s’ajoutent à celle du webmestre du site.', @@ -55,7 +55,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'message_sauvegarde_nok' => 'Erreur lors de la sauvegarde. Le fichier d’archives n’a pas été créé (@erreur@).', 'message_sauvegarde_ok' => 'Le fichier d’archives a bien été créé.', 'message_sauver_sujet' => 'Sauvegarde', - 'message_telechargement_nok' => 'Erreur lors du téléchargement.', + 'message_suppression_nok' => 'Erreur lors de la suppression de l\'archive.', + 'message_telechargement_nok' => 'Erreur lors du téléchargement de l\'archive.', 'message_zip_auteur_indetermine' => 'Non déterminé', 'message_zip_propriete_nok' => 'Aucune propriété n’est disponible sur cette archive.', 'message_zip_sans_contenu' => 'Aucune information n’est disponible sur le contenu de cette archive.', @@ -67,6 +68,10 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'resume_zip_statut' => 'Statut', // T + 'taille_go_bi' => '@taille@ Gio', + 'taille_ko_bi' => '@taille@ kio', + 'taille_mo_bi' => '@taille@ Mio', + 'taille_octets_bi' => '@taille@ octets', 'titre_boite_sauver' => 'Créer une archive', 'titre_boite_telecharger' => 'Liste des archives disponibles au téléchargement', 'titre_page_configurer' => 'Configuration du plugin Mes fichiers', diff --git a/mes_fichiers_fonctions.php b/mes_fichiers_fonctions.php new file mode 100644 index 0000000..9722870 --- /dev/null +++ b/mes_fichiers_fonctions.php @@ -0,0 +1,48 @@ += 1) { + // Déterminer le nombre d'octets représentant le kilo en fonction du système choisi + $systeme = strtolower($systeme); + if ($systeme === 'bi') { + $kilo = 1024; + $suffixe_item = "_$systeme"; + $module = 'mes_fichiers'; + } else { + $kilo = 1000; + $suffixe_item = ''; + $module = 'spip'; + } + + // Identification de la puissance en "kilo" correspondant à l'unité la plus appropriée + $puissance = floor(log($octets, $kilo)); + + // Calcul de la taille et choix de l'unité + $affichage = _T( + $module . ':taille_' . $unites[$puissance] . $suffixe_item, + [ + 'taille' => round($octets / pow($kilo, $puissance), $precisions[$puissance]) + ] + ); + } + + return $affichage; +} diff --git a/notifications/mes_fichiers_sauver.php b/notifications/archive_mf_creer.php similarity index 66% rename from notifications/mes_fichiers_sauver.php rename to notifications/archive_mf_creer.php index ea50575..01ad5d8 100644 --- a/notifications/mes_fichiers_sauver.php +++ b/notifications/archive_mf_creer.php @@ -2,15 +2,16 @@ if (!defined('_ECRIRE_INC_VERSION')) { return; } -function notifications_mes_fichiers_sauver_dist($quoi, $id, $options) { - include_spip('inc/config'); - $notif_active = (lire_config('mes_fichiers/notif_active', 'non') == 'oui'); +function notifications_archive_mf_creer_dist($quoi, $id, $options) { - if ($notif_active - and !$options['err']) { + if ( + include_spip('inc/config') + and (lire_config('mes_fichiers/notif_active', 'non') === 'oui') + and !$options['err'] + ) { // preparation de la liste des destinataires - include_spip('inc/mes_fichiers_utils'); - $destinataires = mes_fichiers_preparer_destinataires($quoi, $id, $options); + $preparer_destinataires = charger_fonction('mes_fichiers_destinataires', 'inc'); + $destinataires = $preparer_destinataires($quoi, $id, $options); // Determination de l'auteur de la sauvegarde if (intval($options['auteur'])) { @@ -29,6 +30,7 @@ function notifications_mes_fichiers_sauver_dist($quoi, $id, $options) { $msg_mail = _T('mes_fichiers:message_notif_sauver_intro', array('auteur' => $auteur)); // Envoi de la notification + include_spip('inc/notifications'); notifications_envoyer_mails($destinataires, $msg_mail, $sujet_mail); } } diff --git a/notifications/archive_mf_nettoyer.php b/notifications/archive_mf_nettoyer.php new file mode 100644 index 0000000..32733c1 --- /dev/null +++ b/notifications/archive_mf_nettoyer.php @@ -0,0 +1,35 @@ + $duree)) . $liste_fichiers; + + // Envoi de la notification + include_spip('inc/notifications'); + notifications_envoyer_mails($destinataires, $msg_mail, $sujet_mail); + } +} diff --git a/notifications/mes_fichiers_cleaner.php b/notifications/mes_fichiers_cleaner.php deleted file mode 100644 index 6019fd4..0000000 --- a/notifications/mes_fichiers_cleaner.php +++ /dev/null @@ -1,37 +0,0 @@ - $duree)) . $liste_fichiers; - - // Envoi de la notification - notifications_envoyer_mails($destinataires, $msg_mail, $sujet_mail); - } - } -} diff --git a/paquet.xml b/paquet.xml index c6f2113..cb88d38 100644 --- a/paquet.xml +++ b/paquet.xml @@ -2,7 +2,7 @@ prefix="mes_fichiers" version="3.0.0" etat="dev" - compatibilite="[4.1.0;4.1.*]" + compatibilite="[4.0.0;4.1.*]" logo="mes_fichiers.svg" documentation="https://contrib.spip.net/Mes-Fichiers-2" > diff --git a/prive/squelettes/contenu/mes_fichiers.html b/prive/squelettes/contenu/mes_fichiers.html index b0221db..7041da1 100644 --- a/prive/squelettes/contenu/mes_fichiers.html +++ b/prive/squelettes/contenu/mes_fichiers.html @@ -2,26 +2,29 @@

    <:mes_fichiers:titre_page_mes_fichiers:>

    [(#REM) ] -#SET{prefixe, #CONFIG{mes_fichiers/prefixe, mf2}} +#SET{prefixe, #CONFIG{mes_fichiers/prefixe, mf3}} #SET{frequence, #CONFIG{mes_fichiers/frequence, 1}} -#BOITE_OUVRIR{'', info} + +#ALERTE_OUVRIR{'','info'}

    <:mes_fichiers:info_sauver_1:>

    <:mes_fichiers:info_sauver_2{prefixe=#GET{prefixe}}:>

    [(#CONFIG{mes_fichiers/sauvegarde_reguliere, non}|=={oui}|oui)

    <:mes_fichiers:info_sauver_3{frequence=#GET{frequence}}:>

    ] -#BOITE_FERMER +#ALERTE_FERMER [(#REM) ]
    - #FORMULAIRE_MES_FICHIERS_SAUVER + #FORMULAIRE_ARCHIVE_MF_CREER
    - -[(#REM) ] -[#BOITE_OUVRIR{'', error} - (#ENV{etat}|=={nok_tele}|oui)<:mes_fichiers:message_telechargement_nok:> -#BOITE_FERMER] +[(#REM) ] +[(#ENV{etat}|=={nok_tele}|oui) + [(#ALERTE_MESSAGE{<:mes_fichiers:message_telechargement_nok:>, '', error})] +] +[(#ENV{etat}|=={nok_supp}|oui) + [(#ALERTE_MESSAGE{<:mes_fichiers:message_suppression_nok:>, '', error})] +] [(#REM) ] - + diff --git a/prive/squelettes/liste/mes_fichiers.html b/prive/squelettes/liste/archives_mf.html similarity index 63% rename from prive/squelettes/liste/mes_fichiers.html rename to prive/squelettes/liste/archives_mf.html index cc7082a..db7abf2 100644 --- a/prive/squelettes/liste/mes_fichiers.html +++ b/prive/squelettes/liste/archives_mf.html @@ -1,13 +1,16 @@ -[(#SET{fichiers, [(#REM|mes_fichiers_a_telecharger)]})] +[(#SET{fichiers, [(#REM|archive_mf_lister)]})] #ANCRE_PAGINATION
    - + + @@ -18,9 +21,6 @@ - - - + + + + - @@ -40,10 +50,7 @@ [

    (#PAGINATION{#ENV{pagination,prive}})

    ] - -#BOITE_OUVRIR{'', notice} - <:mes_fichiers:message_rien_a_telecharger:> -#BOITE_FERMER + [(#ALERTE_MESSAGE{<:mes_fichiers:message_rien_a_telecharger:>, '', notice})]
    <:mes_fichiers:titre_boite_telecharger:> + <:mes_fichiers:titre_boite_telecharger:> +
    <:mes_fichiers:colonne_nom:> <:label_poids_fichier:> <:date:>
    [(#VALEUR|basename)][(#VALEUR|filesize|taille_en_octets)][(#VAL{'Y-m-d H:i:s'}|date{#VALEUR|filemtime}|affdate{'Y-m-d H:i'})][(#BOUTON_ACTION{<:bouton_telecharger:>, #URL_ACTION_AUTEUR{mes_fichiers_telecharger, #VALEUR}, btn_mini btn_secondaire, '', ''})] @@ -28,10 +28,20 @@ [(#VALEUR|filesize|mes_fichiers_afficher_taille)][(#VAL{'Y-m-d H:i:s'}|date{#VALEUR|filemtime}|affdate{'Y-m-d H:i'})][ + (#AUTORISER{webmestre}|oui) + [(#BOUTON_ACTION{<:bouton_telecharger:>, #URL_ACTION_AUTEUR{archive_mf_telecharger, #VALEUR, #SELF|ancre_url{''}}, btn_mini btn_secondaire, '', ''})] + ][ + (#AUTORISER{webmestre}|oui) + [(#BOUTON_ACTION{<:lien_supprimer|ucfirst:>, #URL_ACTION_AUTEUR{archive_mf_supprimer, #VALEUR, #SELF|ancre_url{''}}, btn_mini btn_secondaire, '', ''})] + ]
    -
    [(#VALEUR|mes_fichiers_resumer_zip)]
    +
    +
    [(#VALEUR|archive_mf_informer)]