<?php
namespace BitApps\FM\Providers\FileManager;
use BitApps\FM\Config;
use BitApps\WPKit\Hooks\Hooks;
\defined('ABSPATH') || exit();
class Options
{
/**
* Set locale. Currently only UTF-8 locales are supported. Passed to setLocale PHP function.
*
* Warning: Setting the locale correctly is very important.
* Especially if you do not match the character encoding to that of the server file system,
* it will create a security vulnerability.
*
* Default value: 'en_US.UTF-8'
*
* @var string
*/
private $_locale;
/*
* elFinderVolumeDriver mime.type file path as defaults.
* This can be overridden in each of the volume by setting the volume root mimefile.
* The default value '' meaning uses a file 'php/mime.type'.
*/
private $_defaultMimefile;
/**
* Session handling wrapper class object.
* It must be implement elFinderSessionInterface.
*
* @var elFinderSessionInterface
*/
private $_session;
/**
* Set sessionCacheKey. PHP $_SESSION array key of elFinder caches.
*
* Default value: 'elFinderCaches'
*
* @var string
*/
private $_sessionCacheKey;
/**
* Finder save session data as UTF-8.
* If the session storage mechanism of the system does not allow UTF-8, and it must be set true.
*
* Default value: false
*
* @var string
* */
private $_base64encodeSessionData;
/**
* Temp directory path for Upload. Default uses sys_get_temp_dir()
*
* @var string
*/
private $_uploadTempPath;
/*
* Temp directory path for temporally working files. Default uses ./.tmp if it writable.
*
* Default value: './.tmp' or sys_get_temp_dir()
*/
private $_commonTempPath;
/**
* Connection flag files path that connection check of current request.
* A file is created every time an access is made to this location and it is deleted at the end of the request.
* It is recommended to specify RAM disk such as "/dev/shm".
*
* Default value: commonTempPath or ''
*
* @var string
*/
private $_connectionFlagsPath;
/**
* Max allowed archive files size (0 - no limit)
* Default value: 0
*
* @var int
*/
private $_maxArcFilesSize;
/**
* Root options of the network mounting volume
* Default value: array()
* Example:
* 'optionsNetVolumes' => array(
* // key '*' is common additional volume root options
* '*' => array(),
* // key of elFinder::$netDrivers is each protocol volumes
* 'ftp' => array()
* )
*
* @var array
*/
private $_optionsNetVolumes;
/**
* Max number of limits of selectable items (0 - no limit)
*
* Default value: 1000
*
* @var int
*/
private $_maxTargets;
/*
* Throw Error on exec()
* true need try{} block for $connector->run();
*
* Default value: false
*/
private $_throwErrorOnExec;
/**
* Send debug to client.
*
* Default value: false
*
* @var bool
*/
private $_debug;
/**
* Bind callbacks for user actions
*
* @see https://github.com/Studio-42/elFinder/wiki/Connector-configuration-options-2.1#bind
*
* @var array<string, callable>
*/
private $_bind;
/**
* Finder volume roots
*
* @var array<int, FileRoot>
*/
private $_roots;
/**
* Constructs Finder
*
* @param mixed $debug
*/
public function __construct($debug = false)
{
$this->_debug = $debug;
}
/**
* Sets bind for command actions
*
* @param string $commandType
* @param callable $callback
*
* @return Options
*/
public function setBind($commandType, callable $callback)
{
$this->_bind[$commandType] = $callback;
return $this;
}
/**
* Sets debug option
*
* @param $debug bool
*
* @return Options
*/
public function setDebug($debug)
{
$this->_debug = $debug;
return $this;
}
public function setRoot(FileRoot $root)
{
$this->_roots[] = $root;
return $this;
}
public function getRoots()
{
$roots = [];
if (isset($this->_roots)) {
foreach ($this->_roots as $root) {
$roots[] = $root->getOptions();
}
}
return $roots;
}
public function getOptions()
{
$options = [];
if (isset($this->_locale)) {
$options['locale'] = $this->_locale;
}
if (isset($this->_defaultMimefile)) {
$options['defaultMimefile'] = $this->_defaultMimefile;
}
if (isset($this->_session)) {
$options['session'] = $this->_session;
}
if (isset($this->_sessionCacheKey)) {
$options['sessionCacheKey'] = $this->_sessionCacheKey;
}
if (isset($this->_base64encodeSessionData)) {
$options['base64encodeSessionData'] = $this->_base64encodeSessionData;
}
if (isset($this->_uploadTempPath)) {
$options['uploadTempPath'] = $this->_uploadTempPath;
}
if (isset($this->_commonTempPath)) {
$options['commonTempPath'] = $this->_commonTempPath;
}
if (isset($this->_connectionFlagsPath)) {
$options['connectionFlagsPath'] = $this->_connectionFlagsPath;
}
if (isset($this->_maxArcFilesSize)) {
$options['maxArcFilesSize'] = $this->_maxArcFilesSize;
}
if (isset($this->_optionsNetVolumes)) {
$options['optionsNetVolumes'] = $this->_optionsNetVolumes;
}
if (isset($this->_maxTargets)) {
$options['maxTargets'] = $this->_maxTargets;
}
if (isset($this->_throwErrorOnExec)) {
$options['throwErrorOnExec'] = $this->_throwErrorOnExec;
}
if (isset($this->_debug)) {
$options['debug'] = $this->_debug;
}
if (isset($this->_bind)) {
$options['bind'] = $this->_bind;
}
$options['roots'] = Hooks::applyFilter(Config::withPrefix('filter_volumes'), $this->getRoots());
$filteredOptions = Hooks::applyFilter('fm_options_filter', $options);
$filteredOptions = Hooks::applyFilter(Config::withPrefix('filter_options'), $filteredOptions);
if (!empty($filteredOptions['roots'])) {
$options = $filteredOptions;
}
return $options;
}
}