diff --git a/composer.json b/composer.json
index 3c87a8f624..8261c6c62c 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 0db05c67c5..01d0f8aeff 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 bea28fe967..e443b36bc9 100644
--- a/src/Chamilo/CoreBundle/Component/Editor/Driver/CourseDriver.php
+++ b/src/Chamilo/CoreBundle/Component/Editor/Driver/CourseDriver.php
@@ -219,7 +219,7 @@ class CourseDriver extends Driver implements DriverInterface
/**
* {@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 823d6cc7f9..e96c96503d 100644
--- a/src/Chamilo/CoreBundle/Component/Editor/Driver/PersonalDriver.php
+++ b/src/Chamilo/CoreBundle/Component/Editor/Driver/PersonalDriver.php
@@ -20,7 +20,6 @@ class PersonalDriver extends Driver implements DriverInterface
$userId = api_get_user_id();
$dir = \UserManager::getUserPathById($userId, 'system');
if (!empty($dir)) {
-
if (!is_dir($dir)) {
mkdir($dir);
}
@@ -37,11 +36,9 @@ class PersonalDriver extends Driver implements DriverInterface
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 @@ class PersonalDriver extends Driver implements DriverInterface
/**
* {@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 @@ class PersonalDriver extends Driver implements DriverInterface
$this->setConnectorFromPlugin();
if ($this->allow()) {
-
return parent::rm($hash);
}
}
@@ -107,7 +101,6 @@ class PersonalDriver extends Driver implements DriverInterface
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 f803c8b945..0c34f9a318 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 @@ namespace Chamilo\CoreBundle\Component\Editor;
*/
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();
}
}