PageRenderTime 44ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/tags/1.2/includes/files.php

http://kfm.googlecode.com/
PHP | 328 lines | 324 code | 0 blank | 4 comment | 55 complexity | ca0db8ade00a04c6d4fdf55747fc8472 MD5 | raw file
Possible License(s): BSD-3-Clause, LGPL-2.1, Apache-2.0
  1. <?php
  2. function _copyFiles($files,$dir_id){
  3. $copied=0;
  4. $dir=kfmDirectory::getInstance($dir_id);
  5. foreach($files as $fid){
  6. $file=kfmFile::getInstance($fid);
  7. if(!$file)continue;
  8. if($dir->addFile($file))$copied++;
  9. }
  10. kfm_addMessage(kfm_lang('filesCopied',$copied));
  11. }
  12. function _createEmptyFile($cwd,$filename){
  13. global $kfm_session;
  14. $dir=kfmDirectory::getInstance($cwd);
  15. $path=$dir->path;
  16. if(!kfm_checkAddr($path.$filename))return 'error: '.kfm_lang('illegalFileName',$filename);
  17. return(touch($path.$filename))?kfm_loadFiles($cwd):'error: '.kfm_lang('couldNotCreateFile',$filename);
  18. }
  19. function _downloadFileFromUrl($url,$filename){
  20. global $kfm_session,$kfm_default_upload_permission;
  21. $cwd_id=$kfm_session->get('cwd_id');
  22. $dir=kfmDirectory::getInstance($cwd_id);
  23. $cwd=$dir->getPath();
  24. if(!kfm_checkAddr($cwd.'/'.$filename))return kfm_lang('error: filename not allowed');
  25. if(substr($url,0,4)!='http')return kfm_lang('error: url must begin with http');
  26. $file=file_get_contents(str_replace(' ','%20',$url));
  27. if(!$file)return kfm_lang('failedDownloadFromUrl');
  28. if(!file_put_contents($cwd.'/'.$filename,$file))return kfm_lang('failedWriteToFile',$filename);
  29. chmod($to, octdec('0'.$kfm_default_upload_permission));
  30. return kfm_loadFiles($cwd_id);
  31. }
  32. function _extractZippedFile($id){
  33. global $kfm_session;
  34. $cwd_id=$kfm_session->get('cwd_id');
  35. if(!$GLOBALS['kfm_allow_file_create'])return 'error: '.kfm_lang('permissionDeniedCreateFile');
  36. $file=kfmFile::getInstance($id);
  37. $dir=$file->directory.'/';
  38. { # try native system unzip command
  39. $res=-1;
  40. $arr=array();
  41. exec('unzip -l "'.$dir.$file->name.'"',$arr,$res);
  42. if(!$res){
  43. for($i=3;$i<count($arr)-2;++$i){
  44. $filename=preg_replace('/.* /','',$arr[$i]);
  45. if(!kfm_checkAddr($filename))return kfm_lang('errorZipContainsBannedFilename');
  46. }
  47. exec('unzip -o "'.$dir.$file->name.'" -x -d "'.$dir.'"',$arr,$res);
  48. }
  49. }
  50. if($res){ # try PHP unzip command
  51. return kfm_lang('error: unzip failed');
  52. # TODO: fix this
  53. $zip=zip_open($dir.$file->name);
  54. while($zip_entry=zip_read($zip)){
  55. $entry=zip_entry_open($zip,$zip_entry);
  56. $filename=zip_entry_name($zip_entry);
  57. $target_dir=$dir.substr($filename,0,strrpos($filename,'/'));
  58. $filesize=zip_entry_filesize($zip_entry);
  59. if(is_dir($target_dir)||mkdir($target_dir)){
  60. if($filesize>0){
  61. $contents=zip_entry_read($zip_entry,$filesize);
  62. file_put_contents($dir.$filename,$contents);
  63. }
  64. }
  65. }
  66. }
  67. return kfm_loadFiles($cwd_id);
  68. }
  69. function _getFileAsArray($filename){
  70. return explode("\n",rtrim(file_get_contents($filename)));
  71. }
  72. function _getFileDetails($fid){
  73. $file=kfmFile::getInstance($fid);
  74. if(!is_object($file))return kfm_lang('failedGetFileObject');
  75. $fpath=$file->path;
  76. if(!file_exists($fpath))return;
  77. $details=array(
  78. 'id'=>$file->id,
  79. 'name'=>$file->name,
  80. 'filename'=>$file->name,
  81. 'mimetype'=>$file->mimetype,
  82. 'filesize'=>$file->size2str(),
  83. 'tags'=>$file->getTags(),
  84. 'ctime'=>$file->ctime,
  85. 'writable'=>$file->isWritable()
  86. );
  87. if($file->isImage()){
  88. $details['caption']=$file->caption;
  89. $details['width']=$file->width;
  90. $details['height']=$file->height;
  91. $details['thumb_url']=$file->thumb_url;
  92. }
  93. return $details;
  94. }
  95. function _getFileUrl($fid,$x=0,$y=0){
  96. $file=kfmFile::getInstance($fid);
  97. return $file->getUrl($x,$y);
  98. }
  99. function _getFileUrls($fArr){
  100. $rArr=array();
  101. foreach($fArr as $f)$rArr[]=_getFileUrl($f);
  102. return $rArr;
  103. }
  104. function _getTagName($id){
  105. global $kfmdb;
  106. $r=db_fetch_row("select name from ".KFM_DB_PREFIX."tags where id=".$id);
  107. if(count($r))return array($id,$r['name']);
  108. return array($id,kfm_lang('UNKNOWN TAG',$id));
  109. }
  110. function _getTextFile($fid){
  111. $file=kfmFile::getInstance($fid);
  112. if(!kfm_checkAddr($file->name))return;
  113. $ext=$file->getExtension();
  114. if(!$file->isWritable())return 'error: '.kfm_lang('isNotWritable',$file->name);
  115. /**
  116. * determine language for Codepress
  117. */
  118. switch($ext){
  119. case 'html':
  120. case 'tpl':
  121. $language='html';
  122. break;
  123. case 'php':
  124. $language = 'php';
  125. break;
  126. case 'css':
  127. $language = 'css';
  128. break;
  129. case 'js':
  130. $language = 'javascript';
  131. break;
  132. case 'j':
  133. $language = 'java';
  134. break;
  135. case 'pl':
  136. $language = 'perl';
  137. break;
  138. case 'ruby':
  139. $language = 'ruby';
  140. break;
  141. case 'sql':
  142. $language = 'sql';
  143. break;
  144. case 'tex':
  145. $language = 'tex';
  146. break;
  147. case 'txt':
  148. $language = 'text';
  149. break;
  150. default:
  151. $language = 'generic';
  152. break;
  153. }
  154. return array('content'=>$file->getContent(),'name'=>$file->name,'id'=>$file->id,'language'=>$language);
  155. }
  156. function _loadFiles($rootid=1){
  157. global $kfm_session;
  158. $dir=kfmDirectory::getInstance($rootid);
  159. $oFiles=$dir->getFiles();
  160. if($dir->hasErrors())return $dir->getErrors();
  161. $files=array();
  162. foreach($oFiles as $file)$files[]=_getFileDetails($file);
  163. $root='/'.str_replace($GLOBALS['rootdir'],'',$dir->path);
  164. $kfm_session->set('cwd_id',$rootid);
  165. return array('reqdir'=>$root,'files'=>$files,'uploads_allowed'=>$GLOBALS['kfm_allow_file_upload']);
  166. }
  167. function _moveFiles($files,$dir_id){
  168. global $kfmdb,$kfm_session;
  169. $cwd_id=$kfm_session->get('cwd_id');
  170. foreach($files as $fid){
  171. $file=kfmFile::getInstance($fid);
  172. if(!$file)continue;
  173. $file->move($dir_id);
  174. }
  175. return kfm_loadFiles($cwd_id);
  176. }
  177. function _renameFile($fid,$newfilename,$refreshFiles=true){
  178. global $kfm_session;
  179. $file=kfmFile::getInstance($fid);
  180. $file->rename($newfilename);
  181. if($file->hasErrors())return $file->getErrors();
  182. if($refreshFiles)return kfm_loadFiles($kfm_session->get('cwd_id'));
  183. }
  184. function _renameFiles($files,$template){
  185. global $kfm_session;
  186. $cwd_id=$kfm_session->get('cwd_id');
  187. if(!$GLOBALS['kfm_allow_file_edit'])return 'error: '.kfm_lang('permissionDeniedEditFile');
  188. $prefix=preg_replace('/\*.*/','',$template);
  189. $postfix=preg_replace('/.*\*/','',$template);
  190. $precision=strlen(preg_replace('/[^*]/','',$template));
  191. for($i=1;$i<count($files)+1;++$i){
  192. $num=str_pad($i,$precision,'0',STR_PAD_LEFT);
  193. $ret=_renameFile($files[$i-1],$prefix.$num.$postfix,false);
  194. if($ret)return $ret; # error detected
  195. }
  196. return kfm_loadFiles($cwd_id);
  197. }
  198. function _resize_bytes($size){
  199. $count=0;
  200. $format=array("B","KB","MB","GB","TB","PB","EB","ZB","YB");
  201. while(($size/1024)>1&&$count<8){
  202. $size=$size/1024;
  203. ++$count;
  204. }
  205. $return=number_format($size,0,'','.')." ".$format[$count];
  206. return $return;
  207. }
  208. function _rm($id){
  209. if(is_array($id)){
  210. $counter=0;
  211. foreach($id as $fid){
  212. $file=kfmFile::getInstance($fid);
  213. if($file->delete())$counter++;
  214. }
  215. if($counter>1)kfm_addMessage(kfm_lang(' files deleted',$counter));
  216. }
  217. else{
  218. $file=kfmFile::getInstance($id);
  219. $file->delete();
  220. }
  221. return $id;
  222. }
  223. function _saveTextFile($fid,$text){
  224. if(!$GLOBALS['kfm_allow_file_edit'])return 'error: '.kfm_lang('permissionDeniedEditFile');
  225. $f=kfmFile::getInstance($fid);
  226. $f->setContent($text);
  227. return $f->hasErrors()?$f->getErrors():kfm_lang('file saved');
  228. }
  229. function _search($keywords,$tags){
  230. global $kfmdb;
  231. $files=array();
  232. $valid_files=array();
  233. if($tags){
  234. $arr=explode(',',$tags);
  235. foreach($arr as $tag){
  236. $tag=ltrim(rtrim($tag));
  237. if($tag){
  238. $r=db_fetch_row("select id from ".KFM_DB_PREFIX."tags where name='".sql_escape($tag)."'");
  239. if(count($r)){
  240. if(count($valid_files))$constraints=' and (file_id='.join(' or file_id=',$valid_files).')';
  241. $rs2=db_fetch_all("select file_id from ".KFM_DB_PREFIX."tagged_files where tag_id=".$r['id'].$constraints);
  242. if(count($rs2)){
  243. $valid_files=array();
  244. foreach($rs2 as $r2)$valid_files[]=$r2['file_id'];
  245. }
  246. else $valid_files=array(0);
  247. }
  248. }
  249. }
  250. }
  251. if(($tags&&count($valid_files))||$keywords){ # keywords
  252. $constraints='';
  253. if(count($valid_files))$constraints=' and (id='.join(' or id=',$valid_files).')';
  254. $fs=db_fetch_all("select id from ".KFM_DB_PREFIX."files where name like '%".sql_escape($keywords)."%'".$constraints." order by name");
  255. foreach($fs as $f){
  256. $file=kfmFile::getInstance($f['id']);
  257. if(!$file->checkName())continue;
  258. unset($file->db);
  259. $files[]=$file;
  260. }
  261. }
  262. return array('reqdir'=>kfm_lang('searchResults'),'files'=>$files,'uploads_allowed'=>0);
  263. }
  264. function _tagAdd($recipients,$tagList){
  265. if(!$GLOBALS['kfm_allow_file_edit'])return 'error: '.kfm_lang('permissionDeniedEditFile');
  266. global $kfmdb;
  267. if(!is_array($recipients))$recipients=array($recipients);
  268. $arr=explode(',',$tagList);
  269. $tagList=array();
  270. foreach($arr as $v){
  271. $v=ltrim(rtrim($v));
  272. if($v)$tagList[]=$v;
  273. }
  274. if(count($tagList))foreach($tagList as $tag){
  275. $r=db_fetch_row("select id from ".KFM_DB_PREFIX."tags where name='".sql_escape($tag)."'");
  276. if(count($r)){
  277. $tag_id=$r['id'];
  278. $kfmdb->query("delete from ".KFM_DB_PREFIX."tagged_files where tag_id=".$tag_id." and (file_id=".join(' or file_id=',$recipients).")");
  279. }
  280. else{
  281. $q=$kfmdb->query("insert into ".KFM_DB_PREFIX."tags (name) values('".sql_escape($tag)."')");
  282. $tag_id=$kfmdb->lastInsertId(KFM_DB_PREFIX.'tags','id');
  283. }
  284. foreach($recipients as $file_id)$kfmdb->query("insert into ".KFM_DB_PREFIX."tagged_files (tag_id,file_id) values(".$tag_id.",".$file_id.")");
  285. }
  286. return _getFileDetails($recipients[0]);
  287. }
  288. function _tagRemove($recipients,$tagList){
  289. if(!$GLOBALS['kfm_allow_file_edit'])return 'error: '.kfm_lang('permissionDeniedEditFile');
  290. global $kfmdb;
  291. if(!is_array($recipients))$recipients=array($recipients);
  292. $arr=explode(',',$tagList);
  293. $tagList=array();
  294. foreach($arr as $tag){
  295. $tag=ltrim(rtrim($tag));
  296. if($tag){
  297. $r=db_fetch_row("select id from ".KFM_DB_PREFIX."tags where name='".sql_escape($tag)."'");
  298. if(count($r))$tagList[]=$r['id'];
  299. }
  300. }
  301. if(count($tagList))$kfmdb->exec("delete from ".KFM_DB_PREFIX."tagged_files where (file_id=".join(' or file_id=',$recipients).") and (tag_id=".join(' or tag_id="',$tagList).")");
  302. return _getFileDetails($recipients[0]);
  303. }
  304. function _zip($filename,$files){
  305. global $kfm_session;
  306. $cwd_id=$kfm_session->get('cwd_id');
  307. $dir=kfmDirectory::getInstance($cwd_id);
  308. $cwd=$dir->path;
  309. if(!$GLOBALS['kfm_allow_file_create'])return 'error: '.kfm_lang('permissionDeniedCreateFile');
  310. global $rootdir;
  311. if(!kfm_checkAddr($cwd.'/'.$filename))return 'error: '.kfm_lang('illegalFileName',$filename);
  312. $arr=array();
  313. foreach($files as $f){
  314. $file=kfmFile::getInstance($f);
  315. if(!$file)return 'error: '.kfm_lang('missingFileInSelection');
  316. $arr[]=$file->path;
  317. }
  318. { # try native system zip command
  319. $res=-1;
  320. $pdir=$cwd.'/';
  321. $zipfile=$pdir.$filename;
  322. for($i=0;$i<count($arr);++$i)$arr[$i]=str_replace($pdir,'',$arr[$i]);
  323. exec('cd "'.$cwd.'" && zip -D "'.$zipfile.'" "'.join('" "',$arr).'"',$arr,$res);
  324. }
  325. if($res)return 'error: '.kfm_lang('noNativeZipCommand');
  326. return kfm_loadFiles($cwd_id);
  327. }
  328. ?>