Browse Source

Update elfinder to latest version Important: requires composer update.

jmontoyaa 8 years ago
parent
commit
ac8a66b240

+ 1 - 1
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",

+ 1 - 1
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/' %}
 <!-- elFinder CSS (REQUIRED) -->
 <link rel="stylesheet" type="text/css" media="screen" href="{{ finderFolder }}css/elfinder.full.css">
 <link rel="stylesheet" type="text/css" media="screen" href="{{ finderFolder }}css/theme.css">

+ 1 - 1
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();
 

+ 1 - 8
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();
     }
 }

+ 220 - 94
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();
     }
 }