From f94af37bc6feb6fa27c1823b3fa18cc55a75f01d Mon Sep 17 00:00:00 2001 From: "Dmitry (dio) Levashov" Date: Thu, 14 Jul 2011 18:57:34 +0400 Subject: [PATCH] fixes #43 --- js/commands/edit.js | 3 +- js/commands/extract.js | 1 - js/elFinder.js | 2 +- php/elFinder.class.php | 51 +++++++++++++++++++++++++++--- php/elFinderVolumeDriver.class.php | 12 ++++++- 5 files changed, 60 insertions(+), 9 deletions(-) diff --git a/js/commands/edit.js b/js/commands/edit.js index 36eea6dd4..49e1528f4 100644 --- a/js/commands/edit.js +++ b/js/commands/edit.js @@ -122,7 +122,8 @@ elFinder.prototype.commands.edit = function() { fm.request({ data : {cmd : 'get', target : hash}, - notify : {type : 'openfile', cnt : 1} + notify : {type : 'openfile', cnt : 1}, + syncOnFail : true }) .done(function(data) { dialog(data.content); diff --git a/js/commands/extract.js b/js/commands/extract.js index 4f6639892..59701af78 100644 --- a/js/commands/extract.js +++ b/js/commands/extract.js @@ -62,7 +62,6 @@ elFinder.prototype.commands.extract = function() { syncOnFail : true }) .fail(function(error) { - fm.error(error); if (!dfrd.isRejected()) { dfrd.reject(error); } diff --git a/js/elFinder.js b/js/elFinder.js index 1e1484c6f..5190410e7 100644 --- a/js/elFinder.js +++ b/js/elFinder.js @@ -654,7 +654,7 @@ window.elFinder = function(node, opts) { * @return Boolean */ this.validResponse = function(cmd, data) { - return this.rules[this.rules[cmd] ? cmd : 'defaults'](data); + return data.error || this.rules[this.rules[cmd] ? cmd : 'defaults'](data); } /** diff --git a/php/elFinder.class.php b/php/elFinder.class.php index 00e57d0de..37c760af9 100644 --- a/php/elFinder.class.php +++ b/php/elFinder.class.php @@ -134,7 +134,6 @@ class elFinder { const ERROR_NOT_ARCHIVE = 36; const ERROR_ARCHIVE_TYPE = 37; - /** * Error messages * @@ -179,7 +178,6 @@ class elFinder { 35 => 'errArchive', 36 => 'errNoArchive', 37 => 'errArcType', - ); /** @@ -644,6 +642,10 @@ class elFinder { return array('error' => $this->error($error, self::ERROR_TRGDIR_NOT_FOUND, '#'.$target)); } + if ($volume->commandDisabled('mkdir')) { + return array('error' => $this->error($error, self::ERROR_ACCESS_DENIED)); + } + if (!$dir['read']) { return array('error' => $this->error($error, self::ERROR_PERM_DENIED)); } @@ -672,6 +674,10 @@ class elFinder { return array('error' => $this->error($error, self::ERROR_TRGDIR_NOT_FOUND, '#'.$target)); } + if ($volume->commandDisabled('mkfile')) { + return array('error' => $this->error($error, self::ERROR_ACCESS_DENIED)); + } + if (!$dir['read']) { return array('error' => $this->error($error, self::ERROR_PERM_DENIED)); } @@ -702,6 +708,10 @@ class elFinder { || ($rm = $volume->file($target)) == false) { return array('error' => $this->error(self::ERROR_RENAME, '#'.$target, self::ERROR_FILE_NOT_FOUND)); } + + if ($volume->commandDisabled('rename')) { + return array('error' => $this->error(self::ERROR_RENAME, $rm['name'], self::ERROR_ACCESS_DENIED)); + } if ($rm['name'] == $name) { return array(); @@ -740,6 +750,10 @@ class elFinder { break; } + if ($volume->commandDisabled('duplicate')) { + return array('error' => $this->error(self::ERROR_COPY, $src['name'], self::ERROR_ACCESS_DENIED)); + } + if (($file = $volume->duplicate($target)) == false) { $result['warning'] = $this->error(self::ERROR_COPY, $src['name'], $volume->error()); break; @@ -774,6 +788,10 @@ class elFinder { break; } + if ($volume->commandDisabled('rm')) { + return array('error' => $this->error(self::ERROR_RM, $file['name'], self::ERROR_ACCESS_DENIED)); + } + if (!$volume->rm($target)) { $result['warning'] = $this->error(self::ERROR_RM, $file['name'], $volume->error()); break; @@ -808,6 +826,10 @@ class elFinder { return array('error' => $this->error(self::ERROR_UPLOAD, $files['name'][0], self::ERROR_TRGDIR_NOT_FOUND, '#'.$target), 'header' => $header); } + if ($volume->commandDisabled('upload')) { + return array('error' => $this->error(self::ERROR_UPLOAD, $files['name'][0], self::ERROR_ACCESS_DENIED)); + } + foreach ($files['name'] as $i => $name) { $tmpPath = $files['tmp_name'][$i]; @@ -861,6 +883,10 @@ class elFinder { return array('error' => $this->error($error, '#'.$targets[0], self::ERROR_TRGDIR_NOT_FOUND, '#'.$dst)); } + if ($dstVolume->commandDisabled('paste')) { + return array('error' => $this->error($error, '#'.$targets[0], self::ERROR_ACCESS_DENIED)); + } + if (!$dstDir['write']) { return array('error' => $this->error($error, '#'.$targets[0], self::ERROR_PERM_DENIED)); } @@ -922,12 +948,12 @@ class elFinder { $target = $args['target']; $volume = $this->volume($target); - if (!$volume) { + if (!$volume || ($file = $volume->file($target)) == false) { return array('error' => $this->error(self::ERROR_OPEN, '#'.$target, self::ERROR_FILE_NOT_FOUND)); } return ($content = $volume->getContents($target)) === false - ? array('error' => $this->error(self::ERROR_OPEN, '#'.$target, $volume->error())) + ? array('error' => $this->error(self::ERROR_OPEN, $file['name'], $volume->error())) : array('content' => $content); } @@ -945,6 +971,11 @@ class elFinder { || ($file = $volume->file($target)) == false) { return array('error' => $this->error($error, self::ERROR_FILE_NOT_FOUND)); } + $error[1] = $file['name']; + + if ($volume->commandDisabled('edit')) { + return array('error' => $this->error($error, self::ERROR_ACCESS_DENIED)); + } if (($file = $volume->putContents($target, $args['content'])) == false) { return array('error' => $this->error($error, $volume->error())); @@ -974,8 +1005,14 @@ class elFinder { return array('error' => $this->error($error, self::ERROR_FILE_NOT_FOUND)); } + $error[1] = $file['name']; + + if ($volume->commandDisabled('extract')) { + return array('error' => $this->error($error, self::ERROR_ACCESS_DENIED)); + } + if (($added = $volume->extract($target)) === false) { - return array('error' => $this->error(self::ERROR_EXTRACT, $file['name'], $volume->error())); + return array('error' => $this->error($error, $volume->error())); } return $this->trigger('extract', $volume, array('added' => $added)); @@ -999,6 +1036,10 @@ class elFinder { return $this->error(self::ERROR_ARCHIVE, self::ERROR_TRGDIR_NOT_FOUND); } + if ($volume->commandDisabled('archive')) { + return array('error' => $this->error(self::ERROR_ARCHIVE, self::ERROR_ACCESS_DENIED)); + } + if (($archive = $volume->archive($targets, $args['type'])) == false) { return $this->error(self::ERROR_ARCHIVE, $volume->error()); } diff --git a/php/elFinderVolumeDriver.class.php b/php/elFinderVolumeDriver.class.php index 35da129a7..211715564 100644 --- a/php/elFinderVolumeDriver.class.php +++ b/php/elFinderVolumeDriver.class.php @@ -817,7 +817,7 @@ abstract class elFinderVolumeDriver { 'path' => $this->path($hash), 'url' => $this->URL, 'tmbUrl' => $this->tmbURL, - 'disabled' => $this->disabled, + 'disabled' => array(), //$this->disabled, 'separator' => $this->separator, 'copyOverwrite' => intval($this->options['copyOverwrite']), 'archivers' => array( @@ -827,6 +827,16 @@ abstract class elFinderVolumeDriver { ); } + /** + * undocumented function + * + * @return void + * @author Dmitry Levashov + **/ + public function commandDisabled($cmd) { + return in_array($cmd, $this->disabled); + } + /** * Return true if mime is required mimes list *