PageRenderTime 42ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/public/js/plugins/kcfinder-1.7/class/class_browser.php

https://github.com/mydesignivan/Bottino
PHP | 726 lines | 641 code | 74 blank | 11 comment | 102 complexity | 544749b1e6890d040cd494307b6cbb68 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
  1. <?php
  2. /** This file is part KCFinder project
  3. *
  4. * @desc Browser actions class
  5. * @package KCFinder
  6. * @version 1.7
  7. * @author Pavel Tzonkov <pavelc@users.sf.net>
  8. * @copyright 2010 KCFinder Project
  9. * @license http://www.opensource.org/licenses/gpl-2.0.php GPLv2
  10. * @license http://www.opensource.org/licenses/lgpl-2.1.php LGPLv2
  11. * @link http://kcfinder.sunhater.com
  12. */
  13. class browser extends uploader {
  14. protected $get;
  15. protected $post;
  16. protected $cookie;
  17. protected $session;
  18. protected $action;
  19. protected $vars = array();
  20. public function __construct() {
  21. parent::__construct();
  22. $gpc = new gpc();
  23. $this->get = &$gpc->get;
  24. $this->post = &$gpc->post;
  25. $this->cookie = &$gpc->cookie;
  26. if (isset($this->config['_sessionVar'])) {
  27. $this->config['_sessionVar']['browser'] = array();
  28. $this->session = &$this->config['_sessionVar']['browser'];
  29. } else
  30. $this->session = &$_SESSION;
  31. if (isset($this->post['dir'])) {
  32. if (substr($this->post['dir'], 0, 1) == "/")
  33. $this->post['dir'] = substr($this->post['dir'], 1);
  34. $this->post['dir'] = helper::normalize_path($this->post['dir']);
  35. if (!$this->checkDir($this->post['dir'], false))
  36. $this->backMsg($this->label("Unknown error."));
  37. $parts = explode("/", $this->post['dir']);
  38. if (isset($this->types[$parts[0]]) && ($this->type != $parts[0]))
  39. $this->type = $parts[0];
  40. } elseif (isset($this->get['dir'])) {
  41. if (substr($this->get['dir'], 0, 1) == "/")
  42. $this->get['dir'] = substr($this->get['dir'], 1);
  43. $this->get['dir'] = helper::normalize_path($this->get['dir']);
  44. if (!$this->checkDir($this->get['dir'], false))
  45. $this->backMsg($this->label("Unknown error."));
  46. $parts = explode("/", $this->get['dir']);
  47. if (isset($this->types[$parts[0]]) && ($this->type != $parts[0]))
  48. $this->type = $parts[0];
  49. }
  50. $this->config['uploadDir'] = dirname($this->config['uploadDir']) . "/" . $this->type;
  51. $this->config['uploadURL'] = dirname($this->config['uploadURL']) . "/" . $this->type;
  52. $thumbsDir = dirname($this->config['uploadDir']) . "/" . $this->config['thumbsDir'];
  53. if ((
  54. !is_dir($thumbsDir) &&
  55. !@mkdir($thumbsDir, $this->config['dirPerms'])
  56. ) ||
  57. !is_readable($thumbsDir) ||
  58. !is_writable($thumbsDir)
  59. )
  60. $this->backMsg($this->label("Cannot access or create thumbnails folder."));
  61. $thumbsDir .= "/" . $this->type;
  62. if (!is_dir($thumbsDir))
  63. mkdir($thumbsDir, $this->config['dirPerms']);
  64. }
  65. public function getSession() {
  66. return $this->session;
  67. }
  68. public function getConfig($key=null) {
  69. return ($key === null)
  70. ? $this->config
  71. : (isset($this->config[$key])
  72. ? $this->config[$key]
  73. : null);
  74. }
  75. public function action() {
  76. if ($this->config['disabled'])
  77. $this->backMsg($this->label("You don't have permissions to browse server."));
  78. $act = isset($this->get['act']) ? $this->get['act'] : "browser";
  79. if (!method_exists($this, "act_$act"))
  80. $act = "browser";
  81. $this->action = $act;
  82. $method = "act_$act";
  83. $content = $this->$method();
  84. $this->vars['currDir'] = $this->type . (strlen($this->session['dir']) ? "/{$this->session['dir']}" : "");
  85. if ($act == "browser") header("X-UA-Compatible: chrome=1");
  86. echo ($act == "browser")
  87. ? $this->template("_header") . $content . $this->template("_footer")
  88. : $content;
  89. }
  90. protected function act_browser() {
  91. $dir = (isset($this->get['dir']) && $this->checkDir($this->get['dir']))
  92. ? $this->get['dir']
  93. : (isset($this->session['dir']) ? $this->session['dir'] : "");
  94. if (strlen($dir) &&
  95. !is_dir(dirname($this->config['uploadDir']) . "/{$this->type}/$dir")
  96. )
  97. $dir = "";
  98. $this->session['dir'] = $dir;
  99. $index = (($dir === "") ? "/" : "") . basename($this->config['uploadDir']) . (is_writable($this->config['uploadDir']) ? "/" : "");
  100. $tree = array($index => $this->getTree("", $dir, true));
  101. $files = $this->getFiles($dir);
  102. $this->vars['dir'] = $dir;
  103. $this->vars['tree'] = &$tree;
  104. $this->vars['files'] = &$files;
  105. return $this->template();
  106. }
  107. protected function act_expand() {
  108. if (!isset($this->post['dir'])) return "";
  109. list($type) = explode("/", $this->post['dir']);
  110. if ($type != $this->type) return "";
  111. $dir = ($this->post['dir'] == $type)
  112. ? "" : preg_replace('/^[^\/]+\/(.*)/s', "$1", $this->post['dir']);
  113. if (!$this->checkDir($dir)) return "";
  114. return $this->drawDirs($dir);
  115. }
  116. protected function act_chDir() {
  117. if (!isset($this->post['dir'])) return "";
  118. list($type) = explode("/", $this->post['dir']);
  119. if ($type != $this->type) return "";
  120. $dir = ($this->post['dir'] == $type)
  121. ? "" : preg_replace('/^[^\/]+\/(.*)/s', "$1", $this->post['dir']);
  122. if (!$this->checkDir($dir)) return "";
  123. $this->session['dir'] = $dir;
  124. $files = $this->getFiles($dir);
  125. $html = $this->drawFiles($dir, $files);
  126. return $html ? $html : "&nbsp;";
  127. }
  128. protected function act_thumb() {
  129. $baseDir = dirname($this->config['uploadDir']);
  130. if (!isset($this->get['image']))
  131. return $this->outIcon();
  132. $file = $this->get['image'];
  133. $path = "$baseDir/$file";
  134. if (!file_exists($path))
  135. return $this->outIcon();
  136. $thumb = "$baseDir/{$this->config['thumbsDir']}/$file";
  137. $thumbDir = dirname($thumb);
  138. if (!is_dir($thumbDir) &&
  139. !helper::rmkdir($thumbDir, $this->config['dirPerms'])
  140. )
  141. return $this->outIcon($file);
  142. if (file_exists($thumb)) {
  143. header("Content-type: image/jpeg");
  144. readfile($thumb);
  145. return;
  146. }
  147. $gd = new gd($path);
  148. if ($gd->init_error)
  149. return $this->outIcon($file);
  150. $browsable = array(
  151. IMAGETYPE_GIF => "gif",
  152. IMAGETYPE_JPEG => "jpeg",
  153. IMAGETYPE_JPEG2000 => "jpeg",
  154. IMAGETYPE_PNG => "png",
  155. );
  156. // Images with smaller resolutions than thumbnails
  157. if (($gd->get_width() <= $this->config['thumbWidth']) &&
  158. ($gd->get_height() <= $this->config['thumbHeight'])
  159. ) {
  160. // Browsable types
  161. if (isset($browsable[$gd->type])) {
  162. header("Content-type: image/{$browsable[$gd->type]}");
  163. readfile($path);
  164. return;
  165. // Non-browsable types
  166. } elseif (!$gd->imagejpeg($thumb, $this->config['jpegQuality']))
  167. return $this->outIcon($file);
  168. // Resize image
  169. } elseif (
  170. !$gd->resize_fit($this->config['thumbWidth'], $this->config['thumbHeight']) ||
  171. !$gd->imagejpeg($thumb, $this->config['jpegQuality'])
  172. )
  173. return $this->outIcon($file);
  174. // Show Image
  175. header("Content-type: image/jpeg");
  176. readfile($thumb);
  177. return;
  178. }
  179. protected function act_upload() {
  180. $baseDir = dirname($this->config['uploadDir']);
  181. if (!isset($this->post['dir']) ||
  182. (false === ($dir = "$baseDir/{$this->post['dir']}")) ||
  183. !is_dir($dir) || !is_readable($dir) || !is_writable($dir)
  184. )
  185. die($this->label("Cannot access or write to upload folder."));
  186. $message = $this->checkUploadedFile();
  187. if ($message !== true) {
  188. if (isset($this->file['tmp_name']))
  189. @unlink($this->file['tmp_name']);
  190. die($message);
  191. }
  192. $sufix = ""; $i = 1;
  193. $ext = $this->getExtension($this->file['name'], false);
  194. $base = strlen($ext)
  195. ? substr($this->file['name'], 0, -strlen($ext) - 1)
  196. : $this->file['name'];
  197. do {
  198. $target = "$dir/$base$sufix" . (strlen($ext) ? ".$ext" : "");
  199. $sufix = "(" . $i++ . ")";
  200. } while (file_exists($target));
  201. if (!move_uploaded_file($this->file['tmp_name'], $target)) {
  202. @unlink($this->file['tmp_name']);
  203. die($this->label("Cannot move uploaded file to target folder."));
  204. } elseif (function_exists('chmod'))
  205. chmod($target, $this->config['filePerms']);
  206. echo "/" . basename($target);
  207. // THUMBNAIL GENERATION
  208. $gd = new gd($target);
  209. if ($gd->init_error)
  210. return;
  211. // Images with smaller resolutions than thumbnails
  212. if (($gd->get_width() <= $this->config['thumbWidth']) &&
  213. ($gd->get_height() <= $this->config['thumbHeight'])
  214. ) {
  215. $browsable = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_JPEG2000, IMAGETYPE_PNG);
  216. // Browsable types does not need a thumbnail
  217. if (in_array($gd->type, $browsable))
  218. return;
  219. // Resize image
  220. } elseif (!$gd->resize_fit($this->config['thumbWidth'], $this->config['thumbHeight']))
  221. return;
  222. // Check thumbnail directory
  223. $thumb = "$baseDir/{$this->config['thumbsDir']}/{$this->post['dir']}";
  224. if (!is_dir($thumb) && !helper::rmkdir($thumb, $this->config['dirPerms']))
  225. return;
  226. $thumb .= "/" . basename($target);
  227. // Save thumbnail
  228. $gd->imagejpeg($thumb, $this->config['jpegQuality']);
  229. }
  230. protected function act_newDir() {
  231. $baseDir = dirname($this->config['uploadDir']);
  232. if (!isset($this->post['dir']) ||
  233. (false === ($dir = "$baseDir/{$this->post['dir']}")) ||
  234. !is_dir($dir) || !is_readable($dir) || !is_writable($dir) ||
  235. !isset($this->post['newDir']) ||
  236. (false === ($newDir = helper::clear_whitespaces($this->post['newDir']))) ||
  237. !strlen($newDir) || preg_match('/\//s', $newDir) ||
  238. (substr($newDir, 0, 1) == ".") ||
  239. !@mkdir("$baseDir/{$this->post['dir']}/$newDir", $this->config['dirPerms'])
  240. )
  241. die($this->label("Unknown error."));
  242. }
  243. protected function act_renameDir() {
  244. $baseDir = dirname($this->config['uploadDir']);
  245. if (!isset($this->post['dir']) ||
  246. (false === ($dir = "$baseDir/{$this->post['dir']}")) ||
  247. !is_dir($dir) || !is_readable($dir) || !is_writable($dir) ||
  248. !isset($this->post['newName']) ||
  249. (false === ($newName = helper::clear_whitespaces($this->post['newName']))) ||
  250. !strlen($newName) || preg_match('/\//s', $newName) ||
  251. (substr($newName, 0, 1) == ".") ||
  252. !@rename(
  253. "$baseDir/{$this->post['dir']}",
  254. dirname("$baseDir/{$this->post['dir']}") . "/$newName"
  255. )
  256. )
  257. die($this->label("Unknown error."));
  258. $thumbDir = "$baseDir/{$this->config['thumbsDir']}/{$this->post['dir']}";
  259. if (is_dir($thumbDir))
  260. @rename($thumbDir, dirname($thumbDir) . "/$newName");
  261. }
  262. protected function act_deleteDir() {
  263. $baseDir = dirname($this->config['uploadDir']);
  264. if (!isset($this->post['dir']) ||
  265. (false === ($dir = "$baseDir/{$this->post['dir']}")) ||
  266. !is_dir($dir) || !is_readable($dir) || !is_writable($dir) ||
  267. !helper::rrmdir($dir)
  268. )
  269. die($this->label("Unknown error."));
  270. $thumbDir = "$baseDir/{$this->config['thumbsDir']}/{$this->post['dir']}";
  271. if (is_dir($thumbDir))
  272. helper::rrmdir($thumbDir);
  273. }
  274. protected function act_download() {
  275. $baseDir = dirname($this->config['uploadDir']);
  276. if (!isset($this->post['dir']) ||
  277. (false === ($dir = "$baseDir/{$this->post['dir']}")) ||
  278. !is_dir($dir) || !is_readable($dir) ||
  279. !isset($this->post['file']) ||
  280. (false === ($file = "$dir/{$this->post['file']}")) ||
  281. !file_exists($file) || !is_readable($file)
  282. )
  283. die($this->label("Unknown error."));
  284. header("Pragma: public");
  285. header("Expires: 0");
  286. header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  287. header("Cache-Control: private", false);
  288. header("Content-Type: application/octet-stream");
  289. header('Content-Disposition: attachment; filename="' . str_replace('"', "_", $this->post['file']) . '"');
  290. header("Content-Transfer-Encoding:­ binary");
  291. header("Content-Length: " . filesize($file));
  292. readfile($file);
  293. die;
  294. }
  295. protected function act_rename() {
  296. $baseDir = dirname($this->config['uploadDir']);
  297. if (!isset($this->post['dir']) ||
  298. (false === ($dir = "$baseDir/{$this->post['dir']}")) ||
  299. !is_dir($dir) || !is_readable($dir) ||
  300. !isset($this->post['file']) ||
  301. (false === ($file = "$dir/{$this->post['file']}")) ||
  302. !file_exists($file) || !is_readable($file) || !is_writable($file) ||
  303. !isset($this->post['newName']) ||
  304. (false === ($newName = helper::clear_whitespaces($this->post['newName']))) ||
  305. !strlen($newName) || preg_match('/\//s', $newName) ||
  306. (substr($newName, 0, 1) == ".")
  307. )
  308. die($this->label("Unknown error."));
  309. list($type) = explode("/", $this->post['dir']);
  310. $newName = "$baseDir/{$this->post['dir']}/$newName";
  311. $ext = $this->getExtension($newName);
  312. if (!$this->validateExtension($ext, $type))
  313. die($this->label("Denied file extension."));
  314. if (!@rename($file, $newName))
  315. die($this->label("Unknown error."));
  316. $thumbDir = "$baseDir/{$this->config['thumbsDir']}/{$this->post['dir']}";
  317. $thumbFile = "$thumbDir/{$this->post['file']}";
  318. if (file_exists($thumbFile))
  319. @rename($thumbFile, "$thumbDir/{$this->post['newName']}");
  320. }
  321. protected function act_delete() {
  322. $baseDir = dirname($this->config['uploadDir']);
  323. if (!isset($this->post['dir']) ||
  324. (false === ($dir = "$baseDir/{$this->post['dir']}")) ||
  325. !is_dir($dir) || !is_readable($dir) ||
  326. !isset($this->post['file']) ||
  327. (false === ($file = "$dir/{$this->post['file']}")) ||
  328. !file_exists($file) || !is_readable($file) || !is_writable($file) ||
  329. !@unlink($file)
  330. )
  331. die($this->label("Unknown error."));
  332. $thumbDir = "$baseDir/{$this->config['thumbsDir']}/{$this->post['dir']}";
  333. $thumbFile = "$thumbDir/{$this->post['file']}";
  334. if (file_exists($thumbFile))
  335. @unlink($thumbFile);
  336. }
  337. protected function act_cp_cbd() {
  338. $baseDir = dirname($this->config['uploadDir']);
  339. if (!isset($this->post['dir']) ||
  340. (false === ($dir = "$baseDir/{$this->post['dir']}")) ||
  341. !is_dir($dir) || !is_readable($dir) || !is_writable($dir) ||
  342. !isset($this->post['files']) || !is_array($this->post['files']) ||
  343. !count($this->post['files'])
  344. )
  345. die($this->label("Unknown error."));
  346. $message = "";
  347. foreach($this->post['files'] as $file) {
  348. $path = "$baseDir/$file";
  349. $base = basename($file);
  350. $replace = array('file' => $base);
  351. $ext = $this->getExtension($base);
  352. $type = explode("/", $file);
  353. $type = $type[0];
  354. if (!file_exists($path))
  355. $message .= $this->label("The file '{file}' does not exist.", $replace) . "\n";
  356. elseif (substr($base, 0, 1) == ".")
  357. $message .= $this->label("File name shouldn't begins with '.'");
  358. elseif (!$this->validateExtension($ext, $type))
  359. $message .= $this->label("Denied file extension.");
  360. elseif (!is_readable($path) || !is_file($path))
  361. $message .= $this->label("Cannot read '{file}'.", $replace) . "\n";
  362. elseif (!@copy($path, "$dir/$base"))
  363. $message .= $this->label("Cannot copy '{file}'.", $replace) . "\n";
  364. else {
  365. @chmod("$dir/$base", $this->config['filePerms']);
  366. $fromThumb = "$baseDir/{$this->config['thumbsDir']}/$file";
  367. if (file_exists($fromThumb) &&
  368. is_readable($fromThumb) &&
  369. is_file($fromThumb)
  370. ) {
  371. $toThumb = "$baseDir/{$this->config['thumbsDir']}/{$this->post['dir']}";
  372. if (!is_dir($toThumb))
  373. helper::rmkdir($toThumb, $this->config['dirPerms']);
  374. $toThumb .= "/$base";
  375. @copy($fromThumb, $toThumb);
  376. }
  377. }
  378. }
  379. if (strlen($message)) die(substr($message, 0, -1));
  380. }
  381. protected function act_mv_cbd() {
  382. $baseDir = dirname($this->config['uploadDir']);
  383. if (!isset($this->post['dir']) ||
  384. (false === ($dir = "$baseDir/{$this->post['dir']}")) ||
  385. !is_dir($dir) || !is_readable($dir) || !is_writable($dir) ||
  386. !isset($this->post['files']) || !is_array($this->post['files']) ||
  387. !count($this->post['files'])
  388. )
  389. die($this->label("Unknown error."));
  390. $message = "";
  391. foreach($this->post['files'] as $file) {
  392. $path = "$baseDir/$file";
  393. $base = basename($file);
  394. $replace = array('file' => $base);
  395. $ext = $this->getExtension($base);
  396. $type = explode("/", $file);
  397. $type = $type[0];
  398. if (!file_exists($path))
  399. $message .= $this->label("The file '{file}' does not exist.", $replace) . "\n";
  400. elseif (substr($base, 0, 1) == ".")
  401. $message .= $this->label("File name shouldn't begins with '.'");
  402. elseif (!$this->validateExtension($ext, $type))
  403. $message .= $this->label("Denied file extension.");
  404. elseif (!is_readable($path) || !is_file($path))
  405. $message .= $this->label("Cannot read '{file}'.", $replace) . "\n";
  406. elseif (!@rename($path, "$dir/$base"))
  407. $message .= $this->label("Cannot move '{file}'.", $replace) . "\n";
  408. else {
  409. $fromThumb = "$baseDir/{$this->config['thumbsDir']}/$file";
  410. if (is_file($fromThumb) &&
  411. is_readable($fromThumb) &&
  412. is_writable($fromThumb)
  413. ) {
  414. $toThumb = "$baseDir/{$this->config['thumbsDir']}/{$this->post['dir']}";
  415. if (!is_dir($toThumb))
  416. helper::rmkdir($toThumb, $this->config['dirPerms']);
  417. $toThumb .= "/$base";
  418. @rename($fromThumb, $toThumb);
  419. }
  420. }
  421. }
  422. if (strlen($message)) die(substr($message, 0, -1));
  423. }
  424. protected function act_rm_cbd() {
  425. $baseDir = dirname($this->config['uploadDir']);
  426. if (!isset($this->post['files']) || !is_array($this->post['files']) ||
  427. !count($this->post['files'])
  428. )
  429. die($this->label("Unknown error."));
  430. $message = "";
  431. foreach($this->post['files'] as $file) {
  432. $path = "$baseDir/$file";
  433. $base = basename($file);
  434. $replace = array('file' => $base);
  435. if (!is_file($path))
  436. $message .= $this->label("The file '{file}' does not exist.", $replace) . "\n";
  437. elseif (!@unlink($path))
  438. $message .= $this->label("Cannot delete '{file}'.", $replace) . "\n";
  439. else {
  440. $thumb = "$baseDir/{$this->config['thumbsDir']}/$file";
  441. if (is_file($thumb)) @unlink($thumb);
  442. }
  443. }
  444. if (strlen($message)) die(substr($message, 0, -1));
  445. }
  446. protected function getIcon($file="", $res="big") {
  447. $ext = $this->getExtension($file);
  448. $icon = "themes/{$this->config['theme']}/img/files/$res/" .
  449. ($ext ? $ext : ".") . ".png";
  450. if (!file_exists($icon))
  451. $icon = dirname($icon) . "/..png";
  452. return $icon;
  453. }
  454. protected function outIcon($file="") {
  455. header("Content-Type: image/png");
  456. readfile($this->getIcon($file));
  457. }
  458. protected function getFullPath($dir) {
  459. return $this->config['uploadDir'] . (strlen($dir) ? "/$dir" : "");
  460. }
  461. protected function getFiles($dir) {
  462. $baseDir = dirname($this->config['uploadDir']);
  463. $r_dir = $dir;
  464. $dir = $this->getFullPath($dir);
  465. $workDir = getcwd();
  466. chdir($dir);
  467. $all = glob("*", GLOB_NOESCAPE);
  468. chdir($workDir);
  469. if ($all === false) return false;
  470. $files = array();
  471. foreach ($all as $i => $file) {
  472. $thumb = "$baseDir/{$this->config['thumbsDir']}/{$this->type}/" . (strlen($r_dir) ? "$r_dir/" : "") . $file;
  473. $full = "$dir/$file";
  474. if (!is_dir($full) &&
  475. (substr($file, 0, 1) != ".") &&
  476. is_readable($full)
  477. ) {
  478. $files[$file] = array(
  479. 'time' => filectime($full),
  480. 'size' => filesize($full),
  481. 'bigIcon' => $this->getIcon($file),
  482. 'smallIcon' => $this->getIcon($file, "small"),
  483. 'writable' => is_writable($full),
  484. 'hasThumb' => file_exists($thumb)
  485. );
  486. $files[$file]['thumb'] = (@getimagesize($full) !== false)
  487. ? ("browse.php?act=thumb&amp;image=" . urlencode("{$this->type}/" .
  488. (strlen($r_dir) ? "$r_dir/" : "") . $file))
  489. : "";
  490. }
  491. }
  492. return $files;
  493. }
  494. protected function getDirs($dir) {
  495. $dir = $this->getFullPath($dir);
  496. $workDir = getcwd();
  497. chdir($dir);
  498. $dirs = glob("*", GLOB_NOESCAPE | GLOB_ONLYDIR);
  499. chdir($workDir);
  500. if ($dirs === false) return false;
  501. foreach ($dirs as $i => $currentDir)
  502. if ((substr($currentDir, 0, 1) == ".") || !is_readable("$dir/$currentDir"))
  503. unset($dirs[$i]);
  504. elseif (is_writable("$dir/$currentDir"))
  505. $dirs[$i] .= "/";
  506. return array_values($dirs);
  507. }
  508. protected function getTree($dir, $path) {
  509. if (substr($dir, 0, 1) == "/") $dir = substr($dir, 1);
  510. if (!$this->checkDir($dir) || (false === ($dirs = $this->getDirs($dir))))
  511. return false;
  512. $tree = array();
  513. foreach ($dirs as $c_dir) {
  514. $r_dir = strlen($dir) ? "$dir/$c_dir" : $c_dir;
  515. if (substr($r_dir, -1) == "/") $r_dir = substr($r_dir, 0, -1);
  516. $dirIndex = ($r_dir == $path) ? "/$c_dir" : $c_dir;
  517. if ($r_dir == $path)
  518. $tree[$dirIndex] = $this->getTree($r_dir, $path);
  519. elseif ($r_dir == substr($path, 0, strlen($r_dir)))
  520. $tree[$dirIndex] = $this->getTree($r_dir, $path);
  521. else
  522. $tree[$dirIndex] = $this->checkDir($r_dir);
  523. }
  524. return $tree;
  525. }
  526. protected function checkDir($dir, $isExists=true) {
  527. $dir = helper::normalize_path($dir);
  528. if (substr($dir, 0, 1) == "/")
  529. $dir = substr($dir, 1);
  530. if(substr($dir, 0, 1) == ".")
  531. return false;
  532. if (!$isExists)
  533. return true;
  534. $dir = $this->getFullPath($dir);
  535. return (is_dir($dir) && is_readable($dir));
  536. }
  537. protected function template($template=null) {
  538. if ($template === null)
  539. $template = $this->action;
  540. if (file_exists("tpl/tpl_$template.php")) {
  541. foreach (array_keys($this->vars) as $key)
  542. eval("\$_$key = &\$this->vars['$key'];");
  543. ob_start();
  544. require "tpl/tpl_$template.php";
  545. return ob_get_clean();
  546. }
  547. return "";
  548. }
  549. protected function drawTree(array $tree, $path, $url="", $first=true) {
  550. ob_start();
  551. foreach ($tree as $dir => $dirs) {
  552. if (substr($dir, 0, 1) == "/") {
  553. $d_dir = substr($dir, 1);
  554. $folder = "current";
  555. } else {
  556. $d_dir = $dir;
  557. $folder = "regular";
  558. }
  559. if (substr($d_dir, -1) == "/")
  560. $d_dir = substr($d_dir, 0, -1);
  561. $expand = ($dirs === true) ? "closed" :
  562. (is_array($dirs) ? "opened" : "denied");
  563. $f_url = helper::html_value((strlen($url) ? "$url/" : "") . $d_dir);
  564. ?><div class="folder"><a href="kcdir:/<?php echo $f_url ?>" target="<?php echo (substr($dir, -1) == "/") ? ($first ? "first" : "writable") : "readonly" ?>"><span class="brace <?php echo $expand ?>">&nbsp;</span><span class="folder <?php echo $folder ?>"><?php echo $d_dir ?></span></a><?php
  565. if (is_array($dirs) && count($dirs)) {
  566. ?><div class="folders">
  567. <?php echo $this->drawTree($dirs, $path, $f_url, false) ?>
  568. </div><?php
  569. }
  570. ?></div><?php
  571. }
  572. return ob_get_clean();
  573. }
  574. protected function drawDirs($dir) {
  575. ob_start();
  576. $dirs = $this->getDirs($dir);
  577. foreach ($dirs as $c_dir) {
  578. $d_dir = (substr($c_dir, -1) == "/") ? substr($c_dir, 0, -1) : $c_dir;
  579. $s_dir = (strlen($dir) ? "$dir/" : "") . $d_dir;
  580. $url = "kcdir:/{$this->type}" . (strlen($dir) ? "/$dir" : "") . "/$d_dir";
  581. $folder_status = (@$this->session['dir'] == $s_dir) ? "current" : "regular";
  582. ?><div class="folder"><a style="display:block" href="<?php echo $url ?>" target="<?php echo ($c_dir != $d_dir) ? "writable" : "readonly" ?>"><span class="brace closed">&nbsp;</span><span class="folder <?php echo $folder_status ?>"><?php echo $d_dir ?></span></a></div><?php
  583. }
  584. return ob_get_clean();
  585. }
  586. protected function drawFiles($dir, array $files) {
  587. ob_start();
  588. $basePath = $this->config['uploadDir'] . "/$dir";
  589. $baseURL = $this->config['uploadURL'] . "/$dir";
  590. foreach ($files as $name => $file) {
  591. ?><div>
  592. <div class="name"><?php echo $name ?></div>
  593. <div class="time"><?php echo $file['time'] ?></div>
  594. <div class="size"><?php echo $file['size'] ?></div>
  595. <div class="date"><?php echo strftime($this->dateTimeSmall, $file['time']) ?></div>
  596. <div class="bigIcon"><?php echo $file['bigIcon'] ?></div>
  597. <div class="smallIcon"><?php echo $file['smallIcon'] ?></div>
  598. <div class="thumb"><?php echo $file['thumb'] ?></div>
  599. <div class="access"><?php echo $file['writable'] ? "writable" : "readonly" ?></div>
  600. <div class="hasThumb"><?php echo $file['hasThumb'] ? "yes" : "no" ?></div>
  601. </div><?php
  602. }
  603. return preg_replace('/\r?\n/s', "", ob_get_clean());
  604. }
  605. protected function backMsg($message) {
  606. $act = isset($this->get['act']) ? $this->get['act'] : "browser";
  607. echo $message."<br>";
  608. if (!method_exists($this, "act_$act"))
  609. $act = "browser";
  610. if ($act == "browser")
  611. parent::backMsg($message);
  612. else
  613. die($message);
  614. }
  615. }
  616. ?>