source: alternc/trunk/bureau/class/m_bro.php @ 2077

Revision 2077, 29.0 KB checked in by anarcat, 5 years ago (diff)

add the code provided from an anonymous user for recursive copy and decompress functions in the browser. Will be audited and corrected to hook properly in the browser

See #1043.

RevLine 
[1]1<?php
2/*
[789]3 $Id: m_bro.php,v 1.15 2005/12/18 09:51:32 benjamin Exp $
[1]4 ----------------------------------------------------------------------
5 LICENSE
6
7 This program is free software; you can redistribute it and/or
8 modify it under the terms of the GNU General Public License (GPL)
9 as published by the Free Software Foundation; either version 2
10 of the License, or (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 To read the license please visit http://www.gnu.org/copyleft/gpl.html
18 ----------------------------------------------------------------------
19 Original Author of file:
20 Purpose of file:
21 ----------------------------------------------------------------------
22*/
[540]23
24/* Add the mime type list */
25@include("mime.php");
26
[1]27/**
28* Classe de gestion du navigateur de fichiers en ligne.
29*
30* Cette classe permet de gérer les fichiers, dossiers ...
[102]31* d'un membre hébergé.<br />
[1]32* Copyleft {@link http://alternc.net/ AlternC Team}
33*
34* @copyright    AlternC-Team 2002-11-01 http://alternc.net/
35*
36*/
[258]37
38
[1]39class m_bro {
40
41  /** Mode d'affichage des fichiers en colonne */
42  var $l_mode=array(0=>"1 column, detailed",1=>"2 columns, short",2=>"3 columns, short");
43
44  /** Mode de téléchargement d'un dossier compressé (zip,bz,tar,..) */
45  var $l_tgz=array(0=>"tgz (Linux)",1=>"tar.bz2 (Linux)",2=>"zip (Windows/Dos)",3=>"tar.Z (Unix)");
46
47  /** Faut-il afficher ou non les icones ? */
48  var $l_icons=array(0=>"No",1=>"Yes");
49
50  /** Que fait-on après la création d'un fichier ? */
51  var $l_createfile=array(0=>"Go back to the file manager",1=>"Edit the newly created file");
52
53  /** Cache des descriptions de fichier extraits de la base
54   * @access private
55   */
56  var $mime_desc=array();
57
58  /** Cache des icones extraits de la base
59   * @access private
60   */
61  var $mime_icon=array();
62
63  /** Cache des types mimes extraits de la base
64   * @access private
65   */
66  var $mime_type=array();
67
68  /** Choix des polices d'édition de fichiers */
69  var $l_editor_font=array("Arial, Helvetica, Sans-serif","Times, Bookman, Serif","Courier New, Courier, Fixed");
70
71  /** Choix des tailles de police d'édition de fichiers */
72  var $l_editor_size=array("18px","14px","12px","10px","8px","0.8em","0.9em","1em","1.1em","1.2em");
73
74  /* ----------------------------------------------------------------- */
75  /** Constructeur */
[222]76  function m_bro() {
[1]77  }
78
79  /* ----------------------------------------------------------------- */
80  /** Vérifie un dossier relatif au dossier de l'utilisateur courant
81   *
82   * @param string $dir Dossier (absolu que l'on souhaite vérifier
83   * @return string Retourne le nom du dossier vérifié, relatif au
84   * dossier de l'utilisateur courant, éventuellement corrigé.
85   * ou FALSE si le dossier n'est pas dans le dossier de l'utilisateur.
86   */
87  function convertabsolute($dir,$strip=1) {
88    global $mem;
89    $root="/var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"];
[953]90    // Sauvegarde du chemin de base.
91    $root_alternc = $root ;
92    // Passage du root en chemin réel (différent avec un lien)
[1719]93    $root=realpath($root) ;
[1742]94    // separer le chemin entre le repertoire et le fichier
95    $file = basename($dir);
96    $dir = dirname($dir);
[1719]97    $dir=realpath($root."/".$dir);
[1742]98    // verifier que le repertoire est dans le home de l'usgaer
[1]99    if (substr($dir,0,strlen($root))!=$root) {
100      return false;
[1727]101    } 
[1742]102    // recomposer le chemin
103    $dir = $dir . '/' . $file;
[1727]104    if ($strip) {
[953]105      $dir=substr($dir,strlen($root));
106    } else {
107      // si on ne strip pas, il faut enlever le chemin réel
108      // et mettre la racine d'alternc pour éviter les
109      // problèmes de lien depuis /var/alternc !
110      $dir=$root_alternc . substr($dir,strlen($root));
[1742]111    }
112    if (substr($dir,-1)=="/") {
[1]113      return substr($dir,0,strlen($dir)-1);
114    } else
115      return $dir;
116  }
117
118  /* ----------------------------------------------------------------- */
119  /** Retourne un tableau contenant la liste des fichiers du dossier courant
120   * Ce tableau contient tous les paramètres des fichiers du dossier courant
121   * sous la forme d'un tableau indexé de tableaux associatifs comme suit :
122   * $a["name"]=nom du fichier / dossier
123   * $a["size"]=Taille totale du fichier / dossier + sous-dossier
124   * $a["date"]=Date de dernière modification
125   * $a["type"]=Type du fichier (1 pour fichier, 0 pour dossier)
126   * @param string $dir dossier relatif au dossier racine du compte du
127   * membre courant
128   * @return array le tableau contenant les fichiers de $dir, et
129   */
130  function filelist($dir="") {
[222]131    global $db,$cuid;
132    $db->query("UPDATE browser SET lastdir='$dir' WHERE uid='$cuid';");
[1]133    $absolute=$this->convertabsolute($dir,0);
134    if ($dir = @opendir($absolute)) {
135      while (($file = readdir($dir)) !== false) {
136        if ($file!="." && $file!="..") {
[1528]137          $c[]=array("name"=>$file, "size"=>$this->fsize($absolute."/".$file), "date"=>filemtime($absolute."/".$file), "type"=> (!is_dir($absolute."/".$file)) );
[1]138        }
139      }
140      closedir($dir);
141    }
142    if (is_array($c)) {
[45]143      usort ($c, array("m_bro","_sort_filelist_name"));
[1]144      return $c;
145    } else {
146      return array();
147    }
148  }
149
150  /* ----------------------------------------------------------------- */
151  /** Retourne un tableau contenant les préférences de l'utilisateur courant
152   * Ce tableau aqssociatif contient les valeurs des champs de la table "browser"
153   * pour l'utilisateur courant.
154   * @return array Tableau des préférences de l'utilisateur courant.
155   */
156  function GetPrefs() {
[222]157    global $db,$cuid;
158    $db->query("SELECT * FROM browser WHERE uid='$cuid';");
[1]159    if ($db->num_rows()==0) {
[222]160      $db->query("INSERT INTO browser (editsizex, editsizey, listmode, showicons, downfmt, createfile, showtype, uid, editor_font, editor_size) VALUES (70, 21, 0, 0, 0, 0, 0, '$cuid','Arial, Helvetica, Sans-serif','12px');");
161      $db->query("SELECT * FROM browser WHERE uid='$cuid';");
[1]162    }
163    $db->next_record();
164    return $db->Record;
165  }
166
167  /* ----------------------------------------------------------------- */
168  /** Modifie les préférences de l'utilisateur courant.
169   *
170   * @param integer $editsizex  Taille de l'éditeur (nombre de colonnes)
171   * @param integer $editsizey  Taille de l'éditeur (nombre de lignes)
172   * @param integer $listmode   Mode d'affichage de la liste des fichiers
173   * @param integer $showicons  Faut-il afficher / cacher les icones des fichiers
174   * @param integer $downfmt    Dans quel format faut-il télécharger les dossiers compressés
175   * @param integer $createfile Faut-il editer/revenir au browser après création d'un fichier
176   * @param integer $showtype Faut-il afficher le type mime des fichiers
177   * @param integer $editor_font  Quelle police faut-il utiliser pour l'éditeur
178   * @param integer $editor_size  Quelle taille de police faut-il utiliser pour l'éditeur
179   * @param integer $golastdir  Faut-il revenir à la racine ou au dernier dossier visité ?
180   * @return boolean TRUE
181   */
182  function SetPrefs($editsizex, $editsizey, $listmode, $showicons, $downfmt, $createfile, $showtype, $editor_font, $editor_size, $golastdir) {
[222]183    global $db,$cuid;
[1]184    $editsizex=intval($editsizex);      $editsizey=intval($editsizey);
185    $listmode=intval($listmode);        $showicons=intval($showicons);
186    $showtype=intval($showtype);        $downfmt=intval($downfmt);
187    $createfile=intval($createfile);    $golastdir=intval($golastdir);
[222]188    $db->query("SELECT * FROM browser WHERE uid='$cuid';");
[1]189    if ($db->num_rows()==0) {
[222]190      $db->query("INSERT INTO browser (editsizex, editsizey, listmode, showicons, downfmt, createfile, showtype, uid, editor_font, editor_size, golastdir) VALUES (70, 21, 0, 0, 0, 0, 0, '".$this->uid."','Arial, Helvetica, Sans-serif','12px',1);");
[1]191    }
[222]192    $db->query("UPDATE browser SET editsizex='$editsizex', editsizey='$editsizey', listmode='$listmode', showicons='$showicons', downfmt='$downfmt', createfile='$createfile', showtype='$showtype', editor_font='$editor_font', editor_size='$editor_size', golastdir='$golastdir' WHERE uid='$cuid';");
[1]193    return true;
194  }
195
196  /* ----------------------------------------------------------------- */
197  /** Retourne le nom du fichier icone associé au fichier donc le nom est $file
198   * <b>Note</b>: Les fichiers icones sont mis en cache sur la page courante.
199   * @param string $file Fichier dont on souhaite connaitre le fichier icone
200   * @return string Fichier icone correspondant.
201   */
202  function icon($file) {
[258]203    global $bro_icon;
[1]204    if (!strpos($file,".") && substr($file,0,1)!=".") {
205      return "file.png";
206    }
207    $t=explode(".",$file);
208    if (!is_array($t))
209      $ext=$t;
210    else
211      $ext=$t[count($t)-1];
212    // Now seek the extension
[258]213    if (!$bro_icon[$ext]) {
214        return "file.png";
215    } else {
216        return $bro_icon[$ext].".png";
[1]217    }
218  }
219
220  /* ----------------------------------------------------------------- */
221  /** Retourne le type mime associé au fichier donc le nom est $file
222   * <b>Note</b>: Les types mimes sont mis en cache sur la page courante.
223   * Le type mime est déterminé d'après l'extension du fichier.
224   * @param string $file Fichier dont on souhaite connaitre le type mime
225   * @return string Type mime / Sous type du fichier demandé
226   */
227  function mime($file) {
[258]228    global $bro_type;
[1]229    if (!strpos($file,".") && substr($file,0,1)!=".") {
230      return _("File");
231    }
232    $t=explode(".",$file);
233    if (!is_array($t))
234      $ext=$t;
235    else
236      $ext=$t[count($t)-1];
237    // Now seek the extension
[258]238    if (!$bro_type[$ext]) {
239        return _("File");
240    } else {
[438]241        return _($bro_type[$ext]);
[1]242    }
243  }
244
245  /* ----------------------------------------------------------------- */
246  /** Retourne la taille du fichier $file
247   * si $file est un dossier, retourne la taille de ce dossier et de tous
248   * ses sous dossiers.
249   * @param string $file Fichier dont on souhaite connaitre la taille
250   * @return integer Taille du fichier en octets.
[222]251   * TODO : create a du cache ...
[1]252   */
253  function fsize($file) {
254    if (is_dir($file)) {
[718]255      return "-";
[1]256    } else {
257      return filesize($file);
258    }
259  }
260
261  /* ----------------------------------------------------------------- */
262  /** Crée le dossier $file dans le dossier (parent) $dir
263   * @param string $dir dossier dans lequel on veut créer un sous-dossier
264   * @param string $file nom du dossier à créer
265   * @return boolean TRUE si le dossier a été créé, FALSE si une erreur s'est produite.
266   */
267  function CreateDir($dir,$file) {
[1727]268    global $db,$cuid,$err;
[1]269    $file=ssla($file);
[1727]270    $absolute=$this->convertabsolute($dir."/".$file,0);
271    if ($absolute && !file_exists($absolute)) {
272      mkdir($absolute,00777);
273      $db->query("UPDATE browser SET crff=1 WHERE uid='$cuid';");
274      return true;
275    } else {
276      $err->raise("bro",1);
277      return false;
[1]278    }
279  }
280
281  /* ----------------------------------------------------------------- */
282  /** Crée un fichier vide dans un dossier
283   * @param string $dir Dossier dans lequel on crée le nouveau fichier
284   * @param string $file Fichier que l'on souhaite créer.
285   * @return boolean TRUE si le dossier a été créé, FALSE si une erreur s'est produite.
286   */
287  function CreateFile($dir,$file) {
[222]288    global $db,$err,$cuid;
[1727]289    $file=ssla($file);
290    $absolute=$this->convertabsolute($dir."/".$file,0);
[1742]291    if (!$absolute) {
[1]292      $err->raise("bro",1);
293      return false;
294    }
[1742]295    if (!file_exists($absolute)) {
296      touch($absolute);
297    }
298    $db->query("UPDATE browser SET crff=0 WHERE uid='$cuid';");
299    return true;
[1]300  }
301
302  /* ----------------------------------------------------------------- */
303  /** Efface les fichiers du tableau $file_list dans le dossier $R
304   * @param array $file_list Liste des fichiers à effacer.
305   * @param string $R Dossier dans lequel on efface les fichiers
306   * @return boolean TRUE si les fichiers ont été effacés, FALSE si une erreur s'est produite.
307   */
308  function DeleteFile($file_list,$R) {
[1719]309    global $err, $mem;
310    $root=realpath("/var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"]);
[1]311    $absolute=$this->convertabsolute($R,0);
[1719]312    if (!$absolute && strpos($root,$absolute) === 0 && strlen($absolute) > (strlen($root)+1) ) {
[1]313      $err->raise("bro",1);
314      return false;
315    }
316    for ($i=0;$i<count($file_list);$i++) {
317      $file_list[$i]=ssla($file_list[$i]);
318      if (!strpos($file_list[$i],"/") && file_exists($absolute."/".$file_list[$i])) { // Character / forbidden in a FILE name
319        $this->_delete($absolute."/".$file_list[$i]);
320      }
321    }
322    return true;
323  }
324
325  /* ----------------------------------------------------------------- */
326  /** Renomme les fichier de $old du dossier $R en $new
327   * @param string $R dossier dans lequel se trouve les fichiers à renommer.
328   * @param array of string $old Ancien nom des fichiers
329   * @param array of string $new Nouveau nom des fichiers
330   * @return boolean TRUE si les fichiers ont été renommés, FALSE si une erreur s'est produite.
331   */
332  function RenameFile($R,$old,$new) {
333    global $err;
334    $absolute=$this->convertabsolute($R,0);
335    if (!$absolute) {
336      $err->raise("bro",1);
337      return false;
338    }
[143]339    $alea=".".time().rand(1000,9999);
[1]340    for ($i=0;$i<count($old);$i++) {
341      $old[$i]=ssla($old[$i]); // strip slashes if needed
342      $new[$i]=ssla($new[$i]);
343      if (!strpos($old[$i],"/") && !strpos($new[$i],"/")) {  // caractère / interdit dans old ET dans new...
[143]344        @rename($absolute."/".$old[$i],$absolute."/".$old[$i].$alea);
[1]345      }
346    }
[143]347    for ($i=0;$i<count($old);$i++) {
348      if (!strpos($old[$i],"/") && !strpos($new[$i],"/")) {  // caractère / interdit dans old ET dans new...
349        @rename($absolute."/".$old[$i].$alea,$absolute."/".$new[$i]);
350      }
351    }
352
[1]353    return true;
354  }
355
356  /* ----------------------------------------------------------------- */
357  /** Déplace les fichier de $d du dossier $old vers $new
358   * @param array of string $d Liste des fichiers du dossier $old à déplacer
359   * @param string $old dossier dans lequel se trouve les fichiers à déplacer.
360   * @param string $new dossier vers lequel seront déplacés les fichiers.
361   * @return boolean TRUE si les fichiers ont été renommés, FALSE si une erreur s'est produite.
362   */
363  function MoveFile($d,$old,$new) {
364    global $err;
365    $old=$this->convertabsolute($old,0);
366    if (!$old) {
367      $err->raise("bro",1);
368      return false;
369    }
370    $new=$this->convertabsolute($new,0);
371    if (!$new) {
372      $err->raise("bro",1);
373      return false;
374    }
375    if ($old==$new) {
376      $err->raise("bro",2);
377      return false;
378    }
379    for ($i=0;$i<count($d);$i++) {
380      $d[$i]=ssla($d[$i]); // strip slashes if needed
381      if (!strpos($d[$i],"/") && file_exists($old."/".$d[$i]) && !file_exists($new."/".$d[$i])) { 
382        @rename($old."/".$d[$i],$new."/".$d[$i]);
383      }
384    }
385    return true;
386  }
387
388  /* ----------------------------------------------------------------- */
389  /** Recoit un champ file upload (Global) et le stocke dans le dossier $R
390   * Le champ file-upload originel doit s'appeler "userfile" et doit
391   * bien être un fichier d'upload.
392   * @param string $R Dossier dans lequel on upload le fichier
393   */
394  function UploadFile($R) {
395    global $_FILES,$err;
396    $absolute=$this->convertabsolute($R,0);
397    if (!$absolute) {
398      $err->raise("bro",1);
399      return false;
400    }
401    if (!strpos($_FILES['userfile']['name'],"/")) {
[130]402      // move_uploaded_file($_FILES['userfile']['tmp_name'], $absolute."/".$_FILES['userfile']['name']);
403      if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
404        if (!file_exists($absolute."/".$_FILES['userfile']['name'])) {
405          touch($absolute."/".$_FILES['userfile']['name']);
406        }
407        copy($_FILES['userfile']['tmp_name'], $absolute."/".$_FILES['userfile']['name']);
408      } else {
409        $err->log("bro","uploadfile","Tentative d'attaque : ".$_FILES['userfile']['tmp_name']);
410      }
411      // TODO delete this if it works :)
412      // move_uploaded_file($_FILES['userfile']['tmp_name'], $absolute."/".$_FILES['userfile']['name']);
[1]413    }
414  }
415
[2077]416  /**
417   * Extract an archive by using GNU and non-GNU tools
418   * @param string $file is the full or relative path to the archive
419   * @param string $dest is the path of the extract destination
420   * @return boolean != 0 on error
421   */
422  function brouteur_extract($file, $dest="./")
423  {
424    static $i=0, $ret;
425    $file = addslashes($file);
426    $dest = addslashes($dest);
427    if ($i == 0) {
428#TODO new version of tar supports `tar xf ...` so there is no
429#     need to specify the compression format
430      exec("tar -xzf '$file' -C '$dest'", $void, $ret);
431    } else if ($i == 1) {
432      exec("tar -xjf '$file' -C '$dest'", $void, $ret);
433    } else if ($i == 2) {
434      exec("unzip '$file' -d '$dest'", $void, $ret);
435    } else if ($i == 3) {
436#FIXME I suck at extracting a rar archive to a specified directory
437#      but I think unrar just sucks <TM>
438      $rarfile = ereg_replace('[a-z0-9]+', '..', $dest)."/$file";
439      exec("mkdir -p '$dest'");
440      exec("cd '$dest' && unrar x -o+ '$rarfile'", $void, $ret);
441    } else {
442      return $ret;
443    }
444
445    if ($ret) {
446      $i++;
447      brouteur_extract($file, $dest);
448    }
449    return $ret;
450  }
451
452
453  /**
454   * Copy a source to a destination by either copying recursively a
455   * directory or by downloading a file with a URL (only http:// is
456   * supported)
457   * @param string $name is the application name
458   * @param string $src is the path or URL
459   * @param string $dest is the absolute path inside the users directory
460   * @return boolean false on error
461   */
462  function brouteur_copy($name, $src, $dest)
463  {
464    global $error, $db;
465
466    $ok = false;
467    @mkdir($dest, 0777);
468    @chmod($dest, 0777);
469    $f = @fopen("$dest/test.php", 'w');
470    if ($f) {
471      @fputs($f, '<?php $ok = true; ?>');
472      @fclose($f);
473      @chmod("$dest/test.php", 0777);
474      include("$dest/test.php");
475    }
476    @unlink("$dest/test.php");
477    @rmdir("$dest");
478    if (!$ok) {
479      $error = _("No write permissions in the destination directory");
480      return false;
481    }
482
483    if (substr($src, 0, 7) == "http://") {
484      $filename = basename($src);
485      $extractdir = tempnam("/tmp", "brouteur");
486      unlink($extractdir);
487      mkdir($extractdir);
488
489      if (!$http = @fopen($src, "rb")) {
490        // Try to get a handle on $http with fsockopen instead
491        ereg('^http://([^/]+)(/.*)$', $src, $eregs);
492        $hostname = $eregs[1];
493        $path = $eregs[2];
494        $http = @fsockopen($hostname, 80);
495        @fputs($http, "GET $path HTTP/1.1\nHost: $hostname\n\n");
496      }
497      if ($http) {
498        // Save the bits
499        $f = fopen("$extractdir/$filename", "wb");
500        while (!feof($http)) {
501          $bin = fgets($http, 16384);
502          fwrite($f, $bin);
503#FIXME if (!trim($bin)) break;
504        }
505        fclose($f);
506        fclose($http);
507      } else {
508        // Dammit, try with wget than
509        exec("wget -q '$src' -O '$extractdir/$filename'", $void, $ret);
510        if ($ret) {
511          $error = _("Unable to download the web application's package.");
512          return false;
513        }
514      }
515
516      // Now extract that package
517      if (!brouteur_extract("$extractdir/$filename", $extractdir)) {
518        $error = _("Unable to extract the files");
519        return false;
520      }
521      unlink("$extractdir/$filename");
522
523      // Corrupt $src since we want to copy $extractdir/packagename
524      $hd = opendir($extractdir);
525      while ($file = readdir($hd)) {
526        if ($file != "." && $file != "..") {
527          $src = "$extractdir/$file";
528          break;
529        }
530      }
531    }
532
533    // Last step // Copy -R
534    $src = addslashes($src);
535    $dest = addslashes($dest);
536    $array = explode('/', $dest);
537    $dir = "";
538    foreach ($array as $v) {
539      $dir .= "$v/";
540      @mkdir($dest);
541    }
542#TODO write a recursive copy function(?)
543    exec("cp -Rf '$src'/* '$dest'", $void, $ret);
544    if ($ret) {
545      $error = _("Errors happened while copying the source to destination.");
546      return false;
547    }
548
549    $error = _("The web application has been successfully installed.");
550    return true;
551  }
552
[1]553  /* ----------------------------------------------------------------- */
554  /** Affiche le chemin et les liens de la racine au dossier $path
555   * Affiche autant de liens HTML (anchor) que le chemin $path contient de
556   * niveaux de dossier. Chaque lien est associé à la page web $action
557   * à laquelle on ajoute le paramètre R=+Le nom du dossier courant.
558   * @param string $path Dossier vers lequel on trace le chemin
559   * @param string $action Page web de destination des liens
560   * @return string le code HTML ainsi obtenu.
561   */
562  function PathList($path,$action) {
563    $path=$this->convertabsolute($path,1);
564    $a=explode("/",$path);
565    if (!is_array($a)) $a=array($a);
566    for($i=0;$i<count($a);$i++) {
567      if ($a[$i]) {
568        $R.=$a[$i]."/";
[1704]569        $c.="<a href=\"$action?R=".urlencode($R)."\">".$a[$i]."</a>&nbsp;/&nbsp;";
[1]570      }
571    }
572    return $c;
573  }
574
575  /* ----------------------------------------------------------------- */
576  /** Affiche le contenu d'un fichier pour un champ VALUE de textarea
577   * Affiche le contenu du fichier $file dans le dossier $R. Le contenu
578   * du fichier est reformaté pour pouvoir entrer dans un champs TextArea
579   * @param string $R Dossier dans lequel on cherche le fichier
580   * @param string $file Fichier dont on souhaite obtenir le contenu.
581   * @return boolean retourne TRUE si le fichier a bien été émis sur
582   * echo, ou FALSE si une erreur est survenue.
583   */
584  function content($R,$file) {
585    global $err;
586    $absolute=$this->convertabsolute($R,0);
587    if (!strpos($file,"/")) {
588      $absolute.="/".$file;
589      if (file_exists($absolute)) {
590        $content = @file($absolute);
591        for($i=0;$i<count($content);$i++) {
592          echo str_replace("<","&lt;",str_replace("&","&amp;",$content[$i]));
593        }
594      }
595    } else {
596      $err->raise("bro",1);
597      return false;
598    }
599  }
600
601  /** Cache des urls pour VIEW
602   * @access private
603   */
604  var $cacheurl=array();
605
606  // Return a browsing url if available.
607  // Maintain a url cache (positive AND negative(-) cache)
608  /* ----------------------------------------------------------------- */
609  /** Retourne une url de navigation pour le fichier $name du dossier $dir
610   * Les url sont mises en caches. Il se peut qu'aucune url n'existe, ou que
611   * celle-ci soit protégée par un .htaccess.
612   * @param string $dir Dossier concerné
613   * @param string $name Fichier dont on souhaite obtenir une URL
614   * @return string URL concernée, ou FALSE si aucune URL n'est disponible pour ce fichier
615   */
616  function viewurl($dir,$name) {
[222]617    global $db,$cuid;
[1]618    // Is it in cache ?
619    if (substr($dir,0,1)=="/") $dir=substr($dir,1);
[132]620    if (substr($dir,-1)=="/") $dir=substr($dir,0,-1);
[1877]621    $dir=str_replace("%2F", "/", urlencode($dir));
622    $name=urlencode($name);
[1]623    if (!$this->cacheurl["d".$dir]) {
624      // On parcours $dir en remontant les /
625      $end="";  $beg=$dir;      $tofind=true;
626      while ($tofind) {
[222]627        $db->query("SELECT sub,domaine FROM sub_domaines WHERE compte='$cuid'
[1]628                         AND type=0 AND (valeur='/$beg/' or valeur='/$beg');");
629        $db->next_record();
630        if ($db->num_rows()) {
631          $tofind=false;
632          $this->cacheurl["d".$dir]="http://".$db->f("sub").ife($db->f("sub"),".").$db->f("domaine").$end;
633        }
634        if (!$beg && $tofind) {
635          $tofind=false;
636          $this->cacheurl["d".$dir]="-";
637                                // We did not find it ;(
638        }
639        if (($tt=strrpos($beg,"/"))!==false) {
640          $end=substr($beg,$tt).$end; // = /topdir$end so $end starts AND ends with /
641          $beg=substr($beg,0,$tt);
642        } else {
643          $end="/".$beg.$end;
644          $beg="/";
645        }
646      }
647    }
648    if ($this->cacheurl["d".$dir] && $this->cacheurl["d".$dir]!="-") {
[132]649      return $this->cacheurl["d".$dir]."/".$name;
[1]650    } else {
651      return false;
652    }
653  }
654
655  function content_send($R,$file) {
656    global $err;
657    $absolute=$this->convertabsolute($R,0);
658    if (!strpos($file,"/")) {
659      $absolute.="/".$file;
660      if (file_exists($absolute)) {
661        $content = @file($absolute);
662        for($i=0;$i<count($content);$i++) {
663          echo stripslashes($content[$i]);
664        }
665      }
666    } else {
667      $err->raise("bro",1);
668      return false;
669    }
670  }
671
672  /* ----------------------------------------------------------------- */
673  /** Sauve le fichier $file dans le dossier $R avec pour contenu $texte
674   * le contenu est issu d'un textarea, et ne DOIT PAS contenir de \ ajoutés
675   * automatiquement par addslashes
676   * @param string $file Nom du fichier à sauver. S'il existe déjà, il sera
677   *  écrasé sans confirmation.
678   * @param string $R Dossier dans lequel on modifie le fichier
679   * @param string $texte texte du fichier à sauver dedans
680   * @return boolean TRUE si tout s'est bien passé, FALSE si une erreur s'est produite.
681   */
682  function save($file,$R,$texte) {
683    global $err;
684    $absolute=$this->convertabsolute($R,0);
685    if (!strpos($file,"/")) {
686      $absolute.="/".$file;
687      if (file_exists($absolute)) {
688        $f=@fopen($absolute,"wb");
689        if ($f) {
690          fputs($f,$texte,strlen($texte));
691          fclose($f);
692        }
693      }
694    } else {
695      $err->raise("bro",1);
696      return false;
697    }
698  }
699
700  /* ----------------------------------------------------------------- */
701  /** Echo d'un flux .tar.Z contenant tout le contenu du dossier $dir
702   * @param string $dir dossier à dumper, relatif à la racine du compte du membre.
703   * @return void NE RETOURNE RIEN, et il faut Quitter le script immédiatement après
704   */
[398]705 function DownloadZ($dir="") {
[1]706    global $mem;
[398]707    header("Content-Disposition: attachment; filename=".$mem->user["login"].".tgz");
[1]708    header("Content-Type: application/x-Z");
709    header("Content-Transfer-Encoding: binary");
[398]710    $d=escapeshellarg(".".$this->convertabsolute($dir,1));
[397]711    set_time_limit(0);
[1]712    passthru("/bin/tar -cZ -C /var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"]."/ $d");
713  }
714
715  /* ----------------------------------------------------------------- */
716  /** Echo d'un flux .tgz contenant tout le contenu du dossier $dir
717   * @param string $dir dossier à dumper, relatif à la racine du compte du membre.
718   * @return void NE RETOURNE RIEN, et il faut Quitter le script immédiatement après
719   */
[398]720 function DownloadTGZ($dir="") {
[1]721    global $mem;
722    header("Content-Disposition: attachment; filename=".$mem->user["login"].".tgz");
723    header("Content-Type: application/x-tgz");
724    header("Content-Transfer-Encoding: binary");
[398]725    $d=escapeshellarg(".".$this->convertabsolute($dir,1));
[397]726    set_time_limit(0);
[1]727    passthru("/bin/tar -cz -C /var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"]."/ $d");
728  }
729
730
731  /* ----------------------------------------------------------------- */
732  /** Echo d'un flux .tar.bz2 contenant tout le contenu du dossier $dir
733   * @param string $dir dossier à dumper, relatif à la racine du compte du membre.
734   * @return void NE RETOURNE RIEN, et il faut Quitter le script immédiatement après
735   */
[398]736 function DownloadTBZ($dir="") {
[1]737    global $mem;
[398]738    header("Content-Disposition: attachment; filename=".$mem->user["login"].".tgz");
[1]739    header("Content-Type: application/x-bzip2");
740    header("Content-Transfer-Encoding: binary");
[398]741    $d=escapeshellarg(".".$this->convertabsolute($dir,1));
[397]742    set_time_limit(0);
[1]743    passthru("/bin/tar -cj -C /var/alternc/html/".substr($mem->user["login"],0,1)."/".$mem->user["login"]."/ $d");
744  }
745
746  /* ----------------------------------------------------------------- */
747  /** Echo d'un flux .ZIP contenant tout le contenu du dossier $dir
748   * @param string $dir dossier à dumper, relatif à la racine du compte du membre.
749   * @return void NE RETOURNE RIEN, et il faut Quitter le script immédiatement après
750   */
[398]751 function DownloadZIP($dir="") {
[1]752    global $mem;
[398]753    header("Content-Disposition: attachment; filename=".$mem->user["login"].".tgz");
[1]754    header("Content-Type: application/x-zip");
755    header("Content-Transfer-Encoding: binary");
[398]756    $d=escapeshellarg($this->convertabsolute($dir,0));
[397]757    set_time_limit(0);
[398]758    passthru("/usr/bin/zip -r - $d");
[1]759  }
760
761  /* ----------------------------------------------------------------- */
[45]762  /** Fonction de tri perso utilisé par filelist.
763   * @access private
764   */
765  function _sort_filelist_name($a,$b) {
766    if ($a["type"] && !$b["type"]) return 1;
767    if ($b["type"] && !$a["type"]) return -1;
768    return $a["name"]>$b["name"];
769  }
770
771  /* ----------------------------------------------------------------- */
[1]772  /** Efface $file et tous ses sous-dossiers s'il s'agit d'un dossier
773   * A UTILISER AVEC PRECAUTION !!!
774   * @param string $file Fichier ou dossier à supprimer.
775   * @access private
776   */
777  function _delete($file) {
778    // permet d'effacer de nombreux fichiers
[222]779    @set_time_limit(0);
[1]780    //chmod($file,0777);
781    if (is_dir($file)) {
782      $handle = opendir($file);
783      while($filename = readdir($handle)) {
784        if ($filename != "." && $filename != "..") {
785          $this->_delete($file."/".$filename);
786        }
787      }
788      closedir($handle);
789      rmdir($file);
790    } else {
791      unlink($file);
792    }
793  }
794
795
[789]796  /* ----------------------------------------------------------------- */
797  /**
798   * Exporte toutes les informations ftp du compte AlternC
799   * @access private
800   * EXPERIMENTAL 'sid' function ;)
801   */
802  function alternc_export() {
803    global $db,$err;
804    $err->log("bro","export");
805    $str="<bro>\n";
806    $pref=$this->GetPrefs();
807    foreach ($pref as $k=>$v) {
808      $str.="  <pref>\n";
809      $str.="    <".$k.">".xml_entities($v)."</".$k.">\n";
810      $str.="  </pref>\n";
811    }
812    $str.="</bro>\n";
813   
814    return $str;
815  }
816
817
[1]818} /* Classe BROUTEUR */
819
820?>
Note: See TracBrowser for help on using the repository browser.