parent
							
								
									bf3a2885a2
								
							
						
					
					
						commit
						0542f29451
					
				@ -1,42 +0,0 @@ | 
				
			||||
<?php | 
				
			||||
/* For licensing terms, see /license.txt */ | 
				
			||||
 | 
				
			||||
use Chamilo\CoreBundle\Component\Editor\Connector; | 
				
			||||
use Chamilo\CoreBundle\Component\Editor\Finder; | 
				
			||||
 | 
				
			||||
require_once __DIR__.'/../../global.inc.php'; | 
				
			||||
 | 
				
			||||
error_reporting(-1); | 
				
			||||
 | 
				
			||||
/** @var Connector $connector */ | 
				
			||||
$connector = new Connector(); | 
				
			||||
 | 
				
			||||
// Check driver list in configuration | 
				
			||||
$driverList = api_get_configuration_value('editor_driver_list'); | 
				
			||||
if (empty($driverList)) { | 
				
			||||
    $driverList = [ | 
				
			||||
        'PersonalDriver', | 
				
			||||
        'CourseDriver', | 
				
			||||
        //'CourseUserDriver', | 
				
			||||
        //'HomeDriver' | 
				
			||||
    ]; | 
				
			||||
    $block = api_get_configuration_value('block_editor_file_manager_for_students'); | 
				
			||||
    $newDriverList = []; | 
				
			||||
    if ($block && !api_is_allowed_to_edit()) { | 
				
			||||
        foreach ($driverList as $driver) { | 
				
			||||
            if ('CourseDriver' === $driver) { | 
				
			||||
                continue; | 
				
			||||
            } | 
				
			||||
            $newDriverList[] = $driver; | 
				
			||||
        } | 
				
			||||
        $driverList = $newDriverList; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
 | 
				
			||||
$connector->setDriverList($driverList); | 
				
			||||
$operations = $connector->getOperations(); | 
				
			||||
 | 
				
			||||
// Run elFinder | 
				
			||||
$finder = new Finder($operations); | 
				
			||||
$elFinderConnector = new \elFinderConnector($finder); | 
				
			||||
$elFinderConnector->run(); | 
				
			||||
@ -1,358 +0,0 @@ | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
declare(strict_types=1); | 
				
			||||
 | 
				
			||||
/* For licensing terms, see /license.txt */ | 
				
			||||
 | 
				
			||||
namespace Chamilo\CoreBundle\Component\Editor; | 
				
			||||
 | 
				
			||||
use Chamilo\CoreBundle\Component\Editor\Driver\Driver; | 
				
			||||
use Chamilo\CoreBundle\Entity\Course; | 
				
			||||
use Chamilo\CoreBundle\Entity\Session; | 
				
			||||
use Chamilo\CoreBundle\Entity\User; | 
				
			||||
use Doctrine\ORM\EntityManager; | 
				
			||||
use Symfony\Component\Routing\Router; | 
				
			||||
use Symfony\Component\Routing\RouterInterface; | 
				
			||||
use Symfony\Component\Translation\Translator; | 
				
			||||
use Symfony\Contracts\Translation\TranslatorInterface; | 
				
			||||
 | 
				
			||||
//use Symfony\Component\Security\Core\SecurityContext; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * Class elFinder Connector - editor + Chamilo repository. | 
				
			||||
 */ | 
				
			||||
class Connector | 
				
			||||
{ | 
				
			||||
    public Course $course; | 
				
			||||
 | 
				
			||||
    public User $user; | 
				
			||||
 | 
				
			||||
    public Session $session; | 
				
			||||
 | 
				
			||||
    public Translator $translator; | 
				
			||||
 | 
				
			||||
    public Router $urlGenerator; | 
				
			||||
 | 
				
			||||
    //public $security; | 
				
			||||
 | 
				
			||||
    public array $paths; | 
				
			||||
 | 
				
			||||
    public EntityManager $entityManager; | 
				
			||||
 | 
				
			||||
    public array $drivers = []; | 
				
			||||
    public array $driverList = []; | 
				
			||||
 | 
				
			||||
    public function __construct( | 
				
			||||
        EntityManager $entityManager, | 
				
			||||
        array $paths, | 
				
			||||
        RouterInterface $urlGenerator, | 
				
			||||
        TranslatorInterface $translator, | 
				
			||||
        $user, | 
				
			||||
        $course, | 
				
			||||
        $session | 
				
			||||
    ) { | 
				
			||||
        $this->paths = [ | 
				
			||||
            //'root_sys' => api_get_path(SYS_PATH), | 
				
			||||
            //'sys_root' => api_get_path(SYS_PATH), // just an alias | 
				
			||||
            //'sys_course_path' => api_get_path(SYS_COURSE_PATH), | 
				
			||||
            //   'sys_config_path' => $app['path.config'], | 
				
			||||
            'path.temp' => api_get_path(SYS_ARCHIVE_PATH), | 
				
			||||
            //'sys_log_path' => $app['path.logs'] | 
				
			||||
        ]; | 
				
			||||
        $this->entityManager = $entityManager; | 
				
			||||
        //$this->paths = $paths; | 
				
			||||
        $this->urlGenerator = $urlGenerator; | 
				
			||||
        $this->translator = $translator; | 
				
			||||
        //$this->security = $security; | 
				
			||||
        $this->user = $user; | 
				
			||||
        $this->course = $course; | 
				
			||||
        $this->session = $session; | 
				
			||||
        $this->driverList = $this->getDefaultDriverList(); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    public function getDriverList(): array | 
				
			||||
    { | 
				
			||||
        return $this->driverList; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Available driver list. | 
				
			||||
     * | 
				
			||||
     * @param array $list | 
				
			||||
     */ | 
				
			||||
    public function setDriverList($list): void | 
				
			||||
    { | 
				
			||||
        $this->driverList = $list; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @param Driver $driver | 
				
			||||
     */ | 
				
			||||
    public function addDriver($driver): void | 
				
			||||
    { | 
				
			||||
        if (!empty($driver)) { | 
				
			||||
            $this->drivers[$driver->getName()] = $driver; | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    public function getDrivers(): array | 
				
			||||
    { | 
				
			||||
        return $this->drivers; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @param string $driverName | 
				
			||||
     * | 
				
			||||
     * @return Driver | 
				
			||||
     */ | 
				
			||||
    public function getDriver($driverName) | 
				
			||||
    { | 
				
			||||
        if (isset($this->drivers[$driverName])) { | 
				
			||||
            return $this->drivers[$driverName]; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        return null; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @param bool $processDefaultValues | 
				
			||||
     * | 
				
			||||
     * @return array | 
				
			||||
     */ | 
				
			||||
    public function getRoots($processDefaultValues = true) | 
				
			||||
    { | 
				
			||||
        $roots = []; | 
				
			||||
        $drivers = $this->getDrivers(); | 
				
			||||
        /** @var Driver $driver */ | 
				
			||||
        foreach ($drivers as $driver) { | 
				
			||||
            if ($processDefaultValues) { | 
				
			||||
                $plugin = [ | 
				
			||||
                    'chamilo' => [ | 
				
			||||
                        'driverName' => $driver->getName(), | 
				
			||||
                        'connector' => $this, | 
				
			||||
                    ], | 
				
			||||
                ]; | 
				
			||||
                $configuration = $driver->getConfiguration(); | 
				
			||||
                $driver->setup(); | 
				
			||||
                $configuration['plugin'] = $plugin; | 
				
			||||
                $root = $this->updateWithDefaultValues($configuration); | 
				
			||||
            } | 
				
			||||
            $roots[] = $root; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        return $roots; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Merges the default driver settings. | 
				
			||||
     * | 
				
			||||
     * @param array $driver | 
				
			||||
     * | 
				
			||||
     * @return array | 
				
			||||
     */ | 
				
			||||
    public function updateWithDefaultValues($driver) | 
				
			||||
    { | 
				
			||||
        if (empty($driver) || !isset($driver['driver'])) { | 
				
			||||
            return []; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        $defaultDriver = $this->getDefaultDriverSettings(); | 
				
			||||
 | 
				
			||||
        if (isset($driver['attributes'])) { | 
				
			||||
            $attributes = array_merge($defaultDriver['attributes'], $driver['attributes']); | 
				
			||||
        } else { | 
				
			||||
            $attributes = $defaultDriver['attributes']; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        $driverUpdated = array_merge($defaultDriver, $driver); | 
				
			||||
        $driverUpdated['driver'] = 'Chamilo\CoreBundle\Component\Editor\Driver\\'.$driver['driver']; | 
				
			||||
        $driverUpdated['attributes'] = $attributes; | 
				
			||||
 | 
				
			||||
        return $driverUpdated; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Get default driver settings. | 
				
			||||
     */ | 
				
			||||
    public function getDefaultDriverSettings(): array | 
				
			||||
    { | 
				
			||||
        // for more options: https://github.com/Studio-42/elFinder/wiki/Connector-configuration-options | 
				
			||||
        return [ | 
				
			||||
            'uploadOverwrite' => false, | 
				
			||||
            // Replace files on upload or give them new name if the same file was uploaded | 
				
			||||
            //'acceptedName' => | 
				
			||||
            'uploadAllow' => [ | 
				
			||||
                'image', | 
				
			||||
                'audio', | 
				
			||||
                'video', | 
				
			||||
                'text/html', | 
				
			||||
                'text/csv', | 
				
			||||
                'application/pdf', | 
				
			||||
                'application/postscript', | 
				
			||||
                'application/vnd.ms-word', | 
				
			||||
                'application/vnd.ms-excel', | 
				
			||||
                'application/vnd.ms-powerpoint', | 
				
			||||
                'application/pdf', | 
				
			||||
                'application/xml', | 
				
			||||
                'application/vnd.oasis.opendocument.text', | 
				
			||||
                'application/x-shockwave-flash', | 
				
			||||
                'application/vnd.adobe.flash.movie', | 
				
			||||
            ], | 
				
			||||
            // allow files | 
				
			||||
            //'uploadDeny' => array('text/x-php'), | 
				
			||||
            'uploadOrder' => ['allow'], | 
				
			||||
            // only executes allow | 
				
			||||
            'disabled' => [ | 
				
			||||
                'duplicate', | 
				
			||||
                'rename', | 
				
			||||
                'mkdir', | 
				
			||||
                'mkfile', | 
				
			||||
                'copy', | 
				
			||||
                'cut', | 
				
			||||
                'paste', | 
				
			||||
                'edit', | 
				
			||||
                'extract', | 
				
			||||
                'archive', | 
				
			||||
                'help', | 
				
			||||
                'resize', | 
				
			||||
            ], | 
				
			||||
            'attributes' => [ | 
				
			||||
                // Hiding dangerous files | 
				
			||||
                [ | 
				
			||||
                    'pattern' => '/\.(php|py|pl|sh|xml)$/i', | 
				
			||||
                    'read' => false, | 
				
			||||
                    'write' => false, | 
				
			||||
                    'hidden' => true, | 
				
			||||
                    'locked' => false, | 
				
			||||
                ], | 
				
			||||
                // Hiding _DELETED_ files | 
				
			||||
                [ | 
				
			||||
                    'pattern' => '/_DELETED_/', | 
				
			||||
                    'read' => false, | 
				
			||||
                    'write' => false, | 
				
			||||
                    'hidden' => true, | 
				
			||||
                    'locked' => false, | 
				
			||||
                ], | 
				
			||||
                // Hiding thumbnails | 
				
			||||
                [ | 
				
			||||
                    'pattern' => '/.tmb/', | 
				
			||||
                    'read' => false, | 
				
			||||
                    'write' => false, | 
				
			||||
                    'hidden' => true, | 
				
			||||
                    'locked' => false, | 
				
			||||
                ], | 
				
			||||
                [ | 
				
			||||
                    'pattern' => '/.thumbs/', | 
				
			||||
                    'read' => false, | 
				
			||||
                    'write' => false, | 
				
			||||
                    'hidden' => true, | 
				
			||||
                    'locked' => false, | 
				
			||||
                ], | 
				
			||||
                [ | 
				
			||||
                    'pattern' => '/.quarantine/', | 
				
			||||
                    'read' => false, | 
				
			||||
                    'write' => false, | 
				
			||||
                    'hidden' => true, | 
				
			||||
                    'locked' => false, | 
				
			||||
                ], | 
				
			||||
            ], | 
				
			||||
        ]; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    public function getOperations(): array | 
				
			||||
    { | 
				
			||||
        //https://github.com/Studio-42/elFinder/wiki/Connector-configuration-options-2.1 | 
				
			||||
        $opts = [ | 
				
			||||
            //'debug' => true, | 
				
			||||
            'bind' => [ | 
				
			||||
                'upload rm mkdir' => [$this, 'manageCommands'], | 
				
			||||
            ], | 
				
			||||
            'sessionCloseEarlier' => false, | 
				
			||||
        ]; | 
				
			||||
 | 
				
			||||
        $this->setDrivers(); | 
				
			||||
        $opts['roots'] = $this->getRoots(); | 
				
			||||
 | 
				
			||||
        return $opts; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Set drivers from list. | 
				
			||||
     */ | 
				
			||||
    public function setDrivers(): void | 
				
			||||
    { | 
				
			||||
        foreach ($this->getDriverList() as $driverName) { | 
				
			||||
            $this->setDriver($driverName); | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Sets a driver. | 
				
			||||
     * | 
				
			||||
     * @param string $driverName | 
				
			||||
     */ | 
				
			||||
    public function setDriver($driverName): void | 
				
			||||
    { | 
				
			||||
        $driverClass = $this->getDriverClass($driverName); | 
				
			||||
 | 
				
			||||
        /** @var Driver $driver */ | 
				
			||||
        $driver = new $driverClass(); | 
				
			||||
        $driver->setName($driverName); | 
				
			||||
        $driver->setConnector($this); | 
				
			||||
        $this->addDriver($driver); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Simple function to demonstrate how to control file access using "accessControl" callback. | 
				
			||||
     * This method will disable accessing files/folders starting from  '.' (dot). | 
				
			||||
     * | 
				
			||||
     * @param string $attr   attribute name (read|write|locked|hidden) | 
				
			||||
     * @param string $path   file path relative to volume root directory started with directory separator | 
				
			||||
     * @param string $data | 
				
			||||
     * @param string $volume | 
				
			||||
     * | 
				
			||||
     * @return null|bool | 
				
			||||
     */ | 
				
			||||
    public function access($attr, $path, $data, $volume) | 
				
			||||
    { | 
				
			||||
        return 0 === strpos(basename($path), '.')       // if file/folder begins with '.' (dot) | 
				
			||||
            ? !('read' === $attr || 'write' === $attr)    // set read+write to false, other (locked+hidden) set to true | 
				
			||||
            : null; // else elFinder decide it itself | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @param string $cmd | 
				
			||||
     * @param array  $result | 
				
			||||
     * @param array  $args | 
				
			||||
     * @param Finder $elFinder | 
				
			||||
     */ | 
				
			||||
    public function manageCommands($cmd, $result, $args, $elFinder): void | 
				
			||||
    { | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Available driver list. | 
				
			||||
     * | 
				
			||||
     * @return array | 
				
			||||
     */ | 
				
			||||
    private function getDefaultDriverList() | 
				
			||||
    { | 
				
			||||
        return [ | 
				
			||||
            'CourseDriver', | 
				
			||||
            'CourseUserDriver', | 
				
			||||
            'DropBoxDriver', | 
				
			||||
            'HomeDriver', | 
				
			||||
            'PersonalDriver', | 
				
			||||
        ]; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @param string $driver | 
				
			||||
     * | 
				
			||||
     * @return string | 
				
			||||
     */ | 
				
			||||
    private function getDriverClass($driver) | 
				
			||||
    { | 
				
			||||
        return 'Chamilo\CoreBundle\Component\Editor\Driver\\'.$driver; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -1,105 +0,0 @@ | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
declare(strict_types=1); | 
				
			||||
 | 
				
			||||
/* For licensing terms, see /license.txt */ | 
				
			||||
 | 
				
			||||
namespace Chamilo\CoreBundle\Component\Editor\Driver; | 
				
			||||
 | 
				
			||||
use Chamilo\CoreBundle\Component\Editor\Connector; | 
				
			||||
use elFinder; | 
				
			||||
use elFinderVolumeLocalFileSystem; | 
				
			||||
 | 
				
			||||
class Driver extends elFinderVolumeLocalFileSystem | 
				
			||||
{ | 
				
			||||
    public string $name; | 
				
			||||
 | 
				
			||||
    public Connector $connector; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Gets driver name. | 
				
			||||
     * | 
				
			||||
     * @return string | 
				
			||||
     */ | 
				
			||||
    public function getName() | 
				
			||||
    { | 
				
			||||
        return $this->name; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Gets driver name. | 
				
			||||
     * | 
				
			||||
     * @param string $name | 
				
			||||
     */ | 
				
			||||
    public function setName($name): void | 
				
			||||
    { | 
				
			||||
        $this->name = $name; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    public function setConnector(Connector $connector): void | 
				
			||||
    { | 
				
			||||
        $this->connector = $connector; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @return array | 
				
			||||
     */ | 
				
			||||
    public function getAppPluginOptions() | 
				
			||||
    { | 
				
			||||
        return $this->getOptionsPlugin('chamilo'); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @return Connector | 
				
			||||
     */ | 
				
			||||
    public function setConnectorFromPlugin() | 
				
			||||
    { | 
				
			||||
        $options = $this->getAppPluginOptions(); | 
				
			||||
        $this->setConnector($options['connector']); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * This is a copy of rename function only to be used when uploading a file | 
				
			||||
     * {@inheritdoc} | 
				
			||||
     */ | 
				
			||||
    public function customRename($hash, $name) | 
				
			||||
    { | 
				
			||||
        if (!$this->nameAccepted($name)) { | 
				
			||||
            return $this->setError(elFinder::ERROR_INVALID_NAME, $name); | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        if (!($file = $this->file($hash))) { | 
				
			||||
            return $this->setError(elFinder::ERROR_FILE_NOT_FOUND); | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        if ($name === $file['name']) { | 
				
			||||
            return $file; | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        if (!empty($file['locked'])) { | 
				
			||||
            return $this->setError(elFinder::ERROR_LOCKED, $file['name']); | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        $path = $this->decode($hash); | 
				
			||||
        $dir = $this->dirnameCE($path); | 
				
			||||
        $stat = $this->stat($this->joinPathCE($dir, $name)); | 
				
			||||
 | 
				
			||||
        if ($stat) { | 
				
			||||
            return $this->setError(elFinder::ERROR_EXISTS, $name); | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        if (!$this->allowCreate($dir, $name, ('directory' === $file['mime']))) { | 
				
			||||
            return $this->setError(elFinder::ERROR_PERM_DENIED); | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        $this->rmTmb($file); // remove old name tmbs, we cannot do this after dir move | 
				
			||||
 | 
				
			||||
        if ($path = $this->convEncOut($this->_move($this->convEncIn($path), $this->convEncIn($dir), $this->convEncIn($name)))) { | 
				
			||||
            $this->clearcache(); | 
				
			||||
 | 
				
			||||
            return $this->stat($path); | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        return false; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -1,47 +0,0 @@ | 
				
			||||
<?php | 
				
			||||
 | 
				
			||||
declare(strict_types=1); | 
				
			||||
 | 
				
			||||
/* For licensing terms, see /license.txt */ | 
				
			||||
 | 
				
			||||
namespace Chamilo\CoreBundle\Component\Editor\Driver; | 
				
			||||
 | 
				
			||||
use Chamilo\CoreBundle\Component\Editor\Connector; | 
				
			||||
 | 
				
			||||
interface DriverInterface | 
				
			||||
{ | 
				
			||||
    public function setup(); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Gets driver name. | 
				
			||||
     * | 
				
			||||
     * @return string | 
				
			||||
     */ | 
				
			||||
    public function getName(); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Gets driver name. | 
				
			||||
     * | 
				
			||||
     * @param string $name | 
				
			||||
     */ | 
				
			||||
    public function setName($name); | 
				
			||||
 | 
				
			||||
    public function setConnector(Connector $connector); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @return array | 
				
			||||
     */ | 
				
			||||
    public function getAppPluginOptions(); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @return Connector | 
				
			||||
     */ | 
				
			||||
    public function setConnectorFromPlugin(); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * @return bool | 
				
			||||
     */ | 
				
			||||
    public function allow(); | 
				
			||||
 | 
				
			||||
    public function getConfiguration(); | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue