mirror of
https://github.com/YunoHost-Apps/spip_ynh.git
synced 2024-09-03 20:25:59 +02:00
153 lines
4.3 KiB
PHP
153 lines
4.3 KiB
PHP
<?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,
|
|
);
|
|
}
|