[SPIP] +spip v3.0.17
[lhc/web/clavette_www.git] / www / plugins-dist / svp / teleporter / http_deballe_zip.php
diff --git a/www/plugins-dist/svp/teleporter/http_deballe_zip.php b/www/plugins-dist/svp/teleporter/http_deballe_zip.php
new file mode 100644 (file)
index 0000000..7eafdc7
--- /dev/null
@@ -0,0 +1,153 @@
+<?php
+/**
+ * Gestion du téléporteur HTTP \ Zip. 
+ *
+ * @plugin SVP pour SPIP
+ * @license GPL
+ * @package SPIP\SVP\Teleporteur
+ */
+
+/**
+ * Déballer le fichier au format zip dans le répertoire $dest
+ * en utilisant le dossier temporaire $tmp si besoin
+ *
+ * @param string $archive
+ *     Chemin du fichier zip
+ * @param string $dest
+ *     Répertoire où on veut décompresser
+ * @param string $tmp
+ *     Répertoire de stockage temporaire
+ * @return bool|string
+ *     Répertoire où a été décompressé le zip, false sinon.
+ */
+function teleporter_http_deballe_zip_dist($archive, $dest, $tmp){
+       $status = teleporter_http_charger_zip(
+               array(
+                       'archive' => $archive, // normalement l'url source mais on l'a pas ici
+                       'fichier' => $archive,
+                       'dest' => $dest,
+                       'tmp' => $tmp,
+                       'extract' => true,
+                       'root_extract' => true, # extraire a la racine de dest
+               )
+       );
+       // le fichier .zip est la et bien forme
+       if (is_array($status)
+         AND is_dir($status['target'])) {
+               return $status['target'];
+       }
+       // fichier absent
+       else if ($status == -1) {
+               spip_log("dezip de $archive impossible : fichier absent","teleport"._LOG_ERREUR);
+               return false;
+       }
+       // fichier la mais pas bien dezippe
+       else {
+               spip_log("probleme lors du dezip de $archive","teleport"._LOG_ERREUR);
+               return false;
+       }
+}
+
+
+/**
+ * Charger un zip à partir d'un tableau d'options descriptives
+ *
+ * @param array $quoi
+ *     Tableau d'options
+ * @return array|bool|int|string
+ *     En cas de réussite, Tableau décrivant le zip, avec les index suivant :
+ *     - files : la liste des fichiers présents dans le zip,
+ *     - size : la taille décompressée
+ *     - compressed_size : la taille compressée
+ *     - dirname : répertoire où les fichiers devront être décompréssés
+ *     - tmpname : répertoire temporaire où les fichiers sont décompressés
+ *     - target : cible sur laquelle décompresser les fichiers...
+ */
+function teleporter_http_charger_zip($quoi = array()){
+       if (!$quoi)
+               return false;
+
+       foreach (array( 'remove' => 'spip',
+                                       'rename' => array(),
+                                       'edit' => array(),
+                                       'root_extract' => false, # extraire a la racine de dest ?
+                                       'tmp' => sous_repertoire(_DIR_CACHE, 'chargeur')
+                               )
+                               as $opt=>$def) {
+               isset($quoi[$opt]) || ($quoi[$opt] = $def);
+       }
+
+       if (!@file_exists($fichier = $quoi['fichier']))
+               return 0;
+
+       include_spip('inc/pclzip');
+       $zip = new PclZip($fichier);
+       $list = $zip->listContent();
+
+       $racine = http_deballe_recherche_racine($list);
+       $quoi['remove'] = $racine;
+
+       // si pas de racine commune, reprendre le nom du fichier zip
+       // en lui enlevant la racine h+md5 qui le prefixe eventuellement
+       // cf action/charger_plugin L74
+       if (!strlen($nom = basename($racine)))
+               $nom = preg_replace(",^h[0-9a-f]{8}-,i","",basename($fichier, '.zip'));
+
+       $dir_export = $quoi['root_extract']
+               ? $quoi['dest']
+               : $quoi['dest'] . $nom;
+       $dir_export = rtrim($dir_export,'/').'/';
+
+       $tmpname = $quoi['tmp'].$nom.'/';
+
+       // choisir la cible selon si on veut vraiment extraire ou pas
+       $target = $quoi['extract'] ? $dir_export : $tmpname;
+
+       // ici, il faut vider le rep cible si il existe deja, non ?
+       if (is_dir($target))
+               supprimer_repertoire($target);
+
+       // et enfin on extrait
+       $ok = $zip->extract(
+               PCLZIP_OPT_PATH,
+                       $target
+               ,
+               PCLZIP_OPT_SET_CHMOD, _SPIP_CHMOD,
+               PCLZIP_OPT_REPLACE_NEWER,
+               PCLZIP_OPT_REMOVE_PATH, $quoi['remove']
+       );
+       if ($zip->error_code < 0) {
+               spip_log('charger_decompresser erreur zip ' . $zip->error_code .' pour paquet: ' . $quoi['archive'],"teleport"._LOG_ERREUR);
+               return //$zip->error_code
+                       $zip->errorName(true);
+       }
+
+       spip_log('charger_decompresser OK pour paquet: ' . $quoi['archive'],"teleport");
+
+       $size = $compressed_size = 0;
+       $removex = ',^'.preg_quote($quoi['remove'], ',').',';
+       foreach ($list as $a => $f) {
+               $size += $f['size'];
+               $compressed_size += $f['compressed_size'];
+               $list[$a] = preg_replace($removex,'',$f['filename']);
+       }
+
+       // Indiquer par un fichier install.log
+       // a la racine que c'est chargeur qui a installe ce plugin
+       ecrire_fichier($target.'install.log',
+               "installation: charger_plugin\n"
+               ."date: ".gmdate('Y-m-d\TH:i:s\Z', time())."\n"
+               ."source: ".$quoi['archive']."\n"
+       );
+
+
+       return array(
+               'files' => $list,
+               'size' => $size,
+               'compressed_size' => $compressed_size,
+               'dirname' => $dir_export,
+               'tmpname' => $tmpname,
+               'target' => $target,
+       );
+}