3 * Gestion du téléporteur HTTP \ Zip.
5 * @plugin SVP pour SPIP
7 * @package SPIP\SVP\Teleporteur
12 * Déballer le fichier au format zip dans le répertoire $dest
13 * en utilisant le dossier temporaire $tmp si besoin
15 * @uses teleporter_http_charger_zip()
17 * @param string $archive
18 * Chemin du fichier zip
20 * Répertoire où on veut décompresser
22 * Répertoire de stockage temporaire
24 * Répertoire où a été décompressé le zip, false sinon.
26 function teleporter_http_deballe_zip_dist($archive, $dest, $tmp) {
27 $status = teleporter_http_charger_zip(
29 'archive' => $archive, // normalement l'url source mais on l'a pas ici
30 'fichier' => $archive,
34 'root_extract' => true, # extraire a la racine de dest
37 // le fichier .zip est la et bien forme
39 and is_dir($status['target'])
41 return $status['target'];
45 spip_log("dezip de $archive impossible : fichier absent", "teleport" . _LOG_ERREUR
);
48 } // fichier la mais pas bien dezippe
50 spip_log("probleme lors du dezip de $archive", "teleport" . _LOG_ERREUR
);
59 * Charger un zip à partir d'un tableau d'options descriptives
61 * @uses http_deballe_recherche_racine()
65 * @return array|bool|int|string
66 * En cas de réussite, Tableau décrivant le zip, avec les index suivant :
67 * - files : la liste des fichiers présents dans le zip,
68 * - size : la taille décompressée
69 * - compressed_size : la taille compressée
70 * - dirname : répertoire où les fichiers devront être décompréssés
71 * - tmpname : répertoire temporaire où les fichiers sont décompressés
72 * - target : cible sur laquelle décompresser les fichiers...
74 function teleporter_http_charger_zip($quoi = array()) {
83 'root_extract' => false, # extraire a la racine de dest ?
84 'tmp' => sous_repertoire(_DIR_CACHE
, 'chargeur')
87 isset($quoi[$opt]) ||
($quoi[$opt] = $def);
90 if (!@file_exists
($fichier = $quoi['fichier'])) {
94 include_spip('inc/pclzip');
95 $zip = new PclZip($fichier);
96 $list = $zip->listContent();
98 $racine = http_deballe_recherche_racine($list);
99 $quoi['remove'] = $racine;
101 // si pas de racine commune, reprendre le nom du fichier zip
102 // en lui enlevant la racine h+md5 qui le prefixe eventuellement
103 // cf action/charger_plugin L74
104 if (!strlen($nom = basename($racine))) {
105 $nom = preg_replace(",^h[0-9a-f]{8}-,i", "", basename($fichier, '.zip'));
108 $dir_export = $quoi['root_extract']
110 : $quoi['dest'] . $nom;
111 $dir_export = rtrim($dir_export, '/') . '/';
113 $tmpname = $quoi['tmp'] . $nom . '/';
115 // choisir la cible selon si on veut vraiment extraire ou pas
116 $target = $quoi['extract'] ?
$dir_export : $tmpname;
118 // ici, il faut vider le rep cible si il existe deja, non ?
119 if (is_dir($target)) {
120 supprimer_repertoire($target);
123 // et enfin on extrait
127 PCLZIP_OPT_SET_CHMOD
, _SPIP_CHMOD
,
128 PCLZIP_OPT_REPLACE_NEWER
,
129 PCLZIP_OPT_REMOVE_PATH
, $quoi['remove']
131 if ($zip->error_code
< 0) {
132 spip_log('charger_decompresser erreur zip ' . $zip->error_code
. ' pour paquet: ' . $quoi['archive'],
133 "teleport" . _LOG_ERREUR
);
135 return //$zip->error_code
136 $zip->errorName(true);
139 spip_log('charger_decompresser OK pour paquet: ' . $quoi['archive'], "teleport");
141 $size = $compressed_size = 0;
142 $removex = ',^' . preg_quote($quoi['remove'], ',') . ',';
143 foreach ($list as $a => $f) {
145 $compressed_size +
= $f['compressed_size'];
146 $list[$a] = preg_replace($removex, '', $f['filename']);
149 // Indiquer par un fichier install.log
150 // a la racine que c'est chargeur qui a installe ce plugin
151 ecrire_fichier($target . 'install.log',
152 "installation: charger_plugin\n"
153 . "date: " . gmdate('Y-m-d\TH:i:s\Z', time()) . "\n"
154 . "source: " . $quoi['archive'] . "\n"
161 'compressed_size' => $compressed_size,
162 'dirname' => $dir_export,
163 'tmpname' => $tmpname,