400 lines
9.3 KiB
PHP
400 lines
9.3 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @copyright Copyright (c) 2009-2022 Ryan Demmer. All rights reserved
|
|
* @license GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
|
|
* JCE is free software. This version may have been modified pursuant
|
|
* to the GNU General Public License, and as distributed it includes or
|
|
* is derivative of works licensed under the GNU General Public License or
|
|
* other free or open source software licenses
|
|
*/
|
|
defined('JPATH_PLATFORM') or die;
|
|
|
|
class WFFileSystem extends WFExtension
|
|
{
|
|
/**
|
|
* Constructor activating the default information of the class.
|
|
*/
|
|
public function __construct($config = array())
|
|
{
|
|
parent::__construct($config);
|
|
|
|
$this->setProperties(array_merge($config, array(
|
|
'local' => true,
|
|
)));
|
|
|
|
// get path variable properties
|
|
$vars = $this->getPathVariables();
|
|
|
|
// assign to instance
|
|
$this->setProperties($vars);
|
|
}
|
|
|
|
/**
|
|
* Returns a reference to a plugin object.
|
|
*
|
|
* This method must be invoked as:
|
|
* <pre> $advlink =AdvLink::getInstance();</pre>
|
|
*
|
|
* @return JCE The editor object
|
|
*
|
|
* @since 1.5
|
|
*/
|
|
public static function getInstance($type = 'joomla', $config = array())
|
|
{
|
|
static $instances = array();
|
|
|
|
$signature = md5($type . serialize($config));
|
|
|
|
if (!isset($instances[$signature])) {
|
|
$fs = parent::loadExtensions('filesystem', $type);
|
|
|
|
// load the default...
|
|
if (empty($fs)) {
|
|
$fs = parent::loadExtensions('filesystem', 'joomla');
|
|
}
|
|
|
|
// get the first filesystem extension only
|
|
if (is_array($fs)) {
|
|
$fs = array_shift($fs);
|
|
}
|
|
|
|
$classname = 'WF' . ucfirst($fs->name) . 'FileSystem';
|
|
|
|
if (class_exists($classname)) {
|
|
$instances[$signature] = new $classname($config);
|
|
} else {
|
|
$instances[$signature] = new self($config);
|
|
}
|
|
}
|
|
|
|
return $instances[$signature];
|
|
}
|
|
|
|
public function updateOptions(&$options)
|
|
{
|
|
$options['dir'] = $this->getRootDir();
|
|
}
|
|
|
|
/**
|
|
* Get the base directory.
|
|
*
|
|
* @return string base dir
|
|
*/
|
|
public function getBaseDir()
|
|
{
|
|
return WFUtility::makePath(JPATH_SITE, $this->getRootDir());
|
|
}
|
|
|
|
/**
|
|
* Get the full base url.
|
|
*
|
|
* @return string base url
|
|
*/
|
|
public function getBaseURL()
|
|
{
|
|
return WFUtility::makePath(JURI::root(true), $this->getRootDir());
|
|
}
|
|
|
|
private function getPathVariables()
|
|
{
|
|
static $variables;
|
|
|
|
if (!isset($variables)) {
|
|
$user = JFactory::getUser();
|
|
$wf = WFApplication::getInstance();
|
|
$profile = $wf->getProfile();
|
|
|
|
jimport('joomla.user.helper');
|
|
|
|
$groups = JUserHelper::getUserGroups($user->id);
|
|
|
|
// get keys only
|
|
$groups = array_keys($groups);
|
|
|
|
// get the first group
|
|
$group_id = array_shift($groups);
|
|
|
|
if (is_int($group_id)) {
|
|
// usergroup table
|
|
$group = JTable::getInstance('Usergroup');
|
|
$group->load($group_id);
|
|
// usertype
|
|
$usertype = $group->title;
|
|
} else {
|
|
$usertype = $group_id;
|
|
}
|
|
|
|
// Replace any path variables
|
|
$path_pattern = array('/\$id/', '/\$username/', '/\$name/', '/\$user(group|type)/', '/\$(group|profile)/', '/\$day/', '/\$month/', '/\$year/');
|
|
$path_replacement = array($user->id, $user->username, $user->name, $usertype, $profile->name, date('d'), date('m'), date('Y'));
|
|
|
|
$websafe_textcase = $wf->getParam('editor.websafe_textcase', '');
|
|
|
|
// implode textcase array to create string
|
|
if (is_array($websafe_textcase)) {
|
|
$websafe_textcase = implode(',', $websafe_textcase);
|
|
}
|
|
|
|
$websafe_mode = $wf->getParam('editor.websafe_mode', 'utf-8');
|
|
$websafe_allow_spaces = $wf->getParam('editor.websafe_allow_spaces', '_');
|
|
|
|
$variables = compact('path_pattern', 'path_replacement', 'websafe_textcase', 'websafe_mode', 'websafe_allow_spaces');
|
|
}
|
|
|
|
return $variables;
|
|
}
|
|
|
|
public function processPath(&$path)
|
|
{
|
|
$path = preg_replace($this->get('path_pattern', array()), $this->get('path_replacement', array()), $path);
|
|
|
|
// split into path parts to preserve /
|
|
$parts = explode('/', $path);
|
|
|
|
// clean path parts
|
|
$parts = WFUtility::makeSafe($parts, $this->get('websafe_mode', 'utf-8'), $this->get('websafe_allow_spaces', '_'), $this->get('websafe_textcase', ''));
|
|
|
|
// join path parts
|
|
$path = implode('/', $parts);
|
|
}
|
|
|
|
/**
|
|
* Return the full user directory path. Create if required.
|
|
*
|
|
* @param string The base path
|
|
*
|
|
* @return Full path to folder
|
|
*/
|
|
public function getRootDir()
|
|
{
|
|
static $root;
|
|
|
|
if (!isset($root)) {
|
|
// Get base directory as shared parameter
|
|
$root = $this->get('dir', '');
|
|
|
|
// Remove whitespace
|
|
$root = trim($root);
|
|
|
|
if (!empty($root)) {
|
|
// Convert slashes / Strip double slashes
|
|
$root = preg_replace('/[\\\\]+/', '/', $root);
|
|
|
|
// Remove first leading slash
|
|
$root = ltrim($root, '/');
|
|
|
|
// Force default directory if base param is now empty or starts with a variable or a . eg $id
|
|
if (empty($root) || preg_match('/[\.\$]/', $root[0])) {
|
|
$root = 'images';
|
|
}
|
|
|
|
$this->processPath($root);
|
|
}
|
|
}
|
|
|
|
return $root;
|
|
}
|
|
|
|
protected static function sortItemsByKey($items, $type)
|
|
{
|
|
$sortable = array();
|
|
|
|
// set default direction
|
|
$direction = 'asc';
|
|
|
|
if ($type[0] === '-') {
|
|
$direction = 'desc';
|
|
$type = substr($type, 1);
|
|
}
|
|
|
|
foreach ($items as $key => $item) {
|
|
$sortable[$key] = isset($item[$type]) ? $item[$type] : $item['properties'][$type];
|
|
}
|
|
|
|
array_multisort($sortable, $direction === 'desc' ? SORT_DESC : SORT_ASC, SORT_NATURAL | SORT_FLAG_CASE, $items);
|
|
|
|
return $items;
|
|
}
|
|
|
|
public function toAbsolute($path)
|
|
{
|
|
return $path;
|
|
}
|
|
|
|
public function toRelative($path)
|
|
{
|
|
return $path;
|
|
}
|
|
|
|
public function getTotalSize($path, $recurse = true)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
public function countFiles($path, $recurse = false)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
public function getFiles($path, $filter)
|
|
{
|
|
return array();
|
|
}
|
|
|
|
public function getFolders($path, $filter)
|
|
{
|
|
return array();
|
|
}
|
|
|
|
public function getSourceDir($path)
|
|
{
|
|
return $path;
|
|
}
|
|
|
|
public function isMatch($needle, $haystack)
|
|
{
|
|
return $needle == $haystack;
|
|
}
|
|
|
|
public function pathinfo($path)
|
|
{
|
|
return pathinfo($path);
|
|
}
|
|
|
|
public function delete($path)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function createFolder($path, $new)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function rename($src, $dest)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function copy($src, $dest)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function move($src, $dest)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function getFolderDetails($path)
|
|
{
|
|
return array(
|
|
'properties' => array('modified' => ''),
|
|
);
|
|
}
|
|
|
|
public function getFileDetails($path)
|
|
{
|
|
$data = array(
|
|
'properties' => array(
|
|
'size' => '',
|
|
'modified' => '',
|
|
),
|
|
);
|
|
|
|
if (preg_match('#\.(jpg|jpeg|bmp|gif|tiff|png)#i', $path)) {
|
|
$image = array(
|
|
'properties' => array(
|
|
'width' => 0,
|
|
'height' => 0,
|
|
'preview' => '',
|
|
),
|
|
);
|
|
|
|
return array_merge_recursive($data, $image);
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
public function getDimensions($path)
|
|
{
|
|
return array(
|
|
'width' => '',
|
|
'height' => '',
|
|
);
|
|
}
|
|
|
|
public function upload($method, $src, $dir, $name, $chunks = 0, $chunk = 0)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function exists($path)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function read($path)
|
|
{
|
|
return '';
|
|
}
|
|
|
|
public function write($path, $content)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function isLocal()
|
|
{
|
|
return $this->get('local') === true;
|
|
}
|
|
|
|
public function is_file($path)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function is_dir($path)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Filesystem Error class.
|
|
*/
|
|
final class WFFileSystemResult
|
|
{
|
|
/*
|
|
* @var Object type eg: file / folder
|
|
*/
|
|
|
|
public $type = 'files';
|
|
/*
|
|
* @boolean Result state
|
|
*/
|
|
public $state = false;
|
|
/*
|
|
* @int Error code
|
|
*/
|
|
public $code = null;
|
|
/*
|
|
* @var Error message
|
|
*/
|
|
public $message = null;
|
|
/*
|
|
* @var File / Folder path
|
|
*/
|
|
public $path = null;
|
|
/*
|
|
* @var File / Folder url
|
|
*/
|
|
public $url = null;
|
|
|
|
public function __construct()
|
|
{
|
|
}
|
|
}
|