3 * Gestion de l'action teleporter
5 * @plugin SVP pour SPIP
7 * @package SPIP\SVP\Actions
12 * Téléporter et déballer un composant
14 * @param string $methode
16 * @param string $source
17 * URL source du composant
19 * Chemin du répertoire où déballer le composant. Inclus le dernier segment
20 * @param array $options
24 * String : texte d'une erreur
25 * true si l'opération est correctement réalisée
27 function action_teleporter_composant_dist($methode, $source, $dest, $options = array()) {
29 # Si definie a '', le chargeur est interdit ; mais on n'aurait de toutes
30 # facons jamais pu venir ici avec toutes les securisations faites :^)
31 # sauf si on doit télécharger une lib dans _DIR_LIB
32 if (!preg_match(',' . substr(_DIR_LIB
, 0, -1) . ',', $dest) && !_DIR_PLUGINS_AUTO
) {
33 die('Vous ne pouvez pas télécharger, absence de _DIR_PLUGINS_AUTO');
36 // verifier que la methode est connue
37 if (!$teleporter = charger_fonction($methode, "teleporter", true)) {
38 spip_log("Methode $methode inconnue pour teleporter $source vers $dest", "teleport" . _LOG_ERREUR
);
40 return _T('svp:erreur_teleporter_methode_inconue', array('methode' => $methode));
43 if (!$dest = teleporter_verifier_destination($d = $dest)) {
44 spip_log("Rerpertoire $d non accessible pour teleporter $source vers $d", "teleport" . _LOG_ERREUR
);
46 return _T('svp:erreur_teleporter_destination_erreur', array('dir' => $d));
47 #$texte = "<p>"._T('plugin_erreur_droit1',array('dest'=>$dest))."</p>"
48 # . "<p>"._T('plugin_erreur_droit2').aider('install0')."</p>";
51 # destination temporaire des fichiers si besoin
52 $options['dir_tmp'] = sous_repertoire(_DIR_CACHE
, 'chargeur');
54 return $teleporter($methode, $source, $dest, $options);
59 * Vérifier et préparer l'arborescence jusqu'au répertoire parent
63 * false en cas d'échec
64 * Chemin du répertoire sinon
66 function teleporter_verifier_destination($dest) {
67 $dest = rtrim($dest, "/");
68 $final = basename($dest);
69 $base = dirname($dest);
71 // on cree tout le chemin jusqu'a dest non inclus
72 while (!is_dir($base)) {
73 $create[] = basename($base);
74 $base = dirname($base);
76 while (count($create)) {
77 if (!is_writable($base)) {
80 $base = sous_repertoire($base, array_pop($create));
86 if (!is_writable($base)) {
90 return $base . "/$final";
94 * Déplace un répertoire pour libérer l'emplacement.
96 * Si le répertoire donné existe, le déplace dans un répertoire de backup.
97 * Si ce backup existe déjà, il est supprimé auparavant.
98 * Retourne le nouveau chemin du répertoire.
100 * @param string $dest
101 * Chemin du répertoire à déplacer
103 * Nouveau chemin du répertoire s'il existait,
106 function teleporter_nettoyer_vieille_version($dest) {
109 $dir = dirname($dest);
110 $base = basename($dest);
111 $old = "$dir/.$base.bck";
113 supprimer_repertoire($old);