123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- <?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,
- );
- }
|