[SPIP] +spip v3.0.17
[lhc/web/clavette_www.git] / www / plugins-dist / svp / teleporter / http_deballe_zip.php
1 <?php
2 /**
3 * Gestion du téléporteur HTTP \ Zip.
4 *
5 * @plugin SVP pour SPIP
6 * @license GPL
7 * @package SPIP\SVP\Teleporteur
8 */
9
10
11 /**
12 * Déballer le fichier au format zip dans le répertoire $dest
13 * en utilisant le dossier temporaire $tmp si besoin
14 *
15 * @param string $archive
16 * Chemin du fichier zip
17 * @param string $dest
18 * Répertoire où on veut décompresser
19 * @param string $tmp
20 * Répertoire de stockage temporaire
21 * @return bool|string
22 * Répertoire où a été décompressé le zip, false sinon.
23 */
24 function teleporter_http_deballe_zip_dist($archive, $dest, $tmp){
25 $status = teleporter_http_charger_zip(
26 array(
27 'archive' => $archive, // normalement l'url source mais on l'a pas ici
28 'fichier' => $archive,
29 'dest' => $dest,
30 'tmp' => $tmp,
31 'extract' => true,
32 'root_extract' => true, # extraire a la racine de dest
33 )
34 );
35 // le fichier .zip est la et bien forme
36 if (is_array($status)
37 AND is_dir($status['target'])) {
38 return $status['target'];
39 }
40 // fichier absent
41 else if ($status == -1) {
42 spip_log("dezip de $archive impossible : fichier absent","teleport"._LOG_ERREUR);
43 return false;
44 }
45 // fichier la mais pas bien dezippe
46 else {
47 spip_log("probleme lors du dezip de $archive","teleport"._LOG_ERREUR);
48 return false;
49 }
50 }
51
52
53 /**
54 * Charger un zip à partir d'un tableau d'options descriptives
55 *
56 * @param array $quoi
57 * Tableau d'options
58 * @return array|bool|int|string
59 * En cas de réussite, Tableau décrivant le zip, avec les index suivant :
60 * - files : la liste des fichiers présents dans le zip,
61 * - size : la taille décompressée
62 * - compressed_size : la taille compressée
63 * - dirname : répertoire où les fichiers devront être décompréssés
64 * - tmpname : répertoire temporaire où les fichiers sont décompressés
65 * - target : cible sur laquelle décompresser les fichiers...
66 */
67 function teleporter_http_charger_zip($quoi = array()){
68 if (!$quoi)
69 return false;
70
71 foreach (array( 'remove' => 'spip',
72 'rename' => array(),
73 'edit' => array(),
74 'root_extract' => false, # extraire a la racine de dest ?
75 'tmp' => sous_repertoire(_DIR_CACHE, 'chargeur')
76 )
77 as $opt=>$def) {
78 isset($quoi[$opt]) || ($quoi[$opt] = $def);
79 }
80
81 if (!@file_exists($fichier = $quoi['fichier']))
82 return 0;
83
84 include_spip('inc/pclzip');
85 $zip = new PclZip($fichier);
86 $list = $zip->listContent();
87
88 $racine = http_deballe_recherche_racine($list);
89 $quoi['remove'] = $racine;
90
91 // si pas de racine commune, reprendre le nom du fichier zip
92 // en lui enlevant la racine h+md5 qui le prefixe eventuellement
93 // cf action/charger_plugin L74
94 if (!strlen($nom = basename($racine)))
95 $nom = preg_replace(",^h[0-9a-f]{8}-,i","",basename($fichier, '.zip'));
96
97 $dir_export = $quoi['root_extract']
98 ? $quoi['dest']
99 : $quoi['dest'] . $nom;
100 $dir_export = rtrim($dir_export,'/').'/';
101
102 $tmpname = $quoi['tmp'].$nom.'/';
103
104 // choisir la cible selon si on veut vraiment extraire ou pas
105 $target = $quoi['extract'] ? $dir_export : $tmpname;
106
107 // ici, il faut vider le rep cible si il existe deja, non ?
108 if (is_dir($target))
109 supprimer_repertoire($target);
110
111 // et enfin on extrait
112 $ok = $zip->extract(
113 PCLZIP_OPT_PATH,
114 $target
115 ,
116 PCLZIP_OPT_SET_CHMOD, _SPIP_CHMOD,
117 PCLZIP_OPT_REPLACE_NEWER,
118 PCLZIP_OPT_REMOVE_PATH, $quoi['remove']
119 );
120 if ($zip->error_code < 0) {
121 spip_log('charger_decompresser erreur zip ' . $zip->error_code .' pour paquet: ' . $quoi['archive'],"teleport"._LOG_ERREUR);
122 return //$zip->error_code
123 $zip->errorName(true);
124 }
125
126 spip_log('charger_decompresser OK pour paquet: ' . $quoi['archive'],"teleport");
127
128 $size = $compressed_size = 0;
129 $removex = ',^'.preg_quote($quoi['remove'], ',').',';
130 foreach ($list as $a => $f) {
131 $size += $f['size'];
132 $compressed_size += $f['compressed_size'];
133 $list[$a] = preg_replace($removex,'',$f['filename']);
134 }
135
136 // Indiquer par un fichier install.log
137 // a la racine que c'est chargeur qui a installe ce plugin
138 ecrire_fichier($target.'install.log',
139 "installation: charger_plugin\n"
140 ."date: ".gmdate('Y-m-d\TH:i:s\Z', time())."\n"
141 ."source: ".$quoi['archive']."\n"
142 );
143
144
145 return array(
146 'files' => $list,
147 'size' => $size,
148 'compressed_size' => $compressed_size,
149 'dirname' => $dir_export,
150 'tmpname' => $tmpname,
151 'target' => $target,
152 );
153 }