teleporter.php 3.1 KB

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