301 lines
5.2 KiB
PHP
301 lines
5.2 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* @package Joomla.Platform
|
||
|
* @subpackage FileSystem
|
||
|
*
|
||
|
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
|
||
|
* @license GNU General Public License version 2 or later; see LICENSE
|
||
|
*/
|
||
|
|
||
|
defined('JPATH_PLATFORM') or die;
|
||
|
|
||
|
/**
|
||
|
* File system helper
|
||
|
*
|
||
|
* Holds support functions for the filesystem, particularly the stream
|
||
|
*
|
||
|
* @package Joomla.Platform
|
||
|
* @subpackage FileSystem
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
class JFilesystemHelper
|
||
|
{
|
||
|
/**
|
||
|
* Remote file size function for streams that don't support it
|
||
|
*
|
||
|
* @param string $url TODO Add text
|
||
|
*
|
||
|
* @return mixed
|
||
|
*
|
||
|
* @see http://www.php.net/manual/en/function.filesize.php#71098
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public static function remotefsize($url)
|
||
|
{
|
||
|
$sch = parse_url($url, PHP_URL_SCHEME);
|
||
|
|
||
|
if (($sch != 'http') && ($sch != 'https') && ($sch != 'ftp') && ($sch != 'ftps'))
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (($sch == 'http') || ($sch == 'https'))
|
||
|
{
|
||
|
$headers = get_headers($url, 1);
|
||
|
|
||
|
if ((!array_key_exists('Content-Length', $headers)))
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return $headers['Content-Length'];
|
||
|
}
|
||
|
|
||
|
if (($sch == 'ftp') || ($sch == 'ftps'))
|
||
|
{
|
||
|
$server = parse_url($url, PHP_URL_HOST);
|
||
|
$port = parse_url($url, PHP_URL_PORT);
|
||
|
$path = parse_url($url, PHP_URL_PATH);
|
||
|
$user = parse_url($url, PHP_URL_USER);
|
||
|
$pass = parse_url($url, PHP_URL_PASS);
|
||
|
|
||
|
if ((!$server) || (!$path))
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (!$port)
|
||
|
{
|
||
|
$port = 21;
|
||
|
}
|
||
|
|
||
|
if (!$user)
|
||
|
{
|
||
|
$user = 'anonymous';
|
||
|
}
|
||
|
|
||
|
if (!$pass)
|
||
|
{
|
||
|
$pass = '';
|
||
|
}
|
||
|
|
||
|
switch ($sch)
|
||
|
{
|
||
|
case 'ftp':
|
||
|
$ftpid = ftp_connect($server, $port);
|
||
|
break;
|
||
|
|
||
|
case 'ftps':
|
||
|
$ftpid = ftp_ssl_connect($server, $port);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (!$ftpid)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$login = ftp_login($ftpid, $user, $pass);
|
||
|
|
||
|
if (!$login)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$ftpsize = ftp_size($ftpid, $path);
|
||
|
ftp_close($ftpid);
|
||
|
|
||
|
if ($ftpsize == -1)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return $ftpsize;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Quick FTP chmod
|
||
|
*
|
||
|
* @param string $url Link identifier
|
||
|
* @param integer $mode The new permissions, given as an octal value.
|
||
|
*
|
||
|
* @return mixed
|
||
|
*
|
||
|
* @see http://www.php.net/manual/en/function.ftp-chmod.php
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public static function ftpChmod($url, $mode)
|
||
|
{
|
||
|
$sch = parse_url($url, PHP_URL_SCHEME);
|
||
|
|
||
|
if (($sch != 'ftp') && ($sch != 'ftps'))
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$server = parse_url($url, PHP_URL_HOST);
|
||
|
$port = parse_url($url, PHP_URL_PORT);
|
||
|
$path = parse_url($url, PHP_URL_PATH);
|
||
|
$user = parse_url($url, PHP_URL_USER);
|
||
|
$pass = parse_url($url, PHP_URL_PASS);
|
||
|
|
||
|
if ((!$server) || (!$path))
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (!$port)
|
||
|
{
|
||
|
$port = 21;
|
||
|
}
|
||
|
|
||
|
if (!$user)
|
||
|
{
|
||
|
$user = 'anonymous';
|
||
|
}
|
||
|
|
||
|
if (!$pass)
|
||
|
{
|
||
|
$pass = '';
|
||
|
}
|
||
|
|
||
|
switch ($sch)
|
||
|
{
|
||
|
case 'ftp':
|
||
|
$ftpid = ftp_connect($server, $port);
|
||
|
break;
|
||
|
|
||
|
case 'ftps':
|
||
|
$ftpid = ftp_ssl_connect($server, $port);
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (!$ftpid)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$login = ftp_login($ftpid, $user, $pass);
|
||
|
|
||
|
if (!$login)
|
||
|
{
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$res = ftp_chmod($ftpid, $mode, $path);
|
||
|
ftp_close($ftpid);
|
||
|
|
||
|
return $res;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Modes that require a write operation
|
||
|
*
|
||
|
* @return array
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public static function getWriteModes()
|
||
|
{
|
||
|
return array('w', 'w+', 'a', 'a+', 'r+', 'x', 'x+');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Stream and Filter Support Operations
|
||
|
*
|
||
|
* Returns the supported streams, in addition to direct file access
|
||
|
* Also includes Joomla! streams as well as PHP streams
|
||
|
*
|
||
|
* @return array Streams
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public static function getSupported()
|
||
|
{
|
||
|
// Really quite cool what php can do with arrays when you let it...
|
||
|
static $streams;
|
||
|
|
||
|
if (!$streams)
|
||
|
{
|
||
|
$streams = array_merge(stream_get_wrappers(), self::getJStreams());
|
||
|
}
|
||
|
|
||
|
return $streams;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns a list of transports
|
||
|
*
|
||
|
* @return array
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public static function getTransports()
|
||
|
{
|
||
|
// Is this overkill?
|
||
|
return stream_get_transports();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns a list of filters
|
||
|
*
|
||
|
* @return array
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public static function getFilters()
|
||
|
{
|
||
|
// Note: This will look like the getSupported() function with J! filters.
|
||
|
// TODO: add user space filter loading like user space stream loading
|
||
|
return stream_get_filters();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns a list of J! streams
|
||
|
*
|
||
|
* @return array
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public static function getJStreams()
|
||
|
{
|
||
|
static $streams = array();
|
||
|
|
||
|
if (!$streams)
|
||
|
{
|
||
|
$files = new DirectoryIterator(__DIR__ . '/streams');
|
||
|
|
||
|
foreach ($files as $file)
|
||
|
{
|
||
|
$filename = $file->getFilename();
|
||
|
|
||
|
// Only load for php files.
|
||
|
// Note: DirectoryIterator::getExtension only available PHP >= 5.3.6
|
||
|
if (!$file->isFile() || substr($filename, strrpos($filename, '.') + 1) != 'php')
|
||
|
{
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$streams[] = $file->getBasename('.php');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $streams;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Determine if a stream is a Joomla stream.
|
||
|
*
|
||
|
* @param string $streamname The name of a stream
|
||
|
*
|
||
|
* @return boolean True for a Joomla Stream
|
||
|
*
|
||
|
* @since 11.1
|
||
|
*/
|
||
|
public static function isJoomlaStream($streamname)
|
||
|
{
|
||
|
return in_array($streamname, self::getJStreams());
|
||
|
}
|
||
|
}
|