|
|
|
@ -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(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|