[SPIP] ~version 3.0.7-->3.0.10
[ptitvelo/web/www.git] / www / plugins-dist / svp / action / teleporter.php
1 <?php
2 /**
3 * Gestion de l'action teleporter
4 *
5 * @plugin SVP pour SPIP
6 * @license GPL
7 * @package SPIP\SVP\Actions
8 */
9
10
11 /**
12 * Téléporter et déballer un composant
13 *
14 * @param string $methode
15 * http|git|svn|...
16 * @param string $source
17 * URL source du composant
18 * @param string $dest
19 * Chemin du répertoire où déballer le composant. Inclus le dernier segment
20 * @param array $options
21 * revision => ''
22 * --ignore-externals
23 * @return bool|string
24 * String : texte d'une erreur
25 * true si l'opération est correctement réalisée
26 */
27 function action_teleporter_composant_dist($methode,$source,$dest,$options=array()){
28 # Si definie a '', le chargeur est interdit ; mais on n'aurait de toutes
29 # facons jamais pu venir ici avec toutes les securisations faites :^)
30
31 if (!preg_match(','.substr(_DIR_LIB,0,-1).',',$dest) && !_DIR_PLUGINS_AUTO)
32 die('Vous ne pouvez pas télécharger, absence de _DIR_PLUGINS_AUTO');
33
34 // verifier que la methode est connue
35 if (!$teleporter = charger_fonction($methode,"teleporter",true)){
36 spip_log("Methode $methode inconnue pour teleporter $source vers $dest","teleport"._LOG_ERREUR);
37 return _T('svp:erreur_teleporter_methode_inconue',array('methode' => $methode));
38 }
39
40 if (!$dest = teleporter_verifier_destination($d = $dest)){
41 spip_log("Rerpertoire $d non accessible pour teleporter $source vers $d","teleport"._LOG_ERREUR);
42 return _T('svp:erreur_teleporter_destination_erreur',array('dir' => $d));
43 #$texte = "<p>"._T('plugin_erreur_droit1',array('dest'=>$dest))."</p>"
44 # . "<p>"._T('plugin_erreur_droit2').aide('install0')."</p>";
45 }
46
47 # destination temporaire des fichiers si besoin
48 $options['dir_tmp'] = sous_repertoire(_DIR_CACHE, 'chargeur');
49
50 return $teleporter($methode,$source,$dest,$options);
51 }
52
53
54 /**
55 * Vérifier et préparer l'arborescence jusqu'au répertoire parent
56 *
57 * @param string $dest
58 * @return bool|string
59 * false en cas d'échec
60 * Chemin du répertoire sinon
61 */
62 function teleporter_verifier_destination($dest){
63 $dest = rtrim($dest,"/");
64 $final = basename($dest);
65 $base = dirname($dest);
66 $create = array();
67 // on cree tout le chemin jusqu'a dest non inclus
68 while (!is_dir($base)){
69 $create[] = basename($base);
70 $base = dirname($base);
71 }
72 while (count($create)){
73 if (!is_writable($base))
74 return false;
75 $base = sous_repertoire($base,array_pop($create));
76 if (!$base)
77 return false;
78 }
79
80 if (!is_writable($base))
81 return false;
82
83 return $base."/$final";
84 }
85
86 /**
87 * Déplace un répertoire pour libérer l'emplacement.
88 *
89 * Si le répertoire donné existe, le déplace dans un répertoire de backup.
90 * Si ce backup existe déjà, il est supprimé auparavant.
91 * Retourne le nouveau chemin du répertoire.
92 *
93 * @param string $dest
94 * Chemin du répertoire à déplacer
95 * @return string
96 * Nouveau chemin du répertoire s'il existait,
97 * Chaîne vide sinon
98 **/
99 function teleporter_nettoyer_vieille_version($dest){
100 $old = "";
101 if (is_dir($dest)){
102 $dir = dirname($dest);
103 $base = basename($dest);
104 $old="$dir/.$base.bck";
105 if (is_dir($old))
106 supprimer_repertoire($old);
107 rename($dest,$old);
108 }
109 return $old;
110 }