PageRenderTime 60ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/1.2/includes/file.class.php

http://kfm.googlecode.com/
PHP | 182 lines | 173 code | 2 blank | 7 comment | 42 complexity | 941f10774fb9d6fe7be1b62460379115 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1, Apache-2.0
  1. <?php
  2. $fileInstances=array();
  3. class kfmFile extends kfmObject{
  4. var $ctime='';
  5. var $directory='';
  6. var $exists=0;
  7. var $id=-1;
  8. var $mimetype='';
  9. var $name='';
  10. var $parent=0;
  11. var $path='';
  12. var $size=0;
  13. var $type;
  14. var $writable=false;
  15. function kfmFile(){
  16. if(func_num_args()==1){
  17. $this->id=func_get_arg(0);
  18. parent::kfmObject();
  19. $filedata=db_fetch_row("SELECT id,name,directory FROM ".KFM_DB_PREFIX."files WHERE id=".$this->id);
  20. $this->name=$filedata['name'];
  21. $this->parent=$filedata['directory'];
  22. $dir=kfmDirectory::getInstance($this->parent);
  23. $this->directory=$dir->path;
  24. $this->path=$dir->path.'/'.$filedata['name'];
  25. if(!$this->exists()){
  26. $this->error('File cannot be found');
  27. $this->delete();
  28. return false;
  29. }
  30. $this->writable=$this->isWritable();
  31. $this->ctime=filemtime($this->path);
  32. $mimetype=get_mimetype($this->path);
  33. $pos=strpos($mimetype,';');
  34. $this->mimetype=($pos===false)?$mimetype:substr($mimetype,0,$pos);
  35. $this->type=trim(substr(strstr($this->mimetype,'/'),1));
  36. }
  37. }
  38. function checkAddr($addr){
  39. return (
  40. strpos($addr,'..')===false&&
  41. strpos($addr,'.')!==0&&
  42. strpos($addr,'/')===false &&
  43. !in_array(preg_replace('/.*\./','',$addr),$GLOBALS['kfm_banned_extensions'])
  44. );
  45. }
  46. function exists(){
  47. if($this->exists)return $this->exists;
  48. $this->exists=file_exists($this->path);
  49. return $this->exists;
  50. }
  51. function getContent(){
  52. return ($this->id==-1)?false:utf8_encode(file_get_contents($this->path));
  53. }
  54. function getExtension(){
  55. /* Function that returns the extension of the file.
  56. * if a parameter is given, the extension of that parameters is returned
  57. * returns false on error.
  58. */
  59. if(func_num_args()==1){
  60. $filename=func_get_arg(0);
  61. }else{
  62. if($this->id==-1)return false;
  63. $filename=$this->name;
  64. }
  65. $dotext=strrchr($filename,'.');
  66. if($dotext === false) return false;
  67. return strtolower(substr($dotext,1));
  68. }
  69. function getUrl($x=0,$y=0){
  70. global $rootdir, $kfm_userfiles_output,$kfm_workdirectory;
  71. $cwd=$this->directory.'/'==$rootdir?'':str_replace($rootdir,'',$this->directory);
  72. if(!$this->exists())return 'javascript:alert("missing file")';
  73. if(preg_replace('/.*(get\.php)$/','$1',$kfm_userfiles_output)=='get.php'){
  74. if($kfm_userfiles_output=='get.php')$url=preg_replace('/\/[^\/]*$/','/get.php?id='.$this->id.GET_PARAMS,$_SERVER['REQUEST_URI']);
  75. else $url=$kfm_userfiles_output.'?id='.$this->id;
  76. if($x&&$y)$url.='&width='.$x.'&height='.$y;
  77. }
  78. else{
  79. if($this->isImage()&&$x&&$y){
  80. $img=kfmImage::getInstance($this);
  81. $img->setThumbnail($x,$y);
  82. return $kfm_userfiles_output.$kfm_workdirectory.'/thumbs/'.$img->thumb_id;
  83. }
  84. else $url=$kfm_userfiles_output.'/'.$cwd.'/'.$this->name; # TODO: check this line - $cwd may be incorrect if the requested file is from a search
  85. }
  86. return preg_replace('/([^:])\/{2,}/','$1/',$url);
  87. }
  88. function delete(){
  89. global $kfm_allow_file_delete;
  90. if(!$kfm_allow_file_delete)return $this->error(kfm_lang('permissionDeniedDeleteFile'));
  91. if(!kfm_cmsHooks_allowedToDeleteFile($this->id))return $this->error(kfm_lang('CMSRefusesFileDelete',$this->path));
  92. if($this->exists() && !$this->writable)return $this->error(kfm_lang('fileNotMovableUnwritable',$this->name));
  93. if(!$this->exists() || unlink($this->path))$this->db->exec("DELETE FROM ".KFM_DB_PREFIX."files WHERE id=".$this->id);
  94. else return $this->error(kfm_lang('failedDeleteFile',$this->name));
  95. return true;
  96. }
  97. function move($dir_id){
  98. global $kfmdb;
  99. if(!$this->writable)return $this->error(kfm_lang('fileNotMovableUnwritable',$this->name));
  100. $dir=kfmDirectory::getInstance($dir_id);
  101. if(!$dir)return $this->error(kfm_lang('failedGetDirectoryObject'));
  102. if(!rename($this->path,$dir->path.'/'.$this->name))return $this->error(kfm_lang('failedMoveFile',$this->name));
  103. $q=$kfmdb->query("update ".KFM_DB_PREFIX."files set directory=".$dir_id." where id=".$this->id);
  104. }
  105. function getInstance($id=0){
  106. global $fileInstances;
  107. if(!$id)return false;
  108. if(is_object($id))$id=$id->id;
  109. if(!isset($fileInstances[$id]))$fileInstances[$id]=new kfmFile($id);
  110. if($fileInstances[$id]->isImage())return kfmImage::getInstance($id);
  111. return $fileInstances[$id];
  112. }
  113. function getSize(){
  114. if(!$this->size)$this->size=filesize($this->path);
  115. return $this->size;
  116. }
  117. function getTags(){
  118. $arr=array();
  119. $tags=db_fetch_all("select tag_id from ".KFM_DB_PREFIX."tagged_files where file_id=".$this->id);
  120. foreach($tags as $r)$arr[]=$r['tag_id'];
  121. return $arr;
  122. }
  123. function isImage(){
  124. return in_array($this->getExtension(),array('jpg', 'jpeg', 'gif', 'png', 'bmp'));
  125. }
  126. function isWritable(){
  127. return (($this->id==-1)||!is_writable($this->path))?false:true;
  128. }
  129. function rename($newName){
  130. global $kfm_allow_file_edit;
  131. if(!$kfm_allow_file_edit)return $this->error(kfm_lang('permissionDeniedEditFile'));
  132. if(!kfm_checkAddr($newName))return $this->error(kfm_lang('cannotRenameFromTo',$this->name,$newName));
  133. $newFileAddress=$this->directory.$newName;
  134. if(file_exists($newFileAddress))return $this->error(kfm_lang('fileAlreadyExists'));
  135. rename($this->path,$newFileAddress);
  136. $this->name=$newName;
  137. $this->path=$newFileAddress;
  138. $this->db->query("UPDATE ".KFM_DB_PREFIX."files SET name='".sql_escape($newName)."' WHERE id=".$this->id);
  139. }
  140. function setContent($content){
  141. global $kfm_allow_file_edit;
  142. if(!$kfm_allow_file_edit)return $this->error(kfm_lang('permissionDeniedEditFile'));
  143. $result=file_put_contents($this->path,utf8_decode($content));
  144. if(!$result)$this->error(kfm_lang('errorSettingFileContent'));
  145. }
  146. function setTags($tags){
  147. if(!count($tags))return;
  148. $this->db->exec("DELETE FROM ".KFM_DB_PREFIX."tagged_files WHERE file_id=".$this->id);
  149. foreach($tags as $tag)$this->db->exec("INSERT INTO ".KFM_DB_PREFIX."tagged_files (file_id,tag_id) VALUES(".$this->id.",".$tag.")");
  150. }
  151. function size2str(){
  152. # returns the size in a human-readable way
  153. # expects input size in bytes
  154. # if no input parameter is given, the size of the file object is returned
  155. $size=func_num_args()?func_get_arg(0):$this->getSize();
  156. if(!$size)return '0';
  157. $format=array("B","KB","MB","GB","TB","PB","EB","ZB","YB");
  158. $n=floor(log($size)/log(1024));
  159. return $n?round($size/pow(1024,$n),1).' '.$format[$n]:'0 B';
  160. }
  161. function addToDb($filename,$directory_id){
  162. global $kfmdb;
  163. $sql="insert into ".KFM_DB_PREFIX."files (name,directory) values('".sql_escape($filename)."',".$directory_id.")";
  164. $q=$kfmdb->query($sql);
  165. return $kfmdb->lastInsertId(KFM_DB_PREFIX.'files','id');
  166. }
  167. function checkName($filename=false){
  168. if($filename===false)$filename=$this->name;
  169. if(trim($filename)=='')return false;
  170. if($filename[0]=='.')return false;
  171. foreach($GLOBALS['kfm_banned_files'] as $ban){
  172. if(($ban[0]=='/' || $ban[0]=='@')&&preg_match($ban,$filename))return false;
  173. elseif($ban==strtolower(trim($filename)))return false;
  174. }
  175. if(isset($GLOBALS['kfm_allowed_files']) && is_array($GLOBALS['kfm_allowed_files']))
  176. foreach($GLOBALS['kfm_allowed_files'] as $allow)if(!preg_match($allow, $filename))return false;
  177. return true;
  178. }
  179. }
  180. ?>