2011-03-02 21:18:22 +00:00
< ? php
/**
2011-03-13 16:25:34 +00:00
* ownCloud
*
* @ author Frank Karlitschek
* @ author Jakob Sack
* @ copyright 2010 Frank Karlitschek karlitschek @ kde . org
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation ; either
* version 3 of the License , or any later version .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details .
*
* You should have received a copy of the GNU Affero General Public
* License along with this library . If not , see < http :// www . gnu . org / licenses />.
*
*/
2011-03-02 21:18:22 +00:00
/**
2011-03-13 16:25:34 +00:00
* Collection of useful functions
2011-03-02 21:18:22 +00:00
*/
2011-07-29 19:36:03 +00:00
class OC_Helper {
2012-02-15 20:44:58 +00:00
private static $mimetypes = array ();
2012-02-28 10:16:19 +00:00
private static $tmpFiles = array ();
2012-04-13 20:59:47 +00:00
2011-03-02 21:18:22 +00:00
/**
2011-03-13 16:25:34 +00:00
* @ brief Creates an url
* @ param $app app
* @ param $file file
* @ returns the url
2011-03-02 21:18:22 +00:00
*
2011-03-13 16:25:34 +00:00
* Returns a url to the given app and file .
2011-03-02 21:18:22 +00:00
*/
2012-02-21 19:05:02 +00:00
public static function linkTo ( $app , $file ){
2011-06-20 19:01:34 +00:00
if ( $app != '' ){
2011-04-16 10:43:37 +00:00
$app .= '/' ;
2011-06-02 18:21:02 +00:00
// Check if the app is in the app folder
2012-02-26 17:26:41 +00:00
if ( file_exists ( OC :: $APPSROOT . '/apps/' . $app . $file )){
2012-04-26 12:52:55 +00:00
if ( substr ( $file , - 3 ) == 'php' || substr ( $file , - 3 ) == 'css' ){
2012-04-24 18:14:42 +00:00
if ( substr ( $app , - 1 , 1 ) == '/' ){
$app = substr ( $app , 0 , strlen ( $app ) - 1 );
}
2012-04-26 12:52:55 +00:00
$urlLinkTo = OC :: $WEBROOT . '/?app=' . $app ;
2012-04-24 18:14:42 +00:00
$urlLinkTo .= ( $file != 'index.php' ) ? '&getfile=' . urlencode ( $file ) : '' ;
} else {
2012-04-24 18:17:00 +00:00
$urlLinkTo = OC :: $APPSWEBROOT . '/apps/' . $app . $file ;
2012-04-18 15:25:44 +00:00
}
2011-06-02 18:21:02 +00:00
}
2011-06-20 19:01:34 +00:00
else {
2011-09-18 17:37:54 +00:00
$urlLinkTo = OC :: $WEBROOT . '/' . $app . $file ;
2011-06-20 19:01:34 +00:00
}
2011-04-16 07:46:58 +00:00
}
2011-06-20 18:29:30 +00:00
else {
2011-09-18 17:37:54 +00:00
if ( file_exists ( OC :: $SERVERROOT . '/core/' . $file )){
$urlLinkTo = OC :: $WEBROOT . '/core/' . $file ;
2011-06-20 19:01:34 +00:00
}
else {
2011-09-18 17:37:54 +00:00
$urlLinkTo = OC :: $WEBROOT . '/' . $file ;
2011-06-20 19:01:34 +00:00
}
2011-06-20 18:29:30 +00:00
}
2011-06-24 19:44:28 +00:00
2012-02-21 19:05:02 +00:00
return $urlLinkTo ;
2011-03-02 21:18:22 +00:00
}
2012-04-12 12:35:28 +00:00
/**
* @ brief Returns the server host
* @ returns the server host
*
* Returns the server host , even if the website uses one or more
* reverse proxies
*/
public static function serverHost () {
if ( isset ( $_SERVER [ 'HTTP_X_FORWARDED_HOST' ])) {
if ( strpos ( $_SERVER [ 'HTTP_X_FORWARDED_HOST' ], " , " ) !== false ) {
$host = trim ( array_pop ( explode ( " , " , $_SERVER [ 'HTTP_X_FORWARDED_HOST' ])));
}
else {
$host = $_SERVER [ 'HTTP_X_FORWARDED_HOST' ];
}
}
else {
$host = $_SERVER [ 'HTTP_HOST' ];
}
return $host ;
}
2012-02-16 18:45:00 +00:00
/**
* @ brief Creates an absolute url
* @ param $app app
* @ param $file file
* @ returns the url
*
* Returns a absolute url to the given app and file .
*/
2012-02-21 19:05:02 +00:00
public static function linkToAbsolute ( $app , $file ) {
$urlLinkTo = self :: linkTo ( $app , $file );
2012-02-16 18:45:00 +00:00
// Checking if the request was made through HTTPS. The last in line is for IIS
$protocol = isset ( $_SERVER [ 'HTTPS' ]) && ! empty ( $_SERVER [ 'HTTPS' ]) && ( $_SERVER [ 'HTTPS' ] != 'off' );
2012-04-12 12:38:36 +00:00
$urlLinkTo = ( $protocol ? 'https' : 'http' ) . '://' . self :: serverHost () . $urlLinkTo ;
2012-02-16 18:45:00 +00:00
return $urlLinkTo ;
}
2011-03-02 21:18:22 +00:00
/**
2011-03-13 16:25:34 +00:00
* @ brief Creates path to an image
* @ param $app app
* @ param $image image name
* @ returns the url
2011-03-02 21:18:22 +00:00
*
2011-03-13 16:25:34 +00:00
* Returns the path to the image .
2011-03-02 21:18:22 +00:00
*/
2012-02-14 15:32:38 +00:00
public static function imagePath ( $app , $image ){
2012-02-27 17:01:43 +00:00
// Read the selected theme from the config file
$theme = OC_Config :: getValue ( " theme " );
2012-02-14 15:32:38 +00:00
2012-02-27 17:01:43 +00:00
// Check if the app is in the app folder
if ( file_exists ( OC :: $SERVERROOT . " /themes/ $theme /apps/ $app /img/ $image " )){
return OC :: $WEBROOT . " /themes/ $theme /apps/ $app /img/ $image " ;
} elseif ( file_exists ( OC :: $APPSROOT . " /apps/ $app /img/ $image " )){
return OC :: $APPSWEBROOT . " /apps/ $app /img/ $image " ;
} elseif ( ! empty ( $app ) and file_exists ( OC :: $SERVERROOT . " /themes/ $theme / $app /img/ $image " )){
return OC :: $WEBROOT . " /themes/ $theme / $app /img/ $image " ;
} elseif ( ! empty ( $app ) and file_exists ( OC :: $SERVERROOT . " / $app /img/ $image " )){
return OC :: $WEBROOT . " / $app /img/ $image " ;
} elseif ( file_exists ( OC :: $SERVERROOT . " /themes/ $theme /core/img/ $image " )){
return OC :: $WEBROOT . " /themes/ $theme /core/img/ $image " ;
2012-02-28 15:14:12 +00:00
} elseif ( file_exists ( OC :: $SERVERROOT . " /core/img/ $image " )){
2012-02-27 17:01:43 +00:00
return OC :: $WEBROOT . " /core/img/ $image " ;
2012-02-28 15:14:12 +00:00
} else {
2012-04-13 20:59:47 +00:00
echo ( 'image not found: image:' . $image . ' webroot:' . OC :: $WEBROOT . ' serverroot:' . OC :: $SERVERROOT );
2012-02-28 15:14:12 +00:00
die ();
2012-02-27 17:01:43 +00:00
}
}
2011-03-02 21:18:22 +00:00
/**
2011-08-11 16:59:01 +00:00
* @ brief get path to icon of file type
2011-03-13 16:25:34 +00:00
* @ param $mimetype mimetype
* @ returns the url
2011-03-02 21:18:22 +00:00
*
2011-08-11 16:59:01 +00:00
* Returns the path to the image of this file type .
2011-03-02 21:18:22 +00:00
*/
2011-03-02 21:28:32 +00:00
public static function mimetypeIcon ( $mimetype ){
2011-10-08 19:18:47 +00:00
$alias = array ( 'application/xml' => 'code/xml' );
// echo $mimetype;
if ( isset ( $alias [ $mimetype ])){
$mimetype = $alias [ $mimetype ];
// echo $mimetype;
}
2011-03-02 21:18:22 +00:00
// Replace slash with a minus
$mimetype = str_replace ( " / " , " - " , $mimetype );
// Is it a dir?
if ( $mimetype == " dir " ){
2011-10-07 16:09:49 +00:00
return OC :: $WEBROOT . " /core/img/filetypes/folder.png " ;
2011-03-02 21:18:22 +00:00
}
// Icon exists?
2011-10-07 16:09:49 +00:00
if ( file_exists ( OC :: $SERVERROOT . " /core/img/filetypes/ $mimetype .png " )){
return OC :: $WEBROOT . " /core/img/filetypes/ $mimetype .png " ;
2011-07-28 23:36:31 +00:00
}
2011-08-11 16:59:01 +00:00
//try only the first part of the filetype
2011-07-28 23:36:31 +00:00
$mimetype = substr ( $mimetype , 0 , strpos ( $mimetype , '-' ));
2011-10-07 16:09:49 +00:00
if ( file_exists ( OC :: $SERVERROOT . " /core/img/filetypes/ $mimetype .png " )){
return OC :: $WEBROOT . " /core/img/filetypes/ $mimetype .png " ;
2011-03-02 21:18:22 +00:00
}
else {
2011-10-07 16:09:49 +00:00
return OC :: $WEBROOT . " /core/img/filetypes/file.png " ;
2011-03-02 21:18:22 +00:00
}
}
2011-03-02 21:28:32 +00:00
/**
2011-03-13 16:25:34 +00:00
* @ brief Make a human file size
* @ param $bytes file size in bytes
* @ returns a human readable file size
2011-03-02 21:28:32 +00:00
*
2011-03-13 16:25:34 +00:00
* Makes 2048 to 2 kB .
2011-03-02 21:28:32 +00:00
*/
public static function humanFileSize ( $bytes ){
if ( $bytes < 1024 ){
return " $bytes B " ;
}
$bytes = round ( $bytes / 1024 , 1 );
if ( $bytes < 1024 ){
return " $bytes kB " ;
}
$bytes = round ( $bytes / 1024 , 1 );
if ( $bytes < 1024 ){
return " $bytes MB " ;
}
// Wow, heavy duty for owncloud
$bytes = round ( $bytes / 1024 , 1 );
return " $bytes GB " ;
}
2012-04-13 20:59:47 +00:00
2011-04-17 10:03:23 +00:00
/**
* @ brief Make a computer file size
* @ param $str file size in a fancy format
* @ returns a file size in bytes
*
* Makes 2 kB to 2048.
*
* Inspired by : http :// www . php . net / manual / en / function . filesize . php #92418
*/
public static function computerFileSize ( $str ){
$bytes = 0 ;
2011-12-11 22:33:24 +00:00
$str = strtolower ( $str );
2011-04-17 10:03:23 +00:00
$bytes_array = array (
2011-12-11 22:33:24 +00:00
'b' => 1 ,
'k' => 1024 ,
'kb' => 1024 ,
'mb' => 1024 * 1024 ,
'm' => 1024 * 1024 ,
'gb' => 1024 * 1024 * 1024 ,
'g' => 1024 * 1024 * 1024 ,
'tb' => 1024 * 1024 * 1024 * 1024 ,
't' => 1024 * 1024 * 1024 * 1024 ,
'pb' => 1024 * 1024 * 1024 * 1024 * 1024 ,
'p' => 1024 * 1024 * 1024 * 1024 * 1024 ,
2011-04-17 10:03:23 +00:00
);
$bytes = floatval ( $str );
2011-12-11 22:33:24 +00:00
if ( preg_match ( '#([kmgtp]?b?)$#si' , $str , $matches ) && ! empty ( $bytes_array [ $matches [ 1 ]])) {
2011-04-17 10:03:23 +00:00
$bytes *= $bytes_array [ $matches [ 1 ]];
}
2012-02-26 02:31:04 +00:00
$bytes = round ( $bytes , 2 );
2011-04-17 10:03:23 +00:00
2012-04-13 20:59:47 +00:00
return $bytes ;
2011-04-17 10:03:23 +00:00
}
2012-04-13 20:59:47 +00:00
2011-04-16 08:23:15 +00:00
/**
* @ brief Recusive editing of file permissions
* @ param $path path to file or folder
* @ param $filemode unix style file permissions as integer
*
*/
2011-04-24 13:23:18 +00:00
static function chmodr ( $path , $filemode ) {
2011-04-16 08:23:15 +00:00
if ( ! is_dir ( $path ))
return chmod ( $path , $filemode );
$dh = opendir ( $path );
while (( $file = readdir ( $dh )) !== false ) {
if ( $file != '.' && $file != '..' ) {
$fullpath = $path . '/' . $file ;
if ( is_link ( $fullpath ))
return FALSE ;
2012-03-23 15:48:16 +00:00
elseif ( ! is_dir ( $fullpath ) && !@ chmod ( $fullpath , $filemode ))
2011-04-16 08:23:15 +00:00
return FALSE ;
2011-04-24 13:23:18 +00:00
elseif ( ! self :: chmodr ( $fullpath , $filemode ))
2011-04-16 08:23:15 +00:00
return FALSE ;
}
}
closedir ( $dh );
2011-08-06 21:31:38 +00:00
if ( @ chmod ( $path , $filemode ))
2011-04-16 08:23:15 +00:00
return TRUE ;
else
return FALSE ;
}
2011-05-28 15:33:25 +00:00
/**
* @ brief Recusive copying of folders
* @ param string $src source folder
* @ param string $dest target folder
*
*/
static function copyr ( $src , $dest ) {
if ( is_dir ( $src )){
if ( ! is_dir ( $dest )){
mkdir ( $dest );
}
$files = scandir ( $src );
foreach ( $files as $file ){
if ( $file != " . " && $file != " .. " ){
self :: copyr ( " $src / $file " , " $dest / $file " );
}
}
} elseif ( file_exists ( $src )){
copy ( $src , $dest );
}
}
2012-04-13 20:59:47 +00:00
2011-05-28 15:33:25 +00:00
/**
* @ brief Recusive deletion of folders
* @ param string $dir path to the folder
*
*/
static function rmdirr ( $dir ) {
if ( is_dir ( $dir )) {
$files = scandir ( $dir );
foreach ( $files as $file ){
if ( $file != " . " && $file != " .. " ){
self :: rmdirr ( " $dir / $file " );
}
}
rmdir ( $dir );
} elseif ( file_exists ( $dir )){
unlink ( $dir );
}
2012-04-13 20:59:47 +00:00
if ( file_exists ( $dir )) {
return false ;
}
2011-05-28 15:33:25 +00:00
}
2012-02-15 20:44:58 +00:00
/**
* get the mimetype form a local file
* @ param string path
* @ return string
* does NOT work for ownClouds filesystem , use OC_FileSystem :: getMimeType instead
*/
static function getMimeType ( $path ){
$isWrapped = ( strpos ( $path , '://' ) !== false ) and ( substr ( $path , 0 , 7 ) == 'file://' );
$mimeType = 'application/octet-stream' ;
if ( $mimeType == 'application/octet-stream' ) {
2012-03-19 11:41:10 +00:00
self :: $mimetypes = include ( 'mimetypes.fixlist.php' );
2012-04-15 11:32:45 +00:00
$extension = strtolower ( strrchr ( basename ( $path ), " . " ));
$extension = substr ( $extension , 1 ); //remove leading .
$mimeType = ( isset ( self :: $mimetypes [ $extension ])) ? self :: $mimetypes [ $extension ] : 'application/octet-stream' ;
2012-02-15 20:44:58 +00:00
}
if ( @ is_dir ( $path )) {
// directories are easy
return " httpd/unix-directory " ;
}
if ( $mimeType == 'application/octet-stream' and function_exists ( 'finfo_open' ) and function_exists ( 'finfo_file' ) and $finfo = finfo_open ( FILEINFO_MIME )){
$info = @ strtolower ( finfo_file ( $finfo , $path ));
if ( $info ){
$mimeType = substr ( $info , 0 , strpos ( $info , ';' ));
}
finfo_close ( $finfo );
}
if ( ! $isWrapped and $mimeType == 'application/octet-stream' && function_exists ( " mime_content_type " )) {
// use mime magic extension if available
$mimeType = mime_content_type ( $path );
}
if ( ! $isWrapped and $mimeType == 'application/octet-stream' && OC_Helper :: canExecute ( " file " )) {
// it looks like we have a 'file' command,
// lets see it it does have mime support
$path = str_replace ( " ' " , " \ ' " , $path );
$fp = popen ( " file -i -b ' $path ' 2>/dev/null " , " r " );
$reply = fgets ( $fp );
pclose ( $fp );
//trim the character set from the end of the response
$mimeType = substr ( $reply , 0 , strrpos ( $reply , ' ' ));
}
if ( $mimeType == 'application/octet-stream' ) {
// Fallback solution: (try to guess the type by the file extension
if ( ! self :: $mimetypes || self :: $mimetypes != include ( 'mimetypes.list.php' )){
self :: $mimetypes = include ( 'mimetypes.list.php' );
}
2012-04-15 11:32:45 +00:00
$extension = strtolower ( strrchr ( basename ( $path ), " . " ));
$extension = substr ( $extension , 1 ); //remove leading .
$mimeType = ( isset ( self :: $mimetypes [ $extension ])) ? self :: $mimetypes [ $extension ] : 'application/octet-stream' ;
2012-02-15 20:44:58 +00:00
}
return $mimeType ;
}
2012-04-13 20:59:47 +00:00
2012-04-18 18:24:22 +00:00
/**
* get the mimetype form a data string
* @ param string data
* @ return string
*/
static function getStringMimeType ( $data ){
if ( function_exists ( 'finfo_open' ) and function_exists ( 'finfo_file' )){
$finfo = finfo_open ( FILEINFO_MIME );
return finfo_buffer ( $finfo , $data );
} else {
$tmpFile = OC_Helper :: tmpFile ();
$fh = fopen ( $tmpFile , 'wb' );
fwrite ( $fh , $data , 8024 );
fclose ( $fh );
$mime = self :: getMimeType ( $tmpFile );
unset ( $tmpFile );
return $mime ;
}
}
2011-05-17 20:34:31 +00:00
/**
* @ brief Checks $_REQUEST contains a var for the $s key . If so , returns the html - escaped value of this var ; otherwise returns the default value provided by $d .
* @ param $s name of the var to escape , if set .
* @ param $d default value .
* @ returns the print - safe value .
*
*/
2012-04-13 20:59:47 +00:00
2011-05-17 20:34:31 +00:00
//FIXME: should also check for value validation (i.e. the email is an email).
public static function init_var ( $s , $d = " " ) {
$r = $d ;
if ( isset ( $_REQUEST [ $s ]) && ! empty ( $_REQUEST [ $s ]))
$r = stripslashes ( htmlspecialchars ( $_REQUEST [ $s ]));
2012-04-13 20:59:47 +00:00
2011-05-17 20:34:31 +00:00
return $r ;
}
2012-04-13 20:59:47 +00:00
2011-09-30 16:22:12 +00:00
/**
* returns " checked " - attribut if request contains selected radio element OR if radio element is the default one -- maybe ?
* @ param string $s Name of radio - button element name
* @ param string $v Value of current radio - button element
* @ param string $d Value of default radio - button element
*/
2011-05-17 20:34:31 +00:00
public static function init_radio ( $s , $v , $d ) {
2011-09-30 16:22:12 +00:00
if (( isset ( $_REQUEST [ $s ]) && $_REQUEST [ $s ] == $v ) || ( ! isset ( $_REQUEST [ $s ]) && $v == $d ))
2011-05-17 20:34:31 +00:00
print " checked= \" checked \" " ;
}
2011-07-28 18:10:58 +00:00
/**
* detect if a given program is found in the search PATH
*
* @ param string program name
* @ param string optional search path , defaults to $PATH
* @ return bool true if executable program found in path
*/
public static function canExecute ( $name , $path = false ){
// path defaults to PATH from environment if not set
if ( $path === false ) {
$path = getenv ( " PATH " );
}
// check method depends on operating system
if ( ! strncmp ( PHP_OS , " WIN " , 3 )) {
// on Windows an appropriate COM or EXE file needs to exist
$exts = array ( " .exe " , " .com " );
$check_fn = " file_exists " ;
} else {
// anywhere else we look for an executable file of that name
$exts = array ( " " );
$check_fn = " is_executable " ;
}
// Default check will be done with $path directories :
$dirs = explode ( PATH_SEPARATOR , $path );
// WARNING : We have to check if open_basedir is enabled :
$obd = ini_get ( 'open_basedir' );
if ( $obd != " none " )
$obd_values = explode ( PATH_SEPARATOR , $obd );
if ( count ( $obd_values ) > 0 and $obd_values [ 0 ])
{
// open_basedir is in effect !
// We need to check if the program is in one of these dirs :
$dirs = $obd_values ;
}
foreach ( $dirs as $dir )
{
foreach ( $exts as $ext )
{
if ( $check_fn ( " $dir / $name " . $ext ))
return true ;
}
}
return false ;
}
2012-04-13 20:59:47 +00:00
2012-02-27 11:04:04 +00:00
/**
* copy the contents of one stream to another
* @ param resource source
* @ param resource target
* @ return int the number of bytes copied
*/
public static function streamCopy ( $source , $target ){
if ( ! $source or ! $target ){
return false ;
}
$count = 0 ;
while ( ! feof ( $source )){
$count += fwrite ( $target , fread ( $source , 8192 ));
}
return $count ;
}
2012-04-13 20:59:47 +00:00
2012-02-28 10:16:19 +00:00
/**
* create a temporary file with an unique filename
* @ param string postfix
* @ return string
*
* temporary files are automatically cleaned up after the script is finished
*/
public static function tmpFile ( $postfix = '' ){
2012-02-28 10:32:45 +00:00
$file = get_temp_dir () . '/' . md5 ( time () . rand ()) . $postfix ;
$fh = fopen ( $file , 'w' );
fclose ( $fh );
2012-02-28 10:16:19 +00:00
self :: $tmpFiles [] = $file ;
return $file ;
}
2012-03-28 20:30:55 +00:00
/**
* create a temporary folder with an unique filename
* @ return string
*
* temporary files are automatically cleaned up after the script is finished
*/
public static function tmpFolder (){
$path = get_temp_dir () . '/' . md5 ( time () . rand ());
mkdir ( $path );
self :: $tmpFiles [] = $path ;
return $path . '/' ;
}
2012-04-13 20:59:47 +00:00
2012-02-28 10:16:19 +00:00
/**
* remove all files created by self :: tmpFile
*/
public static function cleanTmp (){
2012-04-13 20:59:47 +00:00
$leftoversFile = '/tmp/oc-not-deleted' ;
if ( file_exists ( $leftoversFile )){
$leftovers = file ( $leftoversFile );
foreach ( $leftovers as $file ) {
self :: rmdirr ( $file );
}
unlink ( $leftoversFile );
}
2012-02-28 10:16:19 +00:00
foreach ( self :: $tmpFiles as $file ){
if ( file_exists ( $file )){
2012-04-13 20:59:47 +00:00
if ( ! self :: rmdirr ( $file )) {
file_put_contents ( $leftoversFile , $file . " \n " , FILE_APPEND );
}
2012-02-28 10:16:19 +00:00
}
}
}
2012-04-15 14:59:39 +00:00
/**
* Adds a suffix to the name in case the file exists
*
* @ param $path
* @ param $filename
* @ return string
*/
2012-05-01 22:20:45 +00:00
public static function buildNotExistingFileName ( $path , $filename ){
2012-04-16 08:58:40 +00:00
if ( $path === '/' ){
$path = '' ;
}
2012-04-15 14:59:39 +00:00
if ( $pos = strrpos ( $filename , '.' )) {
$name = substr ( $filename , 0 , $pos );
$ext = substr ( $filename , $pos );
} else {
$name = $filename ;
}
$newpath = $path . '/' . $filename ;
$newname = $filename ;
$counter = 2 ;
while ( OC_Filesystem :: file_exists ( $newpath )) {
$newname = $name . ' (' . $counter . ')' . $ext ;
$newpath = $path . '/' . $newname ;
$counter ++ ;
}
2012-04-16 08:58:40 +00:00
return $newpath ;
2012-04-15 14:59:39 +00:00
}
2012-04-18 06:20:51 +00:00
/*
* checks if $sub is a subdirectory of $parent
*
* @ param $sub
* @ param $parent
* @ return bool
*/
public static function issubdirectory ( $sub , $parent ){
2012-04-26 15:55:00 +00:00
if ( $sub == null || $sub == '' || $parent == null || $parent == '' ){
return false ;
}
$realpath_sub = realpath ( $sub );
$realpath_parent = realpath ( $parent );
if (( $realpath_sub == false && substr_count ( $realpath_sub , './' ) != 0 ) || ( $realpath_parent == false && substr_count ( $realpath_parent , './' ) != 0 )){ //it checks for both ./ and ../
return false ;
}
if ( $realpath_sub && $realpath_sub != '' && $realpath_parent && $realpath_parent != '' ){
2012-04-26 16:08:49 +00:00
if ( substr ( $realpath_sub , 0 , strlen ( $realpath_parent )) == $realpath_parent ){
2012-04-26 15:55:00 +00:00
return true ;
}
} else {
2012-04-26 16:08:49 +00:00
if ( substr ( $sub , 0 , strlen ( $parent )) == $parent ){
2012-04-26 15:55:00 +00:00
return true ;
}
}
2012-04-26 16:08:49 +00:00
/*
echo 'SUB: ' . $sub . " \n " ;
echo 'PAR: ' . $parent . " \n " ;
echo 'REALSUB: ' . $realpath_sub . " \n " ;
echo 'REALPAR: ' . $realpath_parent . " \n " ;
echo substr ( $realpath_sub , 0 , strlen ( $realpath_parent ));
exit ;
*/
2012-04-26 15:55:00 +00:00
return false ;
2012-04-18 06:20:51 +00:00
}
2011-03-02 21:18:22 +00:00
}