From ac8a66b240bcf92a9e83ec2f4c7e829747269a00 Mon Sep 17 00:00:00 2001 From: jmontoyaa Date: Thu, 9 Feb 2017 15:51:48 +0100 Subject: [PATCH] Update elfinder to latest version Important: requires composer update. --- composer.json | 2 +- .../javascript/editor/elfinder_standalone.tpl | 2 +- .../Component/Editor/Driver/CourseDriver.php | 2 +- .../Editor/Driver/PersonalDriver.php | 9 +- .../CoreBundle/Component/Editor/Finder.php | 314 ++++++++++++------ 5 files changed, 224 insertions(+), 105 deletions(-) diff --git a/composer.json b/composer.json index 3c87a8f6248..8261c6c62ca 100755 --- a/composer.json +++ b/composer.json @@ -78,7 +78,7 @@ "szymach/c-pchart": "1.*", "aferrandini/phpqrcode": "1.0.1", "mpdf/mpdf": "6.1.*", - "barryvdh/elfinder-builds": "2.1.0.3", + "studio-42/elfinder": "2.1.*", "jbroadway/urlify": "dev-master", "monolog/monolog": "~1.0", "ircmaxell/password-compat": "~1.0.4", diff --git a/main/template/default/javascript/editor/elfinder_standalone.tpl b/main/template/default/javascript/editor/elfinder_standalone.tpl index 0db05c67c5b..01d0f8aeff4 100644 --- a/main/template/default/javascript/editor/elfinder_standalone.tpl +++ b/main/template/default/javascript/editor/elfinder_standalone.tpl @@ -1,4 +1,4 @@ -{% set finderFolder = _p.web ~ 'vendor/barryvdh/elfinder-builds/' %} +{% set finderFolder = _p.web ~ 'vendor/studio-42/elfinder/' %} diff --git a/src/Chamilo/CoreBundle/Component/Editor/Driver/CourseDriver.php b/src/Chamilo/CoreBundle/Component/Editor/Driver/CourseDriver.php index bea28fe967c..e443b36bc90 100644 --- a/src/Chamilo/CoreBundle/Component/Editor/Driver/CourseDriver.php +++ b/src/Chamilo/CoreBundle/Component/Editor/Driver/CourseDriver.php @@ -219,7 +219,7 @@ public function getCourseDirectory() /** * {@inheritdoc} */ - public function upload($fp, $dst, $name, $tmpname) + public function upload($fp, $dst, $name, $tmpname, $hashes = array()) { $this->setConnectorFromPlugin(); diff --git a/src/Chamilo/CoreBundle/Component/Editor/Driver/PersonalDriver.php b/src/Chamilo/CoreBundle/Component/Editor/Driver/PersonalDriver.php index 823d6cc7f9a..e96c96503d4 100644 --- a/src/Chamilo/CoreBundle/Component/Editor/Driver/PersonalDriver.php +++ b/src/Chamilo/CoreBundle/Component/Editor/Driver/PersonalDriver.php @@ -20,7 +20,6 @@ public function setup() $userId = api_get_user_id(); $dir = \UserManager::getUserPathById($userId, 'system'); if (!empty($dir)) { - if (!is_dir($dir)) { mkdir($dir); } @@ -37,11 +36,9 @@ public function setup() public function getConfiguration() { if ($this->allow()) { - $userId = api_get_user_id(); if (!empty($userId)) { - // Adding user personal files $dir = \UserManager::getUserPathById($userId, 'system'); $dirWeb = \UserManager::getUserPathById($userId, 'web'); @@ -78,12 +75,10 @@ public function getConfiguration() /** * {@inheritdoc} */ - public function upload($fp, $dst, $name, $tmpname) + public function upload($fp, $dst, $name, $tmpname, $hashes = array()) { $this->setConnectorFromPlugin(); - if ($this->allow()) { - return parent::upload($fp, $dst, $name, $tmpname); } } @@ -96,7 +91,6 @@ public function rm($hash) $this->setConnectorFromPlugin(); if ($this->allow()) { - return parent::rm($hash); } } @@ -107,7 +101,6 @@ public function rm($hash) public function allow() { //if ($this->connector->security->isGranted('IS_AUTHENTICATED_FULLY')) { - return !api_is_anonymous(); } } diff --git a/src/Chamilo/CoreBundle/Component/Editor/Finder.php b/src/Chamilo/CoreBundle/Component/Editor/Finder.php index f803c8b9454..0c34f9a3185 100644 --- a/src/Chamilo/CoreBundle/Component/Editor/Finder.php +++ b/src/Chamilo/CoreBundle/Component/Editor/Finder.php @@ -3,7 +3,15 @@ namespace Chamilo\CoreBundle\Component\Editor; +use elFinder; +use elFinderSession; +use Exception; + /** + * + * Based in \elFinder this class only has a small change that allows use + * drivers with out adding elFinderVolume as class name. + * * Class Finder * * This class just modifies this line: @@ -14,100 +22,218 @@ */ class Finder extends \elFinder { - /** - * Constructor - * - * @param array elFinder and roots configurations - * @return void - * @author Dmitry (dio) Levashov - **/ - public function __construct($opts) - { - if (session_id() == '') { - session_start(); - } - - $this->time = $this->utime(); - $this->debug = (isset($opts['debug']) && $opts['debug'] ? true : false); - $this->timeout = (isset($opts['timeout']) ? $opts['timeout'] : 0); - $this->netVolumesSessionKey = !empty($opts['netVolumesSessionKey'])? $opts['netVolumesSessionKey'] : 'elFinderNetVolumes'; - $this->callbackWindowURL = (isset($opts['callbackWindowURL']) ? $opts['callbackWindowURL'] : ''); - - // setlocale and global locale regists to elFinder::locale - self::$locale = !empty($opts['locale']) ? $opts['locale'] : 'en_US.UTF-8'; - - if (false === @setlocale(LC_ALL, self::$locale)) { - self::$locale = setlocale(LC_ALL, ''); - } - - // bind events listeners - if (!empty($opts['bind']) && is_array($opts['bind'])) { - $_req = $_SERVER["REQUEST_METHOD"] == 'POST' ? $_POST : $_GET; - $_reqCmd = isset($_req['cmd']) ? $_req['cmd'] : ''; - foreach ($opts['bind'] as $cmd => $handlers) { - $doRegist = (strpos($cmd, '*') !== false); - if (! $doRegist) { - $_getcmd = create_function('$cmd', 'list($ret) = explode(\'.\', $cmd);return trim($ret);'); - $doRegist = ($_reqCmd && in_array($_reqCmd, array_map($_getcmd, explode(' ', $cmd)))); - } - if ($doRegist) { - if (! is_array($handlers) || is_object($handlers[0])) { - $handlers = array($handlers); - } - foreach($handlers as $handler) { - if ($handler) { - if (is_string($handler) && strpos($handler, '.')) { - list($_domain, $_name, $_method) = array_pad(explode('.', $handler), 3, ''); - if (strcasecmp($_domain, 'plugin') === 0) { - if ($plugin = $this->getPluginInstance($_name, isset($opts['plugin'][$_name])? $opts['plugin'][$_name] : array()) - and method_exists($plugin, $_method)) { - $this->bind($cmd, array($plugin, $_method)); - } - } - } else { - $this->bind($cmd, $handler); - } - } - } - } - } - } - - if (!isset($opts['roots']) || !is_array($opts['roots'])) { - $opts['roots'] = array(); - } - - // check for net volumes stored in session - foreach ($this->getNetVolumes() as $root) { - $opts['roots'][] = $root; - } - - // "mount" volumes - foreach ($opts['roots'] as $i => $o) { - //$class = 'elFinderVolume'.(isset($o['driver']) ? $o['driver'] : ''); - $class = isset($o['driver']) ? $o['driver'] : ''; - - if (class_exists($class)) { - $volume = new $class(); - - if ($volume->mount($o)) { - // unique volume id (ends on "_") - used as prefix to files hash - $id = $volume->id(); - - $this->volumes[$id] = $volume; - if (!$this->default && $volume->isReadable()) { - $this->default = $this->volumes[$id]; - } - } else { - $this->mountErrors[] = 'Driver "'.$class.'" : '.implode(' ', $volume->error()); - } - } else { - $this->mountErrors[] = 'Driver "'.$class.'" does not exists'; - } - } - - // if at least one readable volume - ii desu >_< - $this->loaded = !empty($this->default); + * Constructor + * + * @param array elFinder and roots configurations + * @author Dmitry (dio) Levashov + */ + public function __construct($opts) { + // set error handler of WARNING, NOTICE + $errLevel = E_WARNING | E_NOTICE | E_USER_WARNING | E_USER_NOTICE | E_STRICT | E_RECOVERABLE_ERROR; + if (defined('E_DEPRECATED')) { + $errLevel |= E_DEPRECATED | E_USER_DEPRECATED; + } + set_error_handler('elFinder::phpErrorHandler', $errLevel); + + // convert PATH_INFO to GET query + if (! empty($_SERVER['PATH_INFO'])) { + $_ps = explode('/', trim($_SERVER['PATH_INFO'], '/')); + if (! isset($_GET['cmd'])) { + $_cmd = $_ps[0]; + if (isset($this->commands[$_cmd])) { + $_GET['cmd'] = $_cmd; + $_i = 1; + foreach(array_keys($this->commands[$_cmd]) as $_k) { + if (isset($_ps[$_i])) { + if (! isset($_GET[$_k])) { + $_GET[$_k] = $_ps[$_i]; + } + } else { + break; + } + } + } + } + } + + // set elFinder instance + elFinder::$instance = $this; + + // setup debug mode + $this->debug = (isset($opts['debug']) && $opts['debug'] ? true : false); + if ($this->debug) { + error_reporting(defined('ELFINDER_DEBUG_ERRORLEVEL')? ELFINDER_DEBUG_ERRORLEVEL : -1); + ini_set('diaplay_errors', '1'); + } + + if (! interface_exists('elFinderSessionInterface')) { + include_once dirname(__FILE__).'/elFinderSessionInterface.php'; + } + + // session handler + if (!empty($opts['session']) && $opts['session'] instanceof elFinderSessionInterface) { + $this->session = $opts['session']; + } else { + $sessionOpts = array( + 'base64encode' => !empty($opts['base64encodeSessionData']), + 'keys' => array( + 'default' => !empty($opts['sessionCacheKey']) ? $opts['sessionCacheKey'] : 'elFinderCaches', + 'netvolume' => !empty($opts['netVolumesSessionKey'])? $opts['netVolumesSessionKey'] : 'elFinderNetVolumes' + ) + ); + if (! class_exists('elFinderSession')) { + include_once dirname(__FILE__) . '/elFinderSession.php'; + } + $this->session = new elFinderSession($sessionOpts); + } + // try session start | restart + $this->session->start(); + + $sessionUseCmds = array(); + if (isset($opts['sessionUseCmds']) && is_array($opts['sessionUseCmds'])) { + $sessionUseCmds = $opts['sessionUseCmds']; + } + + // set self::$volumesCnt by HTTP header "X-elFinder-VolumesCntStart" + if (isset($_SERVER['HTTP_X_ELFINDER_VOLUMESCNTSTART']) && ($volumesCntStart = intval($_SERVER['HTTP_X_ELFINDER_VOLUMESCNTSTART']))) { + self::$volumesCnt = $volumesCntStart; + } + + $this->time = $this->utime(); + $this->sessionCloseEarlier = isset($opts['sessionCloseEarlier'])? (bool)$opts['sessionCloseEarlier'] : true; + $this->sessionUseCmds = array_flip($sessionUseCmds); + $this->timeout = (isset($opts['timeout']) ? $opts['timeout'] : 0); + $this->uploadTempPath = (isset($opts['uploadTempPath']) ? $opts['uploadTempPath'] : ''); + $this->callbackWindowURL = (isset($opts['callbackWindowURL']) ? $opts['callbackWindowURL'] : ''); + $this->maxTargets = (isset($opts['maxTargets']) ? intval($opts['maxTargets']) : $this->maxTargets); + elFinder::$commonTempPath = (isset($opts['commonTempPath']) ? $opts['commonTempPath'] : './.tmp'); + if (!is_writable(elFinder::$commonTempPath)) { + elFinder::$commonTempPath = sys_get_temp_dir(); + if (!is_writable(elFinder::$commonTempPath)) { + elFinder::$commonTempPath = ''; + } + } + $this->maxArcFilesSize = isset($opts['maxArcFilesSize'])? intval($opts['maxArcFilesSize']) : 0; + $this->optionsNetVolumes = (isset($opts['optionsNetVolumes']) && is_array($opts['optionsNetVolumes']))? $opts['optionsNetVolumes'] : array(); + if (isset($opts['itemLockExpire'])) { + $this->itemLockExpire = intval($opts['itemLockExpire']); + } + + // deprecated settings + $this->netVolumesSessionKey = !empty($opts['netVolumesSessionKey'])? $opts['netVolumesSessionKey'] : 'elFinderNetVolumes'; + self::$sessionCacheKey = !empty($opts['sessionCacheKey']) ? $opts['sessionCacheKey'] : 'elFinderCaches'; + + // check session cache + $_optsMD5 = md5(json_encode($opts['roots'])); + if ($this->session->get('_optsMD5') !== $_optsMD5) { + $this->session->set('_optsMD5', $_optsMD5); + } + + // setlocale and global locale regists to elFinder::locale + self::$locale = !empty($opts['locale']) ? $opts['locale'] : 'en_US.UTF-8'; + if (false === setlocale(LC_ALL, self::$locale)) { + self::$locale = setlocale(LC_ALL, ''); + } + + // set defaultMimefile + elFinder::$defaultMimefile = (isset($opts['defaultMimefile']) ? $opts['defaultMimefile'] : ''); + + // bind events listeners + if (!empty($opts['bind']) && is_array($opts['bind'])) { + $_req = $_SERVER["REQUEST_METHOD"] == 'POST' ? $_POST : $_GET; + $_reqCmd = isset($_req['cmd']) ? $_req['cmd'] : ''; + foreach ($opts['bind'] as $cmd => $handlers) { + $doRegist = (strpos($cmd, '*') !== false); + if (! $doRegist) { + $_getcmd = create_function('$cmd', 'list($ret) = explode(\'.\', $cmd);return trim($ret);'); + $doRegist = ($_reqCmd && in_array($_reqCmd, array_map($_getcmd, explode(' ', $cmd)))); + } + if ($doRegist) { + // for backward compatibility + if (! is_array($handlers)) { + $handlers = array($handlers); + } else { + if (count($handlers) === 2 && is_object($handlers[0])) { + $handlers = array($handlers); + } + } + foreach($handlers as $handler) { + if ($handler) { + if (is_string($handler) && strpos($handler, '.')) { + list($_domain, $_name, $_method) = array_pad(explode('.', $handler), 3, ''); + if (strcasecmp($_domain, 'plugin') === 0) { + if ($plugin = $this->getPluginInstance($_name, isset($opts['plugin'][$_name])? $opts['plugin'][$_name] : array()) + and method_exists($plugin, $_method)) { + $this->bind($cmd, array($plugin, $_method)); + } + } + } else { + $this->bind($cmd, $handler); + } + } + } + } + } + } + + if (!isset($opts['roots']) || !is_array($opts['roots'])) { + $opts['roots'] = array(); + } + + // check for net volumes stored in session + $netVolumes = $this->getNetVolumes(); + foreach ($netVolumes as $key => $root) { + if (! isset($root['id'])) { + // given fixed unique id + if (! $root['id'] = $this->getNetVolumeUniqueId($netVolumes)) { + $this->mountErrors[] = 'Netmount Driver "'.$root['driver'].'" : Could\'t given volume id.'; + continue; + } + } + $opts['roots'][$key] = $root; + } + + // "mount" volumes + foreach ($opts['roots'] as $i => $o) { + //$class = 'elFinderVolume'.(isset($o['driver']) ? $o['driver'] : ''); + // Chamilo change + $class = (isset($o['driver']) ? $o['driver'] : ''); + + if (class_exists($class)) { + $volume = new $class(); + + try { + if ($this->maxArcFilesSize && (empty($o['maxArcFilesSize']) || $this->maxArcFilesSize < $o['maxArcFilesSize'])) { + $o['maxArcFilesSize'] = $this->maxArcFilesSize; + } + // pass session handler + $volume->setSession($this->session); + if ($volume->mount($o)) { + // unique volume id (ends on "_") - used as prefix to files hash + $id = $volume->id(); + + $this->volumes[$id] = $volume; + if ((!$this->default || $volume->root() !== $volume->defaultPath()) && $volume->isReadable()) { + $this->default = $this->volumes[$id]; + } + } else { + $this->removeNetVolume($i, $volume); + $this->mountErrors[] = 'Driver "'.$class.'" : '.implode(' ', $volume->error()); + } + } catch (Exception $e) { + $this->removeNetVolume($i, $volume); + $this->mountErrors[] = 'Driver "'.$class.'" : '.$e->getMessage(); + } + } else { + $this->mountErrors[] = 'Driver "'.$class.'" does not exist'; + } + } + + // if at least one readable volume - ii desu >_< + $this->loaded = !empty($this->default); + + // restore error handler for now + restore_error_handler(); } }