// // This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike License. // // To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/1.0/ // // or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA. // // Francais (brouillon): http://creativecommons.org/projects/international/fr/translated-license // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Gestion des fichiers // v0.1.13 class fichiers { var $chemin = "../datas/"; // Formats de fichiers autorisés, les autres sont forcéments mauvais var $formats = '\.(ogg|ogm|flac|png|sxw|rtf|txt|html|htm|jpg|pdf|ps|jpeg|jpe|jpg|midi|mid|mng|sgml|smil|svg|xcf|xml|rss|sxd|sxc|gz|bz2|tex|mkv|dvi|csv|css|mp3)$'; var $err = array( "stop" => "oui", "log" => "oui", "debug" => "oui"); // Gestion des erreurs function _err($err,$debug="") { // Si le debug est activé if($this->err[debug] == "oui" && !empty($debug)) $err.= "\n// DEBUG //\n".$debug; // Si on log les erreurs if($this->err[log] == "oui") $this->erreurs[] = $err; // Si on s'arrête sur les erreurs if($this->err[stop] == "oui") { echo "
".htmlentities(stripslashes($err))."
"; exit; } $this->erreur = $err; return FALSE; } function liste($journal,$dir="") { if (!preg_match('!^[a-z0-9_/-]+$!i', $dir)) return array(); if(empty($dir)) $dir = "/"; else $dir = '/'.$dir.'/'; $handle = opendir($this->chemin."documents/".$journal.$dir); while($file = readdir($handle)) { if(substr($file,0,1) != ".") { $path = $this->chemin."documents/".$journal.$dir.$file; if(is_dir($path)) $out[] = array("dir"=>$file); else { $size = filesize($path); $date = filemtime($this->chemin."documents/".$journal.$dir."/".$file); $out[] = array("file"=>$file,"size"=>$size,"date"=>$date); } } } closedir($handle); return $out; } function createDir($journal,$dir) { if(!eregi("^([a-z0-9_ -]{1,30})$",$dir)) return FALSE; if(!@mkdir($this->chemin."documents/".$journal."/".$dir,0777)) return FALSE; return TRUE; } function deleteDir($journal,$dir) { if(!eregi("^([a-z0-9_ -]{1,30})$",$dir)) return FALSE; if(!@rmdir($this->chemin."documents/".$journal."/".$dir)) return FALSE; return TRUE; } function verify($journal,$file) { if(!eregi("^([a-z0-9_ -]{1,30}/)?[a-z0-9_. -]+$",$file)) return $this->_err("Caractères non autorisés dans le nom du fichier!"); if(!file_exists($this->chemin."documents/".$journal."/".$file)) return $this->_err("Fichier inexistant."); return TRUE; } function read($journal,$file) { if(!$this->verify($journal,$file)) return FALSE; $f = @file($this->chemin."documents/".$journal."/".$file); if(!$f) return $this->_err("Impossible de lire le fichier {$file}."); $f = implode($f); return $f; } function secure_php($texte) { $texte = strtr($texte,array(""< ?","?>"=>"? >",'<%'=>"< %",'%>'=>"% >","x-http"=>"(x)-http")); $texte = eregi_replace("language=[\"']php[43]?","language='péhachepé",$texte); return $texte; } function save($journal,$file,$content) { if(!$this->verify($journal,$file)) return FALSE; $fp = @fopen($this->chemin."documents/".$journal."/".$file,"w"); if(!$fp) return $this->_err("Impossible d'écrire dans le fichier {$file}."); $content = $this->secure_php($content); fputs($fp,stripslashes($content)); fclose($fp); } function supprimer($journal,$file) { if(is_array($file)) { foreach($file as $el) { if(!$this->verify($journal,$el)) return FALSE; if(!@unlink($this->chemin."documents/".$journal."/".$el)) return $this->_err("Impossible de supprimer le fichier {$el}."); } } else { if(!$this->verify($journal,$file)) return FALSE; if(!@unlink($this->chemin."documents/".$journal."/".$file)) return $this->_err("Impossible de supprimer le fichier {$file}."); } return TRUE; } function _dirsize($path , $recursive=TRUE) { $result = 0; if(!is_dir($path) || !is_readable($path)) return 0; else { $fd = dir($path); while($file = $fd->read()) { if(($file != ".") && ($file != "..")) { if(@is_dir("$path/$file/")) $result += $recursive? $this->_dirsize("$path/$file/"):0; else $result += filesize("$path/$file"); } } } $fd->close(); return $result; } function get_quota($journal) { $taille = $this->_dirsize($this->chemin."documents/".$journal."/"); $taille = round($taille / 1000 / 1000,2); return $taille; } function upload($journal,$file,$max="",$dir="") { if($file['error'] != UPLOAD_ERR_OK) { $err = $file['error']; if($err == UPLOAD_ERR_INI_SIZE) return $this->_err("Erreur d'envoi: fichier trop gros pour le serveur."); elseif($err == UPLOAD_ERR_FORM_SIZE) return $this->_err("Erreur d'envoi: fichier trop gros, plus de 250Ko."); elseif($err == UPLOAD_ERR_PARTIAL) return $this->_err("Erreur d'envoi: Le fichier n'a pas été téléchargé en entier."); elseif($err == UPLOAD_ERR_NO_FILE) return $this->_err("Erreur d'envoi: Aucun fichier téléchargé."); else return $this->_err("Erreur d'envoi: Erreur inconnue.",$file['error']); } if(!eregi($this->formats,$file['name'])) return $this->_err("Vous ne pouvez importer que des fichiers aux format libre.",$this->formats); #elseif(eregi("(application|php)",$file['type'])) # return $this->_err("Vous n'avez pas le droit d'uploader des fichiers scripts ou exécutables.",$file['type']); elseif($file['size'] > 500000) return $this->_err("Votre fichier fait plus de 500Ko. Vous ne pouvez pas uploader des fichiers supérieurs à 500Ko."); $quota = $this->get_quota($journal); if(!empty($max) && (($quota + round($file['size'] / 1000 / 1000)) > $max)) return $this->_err("Vous ne pouvez pas ajouter de fichier, vous n'avez plus assez d'espace libre."); if(!empty($dir)) $dir = $dir.'/'; if(file_exists($this->chemin."documents/{$journal}/".$dir.$file['name'])) return $this->_err("Ce fichier existe déjà."); if(@move_uploaded_file($file['tmp_name'], $this->chemin.'documents/'.$journal.'/'.$dir.$file['name'])) return TRUE; return $this->_err("Erreur de chargement inconnue."); } } ?>